gstat/0000755000176200001440000000000014750437062011404 5ustar liggesusersgstat/tests/0000755000176200001440000000000014750415367012552 5ustar liggesusersgstat/tests/unproj.R0000644000176200001440000000416414646417261014216 0ustar liggesusers# DOI 10.1007/s11004-011-9344-7 # http://mypage.iu.edu/~srobeson/Pubs/variogram_sphere_mathgeo_2011.pdf suppressPackageStartupMessages(library(sp)) library(gstat) if (require(sp, quietly = TRUE) && suppressPackageStartupMessages(require(fields, quietly = TRUE)) && suppressPackageStartupMessages(require(sf, quietly = TRUE))) { data(meuse) coordinates(meuse) = ~x+y proj4string(meuse) = CRS("+init=epsg:28992") ll = "+proj=longlat +ellps=WGS84" # meuse.ll = spTransform(meuse, CRS("+proj=longlat +ellps=WGS84")) meuse.ll = as(st_transform(sf::st_as_sf(meuse), sf::st_crs(ll)), "Spatial") meuse.ll[1:10,] variogram(log(zinc)~1, meuse.ll) cloud1 = variogram(log(zinc)~1, meuse, cloud=T, cutoff=6000) cloud2 = variogram(log(zinc)~1, meuse.ll, cloud=T, cutoff=6) plot(cloud1$dist/1000, cloud2$dist, xlab="Amersfoort, km", ylab = "Long/lat") abline(0,1) data(ozone2) oz = SpatialPointsDataFrame(ozone2$lon.lat, data.frame(t(ozone2$y)), proj4string=CRS("+proj=longlat +ellps=WGS84")) variogram(X870731~1,oz[!is.na(oz$X870731),]) utm16 = "+proj=utm +zone=16" # oz.utm = spTransform(oz, utm16) oz.utm = as(sf::st_transform(sf::st_as_sf(oz), utm16) , "Spatial") variogram(X870731~1,oz.utm[!is.na(oz$X870731),]) # Timothy Hilton, r-sig-geo, Sept 14, 2008: foo <- structure(list(z = c(-1.95824831109744, -1.9158901643563, 4.22211761150161, 3.23356929459598, 1.12038389231868, 0.34613850821113, 1.12589932643631, 23.517912251617, 3.0519158690268, 3.20261431141517, -2.10947106854739 ), lon = c(-125.29228, -82.1556, -98.524722, -99.948333, -104.691741, -79.420833, -105.100533, -88.291867, -72.171478, -121.556944, -89.34765), lat = c(49.87217, 48.2167, 55.905833, 56.635833, 53.916264, 39.063333, 48.307883, 40.0061, 42.537756, 44.448889, 46.242017)), .Names = c("z", "lon", "lat"), row.names = c(NA, -11L), class = "data.frame") coordinates(foo) <- ~lon+lat proj4string(foo) <- CRS('+proj=longlat +ellps=WGS84') vg.foo <- variogram(z~1, foo, cloud=TRUE, cutoff=1e10) cat('==========\nvariogram:\n') print(head(vg.foo)) cat('==========\nspDistsN1 Distances:\n') print(spDistsN1(coordinates(foo), coordinates(foo)[1,], longlat=TRUE)) } gstat/tests/blockkr.R0000644000176200001440000000214114646417261014321 0ustar liggesuserslibrary(sp) data(meuse) coordinates(meuse) = c("x", "y") new.locs <- SpatialPoints(data.frame( x = c(181170, 180310, 180205, 178673, 178770, 178270), y = c(333250, 332189, 331707, 330066, 330675, 331075))) library(gstat) krige(zinc ~ 1, meuse, new.locs, vgm(1.34e5, "Sph", 800, nug = 2.42e4), block = c(40,40), nmax = 40) new.locs <- SpatialPoints(data.frame(x = c(181170), y = c(333250))) disc = c(-15,-5,5,15) block.irreg <- data.frame(expand.grid(x = disc, y = disc)) block.irreg # first disable default Gaussian quadrature used for block integration, by # setting nblockdiscr explicitly: krige(zinc ~ 1, meuse, new.locs, model = vgm(1.34e5, "Sph", 800, nug = 2.42e4), block = c(40,40), nmax = 40, set = list(nblockdiscr=4)) # now pass the same block discretization as block.irreg: krige(zinc ~ 1, meuse, new.locs, vgm(1.34e5, "Sph", 800, nug = 2.42e4), block = block.irreg, nmax = 40) # check weights argument: block.irreg <- data.frame(expand.grid(x = disc, y = disc), weights = rep(1/16, 16)) krige(zinc ~ 1, meuse, new.locs, vgm(1.34e5, "Sph", 800, nug = 2.42e4), block = block.irreg, nmax = 40) gstat/tests/allier.R0000644000176200001440000000164214646417261014147 0ustar liggesusers# Sytze de Bruin's post to r-sig-geo, Nov 16, 2015: library(sp) library(gstat) # some data x <- c(215, 330, 410, 470, 545) y <- c(230, 310, 330, 340, 365) fc <- c(0.211, 0.251, 0.281, 0.262, 0.242) por <- c(0.438, 0.457, 0.419, 0.430, 0.468) Allier <- data.frame(x, y, fc, por) coordinates(Allier) = ~x+y # gstat object for co-kriging using linear model of co-regionalization g <- gstat(id=c("fc"), formula=fc~1, data=Allier, model=vgm(0.00247, "Sph", 480, 0.00166)) g <- gstat(g, id="por", formula=por~1, data=Allier, model=vgm(0.00239, "Sph", 480, 0.00118)) g <- gstat(g, id=c("fc", "por"), model=vgm(0.00151, "Sph", 480, -0.00124)) # predict at single point g$set = list(choleski = 0) # LDL' A <- predict(g, SpatialPoints(data.frame(x=450, y=350)), debug = 32) g$set = list(choleski = 1) # Choleski B <- predict(g, SpatialPoints(data.frame(x=450, y=350)), debug = 32) all.equal(A,B) # TRUE gstat/tests/na.action.Rout.save0000644000176200001440000000652714646417261016245 0ustar liggesusers R version 3.6.0 (2019-04-26) -- "Planting of a Tree" Copyright (C) 2019 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(sp) > > data(meuse) > data(meuse.grid) > > set.seed(13131) # reproduce results > > # select 10 random rows; > # create two missing values in the coordinates: > m = meuse.grid[sample(nrow(meuse.grid), 10), ] > m[c(2,8), "x"] = NA > > library(gstat) > ## this is not allowed anymore: > try(krige(log(zinc)~1,~x+y,meuse,m, na.action = na.pass)) Error in na.fail.default(structure(list(x = c(179220, NA, 178740, 179300, : missing values in object > try(krige(log(zinc)~1,~x+y,meuse,m, na.action = na.omit)) Error in na.fail.default(structure(list(x = c(179220, NA, 178740, 179300, : missing values in object > try(krige(log(zinc)~1,~x+y,meuse,m, na.action = na.exclude)) Error in na.fail.default(structure(list(x = c(179220, NA, 178740, 179300, : missing values in object > try(krige(log(zinc)~1,~x+y,meuse,m, na.action = na.fail)) Error in na.fail.default(structure(list(x = c(179220, NA, 178740, 179300, : missing values in object > > # select 10 random rows; > # create two missing values in the regressor variable: > m = meuse.grid[sample(nrow(meuse.grid), 10), ] > m[c(3,7), "dist"] = NA > krige(log(zinc)~dist,~x+y,meuse,m, na.action = na.pass) [ordinary or weighted least squares prediction] x y var1.pred var1.var 1 178860 330860 6.530134 0.2415196 2 180260 331860 5.389567 0.2406041 3 180100 331860 NA NA 4 180460 331820 5.213370 0.2417197 5 179660 330580 5.550859 0.2398778 6 179740 330300 6.108648 0.2395392 7 180220 330660 NA NA 8 178580 329820 6.533801 0.2415453 9 180100 331900 5.580264 0.2397758 10 180780 331900 5.095967 0.2426499 > krige(log(zinc)~dist,~x+y,meuse,m, na.action = na.omit) [ordinary or weighted least squares prediction] x y var1.pred var1.var 1877 178860 330860 6.530134 0.2415196 1015 180260 331860 5.389567 0.2406041 1056 180460 331820 5.213370 0.2417197 2199 179660 330580 5.550859 0.2398778 2556 179740 330300 6.108648 0.2395392 2985 178580 329820 6.533801 0.2415453 975 180100 331900 5.580264 0.2397758 992 180780 331900 5.095967 0.2426499 > krige(log(zinc)~dist,~x+y,meuse,m, na.action = na.exclude) [ordinary or weighted least squares prediction] x y var1.pred var1.var 1877 178860 330860 6.530134 0.2415196 1015 180260 331860 5.389567 0.2406041 1056 180460 331820 5.213370 0.2417197 2199 179660 330580 5.550859 0.2398778 2556 179740 330300 6.108648 0.2395392 2985 178580 329820 6.533801 0.2415453 975 180100 331900 5.580264 0.2397758 992 180780 331900 5.095967 0.2426499 > try(krige(log(zinc)~dist,~x+y,meuse,m, na.action = na.fail)) Error in na.fail.default(structure(list(dist = c(0.00135803, 0.423804, : missing values in object > > proc.time() user system elapsed 0.490 0.047 0.528 gstat/tests/krige0.R0000644000176200001440000000205514646417261014057 0ustar liggesusers# test -- load data: library(sp) data(meuse) coordinates(meuse) = ~x+y data(meuse.grid) gridded(meuse.grid) = ~x+y library(gstat) # test -- idw meuse.grid$idw <- idw0(zinc~1, meuse, meuse.grid)[,1] x <- idw(zinc~1, meuse, meuse.grid) all.equal(x$var1.pred, meuse.grid$idw) spplot(meuse.grid["idw"],col.regions=bpy.colors()) v = vgm(1, "Exp", 500) # test sk: x0 <- krige0(zinc~1, meuse, meuse.grid, v, beta = 500, computeVar = TRUE) rownames(x0$pred)=NULL x <- krige(zinc~1, meuse, meuse.grid, v, beta = 500) all.equal(x$var1.pred, x0$pred[,1]) all.equal(x$var1.var, x0$var) # test ok: x0 <- krige0(zinc~1, meuse, meuse.grid, v, computeVar = TRUE) rownames(x0$pred)=NULL names(x0$var)=NULL x <- krige(zinc~1, meuse, meuse.grid, v) all.equal(x$var1.pred, x0$pred[,1]) all.equal(x$var1.var, x0$var) # test uk: x0 <- krige0(zinc~sqrt(dist), meuse, meuse.grid, v, computeVar = TRUE) rownames(x0$pred)=NULL names(x0$var)=NULL x <- krige(zinc~sqrt(dist), meuse, meuse.grid, v) all.equal(x$var1.pred, x0$pred[,1]) all.equal(x$var1.var, x0$var)gstat/tests/variogram.R0000644000176200001440000000056614646417261014672 0ustar liggesuserslibrary(sp) library(gstat) data(meuse) variogram(log(zinc)~1, ~x+y, meuse) coordinates(meuse) <- ~ x + y variogram(log(zinc)~1, meuse) ind=seq(1,155,2) var1= meuse[ind,] var2= meuse[-ind,] g <- gstat(NULL, id = "lead", form = lead ~ 1, data=var1) g <- gstat(g, id = "zinc", form = zinc ~ 1, data=var2) v.cross <- variogram(g) plot(v.cross) gstat/tests/na.action.R0000644000176200001440000000156614646417261014556 0ustar liggesuserslibrary(sp) data(meuse) data(meuse.grid) set.seed(13131) # reproduce results # select 10 random rows; # create two missing values in the coordinates: m = meuse.grid[sample(nrow(meuse.grid), 10), ] m[c(2,8), "x"] = NA library(gstat) ## this is not allowed anymore: try(krige(log(zinc)~1,~x+y,meuse,m, na.action = na.pass)) try(krige(log(zinc)~1,~x+y,meuse,m, na.action = na.omit)) try(krige(log(zinc)~1,~x+y,meuse,m, na.action = na.exclude)) try(krige(log(zinc)~1,~x+y,meuse,m, na.action = na.fail)) # select 10 random rows; # create two missing values in the regressor variable: m = meuse.grid[sample(nrow(meuse.grid), 10), ] m[c(3,7), "dist"] = NA krige(log(zinc)~dist,~x+y,meuse,m, na.action = na.pass) krige(log(zinc)~dist,~x+y,meuse,m, na.action = na.omit) krige(log(zinc)~dist,~x+y,meuse,m, na.action = na.exclude) try(krige(log(zinc)~dist,~x+y,meuse,m, na.action = na.fail)) gstat/tests/covtable.R0000644000176200001440000000057014646417261014475 0ustar liggesuserslibrary(gstat) d=expand.grid(x=c(-.5,.5), y=c(-.5,.5)) d$z=1:4 vv=vgm(model = "Tab", covtable = variogramLine(vgm(1, "Sph", 1), 1, n=1e4,min = 0, covariance = TRUE)) vv krige(z~1,~x+y,d,data.frame(x=0,y=0),vgm(1, "Sph", 1)) krige(z~1,~x+y,d,data.frame(x=0,y=0),vv) krige(z~1,~x+y,d[1:2,],data.frame(x=0,y=0),vgm(1, "Sph", 1)) krige(z~1,~x+y,d[1:2,],data.frame(x=0,y=0),vv) gstat/tests/stars.Rout.save0000644000176200001440000003456314750415367015531 0ustar liggesusers R Under development (unstable) (2025-02-03 r87683 ucrt) -- "Unsuffered Consequences" Copyright (C) 2025 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > Sys.setenv(TZ = "UTC") > > # 0. using sp: > > suppressPackageStartupMessages(library(sp)) > demo(meuse, ask = FALSE) demo(meuse) ---- ~~~~~ > require(sp) > crs = CRS("EPSG:28992") > data("meuse") > coordinates(meuse) <- ~x+y > proj4string(meuse) <- crs > data("meuse.grid") > coordinates(meuse.grid) <- ~x+y > gridded(meuse.grid) <- TRUE > proj4string(meuse.grid) <- crs > data("meuse.riv") > meuse.riv <- SpatialPolygons(list(Polygons(list(Polygon(meuse.riv)),"meuse.riv"))) > proj4string(meuse.riv) <- crs > data("meuse.area") > meuse.area = SpatialPolygons(list(Polygons(list(Polygon(meuse.area)), "area"))) > proj4string(meuse.area) <- crs > suppressPackageStartupMessages(library(gstat)) > v = variogram(log(zinc)~1, meuse) > (v.fit = fit.variogram(v, vgm(1, "Sph", 900, 1))) model psill range 1 Nug 0.05066243 0.0000 2 Sph 0.59060780 897.0209 > k_sp = krige(log(zinc)~1, meuse[-(1:5),], meuse[1:5,], v.fit) [using ordinary kriging] > k_sp_grd = krige(log(zinc)~1, meuse, meuse.grid, v.fit) [using ordinary kriging] > > # 1. using sf: > suppressPackageStartupMessages(library(sf)) > demo(meuse_sf, ask = FALSE, echo = FALSE) > # reloads meuse as data.frame, so > demo(meuse, ask = FALSE) demo(meuse) ---- ~~~~~ > require(sp) > crs = CRS("EPSG:28992") > data("meuse") > coordinates(meuse) <- ~x+y > proj4string(meuse) <- crs > data("meuse.grid") > coordinates(meuse.grid) <- ~x+y > gridded(meuse.grid) <- TRUE > proj4string(meuse.grid) <- crs > data("meuse.riv") > meuse.riv <- SpatialPolygons(list(Polygons(list(Polygon(meuse.riv)),"meuse.riv"))) > proj4string(meuse.riv) <- crs > data("meuse.area") > meuse.area = SpatialPolygons(list(Polygons(list(Polygon(meuse.area)), "area"))) > proj4string(meuse.area) <- crs > > v = variogram(log(zinc)~1, meuse_sf) > (v.fit = fit.variogram(v, vgm(1, "Sph", 900, 1))) model psill range 1 Nug 0.05066243 0.0000 2 Sph 0.59060780 897.0209 > k_sf = krige(log(zinc)~1, meuse_sf[-(1:5),], meuse_sf[1:5,], v.fit) [using ordinary kriging] > > all.equal(k_sp, as(k_sf, "Spatial"), check.attributes = FALSE) [1] TRUE > all.equal(k_sp, as(k_sf, "Spatial"), check.attributes = TRUE) [1] "Attributes: < Component \"bbox\": Attributes: < Component \"dimnames\": Component 1: 2 string mismatches > >" [2] "Attributes: < Component \"coords\": Attributes: < Component \"dimnames\": Component 2: 2 string mismatches > >" [3] "Attributes: < Component \"coords.nrs\": Numeric: lengths (2, 0) differ >" > > # 2. using stars for grid: > > suppressPackageStartupMessages(library(stars)) > st = st_as_stars(meuse.grid) > st_crs(st) Coordinate Reference System: User input: Amersfoort / RD New wkt: PROJCRS["Amersfoort / RD New", BASEGEOGCRS["Amersfoort", DATUM["Amersfoort", ELLIPSOID["Bessel 1841",6377397.155,299.1528128, LENGTHUNIT["metre",1]]], PRIMEM["Greenwich",0, ANGLEUNIT["degree",0.0174532925199433]], ID["EPSG",4289]], CONVERSION["RD New", METHOD["Oblique Stereographic", ID["EPSG",9809]], PARAMETER["Latitude of natural origin",52.1561605555556, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8801]], PARAMETER["Longitude of natural origin",5.38763888888889, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8802]], PARAMETER["Scale factor at natural origin",0.9999079, SCALEUNIT["unity",1], ID["EPSG",8805]], PARAMETER["False easting",155000, LENGTHUNIT["metre",1], ID["EPSG",8806]], PARAMETER["False northing",463000, LENGTHUNIT["metre",1], ID["EPSG",8807]]], CS[Cartesian,2], AXIS["easting (X)",east, ORDER[1], LENGTHUNIT["metre",1]], AXIS["northing (Y)",north, ORDER[2], LENGTHUNIT["metre",1]], USAGE[ SCOPE["Engineering survey, topographic mapping."], AREA["Netherlands - onshore, including Waddenzee, Dutch Wadden Islands and 12-mile offshore coastal zone."], BBOX[50.75,3.2,53.7,7.22]], ID["EPSG",28992]] > > # compare inputs: > sp = as(st, "Spatial") > fullgrid(meuse.grid) = TRUE > all.equal(sp, meuse.grid["dist"], check.attributes = FALSE) [1] "Names: Lengths (5, 1) differ (string compare on first 1)" [2] "Names: 1 string mismatch" > all.equal(sp, meuse.grid["dist"], check.attributes = TRUE, use.names = FALSE) [1] "Names: Lengths (5, 1) differ (string compare on first 1)" [2] "Names: 1 string mismatch" [3] "Attributes: < Component 3: Names: 1 string mismatch >" [4] "Attributes: < Component 3: Length mismatch: comparison on first 1 components >" [5] "Attributes: < Component 3: Component 1: Mean relative difference: 1.08298 >" [6] "Attributes: < Component 4: Attributes: < Component 2: names for current but not for target > >" [7] "Attributes: < Component 4: Attributes: < Component 3: names for current but not for target > >" > > # kriging: > st_crs(st) = st_crs(meuse_sf) = NA # GDAL roundtrip messes them up! > k_st = if (Sys.getenv("USER") == "travis") { + try(krige(log(zinc)~1, meuse_sf, st, v.fit)) + } else { + krige(log(zinc)~1, meuse_sf, st, v.fit) + } [using ordinary kriging] > k_st stars object with 2 dimensions and 2 attributes attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. NA's var1.pred 4.7765547 5.2376293 5.5728839 5.7072287 6.1717619 7.4399911 5009 var1.var 0.0854949 0.1372864 0.1621838 0.1853319 0.2116152 0.5002756 5009 dimension(s): from to offset delta x/y x 1 78 178440 40 [x] y 1 104 333760 -40 [y] > > # handle factors, when going to stars? > k_sp_grd$cls = cut(k_sp_grd$var1.pred, c(0, 5, 6, 7, 8, 9)) > st_as_stars(k_sp_grd) stars object with 2 dimensions and 3 attributes attribute(s): var1.pred var1.var cls Min. :4.777 Min. :0.0855 (0,5]: 316 1st Qu.:5.238 1st Qu.:0.1373 (5,6]:1778 Median :5.573 Median :0.1622 (6,7]: 962 Mean :5.707 Mean :0.1853 (7,8]: 47 3rd Qu.:6.172 3rd Qu.:0.2116 (8,9]: 0 Max. :7.440 Max. :0.5003 NA's :5009 NA's :5009 NA's :5009 dimension(s): from to offset delta refsys x/y x 1 78 178440 40 Amersfoort / RD New [x] y 1 104 333760 -40 Amersfoort / RD New [y] > if (require(raster, quietly = TRUE)) { + print(st_as_stars(raster::stack(k_sp_grd))) # check + print(all.equal(st_redimension(st_as_stars(k_sp_grd)), st_as_stars(raster::stack(k_sp_grd)), check.attributes=FALSE)) + } stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. NA's var1.pred 0.0854949 0.2116778 2 2.710347 5.237542 7.439991 15027 dimension(s): from to offset delta refsys values x 1 78 178440 40 Amersfoort / RD New NULL y 1 104 333760 -40 Amersfoort / RD New NULL band 1 3 NA NA NA var1.pred, var1.var , cls x/y x [x] y [y] band [1] TRUE > > suppressPackageStartupMessages(library(spacetime)) > > tm = as.POSIXct("2019-02-25 15:37:24 CET") > n = 4 > s = stars:::st_stars(list(foo = array(1:(n^3), rep(n,3))), + stars:::create_dimensions(list( + x = stars:::create_dimension(from = 1, to = n, offset = 10, delta = 0.5), + y = stars:::create_dimension(from = 1, to = n, offset = 0, delta = -0.7), + time = stars:::create_dimension(values = tm + 1:n)), + raster = stars:::get_raster(dimensions = c("x", "y"))) + ) > s stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. foo 1 16.75 32.5 32.5 48.25 64 dimension(s): from to offset delta refsys x/y x 1 4 10 0.5 NA [x] y 1 4 0 -0.7 NA [y] time 1 4 2019-02-25 15:37:25 UTC 1 secs POSIXct > > as.data.frame(s) x y time foo 1 10.25 -0.35 2019-02-25 15:37:25 1 2 10.75 -0.35 2019-02-25 15:37:25 2 3 11.25 -0.35 2019-02-25 15:37:25 3 4 11.75 -0.35 2019-02-25 15:37:25 4 5 10.25 -1.05 2019-02-25 15:37:25 5 6 10.75 -1.05 2019-02-25 15:37:25 6 7 11.25 -1.05 2019-02-25 15:37:25 7 8 11.75 -1.05 2019-02-25 15:37:25 8 9 10.25 -1.75 2019-02-25 15:37:25 9 10 10.75 -1.75 2019-02-25 15:37:25 10 11 11.25 -1.75 2019-02-25 15:37:25 11 12 11.75 -1.75 2019-02-25 15:37:25 12 13 10.25 -2.45 2019-02-25 15:37:25 13 14 10.75 -2.45 2019-02-25 15:37:25 14 15 11.25 -2.45 2019-02-25 15:37:25 15 16 11.75 -2.45 2019-02-25 15:37:25 16 17 10.25 -0.35 2019-02-25 15:37:26 17 18 10.75 -0.35 2019-02-25 15:37:26 18 19 11.25 -0.35 2019-02-25 15:37:26 19 20 11.75 -0.35 2019-02-25 15:37:26 20 21 10.25 -1.05 2019-02-25 15:37:26 21 22 10.75 -1.05 2019-02-25 15:37:26 22 23 11.25 -1.05 2019-02-25 15:37:26 23 24 11.75 -1.05 2019-02-25 15:37:26 24 25 10.25 -1.75 2019-02-25 15:37:26 25 26 10.75 -1.75 2019-02-25 15:37:26 26 27 11.25 -1.75 2019-02-25 15:37:26 27 28 11.75 -1.75 2019-02-25 15:37:26 28 29 10.25 -2.45 2019-02-25 15:37:26 29 30 10.75 -2.45 2019-02-25 15:37:26 30 31 11.25 -2.45 2019-02-25 15:37:26 31 32 11.75 -2.45 2019-02-25 15:37:26 32 33 10.25 -0.35 2019-02-25 15:37:27 33 34 10.75 -0.35 2019-02-25 15:37:27 34 35 11.25 -0.35 2019-02-25 15:37:27 35 36 11.75 -0.35 2019-02-25 15:37:27 36 37 10.25 -1.05 2019-02-25 15:37:27 37 38 10.75 -1.05 2019-02-25 15:37:27 38 39 11.25 -1.05 2019-02-25 15:37:27 39 40 11.75 -1.05 2019-02-25 15:37:27 40 41 10.25 -1.75 2019-02-25 15:37:27 41 42 10.75 -1.75 2019-02-25 15:37:27 42 43 11.25 -1.75 2019-02-25 15:37:27 43 44 11.75 -1.75 2019-02-25 15:37:27 44 45 10.25 -2.45 2019-02-25 15:37:27 45 46 10.75 -2.45 2019-02-25 15:37:27 46 47 11.25 -2.45 2019-02-25 15:37:27 47 48 11.75 -2.45 2019-02-25 15:37:27 48 49 10.25 -0.35 2019-02-25 15:37:28 49 50 10.75 -0.35 2019-02-25 15:37:28 50 51 11.25 -0.35 2019-02-25 15:37:28 51 52 11.75 -0.35 2019-02-25 15:37:28 52 53 10.25 -1.05 2019-02-25 15:37:28 53 54 10.75 -1.05 2019-02-25 15:37:28 54 55 11.25 -1.05 2019-02-25 15:37:28 55 56 11.75 -1.05 2019-02-25 15:37:28 56 57 10.25 -1.75 2019-02-25 15:37:28 57 58 10.75 -1.75 2019-02-25 15:37:28 58 59 11.25 -1.75 2019-02-25 15:37:28 59 60 11.75 -1.75 2019-02-25 15:37:28 60 61 10.25 -2.45 2019-02-25 15:37:28 61 62 10.75 -2.45 2019-02-25 15:37:28 62 63 11.25 -2.45 2019-02-25 15:37:28 63 64 11.75 -2.45 2019-02-25 15:37:28 64 > plot(s, col = sf.colors(), axes = TRUE) > (s.stfdf = as(s, "STFDF")) An object of class "STFDF" Slot "data": foo 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 38 38 39 39 40 40 41 41 42 42 43 43 44 44 45 45 46 46 47 47 48 48 49 49 50 50 51 51 52 52 53 53 54 54 55 55 56 56 57 57 58 58 59 59 60 60 61 61 62 62 63 63 64 64 Slot "sp": Object of class SpatialPixels Grid topology: cellcentre.offset cellsize cells.dim x 10.25 0.5 4 y -2.45 0.7 4 SpatialPoints: x y [1,] 10.25 -0.35 [2,] 10.75 -0.35 [3,] 11.25 -0.35 [4,] 11.75 -0.35 [5,] 10.25 -1.05 [6,] 10.75 -1.05 [7,] 11.25 -1.05 [8,] 11.75 -1.05 [9,] 10.25 -1.75 [10,] 10.75 -1.75 [11,] 11.25 -1.75 [12,] 11.75 -1.75 [13,] 10.25 -2.45 [14,] 10.75 -2.45 [15,] 11.25 -2.45 [16,] 11.75 -2.45 Coordinate Reference System (CRS) arguments: NA Slot "time": timeIndex 2019-02-25 15:37:25 1 2019-02-25 15:37:26 2 2019-02-25 15:37:27 3 2019-02-25 15:37:28 4 Slot "endTime": [1] "2019-02-25 15:37:26 UTC" "2019-02-25 15:37:27 UTC" [3] "2019-02-25 15:37:28 UTC" "2019-02-25 15:37:29 UTC" > stplot(s.stfdf, scales = list(draw = TRUE)) > > (s2 = st_as_stars(s.stfdf)) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. foo 1 16.75 32.5 32.5 48.25 64 dimension(s): from to offset delta refsys x/y x 1 4 10 0.5 NA [x] y 1 4 -1.11e-16 -0.7 NA [y] time 1 4 2019-02-25 15:37:25 UTC 1 secs POSIXct > plot(s2, col = sf.colors(), axes = TRUE) > all.equal(s, s2, check.attributes = FALSE) [1] TRUE > > # multiple simulations: > data(meuse, package = "sp") > data(meuse.grid, package = "sp") > coordinates(meuse.grid) <- ~x+y > gridded(meuse.grid) <- TRUE > meuse.grid = st_as_stars(meuse.grid) > meuse_sf = st_as_sf(meuse, coords = c("x", "y")) > g = gstat(NULL, "zinc", zinc~1, meuse_sf, model = vgm(1, "Exp", 300), nmax = 10) > g = gstat(g, "lead", lead~1, meuse_sf, model = vgm(1, "Exp", 300), nmax = 10, fill.cross = TRUE) > set.seed(123) > ## IGNORE_RDIFF_BEGIN > (p = predict(g, meuse.grid, nsim = 5)) drawing 5 multivariate GLS realisations of beta... [using conditional Gaussian simulation] stars object with 3 dimensions and 2 attributes attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. NA's zinc 101.7643 199.48523 300.2140 399.7954 544.0229 1817.2057 25045 lead 32.7799 73.01782 107.9339 133.1702 178.8162 638.9396 25045 dimension(s): from to offset delta values x/y x 1 78 178440 40 NULL [x] y 1 104 333760 -40 NULL [y] sample 1 5 NA NA sim1,...,sim5 > ## IGNORE_RDIFF_END > > proc.time() user system elapsed 11.81 0.64 12.45 gstat/tests/covtable.Rout.save0000644000176200001440000000276514646417261016172 0ustar liggesusers R version 3.2.3 (2015-12-10) -- "Wooden Christmas-Tree" Copyright (C) 2015 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(gstat) > d=expand.grid(x=c(-.5,.5), y=c(-.5,.5)) > d$z=1:4 > vv=vgm(model = "Tab", covtable = + variogramLine(vgm(1, "Sph", 1), 1, n=1e4,min = 0, covariance = TRUE)) > vv model psill maxdist 1 Tab NA 1 covariance table: [1] 1.0000000 0.7039712 0.4319496 0.2080384 0.0560108 0.0000000 > krige(z~1,~x+y,d,data.frame(x=0,y=0),vgm(1, "Sph", 1)) [using ordinary kriging] x y var1.pred var1.var 1 0 0 2.5 1.017767 > krige(z~1,~x+y,d,data.frame(x=0,y=0),vv) [using ordinary kriging] x y var1.pred var1.var 1 0 0 2.5 1.017863 > krige(z~1,~x+y,d[1:2,],data.frame(x=0,y=0),vgm(1, "Sph", 1)) [using ordinary kriging] x y var1.pred var1.var 1 0 0 1.5 1.267767 > krige(z~1,~x+y,d[1:2,],data.frame(x=0,y=0),vv) [using ordinary kriging] x y var1.pred var1.var 1 0 0 1.5 1.267863 > > proc.time() user system elapsed 0.704 0.276 0.670 gstat/tests/cv3d.Rout.save0000644000176200001440000000405214750415335015215 0ustar liggesusers R Under development (unstable) (2025-02-03 r87683 ucrt) -- "Unsuffered Consequences" Copyright (C) 2025 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > options(digits = 4) > set.seed(1131) > d = data.frame(x=runif(50),y=runif(50),z=runif(50),v=rnorm(50)) > library(gstat) > xx = krige.cv(v~1,~x+y+z,d,model=vgm(1,"Exp",1), verbose=F, set=list(debug=0)) > summary(xx) var1.pred var1.var observed residual Min. :-1.163 Min. :0.116 Min. :-2.240 Min. :-2.1755 1st Qu.:-0.571 1st Qu.:0.175 1st Qu.:-0.876 1st Qu.:-0.7881 Median :-0.201 Median :0.192 Median :-0.219 Median : 0.1175 Mean :-0.165 Mean :0.208 Mean :-0.142 Mean : 0.0233 3rd Qu.: 0.161 3rd Qu.:0.240 3rd Qu.: 0.501 3rd Qu.: 0.8508 Max. : 1.085 Max. :0.426 Max. : 1.857 Max. : 2.5224 zscore fold x y Min. :-5.1678 Min. : 1.0 Min. :0.00678 Min. :0.0034 1st Qu.:-1.8749 1st Qu.:13.2 1st Qu.:0.23966 1st Qu.:0.2466 Median : 0.2453 Median :25.5 Median :0.48668 Median :0.4525 Mean : 0.0167 Mean :25.5 Mean :0.49966 Mean :0.4969 3rd Qu.: 2.0201 3rd Qu.:37.8 3rd Qu.:0.74730 3rd Qu.:0.7394 Max. : 7.3541 Max. :50.0 Max. :0.98754 Max. :0.9872 z Min. :0.00164 1st Qu.:0.18646 Median :0.44850 Mean :0.47142 3rd Qu.:0.72403 Max. :0.99420 > > proc.time() user system elapsed 1.23 0.17 1.39 gstat/tests/merge.Rout.save0000644000176200001440000001564514646417261015473 0ustar liggesusers R version 4.2.0 (2022-04-22) -- "Vigorous Calisthenics" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > options(digits=6) > # illustrates the use of merge, for merging parameters accross variables: > # Z1=m+e1(s) > # Z2=m+e2(s) > # Z1 and Z2 each have a different variogram, but share the parameter m > # see documentation of gstat() function > library(gstat) > d1 = data.frame(x=c(0,2),y=c(0,0),z=c(0,1)) > d2 = data.frame(x=c(0,2),y=c(2,2),z=c(4,5)) > g = gstat(NULL,"d1", z~1,~x+y,d1,model=vgm(1, "Exp", 1)) > g = gstat(g,"d2", z~1,~x+y,d2,model=vgm(1, "Exp", 1), merge=c("d1","d2")) > g = gstat(g, c("d1", "d2"), model = vgm(0.5, "Exp", 1)) > predict(g, data.frame(x=1,y=1), debug = 32) Intrinsic Correlation found. Good. [using ordinary cokriging] we're at location X: 1 Y: 1 Z: 0 zero block size we're at point X: 1 Y: 1 Z: 0 # X: #Matrix: 4 by 1 rbind( c( 1.000000), # row 1 c( 1.000000), # row 2 c( 1.000000), # row 3 c( 1.000000) # row 4 ) [using generalized covariances: max_val - semivariance()] # Covariances (x_i, x_j) matrix C (upper triangle): #Matrix: 4 by 4 rbind( c( 1.000000, 0.135335, 0.067668, 0.029553), # row 1 c( 0.135335, 1.000000, 0.029553, 0.067668), # row 2 c( 0.067668, 0.029553, 1.000000, 0.135335), # row 3 c( 0.029553, 0.067668, 0.135335, 1.000000) # row 4 ) # glm->C, Choleski decomposed:: #Matrix: 4 by 4 rbind( c( 1.000000, 0.135335, 0.067668, 0.029553), # row 1 c( 0.000000, 0.990800, 0.020584, 0.064259), # row 2 c( 0.000000, 0.000000, 0.997496, 0.132344), # row 3 c( 0.000000, 0.000000, 0.000000, 0.988677) # row 4 ) # X'C-1 X: #Matrix: 1 by 1 rbind( c( 3.245289) # row 1 ) # beta: #Vector: dim: 1 c( 2.500000) # Cov(beta), (X'C-1 X)-1: #Matrix: 1 by 1 rbind( c( 0.308139) # row 1 ) # Corr(beta): #Matrix: 1 by 1 rbind( c( 1.000000) # row 1 ) # X0 (X values at prediction location x0): #Matrix: 1 by 2 rbind( c( 1.000000, 1.000000) # row 1 ) # BLUE(mu), E(y(x0)) = X0'beta: #Vector: dim: 2 c( 2.500000, 2.500000) # Covariances (x_i, x_0), C0: #Matrix: 4 by 2 rbind( c( 0.243117, 0.121558), # row 1 c( 0.243117, 0.121558), # row 2 c( 0.121558, 0.243117), # row 3 c( 0.121558, 0.243117) # row 4 ) # C-1 C0: #Matrix: 4 by 2 rbind( c( 0.206482, 0.089387), # row 1 c( 0.206482, 0.089387), # row 2 c( 0.089387, 0.206482), # row 3 c( 0.089387, 0.206482) # row 4 ) # [a] Cov_ij(B,B) or Cov_ij(0,0): #Matrix: 2 by 2 rbind( c( 1.000000, 0.500000), # row 1 c( 0.500000, 1.000000) # row 2 ) # [c] (x0-X'C-1 c0)'(X'C-1 X)-1(x0-X'C-1 c0): #Matrix: 2 by 2 rbind( c( 0.051360, 0.051360), # row 1 c( 0.051360, 0.051360) # row 2 ) # [b] c0'C-1 c0: #Matrix: 2 by 2 rbind( c( 0.122130, 0.093662), # row 1 c( 0.093662, 0.122130) # row 2 ) # Best Linear Unbiased Predictor: #Vector: dim: 2 c( 2.031619, 2.968381) # MSPE ([a]-[b]+[c]): #Matrix: 2 by 2 rbind( c( 0.929230, 0.457698), # row 1 c( 0.457698, 0.929230) # row 2 ) # kriging weights: #Matrix: 4 by 2 rbind( c( 0.308548, 0.191452), # row 1 c( 0.308548, 0.191452), # row 2 c( 0.191452, 0.308548), # row 3 c( 0.191452, 0.308548) # row 4 ) x y d1.pred d1.var d2.pred d2.var cov.d1.d2 1 1 1 2.03162 0.92923 2.96838 0.92923 0.457698 > > # Z1 and Z2 share a regression slope: > g = gstat(NULL,"d1", z~x,~x+y,d1,model=vgm(1, "Exp", 1)) > g = gstat(g,"d2", z~x,~x+y,d2,model=vgm(1, "Exp", 1), + merge=list(c("d1",2,"d2",2))) > g = gstat(g, c("d1", "d2"), model = vgm(0.5, "Exp", 1)) > predict(g, data.frame(x=1,y=1), debug = 32) Intrinsic Correlation found. Good. [using universal cokriging] we're at location X: 1 Y: 1 Z: 0 zero block size we're at point X: 1 Y: 1 Z: 0 # X: #Matrix: 4 by 3 rbind( c( 1.000000, 0.000000, 0.000000), # row 1 c( 1.000000, 2.000000, 0.000000), # row 2 c( 0.000000, 0.000000, 1.000000), # row 3 c( 0.000000, 2.000000, 1.000000) # row 4 ) [using generalized covariances: max_val - semivariance()] # Covariances (x_i, x_j) matrix C (upper triangle): #Matrix: 4 by 4 rbind( c( 1.000000, 0.135335, 0.067668, 0.029553), # row 1 c( 0.135335, 1.000000, 0.029553, 0.067668), # row 2 c( 0.067668, 0.029553, 1.000000, 0.135335), # row 3 c( 0.029553, 0.067668, 0.135335, 1.000000) # row 4 ) # glm->C, Choleski decomposed:: #Matrix: 4 by 4 rbind( c( 1.000000, 0.135335, 0.067668, 0.029553), # row 1 c( 0.000000, 0.990800, 0.020584, 0.064259), # row 2 c( 0.000000, 0.000000, 0.997496, 0.132344), # row 3 c( 0.000000, 0.000000, 0.000000, 0.988677) # row 4 ) # X'C-1 X: #Matrix: 3 by 3 rbind( c( 1.774607, 1.622645, -0.151962), # row 1 c( 1.622645, 7.676050, 1.622645), # row 2 c(-0.151962, 1.622645, 1.774607) # row 3 ) # beta: #Vector: dim: 3 c( 0.000000, 0.500000, 4.000000) # Cov(beta), (X'C-1 X)-1: #Matrix: 3 by 3 rbind( c( 0.793363, -0.225695, 0.274305), # row 1 c(-0.225695, 0.225695, -0.225695), # row 2 c( 0.274305, -0.225695, 0.793363) # row 3 ) # Corr(beta): #Matrix: 3 by 3 rbind( c( 1.000000, -0.533366, 0.345750), # row 1 c(-0.533366, 1.000000, -0.533366), # row 2 c( 0.345750, -0.533366, 1.000000) # row 3 ) # X0 (X values at prediction location x0): #Matrix: 3 by 2 rbind( c( 1.000000, 0.000000), # row 1 c( 1.000000, 1.000000), # row 2 c( 0.000000, 1.000000) # row 3 ) # BLUE(mu), E(y(x0)) = X0'beta: #Vector: dim: 2 c( 0.500000, 4.500000) # Covariances (x_i, x_0), C0: #Matrix: 4 by 2 rbind( c( 0.243117, 0.121558), # row 1 c( 0.243117, 0.121558), # row 2 c( 0.121558, 0.243117), # row 3 c( 0.121558, 0.243117) # row 4 ) # C-1 C0: #Matrix: 4 by 2 rbind( c( 0.206482, 0.089387), # row 1 c( 0.206482, 0.089387), # row 2 c( 0.089387, 0.206482), # row 3 c( 0.089387, 0.206482) # row 4 ) # [a] Cov_ij(B,B) or Cov_ij(0,0): #Matrix: 2 by 2 rbind( c( 1.000000, 0.500000), # row 1 c( 0.500000, 1.000000) # row 2 ) # [c] (x0-X'C-1 c0)'(X'C-1 X)-1(x0-X'C-1 c0): #Matrix: 2 by 2 rbind( c( 0.203564, -0.100844), # row 1 c(-0.100844, 0.203564) # row 2 ) # [b] c0'C-1 c0: #Matrix: 2 by 2 rbind( c( 0.122130, 0.093662), # row 1 c( 0.093662, 0.122130) # row 2 ) # Best Linear Unbiased Predictor: #Vector: dim: 2 c( 0.500000, 4.500000) # MSPE ([a]-[b]+[c]): #Matrix: 2 by 2 rbind( c( 1.081434, 0.305494), # row 1 c( 0.305494, 1.081434) # row 2 ) # kriging weights: #Matrix: 4 by 2 rbind( c( 0.500000, 0.000000), # row 1 c( 0.500000, 0.000000), # row 2 c( 0.000000, 0.500000), # row 3 c( 0.000000, 0.500000) # row 4 ) x y d1.pred d1.var d2.pred d2.var cov.d1.d2 1 1 1 0.5 1.08143 4.5 1.08143 0.305494 > > proc.time() user system elapsed 0.551 0.044 0.588 gstat/tests/windst.R0000644000176200001440000000634414646417261014213 0ustar liggesuserssuppressPackageStartupMessages(library(sp)) suppressPackageStartupMessages(library(spacetime)) suppressPackageStartupMessages(library(gstat)) suppressPackageStartupMessages(library(stars)) data(wind) wind.loc$y = as.numeric(char2dms(as.character(wind.loc[["Latitude"]]))) wind.loc$x = as.numeric(char2dms(as.character(wind.loc[["Longitude"]]))) coordinates(wind.loc) = ~x+y proj4string(wind.loc) = "+proj=longlat +datum=WGS84 +ellps=WGS84" wind$time = ISOdate(wind$year+1900, wind$month, wind$day) wind$jday = as.numeric(format(wind$time, '%j')) stations = 4:15 windsqrt = sqrt(0.5148 * wind[stations]) # knots -> m/s Jday = 1:366 daymeans = colMeans( sapply(split(windsqrt - colMeans(windsqrt), wind$jday), colMeans)) meanwind = lowess(daymeans ~ Jday, f = 0.1)$y[wind$jday] velocities = apply(windsqrt, 2, function(x) { x - meanwind }) # match order of columns in wind to Code in wind.loc; # convert to utm zone 29, to be able to do interpolation in # proper Euclidian (projected) space: pts = coordinates(wind.loc[match(names(wind[4:15]), wind.loc$Code),]) pts = SpatialPoints(pts) if (require(sp, quietly = TRUE) && require(maps, quietly = TRUE)) { proj4string(pts) = "+proj=longlat +datum=WGS84 +ellps=WGS84" utm29 = "+proj=utm +zone=29 +datum=WGS84 +ellps=WGS84" pts = as(st_transform(st_as_sfc(pts), utm29), "Spatial") # note the t() in: w = STFDF(pts, wind$time, data.frame(values = as.vector(t(velocities)))) library(mapdata) mp = map("worldHires", xlim = c(-11,-5.4), ylim = c(51,55.5), plot=FALSE) sf = st_transform(st_as_sf(mp, fill = FALSE), utm29) m = as(sf, "Spatial") # setup grid grd = SpatialPixels(SpatialPoints(makegrid(m, n = 300)), proj4string = m@proj4string) # grd$t = rep(1, nrow(grd)) #coordinates(grd) = ~x1+x2 #gridded(grd)=TRUE # select april 1961: w = w[, "1961-04"] covfn = function(x, y = x) { du = spDists(coordinates(x), coordinates(y)) t1 = as.numeric(index(x)) # time in seconds t2 = as.numeric(index(y)) # time in seconds dt = abs(outer(t1, t2, "-")) # separable, product covariance model: 0.6 * exp(-du/750000) * exp(-dt / (1.5 * 3600 * 24)) } n = 10 tgrd = seq(min(index(w)), max(index(w)), length=n) pred = krige0(sqrt(values)~1, w, STF(grd, tgrd), covfn) layout = list(list("sp.points", pts, first=F, cex=.5), list("sp.lines", m, col='grey')) wind.pr0 = STFDF(grd, tgrd, data.frame(var1.pred = pred)) v = vgmST("separable", space = vgm(1, "Exp", 750000), time = vgm(1, "Exp", 1.5 * 3600 * 24), sill = 0.6) wind.ST = krigeST(sqrt(values)~1, w, STF(grd, tgrd), v) all.equal(wind.pr0, wind.ST) # stars: df = data.frame(a = rep(NA, 324*10)) s = STF(grd, tgrd) newd = addAttrToGeom(s, df) wind.sta = krigeST(sqrt(values)~1, st_as_stars(w), st_as_stars(newd), v) # 1 plot(stars::st_as_stars(wind.ST), breaks = "equal", col = sf.colors()) # 2 stplot(wind.ST) # 3 plot(wind.sta, breaks = "equal", col = sf.colors()) st_as_stars(wind.ST)[[1]][1:3,1:3,1] (wind.sta)[[1]][1:3,1:3,1] st_bbox(wind.sta) bbox(wind.ST) all.equal(wind.sta, stars::st_as_stars(wind.ST), check.attributes = FALSE) # 4: roundtrip wind.sta->STFDF->stars rt = stars::st_as_stars(as(wind.sta, "STFDF")) plot(rt, breaks = "equal", col = sf.colors()) # 5: stplot(as(wind.sta, "STFDF")) st_bbox(rt) # 6: stplot(as(st_as_stars(wind.ST), "STFDF")) } gstat/tests/cv.R0000644000176200001440000000073414646417261013310 0ustar liggesusers# try bivariate cokriging; cross validate first variable library(sp) data(meuse) library(gstat) g=gstat(NULL, "log-zinc", log(zinc)~1, ~x+y, meuse, nmax=10) g=gstat(g, "log-lead", log(lead)~1, ~x+y, meuse, nmax=10) g=gstat(g, "log-copper", log(copper)~1, ~x+y, meuse, nmax=10) v=variogram(g) g=gstat(g, model=vgm(1, "Sph", 1000), fill.all=T) g=fit.lmc(v, g) g set.seed(13131) summary(gstat.cv(g, remove.all=TRUE, nfold=5)) summary(gstat.cv(g, remove.all=FALSE, nfold=5)) gstat/tests/windst.Rout.save0000644000176200001440000001133214646417261015671 0ustar liggesusers R version 4.2.3 (2023-03-15) -- "Shortstop Beagle" Copyright (C) 2023 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > suppressPackageStartupMessages(library(sp)) > suppressPackageStartupMessages(library(spacetime)) > suppressPackageStartupMessages(library(gstat)) > suppressPackageStartupMessages(library(stars)) > > data(wind) > wind.loc$y = as.numeric(char2dms(as.character(wind.loc[["Latitude"]]))) > wind.loc$x = as.numeric(char2dms(as.character(wind.loc[["Longitude"]]))) > coordinates(wind.loc) = ~x+y > proj4string(wind.loc) = "+proj=longlat +datum=WGS84 +ellps=WGS84" > > wind$time = ISOdate(wind$year+1900, wind$month, wind$day) > wind$jday = as.numeric(format(wind$time, '%j')) > stations = 4:15 > windsqrt = sqrt(0.5148 * wind[stations]) # knots -> m/s > Jday = 1:366 > daymeans = colMeans( + sapply(split(windsqrt - colMeans(windsqrt), wind$jday), colMeans)) > meanwind = lowess(daymeans ~ Jday, f = 0.1)$y[wind$jday] > velocities = apply(windsqrt, 2, function(x) { x - meanwind }) > # match order of columns in wind to Code in wind.loc; > # convert to utm zone 29, to be able to do interpolation in > # proper Euclidian (projected) space: > pts = coordinates(wind.loc[match(names(wind[4:15]), wind.loc$Code),]) > pts = SpatialPoints(pts) > if (require(sp, quietly = TRUE) && require(maps, quietly = TRUE)) { + proj4string(pts) = "+proj=longlat +datum=WGS84 +ellps=WGS84" + utm29 = "+proj=utm +zone=29 +datum=WGS84 +ellps=WGS84" + pts = as(st_transform(st_as_sfc(pts), utm29), "Spatial") + # note the t() in: + w = STFDF(pts, wind$time, data.frame(values = as.vector(t(velocities)))) + + library(mapdata) + mp = map("worldHires", xlim = c(-11,-5.4), ylim = c(51,55.5), plot=FALSE) + sf = st_transform(st_as_sf(mp, fill = FALSE), utm29) + m = as(sf, "Spatial") + + # setup grid + grd = SpatialPixels(SpatialPoints(makegrid(m, n = 300)), + proj4string = m@proj4string) + # grd$t = rep(1, nrow(grd)) + #coordinates(grd) = ~x1+x2 + #gridded(grd)=TRUE + + # select april 1961: + w = w[, "1961-04"] + + covfn = function(x, y = x) { + du = spDists(coordinates(x), coordinates(y)) + t1 = as.numeric(index(x)) # time in seconds + t2 = as.numeric(index(y)) # time in seconds + dt = abs(outer(t1, t2, "-")) + # separable, product covariance model: + 0.6 * exp(-du/750000) * exp(-dt / (1.5 * 3600 * 24)) + } + + n = 10 + tgrd = seq(min(index(w)), max(index(w)), length=n) + pred = krige0(sqrt(values)~1, w, STF(grd, tgrd), covfn) + layout = list(list("sp.points", pts, first=F, cex=.5), + list("sp.lines", m, col='grey')) + wind.pr0 = STFDF(grd, tgrd, data.frame(var1.pred = pred)) + + v = vgmST("separable", + space = vgm(1, "Exp", 750000), + time = vgm(1, "Exp", 1.5 * 3600 * 24), + sill = 0.6) + wind.ST = krigeST(sqrt(values)~1, w, STF(grd, tgrd), v) + + all.equal(wind.pr0, wind.ST) + + # stars: + df = data.frame(a = rep(NA, 324*10)) + s = STF(grd, tgrd) + newd = addAttrToGeom(s, df) + wind.sta = krigeST(sqrt(values)~1, st_as_stars(w), st_as_stars(newd), v) + # 1 + plot(stars::st_as_stars(wind.ST), breaks = "equal", col = sf.colors()) + # 2 + stplot(wind.ST) + # 3 + plot(wind.sta, breaks = "equal", col = sf.colors()) + st_as_stars(wind.ST)[[1]][1:3,1:3,1] + (wind.sta)[[1]][1:3,1:3,1] + st_bbox(wind.sta) + bbox(wind.ST) + all.equal(wind.sta, stars::st_as_stars(wind.ST), check.attributes = FALSE) + + # 4: roundtrip wind.sta->STFDF->stars + rt = stars::st_as_stars(as(wind.sta, "STFDF")) + plot(rt, breaks = "equal", col = sf.colors()) + # 5: + stplot(as(wind.sta, "STFDF")) + st_bbox(rt) + + # 6: + stplot(as(st_as_stars(wind.ST), "STFDF")) + } Warning messages: 1: In krigeST(sqrt(values) ~ 1, w, STF(grd, tgrd), v) : The spatio-temporal variogram model does not carry the strongly recommended attribute 'temporal unit'. The unit 'secs' has been assumed. krigeST could not check whether the temporal distances between locations and in the variogram coincide. 2: In krigeST(sqrt(values) ~ 1, st_as_stars(w), st_as_stars(newd), : The spatio-temporal variogram model does not carry the strongly recommended attribute 'temporal unit'. The unit 'secs' has been assumed. krigeST could not check whether the temporal distances between locations and in the variogram coincide. > > proc.time() user system elapsed 4.489 3.497 3.766 gstat/tests/variogram.Rout.save0000644000176200001440000000515214646417261016353 0ustar liggesusers R version 3.0.1 (2013-05-16) -- "Good Sport" Copyright (C) 2013 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(sp) > library(gstat) > data(meuse) > variogram(log(zinc)~1, ~x+y, meuse) np dist gamma dir.hor dir.ver id 1 57 79.29244 0.1234479 0 0 var1 2 299 163.97367 0.2162185 0 0 var1 3 419 267.36483 0.3027859 0 0 var1 4 457 372.73542 0.4121448 0 0 var1 5 547 478.47670 0.4634128 0 0 var1 6 533 585.34058 0.5646933 0 0 var1 7 574 693.14526 0.5689683 0 0 var1 8 564 796.18365 0.6186769 0 0 var1 9 589 903.14650 0.6471479 0 0 var1 10 543 1011.29177 0.6915705 0 0 var1 11 500 1117.86235 0.7033984 0 0 var1 12 477 1221.32810 0.6038770 0 0 var1 13 452 1329.16407 0.6517158 0 0 var1 14 457 1437.25620 0.5665318 0 0 var1 15 415 1543.20248 0.5748227 0 0 var1 > > coordinates(meuse) <- ~ x + y > variogram(log(zinc)~1, meuse) np dist gamma dir.hor dir.ver id 1 57 79.29244 0.1234479 0 0 var1 2 299 163.97367 0.2162185 0 0 var1 3 419 267.36483 0.3027859 0 0 var1 4 457 372.73542 0.4121448 0 0 var1 5 547 478.47670 0.4634128 0 0 var1 6 533 585.34058 0.5646933 0 0 var1 7 574 693.14526 0.5689683 0 0 var1 8 564 796.18365 0.6186769 0 0 var1 9 589 903.14650 0.6471479 0 0 var1 10 543 1011.29177 0.6915705 0 0 var1 11 500 1117.86235 0.7033984 0 0 var1 12 477 1221.32810 0.6038770 0 0 var1 13 452 1329.16407 0.6517158 0 0 var1 14 457 1437.25620 0.5665318 0 0 var1 15 415 1543.20248 0.5748227 0 0 var1 > > ind=seq(1,155,2) > var1= meuse[ind,] > var2= meuse[-ind,] > g <- gstat(NULL, id = "lead", form = lead ~ 1, data=var1) > g <- gstat(g, id = "zinc", form = zinc ~ 1, data=var2) > v.cross <- variogram(g) > plot(v.cross) > > > proc.time() user system elapsed 1.528 0.076 1.612 gstat/tests/sim.Rout.save0000644000176200001440000000352414646417261015155 0ustar liggesusers R version 3.6.0 (2019-04-26) -- "Planting of a Tree" Copyright (C) 2019 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > options(digits=6) > library(sp) > data(meuse) > set.seed(158229572) > new.locs <- data.frame(x = c(181170, 180310, 180205, 178673, 178770, 178270), + y = c(333250, 332189, 331707, 330066, 330675, 331075)) > library(gstat) > krige(zinc ~ 1, ~ x + y, meuse, newdata = new.locs, + model = vgm(1.34e5, "Sph", 800, nug = 2.42e4), + block = c(40,40), nmax = 40, nsim = 10) drawing 10 GLS realisations of beta... [using conditional Gaussian simulation] x y sim1 sim2 sim3 sim4 sim5 sim6 sim7 1 181170 333250 267.385 27.5686 428.144 381.576 151.119 175.890 293.273 2 180310 332189 429.437 659.6579 564.023 611.666 612.756 619.791 771.961 3 180205 331707 205.978 412.7276 271.827 380.349 169.488 369.822 266.026 4 178673 330066 117.479 684.0663 399.148 585.096 606.396 867.866 807.634 5 178770 330675 780.072 837.4628 682.690 911.052 600.984 783.019 749.476 6 178270 331075 1025.778 1582.0269 614.235 332.377 660.228 589.447 972.018 sim8 sim9 sim10 1 294.107 113.347 279.991 2 776.498 724.160 901.692 3 338.021 630.244 140.272 4 127.301 957.242 444.007 5 533.773 748.144 623.960 6 1084.170 537.604 -214.972 > > proc.time() user system elapsed 0.467 0.020 0.479 gstat/tests/unproj.Rout.save0000644000176200001440000000720014646417261015675 0ustar liggesusers R version 4.3.3 (2024-02-29) -- "Angel Food Cake" Copyright (C) 2024 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # DOI 10.1007/s11004-011-9344-7 > # http://mypage.iu.edu/~srobeson/Pubs/variogram_sphere_mathgeo_2011.pdf > > suppressPackageStartupMessages(library(sp)) > library(gstat) > > if (require(sp, quietly = TRUE) && + suppressPackageStartupMessages(require(fields, quietly = TRUE)) && + suppressPackageStartupMessages(require(sf, quietly = TRUE))) { + data(meuse) + coordinates(meuse) = ~x+y + proj4string(meuse) = CRS("+init=epsg:28992") + ll = "+proj=longlat +ellps=WGS84" + # meuse.ll = spTransform(meuse, CRS("+proj=longlat +ellps=WGS84")) + meuse.ll = as(st_transform(sf::st_as_sf(meuse), sf::st_crs(ll)), "Spatial") + meuse.ll[1:10,] + variogram(log(zinc)~1, meuse.ll) + + cloud1 = variogram(log(zinc)~1, meuse, cloud=T, cutoff=6000) + cloud2 = variogram(log(zinc)~1, meuse.ll, cloud=T, cutoff=6) + + plot(cloud1$dist/1000, cloud2$dist, xlab="Amersfoort, km", ylab = "Long/lat") + abline(0,1) + + data(ozone2) + oz = SpatialPointsDataFrame(ozone2$lon.lat, + data.frame(t(ozone2$y)), + proj4string=CRS("+proj=longlat +ellps=WGS84")) + variogram(X870731~1,oz[!is.na(oz$X870731),]) + utm16 = "+proj=utm +zone=16" + # oz.utm = spTransform(oz, utm16) + oz.utm = as(sf::st_transform(sf::st_as_sf(oz), utm16) , "Spatial") + variogram(X870731~1,oz.utm[!is.na(oz$X870731),]) + + # Timothy Hilton, r-sig-geo, Sept 14, 2008: + + foo <- + structure(list(z = c(-1.95824831109744, -1.9158901643563, 4.22211761150161, + 3.23356929459598, 1.12038389231868, 0.34613850821113, 1.12589932643631, + 23.517912251617, 3.0519158690268, 3.20261431141517, -2.10947106854739 + ), lon = c(-125.29228, -82.1556, -98.524722, -99.948333, -104.691741, + -79.420833, -105.100533, -88.291867, -72.171478, -121.556944, + -89.34765), lat = c(49.87217, 48.2167, 55.905833, 56.635833, + 53.916264, 39.063333, 48.307883, 40.0061, 42.537756, 44.448889, + 46.242017)), .Names = c("z", "lon", "lat"), row.names = c(NA, + -11L), class = "data.frame") + + coordinates(foo) <- ~lon+lat + + proj4string(foo) <- CRS('+proj=longlat +ellps=WGS84') + + vg.foo <- variogram(z~1, foo, cloud=TRUE, cutoff=1e10) + + cat('==========\nvariogram:\n') + print(head(vg.foo)) + + cat('==========\nspDistsN1 Distances:\n') + print(spDistsN1(coordinates(foo), coordinates(foo)[1,], longlat=TRUE)) + } ========== variogram: dist gamma dir.hor dir.ver id left right 1 3115.1190 8.971063e-04 0 0 var1 2 1 2 1908.0468 1.909846e+01 0 0 var1 3 1 3 1405.6211 1.883757e+01 0 0 var1 3 2 4 1837.5667 1.347749e+01 0 0 var1 4 1 5 1522.8765 1.325847e+01 0 0 var1 4 2 6 119.9386 4.886139e-01 0 0 var1 4 3 ========== spDistsN1 Distances: [1] 0.0000 3115.1190 1908.0468 1837.5667 1481.6293 3775.6751 1480.4477 [8] 3081.7541 4090.4022 665.9348 2683.1516 Warning message: In CPL_crs_from_input(x) : GDAL Message 1: +init=epsg:XXXX syntax is deprecated. It might return a CRS with a non-EPSG compliant axis order. > > proc.time() user system elapsed 1.466 1.314 1.282 gstat/tests/blockkr.Rout.save0000644000176200001440000000513714646417261016016 0ustar liggesusers R version 3.0.1 (2013-05-16) -- "Good Sport" Copyright (C) 2013 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(sp) > data(meuse) > coordinates(meuse) = c("x", "y") > new.locs <- SpatialPoints(data.frame( + x = c(181170, 180310, 180205, 178673, 178770, 178270), + y = c(333250, 332189, 331707, 330066, 330675, 331075))) > library(gstat) > krige(zinc ~ 1, meuse, new.locs, vgm(1.34e5, "Sph", 800, nug = 2.42e4), + block = c(40,40), nmax = 40) [using ordinary kriging] coordinates var1.pred var1.var 1 (181170, 333250) 268.7576 19447.67 2 (180310, 332189) 663.4915 16991.33 3 (180205, 331707) 251.4606 21579.71 4 (178673, 330066) 532.5776 73807.91 5 (178770, 330675) 664.4039 23589.17 6 (178270, 331075) 565.5436 155113.23 > > new.locs <- SpatialPoints(data.frame(x = c(181170), y = c(333250))) > > disc = c(-15,-5,5,15) > block.irreg <- data.frame(expand.grid(x = disc, y = disc)) > block.irreg x y 1 -15 -15 2 -5 -15 3 5 -15 4 15 -15 5 -15 -5 6 -5 -5 7 5 -5 8 15 -5 9 -15 5 10 -5 5 11 5 5 12 15 5 13 -15 15 14 -5 15 15 5 15 16 15 15 > > # first disable default Gaussian quadrature used for block integration, by > # setting nblockdiscr explicitly: > krige(zinc ~ 1, meuse, new.locs, model = vgm(1.34e5, "Sph", 800, nug = 2.42e4), + block = c(40,40), nmax = 40, set = list(nblockdiscr=4)) [using ordinary kriging] coordinates var1.pred var1.var 1 (181170, 333250) 268.7324 19568.76 > # now pass the same block discretization as block.irreg: > krige(zinc ~ 1, meuse, new.locs, vgm(1.34e5, "Sph", 800, nug = 2.42e4), + block = block.irreg, nmax = 40) [using ordinary kriging] coordinates var1.pred var1.var 1 (181170, 333250) 268.7324 19568.76 > # check weights argument: > block.irreg <- data.frame(expand.grid(x = disc, y = disc), weights = rep(1/16, 16)) > krige(zinc ~ 1, meuse, new.locs, vgm(1.34e5, "Sph", 800, nug = 2.42e4), + block = block.irreg, nmax = 40) [using ordinary kriging] coordinates var1.pred var1.var 1 (181170, 333250) 268.7324 19568.76 > > proc.time() user system elapsed 1.080 0.056 1.139 gstat/tests/line.Rout.save0000644000176200001440000001066514646417261015320 0ustar liggesusers R version 4.2.3 (2023-03-15) -- "Shortstop Beagle" Copyright (C) 2023 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > options(digits=5) > library(sp) > data(meuse.grid) > gridded(meuse.grid) = ~x+y > data(meuse) > coordinates(meuse) = ~x+y > > # choose arbitrary line over the grid: > image(meuse.grid["dist"],axes=T) > pp = rbind(c(180000,331000),c(180000,332000),c(181000,333500)) > Sl = SpatialLines(list(Lines(list(Line(pp)), "a"))) > plot(Sl,add=T,col='green') > > # use the default spsample arguments of predict.gstat: > pts=spsample(Sl,n=500,'regular',offset=c(.5,.5)) > plot(pts, pch=3, cex=.2, add=T) > > library(gstat) > v = vgm(.6, "Sph", 900, .06) > out1 = krige(log(zinc)~1, meuse, Sl, v) [using ordinary kriging] > out1 An object of class "SpatialLinesDataFrame" Slot "data": x y var1.pred var1.var a 180333 332167 6.1618 0.008025 Slot "lines": [[1]] An object of class "Lines" Slot "Lines": [[1]] An object of class "Line" Slot "coords": [,1] [,2] [1,] 180000 331000 [2,] 180000 332000 [3,] 181000 333500 Slot "ID": [1] "a" Slot "bbox": min max x 180000 181000 y 331000 333500 Slot "proj4string": Coordinate Reference System: Deprecated Proj.4 representation: NA > > points(180333,332167,pch=3,cex=2) > > # use the same line as block discretization, and predict for (0,0) > # (because the block discretizing points are not centered) > out2 = krige(log(zinc)~1, meuse, SpatialPoints(matrix(0,1,2)), v, block=coordinates(pts)) [using ordinary kriging] > out2 coordinates var1.pred var1.var 1 (0, 0) 6.1618 0.008025 > > compare.krigingLines = function(formula, data, newdata, model) { + out1 = krige(formula, data, newdata, model) + pts = spsample(newdata, n=500, 'regular', offset=.5) + out2 = krige(formula, data, SpatialPoints(matrix(0,1,2)), model, block = coordinates(pts)) + print("difference:") + as.data.frame(out1)[3:4]- as.data.frame(out2)[3:4] + } > > compare.krigingLines(log(zinc)~1, meuse, Sl, v) [using ordinary kriging] [using ordinary kriging] [1] "difference:" var1.pred var1.var a 0 0 > > # one line, consisting of two line segments: > pp2 = rbind(c(181000,333500),c(181000,332500)) > Sl2 = SpatialLines(list(Lines(list(Line(pp),Line(pp2)), "a"))) > krige(log(zinc)~1, meuse, Sl2, v) [using ordinary kriging] An object of class "SpatialLinesDataFrame" Slot "data": x y var1.pred var1.var a 180667 332583 6.0424 0.0053191 Slot "lines": [[1]] An object of class "Lines" Slot "Lines": [[1]] An object of class "Line" Slot "coords": [,1] [,2] [1,] 180000 331000 [2,] 180000 332000 [3,] 181000 333500 [[2]] An object of class "Line" Slot "coords": [,1] [,2] [1,] 181000 333500 [2,] 181000 332500 Slot "ID": [1] "a" Slot "bbox": min max x 180000 181000 y 331000 333500 Slot "proj4string": Coordinate Reference System: Deprecated Proj.4 representation: NA > compare.krigingLines(log(zinc)~1, meuse, Sl2, v) [using ordinary kriging] [using ordinary kriging] [1] "difference:" var1.pred var1.var a 0 0 > > # two seperate line segments: > Sl3 = SpatialLines(list(Lines(list(Line(pp)), "a"),Lines(list(Line(pp2)),"b"))) > krige(log(zinc)~1, meuse, Sl3, v) [using ordinary kriging] An object of class "SpatialLinesDataFrame" Slot "data": x y var1.pred var1.var a 180333 332167 6.1618 0.008025 b 181000 333000 5.7060 0.011043 Slot "lines": [[1]] An object of class "Lines" Slot "Lines": [[1]] An object of class "Line" Slot "coords": [,1] [,2] [1,] 180000 331000 [2,] 180000 332000 [3,] 181000 333500 Slot "ID": [1] "a" [[2]] An object of class "Lines" Slot "Lines": [[1]] An object of class "Line" Slot "coords": [,1] [,2] [1,] 181000 333500 [2,] 181000 332500 Slot "ID": [1] "b" Slot "bbox": min max x 180000 181000 y 331000 333500 Slot "proj4string": Coordinate Reference System: Deprecated Proj.4 representation: NA > > proc.time() user system elapsed 1.703 2.198 1.248 gstat/tests/line.R0000644000176200001440000000305114646417261013622 0ustar liggesusersoptions(digits=5) library(sp) data(meuse.grid) gridded(meuse.grid) = ~x+y data(meuse) coordinates(meuse) = ~x+y # choose arbitrary line over the grid: image(meuse.grid["dist"],axes=T) pp = rbind(c(180000,331000),c(180000,332000),c(181000,333500)) Sl = SpatialLines(list(Lines(list(Line(pp)), "a"))) plot(Sl,add=T,col='green') # use the default spsample arguments of predict.gstat: pts=spsample(Sl,n=500,'regular',offset=c(.5,.5)) plot(pts, pch=3, cex=.2, add=T) library(gstat) v = vgm(.6, "Sph", 900, .06) out1 = krige(log(zinc)~1, meuse, Sl, v) out1 points(180333,332167,pch=3,cex=2) # use the same line as block discretization, and predict for (0,0) # (because the block discretizing points are not centered) out2 = krige(log(zinc)~1, meuse, SpatialPoints(matrix(0,1,2)), v, block=coordinates(pts)) out2 compare.krigingLines = function(formula, data, newdata, model) { out1 = krige(formula, data, newdata, model) pts = spsample(newdata, n=500, 'regular', offset=.5) out2 = krige(formula, data, SpatialPoints(matrix(0,1,2)), model, block = coordinates(pts)) print("difference:") as.data.frame(out1)[3:4]- as.data.frame(out2)[3:4] } compare.krigingLines(log(zinc)~1, meuse, Sl, v) # one line, consisting of two line segments: pp2 = rbind(c(181000,333500),c(181000,332500)) Sl2 = SpatialLines(list(Lines(list(Line(pp),Line(pp2)), "a"))) krige(log(zinc)~1, meuse, Sl2, v) compare.krigingLines(log(zinc)~1, meuse, Sl2, v) # two seperate line segments: Sl3 = SpatialLines(list(Lines(list(Line(pp)), "a"),Lines(list(Line(pp2)),"b"))) krige(log(zinc)~1, meuse, Sl3, v) gstat/tests/rings.R0000644000176200001440000000624414646417261014024 0ustar liggesuserslibrary(sp) library(gstat) set.seed(13331) x = runif(10) y = runif(10) z = rnorm(10) d = data.frame(x=x,y=y,z=z) bl = c(1,1) nd = data.frame(x=.5, y=.5) # single block: library(sp) coordinates(d) = ~x+y nd = SpatialPoints(nd) xx = krige(z~1, d, nd, model=vgm(1, "Exp", 1), block = bl, set = list(nb=4)) ring = cbind(c(0,bl[1],bl[1],0,0), c(0,0,bl[2],bl[2],0)) r1 = SpatialPolygons(list(Polygons(list(Polygon(ring)), ID = "xx"))) a = data.frame(a = 1, b = 2) rownames(a) = "xx" r1df = SpatialPolygonsDataFrame(r1, a) g = gstat(formula=z~1, data=d, model=vgm(1, "Exp", 1)) args = list(type = "regular", n=16, offset=c(0.5,0.5)) yy = predict(g, r1df, block = bl, sps.args = args) xx = as.data.frame(xx) yy = as.data.frame(yy) row.names(xx) = row.names(yy) print(all.equal(xx,yy)) ## multiple blocks of equal size: nd = data.frame(x= 0:4 + .5, y=rep(.5,5)) nd = SpatialPoints(nd) xx = krige(z~1, d, nd, model=vgm(1, "Exp", 1), block = bl, set = list(nb=4)) ring0 = cbind(c(0,bl[1],bl[1],0,0), c(0,0,bl[2],bl[2],0)) ring1 = cbind(c(1+0,1+bl[1],1+bl[1],1+0,1+0), c(0,0,bl[2],bl[2],0)) ring2 = cbind(c(2+0,2+bl[1],2+bl[1],2+0,2+0), c(0,0,bl[2],bl[2],0)) ring3 = cbind(c(3+0,3+bl[1],3+bl[1],3+0,3+0), c(0,0,bl[2],bl[2],0)) ring4 = cbind(c(4+0,4+bl[1],4+bl[1],4+0,4+0), c(0,0,bl[2],bl[2],0)) r1 = SpatialPolygons(list( Polygons(list(Polygon(ring0)), ID = "x0"), Polygons(list(Polygon(ring1)), ID = "x1"), Polygons(list(Polygon(ring2)), ID = "x2"), Polygons(list(Polygon(ring3)), ID = "x3"), Polygons(list(Polygon(ring4)), ID = "x4") )) df = data.frame(a=rep(1,5), b= rep(1,5)) rownames(df) = c("x0", "x1", "x2", "x3", "x4") r1df = SpatialPolygonsDataFrame(r1, df) yy = predict(g, r1, block = bl, sps.args = args) xx = as.data.frame(xx) yy = as.data.frame(yy) row.names(xx) = row.names(yy) all.equal(xx, yy) ## multiple blocks of equal size: args = list(type = "regular", cellsize=.25, offset=c(0.5,0.5), n=16) yy = predict(g, r1, block = bl, sps.args = args) xx = as.data.frame(xx) yy = as.data.frame(yy) row.names(xx) = row.names(yy) print(all.equal(xx, yy)) ## multiple blocks of varying size: nd = data.frame(x=c(0.5, 2, 4.5), y=c(0.5, 1, 1.5)) nd = SpatialPoints(nd) bl = c(1,1) ring0 = cbind(c(0,bl[1],bl[1],0,0), c(0,0,bl[2],bl[2],0)) xx1 = krige(z~1, d, nd[1], model=vgm(1, "Exp", 1), block = bl, set = list(nb=4)) bl = c(2,2) ring1 = cbind(c(1+0,1+bl[1],1+bl[1],1+0,1+0), c(0,0,bl[2],bl[2],0)) xx2 = krige(z~1, d, nd[2], model=vgm(1, "Exp", 1), block = bl, set = list(nb=4)) bl = c(3,3) ring2 = cbind(c(3+0,3+bl[1],3+bl[1],3+0,3+0), c(0,0,bl[2],bl[2],0)) xx3 = krige(z~1, d, nd[3], model=vgm(1, "Exp", 1), block = bl, set = list(nb=4)) r1 = SpatialPolygons(list( Polygons(list(Polygon(ring0)), ID = "x0"), Polygons(list(Polygon(ring1)), ID = "x1"), Polygons(list(Polygon(ring2)), ID = "x2") )) df = data.frame(a = rep(1,3), b = rep(1,3)) rownames(df) = c("x0", "x1", "x2") r1df = SpatialPolygonsDataFrame(r1, df) args = list(type = "regular", n=16, offset=c(0.5,0.5)) yy = predict(g, r1df, block = bl, sps.args = args) xx = rbind(as.data.frame(xx1), as.data.frame(xx2), as.data.frame(xx3)) row.names(xx) = 1:3 xx = as.data.frame(xx) yy = as.data.frame(yy) row.names(xx) = row.names(yy) print(all.equal(xx, yy)) gstat/tests/allier.Rout.save0000644000176200001440000003040414646417261015632 0ustar liggesusers R version 4.2.0 (2022-04-22) -- "Vigorous Calisthenics" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # Sytze de Bruin's post to r-sig-geo, Nov 16, 2015: > library(sp) > library(gstat) > > # some data > x <- c(215, 330, 410, 470, 545) > y <- c(230, 310, 330, 340, 365) > fc <- c(0.211, 0.251, 0.281, 0.262, 0.242) > por <- c(0.438, 0.457, 0.419, 0.430, 0.468) > Allier <- data.frame(x, y, fc, por) > coordinates(Allier) = ~x+y > > # gstat object for co-kriging using linear model of co-regionalization > g <- gstat(id=c("fc"), formula=fc~1, data=Allier, + model=vgm(0.00247, "Sph", 480, 0.00166)) > g <- gstat(g, id="por", formula=por~1, data=Allier, + model=vgm(0.00239, "Sph", 480, 0.00118)) > g <- gstat(g, id=c("fc", "por"), + model=vgm(0.00151, "Sph", 480, -0.00124)) > > # predict at single point > g$set = list(choleski = 0) # LDL' > A <- predict(g, SpatialPoints(data.frame(x=450, y=350)), debug = 32) Linear Model of Coregionalization found. Good. [using ordinary cokriging] we're at location X: 450 Y: 350 Z: 0 zero block size we're at point X: 450 Y: 350 Z: 0 # X: #Matrix: 10 by 2 rbind( c( 1.000000, 0.000000), # row 1 c( 1.000000, 0.000000), # row 2 c( 1.000000, 0.000000), # row 3 c( 1.000000, 0.000000), # row 4 c( 1.000000, 0.000000), # row 5 c( 0.000000, 1.000000), # row 6 c( 0.000000, 1.000000), # row 7 c( 0.000000, 1.000000), # row 8 c( 0.000000, 1.000000), # row 9 c( 0.000000, 1.000000) # row 10 ) [using generalized covariances: max_val - semivariance()] # Covariances (x_i, x_j) matrix C (upper triangle): #Matrix: 10 by 10 rbind( c( 0.004130, 0.001419, 0.000896, 0.000566, 0.000224, 0.000270, 0.000868, 0.000548, 0.000346, 0.000137), # row 1 c( 0.001419, 0.004130, 0.001840, 0.001398, 0.000879, 0.000868, 0.000270, 0.001125, 0.000854, 0.000537), # row 2 c( 0.000896, 0.001840, 0.004130, 0.002003, 0.001424, 0.000548, 0.001125, 0.000270, 0.001225, 0.000870), # row 3 c( 0.000566, 0.001398, 0.002003, 0.004130, 0.001865, 0.000346, 0.000854, 0.001225, 0.000270, 0.001140), # row 4 c( 0.000224, 0.000879, 0.001424, 0.001865, 0.004130, 0.000137, 0.000537, 0.000870, 0.001140, 0.000270), # row 5 c( 0.000270, 0.000868, 0.000548, 0.000346, 0.000137, 0.003570, 0.001373, 0.000867, 0.000547, 0.000217), # row 6 c( 0.000868, 0.000270, 0.001125, 0.000854, 0.000537, 0.001373, 0.003570, 0.001780, 0.001352, 0.000851), # row 7 c( 0.000548, 0.001125, 0.000270, 0.001225, 0.000870, 0.000867, 0.001780, 0.003570, 0.001938, 0.001378), # row 8 c( 0.000346, 0.000854, 0.001225, 0.000270, 0.001140, 0.000547, 0.001352, 0.001938, 0.003570, 0.001805), # row 9 c( 0.000137, 0.000537, 0.000870, 0.001140, 0.000270, 0.000217, 0.000851, 0.001378, 0.001805, 0.003570) # row 10 ) # glm->C, LDL' decomposed:: #Matrix: 10 by 10 rbind( c( 0.003399, 0.372269, 0.208612, 0.127967, 0.016746, -0.025847, 0.223862, 0.148767, 0.104047, 0.038371), # row 1 c( 0.000000, 0.002661, 0.483725, 0.327484, 0.153742, 0.233021, -0.125118, 0.262410, 0.219271, 0.150536), # row 2 c( 0.000000, 0.000000, 0.002276, 0.540203, 0.303585, 0.058071, 0.314376, -0.175899, 0.295181, 0.243817), # row 3 c( 0.000000, 0.000000, 0.000000, 0.002484, 0.483068, 0.000301, 0.115816, 0.377362, -0.115338, 0.319418), # row 4 c( 0.000000, 0.000000, 0.000000, 0.000000, 0.003690, -0.038142, 0.000474, 0.120915, 0.377730, 0.075630), # row 5 c( 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.003019, 0.354325, 0.235465, 0.164684, 0.060733), # row 6 c( 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.002623, 0.415337, 0.347059, 0.238266), # row 7 c( 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.002458, 0.467207, 0.385909), # row 8 c( 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.002658, 0.505569), # row 9 c( 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.003570) # row 10 ) # X'C-1 X: #Matrix: 2 by 2 rbind( c(665.433994, -232.313340), # row 1 c(-232.313340, 729.440848) # row 2 ) # beta: #Vector: dim: 2 c( 0.244216, 0.440933) # Cov(beta), (X'C-1 X)-1: #Matrix: 2 by 2 rbind( c( 0.001691, 0.000538), # row 1 c( 0.000538, 0.001542) # row 2 ) # Corr(beta): #Matrix: 2 by 2 rbind( c( 1.000000, 0.333447), # row 1 c( 0.333447, 1.000000) # row 2 ) # X0 (X values at prediction location x0): #Matrix: 2 by 2 rbind( c( 1.000000, 0.000000), # row 1 c( 0.000000, 1.000000) # row 2 ) # BLUE(mu), E(y(x0)) = X0'beta: #Vector: dim: 2 c( 0.244216, 0.440933) # Covariances (x_i, x_0), C0: #Matrix: 10 by 2 rbind( c( 0.000638, 0.000390), # row 1 c( 0.001516, 0.000927), # row 2 c( 0.002126, 0.001300), # row 3 c( 0.002298, 0.001405), # row 4 c( 0.001738, 0.001062), # row 5 c( 0.000390, 0.000618), # row 6 c( 0.000927, 0.001467), # row 7 c( 0.001300, 0.002057), # row 8 c( 0.001405, 0.002223), # row 9 c( 0.001062, 0.001681) # row 10 ) # C-1 C0: #Matrix: 10 by 2 rbind( c( 0.008927, -0.017995), # row 1 c( 0.061935, -0.028550), # row 2 c( 0.225195, 0.078344), # row 3 c( 0.356735, 0.190177), # row 4 c( 0.094128, -0.023136), # row 5 c(-0.021119, 0.004935), # row 6 c(-0.033508, 0.055601), # row 7 c( 0.091947, 0.242576), # row 8 c( 0.223200, 0.398927), # row 9 c(-0.027153, 0.088995) # row 10 ) # [a] Cov_ij(B,B) or Cov_ij(0,0): #Matrix: 2 by 2 rbind( c( 0.004130, 0.000270), # row 1 c( 0.000270, 0.003570) # row 2 ) # [c] (x0-X'C-1 c0)'(X'C-1 X)-1(x0-X'C-1 c0): #Matrix: 2 by 2 rbind( c( 0.000129, -0.000107), # row 1 c(-0.000107, 0.000089) # row 2 ) # [b] c0'C-1 c0: #Matrix: 2 by 2 rbind( c( 0.001926, 0.001532), # row 1 c( 0.001532, 0.001931) # row 2 ) # Best Linear Unbiased Predictor: #Vector: dim: 2 c( 0.253090, 0.441258) # MSPE ([a]-[b]+[c]): #Matrix: 2 by 2 rbind( c( 0.002332, -0.001369), # row 1 c(-0.001369, 0.001729) # row 2 ) # kriging weights: #Matrix: 10 by 2 rbind( c( 0.071177, -0.064988), # row 1 c( 0.108451, -0.066123), # row 2 c( 0.268160, 0.043141), # row 3 c( 0.401959, 0.153312), # row 4 c( 0.150253, -0.065342), # row 5 c(-0.076273, 0.056759), # row 6 c(-0.077605, 0.093781), # row 7 c( 0.050632, 0.277731), # row 8 c( 0.179933, 0.435972), # row 9 c(-0.076688, 0.135756) # row 10 ) > g$set = list(choleski = 1) # Choleski > B <- predict(g, SpatialPoints(data.frame(x=450, y=350)), debug = 32) Linear Model of Coregionalization found. Good. [using ordinary cokriging] we're at location X: 450 Y: 350 Z: 0 zero block size we're at point X: 450 Y: 350 Z: 0 # X: #Matrix: 10 by 2 rbind( c( 1.000000, 0.000000), # row 1 c( 1.000000, 0.000000), # row 2 c( 1.000000, 0.000000), # row 3 c( 1.000000, 0.000000), # row 4 c( 1.000000, 0.000000), # row 5 c( 0.000000, 1.000000), # row 6 c( 0.000000, 1.000000), # row 7 c( 0.000000, 1.000000), # row 8 c( 0.000000, 1.000000), # row 9 c( 0.000000, 1.000000) # row 10 ) [using generalized covariances: max_val - semivariance()] # Covariances (x_i, x_j) matrix C (upper triangle): #Matrix: 10 by 10 rbind( c( 0.004130, 0.001419, 0.000896, 0.000566, 0.000224, 0.000270, 0.000868, 0.000548, 0.000346, 0.000137), # row 1 c( 0.001419, 0.004130, 0.001840, 0.001398, 0.000879, 0.000868, 0.000270, 0.001125, 0.000854, 0.000537), # row 2 c( 0.000896, 0.001840, 0.004130, 0.002003, 0.001424, 0.000548, 0.001125, 0.000270, 0.001225, 0.000870), # row 3 c( 0.000566, 0.001398, 0.002003, 0.004130, 0.001865, 0.000346, 0.000854, 0.001225, 0.000270, 0.001140), # row 4 c( 0.000224, 0.000879, 0.001424, 0.001865, 0.004130, 0.000137, 0.000537, 0.000870, 0.001140, 0.000270), # row 5 c( 0.000270, 0.000868, 0.000548, 0.000346, 0.000137, 0.003570, 0.001373, 0.000867, 0.000547, 0.000217), # row 6 c( 0.000868, 0.000270, 0.001125, 0.000854, 0.000537, 0.001373, 0.003570, 0.001780, 0.001352, 0.000851), # row 7 c( 0.000548, 0.001125, 0.000270, 0.001225, 0.000870, 0.000867, 0.001780, 0.003570, 0.001938, 0.001378), # row 8 c( 0.000346, 0.000854, 0.001225, 0.000270, 0.001140, 0.000547, 0.001352, 0.001938, 0.003570, 0.001805), # row 9 c( 0.000137, 0.000537, 0.000870, 0.001140, 0.000270, 0.000217, 0.000851, 0.001378, 0.001805, 0.003570) # row 10 ) # glm->C, Choleski decomposed:: #Matrix: 10 by 10 rbind( c( 0.064265, 0.022086, 0.013942, 0.008801, 0.003487, 0.004201, 0.013502, 0.008523, 0.005380, 0.002132), # row 1 c( 0.000000, 0.060351, 0.025382, 0.019938, 0.013290, 0.012840, -0.000468, 0.015517, 0.012189, 0.008125), # row 2 c( 0.000000, 0.000000, 0.057370, 0.023954, 0.018091, 0.002846, 0.016530, -0.004230, 0.014644, 0.011059), # row 3 c( 0.000000, 0.000000, 0.000000, 0.055509, 0.020471, -0.000277, 0.006286, 0.016960, -0.006686, 0.012514), # row 4 c( 0.000000, 0.000000, 0.000000, 0.000000, 0.056523, -0.001665, 0.001218, 0.006437, 0.014711, -0.005337), # row 5 c( 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.058108, 0.022018, 0.011347, 0.006008, 0.001147), # row 6 c( 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.050877, 0.027084, 0.018381, 0.010720), # row 7 c( 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.045247, 0.026914, 0.017658), # row 8 c( 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.042645, 0.023811), # row 9 c( 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.046872) # row 10 ) # X'C-1 X: #Matrix: 2 by 2 rbind( c(665.433994, -232.313340), # row 1 c(-232.313340, 729.440848) # row 2 ) # beta: #Vector: dim: 2 c( 0.244216, 0.440933) # Cov(beta), (X'C-1 X)-1: #Matrix: 2 by 2 rbind( c( 0.001691, 0.000538), # row 1 c( 0.000538, 0.001542) # row 2 ) # Corr(beta): #Matrix: 2 by 2 rbind( c( 1.000000, 0.333447), # row 1 c( 0.333447, 1.000000) # row 2 ) # X0 (X values at prediction location x0): #Matrix: 2 by 2 rbind( c( 1.000000, 0.000000), # row 1 c( 0.000000, 1.000000) # row 2 ) # BLUE(mu), E(y(x0)) = X0'beta: #Vector: dim: 2 c( 0.244216, 0.440933) # Covariances (x_i, x_0), C0: #Matrix: 10 by 2 rbind( c( 0.000638, 0.000390), # row 1 c( 0.001516, 0.000927), # row 2 c( 0.002126, 0.001300), # row 3 c( 0.002298, 0.001405), # row 4 c( 0.001738, 0.001062), # row 5 c( 0.000390, 0.000618), # row 6 c( 0.000927, 0.001467), # row 7 c( 0.001300, 0.002057), # row 8 c( 0.001405, 0.002223), # row 9 c( 0.001062, 0.001681) # row 10 ) # C-1 C0: #Matrix: 10 by 2 rbind( c( 0.008927, -0.017995), # row 1 c( 0.061935, -0.028550), # row 2 c( 0.225195, 0.078344), # row 3 c( 0.356735, 0.190177), # row 4 c( 0.094128, -0.023136), # row 5 c(-0.021119, 0.004935), # row 6 c(-0.033508, 0.055601), # row 7 c( 0.091947, 0.242576), # row 8 c( 0.223200, 0.398927), # row 9 c(-0.027153, 0.088995) # row 10 ) # [a] Cov_ij(B,B) or Cov_ij(0,0): #Matrix: 2 by 2 rbind( c( 0.004130, 0.000270), # row 1 c( 0.000270, 0.003570) # row 2 ) # [c] (x0-X'C-1 c0)'(X'C-1 X)-1(x0-X'C-1 c0): #Matrix: 2 by 2 rbind( c( 0.000129, -0.000107), # row 1 c(-0.000107, 0.000089) # row 2 ) # [b] c0'C-1 c0: #Matrix: 2 by 2 rbind( c( 0.001926, 0.001532), # row 1 c( 0.001532, 0.001931) # row 2 ) # Best Linear Unbiased Predictor: #Vector: dim: 2 c( 0.253090, 0.441258) # MSPE ([a]-[b]+[c]): #Matrix: 2 by 2 rbind( c( 0.002332, -0.001369), # row 1 c(-0.001369, 0.001729) # row 2 ) # kriging weights: #Matrix: 10 by 2 rbind( c( 0.071177, -0.064988), # row 1 c( 0.108451, -0.066123), # row 2 c( 0.268160, 0.043141), # row 3 c( 0.401959, 0.153312), # row 4 c( 0.150253, -0.065342), # row 5 c(-0.076273, 0.056759), # row 6 c(-0.077605, 0.093781), # row 7 c( 0.050632, 0.277731), # row 8 c( 0.179933, 0.435972), # row 9 c(-0.076688, 0.135756) # row 10 ) > all.equal(A,B) [1] TRUE > > # TRUE > > proc.time() user system elapsed 0.576 0.056 0.625 gstat/tests/fit.R0000644000176200001440000000034714646417261013462 0ustar liggesuserslibrary(sp) data(meuse) library(gstat) v=variogram(log(zinc)~1,~x+y,meuse,cutoff=500,wi=100) v$gamma=c(0.5,1,2,3,3) fit.variogram(v, vgm(1, "Sph", 300, 0),warn.if.neg=TRUE) fit.variogram(v, vgm(1, "Sph", 300, 0),warn.if.neg=FALSE) gstat/tests/krige0.Rout.save0000644000176200001440000000367514646417261015555 0ustar liggesusers R version 3.0.2 (2013-09-25) -- "Frisbee Sailing" Copyright (C) 2013 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # test -- load data: > library(sp) > data(meuse) > coordinates(meuse) = ~x+y > data(meuse.grid) > gridded(meuse.grid) = ~x+y > > library(gstat) > # test -- idw > meuse.grid$idw <- idw0(zinc~1, meuse, meuse.grid)[,1] > x <- idw(zinc~1, meuse, meuse.grid) [inverse distance weighted interpolation] > all.equal(x$var1.pred, meuse.grid$idw) [1] TRUE > spplot(meuse.grid["idw"],col.regions=bpy.colors()) > v = vgm(1, "Exp", 500) > # test sk: > x0 <- krige0(zinc~1, meuse, meuse.grid, v, beta = 500, computeVar = TRUE) > rownames(x0$pred)=NULL > x <- krige(zinc~1, meuse, meuse.grid, v, beta = 500) [using simple kriging] > all.equal(x$var1.pred, x0$pred[,1]) [1] TRUE > all.equal(x$var1.var, x0$var) [1] TRUE > # test ok: > x0 <- krige0(zinc~1, meuse, meuse.grid, v, computeVar = TRUE) > rownames(x0$pred)=NULL > names(x0$var)=NULL > x <- krige(zinc~1, meuse, meuse.grid, v) [using ordinary kriging] > all.equal(x$var1.pred, x0$pred[,1]) [1] TRUE > all.equal(x$var1.var, x0$var) [1] TRUE > # test uk: > x0 <- krige0(zinc~sqrt(dist), meuse, meuse.grid, v, computeVar = TRUE) > rownames(x0$pred)=NULL > names(x0$var)=NULL > x <- krige(zinc~sqrt(dist), meuse, meuse.grid, v) [using universal kriging] > all.equal(x$var1.pred, x0$pred[,1]) [1] TRUE > all.equal(x$var1.var, x0$var) [1] TRUE > > proc.time() user system elapsed 3.424 0.064 3.490 gstat/tests/rings.Rout.save0000644000176200001440000001044714646417261015511 0ustar liggesusers R version 3.0.1 (2013-05-16) -- "Good Sport" Copyright (C) 2013 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(sp) > library(gstat) > set.seed(13331) > > x = runif(10) > y = runif(10) > z = rnorm(10) > d = data.frame(x=x,y=y,z=z) > bl = c(1,1) > > nd = data.frame(x=.5, y=.5) > > # single block: > library(sp) > coordinates(d) = ~x+y > nd = SpatialPoints(nd) > xx = krige(z~1, d, nd, model=vgm(1, "Exp", 1), block = bl, + set = list(nb=4)) [using ordinary kriging] > > ring = cbind(c(0,bl[1],bl[1],0,0), c(0,0,bl[2],bl[2],0)) > r1 = SpatialPolygons(list(Polygons(list(Polygon(ring)), ID = "xx"))) > a = data.frame(a = 1, b = 2) > rownames(a) = "xx" > r1df = SpatialPolygonsDataFrame(r1, a) > > g = gstat(formula=z~1, data=d, model=vgm(1, "Exp", 1)) > args = list(type = "regular", n=16, offset=c(0.5,0.5)) > yy = predict(g, r1df, block = bl, sps.args = args) [using ordinary kriging] > > xx = as.data.frame(xx) > yy = as.data.frame(yy) > row.names(xx) = row.names(yy) > print(all.equal(xx,yy)) [1] TRUE > > ## multiple blocks of equal size: > nd = data.frame(x= 0:4 + .5, y=rep(.5,5)) > nd = SpatialPoints(nd) > xx = krige(z~1, d, nd, model=vgm(1, "Exp", 1), block = bl, + set = list(nb=4)) [using ordinary kriging] > ring0 = cbind(c(0,bl[1],bl[1],0,0), c(0,0,bl[2],bl[2],0)) > ring1 = cbind(c(1+0,1+bl[1],1+bl[1],1+0,1+0), c(0,0,bl[2],bl[2],0)) > ring2 = cbind(c(2+0,2+bl[1],2+bl[1],2+0,2+0), c(0,0,bl[2],bl[2],0)) > ring3 = cbind(c(3+0,3+bl[1],3+bl[1],3+0,3+0), c(0,0,bl[2],bl[2],0)) > ring4 = cbind(c(4+0,4+bl[1],4+bl[1],4+0,4+0), c(0,0,bl[2],bl[2],0)) > r1 = SpatialPolygons(list( + Polygons(list(Polygon(ring0)), ID = "x0"), + Polygons(list(Polygon(ring1)), ID = "x1"), + Polygons(list(Polygon(ring2)), ID = "x2"), + Polygons(list(Polygon(ring3)), ID = "x3"), + Polygons(list(Polygon(ring4)), ID = "x4") + )) > df = data.frame(a=rep(1,5), b= rep(1,5)) > rownames(df) = c("x0", "x1", "x2", "x3", "x4") > r1df = SpatialPolygonsDataFrame(r1, df) > > yy = predict(g, r1, block = bl, sps.args = args) [using ordinary kriging] > xx = as.data.frame(xx) > yy = as.data.frame(yy) > row.names(xx) = row.names(yy) > all.equal(xx, yy) [1] TRUE > > ## multiple blocks of equal size: > args = list(type = "regular", cellsize=.25, offset=c(0.5,0.5), n=16) > yy = predict(g, r1, block = bl, sps.args = args) [using ordinary kriging] > xx = as.data.frame(xx) > yy = as.data.frame(yy) > row.names(xx) = row.names(yy) > print(all.equal(xx, yy)) [1] TRUE > > ## multiple blocks of varying size: > nd = data.frame(x=c(0.5, 2, 4.5), y=c(0.5, 1, 1.5)) > nd = SpatialPoints(nd) > bl = c(1,1) > ring0 = cbind(c(0,bl[1],bl[1],0,0), c(0,0,bl[2],bl[2],0)) > xx1 = krige(z~1, d, nd[1], model=vgm(1, "Exp", 1), block = bl, + set = list(nb=4)) [using ordinary kriging] > bl = c(2,2) > ring1 = cbind(c(1+0,1+bl[1],1+bl[1],1+0,1+0), c(0,0,bl[2],bl[2],0)) > xx2 = krige(z~1, d, nd[2], model=vgm(1, "Exp", 1), block = bl, + set = list(nb=4)) [using ordinary kriging] > bl = c(3,3) > ring2 = cbind(c(3+0,3+bl[1],3+bl[1],3+0,3+0), c(0,0,bl[2],bl[2],0)) > xx3 = krige(z~1, d, nd[3], model=vgm(1, "Exp", 1), block = bl, + set = list(nb=4)) [using ordinary kriging] > r1 = SpatialPolygons(list( + Polygons(list(Polygon(ring0)), ID = "x0"), + Polygons(list(Polygon(ring1)), ID = "x1"), + Polygons(list(Polygon(ring2)), ID = "x2") + )) > df = data.frame(a = rep(1,3), b = rep(1,3)) > rownames(df) = c("x0", "x1", "x2") > r1df = SpatialPolygonsDataFrame(r1, df) > > args = list(type = "regular", n=16, offset=c(0.5,0.5)) > yy = predict(g, r1df, block = bl, sps.args = args) [using ordinary kriging] > xx = rbind(as.data.frame(xx1), as.data.frame(xx2), as.data.frame(xx3)) > row.names(xx) = 1:3 > xx = as.data.frame(xx) > yy = as.data.frame(yy) > row.names(xx) = row.names(yy) > print(all.equal(xx, yy)) [1] TRUE > > proc.time() user system elapsed 1.260 0.024 1.288 gstat/tests/vdist.Rout.save0000644000176200001440000000250214666251767015522 0ustar liggesusers R version 4.4.1 (2024-06-14) -- "Race for Your Life" Copyright (C) 2024 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(sp) > library(gstat) > > data(meuse) > coordinates(meuse) = ~x+y > data(meuse.grid) > gridded(meuse.grid) = ~x+y > > mg = meuse.grid > gridded(mg) = FALSE > mg= mg[1500,] > krige(log(zinc)~1,meuse,mg,vgm(1, "Exp", 300, anis=c(0,0.01)), + vdist=FALSE, maxdist=1000, nmax = 9) [using ordinary kriging] coordinates var1.pred var1.var 1500 (180260, 331300) 5.024413 1.114475 > > ## IGNORE_RDIFF_BEGIN > krige(log(zinc)~1,meuse,mg,vgm(1, "Exp", 300, anis=c(0,0.01)), + vdist=TRUE, maxdist=1000, nmax = 9) [using ordinary kriging] coordinates var1.pred var1.var 1500 (180260, 331300) 5.568531 1.112945 > ## IGNORE_RDIFF_END > > proc.time() user system elapsed 0.593 1.446 0.532 gstat/tests/vdist.R0000644000176200001440000000062514666251404014025 0ustar liggesuserslibrary(sp) library(gstat) data(meuse) coordinates(meuse) = ~x+y data(meuse.grid) gridded(meuse.grid) = ~x+y mg = meuse.grid gridded(mg) = FALSE mg= mg[1500,] krige(log(zinc)~1,meuse,mg,vgm(1, "Exp", 300, anis=c(0,0.01)), vdist=FALSE, maxdist=1000, nmax = 9) ## IGNORE_RDIFF_BEGIN krige(log(zinc)~1,meuse,mg,vgm(1, "Exp", 300, anis=c(0,0.01)), vdist=TRUE, maxdist=1000, nmax = 9) ## IGNORE_RDIFF_END gstat/tests/stars.R0000644000176200001440000000552214666137740014037 0ustar liggesusersSys.setenv(TZ = "UTC") # 0. using sp: suppressPackageStartupMessages(library(sp)) demo(meuse, ask = FALSE) suppressPackageStartupMessages(library(gstat)) v = variogram(log(zinc)~1, meuse) (v.fit = fit.variogram(v, vgm(1, "Sph", 900, 1))) k_sp = krige(log(zinc)~1, meuse[-(1:5),], meuse[1:5,], v.fit) k_sp_grd = krige(log(zinc)~1, meuse, meuse.grid, v.fit) # 1. using sf: suppressPackageStartupMessages(library(sf)) demo(meuse_sf, ask = FALSE, echo = FALSE) # reloads meuse as data.frame, so demo(meuse, ask = FALSE) v = variogram(log(zinc)~1, meuse_sf) (v.fit = fit.variogram(v, vgm(1, "Sph", 900, 1))) k_sf = krige(log(zinc)~1, meuse_sf[-(1:5),], meuse_sf[1:5,], v.fit) all.equal(k_sp, as(k_sf, "Spatial"), check.attributes = FALSE) all.equal(k_sp, as(k_sf, "Spatial"), check.attributes = TRUE) # 2. using stars for grid: suppressPackageStartupMessages(library(stars)) st = st_as_stars(meuse.grid) st_crs(st) # compare inputs: sp = as(st, "Spatial") fullgrid(meuse.grid) = TRUE all.equal(sp, meuse.grid["dist"], check.attributes = FALSE) all.equal(sp, meuse.grid["dist"], check.attributes = TRUE, use.names = FALSE) # kriging: st_crs(st) = st_crs(meuse_sf) = NA # GDAL roundtrip messes them up! k_st = if (Sys.getenv("USER") == "travis") { try(krige(log(zinc)~1, meuse_sf, st, v.fit)) } else { krige(log(zinc)~1, meuse_sf, st, v.fit) } k_st # handle factors, when going to stars? k_sp_grd$cls = cut(k_sp_grd$var1.pred, c(0, 5, 6, 7, 8, 9)) st_as_stars(k_sp_grd) if (require(raster, quietly = TRUE)) { print(st_as_stars(raster::stack(k_sp_grd))) # check print(all.equal(st_redimension(st_as_stars(k_sp_grd)), st_as_stars(raster::stack(k_sp_grd)), check.attributes=FALSE)) } suppressPackageStartupMessages(library(spacetime)) tm = as.POSIXct("2019-02-25 15:37:24 CET") n = 4 s = stars:::st_stars(list(foo = array(1:(n^3), rep(n,3))), stars:::create_dimensions(list( x = stars:::create_dimension(from = 1, to = n, offset = 10, delta = 0.5), y = stars:::create_dimension(from = 1, to = n, offset = 0, delta = -0.7), time = stars:::create_dimension(values = tm + 1:n)), raster = stars:::get_raster(dimensions = c("x", "y"))) ) s as.data.frame(s) plot(s, col = sf.colors(), axes = TRUE) (s.stfdf = as(s, "STFDF")) stplot(s.stfdf, scales = list(draw = TRUE)) (s2 = st_as_stars(s.stfdf)) plot(s2, col = sf.colors(), axes = TRUE) all.equal(s, s2, check.attributes = FALSE) # multiple simulations: data(meuse, package = "sp") data(meuse.grid, package = "sp") coordinates(meuse.grid) <- ~x+y gridded(meuse.grid) <- TRUE meuse.grid = st_as_stars(meuse.grid) meuse_sf = st_as_sf(meuse, coords = c("x", "y")) g = gstat(NULL, "zinc", zinc~1, meuse_sf, model = vgm(1, "Exp", 300), nmax = 10) g = gstat(g, "lead", lead~1, meuse_sf, model = vgm(1, "Exp", 300), nmax = 10, fill.cross = TRUE) set.seed(123) ## IGNORE_RDIFF_BEGIN (p = predict(g, meuse.grid, nsim = 5)) ## IGNORE_RDIFF_END gstat/tests/cv.Rout.save0000644000176200001440000001115714750415310014763 0ustar liggesusers R Under development (unstable) (2025-02-03 r87683 ucrt) -- "Unsuffered Consequences" Copyright (C) 2025 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # try bivariate cokriging; cross validate first variable > library(sp) > data(meuse) > library(gstat) > g=gstat(NULL, "log-zinc", log(zinc)~1, ~x+y, meuse, nmax=10) > g=gstat(g, "log-lead", log(lead)~1, ~x+y, meuse, nmax=10) > g=gstat(g, "log-copper", log(copper)~1, ~x+y, meuse, nmax=10) > v=variogram(g) > g=gstat(g, model=vgm(1, "Sph", 1000), fill.all=T) > g=fit.lmc(v, g) > g data: log-zinc : formula = log(zinc)`~`1 ; data dim = 155 x 12 nmax = 10 log-lead : formula = log(lead)`~`1 ; data dim = 155 x 12 nmax = 10 log-copper : formula = log(copper)`~`1 ; data dim = 155 x 12 nmax = 10 variograms: model psill range log-zinc Sph 0.7132435 1000 log-lead Sph 0.6133020 1000 log-copper Sph 0.3634211 1000 log-zinc.log-lead Sph 0.6367012 1000 log-zinc.log-copper Sph 0.4570044 1000 log-lead.log-copper Sph 0.3934910 1000 ~x + y > set.seed(13131) > summary(gstat.cv(g, remove.all=TRUE, nfold=5)) Intrinsic Correlation found. Good. [using ordinary cokriging] Intrinsic Correlation found. Good. [using ordinary cokriging] Intrinsic Correlation found. Good. [using ordinary cokriging] Intrinsic Correlation found. Good. [using ordinary cokriging] Intrinsic Correlation found. Good. [using ordinary cokriging] log.zinc.pred log.zinc.var observed residual Min. :4.779 Min. :0.05426 Min. :4.727 Min. :-1.317697 1st Qu.:5.396 1st Qu.:0.10872 1st Qu.:5.288 1st Qu.:-0.230224 Median :5.858 Median :0.13745 Median :5.787 Median :-0.034374 Mean :5.895 Mean :0.15249 Mean :5.886 Mean :-0.009094 3rd Qu.:6.367 3rd Qu.:0.18303 3rd Qu.:6.514 3rd Qu.: 0.244075 Max. :7.358 Max. :0.60571 Max. :7.517 Max. : 1.414147 zscore fold x y Min. :-3.35764 Min. :1.000 Min. :178605 Min. :329714 1st Qu.:-0.58683 1st Qu.:2.000 1st Qu.:179371 1st Qu.:330762 Median :-0.10755 Median :3.000 Median :179991 Median :331633 Mean :-0.02766 Mean :2.852 Mean :180005 Mean :331635 3rd Qu.: 0.70691 3rd Qu.:4.000 3rd Qu.:180630 3rd Qu.:332463 Max. : 3.43370 Max. :5.000 Max. :181390 Max. :333611 Warning message: In checkNames(value) : attempt to set invalid names: this may lead to problems later on. See ?make.names > summary(gstat.cv(g, remove.all=FALSE, nfold=5)) Intrinsic Correlation found. Good. [using ordinary cokriging] Intrinsic Correlation found. Good. [using ordinary cokriging] Intrinsic Correlation found. Good. [using ordinary cokriging] Intrinsic Correlation found. Good. [using ordinary cokriging] Intrinsic Correlation found. Good. [using ordinary cokriging] log.zinc.pred log.zinc.var observed residual Min. :4.644 Min. :0.002371 Min. :4.727 Min. :-0.4190976 1st Qu.:5.308 1st Qu.:0.004975 1st Qu.:5.288 1st Qu.:-0.0773273 Median :5.777 Median :0.005875 Median :5.787 Median : 0.0006165 Mean :5.883 Mean :0.006609 Mean :5.886 Mean : 0.0026164 3rd Qu.:6.422 3rd Qu.:0.007419 3rd Qu.:6.514 3rd Qu.: 0.0825770 Max. :7.676 Max. :0.027247 Max. :7.517 Max. : 0.4659503 zscore fold x y Min. :-4.793253 Min. :1.000 Min. :178605 Min. :329714 1st Qu.:-1.080725 1st Qu.:2.000 1st Qu.:179371 1st Qu.:330762 Median : 0.007242 Median :3.000 Median :179991 Median :331633 Mean : 0.050487 Mean :2.974 Mean :180005 Mean :331635 3rd Qu.: 1.117469 3rd Qu.:4.000 3rd Qu.:180630 3rd Qu.:332463 Max. : 6.475831 Max. :5.000 Max. :181390 Max. :333611 Warning message: In checkNames(value) : attempt to set invalid names: this may lead to problems later on. See ?make.names > > proc.time() user system elapsed 1.31 0.09 1.39 gstat/tests/cv3d.R0000644000176200001440000000031514646417261013532 0ustar liggesusersoptions(digits = 4) set.seed(1131) d = data.frame(x=runif(50),y=runif(50),z=runif(50),v=rnorm(50)) library(gstat) xx = krige.cv(v~1,~x+y+z,d,model=vgm(1,"Exp",1), verbose=F, set=list(debug=0)) summary(xx) gstat/tests/merge.R0000644000176200001440000000151514646417261013775 0ustar liggesusersoptions(digits=6) # illustrates the use of merge, for merging parameters accross variables: # Z1=m+e1(s) # Z2=m+e2(s) # Z1 and Z2 each have a different variogram, but share the parameter m # see documentation of gstat() function library(gstat) d1 = data.frame(x=c(0,2),y=c(0,0),z=c(0,1)) d2 = data.frame(x=c(0,2),y=c(2,2),z=c(4,5)) g = gstat(NULL,"d1", z~1,~x+y,d1,model=vgm(1, "Exp", 1)) g = gstat(g,"d2", z~1,~x+y,d2,model=vgm(1, "Exp", 1), merge=c("d1","d2")) g = gstat(g, c("d1", "d2"), model = vgm(0.5, "Exp", 1)) predict(g, data.frame(x=1,y=1), debug = 32) # Z1 and Z2 share a regression slope: g = gstat(NULL,"d1", z~x,~x+y,d1,model=vgm(1, "Exp", 1)) g = gstat(g,"d2", z~x,~x+y,d2,model=vgm(1, "Exp", 1), merge=list(c("d1",2,"d2",2))) g = gstat(g, c("d1", "d2"), model = vgm(0.5, "Exp", 1)) predict(g, data.frame(x=1,y=1), debug = 32) gstat/tests/sim.R0000644000176200001440000000054414646417261013467 0ustar liggesusersoptions(digits=6) library(sp) data(meuse) set.seed(158229572) new.locs <- data.frame(x = c(181170, 180310, 180205, 178673, 178770, 178270), y = c(333250, 332189, 331707, 330066, 330675, 331075)) library(gstat) krige(zinc ~ 1, ~ x + y, meuse, newdata = new.locs, model = vgm(1.34e5, "Sph", 800, nug = 2.42e4), block = c(40,40), nmax = 40, nsim = 10) gstat/tests/fit.Rout.save0000644000176200001440000000227714646417261015153 0ustar liggesusers R version 3.2.2 (2015-08-14) -- "Fire Safety" Copyright (C) 2015 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(sp) > data(meuse) > library(gstat) > v=variogram(log(zinc)~1,~x+y,meuse,cutoff=500,wi=100) > v$gamma=c(0.5,1,2,3,3) > fit.variogram(v, vgm(1, "Sph", 300, 0),warn.if.neg=TRUE) model psill range 1 Nug 0.000000 0.00 2 Sph 7.878195 1567.77 Warning message: In fit.variogram(v, vgm(1, "Sph", 300, 0), warn.if.neg = TRUE) : partial sill or nugget fixed at zero value > fit.variogram(v, vgm(1, "Sph", 300, 0),warn.if.neg=FALSE) model psill range 1 Nug 0.000000 0.00 2 Sph 7.878195 1567.77 > > proc.time() user system elapsed 0.708 0.244 0.718 gstat/CHANGES0000644000176200001440000000031414646417261012400 0ustar liggesusersDec 5, 2002: started porting gstat to R Tue Dec 17 14:35:26 CET 2002 - added multivariate gstat(), Tue Aug 12 14:42:16 CEST 2003 - see src/CHANGES file in main gstat directory for more information gstat/MD50000644000176200001440000003272314750437062011723 0ustar liggesusersb930a1c993354b3d71cc449df073d4be *CHANGES 3bada61b386290b9544b31cf63709f99 *DESCRIPTION 3d8f0ef09f46d2ba801c2ffe1f264113 *NAMESPACE c63fe6b7a768083b100f0034f3cd63ac *NEWS.md 803f87a68be4ca054847ad578969b279 *R/circEmbed.R 02a9d4ea0f96e71d31a614d441396d5f *R/fit.lmc.R 77ad584fd5edfeb9b97c83dd20a97851 *R/fit.variogram.R 11df50040d29f897a44fbf7c5dcc5a66 *R/fit.variogram.gls.R b6fba7c709ffa4fbb952fa22fb4cd398 *R/fit.variogram.reml.R d3b1befeb3d012d19788a085c61cbc7e *R/get.contr.R 7adf4456be5ce6c97fe41363b1cbfba7 *R/gstat.R 90d1c48f89ef2dd31deac8d8021004df *R/gstat.cv.R 1843b43dc105951027eecd53732028de *R/gstat.debug.R 8d2764bd2a24771a470a8abae6adbb56 *R/gstat.formula.R cc78eaa9fe3d878621b6732cda4dc0fb *R/gstat.formula.predict.R 27f9fd5d4c00effac64ae18d25b121d8 *R/gstatOptions.R 12ad24366cb002879de3426371128796 *R/hscat.R edc9791ebe437b1901380d74972db2cc *R/image.data.frame.R 3bf39dc214ed564238d585fb1834480f *R/krige.R a86941154d557b47154d1f1e00ff40a0 *R/krige.cv.R 9d26d6cb15f8af5cbe89168a1ef60df8 *R/krige0.R f3cead51b48cb85f6362bc34bc723e2d *R/krigeST.R 6a8e3f331a9010d0167936ced6f831a2 *R/krigeTg.R 7ecb72625e1709c19958771d5258f4e5 *R/load.variogram.model.R 5e4ca298349e3841bcd67b74ec2b4b45 *R/map.to.lev.R 8abf80dfb1af614d77fa1f302ee6c264 *R/ossfim.R 437a312fa852e2962ae0c22cea323812 *R/panel.pointPairs.R b337728e2f7ebb444b598cbec7e6daea *R/plot.gstatVariogram.R 0ec356599d0f8b2a46b862681167bbe5 *R/plot.pointPairs.R 6be9f49eb64aa34ba6106147d375d01d *R/plot.variogramCloud.R 6d07dddad0be173c13925cc6105fa066 *R/predict.gstat.R d9f74b4d9ef3b8912e23e083f66c1412 *R/print.gstat.R 95622401bfd68c096e6e800bcef90b0c *R/print.variogram.R ae4124c6ea80101b9eb6866f2ab71ac7 *R/print.variogramCloud.R 0da3bd288649131c94b444b927c3d057 *R/print.variogramModel.R 2d074ecf214c2dcab279eebc5b16170b *R/set.R 9b44096a0bd48a7008c357782cb0560c *R/show.vgms.R e6512625a896a3c6dc22f9c084f43115 *R/spplot.R 0ab4a2623faa69f8d4a46a31164f230a *R/stVariogramModels.R 69f173064b6699bea0256867d43f42cf *R/turningLayers.R 425833489f7d223b4ce8f478464e0d83 *R/variogram.default.R 0190eebcef89a216f6bc6be0cfff6941 *R/variogram.formula.R 0a770b96aea80db9895b544e6c665a0a *R/variogram.gstat.R 7ac1739a2450448bbc435e421954255d *R/variogramLine.R 83681ff709d6be0f72e8e1251d7842cc *R/variogramST.R 627d13473d2a3275f0cda066b5a45623 *R/vgm.R d07099f46a9c8618d8719bd422b96f9f *R/vgm.panel.R 216b232871afa74f72e25e0ba1610fda *R/xyz2img.R fcf925486eda62721c36865214ee21a4 *R/zzz.R 162275a7b371a4d91dc6133a6a2c14bb *build/vignette.rds 420b8870b1ee5885e49e1c6cf85fab8f *cleanup 383bb5b201b6a11280be765cdae51cc5 *data/DE_RB_2005.rda 3f62822f4d3664fcd12a1e9d789bb1f1 *data/coalash.rda 3a013919a938c3cd22ee047777e9105d *data/fulmar.rda cc7bcd80b94dd4185932816f24c11652 *data/jura.rda b287bb1e8b1b239824af2c65ef146b0a *data/meuse.all.rda a8cf85be0530981eeccfe7258ffaa003 *data/meuse.alt.rda 7b392f96fdbd64e99e2ff0562ea04636 *data/ncp.grid.rda 0163813894acabbf44e96d9bd2149ac5 *data/oxford.rda 9539282de4e8f5e193641427e266fb31 *data/pcb.rda 4ca32858f4e70548d69fc18ac80415b4 *data/sic2004.rda 623553ae2f655bc83d8b867a875a8d0a *data/sic97.rda 9f8498c3b3969897235f6b76c693b6d4 *data/tull.rda ef0c7a497a0de976d63e5479b13bbb86 *data/vv.rda 2e027898fb2d1450607bdce520773b03 *data/walker.rda 2e5861a9b57f911831df92109d79d96e *data/wind.rda 4976fe0ea6d97714a1c37c992a379680 *demo/00Index 05081dee734ad48ddc1ad091f437a1e9 *demo/a2p.R 1586ae215a98a5e8a29dbb735bf8a058 *demo/a2pinST.R af173da614ae8cbd853a760f8dce2708 *demo/block.R 83964bc95a07cadc048763aa20d9e2bc *demo/blue.R e76d50bb750c18fdd0a6c11fa384a673 *demo/cc.R 2352f215418d1e242b5d93c4097b8e84 *demo/circEmbeddingMeuse.R 6cff1db47fc6d7e86ce99c0101506bbf *demo/cokriging.R 36401510d481ce47b6d4ad5b924b53ca *demo/comp_geoR.R 962abe21a4a8e97e707ed907d7b5a1ff *demo/cosimulation.R 04280e3a36b00d496e951e196edbd1f3 *demo/depend.R 92670e4c520943a1c1a0fe90c813dcc8 *demo/examples.R 78d4ea634a6c17727c50ab11b18f83eb *demo/fulmar.R 16710a6f62d47804ed6c7ba9f1e4a6ae *demo/grass.R 8e224d6de7dba44672104e226eb324fc *demo/gstat3D.R b6615db4e745f66e8cc8efa59e3c0cf1 *demo/ikr.R cf96a4ef3c82dcb079b394b429a27d69 *demo/krige.R 1b6836515e6152d8e314002f67c0033d *demo/lhs.R b9f170ba90986dc71bdcbfc7f7b9284d *demo/line.R f734df09e2c2bca844623513ec872c94 *demo/lnsim.R 3239742713164de7a1611c3be05c5cb6 *demo/localKrigeST.R db63e4d2290327fdda91ad4c96fd19f0 *demo/pcb.R 0666f28bc4e3fbfbf9de0ffe78af0649 *demo/pcb_sf.R 2ef5e7ba229731b758ca9f053ec6276a *demo/rep.R 362a987292c09dc4be10104598014be9 *demo/sftime.R ba8e22bc0379e0308101ead16bc8745b *demo/sic2004.R e6e0356f19038baeea945d98a962eb8d *demo/snow.R a4df89b8a19499356bf838ec397e0c67 *demo/stkrige-crossvalidation.R 02326c0c05e5a663342be1252e671c43 *demo/stkrige-prediction.R 237b3653834cdbfb4f858d473ecf5ebf *demo/stkrige.R 2a47bc53e3632d65db84504076d6549a *demo/ugsim.R 47d9686778ca770faed9516cdeee881d *demo/uisim.R 4d04a06586ba37b31a14554a53424b28 *demo/weight.R b163d21ad7fa0eee3d2906b9d9bce5af *demo/wind.R e8cc520e632cf37de0b517b047f45020 *demo/zonal.R 702b865ba56005835623824568b10beb *inst/CITATION 4fb7e4c519bf5bea3c4eb66238c55afa *inst/doc/gstat.R a32e6ad6ede836013c11173470ba4486 *inst/doc/gstat.Rnw 6a852a3018a9de3d8ba97dc279bc00ca *inst/doc/gstat.pdf 626f14d14182c6fb8b5d3dd6e855f387 *inst/doc/prs.R 4961b8e9071476d87816c5d9052380f0 *inst/doc/prs.Rnw 4be4fc9364c0ba2dd4fd9b4d5f9c0163 *inst/doc/prs.pdf 1cf59eefc43986e06838c7586393c912 *inst/doc/spatio-temporal-kriging.Rnw d21947b646d617a250166e557c731e11 *inst/doc/spatio-temporal-kriging.bib 1f177614b0314dd73c57dff0234b16c8 *inst/doc/spatio-temporal-kriging.pdf b059341de51755a03b51bfb18e488913 *inst/doc/st.R bde19f77aa7859b34f3dca51ab1cb93c *inst/doc/st.Rnw 2f20d4c72bb82d571adbcf3d707e03a5 *inst/doc/st.pdf af529f6f9ce9e52ed054e016fd386af5 *inst/external/cluster.txt bacec53ee233889d6419b0e394bde7a8 *inst/external/ncp.dbf 3692904f850276a958eaa4024e4a8ec7 *inst/external/ncp.shp d7dc006dda153c41d6d102787e3a76c3 *inst/external/ncp.shx 127a9609099cd1f344b51e7f1877c85e *inst/external/no2.csv 0ff201f5692334d490c18661c3052276 *inst/external/oxford.jpg 96c8ff6ea9e99398a1faf5bfa1d9b378 *man/DE_RB_2005.Rd a021fb462be9c7aa235dd384ca36e78f *man/coalash.Rd 6ba0d013bc23fd3cdac5a9489116b29a *man/estiStAni.Rd f5a11c0a4c9ba23bd51089810f1ec03c *man/extractPar.Rd 097f908bb113d72690e9cee7b05f2b60 *man/fit.StVariogram.Rd 308f2115a92bd0e02b43ba1bba2659f7 *man/fit.lmc.Rd 742b2c72b8e7b5ea26d5ce672cd60603 *man/fit.variogram.Rd cc6af46d512fec91a09884363602f11b *man/fit.variogram.gls.Rd 5639348c778a32774fc39d231626cb1c *man/fit.variogram.reml.Rd 05bfbe18ee524a457d28f330288dae4e *man/fulmar.Rd 8959ff48e738d7c0eb41abcfc5b4fe0c *man/get.contr.Rd ca84fba4fa23c468e614795fcddc898c *man/gstat-internal.Rd 4ffbe38c974d51d7deaa4f5259c33735 *man/gstat.Rd 23e1a861e8b980be42de5525c0f3eaa8 *man/hscat.Rd 7c6aa566ef9c873de1cf4263bd7a6e0f *man/image.Rd 0aae1d7e2118c34ec60459a6c67cfd1e *man/jura.Rd add56f658c894c039fd9fdd4be3cc2f7 *man/krige.Rd 180a0ee9329a24092b869f003e2e3bd7 *man/krige.cv.Rd 886f8920e12c91d618e31337457dfc27 *man/krigeST.Rd 5f442e7128f579a38fb04c05a011495d *man/krigeSTSimTB.Rd 76113d04d375455608991f702fbb7e62 *man/krigeSimCE.Rd 8573cdc2d93acbf3f78f6934f90f8895 *man/krigeTg.Rd ef9f95b6ace5e25d9851b1978ec8a796 *man/map.to.lev.Rd b60064452cf42e22a5cc79a981f23a7a *man/meuse.all.Rd d558f21cc61e41cb1facf19de2c9dcfd *man/meuse.alt.Rd dbc2e0fef45b60c96b307de014b17e7c *man/ncp.grid.Rd c0fd21ba73c250320c57b5f28597e349 *man/ossfim.Rd a775ef616da51224620e7cc9a832de6f *man/oxford.Rd 08b8ca971cfb973cd3f2d5c3991f7744 *man/pcb.Rd 5f15ff676e986de662776baa0db9ad1f *man/plot.gstatVariogram.Rd 57669f191cb4f5d820e868947d550bd5 *man/plot.pointPairs.Rd a184e23f6c4f261390e3bf475c933589 *man/plot.variogramCloud.Rd 2ac1d60a5d1fcf60625502ef4b60a863 *man/predict.gstat.Rd e3b9c69fea5e974be1491666dd9e7f2f *man/progress.Rd 2adbec7bd98ac8e9dd1285593335c92f *man/show.vgms.Rd 2df0826f567627d6fc014755cdf3956b *man/sic2004.Rd e193ecd4d5632107c7b25e14f881e16e *man/sic97.Rd 4856c6bd3604ced90ba111d984d83abc *man/spplot.vcov.Rd ed6845ea040e1eb85b0e357ce6d7ee38 *man/tull.Rd 85f1e0fbd5e7f436736a961ed50b7f54 *man/variogram.Rd 533d618caf8af5a60c14e4cd9d1055b8 *man/variogramLine.Rd da9761b755cceb7282c7e76d999ebd37 *man/variogramST.Rd 4169384801c30bd594a70d3ef51bcbc6 *man/variogramSurface.Rd a7c9a00724359f7fbafc3ab2c8a23313 *man/vgm.Rd f62d6478acf8cf12d52f555ca8c5fe8b *man/vgm.panel.Rd bd8034339dacae22ef6d14b796517f90 *man/vgmArea.Rd 576f2984d904a947939985f1d26e046b *man/vgmAreaST.Rd 01a7a226446af1c5512d99448bfd5fd8 *man/vgmST.Rd c6589cc4b53810b4bf410a479058c0cd *man/vv.Rd 1395d078750045ef98b71e98703ecef9 *man/walker.Rd c801c75ca84363ce6792c28897080cb0 *man/wind.Rd 2b06c8ace73a4549d8955d507176adbe *src/Makevars cd356c0062dd113425dcea3326c25937 *src/block.c 50f7dca54d782da8fa90376f91379c1a *src/block.h fe6d706346108ff86d4a742d1f1c0851 *src/data.c 8328781e753b45df53635bbb1af114f8 *src/data.h 4ae249002fa3e4d20ca7eb8648865afc *src/debug.h 32676f133e79fe84fcf143ac7c80034f *src/defaults.h 16d84f0d9ca22a3477ca83e49f49d800 *src/defs.h b3af256c7df51a35a368c4d94daf5c0d *src/direct.c 8a8ecbc415ae2102acbf7bea4228f4db *src/direct.h 74cbd4b8851adf813dfb512ebcde091d *src/fit.c ba498786f7fe47bb4e57e63f9bd45164 *src/fit.h f30f0be85eb072459a9e53f444579700 *src/gcdist.c 221e6cadf8e43cff03c39605a02bfa5d *src/gcdist.h 6cdb4ba518990878e84e271f34a0bbda *src/getest.c 60238e9217e0be3e69bd5c8a591818e2 *src/getest.h 7cee9fdcf79499817d80b01db3b57b6a *src/gls.c 46dc3925fa670dd3f277101f52f0fcd7 *src/gls.h f0ee553ab46b93229e7092b34edd22a1 *src/glvars.c d0afd7915c15f4505403db9926ffed7d *src/glvars.h 94f1cbc41e449bde9e99e6c8ac2aeea6 *src/init.c 9e281c2ec38b7ac600690a795b4f6c3b *src/lm.c 88138ca5edceca83cdf4a8934cc42f4a *src/lm.h c8638e72358d70ae27da94274fc303ba *src/mapio.c 4ff06b1d5c8068b68628495867110a5b *src/mapio.h 27144d7f3e44b6807dbfd41f115723f7 *src/msim.c 6381e492f21372736bf7ff42e57d8e13 *src/msim.h 63799d37dfad0bc09da128794153fe7a *src/mtrx.c fdbe09c20a4c7b49d85f8c3e6b4b9820 *src/mtrx.h a1d8427748290b035ff031a1ab6ac0bf *src/nsearch.c cb7c7884a7504da02bfdd19ed10dc665 *src/nsearch.h cd520f7adb1880aab8cc98b35cc60c0d *src/pqueue.c a0c57bd9852efe71fd1323a220816b0a *src/pqueue.h 8a23f9662162c6c1ff6fc028bfa9ef68 *src/reml.c dc58fae97b9abee9228ba2ae92c9a126 *src/reml.h c890da946eef6237bea10bde7801b795 *src/s.c 3b75b902aa067dcbdcfe59c6e79cd943 *src/s.h 8ca1be20f6d08c72bff6928589a1444d *src/select.c f9f9efd4c025607820dd39928231d6e8 *src/select.h cb308ac96305994692d7740e0c3b5a34 *src/sem.c 28c8554fc50566818c33ecdbded5dd89 *src/sem.h 7a540429fb56542a4aca8fca494ad170 *src/sim.c 4481ac8fe298f827274c7f9bc5619990 *src/sim.h b416760f2c731017c4af92f89c30c525 *src/userio.c 1ffb22ab294cb753fa1ff742a41bb4db *src/userio.h cf128f1b5ea70cdfc79c13ad1ac4ffa8 *src/utils.c 03f1efb0993257a26ac527a2cb4d6bb2 *src/utils.h d5839cef04149d18255f99f219974ac0 *src/vario.c 2a89ce5559e7ec536ef4cf4ea27d16c7 *src/vario.h c3b780933c64dafde485584d24cfafbd *src/vario_fn.c 0c7dab4655f331b80ec70570695dd027 *src/vario_fn.h 21cd4d99d24ac09825af86bd41e8ae37 *src/vario_io.c e4c7015f19601d136e2f4bb26b9ba043 *src/vario_io.h c03485b9f7b27533ec0b98d412583b44 *tests/allier.R 63851c34cc8de0b05d9562ef40ff835b *tests/allier.Rout.save 8a119ec5be1b0b9d2ac4281b28e4d303 *tests/blockkr.R 2f3bb7abc17e1ef8a3252133e1d0819f *tests/blockkr.Rout.save 5244b31f26f5fdc216b4069e6d247072 *tests/covtable.R 0f68261efb85437edcf1c0bbda9f07f2 *tests/covtable.Rout.save d4e6a035dbb2acdb54c7d1250726c6f5 *tests/cv.R a588ab2866ed2c33cb220b72c28574e9 *tests/cv.Rout.save 6bb81fcd91cf3f5b22da90c3b67b0d3b *tests/cv3d.R ae722cc710794aa6e2306ee05ae645c6 *tests/cv3d.Rout.save 5b1577d870bc22def0f5b9f4c5b08310 *tests/fit.R 4b14ce151e5eb5ce9963d243340af6cf *tests/fit.Rout.save d9c6a69f63372a0a46b1805dc0600741 *tests/krige0.R 3b05508a8d930bc11e982c1c0c11c3fe *tests/krige0.Rout.save 4a35e9b8d5056270b522e3a8aacbc9af *tests/line.R 58808f9c817a044375a7dfea53dd3859 *tests/line.Rout.save 580757bef9267e0f1b06dd39a1c55efa *tests/merge.R de4ac5b3c0ae4b696c674e9fedfac06b *tests/merge.Rout.save 358b26b2b47408f4d330c7ae619e94fb *tests/na.action.R ab68a094793dc61446114fbe2f48255d *tests/na.action.Rout.save 7e40f0b04b2219fa329b4f0ede19d523 *tests/rings.R 7c115ab4f24d06b8628c4dbc95675838 *tests/rings.Rout.save 3872fee92178c9337d2bd31c3f9d4369 *tests/sim.R a2fd1af159d1d3d2cef3252fa828dc1c *tests/sim.Rout.save da7637f47effb61a7f707b5c9cdcaf43 *tests/stars.R 8df537fcd537f209e46716ec2f2fa3f0 *tests/stars.Rout.save 45f1c269b4a9bd7bfa0854ed5f89990d *tests/unproj.R b9f17276c07cdd133c621ba48b6c94e4 *tests/unproj.Rout.save 0ce127ddb2b0c900c6634acef7c4cc9c *tests/variogram.R b7587d353040687e3dc23a7e0e1c9378 *tests/variogram.Rout.save 46df20db1a40656b9bb21b0107bcf663 *tests/vdist.R d90377d4ddc5a87581a8de87ce62c77a *tests/vdist.Rout.save fb9ad8991c1bc2ce89b660ebe94815c2 *tests/windst.R 652b91540c90841452427bb5400bb219 *tests/windst.Rout.save 20272ee0d92bfda02b0a63d4093c03fc *vignettes/figures/allVgmsDiffWireframe.png 624ded7c12218d06ee90abc27cc7dfdb *vignettes/figures/allVgmsWireframe.png 3873ad3a6d22a95d5597c5548addf558 *vignettes/figures/daily_means_PM10.png 4efaab181b2dc944551ad5c3dfaf0fb9 *vignettes/figures/diffs_daily_means_PM10.png 2728991212e9c87744362f607f3389bc *vignettes/figures/pred_daily_means_PM10.png 41d31a6115115468b11472ba102f84c7 *vignettes/figures/singleStationTimeSeries.png a39e5c29e6e0755bf2479ec93514f307 *vignettes/figures/vgmVsMetricDist.png a32e6ad6ede836013c11173470ba4486 *vignettes/gstat.Rnw 23a8ca706b284fdd73be5e1958601d75 *vignettes/ifgi-logo_int.pdf 4961b8e9071476d87816c5d9052380f0 *vignettes/prs.Rnw 1cf59eefc43986e06838c7586393c912 *vignettes/spatio-temporal-kriging.Rnw d21947b646d617a250166e557c731e11 *vignettes/spatio-temporal-kriging.bib bde19f77aa7859b34f3dca51ab1cb93c *vignettes/st.Rnw gstat/R/0000755000176200001440000000000014730022675011603 5ustar liggesusersgstat/R/set.R0000644000176200001440000000304314646417261012526 0ustar liggesusers# $Id: set.q,v 1.7 2008-12-16 14:59:22 edzer Exp $ gstat.set <- function(set) { if(!is.list(set)) stop("set should be a list") if (length(set) == 0) return(NULL) ret = NULL n = names(set) for (i in (1:length(set))) { val = set[[i]] if (n[i] == "method") str = paste("method: ", val, ";", sep="") else { if (is.character(val)) val = paste("'", val, "'", sep = "") str = paste("set ", n[i], " = ", val, ";", sep="") } ret = c(ret, str) } ret } gstat.load.set <- function(set) { if(!is.list(set)) stop("set should be a list") if (length(set) == 0) return(NULL) n = names(set) for (i in (1:length(set))) { if (n[i] == "method") ret = .Call(gstat_set_method, set[[i]]) else ret = .Call(gstat_set_set, n[i], set[[i]]) } invisible(ret) } gstat.load.merge <- function(obj) { if (is.character(obj$merge) && length(obj$merge) == 2) obj$merge = list(c(obj$merge[1], 1, obj$merge[2], 1)) if (!is.list(obj$merge)) stop("merge argument should be list or character vector of lenght 2") ret = NULL for (i in 1:length(obj$merge)) { m = obj$merge[[i]] if (is.character(m) && length(m) == 4) { id = match(m[c(1,3)], names(obj$data)) - 1 # name ->> id if (any(is.na(id))) stop(paste("could not match all ids:", m[c(1,3)])) col = as.integer(m[c(2,4)]) - 1 if (any(is.na(col)) || any(col < 0)) stop("merge: parameters should be positive integers") ret = .Call(gstat_set_merge, id[1], col[1], id[2], col[2]) } else stop( "list elements of merge should be lenght 4 character vectors") } ret } gstat/R/image.data.frame.R0000644000176200001440000000036314646417261015020 0ustar liggesusers# $Id: image.data.frame.q,v 1.4 2006-02-10 19:01:07 edzer Exp $ "image.data.frame" <- function (x, zcol = 3, xcol = 1, ycol = 2, asp = 1, ...) { image.default(xyz2img(xyz = x, zcol = zcol, xcol = xcol, ycol = ycol), asp = asp, ...) } gstat/R/print.variogramCloud.R0000644000176200001440000000054314646417261016046 0ustar liggesusers# $Id: print.variogramCloud.q,v 1.4 2007-10-18 10:13:13 edzer Exp $ as.data.frame.variogramCloud = function(x, row.names, optional, ...) { .BigInt = attr(x, ".BigInt") x$left = x$np %% .BigInt + 1 x$right = x$np %/% .BigInt + 1 x$np = NULL class(x) = "data.frame" x } print.variogramCloud <- function (x, ...) { print(as.data.frame(x), ...) } gstat/R/krigeST.R0000644000176200001440000004452414646417261013314 0ustar liggesusers############################# ## spatio-temporal kriging ## ############################# debug_time_unit = function(tUnit) { # message("Using the following time unit: ", tUnit) } STsolve = function(A, b, X) { # V = A$T %x% A$S -- a separable covariance; solve A x = b for x # kronecker: T %x% S vec(L) = vec(c0) <--> S L T = c0 # solve for L: use Y = L T # S Y = c0 -> Y = solve(S, c0) # L T = Y -> Tt Lt = Yt -> Lt = solve(Tt, Yt) #Tm = chol(A$Tm, LINPACK=TRUE) Tm = chol(A$Tm) #Sm = chol(A$Sm, LINPACK=TRUE) Sm = chol(A$Sm) STbacksolve = function(Tm, Cm, Sm) { MyChSolve = function(A, b) backsolve(A, forwardsolve(A, b, upper.tri = TRUE, transpose = TRUE)) # Y = MyChSolve(Sm, Cm) # L = MyChSolve(Tm, t(Y)) # as.vector(t(L)) as.vector(t(MyChSolve(Tm, t(MyChSolve(Sm, Cm))))) } # b comes separated: ret1 = apply(b$T, 2, function(x1) apply(b$S, 2, function(x2) STbacksolve(Tm, matrix(x1 %x% x2, nrow(Sm), nrow(Tm)), Sm))) d = dim(ret1) dim(ret1) = c(d[1] / ncol(b$S), d[2] * ncol(b$S)) # X comes full: ret2 = apply(X, 2, function(x) STbacksolve(Tm, matrix(x, nrow(Sm), nrow(Tm)), Sm)) cbind(ret1, ret2) } covfn.ST = function(x, y = x, model, ...) { switch(strsplit(model$stModel, "_")[[1]][1], separable=covSeparable(x, y, model, ...), productSumOld=covProdSumOld(x, y, model), productSum=covProdSum(x, y, model), sumMetric=covSumMetric(x, y, model), simpleSumMetric=covSimpleSumMetric(x, y, model), metric=covMetric(x, y, model), stop(paste("Provided spatio-temporal model (",model$stModel,") is not supported.",sep=""))) } ## krigeST krigeST <- function(formula, data, newdata, modelList, beta, y, ..., nmax=Inf, stAni=NULL, computeVar = FALSE, fullCovariance = FALSE, bufferNmax=2, progress=TRUE) { stopifnot(inherits(modelList, "StVariogramModel") || is.function(modelList)) to_sftime = FALSE return_stars = if (inherits(data, c("stars"))) { if (!requireNamespace("sf", quietly = TRUE)) stop("sf required: install that first") # nocov if (!requireNamespace("stars", quietly = TRUE)) stop("stars required: install that first") # nocov if (sf::st_crs(data) != sf::st_crs(newdata)) warning("CRS for data and newdata are not identical; assign CRS or use st_transform to correct") data = as(data, "STFDF") newdata = as(newdata, "STFDF") TRUE } else if (inherits(data, "sftime")) { if (sf::st_crs(data) != sf::st_crs(newdata)) warning("CRS for data and newdata are not identical; assign CRS or use st_transform to correct") data = as(data, "STIDF") if (inherits(newdata, "stars")) { if (length(newdata) == 0) newdata$._dummy = 0. newdata = as(newdata, "STFDF") } if (inherits(newdata, "sftime")) { to_sftime = TRUE newdata = as(newdata, "STIDF") } TRUE } else { if (!identical(data@sp@proj4string@projargs, newdata@sp@proj4string@projargs)) message("please verify that the CRSs of data and newdata are identical, or transform them first to make them identical") FALSE } stopifnot(inherits(data, c("STF", "STS", "STI", "sftime")) && inherits(newdata, c("STF", "STS", "STI", "sftime"))) if (inherits(data, "sftime")) data = as(data, "STIDF") if (inherits(newdata, "sftime")) data = as(data, "STI") stopifnot(class(data@time) == class(newdata@time)) stopifnot(nmax > 0) tUnitModel <- attr(modelList, "temporal unit") tUnitData <- units(abs(outer(index(data@time[1]), index(newdata@time[1]), "-"))) if (is.null(tUnitModel)) { warning("The spatio-temporal variogram model does not carry the strongly recommended attribute 'temporal unit'.\n The unit '", tUnitData, "' has been assumed. krigeST could not check whether the temporal distances between locations and in the variogram coincide.") tUnit <- tUnitData attr(modelList, "temporal unit") <- tUnit } else { tUnit <- tUnitModel debug_time_unit(tUnit) } if(nmax < Inf) { # local neighbourhood ST kriging: ret = krigeST.local( formula = formula, data = data, newdata = newdata, modelList = modelList, beta=beta, # y=y, # for later use nmax = nmax, stAni = stAni, computeVar = computeVar, fullCovariance = fullCovariance, bufferNmax = bufferNmax, progress = progress) if (return_stars) { ret$._dummy = NULL if (to_sftime) sftime::st_as_sftime(ret) else stars::st_as_stars(as(ret, "STFDF")) } else ret } else { df <- krigeST.df(formula = formula, data = data, newdata = newdata, modelList = modelList, beta = beta, y = y, ..., nmax=nmax, stAni=stAni, computeVar = computeVar, fullCovariance = fullCovariance, bufferNmax = bufferNmax, progress = progress) # wrapping the predictions in ST*DF again if (!fullCovariance) { ret = addAttrToGeom(geometry(newdata), df) if (return_stars) { ret$._dummy = NULL if (to_sftime) ret = sftime::st_as_sftime(ret) else ret = stars::st_as_stars(as(ret, "STFDF")) } ret } else df } } krigeST.df <- function(formula, data, newdata, modelList, beta, y, ..., nmax = Inf, stAni = NULL, computeVar = FALSE, fullCovariance = FALSE, bufferNmax = 2, progress = TRUE) { separate <- length(data) > 1 && length(newdata) > 1 && inherits(data, "STF") && inherits(newdata, "STF") lst = extractFormula(formula, data, newdata) X = lst$X x0 = lst$x0 if (missing(y)) y = lst$y if (inherits(modelList, "StVariogramModel")) { V = covfn.ST(data, model = modelList, separate=separate) v0 = covfn.ST(data, newdata, modelList) if (is(data,"STSDF")) d0 <- data[data@index[1,1], data@index[1,2], drop = FALSE] else d0 = data[1, 1, drop=FALSE] c0 = as.numeric(covfn.ST(d0, d0, modelList, separate = FALSE)) } else { V = modelList(data, data, ...) v0 = modelList(data, newdata, ...) if (computeVar) { if (is(newdata@sp, "SpatialLines") || is(newdata@sp, "SpatialPolygons")) stop("Varying target support (SpatialLines, SpatialPolygons) for kriging variance is not implemented.") c0 = as.numeric(modelList(newdata[1, drop=FALSE], newdata[1, drop=FALSE])) } } if (!missing(beta)) { # sk: skwts = CHsolve(V, v0) npts = length(newdata) ViX = skwts[,-(1:npts)] skwts = skwts[,1:npts] if (computeVar) var <- c0 - apply(v0*skwts, 2, sum) } else { if (!is.function(modelList) && (modelList$stModel == "separable" & separate)) skwts <- STsolve(V, v0, X) # use Kronecker trick else skwts <- CHsolve(V, cbind(v0, X)) npts = length(newdata) ViX = skwts[,-(1:npts)] skwts = skwts[,1:npts] beta = solve(t(X) %*% ViX, t(ViX) %*% y) if (computeVar) { # get (x0-X'C-1 c0)'(X'C-1X)-1 (x0-X'C-1 c0) -- precompute term 1+3: if(is.list(v0)) # in the separable case v0 = v0$Tm %x% v0$Sm Q = t(x0) - t(ViX) %*% v0 # suggested by Marius Appel var = c0 - apply(v0 * skwts, 2, sum) + apply(Q * CHsolve(t(X) %*% ViX, Q), 2, sum) if (fullCovariance) { corMat <- cov2cor(covfn.ST(newdata, newdata, modelList)) var <- corMat*matrix(sqrt(var) %x% sqrt(var), nrow(corMat), ncol(corMat)) # var = c0 - t(v0) %*% skwts + t(Q) %*% CHsolve(t(X) %*% ViX, Q) # return(list(pred=pred, var=var)) } } } pred = x0 %*% beta + t(skwts) %*% (y - X %*% beta) if(computeVar) { if (fullCovariance) list(pred=pred, var=var) else data.frame(var1.pred = pred, var1.var = var) } else data.frame(var1.pred = pred) } # local spatio-temporal kriging krigeST.local <- function(formula, data, newdata, modelList, beta, nmax, stAni=NULL, computeVar=FALSE, fullCovariance=FALSE, bufferNmax=2, progress=TRUE) { dimGeom <- ncol(coordinates(data)) if (fullCovariance) stop("fullCovariance cannot be returned for local ST kriging") if(is.null(stAni) & !is.null(modelList$stAni)) { stAni <- modelList$stAni # scale stAni [spatial/temporal] to seconds if(!is.null(attr(modelList,"temporal unit"))) stAni <- stAni/switch(attr(modelList, "temporal unit"), secs=1, mins=60, hours=3600, days=86400, stop("Temporal unit",attr(modelList, "temporal unit"),"not implemented.")) } if(is.null(stAni)) stop("The spatio-temporal model does not provide a spatio-temporal anisotropy scaling nor is the parameter stAni provided. One of these is necessary for local spatio-temporal kriging.") # check whether the model meets the coordinates' unit if(!is.null(attr(modelList, "spatial unit"))) stopifnot((is.projected(data) & (attr(modelList, "spatial unit") %in% c("km","m"))) | (!is.projected(data) & !(attr(modelList, "spatial unit") %in% c("km","m")))) if (inherits(data, c("STFDF", "STSDF", "sftime"))) data <- as(data, "STIDF") clnd <- class(newdata) if(inherits(newdata, c("STFDF", "STSDF", "sftime"))) newdata <- as(newdata, "STIDF") if(inherits(newdata, c("STF", "STS"))) newdata <- as(newdata, "STI") # from here on every data set is assumed to be STI* if(dimGeom == 2) { df = as(data, "data.frame")[,c(1,2,4)] df$time = as.numeric(df$time)*stAni query = as(newdata, "data.frame")[,c(1,2,4)] query$time = as.numeric(query$time)*stAni } else { df = as(data, "data.frame")[,c(1,2,3,5)] df$time = as.numeric(df$time)*stAni query = as(newdata, "data.frame")[,c(1,2,3,5)] query$time = as.numeric(query$time)*stAni } df <- as.matrix(df) query <- as.matrix(query) if (computeVar) { res <- data.frame(var1.pred = rep(NA, nrow(query)), var1.var = rep(NA, nrow(query))) } else { res <- data.frame(var1.pred = rep(NA, nrow(query))) } if(progress) pb = txtProgressBar(style = 3, max = nrow(query)) nb <- t(apply(get.knnx(df, query, ceiling(bufferNmax*nmax))[[1]],1,sort)) for (i in 1:nrow(query)) { nghbrData <- data[nb[i, ], , drop = FALSE] if(bufferNmax > 1) { nghbrCov <- covfn.ST(nghbrData, newdata[i, , drop = FALSE], modelList) nghbrData <- nghbrData[sort(order(nghbrCov, decreasing=T)[1:nmax]), , drop = FALSE] } res[i,] <- krigeST.df(formula, nghbrData, newdata[i, , drop = FALSE], modelList, computeVar=computeVar, beta = beta, fullCovariance=fullCovariance) if(progress) setTxtProgressBar(pb, i) } if(progress) close(pb) if (clnd %in% c("STI", "STS", "STF")) { newdata <- addAttrToGeom(newdata, as.data.frame(res)) newdata <- switch(clnd, STI = as(newdata, "STIDF"), STS = as(newdata, "STSDF"), STF = as(newdata, "STFDF")) } else { newdata@data <- cbind(newdata@data, res) newdata <- as(newdata, clnd) } newdata } ## Area to point kriging # define a spatio-temporal variogram model FUNCTION that can deal with x and y # being of ST* with @sp of class SpatialPolygons OR SpatialPoints; # SpatialGrid/Pixels are coerced to SpatialPolygons -- as in the so case, see # krige0.R # sts <- STS(meuse.grid, stf@time, cbind(sort(sample(length(meuse.grid), 500, replace = T)), # sample(21,500, replace=TRUE))) # # x <- sts # y <- stf # model <- separableModel vgmAreaST = function(x, y = x, model, ndiscrSpace = 16, verbose = FALSE, covariance = TRUE) { if (gridded(x@sp)) x@sp = as(x@sp, "SpatialPolygons") if (gridded(y@sp)) y@sp = as(y@sp, "SpatialPolygons") stopifnot(is(x@sp, "SpatialPolygons") || is(x@sp, "SpatialPoints")) stopifnot(is(y@sp, "SpatialPolygons") || is(y@sp, "SpatialPoints")) stopifnot(is(model, "StVariogramModel")) # make x and y both of type STS/STSDF if ("data" %in% slotNames(x)) { x <- as(x, "STSDF") } else { x <- as(x, "STS") } if ("data" %in% slotNames(y)) { y <- as(y, "STSDF") } else { y <- as(y, "STS") } nx = length(x) ny = length(y) V <- matrix(NA, nx, ny) # switch cases for polygons in x and y if (is(x@sp, "SpatialPolygons")) { # x contains polygons -> loop and sample indexX <- x@index if (verbose) pb <- txtProgressBar(style = 3, max = nx) for (ix in 1:nx) { # ix <- 1 px <- x[indexX[ix,,drop=F],drop=F] ptsx = STF(spsample(px@sp, ndiscrSpace, "regular", offset = c(.5,.5)), px@time, px@endTime) # does y also contain polygons? if (is(y@sp, "SpatialPolygons")) { # yes, also y contains polygons -> loop and sample indexY <- y@index for (iy in 1:ny) { # iy <- 1 py <- y[indexY[iy,,drop=F],drop=F] ptsy = STF(spsample(py@sp, ndiscrSpace, "regular", offset = c(.5,.5)), py@time, py@endTime) suppressMessages(subV <- covfn.ST(ptsx, ptsy, model, separate=FALSE)) V[ix, iy] <- mean(subV) } } else { # no, y contains points -> no second loop, calc covariance suppressMessages(subV <- covfn.ST(ptsx, y, model, separate=FALSE)) V[ix, ] <- apply(subV, 2, mean) } if (verbose) setTxtProgressBar(pb, ix) } if (verbose) close(pb) } else { # none of x and y contain polygons -> no loops, calc covariance suppressMessages(V <- covfn.ST(x, y, model)) } V } #################### ## trans Gaussian ## #################### krigeSTTg <- function(formula, data, newdata, modelList, y, nmax=Inf, stAni=NULL, bufferNmax=2, progress=TRUE, lambda = 0) { if(!is.infinite(nmax)) return(krigeSTTg.local(formula, data, newdata, modelList, y, nmax, stAni, bufferNmax, progress, lambda)) lst <- extractFormula(formula, data, newdata) Y <- lst$y X <- lst$X if (ncol(X) > 1) stop("only formula with intercept allowed, e.g. y ~ 1") data$value = phiInv(Y, lambda) data$value1 = rep(1, length(data$value)) OK = krigeST(value ~ 1, data, newdata, modelList, nmax = nmax, stAni = stAni, computeVar=TRUE, bufferNmax = bufferNmax, progress = progress) separate <- length(data) > 1 && length(newdata) > 1 && inherits(data, "STF") && inherits(newdata, "STF") V <- covfn.ST(data, model = modelList, separate=separate) Vi <- solve(V) muhat <- sum(Vi %*% data$value)/sum(Vi) # find m: v0 <- covfn.ST(data, newdata, model = modelList, separate=separate) m <- (1 - apply(Vi %*% v0,2,sum))/sum(Vi) # compute transGaussian kriging estimate & variance: OK$var1TG.pred = phi(OK$var1.pred, lambda) + phiDouble(muhat, lambda) * (OK$var1.var/2 - m) OK$var1TG.var = phiPrime(muhat, lambda)^2 * OK$var1.var OK } krigeSTTg.local <- function(formula, data, newdata, modelList, y, nmax=Inf, stAni=NULL, bufferNmax=2, progress=TRUE, lambda = 0) { stopifnot(!is.infinite(nmax)) dimGeom <- ncol(coordinates(data)) if(is.null(stAni) & !is.null(modelList$stAni)) { stAni <- modelList$stAni # scale stAni [spatial/temporal] to seconds if(!is.null(attr(modelList,"temporal unit"))) stAni <- stAni/switch(attr(modelList, "temporal unit"), secs=1, mins=60, hours=3600, days=86400, stop("Temporal unit",attr(modelList, "temporal unit"),"not implemented.")) } if(is.null(stAni)) stop("The spatio-temporal model does not provide a spatio-temporal anisotropy scaling nor is the parameter stAni provided. One of these is necessary for local spatio-temporal kriging.") # check whether the model meets the coordinates' unit if(!is.null(attr(modelList, "spatial unit"))) stopifnot((is.projected(data) & (attr(modelList, "spatial unit") %in% c("km","m"))) | (!is.projected(data) & !(attr(modelList, "spatial unit") %in% c("km","m")))) if(is(data, "STFDF") || is(data, "STSDF")) data <- as(data, "STIDF") clnd <- class(newdata) if(is(newdata, "STFDF") || is(newdata, "STSDF")) newdata <- as(newdata, "STIDF") if(is(newdata, "STF") || is(newdata, "STS")) newdata <- as(newdata, "STI") # from here on every data set is assumed to be STI* if(dimGeom == 2) { df = as(data, "data.frame")[,c(1,2,4)] df$time = as.numeric(df$time)*stAni query = as(newdata, "data.frame")[,c(1,2,4)] query$time = as.numeric(query$time)*stAni } else { df = as(data, "data.frame")[,c(1,2,3,5)] df$time = as.numeric(df$time)*stAni query = as(newdata, "data.frame")[,c(1,2,3,5)] query$time = as.numeric(query$time)*stAni } df <- as.matrix(df) query <- as.matrix(query) res <- data.frame(var1.pred = rep(NA, nrow(query)), var1.var = rep(NA, nrow(query)), var1TG.pred = rep(NA, nrow(query)), var1TG.var = rep(NA, nrow(query))) if(progress) pb = txtProgressBar(style = 3, max = nrow(query)) nb <- t(apply(get.knnx(df, query, ceiling(bufferNmax*nmax))[[1]],1,sort)) for (i in 1:nrow(query)) { nghbrData <- data[nb[i, ], , drop = FALSE] if(bufferNmax > 1) { nghbrCov <- covfn.ST(nghbrData, newdata[i, , drop = FALSE], modelList) nghbrData <- nghbrData[sort(order(nghbrCov, decreasing=T)[1:nmax]), , drop = FALSE] } res[i,] <- krigeSTTg(formula, nghbrData, newdata[i, , drop = FALSE], modelList, lambda)@data if(progress) setTxtProgressBar(pb, i) } if(progress) close(pb) if (clnd %in% c("STI", "STS", "STF")) { newdata <- addAttrToGeom(newdata, as.data.frame(res)) newdata <- switch(clnd, STI = as(newdata, "STIDF"), STS = as(newdata, "STSDF"), STF = as(newdata, "STFDF")) } else { newdata@data <- cbind(newdata@data, res) newdata <- as(newdata, clnd) } newdata } gstat/R/gstat.formula.predict.R0000644000176200001440000000427114646417261016156 0ustar liggesusers# $Id: gstat.formula.predict.q,v 1.14 2008-02-19 10:01:22 edzer Exp $ "gstat.formula.predict" <- function (formula, newdata, na.action, BLUE.estimates = FALSE, xlev = NULL) { if (is(newdata, "SpatialPolygons")) { # locs = coordinates(getSpatialPolygonsLabelPoints(newdata)) -- deprecated, now use: locs = t(sapply(slot(newdata, "polygons"), function(x) slot(x, "labpt"))) SpatialPoints(locs, slot(newdata, "proj4string")) locs = coordinates(locs) colnames(locs) = c("x", "y") if (is(newdata, "SpatialPolygonsDataFrame")) newdata = as.data.frame(newdata) else newdata = data.frame(a = rep(1, nrow(locs))) } else if (is(newdata, "SpatialLines")) { # locs = coordinates(getSpatialLinesMidPoints(newdata)) -- deprecated, now use: ret = lapply(newdata@lines, function(x) sapply(x@Lines, function(X) apply(X@coords, 2, mean) ) ) ret = t(sapply(ret, function(x) apply(x, 1, mean))) locs = coordinates(SpatialPoints(ret, slot(newdata, "proj4string"))) colnames(locs) = c("x", "y") if (is(newdata, "SpatialLinesDataFrame")) newdata = as.data.frame(newdata) else newdata = data.frame(a = rep(1, nrow(locs))) } else { if (gridded(newdata)) fullgrid(newdata) = FALSE locs = coordinates(newdata) newdata = as.data.frame(newdata) } # resolve formula: terms.f = delete.response(terms(formula)) mf.f = model.frame(terms.f, newdata, na.action = na.action, xlev = xlev) X = model.matrix(terms.f, mf.f) if (BLUE.estimates) { # fake the whole thing to get a matrix with BLUE parameter estimates: cnames = colnames(X) X = matrix(0, ncol(X), ncol(X)) diag(X) = 1 locs = locs[1,,drop=FALSE] if (ncol(X) > 1) { for (i in 2:ncol(X)) locs = rbind(locs, locs[1,]) } rownames(locs) = cnames } if (NROW(locs) != NROW(X)) { # NA's were filtered in X, but not in coords: mf.f = model.frame(terms.f, newdata, na.action = na.pass) valid.pattern = !(apply(mf.f, 1, function(x) any(is.na(x)))) X = model.matrix(terms.f, mf.f[valid.pattern, , drop = FALSE]) locs = locs[valid.pattern, ] if (NROW(locs) != NROW(X)) stop("NROW(locs) != NROW(X): this should not occur") } list(locations = as.matrix(locs), X = as.matrix(X)) } gstat/R/print.variogramModel.R0000644000176200001440000000130014646417261016030 0ustar liggesusers# $Id: print.variogramModel.q,v 1.5 2009-02-20 13:53:38 edzer Exp $ "print.variogramModel" = function (x, ...) { df = data.frame(x) shape.models = c("Mat", "Exc", "Cau", "Ste") if (!any(match(df[, "model"], shape.models, nomatch=0))) df$kappa = NULL if (!any(df[, "anis2"] != 1)) { df$anis2 = NULL df$ang2 = NULL df$ang3 = NULL if (!any(df[, "anis1"] != 1)) { df$anis1 = NULL df$ang1 = NULL } } if (any(match(df[, "model"], "Tab", nomatch=0))) { df$maxdist = df$range df$range = NULL print(df, ...) cat("covariance table:\n") tab = attr(x, "table") idx = round(seq(1, length(tab), length=6)) print(tab[idx]) } else print(df, ...) invisible(x) } gstat/R/predict.gstat.R0000644000176200001440000002322014730021711014466 0ustar liggesusers# $Id: predict.gstat.q,v 1.35 2009-11-02 21:33:17 edzer Exp $ predict.gstat <- function (object, newdata, block = numeric(0), nsim = 0, indicators = FALSE, BLUE = FALSE, debug.level = 1, mask, na.action = na.pass, sps.args = list(n = 500, type = "regular", offset = c(.5, .5)), ...) { if (missing(object) || length(object$data) < 1) stop("no data available") if (!inherits(object, "gstat")) stop("first argument should be of class gstat") to_stars = FALSE to_sf = if (inherits(newdata, c("sf", "sfc", "stars"))) { to_stars = inherits(newdata, "stars") newdata = as(newdata, "Spatial") TRUE } else FALSE if (!is.null(object$locations) && inherits(object$locations, "formula") && !(is(newdata, "Spatial"))) { coordinates(newdata) = object$locations return.sp = FALSE } else return.sp = TRUE max_dist = getMaxDist(object$data, newdata) .Call(gstat_init, as.integer(debug.level)) bl_weights = numeric(0) if (!missing(mask)) { cat("argument mask is deprecated:") stop("use a missing value pattern in newdata instead") } nvars = length(object$data) new.X = NULL for (i in 1:length(object$data)) { name = names(object$data)[i] d = object$data[[i]] if (!is.null(d$data)) { if (!identical(d$data@proj4string@projargs, newdata@proj4string@projargs)) { print(proj4string(d$data)) print(proj4string(newdata)) stop(paste(name, ": data item in gstat object and newdata have different coordinate reference systems")) } } if (d$nmax == Inf) nmax = as.integer(-1) else nmax = as.integer(d$nmax) nmin = as.integer(max(0, d$nmin)) if (d$maxdist == Inf) maxdist = as.numeric(-1) else maxdist = d$maxdist if (d$dummy) { # tr = terms(d$locations) if (is.null(d$beta) || length(d$beta) == 0) stop("dummy data should have beta defined") if (d$degree != 0) stop("dummy data cannot have non-zero degree arg; use formula") # loc.dim = length(attr(tr, "term.labels")) loc.dim = dim(coordinates(newdata))[[2]] .Call(gstat_new_dummy_data, as.integer(loc.dim), as.integer(d$has.intercept), as.double(d$beta), nmax, nmin, maxdist, as.integer(d$vfn), as.integer(is.projected(newdata)), as.integer(d$vdist)) raw = list(xlevels = NULL) } else { if (is.null(d$weights)) w = numeric(0) else w = d$weights raw = gstat.formula(d$formula, d$data) .Call(gstat_new_data, as.double(raw$y), as.double(raw$locations), as.double(raw$X), as.integer(raw$has.intercept), as.double(d$beta), nmax, nmin, maxdist, as.integer(d$force), as.integer(d$vfn), as.numeric(w), double(0.0), as.integer(d$degree), as.integer(is.projected(d$data)), as.integer(d$vdist), as.double(d$lambda), as.integer(d$omax)) } if (!is.null(object$model[[name]])) load.variogram.model(object$model[[name]], c(i - 1, i - 1), max_dist = max_dist) raw = gstat.formula.predict(d$formula, newdata, na.action = na.action, (length(BLUE) == 2 && BLUE[2]), xlev = raw$xlevels) if (is.null(new.X)) new.X = raw$X else new.X = cbind(new.X, raw$X) if (i > 1) { for (j in 1:(i - 1)) { cross = cross.name(names(object$data)[j], name) if (!is.null(object$model[[cross]])) load.variogram.model(object$model[[cross]], c(i - 1, j - 1), max_dist = max_dist) } } } if (!is.null(object$set)) gstat.load.set(object$set) if (!is.null(object$merge)) gstat.load.merge(object) if (is(newdata, "SpatialPolygons")) { pol = newdata@polygons if (length(pol) != nrow(raw$locations)) stop("polygons and center points length mismatch") block = matrix(NA, 0, 2) nd = as(newdata, "SpatialPolygons") block.cols = rep(as.numeric(NA), length(pol)) for (i in seq(along.with = pol)) { sps.args$x = nd[i] cc = coordinates(do.call("spsample", sps.args)) cc[,1] = cc[,1] - raw$locations[i,1] cc[,2] = cc[,2] - raw$locations[i,2] block.cols[i] = nrow(block) + 1 block = rbind(block, cc) } if (length(pol) == 1) block.cols = 2 } else if (is(newdata, "SpatialLines")) { lin = newdata@lines if (length(lin) != nrow(raw$locations)) stop("lines and line midpoints length mismatch") block = matrix(NA, 0, 2) nd = as(newdata, "SpatialLines") block.cols = rep(as.numeric(NA), length(lin)) for (i in seq(along.with = lin)) { sps.args$x = nd[i] cc = coordinates(do.call("spsample", sps.args)) cc[,1] = cc[,1] - raw$locations[i,1] cc[,2] = cc[,2] - raw$locations[i,2] block.cols[i] = nrow(block) + 1 block = rbind(block, cc) } if (length(lin) == 1) block.cols = 2 } else if (!is.null(dim(block))) { # i.e., block is data.frame or matrix if (is.data.frame(block) && !is.null(block$weights)) { bl_weights = block$weights block$weights = NULL } block = data.matrix(block) # converts to numeric block.cols = ncol(block) } else { block = as.numeric(block) # make sure it's not integer block.cols = numeric(0) } # handle NA's in the parts of newdata used: valid.pattern = NULL if (any(is.na(raw$locations)) || any(is.na(new.X))) { valid.pattern = !(apply(cbind(raw$locations, new.X), 1, function(x) any(is.na(x)))) raw$locations.all = raw$locations raw$locations = as.matrix(raw$locations[valid.pattern, ]) new.X = as.matrix(new.X[valid.pattern, ]) } if (nsim) { if (indicators == TRUE) nsim = -abs(nsim) # random path: randomly permute row indices perm = sample(seq(along.with = new.X[, 1])) ret = .Call(gstat_predict, as.integer(nrow(as.matrix(new.X))), as.double(as.vector(raw$locations[perm, ])), as.double(as.vector(new.X[perm,])), as.integer(block.cols), as.vector(block), as.vector(bl_weights), as.integer(nsim), as.integer(BLUE))[[1]] if (abs(nsim) == 1) colsel = seq(1, by=2, length.out=nvars) # pred1 var1 pred2 var2 ... else colsel = TRUE ret = data.frame(cbind(raw$locations, matrix(ret[order(perm), colsel], nrow(as.matrix(new.X)), abs(nsim) * nvars))) } else { ret = .Call(gstat_predict, as.integer(nrow(as.matrix(new.X))), as.double(as.vector(raw$locations)), as.vector(new.X), as.integer(block.cols), as.vector(block), as.vector(bl_weights), as.integer(nsim), as.integer(BLUE))[[1]] ret = data.frame(cbind(raw$locations, ret)) } .Call(gstat_exit, NULL) if (!is.null(valid.pattern) && any(valid.pattern)) { ret.all = data.frame(matrix(NA, length(valid.pattern), ncol(ret))) ret.all[, 1:ncol(raw$locations.all)] = raw$locations.all ret.all[valid.pattern, ] = ret ret = ret.all } if (abs(nsim) > 0) { names.vars = names(object$data) if (length(names.vars) > 1) names.vars = paste(rep(names.vars, each = abs(nsim)), paste("sim", 1:abs(nsim), sep = ""), sep = ".") else names.vars = paste("sim", 1:abs(nsim), sep = "") } else names.vars = create.gstat.names(names(object$data)) names(ret) = c(dimnames(raw$locations)[[2]], names.vars) if (return.sp) { if (is(newdata, "SpatialPolygons")) { row.names(ret) = sapply(newdata@polygons, function(x) slot(x, "ID")) ret = SpatialPolygonsDataFrame(as(newdata, "SpatialPolygons"), ret, match.ID = TRUE) } else if (is(newdata, "SpatialLines")) { row.names(ret) = sapply(newdata@lines, function(x) slot(x, "ID")) ret = SpatialLinesDataFrame(as(newdata, "SpatialLines"), ret, match.ID = TRUE) } else { coordinates(ret) = dimnames(raw$locations)[[2]] if (gridded(newdata)) { returnFullGrid = fullgrid(newdata) fullgrid(newdata) = FALSE ret = new("SpatialPixelsDataFrame", new("SpatialPixels", as(ret, "SpatialPoints"), grid = newdata@grid, grid.index = newdata@grid.index, bbox = newdata@bbox), data = ret@data, coords.nrs = ret@coords.nrs) fullgrid(ret) = returnFullGrid } } slot(ret, "proj4string") = slot(newdata, "proj4string") if (to_sf) { ret = if (to_stars) { if (!requireNamespace("stars", quietly = TRUE)) stop("stars required: install that first") # nocov if (nsim) sim_to_dimension(stars::st_as_stars(ret), nsim) else stars::st_as_stars(ret) } else { if (gridded(ret) && fullgrid(ret)) fullgrid(ret) = FALSE if (!requireNamespace("sf", quietly = TRUE)) stop("sf required: install that first") # nocov sf::st_as_sf(ret) } } } return(ret) } # call with: create.gstat.names(names(object$data)) # creates the names of the output columns in case of (multivariable) prediction create.gstat.names <- function(ids, names.sep = ".") { nvars = length(ids) names.vars = character(nvars * 2 + nvars * (nvars - 1)/2) pos = 1 for (i in 1:length(ids)) { name = ids[i] names.vars[1 + (i - 1) * 2] = paste(name, "pred", sep = names.sep) names.vars[2 + (i - 1) * 2] = paste(name, "var", sep = names.sep) if (i > 1) { for (j in 1:(i - 1)) { cross = paste(ids[j], name, sep = names.sep) names.vars[nvars * 2 + pos] = paste("cov", cross, sep = names.sep) pos = pos + 1 } } } return(names.vars) } getMaxDist = function(dataLst, newdata) { spBbox <- SpatialPoints(cbind(newdata@bbox[cbind(c(1,1,1,1), c(1,2,1,1))], newdata@bbox[cbind(c(2,2,2,2), c(1,1,1,2))]), proj4string = newdata@proj4string) d <- c(spDists(spBbox)[cbind(c(1,3),c(2,4))]) # d = apply(bbox(newdata), 1, diff) if (!is.null(dataLst[[1]]$data)) { spBbox2 <- SpatialPoints(cbind(dataLst[[1]]$data@bbox[cbind(c(1,1,1,1), c(1,2,1,1))], dataLst[[1]]$data@bbox[cbind(c(2,2,2,2), c(1,1,1,2))]), proj4string = dataLst[[1]]$data@proj4string) d2 <- c(spDists(spBbox2)[cbind(c(1,3),c(2,4))]) # d2 = apply(bbox(dataLst[[1]]$data), 1, diff) d = apply(rbind(d,d2), 2, max) # there are pathetic cases where this would not be sufficient } if (length(d) == 2) d = c(d, 0) stopifnot(length(d) == 3) d } gstat/R/plot.gstatVariogram.R0000644000176200001440000001130614646417261015703 0ustar liggesusers# $Id: plot.gstatVariogram.q,v 1.15 2007-06-08 18:03:25 edzer Exp $ "plot.gstatVariogram" <- function (x, model = NULL, ylim, xlim, xlab = "distance", ylab = attr(x, "what"), panel = vgm.panel.xyplot, multipanel = TRUE, plot.numbers = FALSE, scales = list(), ids = x$id, group.id = TRUE, skip, layout, ...) { if (missing(ylim)) { ylim = c(min(0, 1.04 * min(x$gamma)), 1.04 * max(x$gamma)) ylim.set = FALSE } else ylim.set = TRUE if (missing(xlim)) xlim = c(0, 1.04 * max(x$dist)) labels = NULL shift = 0.03 if (is.numeric(plot.numbers)) { shift = plot.numbers plot.numbers = TRUE } if (plot.numbers == TRUE) labels = as.character(x$np) if (length(unique(x$dir.ver)) > 1 || any(x$dir.ver != 0)) warning("vertical directions are not dealt with -- yet!") if (length(unique(x$dir.hor)) > 1 && group.id == TRUE) { # directional, grouped: if (multipanel) { if (length(levels(ids)) > 1) { # multivariate directional: xyplot(gamma ~ dist | as.factor(dir.hor), data = x, type = c("p", "l"), xlim = xlim, ylim = ylim, xlab = xlab, ylab = ylab, groups = ids, scales = scales, ...) } else # univariate directional, multipanel: xyplot(gamma ~ dist | as.factor(dir.hor), subscripts = TRUE, panel = panel, data = x, xlim = xlim, ylim = ylim, xlab = xlab, ylab = ylab, direction = x$dir.hor, labels = labels, model = model, shift = shift, mode = "directional", scales = scales, ...) } else { # univariate directional, using symbol/color to distinguish pch = as.integer(as.factor(x$dir.hor)) xyplot(gamma ~ dist, data = x, type = c("p", "l"), groups = pch, xlim = xlim, ylim = ylim, xlab = xlab, ylab = ylab, pch = pch, scales = scales, ...) } } else if (length(unique(ids)) > 1) { # multivariable: n = floor(sqrt(2 * length(unique(ids)))) if (missing(skip)) { skip = NULL for (row in n:1) for (col in 1:n) skip = c(skip, row < col) } if (missing(layout)) layout = c(n,n) if (missing(scales)) scales = list(y = list(relation = "free")) else if (!is.null(scales$relation) && scales$relation == "same") ylim.set = TRUE if (length(unique(x$dir.hor)) > 1) { # multiv.; directional groups if (ylim.set) { xyplot(gamma ~ dist | id, data = x, type = c("p", "l"), xlim = xlim, ylim = ylim, xlab = xlab, ylab = ylab, groups = as.factor(x$dir.hor), layout = layout, skip = skip, scales = scales, ...) } else { xyplot(gamma ~ dist | id, data = x, type = c("p", "l"), xlim = xlim, xlab = xlab, ylab = ylab, groups = as.factor(x$dir.hor), layout = layout, skip = skip, scales = scales, ...) } } else { # non-multi-directional, multivariable if (ylim.set) { xyplot(gamma ~ dist | id, data = x, xlim = xlim, ylim = ylim, xlab = xlab, ylab = ylab, ids = ids, panel= panel, labels = labels, scales = scales, layout = layout, skip = skip, prepanel = function(x, y) list(ylim = c(min(0, y), max(0, y))), model = model, direction = c(x$dir.hor[1], x$dir.ver[1]), shift = shift, mode = "cross", ...) } else { xyplot(gamma ~ dist | id, data = x, xlim = xlim, xlab = xlab, ylab = ylab, ids = ids, panel = panel, labels = labels, scales = scales, layout = layout, skip = skip, prepanel = function(x, y) list(ylim = c(min(0, y), max(0, y))), model = model, direction = c(x$dir.hor[1], x$dir.ver[1]), shift = shift, mode = "cross", ...) } } } else # non multi-directional, univariable -- mostly used of all: xyplot(gamma ~ dist, data = x, panel = panel, xlim = xlim, ylim = ylim, xlab = xlab, ylab = ylab, labels = labels, model = model, direction = c(x$dir.hor[1], x$dir.ver[1]), shift = shift, mode = "direct", scales = scales, ...) } "plot.variogramMap" <- function(x, np = FALSE, skip, threshold, ...) { x = x$map if (!is(x, "SpatialPixelsDataFrame")) stop("x should be of class, or extend, SpatialPixelsDataFrame") if (np) start = 2 else start = 1 idx = seq(start, ncol(x@data), by=2) n = floor(sqrt(length(idx) * 2)) if (missing(skip)) { skip = NULL for (row in n:1) for (col in 1:n) skip = c(skip, row < col) } if (!(missing(threshold))) x = x[x[[2]] >= threshold, ] levelplot(values ~ dx + dy | ind, as.data.frame(stack(x, select = idx)), asp = mapasp(x), layout = c(n, n), skip = skip, ...) } gstat/R/krige0.R0000644000176200001440000001064414646417261013121 0ustar liggesusersextractFormula = function(formula, data, newdata) { # extract y and X from data: m = model.frame(terms(formula), as(data, "data.frame"), na.action = na.fail) y = model.extract(m, "response") if (length(y) == 0) stop("no response variable present in formula") Terms = attr(m, "terms") X = model.matrix(Terms, m) # extract x0 from newdata: terms.f = delete.response(terms(formula)) mf.f = model.frame(terms.f, newdata) #, na.action = na.action) x0 = model.matrix(terms.f, mf.f) list(y = y, X = X, x0 = x0) } idw0 = function(formula, data, newdata, y, idp = 2.0) { s = coordinates(data) s0 = coordinates(newdata) if (missing(y)) y = extractFormula(formula, data, newdata)$y D = 1.0 / (spDists(s0, s) ^ idp) sumD = apply(D, 1, sum) D %*% y / sumD } CHsolve = function(A, b) { # solves A x = b for x if A is PD symmetric #A = chol(A, LINPACK=TRUE) -> deprecated A = chol(A) # but use pivot=TRUE? backsolve(A, forwardsolve(A, b, upper.tri = TRUE, transpose = TRUE)) } krige0 <- function(formula, data, newdata, model, beta, y, ..., computeVar = FALSE, fullCovariance = FALSE) { if (inherits(data, "ST")) stopifnot(identical(data@sp@proj4string@projargs, newdata@sp@proj4string@projargs)) else stopifnot(identical(data@proj4string@projargs, newdata@proj4string@projargs)) lst = extractFormula(formula, data, newdata) X = lst$X x0 = lst$x0 if (missing(y)) y = lst$y ll = (!is.na(is.projected(data)) && !is.projected(data)) s = coordinates(data) s0 = coordinates(newdata) if (is(model, "variogramModel")) { require(gstat) V = variogramLine(model, dist_vector = spDists(s, s, ll), covariance = TRUE) v0 = variogramLine(model, dist_vector = spDists(s, s0, ll), covariance = TRUE) c0 = variogramLine(model, dist_vector = c(0), covariance = TRUE)$gamma } else { V = model(data, data, ...) v0 = model(data, newdata, ...) if (computeVar) { if (is(newdata, "SpatialLines") || is(newdata, "SpatialPolygons")) stop("varying target support (SpatialLines, SpatialPolygons) is not implemented") c0 = as.numeric(model(newdata[1, drop=FALSE], newdata[1, drop=FALSE])) # ?check this: provide TWO arguments, so model(x,y) can target # eventually Y, instead of measurements Z=Y+e # with e measurement error term e } } if (!missing(beta)) { # sk: skwts = CHsolve(V, v0) if (computeVar) var <- c0 - apply(v0*skwts, 2, sum) } else { # ok/uk -- need to estimate beta: skwts = CHsolve(V, cbind(v0, X)) ViX = skwts[,-(1:nrow(s0))] skwts = skwts[,1:nrow(s0)] beta = solve(t(X) %*% ViX, t(ViX) %*% y) if (computeVar) { Q = t(x0) - t(ViX) %*% v0 var <- c0 - apply(v0*skwts, 2, sum) + apply(Q * CHsolve(t(X) %*% ViX, Q), 2, sum) } } pred = x0 %*% beta + t(skwts) %*% (y - X %*% beta) if (computeVar) { if (fullCovariance) { corMat <- cov2cor(variogramLine(model, dist_vector = spDists(s0, s0), covariance = TRUE)) var <- corMat*matrix(sqrt(var) %x% sqrt(var), nrow(corMat), ncol(corMat)) } list(pred = pred, var = var) } else pred } # define variogram model FUNCTION that can deal with x and y # being of class SpatialPolygons OR SpatialPoints; SpatialGrid/Pixels are coerced to SpatialPolygons vgmArea = function(x, y = x, vgm, ndiscr = 16, verbose = FALSE, covariance = TRUE) { if (gridded(x)) x = as(x, "SpatialPolygons") if (gridded(y)) y = as(y, "SpatialPolygons") stopifnot(is(x, "SpatialPolygons") || is(x, "SpatialPoints")) stopifnot(is(y, "SpatialPolygons") || is(y, "SpatialPoints")) stopifnot(is(vgm, "variogramModel")) nx = length(x) ny = length(y) V = matrix(NA, nx, ny) if (verbose) pb = txtProgressBar(style = 3, max = nx) for (i in 1:nx) { if (is(x, "SpatialPolygons")) px = spsample(x[i,], ndiscr, "regular", offset = c(.5,.5)) else px = x[i,] for (j in 1:ny) { if (is(y, "SpatialPolygons")) py = spsample(y[j,], ndiscr, "regular", offset = c(.5,.5)) else py = y[j,] D = spDists(px, py) D[D == 0] = 1e-10 V[i,j] = mean(variogramLine(vgm, dist_vector = D, covariance = covariance)) } if (verbose) setTxtProgressBar(pb, i) } if (verbose) close(pb) V } gstat/R/plot.variogramCloud.R0000644000176200001440000000437514646417261015677 0ustar liggesusers# $Id: plot.variogramCloud.q,v 1.7 2007-10-18 10:13:13 edzer Exp $ "plot.variogramCloud" <- function (x, identify = FALSE, digitize = FALSE, xlim = c(0, max(x$dist)), ylim, # = c(0, max(x$gamma)), xlab = "distance", ylab = "semivariance", keep = FALSE, ...) { if (identify || digitize) { if (missing(ylim)) ylim = c(0, max(x$gamma)) dots = list(...) if ("log" %in% names(dots)) { log = dots$log if (grep("x", log) & xlim[1] == 0) xlim[1] = min(x$dist)/2 if (grep("y", log) & ylim[1] == 0) ylim[1] = min(x$gamma)/2 } plot(x$dist, x$gamma, xlim = xlim, ylim = ylim, xlab = xlab, ylab = ylab, ...) .BigInt = attr(x, ".BigInt") head = floor(x$np %/% .BigInt) + 1 tail = floor(x$np %% .BigInt) + 1 if (identify) { print("mouse-left identifies, mouse-right or Esc stops") labs = paste(head, tail, sep = ",") sel = identify(x$dist, x$gamma, labs, pos = keep) ret = data.frame(cbind(head, tail)[sel,, drop = FALSE]) } else { print("mouse-left digitizes, mouse-right closes polygon") poly = locator(n = 512, type = "l") if (!is.null(poly)) sel = point.in.polygon(x$dist, x$gamma, poly$x, poly$y) else stop("digitized selection is empty") ret = data.frame(cbind(head, tail)[sel == 1,,drop = FALSE]) } class(ret) = c("pointPairs", "data.frame") if (keep) { if (identify) { attr(x, "sel") = sel attr(x, "text") = labs[sel$ind] } else # digitize attr(x, "poly") = poly attr(x, "ppairs") = ret return(x) } else return(ret) } else { sel = attr(x, "sel") lab = attr(x, "text") poly = attr(x, "poly") if (!is.null(sel) && !is.null(lab)) { if (missing(ylim)) ylim = c(0, max(x$gamma)) plot(x$dist, x$gamma, xlim = xlim, ylim = ylim, xlab = xlab, ylab = ylab, ...) text(x$dist[sel$ind], x$gamma[sel$ind], labels=lab, pos= sel$pos) } else if (!is.null(poly)) { if (missing(ylim)) ylim = c(0, max(x$gamma)) plot(x$dist, x$gamma, xlim = xlim, ylim = ylim, xlab = xlab, ylab = ylab, ...) lines(poly$x, poly$y) } else { x$np = rep(1, length(x$gamma)) plot.gstatVariogram(x, xlim = xlim, ylim = ylim, xlab = xlab, ylab = ylab, ...) } } } gstat/R/ossfim.R0000644000176200001440000000143514646417261013236 0ustar liggesusers# $Id: ossfim.q,v 1.3 2006-02-10 19:01:07 edzer Exp $ "ossfim" <- function(spacings = 1:5, block.sizes = 1:5, model, nmax = 25, debug = 0) { n = floor(sqrt(nmax)) + 1 x = 0:(n-1) + .5 x = sort(c(-x, x)) ret = matrix(NA, length(spacings) * length(block.sizes), 3) r = 1 for (sp in spacings) { for (bl in block.sizes) { data.grid = data.frame(expand.grid(x * sp, x * sp), z = rep(1, length(x)^2)) names(data.grid) = c("x", "y", "z") gridded(data.grid) = c("x", "y") x0 = SpatialPoints(matrix(0, 1, 2)) kr = krige(z~1, data.grid, x0, block = c(bl, bl), model = model, nmax = nmax, set = list(debug = debug)) ret[r, ] = c(sp, bl, sqrt(kr[["var1.var"]][1])) r = r + 1 } } ret = data.frame(ret) names(ret) = c("spacing", "block.size", "kriging.se") ret } gstat/R/panel.pointPairs.R0000644000176200001440000000206614646417261015165 0ustar liggesusers# $Id: panel.pointPairs.q,v 1.3 2008-03-10 10:00:10 edzer Exp $ "panel.pointPairs" <- function (x, y, type = "p", pch = plot.symbol$pch, col, col.line = plot.line$col, col.symbol = plot.symbol$col, lty = plot.line$lty, cex = plot.symbol$cex, lwd = plot.line$lwd, pairs = pairs, line.pch = line.pch, ...) { x = as.numeric(x) y = as.numeric(y) if (length(x) > 0) { if (!missing(col)) { if (missing(col.line)) col.line = col if (missing(col.symbol)) col.symbol = col } plot.symbol = trellis.par.get("plot.symbol") plot.line = trellis.par.get("plot.line") lpoints(x = x, y = y, cex = cex, col = col.symbol, pch = pch, ...) if (!missing(pairs)) { for (i in seq(along.with = pairs[,1])) { xx = c(x[pairs[i,1]], x[pairs[i,2]]) yy = c(y[pairs[i,1]], y[pairs[i,2]]) llines(x = xx, y = yy, lty = lty, col = col.line, lwd = lwd) if (line.pch > 0) lpoints(mean(xx), mean(yy), pch = line.pch, col = col.line) } } } } gstat/R/show.vgms.R0000644000176200001440000000535314646417261013674 0ustar liggesusers# $Id: show.vgms.q,v 1.6 2008-12-15 14:27:29 edzer Exp $ "show.vgms" <- function(min = 1e-12 * max, max = 3, n = 50, sill = 1, range = 1, models = as.character(vgm()$short[c(1:17)]), nugget = 0, kappa.range = 0.5, plot = TRUE, ..., as.groups = FALSE) { zero.range.models = c("Nug", "Int", "Lin", "Err") # print(models) L = max(length(sill), length(range), length(nugget), length(models), length(kappa.range)) sill = rep(sill, length.out = L) range = rep(range, length.out = L) nugget = rep(nugget, length.out = L) i = 0 if (length(kappa.range) > 1) { # loop over kappa values for Matern model: if (missing(models)) models = "Mat" stopifnot(models == "Mat" || models == "Ste" || models == "Exc") data = matrix(NA, n * length(kappa.range), 2) v.level = rep("", n * length(kappa.range)) for (kappa in kappa.range) { v = vgm(sill[i+1], models, range[i+1], nugget = nugget[i+1], kappa = kappa) x = variogramLine(v, 0, 1, 0) data[(i*n+1), ] = as.matrix(x) x = variogramLine(v, max, n - 1, min) data[(i*n+2):((i+1)*n), ] = as.matrix(x) m.name = paste("vgm(", sill[i+1], ",\"", models, "\",", range, sep = "") if (nugget[i+1] > 0) m.name = paste(m.name, ",nugget=", nugget[i+1], sep = "") m.name = paste(m.name, ",kappa=", kappa, ")", sep = "") v.level[(i*n+1):((i+1)*n)] = rep(m.name, n) i = i + 1 } } else { models = rep(models, length.out = L) data = matrix(NA, n * length(models), 2) v.level = rep("", n * length(models)) for (m in models) { this.range = ifelse(!is.na(pmatch(m, zero.range.models)), 0, range[i+1]) v = vgm(sill[i+1], m, this.range, nugget = nugget[i+1], kappa = kappa.range) x = variogramLine(v, 0, 1, 0) data[(i*n+1), ] = as.matrix(x) x = variogramLine(v, max, n - 1, min) data[(i*n+2):((i+1)*n), ] = as.matrix(x) m.name = paste("vgm(", sill[i+1], ",\"", m, "\",", this.range, sep = "") if (nugget[i+1] > 0) m.name = paste(m.name, ",nugget=", nugget[i+1], sep = "") m.name = paste(m.name, ")", sep = "") v.level[(i*n+1):((i+1)*n)] = rep(m.name, n) i = i + 1 } } dframe = data.frame(semivariance = data[,2], distance = data[,1], model = factor(v.level, levels = unique(v.level))) vgm.panel = function(x,y, ...) { n = length(x) lpoints(x[1],y[1]) llines(x[2:n],y[2:n]) } vgm.panel2 = function(x, y, subscripts, groups, ...) { lpoints(0, 0, col = 1) panel.superpose(x, y, subscripts, groups, ...) } if (!plot) dframe else { if (as.groups) { model = 0 # avoid NOTE on cran check xyplot(semivariance ~ distance, groups = model, dframe[dframe$distance > 0,], panel = vgm.panel2, as.table = TRUE, auto.key = TRUE, type = 'l', ...) } else xyplot(semivariance ~ distance | model, dframe, panel = vgm.panel, as.table = TRUE, ...) } } gstat/R/gstat.cv.R0000644000176200001440000000525314646417261013471 0ustar liggesusers# $Id: gstat.cv.q,v 1.9 2009-10-30 16:11:21 edzer Exp $ "gstat.cv" <- function (object, nfold = nrow(object$data[[1]]$data), remove.all = FALSE, verbose = interactive(), all.residuals = FALSE, ...) { if (!inherits(object, "gstat")) stop("first argument should be of class gstat") var1 = object$data[[1]] data = var1$data formula = var1$formula if (all.residuals) { nc = length(object$data) ret = data.frame(matrix(NA, nrow(data), nc)) } else { cc = coordinates(data) rownames(cc) = NULL df = data.frame(matrix(as.numeric(NA), nrow(data), 2)) ret = SpatialPointsDataFrame(cc, df, proj4string = data@proj4string) } if (missing(nfold)) nfold = 1:nrow(data) if (length(nfold) == nrow(data)) fold = nfold else if (nfold < nrow(data)) fold = sample(nfold, nrow(data), replace = TRUE) else fold = 1:nrow(data) if (all.residuals || (remove.all && length(object$data) > 1)) { all.data = list() for (v in 1:length(object$data)) all.data[[v]] = object$data[[v]]$data } if (verbose) pb <- txtProgressBar(1,length(unique(fold)),style=3) for (i in sort(unique(fold))) { if (verbose) setTxtProgressBar(pb, i) sel = which(fold == i) object$data[[1]]$data = data[-sel, ] if (remove.all && length(object$data) > 1) { for (v in 2:length(object$data)) { varv = object$data[[v]] varv$data = all.data[[v]] #atv = gstat.formula(varv$formula, varv$data)$locations #at1 = gstat.formula(formula, data[sel, ])$locations atv = coordinates(varv$data) at1 = coordinates(data[sel,]) cc = rbind(atv, at1) rownames(cc) = NULL # as there will be duplicates all = SpatialPoints(cc, proj4string = data@proj4string) zd = zerodist(all) skip = zd[, 1] object$data[[v]]$data = varv$data[-skip, ] } } x = predict(object, newdata = data[sel, ], ...) if (all.residuals) { for (i in 1:length(object$data)) { var.i = object$data[[i]] data.i = all.data[[i]] formula.i = var.i$formula observed = gstat.formula(formula.i, data.i)$y[sel] pred.name = paste(names(object$data)[i], "pred", sep = ".") residual = as.numeric(observed - x[[pred.name]]) ret[sel, i] = residual } } else { ret[[1]][sel] = x[[1]] ret[[2]][sel] = x[[2]] } } if (verbose) cat("\n") if (! all.residuals) { names(ret) = names(x)[1:2] ret$observed = gstat.formula(formula, data)$y pred.name = paste(names(object$data)[1], "pred", sep = ".") ret$residual = ret$observed - ret[[pred.name]] var.name = paste(names(object$data)[1], "var", sep = ".") ret$zscore = ret$residual/sqrt(ret[[var.name]]) ret$fold = fold } else names(ret) = names(object$data) if (!is.null(object$locations)) ret = as.data.frame(ret) ret } gstat/R/fit.variogram.R0000644000176200001440000000766614646417261014522 0ustar liggesusers# $Id: fit.variogram.q,v 1.10 2008-12-15 14:27:29 edzer Exp $ "fit.variogram" <- function (object, model, fit.sills = TRUE, fit.ranges = TRUE, fit.method = 7, debug.level = 1, warn.if.neg = FALSE, fit.kappa = FALSE) { cl = match.call() if (missing(object)) stop("nothing to fit to") if (!inherits(object, "gstatVariogram") && !inherits(object, "variogramCloud")) stop("object should be of class gstatVariogram or variogramCloud") if (inherits(object, "variogramCloud")) object$np = rep(1, nrow(object)) if (length(unique(object$id)) > 1) stop("to use fit.variogram, variogram object should be univariable") if (missing(model)) stop("no model to fit") if (is(model, "variogramModelList")) { ret = lapply(model, function(x) fit.variogram(object, x, fit.sills = fit.sills, fit.ranges = fit.ranges, fit.method = fit.method, debug.level = debug.level, warn.if.neg = warn.if.neg, fit.kappa = fit.kappa)) sse = sapply(ret, function(x) attr(x, "SSErr")) return(ret[[which.min(sse)]]) } if (!inherits(model, "variogramModel")) stop("model should be of class variogramModel (use vgm)") if (fit.method == 5) stop("use function fit.variogram.reml() to use REML") if (length(fit.sills) < length(model$model)) fit.sills = rep(fit.sills, length(model$model)) if (length(fit.ranges) < length(model$model)) fit.ranges = rep(fit.ranges, length(model$model)) if (fit.method == 7 && any(object$dist == 0)) stop("fit.method 7 will not work with zero distance semivariances; use another fit.method value") if (any(is.na(model$psill)) || any(is.na(model$range))) model = vgm_fill_na(model, object) fit.ranges = fit.ranges & !(model$model %in% c("Nug", "Err")) # no ranges to fit for Nug/Err if (isTRUE(fit.kappa)) fit.kappa = seq(0.3, 5, 0.1) if (any(model$model %in% c("Mat", "Ste")) && length(fit.kappa) > 1) { f = function(x, o, m) { m[m$model %in% c("Mat", "Ste"), "kappa"] = x fit.variogram(o, m, fit.kappa = FALSE, fit.method = fit.method, debug.level = debug.level) # fits range } ret = lapply(fit.kappa, f, object, model) return(ret[[ which.min(sapply(ret, function(x) attr(x, "SSErr"))) ]]) } initialRange = model$range .Call(gstat_init, as.integer(debug.level)) .Call(gstat_load_ev, object$np, object$dist, object$gamma) load.variogram.model(model) ret = .Call(gstat_fit_variogram, as.integer(fit.method), as.integer(fit.sills), as.integer(fit.ranges)) .Call(gstat_exit, 0) model$psill = ret[[1]] model$range = ret[[2]] attr(model, "singular") = as.logical(ret[[3]]); attr(model, "SSErr") = ret[[4]] direct = attr(object, "direct") if (!is.null(direct)) { id = unique(object$id) if (any(direct[direct$id == id, "is.direct"]) && any(model$psill < 0)) { if (warn.if.neg) warning("partial sill or nugget fixed at zero value") fit.sills = model$psill > 0 model$psill[model$psill < 0] = 0.0 model$range = initialRange return(fit.variogram(object, model, fit.sills = fit.sills, fit.ranges = fit.ranges, fit.method = fit.method, debug.level = debug.level, warn.if.neg = warn.if.neg, fit.kappa = fit.kappa)) } } if (attr(model, "singular") && debug.level) { rat = mean(object$gamma) / mean(object$dist) if (rat > 1e6 || rat < 1e-6) print("a possible solution MIGHT be to scale semivariances and/or distances") } attr(model, "call") = cl model } vgm_fill_na = function(model, obj) { if (any(is.na(model$range))) { model[model$model %in% c("Nug", "Err"), "range"] = 0 model[!model$model %in% c("Nug", "Err"), "range"] = max(obj$dist) / 3 } if (any(model$model %in% "Nug") && is.na(model[model$model == "Nug","psill"])) model[model$model == "Nug", "psill"] = mean(head(obj$gamma, 3)) na_sills = is.na(model[model$model != "Nug", "psill"]) if (any(na_sills)) { n = length(model[model$model != "Nug",]$psill) model[model$model != "Nug", "psill"] = mean(tail(obj$gamma, 5)) / n } model } gstat/R/spplot.R0000644000176200001440000000121014646417261013246 0ustar liggesusersspplot.vcov = function(x, ...) { basenames = sub(".pred", "", names(x)[grep(".pred",names(x))]) n = length(basenames) names = NULL skip = NULL for (i in 1:n) { skp = rep(TRUE, n) pos = 1 if (i > 1) { for (j in 1:(i-1)) { names = c(names, paste("cov", basenames[j], basenames[i], sep = ".")) skp[pos] = FALSE pos = pos + 1 } } names = c(names, paste(basenames[i], ".var", sep = "")) skp[pos] = FALSE skip = c(skip, skp) } spplot(x, names, skip = skip, layout = c(n,n), as.table = TRUE, ...) } gstat/R/krige.cv.R0000644000176200001440000000345114646417261013446 0ustar liggesusers# $Id: krige.cv.q,v 1.18 2009-10-30 16:11:21 edzer Exp $ if (!isGeneric("krige.cv")) setGeneric("krige.cv", function(formula, locations, ...) standardGeneric("krige.cv")) krige.cv.locations = function (formula, locations, data = sys.frame(sys.frame(sys.parent())), model = NULL, ..., beta = NULL, nmax = Inf, nmin = 0, maxdist = Inf, nfold = nrow(data), verbose = interactive(), debug.level = 0) { gstat.cv(gstat(g = NULL, id = "var1", formula = formula, locations = locations, data = data, model = model, beta = beta, nmax = nmax, nmin = nmin, maxdist = maxdist, ...), nfold = nfold, verbose = verbose, debug.level = debug.level) } setMethod("krige.cv", c("formula", "formula"), krige.cv.locations) krige.cv.spatial = function (formula, locations, model = NULL, ..., beta = NULL, nmax = Inf, nmin = 0, maxdist = Inf, nfold = nrow(locations), verbose = interactive(), debug.level = 0) { # data = locations gstat.cv(gstat(g = NULL, id = "var1", formula = formula, data = locations, model = model, beta = beta, nmax = nmax, nmin = nmin, maxdist = maxdist, ...), nfold = nfold, verbose = verbose, debug.level = debug.level) } setMethod("krige.cv", c("formula", "Spatial"), krige.cv.spatial) krige.cv.sf = function (formula, locations, model = NULL, ..., beta = NULL, nmax = Inf, nmin = 0, maxdist = Inf, nfold = nrow(locations), verbose = interactive(), debug.level = 0) { # data = locations if (!requireNamespace("sf", quietly = TRUE)) stop("sf required: install that first") # nocov sf::st_as_sf(gstat.cv(gstat(g = NULL, id = "var1", formula = formula, data = as(locations, "Spatial"), model = model, beta = beta, nmax = nmax, nmin = nmin, maxdist = maxdist, ...), nfold = nfold, verbose = verbose, debug.level = debug.level)) } setMethod("krige.cv", c("formula", "sf"), krige.cv.sf) gstat/R/gstat.debug.R0000644000176200001440000000023514646417261014142 0ustar liggesusers# $Id: gstat.debug.q,v 1.3 2006-02-10 19:01:07 edzer Exp $ "gstat.debug" <- function(level = 0) { invisible(.Call(gstat_debug_level, as.integer(level))) } gstat/R/load.variogram.model.R0000644000176200001440000000244314646417261015742 0ustar liggesusers# $Id: load.variogram.model.q,v 1.7 2008-11-12 10:04:22 edzer Exp $ "load.variogram.model" <- function(model, ids = c(0, 0), max_dist = rep(-1.0, 3)) { if (missing(model)) stop("model is missing"); if (!inherits(model, "variogramModel")) stop("model should be of mode variogramModel (use function vgm)") if (any(model$range < 0.0)) { print(model) stop("variogram range can never be negative") } stopifnot(length(max_dist) == 3) anis = c(model$ang1, model$ang2, model$ang3, model$anis1, model$anis2) if (is.null(attr(model, "table"))) covtable = numeric(0) else { covtable = attr(model, "table") if (dim(model)[1] > 1 || model$model != "Tab") stop("table can only have one single model") } # max_dist hack here for Lin(0) models: # if (max_dist > 0) { # w = which(model$model %in% c("Lin") & model$range == 0) # if (length(w) > 0) { # model[w,"psill"] = max_dist * model[w,"psill"] # model[w,"range"] = max_dist # cat("Conversion into equivalent model:\n") # print(model) # } # } if (!any(model$model %in% c("Lin", "Pow"))) max_dist = rep(-1.0, 3) # ignore .Call(gstat_load_variogram, as.integer(ids), as.character(model$model), as.numeric(model$psill), as.numeric(model$range), as.numeric(model$kappa), as.numeric(anis), covtable, as.numeric(max_dist)) } gstat/R/print.gstat.R0000644000176200001440000000451714646417261014217 0ustar liggesusers# $Id: print.gstat.q,v 1.7 2006-02-10 19:01:07 edzer Exp $ "print.gstat" <- function (x, ...) { if (missing(x) || !inherits(x, "gstat")) stop("wrong call") data.names <- names(x$data) if (length(data.names)) cat("data:\n") for (n in data.names) { fstr = paste(x$data[[n]]$formula[c(2, 1, 3)], collapse = "") #lstr = paste(x$data[[n]]$locations[c(1, 2)], collapse = "") cat(n, ": formula =", fstr, ";") if (!is.null(x$data[[n]]$data)) { data.dim = dim(x$data[[n]]$data) cat(" data dim =", data.dim[1], "x", data.dim[2]) } else { if (x$data[[n]]$dummy) cat(" dummy data") else cat(" NULL data") } if (x$data[[n]]$nmax != Inf) cat(" nmax =", x$data[[n]]$nmax) if (x$data[[n]]$nmin > 0) cat(" nmin =", x$data[[n]]$nmin) if (x$data[[n]]$maxdist < Inf) cat(" radius =", x$data[[n]]$maxdist) if (x$data[[n]]$vfn > 1) cat(" variance function =", c("identity", "mu", "mu(1-mu)", "mu^2", "mu^3")[x$data[[n]]$vfn]) if (length(x$data[[n]]$beta) > 0) cat(" beta =", x$data[[n]]$beta) if (x$data[[n]]$degree > 0) cat(" degree =", x$data[[n]]$degree) cat("\n") } xx.names = xx = NULL for (n in data.names) { m = x$model[[n]] if (!is.null(m)) { xx = rbind(xx, m) if (nrow(m) == 1) xx.names = c(xx.names, n) else xx.names = c(xx.names, paste(n, "[", 1:nrow(m), "]", sep = "")) } } if (length(data.names) > 1) { for (j in 2:length(data.names)) { for (i in 1:(j - 1)) { n = cross.name(data.names[i], data.names[j]) m = x$model[[n]] if (!is.null(m)) { xx = rbind(xx, m) if (nrow(m) == 1) xx.names = c(xx.names, n) else xx.names = c(xx.names, paste(n, "[", 1:nrow(m), "]", sep = "")) } } } } if (!is.null(xx)) { cat("variograms:\n") row.names(xx) = xx.names print(xx, ...) } if (!is.null(x$set)) { s = gstat.set(x$set) for (i in 1:length(s)) cat(s[i], "\n") } if (!is.null(x$locations)) print(x$locations) invisible(x) } gstat/R/print.variogram.R0000644000176200001440000000021214646417261015050 0ustar liggesusers# $Id: print.variogram.q,v 1.3 2006-02-10 19:01:07 edzer Exp $ "print.gstatVariogram" <- function(x, ...) { print(data.frame(x), ...) } gstat/R/vgm.R0000644000176200001440000001110014646417261012515 0ustar liggesusers# $Id: vgm.q,v 1.12 2007-02-27 22:09:32 edzer Exp $ warn.angle3 = TRUE "vgm" <- function(psill = NA, model, range = NA, nugget, add.to, anis, kappa = 0.5, ..., covtable, Err = 0) { add.to.df = function(x, y) { x = rbind(x, y) row.names(x) = 1:nrow(x) return(x) } if (is.character(psill)) { # as of ``vgm("Sph")'' if (length(psill) > 1) { ret = lapply(psill, function(x) vgm(x)) class(ret) = c("variogramModelList", "list") return(ret) } # else: if (psill == "Nug") return(vgm(NA, "Nug", NA)) else return(vgm(NA, psill, NA, NA)) } stopifnot(length(psill) == 1) stopifnot(length(range) == 1) stopifnot(missing(nugget) || length(nugget) == 1) stopifnot(length(kappa) == 1) m = .Call(gstat_get_variogram_models, as.integer(0)) n = length(m) mf = factor(m, levels = m) if (missing(model)) { ml = .Call(gstat_get_variogram_models, as.integer(1)) mlf = factor(ml, levels = ml) return(data.frame(short = mf, long = mlf)) } if (length(model) > 1) { ret = lapply(model, function(x) vgm(,x)) class(ret) = c("variogramModelList", "list") return(ret) } table = NULL if (model == "Tab" && !missing(covtable)) { table = as.matrix(covtable) if (NCOL(table) != 2) stop("covtable should be a 2-column matrix with distance and cov.") range = max(table[,1]) if (min(table[,1]) != 0.0) stop("the first covariance value should be at distance 0.0") table = table[,2] mf = factor(c(m, "Tab"), levels = c(m, "Tab")) if (!missing(add.to) || !missing(nugget) || Err > 0) stop("cannot add submodels or nugget to covariance Table model") } else if (!any(m == model)) stop(paste("variogram model", model, "unknown\n")) if (missing(anis)) anis = c(0,0,0,1,1) if (length(anis) == 2) anis = c(anis[1], 0, 0, anis[2], 1) else if (length(anis) != 5) stop("anis vector should have length 2 (2D) or 5 (3D)") if (warn.angle3 && anis[3] != 0.0) { warn.angle3 = FALSE warning("you are using the third rotation angle; this code is based on the GSLIB2 code\nand must contain the bug described at the end of http://pangea.stanford.edu/ERE/research/scrf/software/gslib/bug/") } if (!is.na(range)) { if (model != "Nug") { if (model != "Lin" && model != "Err" && model != "Int") if (range <= 0.0) stop("range should be positive") else if(range < 0.0) stop("range should be non-negative") } else { if (range != 0.0) stop("Nugget should have zero range") if (anis[4] != 1.0 || anis[5] != 1.0) stop("Nugget anisotropy is not meaningful") } } if (!missing(nugget)) { ret = data.frame(model=mf[mf==model], psill=psill, range=range, kappa = kappa, ang1=anis[1], ang2=anis[2], ang3=anis[3], anis1=anis[4], anis2=anis[5]) n.vgm = data.frame(model=mf[mf=="Nug"], psill=nugget, range=0, kappa = 0.0, ang1=0.0, ang2=0.0, ang3=0.0, anis1=1.0, anis2=1.0) ret = add.to.df(n.vgm, ret) } else ret = data.frame(model=mf[mf==model], psill=psill, range=range, kappa = kappa, ang1=anis[1], ang2=anis[2], ang3=anis[3], anis1=anis[4], anis2=anis[5]) if (!missing(add.to)) ret = add.to.df(data.frame(add.to), ret) if (Err > 0) ret = add.to.df(data.frame(model=mf[mf=="Err"], psill=Err, range=0.0, kappa = kappa, ang1=anis[1], ang2=anis[2], ang3=anis[3], anis1=anis[4], anis2=anis[5]), ret) if (!is.null(table)) attr(ret, "table") = table class(ret) = c("variogramModel", "data.frame") ret } as.vgm.variomodel = function(m) { model = NULL if (m$cov.model == "exponential") model = "Exp" else if (m$cov.model == "circular") model = "Cir" else if (m$cov.model == "gaussian") model = "Gau" else if (m$cov.model == "linear") # model = "Lin" stop("no correct conversion available; use power model with power 1?") else if (m$cov.model == "matern") model = "Mat" else if (m$cov.model == "wave") model = "Wav" else if (m$cov.model == "power") model = "Pow" else if (m$cov.model == "spherical") model = "Sph" else if (m$cov.model == "pure.nugget") return(vgm(m$nugget + m$cov.pars[1], "Nug", 0)) else stop("variogram model not supported") # "cauchy", #,"cubic", # "gneiting", # "gneiting.matern", # "powered.exponential", # "wave") ) { vgm(m$cov.pars[1], model, m$cov.pars[2], m$nugget, kappa = m$kappa) } #$lambda #[1] 1 #$trend #[1] "cte" #$max.dist #[1] 1441.83 #attr(,"class") #[1] "variomodel" plot.variogramModel = function(x, cutoff, ..., type = 'l') { if (missing(cutoff)) stop("parameter cutoff needs to be specified") l = variogramLine(x, cutoff, ...) xyplot(gamma ~ dist, l, ylim = c(0, 1.04 * max(l$gamma)), xlim = c(0, max(l$dist)), type = type, xlab = "distance", ylab = "semivariance") } gstat/R/plot.pointPairs.R0000644000176200001440000000121714646417261015041 0ustar liggesusers# $Id: plot.pointPairs.q,v 1.4 2006-02-10 19:01:07 edzer Exp $ "plot.pointPairs" <- function(x, data, xcol = data$x, ycol = data$y, xlab = "x coordinate", ylab = "y coordinate", col.line = 2, line.pch = 0, main = "selected point pairs", ...) { if (inherits(data, "sf")) data = as(data, "Spatial") if (is(data, "SpatialPoints")) { cc = coordinates(data) xcol = cc[,1] ycol = cc[,2] xlab = colnames(cc)[1] ylab = colnames(cc)[2] asp = mapasp(data) } else asp = "iso" xyplot(ycol ~ xcol, aspect = asp, panel = panel.pointPairs, xlab = xlab, ylab = ylab, pairs = x, col.line = col.line, line.pch = line.pch, main = main, ...) } gstat/R/variogram.gstat.R0000644000176200001440000000204414646417261015043 0ustar liggesusers# $Id: variogram.gstat.q,v 1.9 2007-04-06 11:29:58 edzer Exp $ "variogram.gstat" = function (object, ...) { if (!inherits(object, "gstat")) stop("first argument should be of class gstat") y = list() locations = list() X = list() beta = list() grid = list() projected = TRUE for (i in seq(along.with = object$data)) { d = object$data[[i]] beta[[i]] = d$beta if (i > 1 && !identical(object$data[[1]]$data@proj4string@projargs, d$data@proj4string@projargs)) stop("data items in gstat object have different coordinate reference systems") raw = gstat.formula(d$formula, d$data) y[[i]] = raw$y locations[[i]] = raw$locations X[[i]] = raw$X grid[[i]] = raw$grid if (is(d$data, "Spatial")) projected = is.projected(d$data) if (d$degree != 0) stop("degree != 0: residual variograms wrt coord trend using degree not supported") } names(y) = names(locations) = names(X) = names(object$data) # call variogram.default() next: variogram(y, locations, X, trend.beta = beta, grid = grid, g = object, ..., projected = projected) } gstat/R/vgm.panel.R0000644000176200001440000000472514646417261013632 0ustar liggesusers# $Id: vgm.panel.q,v 1.7 2007-06-08 06:45:52 edzer Exp $ "get.direction.unitv" <- function(alpha, beta) { cb = cos(beta) c(cb * sin(alpha), cb * cos(alpha), sin(beta)) } "vgm.panel.xyplot" <- function (x, y, subscripts, type = "p", pch = plot.symbol$pch, col, col.line = plot.line$col, col.symbol = plot.symbol$col, lty = plot.line$lty, cex = plot.symbol$cex, ids, lwd = plot.line$lwd, model = model, direction = direction, labels, shift = shift, mode = mode, ...) { x <- as.numeric(x) y <- as.numeric(y) if (length(x) > 0) { if (!missing(col)) { if (missing(col.line)) col.line <- col if (missing(col.symbol)) col.symbol <- col } plot.symbol <- trellis.par.get("plot.symbol") plot.line <- trellis.par.get("plot.line") lpoints(x = x, y = y, cex = cex, col = col.symbol, pch = pch, type = type, ...) if (!is.null(labels)) ltext(x = x + shift * max(x), y = y, labels = labels[subscripts]) if (mode == "direct") { if (!missing(model) && !is.null(model)) { ang.hor <- pi * (direction[1]/180) ang.ver <- pi * (direction[2]/180) dir <- get.direction.unitv(ang.hor, ang.ver) ret <- variogramLine(model, max(x), dir = dir) llines(x = ret$dist, y = ret$gamma, lty = lty, col = col.line, lwd = lwd) } } else if (mode == "cross") { id <- as.character(ids[subscripts][1]) if (!missing(model) && !is.null(model)) { if (inherits(model, "gstat")) m = model$model else m = model if (!is.list(m)) stop("model argument not of class gstat or list") if (is.list(m) && !is.null(m[[id]])) { ang.hor <- pi * (direction[1]/180) ang.ver <- pi * (direction[2]/180) dir <- get.direction.unitv(ang.hor, ang.ver) ret <- variogramLine(m[[id]], max(x), dir = dir) llines(x = ret$dist, y = ret$gamma, lty = lty, col = col.line, lwd = lwd) } } } else if (mode == "directional") { if (!missing(model) && !is.null(model)) { dir <- c(1, 0, 0) if (!missing(direction)) { ang.hor <- pi * (direction[subscripts][1]/180.0) dir <- get.direction.unitv(ang.hor, 0) } ret <- variogramLine(model, max(x), dir = dir) llines(x = ret$dist, y = ret$gamma, lty = lty, col = col.line, lwd = lwd) } } } } gstat/R/fit.variogram.reml.R0000644000176200001440000000312614646417261015443 0ustar liggesusers# $Id: fit.variogram.reml.q,v 1.14 2009-11-02 21:33:17 edzer Exp $ "fit.variogram.reml" <- function (formula, locations, data, model, debug.level = 1, set, degree = 0) { if (missing(formula)) stop("nothing to fit to") if (!inherits(formula, "formula")) stop("first argument should be of class formula") if (!missing(locations)) { if (inherits(locations, "formula")) coordinates(data) = locations else if (is(locations, "Spatial")) data = as(locations, "SpatialPointsDataFrame") } if (!is(data, "SpatialPointsDataFrame")) stop("data should (now) be of class SpatialPointsDataFrame") if (missing(model)) stop("no model to fit") if (!inherits(model, "variogramModel")) stop("model should be of class variogramModel (use vgm)") fit.sills = rep(TRUE, length(model$model)) fit.ranges = rep(FALSE, length(model$model)) .Call(gstat_init, as.integer(debug.level)) ret = gstat.formula(formula, data) ret$y <- residuals(lm(formula, data)) .Call(gstat_new_data, as.double(ret$y), as.double(ret$locations), as.double(ret$X), as.integer(1), double(0), as.integer(-1), as.integer(0), as.double(-1), as.integer(0), as.integer(1), double(0), double(0), as.integer(degree), as.integer(is.projected(data)), as.integer(0), as.double(1.0), as.integer(0)) load.variogram.model(model) if (!missing(set)) gstat.load.set(set) ret = .Call(gstat_fit_variogram, as.integer(5), as.integer(fit.sills), as.integer(fit.ranges)) .Call(gstat_exit, 0) model$psill = ret[[1]] model$range = ret[[2]] model } gstat/R/hscat.R0000644000176200001440000000151314646417261013035 0ustar liggesusershscat = function(formula, data, breaks, pch = 3, cex = .6, mirror = FALSE, variogram.alpha = 0, as.table = TRUE, ...) { stopifnot(!missing(breaks)) x = variogram(formula, data, cloud = TRUE, cutoff = max(breaks), alpha = variogram.alpha, ...) x = as.data.frame(x) x$class = cut(x$dist, breaks = breaks) y = model.frame(formula, data)[[1]] x$xx = y[x$left] x$yy = y[x$right] if (mirror) x = data.frame( xx = c(x$yy, y[x$left]), yy = c(x$xx, y[x$right]), class = c(x$class, x$class)) lab = as.character(formula)[2] panel = function(x,y,subscripts, ...) { xr = c(min(x),max(x)) llines(xr, xr) lpoints(x,y,...) ltext(min(x), max(y), paste("r =", signif(cor(x,y),3)), adj=c(0,0.5)) } xyplot(xx~yy|class, x, panel = panel, main = "lagged scatterplots", xlab = lab, ylab = lab, as.table = as.table, ...) } gstat/R/krigeTg.R0000644000176200001440000000437314646417261013336 0ustar liggesusers# $Id: krigeTg.q,v 1.4 2009-07-07 15:42:39 edzer Exp $ phiInv <- function (x, lambda) if (lambda==0) log(x) else (x^lambda-1)/lambda phi <- function(x, lambda) if (lambda==0) exp(x) else (x*lambda+1)^(1/lambda) phiPrime <- function (x, lambda) if (lambda==0) exp(x) else (x*lambda+1)^(1/lambda-1) phiDouble <- function (x, lambda) if (lambda==0) exp(x) else lambda * (1/lambda - 1) * (lambda * x + 1)^(1/lambda-2) krigeTg <- function(formula, locations, newdata, model = NULL, ..., nmax = Inf, nmin = 0, maxdist = Inf, block = numeric(0), nsim = 0, na.action = na.pass, debug.level = 1, lambda = 1.0) { m = model.frame(terms(formula), as.data.frame(locations)) Y = model.extract(m, "response") if (length(Y) == 0) stop("no response variable present in formula") Terms = attr(m, "terms") X = model.matrix(Terms, m) has.intercept = attr(Terms, "intercept") if (ncol(X) > 1) stop("only formula with intercept allowed, e.g. y ~ 1") locations$value = phiInv(Y, lambda) locations$value1 = rep(1, length(locations$value)) OK = krige(value ~ 1, locations, newdata, model, nmax = nmax, nmin = nmin, maxdist = maxdist, block = block, nsim = nsim, na.action = na.action, debug.level = debug.level, ...) if (nsim > 0) { OK@data = as.data.frame(phi(OK@data,lambda)) return(OK) } # else: # estimate mu: g = gstat(formula = value ~ 1, # locations = locations, data = locations, model = model, nmax = nmax, nmin = nmin, maxdist = maxdist, ...) mu = predict(g, newdata = newdata, block = block, nsim = nsim, na.action = na.action, debug.level = debug.level, BLUE = TRUE) OK$muhat = mu$var1.pred SK = krige(value1 ~ 1, locations, newdata, model = model, beta = 0.0, nmax = nmax, nmin = nmin, maxdist = maxdist, block = block, nsim = nsim, na.action = na.action, debug.level = debug.level, ...) # find m: OK$m = (OK$var1.var - SK$var1.var)/(1 - SK$var1.pred) # copy SK output: OK$var1SK.pred = SK$var1.pred OK$var1SK.var = SK$var1.var # compute transGaussian kriging estimate & variance: OK$var1TG.pred = phi(OK$var1.pred, lambda) + phiDouble(mu$var1.pred, lambda) * (OK$var1.var/2 - OK$m) OK$var1TG.var = phiPrime(mu$var1.pred, lambda)^2 * OK$var1.var OK } gstat/R/zzz.R0000644000176200001440000000066614646417261012600 0ustar liggesusers# $Id: zzz.q,v 1.10 2006-02-10 19:01:07 edzer Exp $ ### NAMESPACE VERSION: .onLoad <- function(lib, pkg) { # remove the require() call for 2.0.0: # require(lattice) # .Call(gstat_init, as.integer(1)) } ### pre-NAMESPACE VERSION: ## ".First.lib" <- ## function(lib, pkg) { ## require(lattice) ## library.dynam("gstat", pkg, lib) ## .Call(gstat_init, as.integer(1)) ## } variogram <- function(object, ...) UseMethod("variogram") gstat/R/gstat.formula.R0000644000176200001440000000152514646417261014524 0ustar liggesusers# $Id: gstat.formula.q,v 1.8 2007-06-08 06:45:52 edzer Exp $ "gstat.formula" <- function (formula, data) { # check for duplicated pixels; if yes coerce to SpatialPointsDataFrame: if (is(data, "SpatialPixels") && anyDuplicated(data@grid.index) != 0) gridded(data) = FALSE m = model.frame(terms(formula), as(data, "data.frame"), na.action = na.fail) Y = model.extract(m, "response") if (length(Y) == 0) stop("no response variable present in formula") Terms = attr(m, "terms") X = model.matrix(Terms, m) has.intercept = attr(Terms, "intercept") if (gridded(data)) grid = gridparameters(data) else grid = numeric(0) xlevels = .getXlevels(Terms, m) list(y = Y, locations = coordinates(data), X = X, call = call, has.intercept = has.intercept, grid = as.double(unlist(grid)), xlevels = xlevels) } gstat/R/fit.lmc.R0000644000176200001440000000354414646417261013275 0ustar liggesusers# $Id: fit.lmc.q,v 1.8 2009-10-06 07:52:00 edzer Exp $ "fit.lmc" <- function (v, g, model, fit.ranges = FALSE, fit.lmc = !fit.ranges, correct.diagonal = 1.0, ...) { posdef = function(X) { q = eigen(X) d = q$values d[d < 0] = 0 q$vectors %*% diag(d, nrow = length(d)) %*% t(q$vectors) } if (!inherits(v, "gstatVariogram")) stop("v should be of class gstatVariogram") if (!inherits(g, "gstat")) stop("g should be of class gstat") if (!missing(model)) { if (!inherits(model, "variogramModel")) stop("model should be of class variogramModel") } n = names(g$data) for (i in 1:length(n)) { for (j in i:length(n)) { name = ifelse(i == j, n[i], cross.name(n[i], n[j])) x = v[v$id == name, ] if (nrow(x) == 0) stop(paste("gstatVariogram", name, "not present")) m = g$model[[name]] if (!missing(model)) m = model g$model[[name]] = fit.variogram(x, m, fit.ranges = fit.ranges, ...) } } if (fit.lmc) { m = g$model[[n[1]]] for (k in 1:nrow(m)) { psill = matrix(NA, nrow = length(n), ncol = length(n)) for (i in 1:length(n)) { for (j in i:length(n)) { name = ifelse(i == j, n[i], cross.name(n[i], n[j])) psill[i, j] = psill[j, i] = g$model[[name]][k, "psill"] } } psill = posdef(psill) diag(psill) = diag(psill) * correct.diagonal for (i in 1:length(n)) { for (j in i:length(n)) { name = ifelse(i == j, n[i], cross.name(n[i], n[j])) g$model[[name]][k, "psill"] = psill[i, j] } } } } g } gstat/R/gstatOptions.R0000644000176200001440000000061514646417261014433 0ustar liggesusers.gstatOptions <- new.env(FALSE, globalenv()) assign("gstat_progress", TRUE, envir = .gstatOptions) get_gstat_progress <- function() { get("gstat_progress", envir = .gstatOptions) } set_gstat_progress <- function(value) { stopifnot(is.logical(value)) stopifnot(length(value) == 1) assign("gstat_progress", value, envir = .gstatOptions) get_gstat_progress() } gstat/R/circEmbed.R0000644000176200001440000002131514646417261013612 0ustar liggesusers## Benedikt Gräler (52North), 2018-05-25: ## circulant embedding following: Davies, Tilman M., and David Bryant. "On ## circulant embedding for Gaussian random fields in R." Journal of Statistical ## Software 55.9 (2013): 1-21. ## See i.e. the suplementary files at (retreived 2018-05-25): ## https://www.jstatsoft.org/index.php/jss/article/downloadSuppFile/v055i09/v55i09.R # extend the grid # input: SpatialGrid/SpatialPixels/GridTopology # output: extended grid of class GridTopology ceExtGrid <- function(grid, ext=2) { if (!inherits(grid, "GridTopology")) { stopifnot(gridded(grid)) grid <- grid@grid } GridTopology(grid@cellcentre.offset, grid@cellsize, grid@cells.dim*ext) } # only for comaprission following the above paper # expand and wrap a grid on a torus + calc distances # input: SpatialGrid # output: distance matrix ceWrapOnTorusCalcDist <- function(grid, ext=2) { grid <- ceExtGrid(grid, ext) rangeXY <- grid@cellsize * grid@cells.dim MN.ext <- prod(grid@cells.dim) gridCoords <- coordinates(grid) mmat.ext <- matrix(rep(gridCoords[, 1], MN.ext), MN.ext, MN.ext) nmat.ext <- matrix(rep(gridCoords[, 2], MN.ext), MN.ext, MN.ext) mmat.diff <- mmat.ext - t(mmat.ext) nmat.diff <- nmat.ext - t(nmat.ext) mmat.torus <- pmin(abs(mmat.diff), rangeXY[1] - abs(mmat.diff)) nmat.torus <- pmin(abs(nmat.diff), rangeXY[2] - abs(nmat.diff)) sqrt(mmat.torus^2 + nmat.torus^2) } ## FFT preparation with only first row of cov-matrix ceWrapOnTorusCalcCovRow1 <- function(grid, vgmModel, ext=2) { grid <- ceExtGrid(grid, ext) stopifnot("variogramModel" %in% class(vgmModel)) rangeXY <- grid@cellsize * grid@cells.dim cenX <- seq(from = grid@cellcentre.offset[1], by = grid@cellsize[1], length.out = grid@cells.dim[1]) cenY <- seq(from = grid@cellcentre.offset[2], by = grid@cellsize[2], length.out = grid@cells.dim[2]) m.diff.row1 <- abs(cenX[1] - cenX) m.diff.row1 <- pmin(m.diff.row1, rangeXY[1] - m.diff.row1) n.diff.row1 <- abs(cenY[1] - cenY) n.diff.row1 <- pmin(n.diff.row1, rangeXY[2] - n.diff.row1) cent.ext.row1 <- expand.grid(m.diff.row1, n.diff.row1) D.ext.row1 <- matrix(sqrt(cent.ext.row1[, 1]^2 + cent.ext.row1[, 2]^2), grid@cells.dim[1], grid@cells.dim[2]) variogramLine(vgmModel, dist_vector = D.ext.row1, covariance = T) } # simulate GRF with given covariance structure using fft # @input # covMatRow1: the first row of the covariance matrix for the fft # n: number of simulations # cells.dim: the original dimrensions of the grid to clip from the larger embedded simulation # grid.index: grid.index of a SpatialPixels object to select the right pixels from the larger square-grid # @output # matrix where each column holds one simulated GRF corresponding to cells.dim (and grid.index if appropriate) ceSim <- function(covMatRow1, n=1, cells.dim, grid.index) { d <- dim(covMatRow1) dp <- prod(d) sdp <- sqrt(dp) prefix <- sqrt(Re(fft(covMatRow1, TRUE))) simFun <- function(x) { std <- rnorm(dp) realz <- prefix * (fft(matrix(std, d[1], d[2]))/sdp) as.numeric(Re(fft(realz, TRUE)/sdp)[1:cells.dim[1], 1:cells.dim[2]]) } simFunGridIndex <- function(x) { std <- rnorm(dp) realz <- prefix * (fft(matrix(std, d[1], d[2]))/sdp) as.numeric(Re(fft(realz, TRUE)/sdp)[1:cells.dim[1], 1:cells.dim[2]])[grid.index] } if (missing(grid.index)) do.call(cbind, lapply(1:n, simFun)) else do.call(cbind, lapply(1:n, simFunGridIndex)) } # computes the covariance matrixes and weights once, applied to series of # variables/simulations where each variable/simulation is stored in one column of # the multiVarMatrix copied from krige0 to avoid repeted calls to krige with # multiple, identical inversions of the weights matrix krigeMultiple <- function(formula, from, to, model, multiVarMatrix) { lst = extractFormula(formula, from, to) X = lst$X x0 = lst$x0 ll = (!is.na(is.projected(from)) && !is.projected(from)) s = coordinates(from) s0 = coordinates(to) V = variogramLine(model, dist_vector = spDists(s, s, ll), covariance = TRUE) v0 = variogramLine(model, dist_vector = spDists(s, s0, ll), covariance = TRUE) skwts = CHsolve(V, cbind(v0, X)) ViX = skwts[, -(1:nrow(s0))] skwts = skwts[, 1:nrow(s0)] idPredFun <- function(sim) { sim <- matrix(sim, ncol = 1) beta = solve(t(X) %*% ViX, t(ViX) %*% sim) x0 %*% beta + t(skwts) %*% (sim - X %*% beta) } apply(multiVarMatrix, 2, idPredFun) } ### pubic function ### # @input: # formula: definition of the dependent variable # data: optional Spatial*DataFrame for conditional simulation # newdata: SpatialGrid or SpatialPixels # model: variogram model of the GRF # n: number of desired simulations # ext: extension degree of the circulant embedding, default to 2 # @output # SpatialPixels or SpatailGridDataFrame with (additional) n columns holding one (un)conditional simulation each krigeSimCE <- function(formula, data, newdata, model, n = 1, ext = 2) { stopifnot(is(model, "variogramModel")) stopifnot(gridded(newdata)) if (!missing(data)) stopifnot(identical(data@proj4string@projargs, newdata@proj4string@projargs)) varName <- all.vars(formula[[2]]) condSim <- TRUE if (missing(data)) { condSim <- FALSE message("[No data provided: performing unconditional simulation.]") } else { message("[Performing conditional simulation.]") } # prepare covariance matrix covMat <- ceWrapOnTorusCalcCovRow1(newdata, model, ext = ext) # simulate sims <- ceSim(covMat, n, newdata@grid@cells.dim, newdata@grid.index) colnames(sims) <- paste0(varName, ".sim", 1:n) # bind simulations to newdata geometry if (!condSim) { if ("data" %in% slotNames(newdata)) newdata@data <- cbind(newdata@data, sims) else addAttrToGeom(newdata, as.data.frame(sims)) return(newdata) } # function call ends here if no data has been provided -> unconditional case ## conditioning # interpolate the observations to the simulation grid obsMeanField <- krige(formula, data, newdata, model) # interpolate to observation locations from the simulated grids for each simulation simMeanObsLoc <- krigeMultiple(as.formula(paste0("var1.pred ~", formula[[3]])), obsMeanField, data, model, sims) # interpolate from kriged mean sim at observed locations back to the grid for mean surface of the simulations simMeanFields <- krigeMultiple(as.formula(paste0(varName, "~", formula[[3]])), data, newdata, model, simMeanObsLoc) # add up the mean field and the corrected data sims <- obsMeanField@data$var1.pred + sims - simMeanFields # bind simulations to newdata geometry if ("data" %in% slotNames(newdata)) { newdata@data <- cbind(newdata@data, sims) return(newdata) } addAttrToGeom(newdata, as.data.frame(sims)) } ### # Note: to avoid the smoothing effect, the irregular observation locations could also be independently simulated by e.g. their surrounding grid values ### ## circulant embedding for ST-ocvariance functions with grids along one spatial and one temporal axis # inputs: # hDiscrete = c(hStep, hn): spatial step width and number of steps # tDiscrete = c(tStep, tn): temporal step length and number of steps # CAVE: hDiscrete and tDiscrete must have the correct spatial and temporal metrics ceWrapSpaceTimeOnTorusCalcCovRow1 <- function(hDiscrete, tDiscrete, vgmStModel, ext=2, turningLayers=TRUE) { stopifnot(is(vgmStModel) == "StVariogramModel") hDiscrete[2] <- hDiscrete[2]*ext tDiscrete[2] <- tDiscrete[2]*ext rangeST <- c(prod(hDiscrete), prod(tDiscrete)) cenX <- seq(from = 0, by = hDiscrete[1], length.out = hDiscrete[2]) cenY <- seq(from = 0, by = tDiscrete[1], length.out = tDiscrete[2]) m.diff.row1 <- abs(cenX[1] - cenX) m.diff.row1 <- pmin(m.diff.row1, rangeST[1] - m.diff.row1) n.diff.row1 <- abs(cenY[1] - cenY) n.diff.row1 <- pmin(n.diff.row1, rangeST[2] - n.diff.row1) cent.ext.row1 <- expand.grid(m.diff.row1, n.diff.row1) D.ext.row1 <- matrix(sqrt(cent.ext.row1[, 1]^2 + cent.ext.row1[, 2]^2), hDiscrete[2], tDiscrete[2]) colnames(cent.ext.row1) <- c("spacelag", "timelag") if (turningLayers) { return(matrix(tbOperator(vgmStModel, dist_grid = cent.ext.row1)$gamma, hDiscrete[2], tDiscrete[2])) } matrix(variogramSurface(vgmStModel, dist_grid = cent.ext.row1, covariance = TRUE)$gamma, hDiscrete[2], tDiscrete[2]) } gstat/R/stVariogramModels.R0000644000176200001440000010457714646417261015413 0ustar liggesusers# constructiong spatio-temporal variogram models vgmST <- function(stModel, ..., space, time, joint, sill, k, nugget, stAni, temporalUnit) { stopifnot(is.character(stModel) && length(stModel)==1) old.stModel <- stModel stModel <- strsplit(stModel, "_")[[1]][1] if (stModel == "productSum" && !missing(sill)) stop("The sill argument for the product-sum model has been removed due a change in notation of the spatio-temporal models. This affects as well how the spatial and temporal variograms are parameterised. Re-fit your model or use \"productSumOld\" instead.") if(!missing(sill)) if(sill <= 0) stop("\"sill\" must be positive.") if(!missing(k)) if(k <= 0) stop("\"k\" must be positive.") if(!missing(nugget)) if(nugget < 0) stop("\"nugget\" must be non-negative.") if(!missing(stAni)) if(stAni <= 0) stop("\"stAni\" must be positive.") vgmModel <- switch(stModel, separable = list(space = space, time = time, sill = sill), productSum = list(space = space, time = time, k = k), productSumOld = list(space = space, time = time, sill = sill, nugget = nugget), sumMetric = list(space = space, time = time, joint = joint, stAni = stAni), simpleSumMetric = list(space = space, time = time, joint = joint, nugget = nugget, stAni = stAni), metric = list(joint = joint, stAni = stAni), stop(paste("model", stModel, "unknown"))) vgmModel$stModel <- old.stModel if (!missing(temporalUnit)) attr(vgmModel, "temporal unit") = temporalUnit class(vgmModel) <- c("StVariogramModel", "list") vgmModel } # calculating spatio-temporal variogram surfaces variogramSurface <- function(model, dist_grid, covariance=FALSE) { stopifnot(inherits(model, "StVariogramModel")) stopifnot(all(c("spacelag", "timelag") %in% colnames(dist_grid))) if (covariance) { switch(strsplit(model$stModel, "_")[[1]][1], separable=covSurfSeparable(model, dist_grid), productSum=covSurfProdSum(model, dist_grid), productSumOld=covSurfProdSumOld(model, dist_grid), sumMetric=covSurfSumMetric(model, dist_grid), simpleSumMetric=covSurfSimpleSumMetric(model, dist_grid), metric=covSurfMetric(model, dist_grid), stop("Only \"separable\", \"productSum\", \"sumMetric\", \"simpleSumMetric\" and \"metric\" are implemented.")) } else { switch(strsplit(model$stModel, "_")[[1]][1], separable=vgmSeparable(model, dist_grid), productSum=vgmProdSum(model, dist_grid), productSumOld=vgmProdSumOld(model, dist_grid), sumMetric=vgmSumMetric(model, dist_grid), simpleSumMetric=vgmSimpleSumMetric(model, dist_grid), metric=vgmMetric(model, dist_grid), stop("Only \"separable\", \"productSum\", \"sumMetric\", \"simpleSumMetric\" and \"metric\" are implemented.")) } } ################################ ## separable model: C_s * C_t ## ################################ vgmSeparable <- function(model, dist_grid) { vs = variogramLine(model$space, dist_vector=dist_grid$spacelag)$gamma vt = variogramLine(model$time, dist_vector=dist_grid$timelag)$gamma cbind(dist_grid, "gamma" = model$sill*(vs+vt-vs*vt)) } covSeparable <- function(x, y, model, separate) { if(missing(separate)) separate <- inherits(x, "STF") && inherits(y, "STF") && length(x) > 1 && length(y) > 1 # the STF case if (inherits(x, "STF") && inherits(y, "STF")) { # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # compose the cov-matrix Sm = variogramLine(model$space, covariance = TRUE, dist_vector = ds)*model$sill Tm = variogramLine(model$time, covariance = TRUE, dist_vector = dt) if (separate) return(list(Sm = Sm, Tm = Tm)) else return(Tm %x% Sm) # kronecker product } # separate makes only sense if both of x and y inherit STF if (separate) stop("An efficient inversion by separating the covarinace model is only possible if both of \"x\" and \"y\" inherit \"STF\"") # the STI case if (inherits(x, c("STI", "sftime")) || inherits(y, c("STI", "sftime"))) { # make sure that now both are of type STI x <- as(x, "STI") y <- as(y, "STI") # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # compose the cov-matrix Sm = variogramLine(model$space, covariance = TRUE, dist_vector = ds)*model$sill Tm = variogramLine(model$time, covariance = TRUE, dist_vector = dt) return(Sm * Tm) } # the remaining cases, none of x and y is STI nor are both STF # make sure both are of type STS x <- as(x, "STS") y <- as(y, "STS") # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # re-arrange the spatial and temporal distances sMat <- matrix(NA, nrow(x@index), nrow(y@index)) tMat <- matrix(NA, nrow(x@index), nrow(y@index)) for(r in 1:nrow(x@index)) { sMat[r,] <- ds[x@index[r,1], y@index[,1]] tMat[r,] <- dt[x@index[r,2], y@index[,2]] } # compose the cov-matrix Sm = variogramLine(model$space, covariance = TRUE, dist_vector = sMat)*model$sill Tm = variogramLine(model$time, covariance = TRUE, dist_vector = tMat) return(Sm * Tm) } # covariance for the circulant embedding in ST covSurfSeparable <- function(model, dist_grid) { Sm = variogramLine(model$space, covariance = TRUE, dist_vector = dist_grid$spacelag)$gamma*model$sill Tm = variogramLine(model$time, covariance = TRUE, dist_vector = dist_grid$timelag)$gamma cbind(dist_grid, "gamma" = Tm * Sm) } ########################################### ## productSum model: C_s*C_t + C_s + C_t ## ########################################### vgmProdSumOld <- function(model, dist_grid) { .Deprecated("vgmProdSum", package = "gstat", msg="The former product-sum model is dprecited, consider to refit the new model specification", old = "vgmProdSumOld") vs = variogramLine(model$space, dist_vector=dist_grid$spacelag)$gamma vt = variogramLine(model$time, dist_vector=dist_grid$timelag)$gamma vn <- rep(model$nugget, length(vs)) vn[vs == 0 & vt == 0] <- 0 k <- (sum(model$space$psill)+sum(model$time$psill)-(model$sill+model$nugget))/(sum(model$space$psill)*sum(model$time$psill)) if (k <= 0 || k > 1/max(rev(model$space$psill)[1], rev(model$time$psill)[1])) k <- 10^6*abs(k) # distorting the model to let optim "hopefully" find suitable parameters cbind(dist_grid, "gamma" = as.vector(vs+vt-k*vs*vt+vn)) } covProdSumOld <- function(x, y, model) { .Deprecated("covProdSum", package = "gstat", msg="The former product-sum model is dprecited, consider to refit the new model specification", old = "covProdSumOld") stopifnot(inherits(x, c("STF", "STS", "STI", "sftime")) && inherits(y, c("STF", "STS", "STI", "sftime"))) # double check model for validity, i.e. k: k <- (sum(model$space$psill)+sum(model$time$psill)-model$sill)/(sum(model$space$psill)*sum(model$time$psill)) if (k <= 0 || k > 1/max(model$space$psill[model$space$model!="Nug"], model$time$psill[model$time$model!="Nug"])) stop(paste("k (",k,") is non-positive or too large: no valid model!",sep="")) # the STF case if (inherits(x, "STF") && inherits(y, "STF")) { # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # compose the cov-matrix vs = variogramLine(model$space, dist_vector = ds, covariance = TRUE) vt = variogramLine(model$time, dist_vector = dt, covariance = TRUE) return(model$sill-(vt %x% matrix(1,nrow(vs),ncol(vs)) + matrix(1,nrow(vt),ncol(vt)) %x% vs - k * vt %x% vs)) } # the STI case if(inherits(x, c("STI", "sftime")) || inherits(y, c("STI", "sftime"))) { # make sure that now both are of type STI x <- as(x, "STI") y <- as(y, "STI") # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # compose the cov-matrix vs = variogramLine(model$space, dist_vector = ds, covariance = TRUE) vt = variogramLine(model$time, dist_vector = dt, covariance = TRUE) return(model$sill-(vt + vs - k * vt * vs)) } # the remaining cases, none of x and y is STI nor are both STF # make sure both are of type STS x <- as(x, "STS") y <- as(y, "STS") # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # re-arrange the spatial and temporal distances sMat <- matrix(NA, nrow(x@index), nrow(y@index)) tMat <- matrix(NA, nrow(x@index), nrow(y@index)) for(r in 1:nrow(x@index)) { sMat[r,] <- ds[x@index[r,1], y@index[,1]] tMat[r,] <- dt[x@index[r,2], y@index[,2]] } # compose the cov-matrix vs = variogramLine(model$space, dist_vector = sMat, covariance = TRUE) vt = variogramLine(model$time, dist_vector = tMat, covariance = TRUE) return(model$sill-(vt + vs - k * vt * vs)) } # covariance for the circulant embedding in ST covSurfProdSumOld <- function(model, dist_grid) { .Deprecated("covSurfProdSum", package = "gstat", msg="The former product-sum model is dprecited, consider to refit the new model specification", old = "covSurfProdSumOld") vs = variogramLine(model$space, dist_vector = dist_grid$spacelag, covariance = TRUE)$gamma vt = variogramLine(model$time, dist_vector = dist_grid$timelag, covariance = TRUE)$gamma k <- (sum(model$space$psill)+sum(model$time$psill)-(model$sill+model$nugget))/(sum(model$space$psill)*sum(model$time$psill)) cbind(dist_grid, "gamma" = model$sill-(vt + vs - k * vt * vs)) } vgmProdSum <- function(model, dist_grid) { if(!is.null(model$sill)) # backwards compatibility vgmProdSumOld(model, dist_grid) vs = variogramLine(model$space, dist_vector=dist_grid$spacelag)$gamma vt = variogramLine(model$time, dist_vector=dist_grid$timelag)$gamma sill_s <- sum(model$space$psill) sill_t <- sum(model$time$psill) k <- model$k cbind(dist_grid, "gamma" = as.vector((k*sill_t+1)*vs + (k*sill_s+1)*vt-k*vs*vt)) } covProdSum <- function(x, y, model) { stopifnot(inherits(x, c("STF", "STS", "STI", "sftime")) && inherits(y, c("STF", "STS", "STI", "sftime"))) if(!is.null(model$sill)) # backwards compatibility covProdSumOld(x, y, model) # the STF case if (inherits(x, "STF") && inherits(y, "STF")) { # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # compose the cov-matrix vs = variogramLine(model$space, dist_vector = ds, covariance =TRUE) vt = variogramLine(model$time, dist_vector = dt, covariance =TRUE) return(vt %x% matrix(1,nrow(vs),ncol(vs)) + matrix(1,nrow(vt),ncol(vt)) %x% vs + model$k * vt %x% vs) } # the STI case if(inherits(x, c("STI", "sftime")) || inherits(y, c("STI", "sftime"))) { # make sure that now both are of type STI x <- as(x, "STI") y <- as(y, "STI") # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # compose the cov-matrix vs = variogramLine(model$space, dist_vector = ds, covariance=TRUE) vt = variogramLine(model$time, dist_vector = dt, covariance=TRUE) return(vt + vs + model$k * vt * vs) } # the remaining cases, none of x and y is STI nor are both STF # make sure both are of type STS x <- as(x, "STS") y <- as(y, "STS") # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # re-arrange the spatial and temporal distances sMat <- matrix(NA, nrow(x@index), nrow(y@index)) tMat <- matrix(NA, nrow(x@index), nrow(y@index)) for(r in 1:nrow(x@index)) { sMat[r,] <- ds[x@index[r,1], y@index[,1]] tMat[r,] <- dt[x@index[r,2], y@index[,2]] } # compose the cov-matrix vs = variogramLine(model$space, dist_vector = sMat, covariance = TRUE) vt = variogramLine(model$time, dist_vector = tMat, covariance = TRUE) return(vt + vs + model$k * vt * vs) } # covariance for the circulant embedding in ST covSurfProdSum <- function(model, dist_grid) { vs = variogramLine(model$space, dist_vector = dist_grid$spacelag, covariance = TRUE)$gamma vt = variogramLine(model$time, dist_vector = dist_grid$timelag, covariance = TRUE)$gamma cbind(dist_grid, "gamma" = vt + vs + model$k * vt * vs) } ######################################################### # sumMetric model: C_s + C_t + C_st (Gerard Heuvelink) ## ######################################################### vgmSumMetric <- function(model, dist_grid) { vs = variogramLine(model$space, dist_vector=dist_grid$spacelag)$gamma vt = variogramLine(model$time, dist_vector=dist_grid$timelag)$gamma h = sqrt(dist_grid$spacelag^2 + (model$stAni * as.numeric(dist_grid$timelag))^2) vst = variogramLine(model$joint, dist_vector=h)$gamma cbind(dist_grid, "gamma" = vs + vt + vst) } covSumMetric <- function(x, y, model) { stopifnot(inherits(x, c("STF", "STS", "STI", "sftime")) && inherits(y, c("STF", "STS", "STI", "sftime"))) # the STF case if (inherits(x, "STF") && inherits(y, "STF")) { # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # compose the cov-matrix Sm = variogramLine(model$space, covariance = TRUE, dist_vector = ds) Tm = variogramLine(model$time, covariance = TRUE, dist_vector = dt) h = sqrt((matrix(1,nrow(dt),ncol(dt)) %x% ds)^2 + (model$stAni * dt %x% matrix(1,nrow(ds),ncol(ds)))^2) Mm = variogramLine(model$joint, covariance = TRUE, dist_vector = h) return(matrix(1,nrow(Tm),ncol(Tm)) %x% Sm + Tm %x% matrix(1,nrow(Sm),ncol(Sm)) + Mm) } # the STI case if(inherits(x, c("STI", "sftime")) || inherits(y, c("STI", "sftime"))) { # make sure that now both are of type STI x <- as(x, "STI") y <- as(y, "STI") # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # compose the cov-matrix Sm = variogramLine(model$space, covariance = TRUE, dist_vector = ds) Tm = variogramLine(model$time, covariance = TRUE, dist_vector = dt) h = sqrt(ds^2 + (model$stAni * dt)^2) Mm = variogramLine(model$joint, covariance = TRUE, dist_vector = h) return(Sm + Tm + Mm) } # the remaining cases, none of x and y is STI nor are both STF # make sure both are of type STS x <- as(x, "STS") y <- as(y, "STS") # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # re-arrange the spatial and temporal distances sMat <- matrix(NA, nrow(x@index), nrow(y@index)) tMat <- matrix(NA, nrow(x@index), nrow(y@index)) for(r in 1:nrow(x@index)) { sMat[r,] <- ds[x@index[r,1], y@index[,1]] tMat[r,] <- dt[x@index[r,2], y@index[,2]] } # compose the cov-matrix Sm = variogramLine(model$space, covariance = TRUE, dist_vector = sMat) Tm = variogramLine(model$time, covariance = TRUE, dist_vector = tMat) h = sqrt(sMat^2 + (model$stAni * tMat)^2) Mm = variogramLine(model$joint, covariance = TRUE, dist_vector = h) return(Sm + Tm + Mm) } # covariance for the circulant embedding in ST covSurfSumMetric <- function(model, dist_grid) { Sm = variogramLine(model$space, covariance = TRUE, dist_vector = dist_grid$spacelag)$gamma Tm = variogramLine(model$time, covariance = TRUE, dist_vector = dist_grid$timelag)$gamma h = sqrt(dist_grid$spacelag^2 + (model$stAni * dist_grid$timelag)^2) Mm = variogramLine(model$joint, covariance = TRUE, dist_vector = h)$gamma cbind(dist_grid, "gamma" = Sm + Tm + Mm) } ################################ ## simplified sumMetric model ## ################################ vgmSimpleSumMetric <- function(model, dist_grid) { vs = variogramLine(model$space, dist_vector=dist_grid$spacelag)$gamma vt = variogramLine(model$time, dist_vector=dist_grid$timelag)$gamma h = sqrt(dist_grid$spacelag^2 + (model$stAni * as.numeric(dist_grid$timelag))^2) vm = variogramLine(model$joint, dist_vector=h)$gamma vn <- variogramLine(vgm(model$nugget, "Nug", 0), dist_vector=h)$gamma cbind(dist_grid, "gamma" = vs + vt + vm + vn) } covSimpleSumMetric <- function(x, y, model) { modelNew <- vgmST("sumMetric", space=model$space, time=model$time, joint=vgm(model$joint$psill[model$joint$model != "Nug"], model$joint$model[model$joint$model != "Nug"], model$joint$range[model$joint$model != "Nug"], model$nugget), stAni=model$stAni) if (!is.null(attr(model,"temporal unit"))) attr(modelNew,"temporal unit") <- attr(model,"temporal unit") covSumMetric(x, y, modelNew) } # covariance for the circulant embedding in ST covSurfSimpleSumMetric <- function(model, dist_grid) { modelNew <- vgmST("sumMetric", space=model$space, time=model$time, joint=vgm(model$joint$psill[model$joint$model != "Nug"], model$joint$model[model$joint$model != "Nug"], model$joint$range[model$joint$model != "Nug"], model$nugget), stAni=model$stAni) if (!is.null(attr(model,"temporal unit"))) attr(modelNew,"temporal unit") <- attr(model,"temporal unit") covSurfSumMetric(modelNew, dist_grid) } ################## ## metric model ## ################## vgmMetric <- function(model, dist_grid) { h = sqrt(dist_grid$spacelag^2 + (model$stAni * as.numeric(dist_grid$timelag))^2) cbind(dist_grid, "gamma" = variogramLine(model$joint, dist_vector=h)$gamma) } covMetric <- function(x, y, model) { stopifnot(inherits(x, c("STF", "STS", "STI", "sftime")) && inherits(y, c("STF", "STS", "STI", "sftime"))) # the STF case if (inherits(x, "STF") && inherits(y, "STF")) { # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # compose the cov-matrix h = sqrt((matrix(1,nrow(dt),ncol(dt)) %x% ds)^2 + (model$stAni * dt %x% matrix(1,nrow(ds),ncol(ds)))^2) Mm = variogramLine(model$joint, covariance = TRUE, dist_vector = h) return(Mm) } # the STI case if (inherits(x, c("STI", "sftime")) || inherits(y, c("STI", "sftime"))) { # make sure that now both are of type STI x <- as(x, "STI") y <- as(y, "STI") # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # compose the cov-matrix h = sqrt(ds^2 + (model$stAni * dt)^2) Mm = variogramLine(model$joint, covariance = TRUE, dist_vector = h) return(Mm) } # the remaining cases, none of x and y is STI nor are both STF # make sure both are of type STS x <- as(x, "STS") y <- as(y, "STS") # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # re-arrange the spatial and temporal distances sMat <- matrix(NA, nrow(x@index), nrow(y@index)) tMat <- matrix(NA, nrow(x@index), nrow(y@index)) for(r in 1:nrow(x@index)) { sMat[r,] <- ds[x@index[r,1], y@index[,1]] tMat[r,] <- dt[x@index[r,2], y@index[,2]] } # compose the cov-matrix h = sqrt(sMat^2 + (model$stAni * tMat)^2) Mm = variogramLine(model$joint, covariance = TRUE, dist_vector = h) return(Mm) } # covariance for the circulant embedding in ST covSurfMetric <- function(model, dist_grid) { h = sqrt(dist_grid$spacelag^2 + (model$stAni * dist_grid$timelag)^2) cbind(dist_grid, "gamma" = variogramLine(model$joint, covariance = TRUE, dist_vector = h)$gamma) } ########################### ## fitting ST variograms ## ########################### fit.StVariogram <- function(object, model, ..., method = "L-BFGS-B", lower, upper, fit.method = 6, stAni=NA, wles) { stopifnot(inherits(object, "StVariogram"), inherits(model, "StVariogramModel")) sunit <- attr(object$spacelag, "units") tunit <- attr(object$timelag, "units") tu.obj = attr(model, "temporal unit") if (!is.null(tu.obj)) stopifnot(identical(tunit, tu.obj)) object$timelag = as.numeric(object$timelag) # needed for R 4.1 object <- na.omit(object) ret <- model if(!missing(wles)) { if (wles) fit.method = 1 else fit.method = 6 } if (fit.method == 0) { attr(ret,"optim.output") <- "no fit" attr(ret, "MSE") <- mean((object$gamma - variogramSurface(model, data.frame(spacelag=object$dist, timelag=object$timelag))$gamma)^2) attr(ret, "spatial unit") <- sunit attr(ret, "temporal unit") <- tunit return(ret) } if ((fit.method == 7 || fit.method == 11) && is.null(model$stAni) && is.na(stAni)) { message("[An uninformed spatio-temporal anisotropy value of '1 (spatial unit)/(temporal unit)' is automatically selected. Consider providing a sensible estimate for stAni or using a different fit.method.]") stAni <- 1 } weightingFun <- switch(fit.method, function(obj, ...) obj$np, # 1 function(obj, gamma, ...) obj$np/gamma^2, # 2 function(obj, ...) obj$np, # 3 function(obj, gamma, ...) obj$np/gamma^2, # 4 function(obj, ...) stop("fit.method = 5 (REML), is not yet implemented"), # 5 function(obj, ...) 1, # 6 function(obj, curStAni, ...) if(is.na(stAni)) obj$np/(obj$dist^2+(curStAni*obj$timelag)^2) else obj$np/(obj$dist^2+(stAni*obj$timelag)^2), # 7 function(obj, ...) { dist <- obj$dist dist[dist == 0] <- min(dist[dist != 0], na.rm = TRUE) obj$np/dist^2 # 8, pure space, 0 dist = min (dist > 0) }, function(obj, ...) { dist <- obj$timelag dist[dist == 0] <- min(dist[dist != 0], na.rm = TRUE) obj$np/dist^2 }, # 9, pure time function(obj, gamma, ...) 1/gamma^2, # 10 function(obj, curStAni, ...) { if(is.na(stAni)) 1/(obj$dist^2+(curStAni*obj$timelag)^2) else 1/(obj$dist^2+(stAni*obj$timelag)^2) }, # 11 function(obj, ...) { dist <- obj$dist dist[dist == 0] <- min(dist[dist != 0], na.rm = TRUE) 1/(obj$dist^2) # 12, pure space }, function(obj, ...) { dist <- obj$timelag dist[dist == 0] <- min(dist[dist != 0], na.rm = TRUE) 1/(obj$timelag^2) }) # 13, pure time if(is.null(weightingFun)) stop(paste("fit.method =", fit.method, "is not implementend")) fitFun = function(par, trace = FALSE, ...) { curModel <- insertPar(par, model) gammaMod <- variogramSurface(curModel, data.frame(spacelag=object$dist, timelag=object$timelag))$gamma resSq <- (object$gamma - gammaMod)^2 resSq <- resSq * weightingFun(object, gamma=gammaMod, curStAni=curModel$stAni) if (trace) print(c(par, MSE = mean(resSq))) mean(resSq) # seems numerically more well behaved } if(missing(lower)) { min.s <- min(object$dist[object$dist>0])*0.05 # 5 % of the minimum distance larger 0 min.t <- min(object$dist[object$timelag>0])*0.05 # 5 % of the minimum time lag 0), pos <- sqrt(.Machine$double.eps) # at least positive lower <- switch(strsplit(model$stModel, "_")[[1]][1], separable=c(min.s, 0, min.t, 0, 0), productSum=c(0, min.s, 0, 0, min.t, 0, pos), productSumOld=c(0, min.s, 0, 0, min.t, 0, 0), sumMetric=c(0, min.s, 0, 0, min.t, 0, 0, pos, 0, pos), simpleSumMetric=c(0, min.s, 0, min.t, 0, pos, 0, 0, pos), metric=c(0, pos, 0, pos), stop("Only \"separable\", \"productSum\", \"sumMetric\", \"simpleSumMetric\" and \"metric\" are implemented.")) } if(missing(upper)) upper <- switch(strsplit(model$stModel, "_")[[1]][1], separable=c(Inf, 1, Inf, 1, Inf), productSum=Inf, productSumOld=Inf, sumMetric=Inf, simpleSumMetric=Inf, metric=Inf, stop("Only \"separable\", \"productSum\", \"sumMetric\", \"simpleSumMetric\" and \"metric\" are implemented.")) pars.fit <- optim(extractPar(model), fitFun, ..., method = method, lower = lower, upper = upper) ret <- insertPar(pars.fit$par, model) attr(ret,"optim.output") <- pars.fit attr(ret, "MSE") <- mean((object$gamma - variogramSurface(insertPar(pars.fit$par, model), data.frame(spacelag=object$dist, timelag=object$timelag))$gamma)^2) attr(ret, "spatial unit") <- sunit attr(ret, "temporal unit") <- tunit return(ret) } ########### ## tools ## ########### # insert parameters into models insertPar <- function(par, model) { switch(strsplit(model$stModel, "_")[[1]][1], separable=insertParSeparable(par, model), productSum=insertParProdSum(par, model), productSumOld=insertParProdSumOld(par, model), sumMetric=insertParSumMetric(par, model), simpleSumMetric=insertParSimpleSumMetric(par,model), metric=insertParMetric(par,model), stop("Only \"separable\", \"productSum\", \"sumMetric\", \"simpleSumMetric\" and \"metric\" are implemented.")) } # extract parameters from models extractPar <- function(model) { switch(strsplit(model$stModel, "_")[[1]][1], separable=c(range.s=model$space$range[2], nugget.s=model$space$psill[1], range.t=model$time$range[2], nugget.t=model$time$psill[1], sill= model$sill[[1]]), productSumOld=c(sill.s = rev(model$space$psill)[1], range.s = rev(model$space$range)[1], sill.t = rev(model$time$psill)[1], range.t = rev(model$time$range)[1], sill=model$sill[[1]], nugget=model$nugget[[1]]), productSum=c(sill.s = model$space$psill[2], range.s = model$space$range[2], nugget.s = model$space$psill[1], sill.t = model$time$psill[2], range.t = model$time$range[2], nugget.t = model$time$psill[1], k=model$k), sumMetric=c(sill.s = model$space$psill[2], range.s = model$space$range[2], nugget.s = model$space$psill[1], sill.t = model$time$psill[2], range.t = model$time$range[2], nugget.t = model$time$psill[1], sill.st = model$joint$psill[2], range.st = model$joint$range[2], nugget.st = model$joint$psill[1], anis = model$stAni[[1]]), # simplified sumMetric model simpleSumMetric=c(sill.s = rev(model$space$psill)[1], range.s = rev(model$space$range)[1], sill.t = rev(model$time$psill)[1], range.t = rev(model$time$range)[1], sill.st = rev(model$joint$psill)[1], range.st = rev(model$joint$range)[1], nugget = model$nugget[[1]], anis = model$stAni[[1]]), metric=c(sill = model$joint$psill[2], range = model$joint$range[2], nugget = model$joint$psill[1], anis = model$stAni[[1]]), stop("Only \"separable\", \"productSum\", \"sumMetric\", \"simpleSumMetric\" and \"metric\" are implemented.")) } # extract names extractParNames <- function(model) { names(extractPar(model)) } ## dedicated insertion functions ################################ # separable model insertParSeparable <- function(par, model) { vgmST("separable", space=vgm(1-par[2],as.character(model$space$model[2]),par[1],par[2], kappa=model$space$kappa[2]), time= vgm(1-par[4],as.character(model$time$model[2]),par[3],par[4], kappa=model$time$kappa[2]), sill=par[5]) } # product sum model insertParProdSumOld <- function(par, model) { vgmST("productSumOld", space=vgm(par[1],as.character(rev(model$space$model)[1]),par[2], kappa=rev(model$space$kappa)[1]), time= vgm(par[3],as.character(rev(model$time$model)[1]),par[4], kappa=rev(model$time$kappa)[1]), sill=par[5], nugget=par[6]) } insertParProdSum <- function(par, model) { vgmST("productSum", space=vgm(par[1],as.character(model$space$model[2]),par[2],par[3], kappa=model$space$kappa[2]), time= vgm(par[4],as.character(model$time$model[2]),par[5], par[6], kappa=model$time$kappa[2]), k=par[7]) } # sum metric model insertParSumMetric <- function(par, model) { vgmST("sumMetric", space=vgm(par[1],as.character(model$space$model[2]),par[2],par[3], kappa=model$space$kappa[2]), time= vgm(par[4],as.character(model$time$model[2]),par[5],par[6], kappa=model$time$kappa[2]), joint=vgm(par[7],as.character(model$joint$model[2]),par[8],par[9], kappa=model$joint$kappa[2]), stAni=par[10]) } # simplified sum metric model insertParSimpleSumMetric <- function(par, model) { vgmST("simpleSumMetric", space=vgm(par[1],as.character(rev(model$space$model)[1]),par[2], kappa=rev(model$space$kappa)[1]), time= vgm(par[3],as.character(rev(model$time$model)[1]),par[4], kappa=rev(model$time$kappa)[1]), joint=vgm(par[5],as.character(rev(model$joint$model)[1]),par[6], kappa=rev(model$joint$kappa)[1]), nugget=par[7], stAni=par[8]) } # metric model insertParMetric <- function(par, model) { vgmST("metric", joint=vgm(par[1], as.character(model$joint$model[2]), par[2], par[3], kappa=model$joint$kappa[2]), stAni=par[4]) } gstat/R/krige.R0000644000176200001440000001445014646417261013040 0ustar liggesusers# $Id: krige.q,v 1.15 2009-02-20 13:53:38 edzer Exp $ if (!isGeneric("krige")) setGeneric("krige", function(formula, locations, ...) standardGeneric("krige")) "krige.locations" <- function (formula, locations, data = sys.frame(sys.parent()), newdata, model = NULL, ..., beta = NULL, nmax = Inf, nmin = 0, omax = 0, maxdist = Inf, block = numeric(0), nsim = 0, indicators = FALSE, na.action = na.pass, debug.level = 1) { g = gstat(formula = formula, locations = locations, data = data, model = model, beta = beta, nmax = nmax, nmin = nmin, omax = omax, maxdist = maxdist, ...) predict(g, newdata = newdata, block = block, nsim = nsim, indicators = indicators, na.action = na.action, debug.level = debug.level) } setMethod("krige", c("formula", "formula"), krige.locations) krige.spatial <- function(formula, locations, newdata, model = NULL, ..., beta = NULL, nmax = Inf, nmin = 0, omax = 0, maxdist = Inf, block = numeric(0), nsim = 0, indicators = FALSE, na.action = na.pass, debug.level = 1) { # locations = coordinates(arg2) g = gstat(formula = formula, # locations = locations, data = locations, model = model, beta = beta, nmax = nmax, nmin = nmin, omax = omax, maxdist = maxdist, ...) predict(g, newdata = newdata, block = block, nsim = nsim, indicators = indicators, na.action = na.action, debug.level = debug.level) } setMethod("krige", c("formula", "Spatial"), krige.spatial) setMethod("krige", c("formula", "NULL"), function(formula, locations, newdata, ...) { # manual dispatch based on newdata: if (inherits(newdata, c("sf", "sfc", "stars"))) krige.sf(formula, locations, newdata = newdata, ...) else krige.spatial(formula, locations, newdata = newdata, ...) } ) krige.sf <- function(formula, locations, newdata, ..., nsim = 0) { if (!requireNamespace("sf", quietly = TRUE)) stop("sf required: install that first") # nocov if (!requireNamespace("stars", quietly = TRUE)) stop("stars required: install that first") # nocov crs = sf::st_crs(newdata) if (!is.null(locations)) { stopifnot(sf::st_crs(locations) == sf::st_crs(newdata)) crs = sf::st_crs(locations) if (!isTRUE(sf::st_is_longlat(locations))) { sf::st_crs(locations) = sf::NA_crs_ sf::st_crs(newdata) = sf::NA_crs_# to avoid problems not handled by sp... } locations = as(locations, "Spatial") } ret = krige(formula, locations, as(newdata, "Spatial"), ..., nsim = nsim) if (gridded(ret)) { st = stars::st_as_stars(ret) if (nsim > 0) st = sim_to_dimension(st, nsim) sf::st_set_crs(st, crs) } else sf::st_set_crs(sf::st_as_sf(ret), crs) } setMethod("krige", c("formula", "sf"), krige.sf) sim_to_dimension = function(st, nsim) { nms = names(stars::st_dimensions(st)) if (length(st) > nsim) { nvars = length(st) / nsim l = vector("list", nvars) vars = unique(sub("([^.]+)\\.[[:alnum:]]+$", "\\1", names(st))) for (i in 1:nvars) { range = seq((i-1) * nsim + 1, length.out = nsim) m = setNames(st[range], paste0("sim", 1:nsim)) l[[i]] = setNames(stars::st_set_dimensions(merge(m), names = c(nms, "sample")), vars[i]) } do.call(c, l) } else { if (nsim > 1) setNames(stars::st_set_dimensions(merge(st), names = c(nms, "sample")), "var1") else st } } setMethod(krige, signature("formula", "ST"), function(formula, locations, newdata, model, ...) { krigeST(formula, locations, newdata, model,...) } ) if (!isGeneric("idw")) setGeneric("idw", function(formula, locations, ...) standardGeneric("idw")) idw.locations <- function (formula, locations, data = sys.frame(sys.parent()), newdata, nmax = Inf, nmin = 0, omax = 0, maxdist = Inf, block = numeric(0), na.action = na.pass, idp = 2.0, debug.level = 1) { krige(formula, locations, data, newdata, nmax = nmax, nmin = nmin, omax = omax, maxdist = maxdist, block = block, na.action = na.action, set = list(idp = idp), debug.level = debug.level) } setMethod("idw", c("formula", "formula"), idw.locations) idw.spatial <- function (formula, locations, newdata, nmax = Inf, nmin = 0, omax = 0, maxdist = Inf, block = numeric(0), na.action = na.pass, idp = 2.0, debug.level = 1) { krige(formula, locations, newdata, nmax = nmax, nmin = nmin, omax = omax, maxdist = maxdist, block = block, na.action = na.action, set = list(idp = idp), debug.level = debug.level, model = NULL) } setMethod("idw", c("formula", "Spatial"), idw.spatial) idw.sf <- function (formula, locations, newdata, ..., idp = 2.0) { if (!requireNamespace("sf", quietly = TRUE)) stop("sf required: install that first") # nocov if (!requireNamespace("stars", quietly = TRUE)) stop("stars required: install that first") # nocov ret = krige(formula, locations, newdata, ..., set = list(idp = idp), model = NULL) if (inherits(newdata, c("sf", "sfc"))) sf::st_as_sf(ret) else if (inherits(newdata, "stars")) stars::st_as_stars(ret) else stop("newdata should be of class sf or stars") } setMethod("idw", c("formula", "sf"), idw.sf) STx2SpatialPoints = function(x, multiplyTimeWith = 1.0) { x = as(geometry(x), "STI") t1 = as.numeric(as.POSIXct(index(x@time))) t2 = as.numeric(x@endTime) time = multiplyTimeWith * (t1 + t2) / 2 cc = cbind(coordinates(x), time) SpatialPoints(cc, proj4string = x@sp@proj4string) } STxDF2SpatialPointsDataFrame = function(x, multiplyTimeWith = 1.0) { pts = STx2SpatialPoints(geometry(x), multiplyTimeWith) SpatialPointsDataFrame(pts, x@data) } SpatialPointsDataFrame2STxDF = function(x, class, tz = "", origin = as.POSIXct("1970-01-01",tz=tz)) { cc = coordinates(x) time = as.POSIXct(cc[,ncol(cc)], tz=tz, origin = origin) sp = SpatialPoints(cc[,-ncol(cc)], proj4string = x@sp@proj4string) st = as(STI(sp, time), class) addAttrToGeom(STI(sp, time), x@data) } idw.ST <- function (formula, locations, newdata, nmax = Inf, nmin = 0, omax = 0, maxdist = Inf, block = numeric(0), na.action = na.pass, idp = 2.0, debug.level = 1, multiplyTimeWith = 1.0) { stopifnot(ncol(coordinates(locations@sp)) == 2) ret = krige(formula, STxDF2SpatialPointsDataFrame(locations, multiplyTimeWith), STx2SpatialPoints(newdata, multiplyTimeWith), nmax = nmax, nmin = nmin, omax = omax, maxdist = maxdist, block = block, na.action = na.action, set = list(idp = idp), debug.level = debug.level, model = NULL) SpatialPointsDataFrame2STxDF(ret, class(geometry(newdata))) } setMethod("idw", c("formula", "ST"), idw.ST) gstat/R/turningLayers.R0000644000176200001440000003052514646417261014606 0ustar liggesusers# # library(gstat) # # separable model: spatial and temporal sill will be ignored # # and kept constant at 1-nugget respectively. A joint sill is used. # separableModel <- vgmST("separable", # space=vgm(0.9,"Exp", 147, 0.1), # time =vgm(0.9,"Exp", 3.5, 0.1), # sill=40) # # covSTMat <- ceWrapSpaceTimeOnTorusCalcCovRow1(c(250,20), c(1,16), separableModel) # dim(covSTMat) # # image(matrix(ceSim(covSTMat, 1, c(20, 16)), # nrow=20, ncol=16), asp=1, ylab="time", xlab="space") # # # product sum model: spatial and temporal nugget will be ignored and kept # # constant at 0. Only a joint nugget is used. # prodSumModel <- vgmST("productSum", # space=vgm(39, "Sph", 343, 0), # time= vgm(36, "Exp", 3, 0), # k=15) # # covSTMat <- ceWrapSpaceTimeOnTorusCalcCovRow1(c(250,20), c(1,16), prodSumModel) # dim(covSTMat) # # image(matrix(ceSim(covSTMat, 1, c(20, 16)), # nrow=20, ncol=16), asp=1, ylab="time", xlab="space") # # # sum metric model: spatial, temporal and joint nugget will be estimated # sumMetricModel <- vgmST("sumMetric", # space=vgm( 6.9, "Lin", 200, 3.0), # time =vgm(10.3, "Lin", 15, 3.6), # joint=vgm(37.2, "Exp", 84,11.7), # stAni=77.7) # # covSTMat <- ceWrapSpaceTimeOnTorusCalcCovRow1(c(250,20), c(1,16), sumMetricModel) # dim(covSTMat) # # image(matrix(ceSim(covSTMat, 1, c(20, 16)), # nrow=20, ncol=16), asp=1, ylab="time", xlab="space") # # # simplified sumMetric model, only a overall nugget is fitted. The spatial, # # temporal and jont nuggets are set to 0. # simpleSumMetricModel <- vgmST("simpleSumMetric", # space=vgm(20,"Lin", 150, 0), # time =vgm(20,"Lin", 10, 0), # joint=vgm(20,"Exp", 150, 0), # nugget=1, stAni=15) # # covSTMat <- ceWrapSpaceTimeOnTorusCalcCovRow1(c(250,20), c(1,16), simpleSumMetricModel) # dim(covSTMat) # # image(matrix(ceSim(covSTMat, 1, c(20, 16)), # nrow=20, ncol=16), asp=1, ylab="time", xlab="space") # # # metric model # metricModel <- vgmST("metric", # joint=vgm(60, "Exp", 150, 10), # stAni=60) # # covSTMat <- ceWrapSpaceTimeOnTorusCalcCovRow1(c(250,20), c(1,16), metricModel, turningLayers = FALSE) # dim(covSTMat) # # image(matrix(ceSim(covSTMat, 1, c(20, 16)), # nrow=20, ncol=16), asp=1, ylab="time", xlab="space") ## turning bands: # for cov-functions valid in 3-dim # adjust the covariance matrix (Schlahter, Chap. 2, eq 2.25) # simulate several layers (up-right hyper-planes in the 3D+T-cube) with random directions on a unit hemi-sphere # orthogonally project target points onto rndm lyrs and average the values for all rndm lyrs # -> one simulation of a 3d+T Gaussian random field, for 2D use a hyperplane in 3D # the tunring bands operator (numerical, 3-dimensional case) # @input: # model target covariance function # dist_grid: data.frame wtih columns spacelag and timelag for which the covariances are calculated # # @value: data.frame with columns spacelag, timelag and gamma where the latter contains the covariances for the 1-dim spatial and temporal layers # model <- separableModel # dist_grid <- as.data.frame(cbind("spacelag" = rep(1:150*1., each=4), # "timelag" = rep(1:4, 150))) # CAVE: distgrid must ahve the correct spatial and temporal metrics tbOperator <- function(model, dist_grid) { r <- dist_grid$spacelag derFun <- function(r) r * variogramSurface(model, dist_grid = data.frame(spacelag=r, timelag=dist_grid$timelag), covariance = TRUE)$gamma cbind(dist_grid, "gamma" = diag(attr(numericDeriv(quote(derFun(r)), "r"), "gradient"))) } randomDirections <- function(n) { u <- runif(n, 0, 2*pi) v <- runif(n, 0, 1) s <- sqrt(1-v^2) cbind(s*cos(u), s*sin(u), v) } # library(rgl) # plot3d(randomDirections(100), aspect = c(1,1,0.5)) # nLyrs <- 500 # coordMat <- matrix(c(1,5,5, # 1,7,7, # 1,5,7, # 1,7,5), byrow=T, ncol=3) # # coordMat <- matrix(runif(3*1001,1,5), byrow=T, ncol=3) # # # random directions in 3D # rndDir <- randomDirections(nLyrs) # # # how much does each direction contribute to the point # cntrbtn <- rndDir %*% t(coordMat) # # -> each column corresponds to one location, each row i to the "contribution" of the i-th rndDir # # cl_cntrbtn <- ceiling(cntrbtn)+10 # centre for grid; mind spatial index # fl_cntrbtn <- floor(cntrbtn) +10 # # covRow1 <- ceWrapSpaceTimeOnTorusCalcCovRow1(c(250,20), c(1,16), metricModel, turningLayers = TRUE) # # sTime <- Sys.time() # simLyrs <- ceSim(covRow1, nLyrs, c(20,16)) # simLyrs <- lapply(1:nLyrs, function(col) matrix(simLyrs[,col], nrow=20, ncol=16)) # # lambda <- cl_cntrbtn - cntrbtn -10 # # cntrbSngSimLyr <- function(lyrId) { # simLyrs[[lyrId]][cl_cntrbtn[lyrId,],] * (1-lambda)[lyrId,] + simLyrs[[lyrId]][fl_cntrbtn[lyrId,],] * lambda[lyrId,] # } # # # reduce to the one realisation based on the combination of nLyrs turning bands # simTs <- Reduce('+', lapply(1:nLyrs, cntrbSngSimLyr))/sqrt(nLyrs) # eTime <- Sys.time() # # eTime - sTime # 0.7 secs/simulation of 100 random points # # image(simTs) # # dim(simTs) # # 1001 locations at 16 time stamps # # plot(simTs[500,]) # computes the covariance matrixes and weights once, applied to series of # variables/simulations where each variable/simulation is stored in one column of # the multiVarMatrix copied from krigeST to avoid repeted calls to krige with # multiple, identical inversions of the weights matrix # TODO: add functionality for temporal sandwich-wise processing: i.e. use the # +/- nmaxTime time slices to predict one time slice krigeSTMultiple <- function(formula, from, to, modelList, multiVarMatrix, nmaxTime=Inf) { lst = extractFormula(formula, from, to) separate <- length(from) > 1 && length(to) > 1 && inherits(from, "STF") && inherits(to, "STF") X = lst$X x0 = lst$x0 V = covfn.ST(from, model = modelList, separate=separate) v0 = covfn.ST(from, to, modelList) if (modelList$stModel == "separable" & separate) skwts <- STsolve(V, v0, X) # use Kronecker trick else skwts <- CHsolve(V, cbind(v0, X)) npts = length(to) ViX = skwts[,-(1:npts)] skwts = skwts[,1:npts] idPredFun <- function(sim) { sim <- matrix(sim, ncol = 1) beta = solve(t(X) %*% ViX, t(ViX) %*% sim) x0 %*% beta + t(skwts) %*% (sim - X %*% beta) } apply(multiVarMatrix, 2, idPredFun) } # unconcitional ## STFDF # library(sp) # library(spacetime) # library(zoo) # library(xts) # data(meuse, package = "sp") # coordinates(meuse) <- ~x+y # proj4string(meuse) <- CRS("+init=epsg:28992") # krigeST <- function(formula, data, newdata, modelList, y, beta, nmax=Inf, stAni=NULL, # computeVar = FALSE, fullCovariance = FALSE, # bufferNmax=2, progress=TRUE) ## krigeSTSimTB <- function(formula, data, newdata, modelList, nsim, progress=TRUE, nLyrs=500, tGrid=NULL, sGrid=NULL, ceExt=2, nmax=Inf) { stopifnot(zoo::is.regular(newdata@time)) condSim <- TRUE if (missing(data)) { condSim <- FALSE message("[No data provided: performing unconditional simulation.]") } else { message("[Performing conditional simulation.]") } pb <- txtProgressBar(0,nsim,style=3) # ST-simulation grid if (is.null(tGrid)) { tDis <- diff(c(index(newdata@time[1]), newdata@endTime[1])) if (!is.null(attr(modelList, "temporal unit"))) { units(tDis) <- attr(modelList, "temporal unit") } else { message("[The spatio-temporal variogram model does not carry a time unit attribute: krigeST cannot check whether the temporal distance metrics coincide.]") } tGrid <- c(as.numeric(tDis), length(newdata@time)) attr(tGrid, "units") <- c("", units(tDis)) debug_time_unit(units(tDis)) } if (is.null(sGrid)) { if (gridded(newdata@sp)) { # SpatialPixels/SpatialGrid: # based on GridTopology: use minimal cellsize of both directions; take enough to cover the diagonal sDis <- min(newdata@sp@grid@cellsize) sDim <- ceiling(sqrt(sum((newdata@sp@grid@cellsize * newdata@sp@grid@cells.dim)^2))/sDis) sGrid <- c(sDis, sDim) } else { # treat (as) SpatialPoints: # Average area per location --assuming-a-regular-squared-outline-taking-the-sqrt--> length/location --take-later-twice-as-many--> bboxExt <- apply(newdata@sp@bbox, 1, diff) sDis <- sqrt(prod(bboxExt)/length(newdata@sp)) sDim <- ceiling(sqrt(sum((bboxExt/sDis)^2))) sGrid <- c(sDis, sDim) } } # random directions in 3D rndDir <- randomDirections(nLyrs) # coordinates coordMat <- coordinates(newdata@sp) # coordinates (embedded in 3D) shifted + scaled to the grid index of the spatial gridding sGrid coordMat[,1] <- (coordMat[,1] - newdata@sp@bbox[1,1])/sGrid[1] coordMat[,2] <- (coordMat[,2] - newdata@sp@bbox[2,1])/sGrid[1] if (ncol(coordMat) == 2) { coordMat <- cbind(coordMat,1) } else { coordMat[,3] <- (coordMat[,3] - newdata@sp@bbox[3,1])/sGrid[1] } # how much does each direction contribute to the point cntrbtn <- rndDir %*% t(coordMat) # -> each column corresponds to one location, each row i to the "contribution" of the i-th rndDir # ceiling and floor + shifted to avoid negative indices cl_cntrbtn <- ceiling(cntrbtn) + sGrid[2] fl_cntrbtn <- floor(cntrbtn) + sGrid[2] covRow1 <- ceWrapSpaceTimeOnTorusCalcCovRow1(c(sGrid[1], 2*sGrid[2]), tGrid, modelList, turningLayers = TRUE, ext=ceExt) origDim <- c(2*sGrid[2], tGrid[2]) sims <- list() ## for (i in 1:nsim) { setTxtProgressBar(pb, i) simLyrs <- ceSim(covRow1, nLyrs, origDim) simLyrs <- lapply(1:nLyrs, function(col) matrix(simLyrs[,col], nrow=origDim[1], ncol=origDim[2])) lambda <- cl_cntrbtn - cntrbtn - sGrid[2] cntrbSngSimLyr <- function(lyrId) { simLyrs[[lyrId]][cl_cntrbtn[lyrId,],] * (1-lambda)[lyrId,] + simLyrs[[lyrId]][fl_cntrbtn[lyrId,],] * lambda[lyrId,] } # reduce to the one realisation based on the combination of nLyrs turning bands sims[[paste0("sim",i)]] <- Reduce('+', lapply(1:nLyrs, cntrbSngSimLyr))/sqrt(nLyrs) } close(pb) sims <- do.call(cbind, lapply(sims, as.numeric)) # bind simulations to newdata geometry if (!condSim) { if ("data" %in% slotNames(newdata)) newdata@data <- cbind(newdata@data, sims) else newdata <- addAttrToGeom(newdata, as.data.frame(sims)) return(newdata) } # function call ends here if no data has been provided -> unconditional case varName <- all.vars(formula[[2]]) ## conditioning # interpolate the observations to the simulation grid obsMeanField <- krigeST(formula=formula, data=data, newdata=newdata, modelList=modelList) # interpolate to observation locations from the simulated grids for each simulation simMeanObsLoc <- krigeSTMultiple(as.formula(paste0("var1.pred ~", formula[[3]])), obsMeanField, data, modelList, sims) # interpolate from kriged mean sim at observed locations back to the grid for mean surface of the simulations simMeanFields <- krigeSTMultiple(as.formula(paste0(varName, "~", formula[[3]])), data, newdata, modelList, simMeanObsLoc) # add up the mean field and the corrected data sims <- obsMeanField@data$var1.pred + sims - simMeanFields # bind simulations to newdata geometry if ("data" %in% slotNames(newdata)) { newdata@data <- cbind(newdata@data, sims) return(newdata) } addAttrToGeom(newdata, as.data.frame(sims)) } # # sTime <- Sys.time() # krigedSim <- krigeSTUncSimTB(stf, metricModel, 100) # Sys.time() - sTime # # # 27 secs for 100 simulated ST fields of 155 locations and 21 time steps: 325500 values # # # plot one simulation along time # stplot(krigedSim[,1:12]) # # # plot one simulation along time # stplot(krigedSim[1:12,,"sim1"], mode="ts") # # # plot the ten simulations of the first day # spplot(krigedSim[,1], paste0("sim",1:10), as.table=TRUE) gstat/R/variogram.default.R0000644000176200001440000001477214646417261015360 0ustar liggesusers# $Id: variogram.default.q,v 1.29 2009-11-02 21:33:17 edzer Exp $ "variogram.default" <- function(object, locations, X, cutoff, width = cutoff/15.0, alpha = 0, beta = 0, tol.hor = 90/length(alpha), tol.ver = 90/length(beta), cressie = FALSE, dX = numeric(0), boundaries = numeric(0), cloud = FALSE, trend.beta = NULL, debug.level = 1, cross = TRUE, grid, map = FALSE, g = NULL, ..., projected = TRUE, lambda = 1.0, verbose = FALSE, covariogram = FALSE, PR = FALSE, pseudo = -1) { dots = list(...) if (length(dots) > 0) { warning(paste("the following arguments are ignored:", paste(dots, collapse = ", "))) } id1 = id2 = 0 ret = NULL if (missing(cutoff)) { if (is.logical(map) && map == TRUE) stop("for variogram maps, supply at least a cutoff") cutoff = numeric(0) } else if (width <= 0) stop("argument width should be positive") if (missing(width)) width = numeric(0) if (cloud == TRUE) width = 0 if (is.logical(map) && map == TRUE) { cells.dim = length(seq(-cutoff, cutoff, by = width)) grid.topology = GridTopology(rep(-cutoff, 2), rep(width, 2), rep(cells.dim, 2)) map = SpatialGrid(grid = grid.topology) } if (any(is.na(boundaries))) stop("no NA values allowed in boundaries") .Call(gstat_init, as.integer(debug.level)) if (!is.null(g) && !is.null(g$set)) gstat.load.set(g$set) id.names = NULL if (is.list(object) && is.list(locations)) { nvars = length(object) if (!is.null(names(object))) id.names = names(object) for (i in 1:nvars) { if (missing(X)) Xloc = rep(1, length(object[[i]])) else Xloc = X[[i]] t.beta = numeric(0) if (!is.null(trend.beta) && length(trend.beta) > 0) t.beta = trend.beta[[i]] else t.beta = numeric(0) if (missing(grid) || !is.list(grid)) { if (!is.null(g) && gridded(g$data[i]$data)) grd = unlist(gridparameters(g$data[i]$data)) else grd = numeric(0) } else grd = grid[[i]] .Call(gstat_new_data, as.double(object[[i]]), as.double(locations[[i]]), as.double(Xloc), as.integer(1), as.double(t.beta), as.integer(-1), as.integer(0), as.double(-1), as.integer(0), as.integer(1), double(0), grd, as.integer(0), as.integer(projected), as.integer(0), as.double(lambda), as.integer(0)) if (!is.null(g) && !is.null(g$model[[id.names[i]]])) load.variogram.model(g$model[[id.names[i]]], c(i - 1, i - 1)) } } else stop("argument object and locations should be lists") if (inherits(map, "SpatialGrid")) map = as.double(unlist(gridparameters(as(map, "SpatialGrid")))) pos = 0 ids = NULL bnd = NULL is.direct = NULL if (PR) { if (any(object[[1]] <= 0)) warning("pairwise relative variogram assumes non-negative data") covariogram = 2 } if (cross == "ONLY") { stopifnot(nvars >= 2) id.range = 2:nvars } else if (cross == TRUE) id.range = nvars:1 else id.range = 1:nvars for (id1 in id.range) { if (cross == "ST") id2range = 1 else if (cross == "ONLY") id2range = 1:(id1-1) else id2range = ifelse(cross, 1, id1):id1 for (id2 in id2range) { if (verbose) cat(".") if (is.null(id.names)) id = ifelse(id1 == id2, paste(id1), cross.name(id2, id1)) else id = ifelse(id1 == id2, paste(id.names[id1]), cross.name(id.names[id2], id.names[id1])) for (a in alpha) { for (b in beta) { direction = as.numeric(c(a, b, tol.hor, tol.ver)) # boundaries nees to be passed into the c code only ONCE: if (is.null(bnd)) bnd = boundaries else # NOT the first time we're here, so... bnd = numeric(0) ret.call = .Call(gstat_variogram, as.integer(c(id1 - 1, id2 - 1)), as.numeric(cutoff), as.numeric(width), as.numeric(direction), as.integer(cressie), as.numeric(dX), as.numeric(bnd), map, as.integer(covariogram), as.integer(pseudo)) if (is.logical(map) && map == FALSE) { np = ret.call[[1]] sel = np > 0 n.dir = length(sel[sel]) if (n.dir > 0) { dist = ret.call[[2]] gamma = ret.call[[3]] ret_cw = ret.call[[4]] # Sat Jul 16 16:19:59 CEST 2011 dir.a = rep(a, n.dir) dir.b = rep(b, n.dir) ids = c(ids, rep(id, n.dir)) is.direct = c(is.direct, id1 == id2) df = data.frame(np = np[sel], dist = dist[sel], gamma = gamma[sel], dir.hor = dir.a, dir.ver = dir.b) if (pos > 0) ret[(pos + 1):(pos + n.dir), ] = df else ret = df pos = pos + n.dir } } else { if (is.null(ret)) { ret = data.frame(ret.call[[1]], ret.call[[2]], ret.call[[4]], ret.call[[3]]) names = c("dx", "dy", id, paste("np", id, sep=".")) } else { ret = data.frame(ret, ret.call[[4]], ret.call[[3]]) names = c(names, id, paste("np", id, sep=".")) } names(ret) = names } } } } } if (verbose) cat("\n") .Call(gstat_exit, NULL) if (is.logical(map) && map == FALSE) { if (!is.null(ids)) { ret$id = factor(ids, levels = unique(ids)) attr(ret, "direct") = data.frame(id = unique(ids), is.direct = is.direct) if (cloud) { class(ret) = c("variogramCloud", "data.frame") attr(ret, ".BigInt") = 2^(4 * .Machine$sizeof.long) } else { class(ret) = c("gstatVariogram", "data.frame") if (length(boundaries) == 0) { cutoff = ret_cw[1] width = ret_cw[2] boundaries = seq(0, cutoff, width) if (!identical(max(boundaries), cutoff)) boundaries = c(boundaries, cutoff) } attr(ret, "boundaries") = boundaries attr(ret, "pseudo") = ret_cw[3] row.names(ret) = NULL } } } else { coordinates(ret) = c("dx", "dy") gridded(ret) = TRUE ret = list(map = ret) class(ret) = c("variogramMap", "list") } if (!is.null(ret)) { if (PR) attr(ret, "what") = "pairwise relative semivariance" else if (covariogram) attr(ret, "what") = "covariance" else if (cressie) attr(ret, "what") = "Cressie's semivariance" else attr(ret, "what") = "semivariance" } ret } gstat/R/gstat.R0000644000176200001440000001033314646417261013055 0ustar liggesusers# $Id: gstat.q,v 1.28 2009-11-02 21:33:17 edzer Exp $ "cross.name" <- function(id1, id2) { paste(id1, id2, sep = ".") } "gstat" <- function (g, id, formula, locations, data = NULL, model = NULL, beta, nmax = Inf, nmin = 0, omax = 0, maxdist = Inf, force = FALSE, dummy = FALSE, set, fill.all = FALSE, fill.cross = TRUE, variance = "identity", weights = NULL, merge, degree = 0, vdist = FALSE, lambda = 1.0) { call = match.call() if (!missing(locations) && inherits(locations, "formula")) { if (!is.null(data)) coordinates(data) = locations # locations = NULL } else if (missing(data) && !missing(locations) && (is(locations, "Spatial") || inherits(locations, "sf"))) { data = locations locations = NULL } if (fill.all) { # fill all variogram models if (missing(g) || is.null(model)) stop("fill.all assumes object g and model are supplied") g.names = names(g$data) for (i in 1:length(g.names)) { g$model[[paste(g.names[i])]] = model if (fill.cross) { for (j in (i+1):length(g.names)) g$model[[cross.name(g.names[i], g.names[j])]] = model } } return(g) } if (!missing(g) && inherits(g, "gstat") && !missing(id) && !missing(model) && missing(formula) && missing(locations)) { # here, only direct or cross variogram model is defined g.names = names(g$data) if (length(id) == 2) { m1 = match(id[1], g.names) m2 = match(id[2], g.names) if (is.na(m1)) stop("first id does not match available data") if (is.na(m1)) stop("second id does not match available data") nm = cross.name(g.names[min(m1, m2)], g.names[max(m1, m2)]) } else if (length(id) == 1) { m1 = match(id, g.names) if (is.na(m1)) stop("id does not match available data") nm = g.names[m1] } else stop("id should have length 1 or 2") g$model[[nm]] = model return(g) } if (!inherits(formula, "formula")) stop("argument formula should be of class formula") #if (!inherits(locations, "formula") && !has.coordinates(data)) # stop("argument locations should be of class formula or matrix") if (inherits(data, "sf")) data = as(data, "Spatial") if (missing(beta) || is.null(beta)) beta = numeric(0) vfn = pmatch(variance, c("identity", "mu", "mu(1-mu)", "mu^2", "mu^3")) if (is.na(vfn)) stop("unknown value for variance function") if (vfn > 1 && length(beta) == 0) stop("non-identity variance function only allowed if beta is supplied") if (missing(g) || is.null(g)) { g = list() g[["data"]] = list() g[["model"]] = list() } else if (!dummy && inherits(g$data[[1]], "Spatial") && !identical(g$data[[1]]$data@proj4string@projargs, data@proj4string@projargs)) stop("data items in gstat object have different coordinate reference systems") if (missing(id)) id = paste("var", length(g$data) + 1, sep = "") g$data[[id]] = list(formula = formula, # locations = locations, data = data, has.intercept = attr(terms(formula), "intercept"), beta = beta, nmax = nmax, nmin = nmin, omax = omax, maxdist = maxdist, force = force, dummy = dummy, vfn = vfn, weights = weights, degree = degree, vdist = vdist, lambda = lambda) g$model[[id]] = model if (!missing(locations)) g$locations = locations if (!missing(set)) { if (!is.list(set)) stop("argument set should be a list") g$set = set } if (!missing(merge)) g$merge = merge g$call = call class(g) = c("gstat", "list") g } "[.gstat" <- function(x, ids) { if (is.numeric(ids)) { if (min(ids) < 1 || max(ids) > length(names(x$data))) stop("selection index(es) out of bound") ids = names(x$data)[ids] } else if (any(is.na(match(ids, names(x$data))))) stop("selected ids do not match those of gstat object") g = list() g$data = x$data[ids] if (length(ids) > 1) { ids.cross = NULL for (i in 2:length(ids)) for (j in 1:(i-1)) ids.cross = c(ids.cross, cross.name(ids[j], ids[i])) g$model = x$model[c(ids, ids.cross)] } else g$model = x$model[ids] if (!is.null(x$set)) g$set = x$set if (!is.null(g$merge)) g$merge = x$merge class(g) = c("gstat", "list") g } gstat/R/xyz2img.R0000644000176200001440000000203114646417261013340 0ustar liggesusers# $Id: xyz2img.q,v 1.4 2006-02-10 19:01:07 edzer Exp $ "xyz2img" <- function (xyz, zcol = 3, xcol = 1, ycol = 2, tolerance = 10 * .Machine$double.eps) { if (ncol(xyz) < 3) stop("xyz object should have at least three columns") z = xyz[, zcol] x = xyz[, xcol] y = xyz[, ycol] xx = sort(unique(x)) yy = sort(unique(y)) nx = length(xx) ny = length(yy) nmax = max(nx, ny) difx = diff(xx) if (diff(range(unique(difx))) > tolerance) stop("x intervals are not constant") dify = diff(yy) if (diff(range(unique(dify))) > tolerance) stop("y intervals are not constant") dx = mean(difx) dy = mean(dify) xmin = min(xx) xmax = max(xx) xrange = xmax - xmin ymin = min(yy) ymax = max(yy) yrange = ymax - ymin row = round((x - xmin)/dx) + 1 col = round((y - ymin)/dy) + 1 zz = rep(as.numeric(NA), nx * ny) zz[row + nx * (col - 1)] = z zz = matrix(zz, nrow = nx, ncol = ny) list(x = seq(xmin, xmax, dx), y = seq(ymin, ymax, dy), z = zz) } gstat/R/map.to.lev.R0000644000176200001440000000146014646417261013717 0ustar liggesusers# $Id: map.to.lev.q,v 1.2 2006-02-10 19:01:07 edzer Exp $ "map.to.lev" <- function (data, xcol = 1, ycol = 2, zcol = c(3, 4), ns = names(data)[zcol]) { len = nrow(data) d = matrix(nrow = len * length(zcol), ncol = 3) xnames = NULL if (length(ns) > 1 && length(ns) != length(zcol)) stop("names should have length 1 or equal to length of zcol") nr = 1 for (i in zcol) { if (length(ns) == 1) nm = rep(paste(ns, nr), len) else nm = rep(ns[nr], len) range = (1 + (nr - 1) * len):(nr * len) d[range, ] = cbind(data[, xcol], data[, ycol], data[, i]) xnames = c(xnames, nm) nr = nr + 1 } nms <- factor(xnames, levels = unique(xnames)) d = data.frame(d, nms) names(d) = c("x", "y", "z", "name") d } gstat/R/fit.variogram.gls.R0000644000176200001440000001152414646417261015272 0ustar liggesusersfit.variogram.gls <- function(formula, data, model, maxiter = 30, eps = .01, trace = TRUE, ignoreInitial = TRUE, cutoff = Inf, plot = FALSE) { v = as.data.frame(variogram(formula, data, cloud = TRUE, cutoff = cutoff)) i = v$left j = v$right y = v$gamma h0 = v$dist dists = spDists(data) n = length(i) iter = 0 converged = FALSE if (model$model[1] == 'Nug') { if (ignoreInitial) init = c(mean(y)/2, mean(y)/2, median(h0)/4) else init = c(model$psill, model$range[2]) gamfn0 = function(h, th, m = as.character(model$model[2])) variogramLine(vgm(th[2], m, th[3], th[1]), dist_vector=h)$gamma minfuncols0 = function(theta=rbind(1,1,1)) { res = y-gamfn0(h0,theta) sum(res^2) } # If variogram is Power model, maximum range should be 2. # Also if ignoreInitial change initial value of range to 1 if (any(model$model == 'Pow')) { upperOptim <- c(max(y), max(y), 2) if (ignoreInitial) init[3] <- 1 } else upperOptim = c(max(y), max(y), max(h0)) th = th0 = th.ols = optim(init, minfuncols0, gr=NULL, method="L-BFGS-B", lower=c(0,1e-9,1e-9), upper=upperOptim)$par if (trace) print(th) while (!converged && iter < maxiter) { comb = function(i,j) cbind(rep(i,length(j)), rep(j,each=length(i))) cov = matrix( variogramLine(model, dist_vector = dists[comb(i,i)])$gamma + variogramLine(model, dist_vector = dists[comb(j,j)])$gamma - variogramLine(model, dist_vector = dists[comb(i,j)])$gamma - variogramLine(model, dist_vector = dists[comb(j,i)])$gamma, length(j), length(j)) cov = 0.5 * cov ^ 2 #cov = solve(cov) cov = qr(cov) minfuncrange = function(range) { res = y-gamfn0(h0,c(th[1],th[2],range)) t(res) %*% solve(cov, res) } minfuncsill = function(sill) { res = y-gamfn0(h0, c(th[1],sill,th[3])) t(res) %*% solve(cov, res) } minfuncnugget = function(nugget) { res = y - gamfn0(h0, c(nugget, th[2], th[3])) t(res) %*% solve(cov, res) } th0 = th # Avoid calculating max every time th[1] = optimize(minfuncnugget,lower=0,upper=upperOptim[1])$minimum th[2] = optimize(minfuncsill,lower=1e-9,upper=upperOptim[2])$minimum th[3] = optimize(minfuncrange,lower=1e-9,upper=upperOptim[3])$minimum converged = sum(abs((th - th0)/th0)) < eps iter = iter + 1 if (trace) print(th) model$psill = c(th[1], th[2]) model$range[2] = th[3] } if (th[3] / max(h0) > .99) warning("range parameter at search space boundary") if (!converged) { warning("no convergence, returning OLS solution") th = th.ols model$psill = c(th[1], th[2]) model$range[2] = th[3] } } else { # No Nugget component. Use only psill = th[1] and range = th[2] parameters if (ignoreInitial) init = c(mean(y)/2, median(h0)/4) else init = c(model$psill, model$range) gamfn = function(h, th, m = as.character(model$model)) variogramLine(vgm(psill = th[1], model = m, range = th[2]), dist_vector=h)$gamma minfuncols = function(theta=rbind(1,1)) { res = y-gamfn(h0,theta) sum(res^2) } # If variogram is Power model, maximum range should be 2. # Also if ignoreInitial change initial value of range to 1 if (any(model$model == 'Pow')) { upperOptim <- c(max(y), 2) if (ignoreInitial) init[2] <- 1 } else { upperOptim = c(max(y), max(h0)) } th = th0 = th.ols = optim(init, minfuncols,gr=NULL, method="L-BFGS-B", lower=c(1e-9,1e-9), upper=upperOptim)$par if (trace) print(th) while (!converged && iter < maxiter) { comb = function(i,j) cbind(rep(i,length(j)), rep(j,each=length(i))) cov = matrix( variogramLine(model, dist_vector = dists[comb(i,i)])$gamma + variogramLine(model, dist_vector = dists[comb(j,j)])$gamma - variogramLine(model, dist_vector = dists[comb(i,j)])$gamma - variogramLine(model, dist_vector = dists[comb(j,i)])$gamma, length(j), length(j)) cov = 0.5 * cov ^ 2 #cov = solve(cov) cov = qr(cov) minfuncrange = function(range) { res = y-gamfn(h0,c(th[1],range)) t(res) %*% solve(cov, res) } minfuncsill = function(sill) { res = y-gamfn(h0, c(sill,th[2])) t(res) %*% solve(cov, res) } th0 = th th[1] = optimize(minfuncsill,lower=1e-9,upper=upperOptim[1])$minimum th[2] = optimize(minfuncrange,lower=1e-9,upper=upperOptim[2])$minimum converged = sum(abs((th - th0)/th0)) < eps iter = iter + 1 if (trace) print(th) model$psill = th[1] model$range = th[2] } if (th[2] / max(h0) > .99) warning("range parameter at search space boundary") if (!converged) { warning("no convergence, returning OLS solution") th = th.ols model$psill = th[1] model$range = th[2] } } if (plot) plot(variogram(formula, data, cloud = TRUE, cutoff = cutoff), model = model) else model } gstat/R/variogramLine.R0000644000176200001440000000232014646417261014527 0ustar liggesusers# $Id: variogramLine.q,v 1.4 2008-08-18 16:32:42 edzer Exp $ "variogramLine" <- function(object, maxdist, n = 200, min=1.0e-6 * maxdist, dir = c(1,0,0), covariance = FALSE, ..., dist_vector = numeric(0), debug.level = 0) { if (missing(object)) stop("model is missing"); if (!inherits(object, "variogramModel")) stop("model should be of mode variogramModel (use function vgm)") if (length(dist_vector) > 0) maxdist = 0.0 else if (missing(maxdist)) stop("maxdist or dist_vector needs to be set"); if (length(dir) != 3) stop("dir should be numeric vector of length 3") .Call(gstat_init, as.integer(debug.level)) pars = c(min,maxdist,n,dir) load.variogram.model(object, c(0,0)) # loads object into gstat ret = .Call(gstat_variogram_values, as.integer(c(0,0)), as.numeric(pars), as.integer(covariance), as.numeric(dist_vector)) .Call(gstat_exit, 0); if (is.matrix(dist_vector)) matrix(ret[[2]], nrow(dist_vector), ncol(dist_vector)) else data.frame(dist=ret[[1]], gamma=ret[[2]]) } # Sat Mar 14 15:11:55 CET 2015: removed this: # "variogram.line" <- function(..., deprecate = TRUE) { # if (deprecate) # cat("variogram.line is DEPRECATED, please use variogramLine instead\n") # variogramLine(...) # } gstat/R/get.contr.R0000644000176200001440000000411014646417261013632 0ustar liggesusers# $Id: get.contr.q,v 1.8 2006-03-20 15:18:14 edzer Exp $ "get.contr" <- function (data, gstat.object, X, ids = names(gstat.object$data)) { contr.fun <- function(x, n, pr.idx, cov.idx, contr) { y = matrix(x[pr.idx], n, 1) V = matrix(x[cov.idx], n, n) beta = t(contr) %*% y Vbeta = t(contr) %*% V %*% contr ret = c(beta, diag(Vbeta)) for (j in 1:nrow(Vbeta)) { if (j > 1) for (k in 1:(j - 1)) ret = c(ret, Vbeta[j, k]) } ret } lti <- function(i, j) { # lower triangular matrix index, when repr as array mx = max(i, j) - 1 mn = min(i, j) - 1 ((mx) * (mx - 1))/2 + mn + 1 } n = length(ids) if (!is.matrix(X)) X = as.matrix(X) if (n != nrow(X)) stop("length(ids) should equal nrow(X) or length(X)") gstat.names = create.gstat.names(ids) names.pr = gstat.names[seq(1, 2 * n, 2)] names.cov = matrix("", n, n) for (i in 1:n) for (j in 1:n) names.cov[i, j] = ifelse(i == j, gstat.names[2 * i], gstat.names[2 * n + lti(i, j)]) pr.idx = match(names.pr, names(data)) cov.idx = match(names.cov, names(data)) if (any(is.na(pr.idx)) || any(is.na(cov.idx))) stop("colunn names in data not matched") res = data.frame(t(apply(as.data.frame(data)[names(data)], 1, contr.fun, n = n, pr.idx = pr.idx, cov.idx = cov.idx, contr = X))) col.names = NULL for (j in 1:NCOL(X)) col.names = c(col.names, paste("beta", j, sep = ".")) for (j in 1:NCOL(X)) col.names = c(col.names, paste("var.beta", j, sep = ".")) for (j in 1:NCOL(X)) { if (j > 1) { for (k in 1:(j - 1)) { col.names = c(col.names, paste("cov.beta", k, j, sep = ".")) } } } names(res) = col.names if (is(data, "data.frame")) row.names(res) = row.names(data) else if (is(data, "SpatialPolygonsDataFrame")) { rownames(res) = sapply(data@polygons, function(x) slot(x, "ID")) res = SpatialPolygonsDataFrame(as(data, "SpatialPolygons"), res, match.ID = TRUE) } else if (is(data, "Spatial")) { coordinates(res) = coordinates(data) gridded(res) = gridded(data) } res } gstat/R/variogram.formula.R0000644000176200001440000000166014646417261015371 0ustar liggesusers# $Id: variogram.formula.q,v 1.8 2006-02-10 19:01:07 edzer Exp $ "variogram.formula" <- function (object, locations = coordinates(data), data, ...) { if ((missing(locations) && inherits(data, c("sf", "stars"))) || (inherits(locations, c("sf", "stars")))) { if (!requireNamespace("sf", quietly = TRUE)) stop("sf required: install that first") # nocov if (missing(locations)) data = as(data, "Spatial") else locations = as(locations, "Spatial") } # gstat.formula takes care of the case where locations contains # both data and coordinates --- see there. ## ret = gstat.formula(object, locations, data) ## variogram(object = ret$y, locations = ret$locations, X = ret$X, ...) if ((missing(locations) && is(data, "ST")) || (is(locations, "ST"))) variogramST(formula = object, locations = locations, data = data, ...) else { g = gstat(formula = object, locations = locations, data = data) variogram(g, ...) } } gstat/R/variogramST.R0000644000176200001440000004027114646417261014175 0ustar liggesusersVgmFillNA <- function(x, boundaries) { # pads the sample variogram with NA rows where no data are available. n = length(boundaries) - 1 ix = rep(NA, n) #ix[which(1:n %in% findInterval(x$dist, boundaries))] = 1:nrow(x) ix[ findInterval(x$dist, boundaries, rightmost.closed = TRUE) ] = 1:nrow(x) # x$b = boundaries[-1] x[ix,] } VgmAverage = function(ret, boundaries) { # take out NULL variograms: ret = ret[!sapply(ret, is.null)] # take care of missing rows... ret = lapply(ret, VgmFillNA, boundaries = c(0, 1e-6 * boundaries[2], boundaries[-1])) # weighted average: # sum np, weighted sum of gamma and dist devided by summed np np = apply(do.call(cbind, lapply(ret, function(x) x$np)), 1, sum, na.rm = TRUE) gamma = apply(do.call(cbind, lapply(ret, function(x) x$gamma*x$np)), 1, sum, na.rm = TRUE)/np dist = apply(do.call(cbind, lapply(ret, function(x) x$dist*x$np)), 1, sum, na.rm = TRUE)/np v = data.frame(np = np, dist = dist, gamma = gamma) class(v) = class(ret[[1]]) attr(v, "boundaries") = attr(ret[[1]], "boundaries") v[is.na(v)] = NA v } StVgmLag = function(formula, data, dt, pseudo, ...) { dotLst <- list(...) .ValidObs = function(formula, data) !is.na(data[[as.character(as.list(formula)[[2]])]]) d = dim(data) ret = vector("list", d[2] - dt) if (dt == 0) { for (i in 1:d[2]) { d0 = data[,i] valid = .ValidObs(formula, d0) if(sum(valid) <= 1) ret[[i]] <- NULL else { d0 = d0[valid,] ret[[i]] = variogram(formula, d0, ...) } } } else { for (i in 1:(d[2] - dt)) { d1 = data[, i] valid1 = .ValidObs(formula, d1) d2 = data[, i + dt] valid2 = .ValidObs(formula, d2) if(sum(valid1)==0 || sum(valid2)==0) ret[[i]] <- NULL else { d1 = d1[valid1,] d2 = d2[valid2,] obj = gstat(NULL, paste("D", i, sep=""), formula, d1, set = list(zero_dist = 3), beta = 0) obj = gstat(obj, paste("D", i+dt, sep=""), formula, d2, beta = 0) ret[[i]] = variogram(obj, cross = "ONLY", pseudo = pseudo, ...) } } } if(!is.null(dotLst$cloud)) { if(dotLst$cloud) ret <- do.call("rbind", ret) ret$id <- "var1" return(ret) } else { return(VgmAverage(ret, dotLst$boundaries)) } } variogramST = function(formula, locations, data, ..., tlags = 0:15, cutoff, width = cutoff/15, boundaries=seq(0,cutoff,width), progress = interactive(), pseudo = TRUE, assumeRegular=FALSE, na.omit=FALSE, cores = 1) { if (missing(data)) data = locations if (inherits(data, "stars")) { if (!requireNamespace("stars", quietly = TRUE)) stop("stars required: install that first") # nocov data = as(data, "STFDF") } if(missing(cutoff)) { ll = !is.na(is.projected(data@sp)) && !is.projected(data@sp) cutoff <- spDists(t(data@sp@bbox), longlat = ll)[1,2]/3 } if (formula[[3]] != 1) { # there is a regression model: data$resid = residuals(lm(formula, data, na.action = na.exclude)) formula = resid ~ 1 } if(inherits(data, c("STIDF", "sftime"))) return(variogramST.STIDF(formula, as(data, "STIDF"), tlags, cutoff, width, boundaries, progress, cores = cores, ...)) stopifnot(is(data, "STFDF") || is(data, "STSDF")) it = index(data@time) if (assumeRegular || is.regular(zoo(matrix(1:length(it)), order.by = it), strict = TRUE)) { twidth = diff(it)[1] tlags = tlags[tlags <= min(max(tlags), length(unique(it)) - 1)] } else { warning("strictly irregular time steps were assumed to be regular") twidth = mean(diff(it)) } obj = NULL t = twidth * tlags if (progress) pb = txtProgressBar(style = 3, max = length(tlags)) if (cores == 1) { ret = vector("list", length(tlags)) for (dt in seq(along.with = tlags)) { ret[[dt]] = StVgmLag(formula, data, tlags[dt], pseudo = pseudo, boundaries = boundaries, ...) ret[[dt]]$id = paste("lag", dt - 1, sep="") if (progress) setTxtProgressBar(pb, dt) } } else { if (!requireNamespace("future", quietly = TRUE) || !requireNamespace("future.apply", quietly = TRUE)) stop("For parallelization, future and future.apply packages are required") future::plan('multicore', workers = cores) ret <- split(seq(along.with = tlags), seq(along.with = tlags)) ret <- future.apply::future_lapply(X = ret, FUN = function(x){ xx <- StVgmLag(formula, data, tlags[x], pseudo = pseudo, boundaries = boundaries, ...) xx$id <- paste("lag", x - 1, sep="") if (progress) setTxtProgressBar(pb, x) return(xx) }, future.seed = NULL # silence warning ) } if (progress) close(pb) # add time lag: v = do.call(rbind, ret) v$timelag = rep(t, sapply(ret, nrow)) if (is(t, "yearmon")) class(v$timelag) = "yearmon" b = attr(ret[[min(length(tlags),2)]], "boundaries") b = c(0, b[2]/1e6, b[-1]) # ix = findInterval(v$dist, b) will use all spacelags b = b[-2] # spacelags = c(0, b[-length(b)] + diff(b)/2) will use all spacelags v$spacelag = c(0, b[-length(b)] + diff(b)/2) # spacelags[ix] will use all spacelags v$avgDist <- v$dist * v$np for (lagId in unique(v$spacelag)) { bool <- v$spacelag == lagId v$avgDist[bool] <- sum(v$avgDist[bool], na.rm = TRUE) / sum(v$np[bool], na.rm = TRUE) } class(v) = c("StVariogram", "data.frame") if(na.omit) v <- na.omit(v) # setting attributes to allow krigeST to check units attr(v$timelag, "units") <- attr(twidth,"units") if (isTRUE(!is.projected(data))) attr(v$spacelag, "units") = "km" return(v) } ## very irregular data variogramST.STIDF <- function (formula, data, tlags, cutoff, width, boundaries, progress, twindow, tunit, cores = 1) { ll = !is.na(is.projected(data@sp)) && !is.projected(data@sp) if (missing(cutoff)) cutoff <- spDists(t(data@sp@bbox), longlat = ll)[1, 2]/3 m = model.frame(terms(formula), as(data, "data.frame")) diffTime <- diff(index(data)) if (inherits(diffTime, "difftime")) { timeScale <- units(diffTime) if(missing(tunit)) warning(paste("The argument 'tunit' is missing: tlags are assumed to be given in ", timeScale, ".",sep="")) else { stopifnot(tunit %in% c("secs", "mins", "hours", "days", "weeks")) units(diffTime) <- tunit timeScale <- tunit } diffTime <- as.numeric(diffTime) } else if (!missing(tunit)) stop("'tunit' ignored, as time values are not of class POSIXct or Date") if (missing(twindow)) twindow <- round(2 * max(tlags, na.rm=TRUE) / mean(diffTime, na.rm = TRUE), 0) nData <- nrow(data) # re-using the order propertie of the time slot to only store the next "twindow" distances numTime <- as.numeric(index(data)) diffTimeMat <- matrix(NA, nData, twindow) for (i in 1:nData) { # i <- 1 diffTimeMat[i,1:min(nData,twindow)] <- cumsum(diffTime[i+0:(min(nData,twindow)-1)]) } nSp <- length(boundaries) nTp <- length(tlags) distTp <- matrix(NA, nSp-1, nTp-1) distSp <- matrix(NA, nSp-1, nTp-1) gamma <- matrix(NA, nSp-1, nTp-1) np <- matrix(NA, nSp-1 ,nTp-1) # temporal selection if(progress) pb <- txtProgressBar(0, nTp-1, 0, style=3) for (i in 1:(nTp-1)) { # i <- 1 ind <- which(diffTimeMat >= tlags[i] & diffTimeMat < tlags[i+1]) if (length(ind) < 1) next tmpInd <- matrix(NA,nrow=length(ind),4) tmpInd[,1] <- ind %% nData # row number tmpInd[,2] <- (ind %/% nData)+1 # col number if (cores == 1){ tmpInd[,3] <- apply(tmpInd[,1:2,drop=FALSE], 1, function(x) spDists(data@sp[x[1]], data@sp[x[2]+x[1],])) } else { if(!requireNamespace("future", quietly = TRUE) || !requireNamespace("future.apply", quietly = TRUE)) stop("For parallelization, future and future.apply packages are required") future::plan("multicore", workers = cores) tmpInd[,3] <- future.apply::future_apply(X = tmpInd[,1:2,drop=FALSE], MARGIN = 1, FUN = function(x) spDists(data@sp[x[1]], data@sp[x[2]+x[1],]), future.seed = NULL) } tmpInd[,4] <- diffTimeMat[tmpInd[,1:2, drop=FALSE]] # spatial selection for (j in 1:(nSp-1)) { # j <- 3 indSp <- which(tmpInd[,3] >= boundaries[j] & tmpInd[,3] < boundaries[j+1]) if (length(indSp) < 1) next distSp[j,i] <- mean(tmpInd[indSp,3]) distTp[j,i] <- mean(tmpInd[indSp,4]) indSp <- cbind(ind[indSp] %% nData, (ind[indSp] %/% nData)+1) np[j,i] <- nrow(indSp) # Issue #7, Thanks to Roelof. gamma[j,i] <- 0.5*mean((data[,,colnames(m)[1]]@data[indSp[,1],1] - data[,,colnames(m)[1]]@data[indSp[,1]+indSp[,2],1])^2, na.rm=TRUE) } if(progress) setTxtProgressBar(pb, value=i) } if(progress) close(pb) res <- data.frame(np=as.vector(np), dist=as.vector(distSp), gamma=as.vector(gamma), id=paste("lag",rep(1:(nTp-1),each=nSp-1), sep=""), timelag=rep(tlags[-nTp]+diff(tlags)/2,each=nSp-1), spacelag=rep(boundaries[-nSp]+diff(boundaries)/2, nTp-1)) res$avgDist <- res$dist * res$np for (lagId in unique(res$spacelag)) { bool <- res$spacelag == lagId res$avgDist[bool] <- sum(res$avgDist[bool], na.rm = TRUE) / sum(res$np[bool], na.rm = TRUE) } attr(res$timelag, "units") <- timeScale attr(res$spacelag, "units") <- ifelse(ll, "km", "m") class(res) <- c("StVariogram", "data.frame") return(res) } ## plotting plot.StVariogram = function(x, model=NULL, ..., col = bpy.colors(), xlab, ylab, map = TRUE, convertMonths = FALSE, as.table = TRUE, wireframe = FALSE, diff = FALSE, all=FALSE) { lst = list(...) if (!is.null(lst$col.regions)) col = lst$col.regions if (is(x$timelag, "yearmon")) { if (convertMonths) { x$timelag = as.numeric(x$timelag) * 12 attr(x$timelag, "units") = "months" } else attr(x$timelag, "units") = "years" } if (missing(xlab)) { xlab = "distance" u = attr(x$spacelag, "units") if (!is.null(u)) xlab = paste(xlab, " (", u, ")", sep="") } if (missing(ylab)) { ylab = "time lag" u = attr(x$timelag, "units") if (!is.null(u)) ylab = paste(ylab, " (", u, ")", sep="") } x$timelag = as.numeric(x$timelag) # check for older spatio-temporal variograms and compute avgDist on demand if(is.null(x$avgDist)) { x$avgDist <- x$dist * x$np for (lagId in unique(x$spacelag)) { bool <- x$spacelag == lagId x$avgDist[bool] <- sum(x$avgDist[bool] / sum(x$np[bool], na.rm = TRUE), na.rm = TRUE) } } if(!is.null(model)) { if (is(model,"StVariogramModel")) model <- list(model) for (mod in model) { slag <- x$avgDist slag[slag == 0 & x$timelag == 0] <- sqrt(.Machine$double.eps) x[[mod$stModel]] <- variogramSurface(mod, data.frame(spacelag = slag, timelag = x$timelag))$gamma if (diff) x[[mod$stModel]] <- x[[mod$stModel]] - x$gamma } } x0 = x # needed by wireframe() if (!is.null(model)) { modelNames <- sapply(model, function(x) x$stModel) if (all && !diff) v0 <- x[,c("dist", "id", "avgDist", "timelag")] else v0 <- NULL for (i in modelNames) v0 <- rbind(v0, x[,c("dist", "id", "avgDist", "timelag")]) if(all & !diff) {# we also need the sample v0$what = factor(c(rep("sample", nrow(x)), rep(modelNames, each=nrow(x))), levels=c("sample", modelNames), ordered = TRUE) v0$gamma = c(x$gamma, unlist(x[,modelNames])) } else { v0$what = factor(rep(modelNames, each=nrow(x)), levels=modelNames, ordered=TRUE) v0$gamma = c(unlist(x[,modelNames])) } x = v0 } if (wireframe) { if (!is.null(model)) { if (length(model) > 1 || all) wireframe(gamma ~ avgDist*timelag | what, x, drape = TRUE, col.regions = col, xlab = xlab, ylab = ylab, as.table=as.table, ...) else wireframe(as.formula(paste(model[[1]]$stModel,"~ avgDist*timelag")), x0, drape = TRUE, col.regions = col, xlab = xlab, ylab = ylab, as.table=as.table, ...) } else # without a model, plot only the sample variogram as a wireframe wireframe(gamma ~ avgDist * timelag, x0, drape = TRUE, col.regions = col, xlab = xlab, ylab = ylab, ...) } else if (map) { if (!is.null(model)) f = gamma ~ avgDist + timelag | what else f = gamma ~ avgDist + timelag levelplot(f, x, xlab = xlab, ylab = ylab, col.regions = col, as.table=as.table, ...) } else { # not map, not wireplot if (!is.null(model)) f = gamma ~ dist | what else f = gamma ~ dist x$id = factor(x$id, levels=unique(x$id)) bp = bpy.colors(length(levels(x$id))) ps = list(superpose.line=list(col=bp), superpose.symbol=list(col=bp)) xlim = c(0, max(x$dist) * 1.04) if (diff) { xyplot(f, x, groups = x$id, type='b', xlim = xlim, auto.key = list(space = "right"), xlab = xlab, par.settings = ps, as.table=as.table, ...) } else { ylim = c(0, max(x$gamma) * 1.04) xyplot(f, x, groups = x$id, type='b', ylim = ylim, xlim = xlim, auto.key = list(space = "right"), xlab = xlab, par.settings = ps, as.table=as.table, ...) } } } print.StVariogramModel <- function(x, ...) { possComp <- c("space", "time", "joint") for(comp in possComp[possComp %in% names(x)]) { rownames(x[[comp]]) <- 1:nrow(x[[comp]]) cat(paste(comp,"component: \n")) print(x[[comp]], ...) } possAddPar <- c("sill", "nugget", "stAni", "k") for(addPar in possAddPar[possAddPar %in% names(x)]) { cat(paste(addPar, ": ",x[[addPar]],"\n", sep="")) } } ## guess the spatio-temporal anisotropy without spatio-temporal models ###################################################################### estiStAni <- function(empVgm, interval, method="linear", spatialVgm, temporalVgm, s.range=NA, t.range=NA) { if (!is.na(s.range)) empVgm <- empVgm[empVgm$dist <= s.range,] if (!is.na(t.range)) empVgm <- empVgm[empVgm$timelag <= t.range,] empVgm$timelag = as.numeric(empVgm$timelag) # in case it is of class difftime, messes up on R 4.1 switch(method, linear = estiStAni.lin(empVgm, interval), range = estiAni.range(empVgm, spatialVgm, temporalVgm), vgm = estiAni.vgm(empVgm, spatialVgm, interval), metric = estiAni.metric(empVgm, spatialVgm, interval), stop(paste("Method", method,"is not implemented."))) } # linear estiStAni.lin <- function(empVgm, interval) { lmSp <- lm(gamma~dist, empVgm[empVgm$timelag == 0,]) optFun <- function(stAni, empVgm) { sqrt(mean((predict(lmSp, newdata = data.frame(dist=empVgm[empVgm$spacelag == 0,]$timelag*stAni)) - empVgm[empVgm$spacelag == 0,]$gamma)^2, na.rm=TRUE)) } optimise(optFun, interval, empVgm = empVgm)$minimum } # range estiAni.range <- function(empVgm, spatialVgm, temporalVgm) { spEmpVgm <- empVgm[empVgm$timelag == 0,] class(spEmpVgm) <- c("gstatVariogram","data.frame") spEmpVgm <- spEmpVgm[-1,1:3] spEmpVgm$dir.hor <- 0 spEmpVgm$dir.ver <- 0 spatialVgm <- fit.variogram(spEmpVgm, spatialVgm) tmpEmpVgm <- empVgm[empVgm$spacelag == 0,] class(tmpEmpVgm) <- c("gstatVariogram","data.frame") tmpEmpVgm <- tmpEmpVgm[-1,c("np","timelag","gamma")] colnames(tmpEmpVgm) <- c("np", "dist", "gamma") tmpEmpVgm$dir.hor <- 0 tmpEmpVgm$dir.ver <- 0 temporalVgm <- fit.variogram(tmpEmpVgm, temporalVgm) spatialVgm$range[2]/temporalVgm$range[2] } # variograms estiAni.vgm <- function(empVgm, spatialVgm, interval) { spEmpVgm <- empVgm[empVgm$timelag == 0,] class(spEmpVgm) <- c("gstatVariogram","data.frame") spEmpVgm <- spEmpVgm[-1,1:3] spEmpVgm$dir.hor <- 0 spEmpVgm$dir.ver <- 0 spatialVgm <- fit.variogram(spEmpVgm, spatialVgm) optFun <- function(stAni) { sqrt(mean((variogramLine(spatialVgm, dist_vector = empVgm[empVgm$spacelag == 0,]$timelag*stAni)$gamma - empVgm[empVgm$spacelag == 0,]$gamma)^2, na.rm=TRUE)) } optimise(optFun, interval)$minimum } # metric variogram estiAni.metric <- function(empVgm, spatialVgm, interval) { fit.StVariogram(empVgm, vgmST("metric", joint=spatialVgm, stAni=mean(interval)))$stAni[[1]] } gstat/cleanup0000755000176200001440000000012014750415430012745 0ustar liggesusersrm -f src/*.o src/gstat.so makefile src/makefile src/lex.l src/parse.y src/tags gstat/demo/0000755000176200001440000000000014746212142012323 5ustar liggesusersgstat/demo/fulmar.R0000644000176200001440000000517714646417261013756 0ustar liggesusers# $Id: fulmar.R,v 1.3 2006-02-10 19:05:02 edzer Exp $ library(sp) library(gstat) data(fulmar) data(ncp.grid) glm98 <- glm(formula = fulmar ~ depth + coast, family = quasipoisson, data = fulmar[fulmar$year == 1998, ]) glm99 <- glm(formula = fulmar ~ depth + coast, family = quasipoisson, data = fulmar[fulmar$year == 1999, ]) fulmar98 = data.frame(fulmar[fulmar$year == 1998,], pr98 = predict(glm98, type = "response")) fulmar99 <- data.frame(fulmar[fulmar$year == 1999,], pr99 = predict(glm99, type = "response")) pr98.grd <- predict(glm98, newdata = ncp.grid, type = "response", se.fit=TRUE) pr99.grd <- predict(glm99, newdata = ncp.grid, type = "response", se.fit=TRUE) pr <- data.frame(ncp.grid, pr98=pr98.grd$fit, pr99=pr99.grd$fit, se98 = pr98.grd$se.fit, se99 = pr99.grd$se.fit) # B.3 create gstat object g <- gstat(id = "fulmar98", formula = fulmar~pr98, locations = ~x+y, data = fulmar98, model = vgm(1.89629, "Exp", 50000, 0.852478), beta = c(0,1), variance = "mu") g <- gstat(g, id = "fulmar99", formula = fulmar~pr99, locations = ~x+y, data = fulmar99, model = vgm(2.52259, "Exp", 50000, 1.76474), beta = c(0,1), variance = "mu") h <- g h <- gstat(h, id = c("fulmar98","fulmar99"), model = vgm(2.18, "Exp", 50000, 1.22)) # predict block means for blocks in ncp.grid$area (table 2; cokriging) library(maptools) areas.r = readShapePoly(system.file("external/ncp.shp", package="gstat")) #areas.r <- as.SpatialRings.Shapes(areas.shp$Shapes, areas.shp$att.data$WSVGEB_) coordinates(pr) = ~x+y #pr.df = overlay(pr, areas.r, fn = mean) pr.df = na.omit(as(aggregate(pr, areas.r, FUN = mean), "data.frame")) # match non-empty (and relevant) areas: #areas = SpatialPolygonsDataFrame(areas.r[c(2,3,4,16),"WSVGEB_"], pr.df[c(1,2,3,5),])#,match.ID=F) areas = SpatialPolygonsDataFrame(areas.r[c(1,2,12,7),"WSVGEB_"], pr.df[c(1,2,3,5),], match.ID=F) # areas ID's 0 1 2 14 sk = predict(g, areas) cok = predict(h, areas) spplot(cok, c(3,5), names.attr = c("1998", "1999"), main = "Fulmaris glacialis, density estimates\n(by irregular block cokriging)") sk = as.data.frame(sk) cok = as.data.frame(cok) print(data.frame(area = c(1,2,3,16), SK98 = sk$fulmar98.pred, SE98 = sqrt(sk$fulmar98.var), SK99 = sk$fulmar99.pred, SE99 = sqrt(sk$fulmar99.var), CK98 = cok$fulmar98.pred, SE98 = sqrt(cok$fulmar98.var), CK99 = cok$fulmar99.pred, SE99 = sqrt(cok$fulmar99.var)), digits=3) print(data.frame(area = c(1,2,3,16), dSK = sk$fulmar99.pred - sk$fulmar98.pred, SEdSK = sqrt(sk$fulmar98.var+sk$fulmar99.var), dCOK = cok$fulmar99.pred - cok$fulmar98.pred, SEdCOK = sqrt(cok$fulmar98.var+cok$fulmar99.var - 2*cok$cov.fulmar98.fulmar99)), digits=3) gstat/demo/a2p.R0000644000176200001440000000167714646417261013153 0ustar liggesusersRprof() # import NC SIDS data: library(sp) library(maptools) fname = system.file("shapes/sids.shp", package="maptools")[1] nc = readShapePoly(fname, proj4string = CRS("+proj=longlat +datum=NAD27 +ellps=clrk66")) # reproject to UTM17, so we can use Euclidian distances: library(rgdal) nc = spTransform(nc, CRS("+proj=utm +zone=17 +datum=WGS84 +ellps=WGS84")) # create a target (newdata) grid, and plot: grd = spsample(nc, "regular", n = 1000) class(grd) plot(nc, axes = TRUE) points(grd, pch = 3) library(gstat) # area-to-point kriging: kr = krige0(SID74 ~ 1, nc, grd, vgmArea, ndiscr = 9, vgm = vgm(1, "Exp", 1e5, 0), # point variogram, verbose = TRUE) out = SpatialPixelsDataFrame(grd, data.frame(pred = kr)) pl0 = spplot(nc["SID74"], main = "areas") pl1 = spplot(out, sp.layout = list("sp.polygons", nc, first=F,col='grey'), main = "points on a grid") print(pl0, split = c(1,1,1,2), more = TRUE) print(pl1, split = c(1,2,1,2), more = FALSE) gstat/demo/ikr.R0000644000176200001440000000077714646417261013256 0ustar liggesuserslibrary(sp) library(gstat) data(meuse) data(meuse.grid) coordinates(meuse)=~x+y gridded(meuse.grid)=~x+y v = variogram(I(zinc < 500)~1,meuse) plot(v) vm = fit.variogram(v, vgm(1, "Sph", 300, 1)) plot(v,vm) vm # possibly adjust sum of sill to be max. 0.25? ik = krige(I(zinc>500)~1, meuse, meuse.grid, vm) spplot(ik[1],col.regions=bpy.colors()) summary(ik[[1]]) # adjust values outside [0,1] to nearest limit: ik[[1]][ik[[1]]<0] = 0 ik[[1]][ik[[1]]>1] = 1 summary(ik[[1]]) spplot(ik[1],col.regions=bpy.colors()) gstat/demo/pcb.R0000644000176200001440000001123414646417261013223 0ustar liggesusers# $Id: pcb.R,v 1.9 2008-02-01 22:39:44 edzer Exp $ # FIGURE 1: library(sp) library(gstat) library(maptools) library(lattice) data(pcb) coordinates(pcb) = ~x+y data(ncp.grid) gridded(ncp.grid) = ~x+y wsv = readShapePoly(system.file("external/ncp.shp", package="gstat")) classes = c(.2,1,2,5,10,20) print(xyplot(y ~ x | as.factor(year), groups = sqrt(PCB138)/3, data = as.data.frame(pcb), panel = function(x, y, groups, subscripts, ...) { sp.polygons(wsv, col = grey(.5)) panel.xyplot(x, y, cex = groups[subscripts], ...) }, xlab = "x-coordinate", ylab = "y-coordinate", key = list(corner = c(0,0), x=0.8, y=0.25, points = list(pch = 1, col = 1, cex = sqrt(classes)/3), text = list(as.character(classes))), aspect = "iso", as.table = T, xlim = c(464000, 739000), ylim = c(5696500, 6131500), scales = list(draw = F))) # FIGURE 2: pcb$yf = as.factor(pcb$year) pcb$int = rep(NA, dim(pcb)[1]) c = lm(log(PCB138)~-1+depth+yf,pcb)$coefficients i = 2 for (f in levels(pcb$yf)) { pcb$int[pcb$yf == f] = c[i] i = i+1 } print(xyplot(log(PCB138)~depth | as.factor(year), groups = int, data = as.data.frame(pcb), panel = function(x, y, groups, subscripts, ...) { # panel.grid(h=-1, v= 2) panel.xyplot(x, y) y = c(groups[subscripts][1], groups[subscripts][1] + -0.0641*45) llines(c(0, 45), y, lty = 2) }, scales = list( y = list(at=log(c(.2, .5, 1, 2, 5, 10, 20)), labels=c(".2",".5","1","2","5","10","20"), alternating = F) ), xlab = "water depth", ylab = "PCB138", as.table = T) ) # FIGURE 3: # ps.options(width=2, height=2) pcb$res=residuals(lm(log(PCB138)~year+depth, pcb)) v3 = variogram(res ~ year, pcb, dX=.1, bound=c(0,1000,3000,5000,(1:16)*10000)) print(plot(v3, model = vgm(.224,"Exp",17247,.08), plot.numbers = TRUE)) # FIGURE 4: # next g.pcb = NULL merge = list(c("P1986", 2, "P1991", 2), c("P1986", 2, "P1996", 2), c("P1986", 2, "P2000", 2)) for (f in levels(pcb$yf)[c(1,4,6,7)]) g.pcb= gstat(g.pcb, paste("P", as.character(f), sep = ""), log(PCB138)~depth, pcb[pcb$yf == f,], merge = merge) g.pcb = gstat(g.pcb, model = vgm(.224,"Exp",17247,.08), fill.all=T) v = variogram(g.pcb, cutoff=1e5) #plot(v, model = fit.lmc(v, g)) #plot(v, model = g,plot.numbers = TRUE) PCB.cor = matrix(NA, 4,4) i = 1 for (x in levels(pcb$yf)[c(1,4,6,7)]) { j = 1 for (y in levels(pcb$yf)[c(1,4,6,7)]) { A = log(pcb[pcb$yf == x,]$PCB138) B.tmp = krige(PCB138~1, pcb[pcb$yf == y,], pcb[pcb$yf == x,], nmax = 1, set=list(debug=0)) B = log(B.tmp$var1.pred) # print(paste(x, y, cor(A,B))) PCB.cor[i,j] = cor(A,B) j = j + 1 } i = i + 1 } years=c(1986,1991,1996,2000) dimnames(PCB.cor)=list(years,years) PCB.cor.ns = PCB.cor PCB.cor = 0.5 * (PCB.cor + t(PCB.cor)) i = 1 for (x in levels(pcb$yf)[c(1,4,6,7)]) { j = 1 for (y in levels(pcb$yf)[c(1,4,6,7)]) { if (j > i) { name = paste(paste("P", x, sep=""), paste("P", y, sep=""),sep = ".") print(name) g.pcb$model[[name]]["psill"] = g.pcb$model[[name]]["psill"] * PCB.cor[i,j] } j = j + 1 } i = i + 1 } print(plot(v, model = g.pcb, plot.numbers = FALSE)) print(PCB.cor.ns, digits=3) print(PCB.cor, digits=3) # FIGURE 5: pcb.cok = predict(g.pcb, newdata = ncp.grid, debug.level = 0) levs = c(.1,.2,.5,1,2,5,10,20) spplot(pcb.cok[c(1,3,5,7)], as.table=T, col.regions = bpy.colors(7), at = log(levs), colorkey = list(at = log(levs), labels = as.character(levs), col = bpy.colors(7)), layout = c(4,1) ) spplot(pcb.cok[c(4,11,6,12,13,8,14,15,16,10)-2], skip=c(F,T,T,T,F,F,T,T,F,F,F,T,F,F,F,F), as.table=T, layout=c(4,4), asp="iso", col.regions = bpy.colors()) X = cbind(rep(1,7), c(1986, 1987, 1989, 1991, 1993, 1996, 2000)) X2=X[c(1,4,6,7),] lambda = solve(t(X2) %*% X2) %*% t(X2) dimnames(lambda) = list(NULL, c(1986, 1991, 1996, 2000)) print(lambda[2, ], digits=3) # FIGURE 7: pcb.contr = get.contr(pcb.cok, g.pcb, X=lambda[2, ]) # copy coordinates #pcb.contr$x = pcb.cok$x #pcb.contr$y = pcb.cok$y pl1 = spplot(pcb.contr["beta.1"], main = "log-PCB138: change estimate", col.regions = bpy.colors(100)) pcb.contr$sig = pcb.contr$beta.1 / sqrt(pcb.contr$var.beta.1) pl2 = spplot(pcb.contr["sig"], main = "log-PCB138 change/SE", col.regions = bpy.colors(100)) print(pl1, position=c(0,0,0.5,1), more = TRUE) print(pl2, position=c(0.5,0,1,1), more = FALSE) cat("source:\n\nEdzer J. Pebesma, Richard N.M. Duin (2005) Spatio-temporal mapping of\nsea floor sediment pollution in the North Sea. In: Ph. Renard, and\nR. Froidevaux, eds. Proceedings GeoENV 2004 -- Fifth European Conference\non Geostatistics for Environmental Applications; Springer.\n") gstat/demo/depend.R0000644000176200001440000000252714646417261013723 0ustar liggesusersrequire(tools) packages_to_check <- function(dep, which = c("Depends", "Imports", "LinkingTo", "Suggests"), recursive = FALSE){ download.file("https://cran.R-project.org/web/packages/packages.rds", "packages.rds", mode="wb") x <- readRDS("packages.rds") x <- x[!duplicated(x[,1]),] packages <- x[,1] rdeps <- package_dependencies(packages = dep, x, which = which, recursive = recursive, reverse = TRUE) paste(apply(x[x[,1] %in% rdeps[[1]], 1:2], 1, paste, collapse="_"), ".tar.gz", sep="") } #RCheck = function(x, URL = "http://ftp5.gwdg.de/pub/misc/cran/src/contrib/") { RCheck = function(x, URL = "https://cran.r-project.org/src/contrib/") { if (!file.exists(x)) download.file(paste(URL, x, sep=""), x) cmd = paste("R CMD check --as-cran ", x, " > ", x, ".log", sep = "") print(cmd) ret = system(cmd) print(ret) ret } result <- packages_to_check("gstat") result sel = TRUE library(parallel) ncores_to_use = 2 cl <- makeCluster(getOption("cl.cores", ncores_to_use)) clusterExport(cl, c("RCheck", "sel", "result")) out = parLapply(cl, result[sel], function(x) RCheck(x)) succ = unlist(out) x = which(succ != 0) result[x] bla = lapply(result[x], function(y) { cat(paste(y, ":\n")) system(paste("tail -20 ",y,".log", sep="")) } ) #result <- packages_to_check("sp", recursive=TRUE) gstat/demo/snow.R0000644000176200001440000000206514646417261013447 0ustar liggesuserslibrary(sp) library(gstat) data(meuse.grid) gridded(meuse.grid) = ~x+y data(meuse) coordinates(meuse) = ~x+y ncell = 1000000 # sample 1000000 points over meuse.grid: newd = spsample(meuse.grid, ncell, type="regular") ncell = dim(coordinates(newd))[1] v = vgm(0.6, "Sph", 900, 0.05) library(parallel) nclus = detectCores() clus <- c(rep("localhost", nclus)) # set up cluster and data cl <- makeCluster(clus, type = "SOCK") clusterEvalQ(cl, library(gstat)) clusterExport(cl, list("meuse", "meuse.grid", "v")) # split prediction locations: # either at random: splt = sample(1:nclus, nrow(coordinates(newd)), replace = TRUE) # or regular: splt = rep(1:nclus, each = ceiling(ncell/nclus), length.out = ncell) newdlst = lapply(as.list(1:nclus), function(w) newd[splt == w,]) # no cluster: system.time(out.noclus <- krige(log(zinc)~1, meuse, newd, v)) # with cluster: system.time(out.clus <- do.call("rbind", parLapply(cl, newdlst, function(lst) krige(log(zinc)~1, meuse, lst, v) ))) stopCluster(cl) all.equal(out.clus, out.noclus) gridded(out.clus) = TRUE image(out.clus) gstat/demo/blue.R0000644000176200001440000000154014646417261013405 0ustar liggesusers# how to get the BLUE trend coefficients out of a predict.gstat call? # prepare data library(sp) library(gstat) data(meuse) coordinates(meuse) = ~x+y data(meuse.grid) gridded(meuse.grid) = ~x+y # create a manual, non-automatic intercept meuse$Int = rep(1, length(meuse$zinc)) meuse.grid$Int = rep(1, length(meuse.grid$dist)) # create a gstat object without an automatic intercept: g = gstat(formula = log(zinc)~-1+Int+sqrt(dist), data=meuse, model = vgm(1, "Exp", 300)) newdat = meuse.grid[1:2,c("Int", "dist")] gridded(newdat) = FALSE newdat$dist = c(0,1) newdat$Int = c(1,0) # (in the more general case of n predictors, make sure that the matrix with # predictors, or design matrix, equals the identity matrix.) newdat out = as.data.frame(predict(g, newdat, BLUE = TRUE))[,3:4] rownames(out) = c("Intercept", "slope") colnames(out) = c("BLUE", "Variance") out gstat/demo/grass.R0000644000176200001440000000325114646417261013576 0ustar liggesusers# $Id: grass.R,v 1.4 2006-02-10 19:05:02 edzer Exp $ # this demo assumes quite a lot: # a. it assumes GRASS gis is running # b. it assumes that the meuse data zinc variable is available as a site list # c. it assumes that mask_map is present, and contains the mask map values # (i.e., the study area) library(sp) library(GRASS) # load R GRASS interface G = gmeta() # retrieves active data base locations and topology d = sites.get(G, "zinc") # retrieve zinc observations plot(d$east, d$north, asp=1) names(d)[4] = "zinc" # rename attribute mask = rast.get hist(d$zinc) hist(log(d$zinc)) mask = rast.get(G, "mask_map") plot(G, mask$mask.map) points(d$east,d$north, pch="+") library(gstat) # load gstat library bubble(d, zcol = "zinc", col=c(4,5), maxsize=2) # explain S formulae: ~ v = variogram(log(zinc)~1, ~east+north, d) plot(v) v.mod = vgm(.6, "Sph", 900, .1) plot(v, model = v.mod) v.fit = fit.variogram(v, v.mod) plot(v, model = v.fit) zinc.g = gstat(NULL, "lzinc", log(zinc)~1, ~east+north, d, model = v.fit) new.data = data.frame(east = east(G), north = north(G)) new.data[is.na(mask$mask.map), ] = c(NA,NA) zinc.kr = predict(zinc.g, new.data) image(zinc.kr) library(lattice) levelplot(lzinc.pred~east+north, zinc.kr, asp=1.34, col.regions=bpy.colors(100)) # push prediction and variances grids back into GRASS data base: rast.put(G, "lzinc.pred", zinc.kr$lzinc.pred) rast.put(G, "lzinc.var", zinc.kr$lzinc.var) # push cross validation residuals back to GRASS data base: xv = krige.cv(log(zinc)~1, ~east+north, d, v.fit, nmax = 40, verb=F) sites.put2(G, data = xv, dims = c("east", "north", "residual", "zscore"), lname = "lzinc.xv") gstat/demo/stkrige.R0000644000176200001440000002317014646417261014131 0ustar liggesusers# Ben Graeler, 25 th March, 2016 # # Script reproducing the fit of the vignette "spatio-temporal-kriging # libraries library(sp) library(spacetime) library(gstat) library(rgdal) # load data from package gstat data(DE_RB_2005, package = "gstat") paper <- FALSE set.seed(123) smplDays <- sort(sample(365,8)) # load German boundaries data(air) DE_NUTS1 <- spTransform(DE_NUTS1, CRS("+init=epsg:32632")) if(!paper) plot(DE_NUTS1) # station wise coverage if(!paper) barplot(sort(table(DE_RB_2005@index[,1])), main="reported days per station", ylab="number of days", xaxt="n") # acf if(!paper) { acf(DE_RB_2005[sample(68,1),,drop=F]@data) var(DE_RB_2005@data$PM10) } # a few daily snapshots if(paper) png("vignettes/figures/daily_means_PM10.png", width=9, height=6, "in", res=150) stplot(as(DE_RB_2005[,smplDays],"STFDF"), col.regions=bpy.colors(120)[-(1:20)], sp.layout = list("sp.polygons", DE_NUTS1), scales=list(draw=F), key.space="right", colorkey=T, cuts=0:70, main=NULL) if(paper) dev.off() # number of stations length(DE_RB_2005@sp) # calculate the empirical variogram empVgm <- variogramST(PM10~1, DE_RB_2005, tlags=0:6) if(!paper) { plot(empVgm, wireframe=T, scales=list(arrows=F)) plot(empVgm) } # fit of theoretical purely spatial models # ############################################ spEmpVgm <- empVgm[empVgm$timelag == 0,] class(spEmpVgm) <- c("gstatVariogram", "data.frame") spEmpVgm <- spEmpVgm[-1,1:3] spEmpVgm$dir.hor <- 0 spEmpVgm$dir.ver <- 0 spVgmMod <- fit.variogram(spEmpVgm, vgm(80,"Exp",300000,20)) if(!paper) plot(spEmpVgm, spVgmMod) # fit of theoretical spatio-temporal models # ############################################# linStAni <- estiStAni(empVgm, c(50000,200000)) if(!paper) { plot(gamma~dist, empVgm[empVgm$timelag == 0,], ylim=c(0,100), xlim=c(0,800000)) points(empVgm[empVgm$spacelag == 0,]$timelag*linStAni, empVgm[empVgm$spacelag == 0,]$gamma, col="red") } ## # rescale empVgm and linStAni to km for estimation empVgm$dist <- empVgm$dist/1000 empVgm$avgDist <- empVgm$avgDist/1000 empVgm$spacelag <- empVgm$spacelag/1000 linStAni <- linStAni/1000 # separable separableModel <- vgmST("separable", space=vgm(0.9,"Exp", 200, 0.1), time =vgm(0.9,"Sph", 3.5, 0.1), sill=120) fitSepModel <- fit.StVariogram(empVgm, separableModel, fit.method = 7, stAni = linStAni, method = "L-BFGS-B", control = list(parscale=c(100,1,10,1,100)), lower = c(10,0,.1,0,0.1), upper = c(2000,1,12,1,200)) attr(fitSepModel, "optim.output")$value # Exp+Exp: 9.87, Exp+Sph: 6.82, Sph+Exp: 10.42, Sph+Sph: 7.50 if(!paper) plot(empVgm, fitSepModel, wireframe=T, all=T, scales=list(arrows=F), zlim=c(0,135)) # product-sum prodSumModel <- vgmST("productSum", space=vgm(10, "Exp", 200, 1), time= vgm(10, "Sph", 2, 1), k=2) fitProdSumModel <- fit.StVariogram(empVgm, prodSumModel, fit.method = 7, stAni = linStAni, method = "L-BFGS-B", control = list(parscale = c(1,10,1,1,0.1,1,10)), lower = rep(0.0001,7)) attr(fitProdSumModel, "optim.output")$value # Exp+Exp: 10.09, Exp+Sph: 6.91, Sph+Exp: 10.64, Sph+Sph: 7.59 plot(empVgm, fitProdSumModel, wireframe=T, all=T, scales=list(arrows=F), zlim=c(0,135)) # metric metricModel <- vgmST("metric", joint = vgm(60, "Mat", 150, 10, kappa=0.6), stAni = 60) fitMetricModel <- fit.StVariogram(empVgm, metricModel, fit.method = 7, stAni = linStAni, method = "L-BFGS-B", control = list(parscale = c(10,20,5,10)), lower = c(80,50,5,50), upper = c(200,1500,60,300)) attr(fitMetricModel, "optim.output")$value # Exp: 10.25, Sph: 10.59, # Gau: 21.32, Mat 5: 18.20, Mat 2: 14.43, Mat 1.25: 12.04, # Mat 1: 11.07, Mat 0.75: 10.23, Mat 0.6: 10.05 if(!paper) plot(empVgm, fitMetricModel, wireframe=T, all=T, scales=list(arrows=F), zlim=c(0,135)) # simplified sumMetric model? sumMetricFromsimpleSumMetric <- function(vgm) { vgmST("sumMetric", space=vgm(vgm$space$psill, vgm$space$model, vgm$space$range, vgm$nugget/3), time =vgm(vgm$time$psill, vgm$time$model, vgm$time$range, vgm$nugget/3), joint=vgm(vgm$joint$psill, vgm$joint$model, vgm$joint$range, vgm$nugget/3), stAni=vgm$stAni) } simpleSumMetricModel <- vgmST("simpleSumMetric", space=vgm(120,"Sph", 150), time =vgm(120,"Exp", 10), joint=vgm(120,"Sph", 150), nugget=10, stAni=150) fitSimpleSumMetricModel <- fit.StVariogram(empVgm, simpleSumMetricModel, fit.method = 7, stAni=linStAni, method = "L-BFGS-B", lower = c(sill.s = 0, range.s = 10, sill.t = 0, range.t = 0.1, sill.st= 0, range.st= 10, nugget=0, anis = 40), upper = c(sill.s = 200, range.s = 500, sill.t = 200, range.t = 20, sill.st= 200, range.st = 5000, nugget = 100, anis = 1000), control = list(parscale = c(1,10,1,1,1,100,1,10))) attr(fitSimpleSumMetricModel, "optim.output")$value # Exp+Exp+Exp: 4.10 Exp+Sph+Exp: 3.60 Sph+Exp+Exp: 3.94 Sph+Sph+Exp: 3.32 # Exp+Exp+Sph: 3.74 Exp+Sph+Sph: 3.98 Sph+Exp+Sph: 3.31 Sph+Sph+Sph: 3.56 if(!paper) plot(empVgm,fitSimpleSumMetricModel, wireframe = T, scales = list(arrows = F), all = T , zlim=c(0,130)) # sum-metric # sumMetricModel <- sumMetricFromsimpleSumMetric(fitSimpleSumMetricModel) sumMetricModel <- vgmST("sumMetric", space = vgm(20, "Sph", 150, 1), time = vgm(10, "Exp", 2, 0.5), joint = vgm(80, "Sph", 1500, 2.5), stAni = 120) fitSumMetricModel <- fit.StVariogram(empVgm, sumMetricModel, fit.method = 7, stAni=linStAni, method = "L-BFGS-B", lower = c(sill.s = 0, range.s = 10, nugget.s = 0, sill.t = 0, range.t = 0.1, nugget.t = 0, sill.st= 0, range.st = 10, nugget.st = 0, anis = 40), upper = c(sill.s = 200, range.s = 1E3, nugget.s = 20, sill.t = 200, range.t = 75, nugget.t = 20, sill.st= 200, range.st = 5E3, nugget.st = 20, anis = 500), control = list(parscale = c(1,100,1,1,0.5,1,1,100,1,100), maxit=1e4)) attr(fitSumMetricModel, "optim.output")$value # Exp+Exp+Exp: 4.10 Exp+Sph+Exp: 3.60 Sph+Exp+Exp: 3.89 Sph+Sph+Exp: 3.32 # Exp+Exp+Sph: 3.74 Exp+Sph+Sph: 3.73 Sph+Exp+Sph: 3.31 Sph+Sph+Sph: 3.36 if(!paper) plot(empVgm, fitSumMetricModel, wireframe=T, all=T, scales=list(arrows=F), zlim=c(0,130)) if(!paper) plot(empVgm,fitSumMetricModel, wireframe=T, all=T, scales=list(arrows=F), zlim=c(0,130)) if(paper) png("vignettes/figures/allVgmsWireframe.png", 9, 6, "in", bg="white", res = 150) plot(empVgm, list(fitSepModel, fitProdSumModel, fitMetricModel, fitSumMetricModel, fitSimpleSumMetricModel), wireframe=T, all=T, zlim=c(0,140), ylim=c(0,6.1), xlim=c(0,300), scales=list(arrows = F, cex=.8, x=list(at=0:3*100), y=list(at=0:6, labels=c("0 ","","2 ","","4 ","","6 ")), z=list(at=0:5*25, labels=c("0 ","","50 ","","100 ",""))), at=0:100*1.4, xlab=list("space [km]", rot=27, cex=0.8), ylab=list("time [days]", rot=-40, cex=0.8), zlab=list(NULL, rot=94, cex=0.8)) if(paper) dev.off() if(paper) png("vignettes/figures/allVgmsDiffWireframe.png", 9, 6, "in", bg="white", res = 150) plot(empVgm, list(fitSepModel, fitProdSumModel, fitMetricModel, fitSumMetricModel, fitSimpleSumMetricModel), wireframe=T, all=T, zlim=c(-10,25), ylim=c(0,6.1), xlim=c(0,300), diff=TRUE, scales=list(arrows = F, cex=.8, x=list(at=0:3*100), y=list(at=0:6, labels=c("0 ","","2 ","","4 ","","6 ")), z=list(at=-2:5*5, labels=c("-10 ","","0 ","","10 ","","20 ",""))), xlab=list("space [km]", rot=27, cex=0.8), ylab=list("time [days]", rot=-40, cex=0.8), zlab=list(NULL, rot=94, cex=0.8)) if(paper) dev.off() if(paper) { library(lattice) spacelag <- rep(0:300, 13) timelag <- rep(0:12/2,each=301) cplot <- contourplot(model~spacelag+timelag|type, rbind(cbind(variogramSurface(fitSumMetricModel, data.frame(spacelag=spacelag, timelag=timelag)), data.frame(type = rep("variogram of the sum-metric model", length(spacelag)))), data.frame(spacelag=spacelag, timelag=timelag, gamma=sqrt(spacelag^2+116^2*timelag^2)/10, type="metric distance [10 km]")), at=0:15*10, xlab="space [km]", ylab="timelag [days]") png("vignettes/figures/vgmVsMetricDist.png", 9, 4, "in", bg="white", res = 150) print(cplot) dev.off() }gstat/demo/pcb_sf.R0000644000176200001440000001131714646417261013715 0ustar liggesusers# $Id: pcb.R,v 1.9 2008-02-01 22:39:44 edzer Exp $ # FIGURE 1: library(sf) library(stars) library(gstat) library(ggplot2) data(pcb) pcb = st_as_sf(pcb, coords = c("x", "y"), remove = FALSE) data(ncp.grid) ncp.grid = st_as_stars(ncp.grid) wsv = read_sf(system.file("external/ncp.shp", package="gstat")) classes = c(.2,1,2,5,10,20) print(xyplot(y ~ x | as.factor(year), groups = sqrt(PCB138)/3, data = as.data.frame(pcb), panel = function(x, y, groups, subscripts, ...) { plot(st_geometry(wsv), col = grey(.5), add = TRUE) panel.xyplot(x, y, cex = groups[subscripts], ...) }, xlab = "x-coordinate", ylab = "y-coordinate", key = list(corner = c(0,0), x=0.8, y=0.25, points = list(pch = 1, col = 1, cex = sqrt(classes)/3), text = list(as.character(classes))), aspect = "iso", as.table = T, xlim = c(464000, 739000), ylim = c(5696500, 6131500), scales = list(draw = F))) # FIGURE 2: pcb$yf = as.factor(pcb$year) pcb$int = rep(NA, dim(pcb)[1]) c = lm(log(PCB138)~-1+depth+yf,pcb)$coefficients i = 2 for (f in levels(pcb$yf)) { pcb$int[pcb$yf == f] = c[i] i = i+1 } print(xyplot(log(PCB138)~depth | as.factor(year), groups = int, data = as.data.frame(pcb), panel = function(x, y, groups, subscripts, ...) { # panel.grid(h=-1, v= 2) panel.xyplot(x, y) y = c(groups[subscripts][1], groups[subscripts][1] + -0.0641*45) llines(c(0, 45), y, lty = 2) }, scales = list( y = list(at=log(c(.2, .5, 1, 2, 5, 10, 20)), labels=c(".2",".5","1","2","5","10","20"), alternating = F) ), xlab = "water depth", ylab = "PCB138", as.table = T) ) # FIGURE 3: # ps.options(width=2, height=2) pcb$res=residuals(lm(log(PCB138)~year+depth, pcb)) v3 = variogram(res ~ year, pcb, dX=.1, bound=c(0,1000,3000,5000,(1:16)*10000)) print(plot(v3, model = vgm(.224,"Exp",17247,.08), plot.numbers = TRUE)) # FIGURE 4: # next g.pcb = NULL merge = list(c("P1986", 2, "P1991", 2), c("P1986", 2, "P1996", 2), c("P1986", 2, "P2000", 2)) for (f in levels(pcb$yf)[c(1,4,6,7)]) g.pcb= gstat(g.pcb, paste("P", as.character(f), sep = ""), log(PCB138)~depth, pcb[pcb$yf == f,], merge = merge) g.pcb = gstat(g.pcb, model = vgm(.224,"Exp",17247,.08), fill.all=T) v = variogram(g.pcb, cutoff=1e5) #plot(v, model = fit.lmc(v, g)) #plot(v, model = g,plot.numbers = TRUE) PCB.cor = matrix(NA, 4,4) i = 1 for (x in levels(pcb$yf)[c(1,4,6,7)]) { j = 1 for (y in levels(pcb$yf)[c(1,4,6,7)]) { A = log(pcb[pcb$yf == x,]$PCB138) B.tmp = krige(PCB138~1, pcb[pcb$yf == y,], pcb[pcb$yf == x,], nmax = 1, set=list(debug=0)) B = log(B.tmp$var1.pred) # print(paste(x, y, cor(A,B))) PCB.cor[i,j] = cor(A,B) j = j + 1 } i = i + 1 } years=c(1986,1991,1996,2000) dimnames(PCB.cor)=list(years,years) PCB.cor.ns = PCB.cor PCB.cor = 0.5 * (PCB.cor + t(PCB.cor)) i = 1 for (x in levels(pcb$yf)[c(1,4,6,7)]) { j = 1 for (y in levels(pcb$yf)[c(1,4,6,7)]) { if (j > i) { name = paste(paste("P", x, sep=""), paste("P", y, sep=""),sep = ".") print(name) g.pcb$model[[name]]["psill"] = g.pcb$model[[name]]["psill"] * PCB.cor[i,j] } j = j + 1 } i = i + 1 } print(plot(v, model = g.pcb, plot.numbers = FALSE)) print(PCB.cor.ns, digits=3) print(PCB.cor, digits=3) # FIGURE 5: pcb.cok = predict(g.pcb, newdata = ncp.grid, debug.level = 0) levs = c(.1,.2,.5,1,2,5,10,20) spplot(pcb.cok[c(1,3,5,7)], as.table=T, col.regions = bpy.colors(7), at = log(levs), colorkey = list(at = log(levs), labels = as.character(levs), col = bpy.colors(7)), layout = c(4,1) ) spplot(pcb.cok[c(4,11,6,12,13,8,14,15,16,10)-2], skip=c(F,T,T,T,F,F,T,T,F,F,F,T,F,F,F,F), as.table=T, layout=c(4,4), asp="iso", col.regions = bpy.colors()) X = cbind(rep(1,7), c(1986, 1987, 1989, 1991, 1993, 1996, 2000)) X2=X[c(1,4,6,7),] lambda = solve(t(X2) %*% X2) %*% t(X2) dimnames(lambda) = list(NULL, c(1986, 1991, 1996, 2000)) print(lambda[2, ], digits=3) # FIGURE 7: pcb.contr = get.contr(pcb.cok, g.pcb, X=lambda[2, ]) # copy coordinates #pcb.contr$x = pcb.cok$x #pcb.contr$y = pcb.cok$y pl1 = spplot(pcb.contr["beta.1"], main = "log-PCB138: change estimate", col.regions = bpy.colors(100)) pcb.contr$sig = pcb.contr$beta.1 / sqrt(pcb.contr$var.beta.1) pl2 = spplot(pcb.contr["sig"], main = "log-PCB138 change/SE", col.regions = bpy.colors(100)) print(pl1, position=c(0,0,0.5,1), more = TRUE) print(pl2, position=c(0.5,0,1,1), more = FALSE) cat("source:\n\nEdzer J. Pebesma, Richard N.M. Duin (2005) Spatio-temporal mapping of\nsea floor sediment pollution in the North Sea. In: Ph. Renard, and\nR. Froidevaux, eds. Proceedings GeoENV 2004 -- Fifth European Conference\non Geostatistics for Environmental Applications; Springer.\n") gstat/demo/ugsim.R0000644000176200001440000000126714646417261013610 0ustar liggesusers# $Id: ugsim.R,v 1.2 2006-02-10 19:05:02 edzer Exp $ library(sp) library(gstat) # prediction grid: data(meuse.grid) gridded(meuse.grid) = ~x+y # define variable as dummy data (parameters from log-zinc, meuse) v = vgm(.55, "Sph", 900, .05) g = gstat(NULL, "var1", lzn~1, beta = 5.9, nmax = 20, model = v, dummy = TRUE) # simulation of a single variable out = predict(g, meuse.grid, nsim = 20) spplot(out) # simulation of two negatively correlated variables: v = vgm(.55, "Sph", 900, .05) g = gstat(g, "var2", x~1, beta = 5.9, nmax = 20, model = v, dummy = TRUE) v = vgm(-.3, "Sph", 900, 0.00001) g = gstat(g, c("var1", "var2"), model = v) out = predict(g, meuse.grid, nsim = 10) spplot(out) gstat/demo/cokriging.R0000644000176200001440000000367114646417261014441 0ustar liggesusers# $Id: cokriging.R,v 1.4 2006-02-10 19:05:02 edzer Exp $ library(stars) library(gstat) data(meuse, package = "sp") meuse = st_as_sf(meuse, coords = c("x", "y")) data(meuse.grid, package = "sp") meuse.grid = st_as_stars(meuse.grid) # cokriging of the four heavy metal variables # create gstat object, stepwise: gstat(id="zn", formula=log(zinc)~1, data=meuse, nmax = 10) |> gstat("cu", log(copper)~1, meuse, nmax = 10) |> gstat("cd", log(cadmium)~1, meuse, nmax = 10) |> gstat("pb", log(lead)~1, meuse, nmax = 10) |> gstat(model=vgm(1, "Sph", 900, 1), fill.all=T) -> meuse.g x <- variogram(meuse.g, cutoff=1000) meuse.fit = fit.lmc(x, meuse.g) plot(x, model = meuse.fit) z <- predict(meuse.fit, newdata = meuse.grid) z[c(1,3,5,7)] |> merge() |> plot() # compute & plot standard errors: z[c(2,4,6,9)] |> setNames(paste0(c("zn", "cu", "pb", "cd"), ": se")) |> merge() |> sqrt() |> plot() # old-style, with sp: # indicator cokriging for the 9 percentiles of zinc: q <- quantile(meuse$zinc, seq(.1,.9,.1)) gstat(id = "zn1", formula = I(zinc < q[1])~1, data = meuse, nmax = 7, beta = .1, set = list(order = 4, zero = 1e-5)) |> gstat("zn2", I(zinc < q[2])~1, meuse, nmax = 7, beta=.2) |> gstat("zn3", I(zinc < q[3])~1, meuse, nmax = 7, beta=.3) |> gstat("zn4", I(zinc < q[4])~1, meuse, nmax = 7, beta=.4) |> gstat("zn5", I(zinc < q[5])~1, meuse, nmax = 7, beta=.5) |> gstat("zn6", I(zinc < q[6])~1, meuse, nmax = 7, beta=.6) |> gstat("zn7", I(zinc < q[7])~1, meuse, nmax = 7, beta=.7) |> gstat("zn8", I(zinc < q[8])~1, meuse, nmax = 7, beta=.8) |> gstat("zn9", I(zinc < q[9])~1, meuse, nmax = 7, beta=.9) |> gstat(model=vgm(1, "Sph", 900, 1), fill.all=T) -> meuse.i x <- variogram(meuse.i, cutoff=1000) meuse.fit = fit.lmc(x, meuse.i, correct.diagonal = 1.01) plot(x, model = meuse.fit) z <- predict(meuse.fit, newdata = meuse.grid) z[c(1,3,5,7,9,11,13,15,17)] |> setNames(paste("est.Pr(Zn < ", signif(q,4), ")", sep = "")) |> merge() |> plot() gstat/demo/cosimulation.R0000644000176200001440000000427414646417261015173 0ustar liggesusers# $Id: cosimulation.R,v 1.5 2006-02-10 19:05:02 edzer Exp $ library(sp) data(meuse) coordinates(meuse) = ~x+y data(meuse.grid) gridded(meuse.grid) = ~x+y # cosimulation the four heavy metal variables meuse.g <- gstat(id="zn", formula=zinc~1, data=meuse, nmax = 10, set = list(zero = 1e-10)) meuse.g <- gstat(meuse.g, "cu", copper~1, meuse, nmax = 10) meuse.g <- gstat(meuse.g, "cd", cadmium~1, meuse, nmax = 10) meuse.g <- gstat(meuse.g, "pb", lead~1, meuse, nmax = 10) meuse.g <- gstat(meuse.g, model=vgm(1, "Sph", 900, 1), fill.all=T) x <- variogram(meuse.g, cutoff=1000) meuse.fit = fit.lmc(x, meuse.g) plot(x, model = meuse.fit) z <- predict(meuse.fit, newdata = meuse.grid, nsim = 2) library(lattice) pl1 <- spplot(z, c(1,2), main = "zinc simulations") pl2 <- spplot(z, c(3,4), main = "copper simulations") pl3 <- spplot(z, c(5,6), main = "cadmium simulations") pl4 <- spplot(z, c(7,8), main = "lead simulations") print(pl1, split = c(1,1,2,2), more=TRUE) print(pl2, split = c(1,2,2,2), more=TRUE) print(pl3, split = c(2,1,2,2), more=TRUE) print(pl4, split = c(2,2,2,2)) # indicator cosimulation for the 9 deciles of zinc: q <- quantile(meuse$zinc, seq(.1,.9,.1)) meuse.i <- gstat(id = "zn1", formula = I(zinc < q[1])~1, data = meuse, nmax = 7, beta = .1, set = list(order = 4, zero = 1e-5)) meuse.i <- gstat(meuse.i, "zn2", I(zinc < q[2])~1, meuse, nmax = 7, beta=.2) meuse.i <- gstat(meuse.i, "zn3", I(zinc < q[3])~1, meuse, nmax = 7, beta=.3) meuse.i <- gstat(meuse.i, "zn4", I(zinc < q[4])~1, meuse, nmax = 7, beta=.4) meuse.i <- gstat(meuse.i, "zn5", I(zinc < q[5])~1, meuse, nmax = 7, beta=.5) meuse.i <- gstat(meuse.i, "zn6", I(zinc < q[6])~1, meuse, nmax = 7, beta=.6) meuse.i <- gstat(meuse.i, "zn7", I(zinc < q[7])~1, meuse, nmax = 7, beta=.7) meuse.i <- gstat(meuse.i, "zn8", I(zinc < q[8])~1, meuse, nmax = 7, beta=.8) meuse.i <- gstat(meuse.i, "zn9", I(zinc < q[9])~1, meuse, nmax = 7, beta=.9) meuse.i <- gstat(meuse.i, model=vgm(1, "Sph", 900, 1), fill.all=T) x <- variogram(meuse.i, cutoff=1000) meuse.fit = fit.lmc(x, meuse.i) plot(x, model = meuse.fit) z <- predict(meuse.fit, newdata = meuse.grid, nsim = 2, indicators = TRUE) spplot(z, main = "indicator simulations for 9 deciles") gstat/demo/00Index0000644000176200001440000000440614646417261013471 0ustar liggesusersa2p area-to-point kriging with krige0 a2pinST area-to-point kriging in space-time with krigeST block block kriging -- effect of block size and irregular blocks blue how to get BLUE coefficients out of a predict.gstat call cc collocated cokriging example circEmbeddingMeuse simulation based in circular embedding allowing fft cokriging fitting a linear model of coregionalization and cokriging comp_geoR compare gstat kriging output with that obtained from geoR cosimulation fitting a linear model of coregionalization and cosimulation depend check gstat package dependencies examples how to do the original gstat example files in S grass example grass/R/gstat run; requires grass meuse data set installed gstat3D example of 3D interpolation of random points ikr example indicator kriging on zinc w. threshold 500 ppm krige sample run of ordinary and universal kriging lhs create latin hypercube sample of Gaussian random field lnsim carry out log-normal kriging, based on conditional simulation sic2004 part of sic2004 excercise; see ?sic2004 sftime demo using package sftime, derived from demo(stkrige) pcb pcb North Sea data analysis as used for geoENV2004 paper; see ?pcb pcb_sf pcb North Sea data analysis as used for geoENV2004 paper, using sf, stars and ggplot2; see ?pcb fulmar analysis of Fulmaris glacialis data on Dutch part of the North Sea uisim unconditional indicator simulation, 2 and 3 category examples ugsim unconditional Gaussian simulation snow parallel kriging using package snow (not on Windows) line examples for lines support prediction weight compute (the expensive way) kriging weights for a single prediction location wind space-time kriging with the Irish wind data sets rep 10 x 10 matrix of fitted variograms from 100 simulated fields sftime demonstration for using the classes of sftime, local spatio-temporal kriging stkrige model estimation for Vignette spatio-temporal kriging stkrige-prediction prediction as in Vignette spatio-temporal kriging [!time consuming!] stkrige-crossvalidation crossvalidation as in Vignette spatio-temporal kriging [!very time consuming!] localKrigeST locally krige an irregular spatio-temporal data set to a regular spatio-temporal grid zonal approximate zonal anisotropy with geometrically anistropic model gstat/demo/comp_geoR.R0000644000176200001440000000062414646417261014372 0ustar liggesuserslibrary(sp) library(gstat) library(geoR) xyz = data.frame(x = c(0,0,1), y = c(0, 1, 1), z = c(1,2,3)) coordinates(xyz)=~x+y x0 = SpatialPoints(data.frame(x=0,y=.5)) kr1 = krige(z~1,xyz,x0,vgm(1, "Exp", 1)) kr2 = krige.conv(as.geodata(xyz), locations=coordinates(x0), krige=list(cov.model="exponential", cov.par=c(1,1))) kr1 c(kr2$predict, kr2$krige.var) kr1[[1]] - kr2$predict kr1[[2]] - kr2$krige.var gstat/demo/circEmbeddingMeuse.R0000644000176200001440000000625314646417261016202 0ustar liggesusers############################# ## Example: Meuse data set ## ############################# library(sp) library(gstat) data("meuse") coordinates(meuse) <- ~x+y data("meuse.grid") coordinates(meuse.grid) <- ~x+y gridded(meuse.grid) <- TRUE # variography empVgm <- variogram(zinc~1, meuse) modVgm <- fit.variogram(empVgm, vgm(150000, "Sph", 1000, 25000)) # unconditional simulation unconSim <- krigeSimCE(zinc~1, newdata = meuse.grid, model = modVgm, n=100) unconSim@data$zinc.simMean <- apply(unconSim@data[,-c(1:5)], 1, mean) spplot(unconSim[,6:20], main="15 out of 100 unconditional simulations") spplot(unconSim, "zinc.simMean", main="mean of 100 unconditional simulations") # conditional simulation conSim <- krigeSimCE(zinc~1, meuse, meuse.grid, modVgm, n=100) conSim@data$zinc.simMean <- apply(conSim@data[,-c(1:5)], 1, mean) spplot(conSim[,6:20], main="15 out of 100 conditional simulations") # compare with kriging predictor simKrige <- krige(zinc~1, meuse, meuse.grid, modVgm) spplot(simKrige, "var1.pred", main="interpolated zinc concentrations") spplot(conSim, "zinc.simMean", main="mean of 100 conditional simulations") ################################################ ## turning bands simulation in space and time ## ################################################ separableModel <- vgmST("separable", space=vgm(0.85,"Exp", 831, 0.15), time =vgm(0.9,"Exp", 3.25, 0.1), sill=135000) attr(separableModel,"temporal unit") <- "days" library(spacetime) stf <- STF(meuse, Sys.time()-20:0*24*3600) stf_grid <- STF(geometry(meuse.grid), stf@time) ################### ## unconditional ## ################### sTime <- Sys.time() krigedSim <- krigeSTSimTB(newdata = stf_grid, modelList = separableModel, nsim = 100, nLyrs = 100) Sys.time() - sTime # plot one simulation along time stplot(krigedSim[,,"sim1"], main="unconditional siumulation") # plot one simulation along time as time series stplot(krigedSim[1:21,,"sim1"], mode="ts", main="unconditional siumulation") stplot(krigedSim[1:21,,"sim2"], mode="ts", main="unconditional siumulation") stplot(krigedSim[1:21,,"sim3"], mode="ts", main="unconditional siumulation") stplot(krigedSim[1:21,,"sim4"], mode="ts", main="unconditional siumulation") stplot(krigedSim[1:21,,"sim5"], mode="ts", main="unconditional siumulation") stplot(krigedSim[1:21,,"sim6"], mode="ts", main="unconditional siumulation") # plot the ten simulations of the first day spplot(krigedSim[,1], paste0("sim",1:10), as.table=TRUE, main="unconditional siumulation") ################# ## conditional ## ################# sTime <- Sys.time() krigedSim <- krigeSTSimTB(formula= zinc ~ 1, data = STFDF(geometry(meuse), stf@time, data.frame(zinc=rep(meuse$zinc, 21))), newdata = stf_grid[1:500,], modelList = separableModel, nsim = 10, nLyrs = 500) Sys.time() - sTime # plot one simulation along time stplot(krigedSim[,1:12], main="conditinal simulation") # plot one simulation along time as time series stplot(krigedSim[1:12,,"sim1"], mode="ts", main="conditinal simulation") # plot the ten simulations of the first day spplot(krigedSim[,1], paste0("sim",1:10), as.table=TRUE, main="conditinal simulation")gstat/demo/sftime.R0000644000176200001440000000415114646417261013746 0ustar liggesusers## FNN local prediction ######################## library(sp) library(spacetime) library(gstat) library(lattice) # create n space-time points over [0,1] x [0,1] x [Now, Now+some days] t0 = Sys.time() # now n = 1000 set.seed(13131) # fix outcomes x = runif(n) y = runif(n) t = t0 + 1e6 * runif(n) z = rnorm(n) stidf = STIDF(SpatialPoints(cbind(x,y)), sort(t), data.frame(z=z)) stplot(stidf, number=21, main="random spatio-temporal noise") library(sftime) sft = st_as_sftime(stidf) # create a regular 20 x 20 x 10 grid of prediction locations: grd = as(SpatialGrid(GridTopology(c(0.025,0.025), c(.05, .05), c(20,20))), "SpatialPixels") tgrd = seq(min(t)+10000, max(t)-10000, length.out = 10) stf = STF(grd, tgrd) #stf = STFDF(grd, tgrd, data.frame(x=rep(0,400*10))) library(stars) st = st_as_stars(stf) # define a variogram model sumMetricModel <- vgmST("sumMetric", space=vgm(1/6, "Sph", 0.25, 1/60), time =vgm(2/6, "Exp", 1e5, 1/60), joint=vgm(0.4, "Exp", 0.3, 0.1), stAni=1/1e6) attr(sumMetricModel, "temporal unit") <- "secs" dg <- data.frame(spacelag=rep(c(0.001,1:10)/10,6), timelag=rep(0:5*50e3, each=11)) #wireframe(model~spacelag+timelag, # variogramSurface(sumMetricModel, dist_grid = dg), # scales=list(arrows=F), # drape=T, col.regions=bpy.colors(), # zlim=c(0,1.2), # main="imposed sum-metric model") locKrig_sft <- krigeST(z~1, sft, st, sumMetricModel, nmax=20, computeVar = T) locKrig <- krigeST(z~1, stidf, stf, sumMetricModel, nmax=20, computeVar = T) stplot(locKrig[,,"var1.pred"], col.regions=bpy.colors(), scales=list(draw=T)) plot(locKrig_sft[1], col = sf.colors(), breaks = "equal") stplot(locKrig[,,"var1.var"], col.regions=bpy.colors(), scales=list(draw=T)) plot(locKrig_sft[2], col = sf.colors(), breaks = "equal") st$foo = 0 st_as_sf(st, long = TRUE) |> st_as_sftime() -> st.sftime locKrig_sft <- krigeST(z~1, sft, st.sftime, sumMetricModel, nmax=20, computeVar = T) plot(locKrig_sft["var1.pred"]) gstat/demo/examples.R0000644000176200001440000001616014646417261014300 0ustar liggesusers# $Id: examples.R,v 1.6 2006-02-10 19:05:02 edzer Exp $ ## ex01.cmd, ex02.cmd: ## ## Two variables with (initial estimates of) variograms, ## calcute sample variogram and plot fitted model ## library(sp) par(ask = TRUE) data(meuse) coordinates(meuse)=~x+y x <- variogram(zinc ~ 1, meuse) v <- vgm(140000, "Sph", 800, nug = 10000) plot(x, model = v) plot(x, model = fit.variogram(x, model = v)) x <- variogram(log(zinc) ~ 1, meuse) v <- vgm(.5, "Sph", 800, nug = .1) plot(x, model = v) plot(x, model = fit.variogram(x, model = v)) ## ## ex03.cmd: ## Inverse distance interpolation on a mask map ## data(meuse.grid) gridded(meuse.grid) = ~x+y x <- krige(zinc ~ 1, meuse, meuse.grid, model = NULL) library(lattice) spplot(x[1]) ## ## ex04.cmd ## Local ordinary block kriging at non-gridded locations ## ## the gstat "classic" radius maps into the gstat "S" maxdist argument ## new.locs <- SpatialPoints(cbind(x = c(181170, 180310, 180205, 178673, 178770, 178270), y = c(333250, 332189, 331707, 330066, 330675, 331075))) krige(zinc ~ 1, meuse, new.locs, model = vgm(1.34e5, "Sph", 800, nug = 2.42e4), block = c(40,40), nmax = 40, nmin = 20, maxdist = 1000) ## ## ex05.cmd ## ## Local simple point kriging on a mask map ## v <- vgm(0.581, "Sph", 900, nug = 0.0554) x <- krige(log(zinc) ~ 1, meuse, meuse.grid, model = v, nmax = 40, nmin = 20, maxdist = 1000, beta = 5.9) spplot(x[1], main = "log(zinc) simple kriging prediction") x$se = sqrt(x$var1.var) spplot(x["se"], main = "log(zinc) simple kriging standard errors") ## ## ex06.cmd ## ## Unconditional Gaussian simulation on a mask ## (local neigbourhoods, simple kriging) ## x <- krige(log(zinc) ~ 1, locations = NULL, newdata = meuse.grid, model = v, nmax = 20, beta = c(5.9), nsim = 5, dummy = TRUE) spplot(x, main = "five unconditional realisations of a correlated Gaussian field") ## ## ex07.cmd ## ## Gaussian simulation, conditional upon data ## (local neighbourhoods, simple and ordinary kriging) ## x <- krige(log(zinc) ~ 1, meuse, meuse.grid, model = v, nmax = 20, beta = c(5.9), nsim = 5) spplot(x, main = "five conditional realisations of a correlated Gaussian field") ## ## ex08.cmd ## ## Change of support: local ordinary block kriging on a mask ## x <- krige(log(zinc) ~ 1, meuse, meuse.grid, model = v, nmax = 40, nmin = 20, maxdist = 1000, block = c(40,40)) spplot(x[1], main = "ordinary block kriging predictions") x$se = sqrt(x$var1.var) spplot(x["se"], main = "ordinary block kriging prediction standard errors") ## ## ex09.cmd ## ## Obtain map values at data() locations ## (Point-map overlay) ## # we trick here by using inv.weighted distance interpolation, using the # single nearest observation. It will not fail on points outside the grid. # Note that we reversed meuse.grid and meuse to get these results. x <- krige(part.a ~ 1, meuse.grid, meuse, model = NULL, nmax = 1) meuse$part.a = x$var1.pred x <- krige(part.b ~ 1, meuse.grid, meuse, model = NULL, nmax = 1) meuse$part.b = x$var1.pred ## ## ex10.cmd ## ## Multiple kriging: prediction on more than one variable ## (ordinary kriging of two variables) ## (note that zinc_map.eas wass obtained through ex09.gst) ## x <- variogram(dist~1,meuse) v.dist <- fit.variogram(x, model = vgm(1,"Gau",100)) plot(x, model = v.dist) g <- gstat(id = "ln.zinc", form = log(zinc) ~ 1, data = meuse, nmax = 40, nmin = 20, maxdist = 1000, model = v) g <- gstat(g, id = "dist", form = dist ~ 1, data = meuse, nmax = 40, nmin = 20, maxdist = 1000, model = vgm(.01, "Nug", 0, add.to = v.dist)) # the added nugget variance is necessary to avoid near-singular covariances x <- predict(g, meuse.grid) spplot(x["ln.zinc.pred"], main = "log(zinc) ordinary kriging predictions") x$ln.zinc.se = sqrt(x$ln.zinc.var) spplot(x["ln.zinc.se"], main = "log(zinc) ordinary kriging prediction standard errors") spplot(x["dist.pred"], main = "dist ordinary kriging predictions") x$dist.se = sqrt(x$dist.var) spplot(x["dist.se"], main = "dist ordinary kriging prediction standard errors") ## ## ex11.cmd ## ## Multivariable kriging: ordinary local cokriging of two variables ## For examples of fitting an LMC: see demo(cokriging) ## g <- gstat(id = "ln.zinc", form = log(zinc) ~ 1, data = meuse, nmax = 40, nmin = 20, maxdist = 1000, model = vgm(0.581, "Sph", 900, 0.0554)) g <- gstat(g, id = "sq.dist", form = sqrt(dist) ~ 1, data = meuse, nmax = 40, nmin = 20, maxdist = 1000, model = vgm(0.0631, "Sph", 900, 0.0001)) g <- gstat(g, id = c("ln.zinc", "sq.dist"), model = vgm(-0.156, "Sph", 900, 1e-5)) # small nugget necessary to let gstat recognize LMC x <- predict(g, meuse.grid) spplot(x["ln.zinc.pred"], main = "log(zinc) ordinary cokriging predictions") x$ln.zinc.se = sqrt(x$ln.zinc.var) spplot(x["ln.zinc.se"], main = "log(zinc) ordinary cokriging prediction standard errors") spplot(x["sq.dist.pred"], main = "dist ordinary cokriging predictions") x$sq.dist.se = sqrt(x$sq.dist.var) spplot(x["sq.dist.se"], main = "dist ordinary cokriging prediction standard errors") ## ## ex12.cmd ## ## Stratified ordinary kriging (within-category ordinary kriging) ## # find out in which part the data are: meuse$part.a = krige(part.a~1, meuse.grid, meuse, nmax=1)$var1.pred x1 = krige(log(zinc)~1, meuse[meuse$part.a == 0,], meuse.grid[meuse.grid$part.a == 0,], model = vgm(.548, "Sph", 900, .0654), nmin = 20, nmax = 40, maxdist = 1000) x2 = krige(log(zinc)~1, meuse[meuse$part.a == 1,], meuse.grid[meuse.grid$part.a == 1,], model = vgm(.716, "Sph", 900), nmin = 20, nmax = 40, maxdist = 1000) x = rbind(as.data.frame(x1), as.data.frame(x2)) gridded(x) = ~x+y spplot(x["var1.pred"], main = "stratified kriging predictions") ## ## ex13.cmd ## ## Local universal kriging, using one continuous variable ### ## the variogram should be that of the residual: x <- krige(log(zinc) ~ sqrt(dist), meuse, meuse.grid, model = vgm(.149, "Sph", 700, .0674), nmax = 40, nmin = 20, maxdist = 1000) spplot(x["var1.pred"], main = "universal kriging predictions") x$var1.se = sqrt(x$var1.var) spplot(x["var1.se"], main = "universal kriging prediction standard errors") ## ## ex14.cmd ## ## Universal kriging, using one continuous and ## two binary variables. ## x <- krige(log(zinc) ~ -1 + sqrt(dist)+ part.a + part.b, meuse, meuse.grid, model = vgm(.149, "Sph", 700, .0674)) spplot(meuse.grid["part.a"], main = "the areas defining part.a (1) and part.b (0)") spplot(x["var1.pred"], main = "universal kriging predictions") x$var1.se = sqrt(x$var1.var) spplot(x["var1.se"], main = "universal kriging prediction standard errors") ## ## ex14a.cmd ## ## stratified universal kriging: ## (again: not implemented) ## ## ex15.cmd ## ## Local linear model, using one continuous variable ## x <- krige(log(zinc) ~ sqrt(dist), meuse, meuse.grid, model = NULL, nmax = 40, nmin = 20, maxdist = 1000) spplot(x["var1.pred"], main = "IID local linear model kriging predictions") x$var1.se = sqrt(x$var1.var) spplot(x["var1.se"], main = "IID local linear model prediction standard errors") ## ## ex16.cmd ## ## Multivariable indicator cosimulation ## ==>> see demo(cosimulation) for an extended example how to do this ## ## ## ex17.cmd ## ## global coordinate polynomial trend surfaces ## trend orders 0-3 ==>> better use lm() for this ## gstat/demo/krige.R0000644000176200001440000000203414646417261013556 0ustar liggesusers# $Id: krige.R,v 1.5 2007-02-27 22:09:31 edzer Exp $ library(sp) data(meuse) coordinates(meuse) = ~x+y data(meuse.grid) gridded(meuse.grid) = ~x+y # ordinary kriging v <- variogram(log(zinc)~1, meuse) m <- fit.variogram(v, vgm(1, "Sph", 300, 1)) plot(v, model = m) lzn.kr <- krige(formula = log(zinc)~1, meuse, meuse.grid, model = m) pl1 <- spplot(lzn.kr[1], main = "ordinary kriging prediction of log-zinc") lzn.kr$se = sqrt(lzn.kr$var1.var) pl2 <- spplot(lzn.kr["se"], main = "ordinary kriging prediction error") # universal kriging v <- variogram(log(zinc)~sqrt(dist), meuse) m <- fit.variogram(v, vgm(1, "Exp", 300, 1)) plot(v, model = m) lzn.kr <- krige(log(zinc)~sqrt(dist), meuse, meuse.grid, model = m) pl3 <- spplot(lzn.kr[1], main = "universal kriging prediction of log-zinc") lzn.kr$se = sqrt(lzn.kr$var1.var) pl4 <- spplot(lzn.kr["se"], main = "universal kriging prediction error") print(pl1, split = c(1,1,2,2), more = T) print(pl2, split = c(1,2,2,2), more = T) print(pl3, split = c(2,1,2,2), more = T) print(pl4, split = c(2,2,2,2)) gstat/demo/rep.R0000644000176200001440000000131114646417261013240 0ustar liggesuserslibrary(sp) library(gstat) data(meuse) coordinates(meuse) = ~x + y data(meuse.grid) coordinates(meuse.grid) = ~x + y # Variogram log Zn lzn.vgm = variogram(log(zinc) ~ 1, meuse) lzn.fit = fit.variogram(lzn.vgm, model = vgm(1, "Sph", 900, 1)) #Conditional simulation nsim = 100 lzn.sim = krige(log(zinc) ~ 1, meuse, meuse.grid, model = lzn.fit, nmax = 30, nsim = nsim) # Variogram of all relizations m = out = list() for (i in 1:nsim) { s = paste("sim", i, sep="") f = as.formula(paste(s, "~1")) v = variogram(f, lzn.sim) v$id = rep(s, nrow(v)) out[[s]] = v m[[s]] = fit.variogram(v, lzn.fit) } plot(do.call(rbind, out), m, layout=c(10,10), skip = FALSE, scales = list(y = list(relation = "same"))) gstat/demo/wind.R0000644000176200001440000000340014646417261013414 0ustar liggesusers#pdf("wind.pdf") # PLEASE read the vignette of package spacetime for a more # clever way to do all this! library(sp) library(gstat) library(rgdal) library(maptools) # load wind data, run test: example(wind) m = map2SpatialLines( map("worldHires", xlim = c(-11,-5.4), ylim = c(51,55.5), plot=F)) proj4string(m) = "+proj=longlat +datum=WGS84 +ellps=WGS84" m = spTransform(m, CRS("+proj=utm +zone=29 +datum=WGS84 +ellps=WGS84")) # model temporal autocorrelation acf(wind[7]) tdiscr = 0:40 lines(tdiscr, exp(- tdiscr/1.5)) # set up data, last year years = 61 months = 1 jday = c(1,6,11,16,21,26) sel = wind[wind$year %in% years & wind$month %in% months & wind$jday %in% jday,] #stations = 4:15 stations = 4:15 sels = stack(sel[stations]) sels$t = rep(sel$jday, length(stations)) sels$x = coordinates(wind.loc)[match(sels$ind, wind.loc$Code),1] sels$y = coordinates(wind.loc)[match(sels$ind, wind.loc$Code),2] summary(sels) coordinates(sels) = ~x+y proj4string(sels) = "+proj=longlat +datum=WGS84 +ellps=WGS84" sels = spTransform(sels, CRS("+proj=utm +zone=29 +datum=WGS84 +ellps=WGS84")) grd = makegrid(m, n = 1000) grd$t = rep(1, nrow(grd)) coordinates(grd) = ~x1+x2 gridded(grd)=TRUE proj4string(grd) = proj4string(sels) #sels = as(sels, "data.frame") # setup grid covfn = function(x, y = x) { u = spDists(coordinates(x), coordinates(y)) t = abs(outer(x$t,y$t,"-")) 0.6 * exp(-u/750000) * exp(-t/1.5) } for (i in 1:120) { grd$t = rep(i/4, nrow(grd)) n = paste("t", i/4, sep="") grd[[n]] = krige0(sqrt(values)~1, sels, grd, covfn) } grd$t = NULL #grd$pr = out$pred #library(lattice) #levelplot(pr~x1+x2|t,grd,col.regions=bpy.colors()) spl = list(list("sp.points", sels,first=F, cex=.5), list("sp.lines", m, col='grey')) spplot(grd, sp.layout = spl, col.regions=bpy.colors()) gstat/demo/a2pinST.R0000644000176200001440000000210314646417261013732 0ustar liggesusers## area2point in space and time library(sp) library(gstat) data("meuse") coordinates(meuse) <- ~x+y data("meuse.grid") coordinates(meuse.grid) <- ~x+y gridded(meuse.grid) <- TRUE meuse.coarse.grid <- SpatialGrid(GridTopology(meuse.grid@grid@cellcentre.offset, c(600,600), c(5, 7))) separableModel <- vgmST("separable", space=vgm(0.85,"Exp", 831, 0.15), time =vgm(0.9,"Exp", 3.25, 0.1), sill=135000) attr(separableModel,"temporal unit") <- "days" library(spacetime) stf <- STF(meuse[sample(155, 25),], Sys.time()-2:0*24*3600) stf_grid <- STF(geometry(meuse.coarse.grid), stf@time) krigedSim <- krigeSTSimTB(newdata = stf_grid, modelList = separableModel, nsim = 1, nLyrs = 100) # area-to-point kriging: a2pST = krigeST(sim1 ~ 1, krigedSim, stf, modelList = vgmAreaST, ndiscr = 9, model = separableModel, # point variogram, verbose = TRUE) p1 <- stplot(krigedSim, color.key=F) p2 <- stplot(a2pST, color.key=F) print(p1, position=c(0,0.5,1,1), more=TRUE) print(p2, position=c(0,0,1,0.5)) gstat/demo/cc.R0000644000176200001440000000100214646417261013034 0ustar liggesuserslibrary(sp) demo(meuse, ask = FALSE, echo = FALSE) library(gstat) # use collocated data: g = gstat(NULL, "lzinc", log(zinc)~1, meuse) g.coll = gstat(g, "dist", dist~1, meuse, nmax = 1, merge = c("lzinc", "dist")) g.fit = fit.lmc(variogram(g.coll), g.coll, vgm(1, "Sph", 900, 1), correct.diagonal = 1.01) g.non_coll = gstat(g, "dist", dist~1, meuse.grid, nmax = 1, merge = c("lzinc", "dist")) g.non_coll$model = g.fit$model # collocated cokriging: pr = predict(g.non_coll, meuse.grid) spplot(pr[c(1,3)]) gstat/demo/zonal.R0000644000176200001440000000063514646417261013605 0ustar liggesusers library(sp) demo(meuse,ask=FALSE,echo=FALSE) library(gstat) v = variogram(log(zinc)~1, meuse, alpha = c(0,45,90,135)) vm = vgm(.25, "Sph", 1000, anis = c(45, 0.5)) plot(v, vm, main = "geometric") zonal = vgm(.5, "Sph", 1e9, anis = c(45, 1/1e6)) # range is 1e9, effectively infinity, in 45 direction; # it is 1e9/1e6 = 1000 in 135 direction. vm = vgm(.25, "Sph", 1000, add.to = zonal) plot(v, vm, main = "zonal") gstat/demo/line.R0000644000176200001440000000302714646417261013407 0ustar liggesuserslibrary(sp) library(gstat) data(meuse.grid) gridded(meuse.grid) = ~x+y data(meuse) coordinates(meuse) = ~x+y # choose arbitrary line over the grid: image(meuse.grid["dist"],axes=T) pp = rbind(c(180000,331000),c(180000,332000),c(181000,333500)) Sl = SpatialLines(list(Lines(list(Line(pp)), "a"))) plot(Sl,add=T,col='green') # use the default spsample arguments of predict.gstat: pts=spsample(Sl,n=500,'regular',offset=c(.5,.5)) plot(pts, pch=3, cex=.2, add=T) v = vgm(.6, "Sph", 900, .06) out1 = krige(log(zinc)~1, meuse, Sl, v) out1 points(180333,332167,pch=3,cex=2) # use the same line as block discretization, and predict for (0,0) # (because the block discretizing points are not centered) out2 = krige(log(zinc)~1, meuse, SpatialPoints(matrix(0,1,2)), v, block=coordinates(pts)) out2 compare.krigingLines = function(formula, data, newdata, model) { out1 = krige(formula, data, newdata, model) pts = spsample(newdata, n=500, 'regular', offset=.5) out2 = krige(formula, data, SpatialPoints(matrix(0,1,2)), model, block = coordinates(pts)) print("difference:") as.data.frame(out1)[3:4]- as.data.frame(out2)[3:4] } compare.krigingLines(log(zinc)~1, meuse, Sl, v) # one line, consisting of two line segments: pp2 = rbind(c(181000,333500),c(181000,332500)) Sl2 = SpatialLines(list(Lines(list(Line(pp),Line(pp2)), "a"))) krige(log(zinc)~1, meuse, Sl2, v) compare.krigingLines(log(zinc)~1, meuse, Sl2, v) # two seperate line segments: Sl3 = SpatialLines(list(Lines(list(Line(pp)), "a"),Lines(list(Line(pp2)),"b"))) krige(log(zinc)~1, meuse, Sl3, v) gstat/demo/uisim.R0000644000176200001440000000226114646417261013605 0ustar liggesusers# $Id: uisim.R,v 1.5 2008-09-25 10:26:00 edzer Exp $ library(sp) library(gstat) # prediction grid: data(meuse.grid) gridded(meuse.grid) = ~x+y # define variable as dummy data v = vgm(.25, "Sph", 900) g = gstat(NULL, "var1", x~1, beta = .5, nmax = 20, model = v, dummy = TRUE) # simulation of a single variable out = predict(g, meuse.grid, nsim = 20, indicators = TRUE) spplot(out) # simulation of two correlated variables: v = vgm(.1, "Sph", 900) g = gstat(g, "var2", x~1, beta = .25, nmax = 20, model = v, dummy = TRUE) v = vgm(-.1, "Sph", 900) g = gstat(g, c("var1", "var2"), model = v) out = predict(g, meuse.grid, nsim = 10, indicators = TRUE, set = list(order = 2)) spplot(out) # merge all 10 individual simulations into three-group factors: for (i in 1:10) { v1 = paste("var1.sim", i, sep = "") v2 = paste("var2.sim", i, sep = "") m = cbind(out[[v1]], out[[v2]], 1 - (out[[v1]]+out[[v2]])) mout = factor(apply(m, 1, function(x) which(x == 1))) if (i == 1) out2 = SpatialPixelsDataFrame(as(out, "SpatialPixels"), data.frame(mout)) else out2[[i]] = mout } names(out2) = paste("sim", 1:10, sep="") spplot(out2) require(RColorBrewer) spplot(out2, col.regions=brewer.pal(3, "Set2")) gstat/demo/lhs.R0000644000176200001440000000217214646417261013246 0ustar liggesuserslibrary(sp) library(gstat) # roughly follows the case presented in: # E.J. Pebesma and G.B.M. Heuvelink, 1999. Latin hypercube sampling # of Gaussian random fields. Technometrics 41 (4), pp. 303-312. data(meuse) data(meuse.grid) coordinates(meuse) = ~x+y gridded(meuse.grid) = ~x+y x <- variogram(log(zinc) ~ 1, meuse) v <- vgm(.5, "Sph", 800, nug = .1) v.fit = fit.variogram(x, model = v) plot(x, model = v.fit) n = 100 ok = krige(log(zinc)~1, meuse, meuse.grid, v.fit, nmax=40) sim = krige(log(zinc)~1, meuse, meuse.grid, v.fit, nsim = n, nmax=40) simo = t(apply(as.data.frame(sim)[1:n], 1, order)) # rank order nr = nrow(simo) # number of prediction locations simo = (simo - 1.0 + matrix(runif(n * nr), nr, n))/n summary(simo) # LHS on uniform [0,1] distribution; back to Gaussian: lhs = t(apply(cbind(ok$var1.pred, sqrt(ok$var1.var), simo), 1, function(x) qnorm(x[-(1:2)], x[1], x[2]))) sim2 = sim sim2@data = data.frame(lhs) spplot(sim2[1:10], main = 'lhs', col.regions=bpy.colors()) # verify that simulated and true mean/var are close: m = apply(lhs, 1, mean) v = apply(lhs, 1, var) summary(m - ok$var1.pred) summary(v - ok$var1.var) gstat/demo/localKrigeST.R0000644000176200001440000000311514646417261015001 0ustar liggesusers## FNN local prediction ######################## library(sp) library(spacetime) library(gstat) library(lattice) # create n space-time points over [0,1] x [0,1] x [Now, Now+some days] t0 = Sys.time() # now n = 1000 set.seed(13131) # fix outcomes x = runif(n) y = runif(n) t = t0 + 1e6 * runif(n) z = rnorm(n) stidf = STIDF(SpatialPoints(cbind(x,y)), sort(t), data.frame(z=z)) stplot(stidf, number=21, main="random spatio-temporal noise") # create a regular 20 x 20 x 10 grid of prediction locations: grd = as(SpatialGrid(GridTopology(c(0.025,0.025), c(.05, .05), c(20,20))), "SpatialPixels") tgrd = seq(min(t)+10000, max(t)-10000, length.out = 10) stf = STF(grd, tgrd) # define a variogram model sumMetricModel <- vgmST("sumMetric", space=vgm(1/6, "Sph", 0.25, 1/60), time =vgm(2/6, "Exp", 1e5, 1/60), joint=vgm(0.4, "Exp", 0.3, 0.1), stAni=1/1e6) attr(sumMetricModel, "temporal unit") <- "secs" dg <- data.frame(spacelag=rep(c(0.001,1:10)/10,6), timelag=rep(0:5*50e3, each=11)) wireframe(model~spacelag+timelag, variogramSurface(sumMetricModel, dist_grid = dg), scales=list(arrows=F), drape=T, col.regions=bpy.colors(), zlim=c(0,1.2), main="imposed sum-metric model") locKrig <- krigeST(z~1, stidf, stf, sumMetricModel, nmax=50, computeVar = T) stplot(locKrig[,,"var1.pred"], col.regions=bpy.colors(), scales=list(draw=T)) stplot(locKrig[,,"var1.var"], col.regions=bpy.colors(), scales=list(draw=T))gstat/demo/weight.R0000644000176200001440000000122314646417261013743 0ustar liggesuserskriging.weights = function(x, formula, newdata, model) { weighti = function(x, i, formula,...) { ret =rep(0,nrow(x)) ret[i]=1 x[[1]]=ret krige(formula = formula,locations = x,...) } ret = sapply(1:nrow(x), weighti, x=x, newdata=newdata[1,], model=model,formula=formula) ret = t(sapply(ret, as.data.frame)) unlist(ret[,3]) } # example, at first cell of meuse.grid: require(sp) require(gstat) data(meuse) data(meuse.grid) coordinates(meuse) = ~x+y coordinates(meuse.grid) = ~x+y meuse$wts = kriging.weights(meuse["zinc"], zinc~1, meuse.grid[1,], vgm(1, "Exp", 300)) summary(meuse$wts) spplot(meuse["wts"], col.regions=bpy.colors(), cuts=(0:10)/20) gstat/demo/gstat3D.R0000644000176200001440000000116414646417261013771 0ustar liggesusers# $Id: gstat3D.R,v 1.5 2007-02-23 13:34:07 edzer Exp $ # simple demo of 3D interpolation of 50 points with random normal values, # randomly located in the unit cube library(sp) library(gstat) n <- 50 data3D <- data.frame(x = runif(n), y = runif(n), z = runif(n), v = rnorm(n)) coordinates(data3D) = ~x+y+z range1D <- seq(from = 0, to = 1, length = 20) grid3D <- expand.grid(x = range1D, y = range1D, z = range1D) gridded(grid3D) = ~x+y+z res3D <- krige(formula = v ~ 1, data3D, grid3D, model = vgm(1, "Exp", .2)) library(lattice) levelplot(var1.pred ~ x + y | z, as.data.frame(res3D)) rm(n, data3D, range1D, grid3D, res3D) gstat/demo/lnsim.R0000644000176200001440000000332114646417261013577 0ustar liggesuserslibrary(sp) library(gstat) data(meuse) coordinates(meuse) = ~x+y data(meuse.grid) gridded(meuse.grid) = ~x+y # NLKrige: non-linear kriging (e.g. log-normal kriging), simulation based. # arguments: # formula, data, newdata, vgm: see ?krige # trans: transformation and back-transformation function; # summarize: optional, summarize the simulations, see example below; # nmax, nsim: see ?krige # density: number of points to discretize each block PROVIDED BLOCK SIZES # ARE CONSTANT (note that newdata can also be SpatialPolygons -- if newdata is # a grid, cell size is used as block size) NLKrige = function(formula, data, newdata, vgm, trans = c(log,exp), summarize, nmax = 50, nsim = 100, density = 16, ...) { # transform target: target = as.character(as.list(formula)[[2]]) data[[target]] = trans[[1]](data[[target]]) # conditional simulation sample at finer grid: finegrid = spsample(newdata, n = density * length(newdata), type = "regular", offset = c(.5,.5)) sim = krige(formula, data, finegrid, vgm, nmax = nmax, nsim = nsim) # back transform ALL simulations: sim@data = trans[[2]](sim@data) # spatial aggregation of each simulation, taking block MEAN: aggr = aggregate(sim, newdata, mean) # aggregation to summary: if (!missing(summarize)) { ret = apply(aggr@data, 1, summarize, ...) if (is.matrix(ret)) aggr@data = data.frame(t(ret)) else aggr@data = data.frame(ret) } aggr } aggr = NLKrige(zinc~1, meuse, meuse.grid, vgm(.5, "Sph", 900, .1), nmax = 10, summarize = mean) spplot(aggr, main = "expected value of block means") aggr = NLKrige(zinc~1, meuse, meuse.grid, vgm(.5, "Sph", 900, .1), nmax = 10, summarize = quantile, probs = c(0.025, 0.975)) spplot(aggr, main = "95% CI for block means") gstat/demo/stkrige-prediction.R0000644000176200001440000001172614646417261016273 0ustar liggesusers########################################################### # note that demo(stkrige) needs to be run before this one # ########################################################### # libraries library(sp) library(spacetime) library(gstat) library(rgdal) animate <- FALSE # interpolation # build a grid over Germany gridDE <- SpatialGrid(GridTopology(DE_RB_2005@sp@bbox[,1]%/%10000*10000, c(10000,10000), cells.dim=ceiling(apply(DE_RB_2005@sp@bbox,1,diff)/10000))) proj4string(gridDE) <- CRS("+init=epsg:32632") fullgrid(gridDE) <- F ind <- over(gridDE, as(DE_NUTS1,"SpatialPolygons")) gridDE <- gridDE[!is.na(ind)] # back scale vgms: fitSepModel$space$range <- fitSepModel$space$range*1000 fitProdSumModel$space$range <- fitProdSumModel$space$range*1000 fitMetricModel$joint$range <- fitMetricModel$joint$range*1000 fitMetricModel$stAni <- fitMetricModel$stAni*1000 fitSimpleSumMetricModel$space$range <- fitSimpleSumMetricModel$space$range*1000 fitSimpleSumMetricModel$joint$range <- fitSimpleSumMetricModel$joint$range*1000 fitSimpleSumMetricModel$stAni <- fitSimpleSumMetricModel$stAni*1000 fitSumMetricModel$space$range <- fitSumMetricModel$space$range*1000 fitSumMetricModel$joint$range <- fitSumMetricModel$joint$range*1000 fitSumMetricModel$stAni <- fitSumMetricModel$stAni*1000 if(animate) { DE_pred <- STF(gridDE, DE_RB_2005@time) predMat <- matrix(NA,0,2) for (rd in 15:180) { # rd <- 15 predMat <- rbind(predMat, krigeST(PM10~1, data=DE_RB_2005[,rd+(-5:5)], # start: 12:24 newdata=DE_pred[,rd,drop=F], computeVar=T, fitSumMetricModel, # nmax=50, stAni=linStAni*1000/24/3600)@data) } DE_pred_winter <- DE_pred[,15:180] DE_pred_winter <- addAttrToGeom(DE_pred_winter, predMat) for(i in 1:length(DE_pred_winter@time)) { # i <- 1 pnt <- spplot(DE_pred_winter[,i], "var1.pred", col.regions=bpy.colors(160)[-(1:9)], scales=list(draw=F), at=c(-5,0:150), sp.layout = list(list("sp.polygons", DE_NUTS1, first=FALSE, col=gray(0.5)), list("sp.points", DE_RB_2005[,i+14], col=gray(0.25), pch=3, cex=.5)), main=as.character(index(DE_pred_winter[,i,drop=F]@time))) png(file=paste("vignettes/figures/animate/pred",i,".png", sep=""), width=6, height=6, "in", res=150) print(pnt) dev.off() } } DE_pred <- STF(gridDE, DE_RB_2005@time[smplDays]) tIDS <- unique(pmax(1,pmin(as.numeric(outer(-5:5, smplDays, "+")), 365))) sepPred <- krigeST(PM10~1, data=DE_RB_2005[,tIDS], newdata=DE_pred, fitSepModel, nmax=50, stAni=fitMetricModel$stAni/24/3600) psPred <- krigeST(PM10~1, data=DE_RB_2005[,tIDS], newdata=DE_pred, fitProdSumModel, nmax=50, stAni=fitMetricModel$stAni/24/3600) metPred <- krigeST(PM10~1, data=DE_RB_2005[,tIDS], newdata=DE_pred, fitMetricModel, nmax=50, stAni=fitMetricModel$stAni/24/3600) sumPred <- krigeST(PM10~1, data=DE_RB_2005[,tIDS], newdata=DE_pred, fitSumMetricModel, nmax=50, stAni=fitMetricModel$stAni/24/3600) smplSumPred <- krigeST(PM10~1, data=DE_RB_2005[,tIDS], # start: 12:24 newdata=DE_pred, fitSimpleSumMetricModel, nmax=50, stAni=fitMetricModel$stAni/24/3600) # pure spatial prediction pureSpPred <- matrix(NA, nrow=length(gridDE), length(smplDays)) col <- 1 for(i in smplDays) { # i <- 1 pureSpPred[,col] <- krige(PM10~1, as(DE_RB_2005, "STSDF")[,i], gridDE, model=spVgmMod, nmax=50)$var1.pred col <- col+1 } pureSpPred <- STFDF(gridDE, DE_RB_2005@time[smplDays], data.frame(var1.pred = as.numeric(pureSpPred))) DE_RB_2005 <- as(DE_RB_2005, "STFDF") if(paper) { stpl <- stplot(smplSumPred, col.regions=bpy.colors(120)[-(1:20)], scales=list(draw=F), main=NULL, at=0:70, # "spatio-temporal sum-metric model" sp.layout = list(list("sp.polygons", DE_NUTS1, first=FALSE, col=gray(0.5)), list("sp.points", DE_RB_2005@sp, col=gray(0.25), pch=3, cex=.5))) png(file="vignettes/figures/pred_daily_means_PM10.png", width=9, height=6, "in", res=150) print(stpl) dev.off() } else { stplot(pureSpPred, col.regions=bpy.colors, scales=list(draw=F), main="pure spatial daily prediction") stplot(sepPred, col.regions=bpy.colors(), scales=list(draw=F), main="spatio-temporal separable model") stplot(psPred, col.regions=bpy.colors, scales=list(draw=F), main="spatio-temporal product-sum model") stplot(metPred, col.regions=bpy.colors, scales=list(draw=F), main="spatio-temporal metric model") stplot(sumPred, col.regions=bpy.colors, scales=list(draw=F), main="spatio-temporal sum-metric model") stplot(smplSumPred, col.regions=bpy.colors, scales=list(draw=F), main="spatio-temporal simple sum-metric model") }gstat/demo/sic2004.R0000644000176200001440000000776014646417261013554 0ustar liggesusers# $Id: sic2004.R,v 1.4 2006-11-22 12:54:16 edzer Exp $ # compared to the original submission, two errors # were found; one was corrected (dayx~x -> dayx~1), the other not. # read csv files: #sic.pred = read.csv("SIC2004_out.csv", header=F) #names(sic.pred) = c("record", "x", "y") #input = read.csv("SIC2004_input.csv", header=F) #names(input) = c("record", "x", "y", "dayx") #joker = read.csv("SIC2004_joker.csv", header=F) #names(joker) = c("record", "x", "y", "dayx") library(sp) library(gstat) library(lattice) data(sic2004) # load directly from R data base input = sic.test[,1:4] names(input) = c("record", "x", "y", "dayx") joker = sic.test[,c(1,2,3,5)] names(joker) = c("record", "x", "y", "dayx") do.sic = function(sic.input, sic.output) { require(gstat) # calculate omnidirectional sample variogram, cutoff 500000, intervals 20000 sic.input = sic.input[sic.input$record != 838, ] v.sample = variogram(dayx~1, ~x+y, input, width=2e4, cutoff=5e5) # ^^^^^ the error: this should be sic.input # ^ this error has been corrected # initial spherical model for fit: nug=100, p.sill=400,range=4.5e5 initial.model = vgm(400, "Sph", 450000, 100) # fit the nugget, sill and range to the sample variogram: v.fitted = fit.variogram(v.sample, initial.model, fit.method = 2) # function returns the output from the call to krige(): krige(dayx~1, ~x+y, sic.input, sic.output, model = v.fitted, nmax = 125) } # do the spatial interpolations: output = do.sic(input, sic.pred) joker.output = do.sic(joker, sic.pred) # write csv files: #write.table(output, "sic2004_output.csv", # sep=",", col.names=FALSE, row.names=FALSE) #write.table(joker.output, "sic2004_joker_output.csv", # sep=",", col.names=FALSE, row.names=FALSE) # calculate output: # read csv files: sic.stats = function(obs, pred) { print("observed:") x = obs print(c(min=min(x), max=max(x), mean=mean(x), median=median(x), stddev=sqrt(var(x)))) print("predicted:") x = pred print(c(min=min(x), max=max(x), mean=mean(x), median=median(x), stddev=sqrt(var(x)))) print("error:") x = pred - obs print(c(mae=mean(abs(x)), me=mean(x), corr=cor(pred,obs), rmse=sqrt(mean(x^2)))) } options(digits=4) print("input data first") sic.stats(sic.test[,4], output$var1.pred) print("joker with error variogram") sic.stats(sic.test[,4], joker.output$var1.pred) ################## do.sic = function(sic.input, sic.output) { require(gstat) v.sample = variogram(dayx~1, ~x+y, input, width=2e4, cutoff=5e5) initial.model = vgm(400, "Sph", 450000, 100) v.fitted = fit.variogram(v.sample, initial.model, fit.method = 2) krige(dayx~1, ~x+y, sic.input, sic.output, model = v.fitted, nmax = 125) } # do the spatial interpolations on a grid: grid1 = do.sic(input, sic.grid) grid2 = do.sic(joker, sic.grid) grid1$v2 = grid2$var1.pred grid1$v2.var = grid2$var1.var grid1$var1.pred[grid1$var1.pred>200] = 205 # mask larger values! grid1$v2[grid1$v2>200] = 205 # mask larger values! greys = c(255, 247, 240, 228, 217, 203, 189, 169, 150, 132, 115, 99, 82, 60, 37, 0) panel.sic = function(...){ panel.levelplot(...) lpoints(sic.train$x, sic.train$y, pch=22, cex=.5, col=1) lpoints(sic.pred$x, sic.pred$y, pch="+", cex=1, col=1) } cp1 = contourplot(z~x+y|name, map.to.lev(grid1,z=c(3,5), ns=c("data set 1","data set 2")), asp="iso", col.regions=rgb(greys/255,greys/255,greys/255), at=50+(0:16)*10,region=TRUE,labels=FALSE, xlab = "", ylab = "",scales=list(draw=F),panel=panel.sic) cp2 = contourplot(sqrt(z)~x+y|name, map.to.lev(grid1,z=4, ns="standard error"), asp="iso",scales=list(draw=F), col.regions=rgb(greys/255,greys/255,greys/255), region=TRUE,labels=FALSE, xlab = "", ylab = "", panel=panel.sic) print(cp1, c(0,0,0.625,1), more=T) print(cp2, c(0.625,0,1,1), more=F) wireframe(var1.pred~x+y,grid2,asp=c(diff(range(grid2$y))/diff(range(grid2$x)),0.5), xlab="x",ylab="y",zlab="z",drape=T, col.regions=gray(sqrt(seq(from=1.0, to=0.0, length=100)))) gstat/demo/block.R0000644000176200001440000000254014646417261013551 0ustar liggesusers# $Id: block.R,v 1.5 2006-02-10 19:05:02 edzer Exp $ library(sp) data(meuse) coordinates(meuse) = ~x+y data(meuse.grid) gridded(meuse.grid) = ~x+y vgm.fit = fit.variogram(variogram(zinc~1, meuse), vgm(1, "Sph", 800, 1)) bl0 = krige(zinc~1, meuse, meuse.grid, model = vgm.fit, block = c(0,0)) bl1 = krige(zinc~1, meuse, meuse.grid, model = vgm.fit, block = c(40,40)) bl2 = krige(zinc~1, meuse, meuse.grid, model = vgm.fit,block = c(100,100)) bl3 = krige(zinc~1, meuse, meuse.grid, model = vgm.fit,block = c(400,400)) bl0$"block=0x0" = bl0$var1.pred bl0$"block=40x40" = bl1$var1.pred bl0$"block=100x100" = bl2$var1.pred bl0$"block=400x400" = bl3$var1.pred plt1 = spplot(bl0, 3:6, layout=c(4,1), col.regions=bpy.colors(), main = "kriging predictions") bl0$"block=0x0" = bl0$var1.var bl0$"block=40x40" = bl1$var1.var bl0$"block=100x100" = bl2$var1.var bl0$"block=400x400" = bl3$var1.var plt2 = spplot(bl0, 3:6, layout=c(4,1), col.regions=bpy.colors(), main = "kriging standard errors") print(plt1, split = c(1, 1, 1, 2), more = T) print(plt2, split = c(1, 2, 1, 2), more = F) # block krige the full area: bl = krige(zinc~1, meuse, newdata = SpatialPoints(data.frame(x=0,y=0)), model = vgm.fit, block = coordinates(meuse.grid)) bl # block kriging standard error: sqrt(bl$var1.var) # classical statistical standard error of mean: sqrt(var(meuse$zinc)/155) gstat/demo/stkrige-crossvalidation.R0000644000176200001440000002456514646417261017344 0ustar liggesusers######################################################## # note that demo(stkrige) and demo(stkrige-prediction) # # need to be run before this one # ######################################################## ## cross-validation crossStat <- function(var1, var2="PM10", STxDF=DE_RB_2005, digits=NA) { diff <- STxDF[,,var1,drop=F]@data[[1]] - STxDF[,,var2,drop=F]@data[[1]] RMSE <- sqrt(mean(diff^2)) MAE <- mean(abs(diff)) ME <- mean(diff) COR <- cor(STxDF[,,var1,drop=F]@data[[1]], STxDF[,,var2,drop=F]@data[[1]]) res <- c(RMSE, MAE, ME, COR) names(res) <- c("RMSE", "MAE", "ME", "COR") if(is.na(digits)) return(res) else return(round(res, digits)) } # purely spatial: DE_RB_2005 <- as(DE_RB_2005, "STSDF") pureSp <- NULL for(i in 1:365) { # i <- 1 pureSp <- c(pureSp, krige.cv(PM10~1,DE_RB_2005[,i,"PM10"], model=spVgmMod, nmax=10)$var1.pred) } DE_RB_2005@data$pureSp10Nghbr <- pureSp pureSp <- NULL for(i in 1:365) { # i <- 1 pureSp <- c(pureSp, krige.cv(PM10~1,DE_RB_2005[,i,"PM10"],model=spVgmMod,nmax=50)$var1.pred) } DE_RB_2005@data$pureSp50Nghbr <- pureSp ## spatio-temporal LOOCV target <- as(DE_RB_2005[,,"PM10"],"STFDF") ## seprable model # 10 neighbours res <- matrix(NA, length(DE_RB_2005@sp), 365) for(loc in 1:length(DE_RB_2005@sp)) { cat("Location", loc, "\n") res[loc,!is.na(target[loc,])[,"PM10"]] <- krigeST(PM10~1, data=DE_RB_2005[(1:length(DE_RB_2005@sp))[-loc],], newdata=DE_RB_2005[loc,,drop=F], fitSepModel, nmax=10, stAni=fitMetricModel$stAni/24/3600)$var1.pred } DE_RB_2005@data$sepModel10Nghbr <- as.vector(res)[!is.na(as.vector(res))] # 50 neighbours res <- matrix(NA, length(DE_RB_2005@sp), 365) for(loc in 1:length(DE_RB_2005@sp)) { # loc <- 1 cat("Location", loc, "\n") res[loc,!is.na(target[loc,])[,"PM10"]] <- krigeST(PM10~1, data=DE_RB_2005[(1:length(DE_RB_2005@sp))[-loc],], newdata=DE_RB_2005[loc,,drop=F], fitSepModel, nmax=50, stAni=fitMetricModel$stAni/24/3600)$var1.pred } DE_RB_2005@data$sepModel50Nghbr <- as.vector(res)[!is.na(as.vector(res))] ## product-sum model # 10 neighbours res <- matrix(NA, length(DE_RB_2005@sp), 365) for(loc in 1:length(DE_RB_2005@sp)) { # loc <- 1 cat("Location", loc, "\n") res[loc,!is.na(target[loc,])[,"PM10"]] <- krigeST(PM10~1, data=DE_RB_2005[(1:length(DE_RB_2005@sp))[-loc],], newdata=DE_RB_2005[loc,,drop=F], fitProdSumModel, nmax=10, stAni=fitMetricModel$stAni/24/3600)$var1.pred } DE_RB_2005@data$psModel10Nghbr <- as.vector(res)[!is.na(as.vector(res))] # 50 neighbours res <- matrix(NA, length(DE_RB_2005@sp), 365) for(loc in 1:length(DE_RB_2005@sp)) { # loc <- 1 cat("Location", loc, "\n") res[loc,!is.na(target[loc,])[,"PM10"]] <- krigeST(PM10~1, data=DE_RB_2005[(1:length(DE_RB_2005@sp))[-loc],], newdata=DE_RB_2005[loc,,drop=F], fitProdSumModel, nmax=50, stAni=fitMetricModel$stAni/24/3600)$var1.pred } DE_RB_2005@data$psModel50Nghbr <- as.vector(res)[!is.na(as.vector(res))] ## metric model # 10 neighbours res <- matrix(NA, length(DE_RB_2005@sp), 365) for(loc in 1:length(DE_RB_2005@sp)) { # loc <- 1 cat("Location", loc, "\n") res[loc,!is.na(target[loc,])[,"PM10"]] <- krigeST(PM10~1, data=DE_RB_2005[(1:length(DE_RB_2005@sp))[-loc],], newdata=DE_RB_2005[loc,,drop=F], fitMetricModel, nmax=10, stAni=fitMetricModel$stAni/24/3600)$var1.pred } DE_RB_2005@data$metricModel10Nghbr <- as.vector(res)[!is.na(as.vector(res))] # 50 neighbours res <- matrix(NA, length(DE_RB_2005@sp), 365) for(loc in 1:length(DE_RB_2005@sp)) { # loc <- 1 cat("Location", loc, "\n") res[loc,!is.na(target[loc,])[,"PM10"]] <- krigeST(PM10~1, data=DE_RB_2005[(1:length(DE_RB_2005@sp))[-loc],], newdata=DE_RB_2005[loc,,drop=F], fitMetricModel, nmax=50, stAni=fitMetricModel$stAni/24/3600)$var1.pred } DE_RB_2005@data$metricModel50Nghbr <- as.vector(res)[!is.na(as.vector(res))] ## sum-metric model # 10 neighbours res <- matrix(NA, length(DE_RB_2005@sp), 365) for(loc in 1:length(DE_RB_2005@sp)) { # loc <- 1 cat("Location", loc, "\n") res[loc,!is.na(target[loc,])[,"PM10"]] <- krigeST(PM10~1, data=DE_RB_2005[(1:length(DE_RB_2005@sp))[-loc],], newdata=DE_RB_2005[loc,,drop=F], fitSumMetricModel, nmax=10, stAni=fitMetricModel$stAni/24/3600)$var1.pred } DE_RB_2005@data$sumMetricModel10Nghbr <- as.vector(res)[!is.na(as.vector(res))] # 50 neighbours res <- array(NA, c(length(DE_RB_2005@sp), 365,2)) for(loc in 1:length(DE_RB_2005@sp)) { # loc <- 38 cat("Location", loc, "\n") res[loc,!is.na(target[loc,])[,"PM10"],] <- as.matrix(krigeST(PM10~1, data=DE_RB_2005[(1:length(DE_RB_2005@sp))[-loc],], newdata=DE_RB_2005[loc,,drop=F], fitSumMetricModel, nmax=50, computeVar=T, stAni=linStAni*1000/24/3600)@data[,c("var1.pred","var1.var")]) } DE_RB_2005@data$sumMetricModel50Nghbr <- as.vector(res[,,1])[!is.na(target@data)] DE_RB_2005@data$sumMetricModel50NghbrVar <- as.vector(res[,,2])[!is.na(target@data)] DE_RB_2005@data$sumMetricModel50Nghbr95u <- apply(DE_RB_2005@data, 1, function(x) { qnorm(0.975, x["sumMetricModel50Nghbr"], sqrt(x["sumMetricModel50NghbrVar"])) }) DE_RB_2005@data$sumMetricModel50Nghbr95l <- apply(DE_RB_2005@data, 1, function(x) { qnorm(0.025, x["sumMetricModel50Nghbr"], sqrt(x["sumMetricModel50NghbrVar"])) }) ## simple sum-metric model # 10 neighbours res <- matrix(NA, length(DE_RB_2005@sp), 365) for(loc in 1:length(DE_RB_2005@sp)) { # loc <- 1 cat("Location", loc, "\n") res[loc,!is.na(target[loc,])[,"PM10"]] <- krigeST(PM10~1, data=DE_RB_2005[(1:length(DE_RB_2005@sp))[-loc],], newdata=DE_RB_2005[loc,,drop=F], fitSimpleSumMetricModel, nmax=10, stAni=fitMetricModel$stAni/24/3600)$var1.pred } DE_RB_2005@data$simpleSumMetricModel10Nghbr <- as.vector(res)[!is.na(as.vector(res))] # 50 neighbours res <- matrix(NA, length(DE_RB_2005@sp), 365) for(loc in 1:length(DE_RB_2005@sp)) { # loc <- 1 cat("Location", loc, "\n") res[loc,!is.na(target[loc,])[,"PM10"]] <- krigeST(PM10~1, data=DE_RB_2005[(1:length(DE_RB_2005@sp))[-loc],], newdata=DE_RB_2005[loc,,drop=F], fitSimpleSumMetricModel, nmax=50, stAni=fitMetricModel$stAni/24/3600)$var1.pred } DE_RB_2005@data$simpleSumMetricModel50Nghbr <- as.vector(res)[!is.na(as.vector(res))] ### # cross-stats rbind( crossStat("pureSp10Nghbr", digits=2), crossStat("pureSp50Nghbr", digits=2), crossStat("sepModel10Nghbr", digits=2), crossStat("sepModel50Nghbr", digits=2), crossStat("psModel10Nghbr", digits=2), crossStat("psModel50Nghbr", digits=2), crossStat("metricModel10Nghbr", digits=2), crossStat("metricModel50Nghbr", digits=2), crossStat("sumMetricModel10Nghbr", digits=2), crossStat("sumMetricModel50Nghbr", digits=2)) if(paper) { texRow <- function(x) { paste(paste(x,collapse=" & ")," \\\\ \n") } cat(apply(round(rbind(crossStat("pureSp10Nghbr"), crossStat("sepModel10Nghbr"), crossStat("psModel10Nghbr"), crossStat("metricModel10Nghbr"), crossStat("sumMetricModel10Nghbr"), crossStat("simpleSumMetricModel50Nghbr"), crossStat("pureSp50Nghbr"), crossStat("sepModel50Nghbr"), crossStat("psModel50Nghbr"), crossStat("metricModel50Nghbr"), crossStat("sumMetricModel50Nghbr"), crossStat("simpleSumMetricModel50Nghbr") ), 2),1,texRow)) loc <- 38 # sample(68,1) # 15 tw <- "2005-01-15/2005-04-15" png("vignettes/figures/singleStationTimeSeries.png", 9, 4, "in", bg="white", res = 149) plot(DE_RB_2005[loc,tw][,"sumMetricModel50Nghbr"], main=paste("Location", DE_RB_2005@sp@data$station_european_code[loc]), ylim=c(0,70)) points(DE_RB_2005[loc,tw][,"PM10"], type="l", col="darkgreen", lty=1) points(DE_RB_2005[loc,tw][,"sumMetricModel50Nghbr95u"], type="l", col="darkgrey", lty=2) points(DE_RB_2005[loc,tw][,"sumMetricModel50Nghbr95l"], type="l", col="darkgrey", lty=2) legend("topright",legend = c("observed","sum-metric","95 % prediction band"), lty=c(1,1,2), col=c("darkgreen", "black", "darkgrey") ) dev.off() DE_RB_2005@data$diffPM10 <- DE_RB_2005@data$sumMetricModel50Nghbr - DE_RB_2005@data$PM10 stpl <- stplot(as(DE_RB_2005[,smplDays, "diffPM10"],"STFDF"), col.regions=bpy.colors(5), sp.layout = list("sp.polygons", DE_NUTS1), scales=list(draw=F), key.space="right", colorkey=T, cuts=c(-25,-15,-5,5,15,25), main=NULL) #expression(paste("daily mean ","PM"[10]," concentration"))) png("vignettes/figures/diffs_daily_means_PM10.png", width=9, height=6, "in", res=150) print(stpl) dev.off() }gstat/vignettes/0000755000176200001440000000000014750415427013415 5ustar liggesusersgstat/vignettes/ifgi-logo_int.pdf0000644000176200001440000002421514646417261016644 0ustar liggesusers%PDF-1.4 % 4 0 obj << /Length 37 /Filter /FlateDecode >> stream x+2T0BC]C]\.}\C|@._I endstream endobj 3 0 obj << /Type /Page /Contents 4 0 R /Resources 2 0 R /MediaBox [0 0 240 86] /Parent 5 0 R >> endobj 1 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./ifgi-logos-crop.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 6 0 R /BBox [0 0 254 182] /Resources << /XObject << /Im1 7 0 R >>/ProcSet [ /PDF ] >> /Length 38 /Filter /FlateDecode >> stream x+2T0BC]#K ajj˥km  endstream endobj 6 0 obj << /Producer (pdfTeX-1.40.3) /Creator (TeX) /CreationDate (D:20080508123050+02'00') /ModDate (D:20080508123050+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX using libpoppler, Version 3.141592-1.40.3-2.2 \(Web2C 7.5.6\) kpathsea version 3.5.6) >> endobj 7 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./ifgi-logos.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 8 0 R /BBox [ 0 0 595 842] /Resources << /ProcSet [/PDF/Text] /ExtGState << /R13 9 0 R /R12 10 0 R /R7 11 0 R >> /Font << /R8 12 0 R /R10 13 0 R >> >> /Length 14 0 R /Filter /FlateDecode >> stream xXn7)xkD,A H$ڻlU"1G#c_v+\譅 X3of#?-*#jt(j!°){FT6:yǭtluxD=[X4כoY2ڤ ߓ1ARkEbmݾ2-Kjqu(bME< ѱKؒ`vxd_ۭYw_m޷n}5 :@Vk;|; Y\+mŒ \' EU;}P ZWtN~5$)7YͽDxUp#lȩvT#mڢ:QiO7?۶9?'vVNi)>wHv"frFh{28 7 XQv㪶%H 3˾ =}.R%`s*Q*%hnܛ;kv s'*JFU0Cfgôa`QX8ycx#&9xU ]19rp!˅BE8?^(c$G)2 QeWY5(C" #SZ5brr!(& _l =N7\e=_H JID+l#'DM#]-}OIIZMq/w9 )P<P FByfҔ_6SCF@[ar4uZXmNм hm_؉c** rlz<c|P] f:20m5ȹ D,ܓ#tNT+F^ML|uhєJt=Nt']5:t1'ܝȶo5MHAW 灃WO^eХ) PxsIj"꫿(/KBq³f"c\~Kҟ RM +iIY]zcдnL7` v"iNFaw,f톝œfgGƹ Mv@cu xCb^ U ly),x 3%E䙣M SUP ZEUj2$A `>)8!<.U5@&%Qƒ+W`.k1"A4 7&ŋ$2/+VUJɪNX؀(7A-$ endstream endobj 8 0 obj << /Producer (GPL Ghostscript SVN PRE-RELEASE 8.61) /CreationDate (D:20080508100429Z) /ModDate (D:20080508100429Z) >> endobj 9 0 obj << /Type /ExtGState /op true >> endobj 10 0 obj << /Type /ExtGState /op false >> endobj 11 0 obj << /Type /ExtGState /TR /Identity /OPM 1 /op true >> endobj 12 0 obj << /BaseFont /KRQJGX#2BDIN-Bold /FontDescriptor 15 0 R /Type /Font /FirstChar 32 /LastChar 117 /Widths [ 232 0 0 0 0 0 0 0 0 0 0 0 0 426 285 0 0 543 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 659 0 0 648 0 305 0 0 575 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 534 0 0 0 548 342 555 0 275 0 0 0 0 573 543 0 0 0 501 0 573] /Encoding /MacRomanEncoding /Subtype /Type1 >> endobj 13 0 obj << /BaseFont /YSWVLP#2BDIN-Regular /FontDescriptor 16 0 R /Type /Font /FirstChar 32 /LastChar 167 /Widths [ 249 0 0 0 0 0 0 0 0 0 0 0 264 426 270 0 522 522 0 0 522 522 522 0 0 0 297 0 0 0 0 0 0 611 668 0 673 600 0 650 0 282 0 0 573 816 0 0 630 0 0 588 548 683 546 0 0 0 0 0 0 0 0 0 0 526 545 490 545 530 314 543 562 253 0 536 297 879 562 530 545 0 421 496 332 562 447 724 0 447 459 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 526 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 530 0 0 0 0 562 0 0 0 0 0 0 0 556] /Encoding /MacRomanEncoding /Subtype /Type1 >> endobj 14 0 obj 1906 endobj 15 0 obj << /Type /FontDescriptor /FontName /KRQJGX#2BDIN-Bold /FontBBox [ 0 -197 608 720] /Flags 4 /Ascent 720 /CapHeight 720 /Descent -197 /ItalicAngle 0 /StemV 91 /MissingWidth 1000 /CharSet (/D/G/I/L/a/e/f/g/hyphen/i/n/o/one/period/s/space/u) /FontFile3 17 0 R >> endobj 16 0 obj << /Type /FontDescriptor /FontName /YSWVLP#2BDIN-Regular /FontBBox [ 0 -226 794 719] /Flags 4 /Ascent 719 /CapHeight 719 /Descent -226 /ItalicAngle 0 /StemV 119 /MissingWidth 1000 /CharSet (/A/B/D/E/G/I/L/M/P/S/T/U/V/a/adieresis/b/c/colon/comma/d/e/f/five/four/g/germandbls/h/hyphen/i/k/l/m/n/o/odieresis/one/p/period/r/s/six/space/t/u/udieresis/v/w/y/z/zero) /FontFile3 18 0 R >> endobj 17 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1282 >> stream x= PTU ܫ^cݥ0- %N!XwXTtMǍD?A4fISTPވS i&`ҙ|]:8uWfsf͙1MAaJ9Õ̓f3Bg&K'3Os|1{}aS. ц yzQkh)?;3Ck(FZD[~Ūmyfz6˒eg>+l2 /̈,c~ F ^`%d."$$NV(7%ђ8r f2}E1ņwSmWJ}龎ۨa} y)^}ج?)Rh2=tT% 8]oȍPaƩig5/bP`TC9m -asL cuGLGaζi-{<XWf [.ƊhjGZxY 0"+A>s7h5}Yۣ6XŁJC UT籯YVlm;g4m)پ+'_s>.rO*(b,;&xzi*Wj`(ٝ/SExGbCt+HƒG`epX R=:ϵ8Q^f  iSJK}u" }(tc BG3[N:N \5by^:xnvP"wE9]=VJ{E_'3Y)ssQ U|Cm@gڢ9;ʹ|LI][BH'%K.\uKn}rQ'{QY7T=YVvrmy&2\gm e9mlk8W=h[s) +`%9yժ/ck܄0\{~o> stream xVyTT0=ƥyS .ɱ5D("Ae}`AM@$h6 "[E@A E n%jIR7i@.==yo~] 26Btw+Yq8[II.æRlj||٥pmO##'z%a)V X& ˰tNLHd!!52%!4561!42*125&rg2>6,%4%cߣAM nkv'F$E\#f}jwφ8ߝ~ll+-|j%%uY(yh'Z6#gZ -@ ?d~&  7-G H9 3$G,4A3Q!ZJCh6ꐘIH %mFKvH.iB<'_Ȏʺe-L\`=fafpV [ml`pӧ5G k9xILV}1'o=}pΘpI3 هnE.;W#j$Rc KRc ^|2q)܏?=UXs l7Zsdrzkϖv+>\[j B (tjH';eS\D|*]Z_}K&Sm|zf>t| Wé2Uq ̝+˔r1kD RB(]!7adn45PD C<;3i;:wH/N. rN s=::55.;Ԫ揮^ܛjR}Jg JgûbٝR]WՅ+T5ɭpn/n9y(--wxQ: >i̷Su%ׄ/ ܟzؖ܅[Kkj [ب6wV+Nf<d͘=(Mv{a ~@J(I1גWRT[z<>[ʃ9k-5Ug޸/9ɛLJXL/>ddg؆4|߳m05E|â3u j-4OxH7@ʨ63xzP:(܂+4+_mE B}  BhջO q4EMI .O\/{oTžZt!?I]Cg`Mٌ.|ts.x6F -էw> YTT˒ŋifq㶿]sOvT3\שM\_[_|@b*aBPP4Ի) ph a6XnN>]aN-=V }T!W ^+?PGw'_D$l Wc5.o n?Љ\[{Cc[y~5>(3?&Z)9(dZ7r.H| ࡺ֎^|Zd 6%\w.,r"|I/A43 K32CucoL+WRer⣫+7a?<q|{Ͷ#.ͣ Mܝ ov UKccG̼B I6?aYnΪEq8{oc<;K˵Wނx$ڮm>bW)~{km:+Z8 _V9lΜCkQ9+vg)7 zO0ӸE͛E#0r$GjR+HxʬB>Ie_,!:\ΤB(|K<x1Av޼ b>%s_a/a LmcL((7Q6k 5L3p!ca?Ue~~N)tf!*MW}N"t;X2-6G;)dKߡlk⫸S};3~{P5P@ :;ɫؤSv qӏ7qDf@6Gir4gFR?}#}խc:tOcz4M87pm~9*$pTL?hkI0 gPlfHA ':h~i$a5CU?XJ!9 M#gcR[qqT˾Pߵǻ u5?_Oep_J^-NE,> /ProcSet [ /PDF ] >> endobj 5 0 obj << /Type /Pages /Count 1 /Kids [3 0 R] >> endobj 19 0 obj << /Type /Catalog /Pages 5 0 R >> endobj 20 0 obj << /Producer (pdfTeX-1.40.3) /Creator (TeX) /CreationDate (D:20080508123111+02'00') /ModDate (D:20080508123111+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX using libpoppler, Version 3.141592-1.40.3-2.2 (Web2C 7.5.6) kpathsea version 3.5.6) >> endobj xref 0 21 0000000000 65535 f 0000000234 00000 n 0000009362 00000 n 0000000131 00000 n 0000000015 00000 n 0000009427 00000 n 0000000544 00000 n 0000000816 00000 n 0000003058 00000 n 0000003191 00000 n 0000003238 00000 n 0000003287 00000 n 0000003356 00000 n 0000003731 00000 n 0000004275 00000 n 0000004296 00000 n 0000004571 00000 n 0000004968 00000 n 0000006341 00000 n 0000009484 00000 n 0000009534 00000 n trailer << /Size 21 /Root 19 0 R /Info 20 0 R /ID [ ] >> startxref 9805 %%EOF gstat/vignettes/prs.Rnw0000644000176200001440000002004514646417261014714 0ustar liggesusers%% Document started, Sat Jul 3 19:30:52 CEST 2004, my 37th birthday, %% while being stuck for 24 hours at Philadelphia airport, on my way %% back from the joint TIES/Accuracy 2004 symposium in Portland, ME. %% Continued, Oct 28, during the Apmosphere mid-term review. Oh, shame. % \VignetteIndexEntry{ The pairwise relative semivariogram } \documentclass[a4paper]{article} \usepackage[colorlinks=true,urlcolor=blue]{hyperref} \usepackage{alltt} \newcommand{\code}[1]{{\tt #1}} \SweaveOpts{echo=TRUE} \title{The pairwise relative semivariogram} \author{ \includegraphics[width=.4\columnwidth]{ifgi-logo_int}\\ \href{mailto:edzer.pebesma@uni-muenster.de}{Edzer Pebesma} } \date{\small Aug 29, 2011 } \begin{document} \maketitle \section{Introduction} The general relative variogram (Deutsch and Journel, 1997) is defined as $$ \gamma(h) = \frac{1}{2N_h} \sum_{i=1}^{N_h} \left(\frac{2(Z(s_i)-Z(s_i+h))}{Z(s_i)+Z(s_i+h)}\right)^2. $$ It is claimed to reveal spatial structure (correlation) better when data are skewed and/or clustered. The \code{cluster.dat} data set used in this vignette, from the GSLIB distribution\footnote{F77 source code for Linux, downloaded Aug 28, 2011 from \code{http://www.gslib.com/}}, seems to confirm this. From version 1.02 on, R package \code{gstat} provides computation of the {\em pairwise relative semivariogram}. The following code provides an example and verification of the computation using direct R code and using the GSLIB program \code{gamv}. The following code imports the \code{cluster.dat} data from GSLIB, which has been converted to have a single-line header containing column names, packaged with the R gstat package, and converts it into a \code{SpatialPointsDataFrame} object: <<>>= library(gstat) cluster = read.table(system.file("external/cluster.txt", package="gstat"), header = TRUE) summary(cluster) library(sp) coordinates(cluster) = ~X+Y @ The following commands specify a sequence of lag boundaries that correspond to the GSLIB conventions, and compute a regular variogram using these boundaries: <<>>= bnd = c(0,2.5,7.5,12.5,17.5,22.5,27.5,32.5,37.5,42.5,47.5,52.5) variogram(Primary~1, cluster, boundaries = bnd) @ To compute the relative pairwise variogram, the logical argument \code{PR} ({\em pairwise relative}) needs to be set to \code{TRUE}: <<>>= variogram(Primary~1, cluster, boundaries=bnd, PR = TRUE) @ Figure \ref{fig:vgm} shows the two variograms, as plots, side by side \begin{figure} <>= pl1 = plot(variogram(Primary~1, cluster, boundaries=bnd, PR = FALSE)) pl2 = plot(variogram(Primary~1, cluster, boundaries=bnd, PR = TRUE)) print(pl1, split = c(1,1,2,1), more = TRUE) print(pl2, split = c(2,1,2,1), more = FALSE) @ \caption{Regular variogram (left) and pairwise relative variogram (right) for the GSLIB data set \code{cluster.dat}.} \label{fig:vgm} \end{figure} \section{Verification with plain R code} The following R code reproduces the relative pairwise semivariogram values for the first three lags, i.e. 0-2.5, 2.5-7.5 and 7.5-12.5. <<>>= z = cluster$Primary d = spDists(cluster) zd = outer(z, z, "-") zs = outer(z, z, "+") pr = (2 * zd / zs )^2 prv = as.vector(pr) dv = as.vector(d) mean(prv[dv > 0 & dv < 2.5])/2 mean(prv[dv > 2.5 & dv < 7.5])/2 mean(prv[dv > 7.5 & dv < 12.5])/2 @ \section{Verification with GSLIB} In a verification with the GSLIB (Deutsch and Journel, 1997) code of \code{gamv}, the following file was used: \begin{alltt} Parameters for GAMV ******************* START OF PARAMETERS: ../data/cluster.dat \\file with data 1 2 0 \\ columns for X, Y, Z coordinates 1 3 \\ number of varables,column numbers -1.0e21 1.0e21 \\ trimming limits gamv.out \\file for variogram output 10 \\number of lags 5.0 \\lag separation distance 2.5 \\lag tolerance 1 \\number of directions 0.0 90.0 50.0 0.0 90.0 50.0 \\azm,atol,bandh,dip,dtol,bandv 0 \\standardize sills? (0=no, 1=yes) 2 \\number of variograms 1 1 1 \\tail var., head var., variogram type 1 1 6 \\tail var., head var., variogram type \end{alltt} Running this program with these parameters gave the following output: \begin{alltt} Semivariogram tail:Primary head:Primary direction 1 1 .000 .00000 280 4.35043 4.35043 2 1.528 58.07709 298 8.62309 8.62309 3 5.473 54.09188 1248 5.41315 5.41315 4 10.151 48.85144 1978 4.42758 4.42758 5 15.112 40.08909 2498 4.25680 4.25680 6 20.033 42.45081 2296 3.74311 3.74311 7 25.020 48.60365 2734 4.09575 4.09575 8 29.996 46.88879 2622 4.15950 4.15950 9 34.907 44.36890 2170 3.77190 3.77190 10 39.876 47.34666 1808 4.54173 4.54173 11 44.717 38.72725 1222 5.15251 5.15251 12 49.387 30.67908 438 4.56539 4.56539 Pairwise Relative tail:Primary head:Primary direction 1 1 .000 .00000 280 4.35043 4.35043 2 1.528 .36084 298 8.62309 8.62309 3 5.473 .63071 1248 5.41315 5.41315 4 10.151 .83764 1978 4.42758 4.42758 5 15.112 .77691 2498 4.25680 4.25680 6 20.033 .87746 2296 3.74311 3.74311 7 25.020 .89610 2734 4.09575 4.09575 8 29.996 .90023 2622 4.15950 4.15950 9 34.907 .96043 2170 3.77190 3.77190 10 39.876 .90554 1808 4.54173 4.54173 11 44.717 .75545 1222 5.15251 5.15251 12 49.387 .82268 438 4.56539 4.56539 \end{alltt} As can be seen, the values in the third column (semivariogram for the first section, pairwise relative semivariogram for the second) correspond to the output generated by \code{variogram} of package \code{gstat}. Two differences with respect to the gstat output are: \begin{itemize} \item for the first lag with distance zero, GSLIB reports that the semivariance value is zero based on 280 point pairs; \item the number of point pairs in GSLIB is double the number reported by gstat. \end{itemize} The ground for these differences seems that the GSLIB \code{gamv} uses a single routine for computing variograms as well as cross variograms and cross covariances. For cross variograms or covariograms, considering two variables $Z_a$ and $Z_b$ each having $N$ observations, the $N^2$ point pairs $Z_a(s_i),Z_b(s_i+h)$ and $Z_a(s_i+h),Z_b(s_i)$ need to be evaluated, and all contribute information. For direct (non-cross) variograms or covariograms, $Z_a=Z_b$ and the $N^2$ pairs considered contain the $N$ trivial pairs $(Z(s_i)-Z(s_i))^2=0$, which contribute no information, as well as all duplicate pairs, i.e. in addition to $(Z(s_i)-Z(s_i+h))^2$, the identical pair $(Z(s_i+h)-Z(s_i))^2$ is also considered. This leads to correct variogram value estimates, but incorrect unique point pair numbers. (Data set \code{cluster} contains $N=140$ observations.) In contrast, \code{gstat} considers (and reports) only the number of unique pairs for each lag. \section*{References} \begin{itemize} \item Deutsch, C.V., A.G. Journel, 1997. GSLIB: Geostatistical Software Library and User's Guide, second edition. Oxford University Press. \end{itemize} \end{document} gstat/vignettes/figures/0000755000176200001440000000000014646417261015063 5ustar liggesusersgstat/vignettes/figures/vgmVsMetricDist.png0000644000176200001440000003672214646417261020675 0ustar liggesusersPNG  IHDRFX6PLTE.:Rf3R3s:f:\R\s\fff::3::::\R:f:s::::ff:f3f:f\fffffff3::ff.:s̐\fRfې寶̶ۀ.ې:۶fRfsېN5 pHYs&? IDATxkc8vXN2FMY)u8NetthޑQH$*qAВZEY(d}|I >˦oUVYK[5,|whuG;,Uk-+uٌ,|EyqjYx)(l3gua)CM9J]6! u/] )(EOmtc=C;J]>[wk]Qj.̬QuisQU]"詍fF=ץnS3([5xM-;\ k*gF\Ѩk5LD4 0s! ,&ոW(_|Hyǝ}ePjY%"Q>{GfHbL.hW5,wh`n@CuOjg/SkYvD4 СT3qg]ee.u58S5FYx(h 4 p8F@NQ'(h 4 OqMEȂj.qMEȂj.qMEȂj.qMEȂj.qMEȂj.qMEȂj.qMEȂj.qMEȂj.qMEȂj.qMEȂj.qMEȂj4@"8NJI q@PxBIW4 %A\(q@PxBIW4?⯽g򭪪?rai?y[?)o$g!ujʮ{ =zl{8&jg*hj'FF.7gٺK]W'uRҜH:tÜC{Մ$FfC7jH[bKj4ꑬ*ZZnX)ё뤤9t9ШGH5^i`^F#IIs"s?V}ojQ^wumMW!9]?ä^O>,>B} `CbqpvCSvѸ ӥq8hOwt7Bhc*XmB9bhT½om~k{i}LЩ"L֨&:(Yg&xbQ3|39v5qt+FquM7V֣t±pb AM,(hT½T673wg [| Wk0Nn^o>b2ʱFr×< OͯF7{h`]4n~Q 1.4N}h?4 ]U΅*po#. ]o]O_+MHfܜFChfAvp>6c%gFqMMkNGCu8ѡ_4Yt.TѨw6A7\r||'nҎqrsǫ㆘f}~g~{GZ0.Jb vBӭ;gcHC~&TѨ?Kukq6f)&'݊jHqi.џV3L\b vB⵿gt}gqE}wuhT]ŔnVdIG4::~Fj=КXը.PX?Uc HvѤFG9k2:b%F9i-vW37}otht|ht.~Йhht|F<pu"'G8ѹOohTJIM//cM5roT}%n7:Ǜ=?t>ۻ<ѾӮM3BSHvюZ3<7ڦ;_~F9i-?]ݛNjzdt6A`jߴFE4z9:=SLB&f S'#x|8NktaP+4*%͉kUFtSFѨ}=hq99Prr8Sf'uv1gF73Cf"zHw&'45тg4*ωޅDƟg_&vǯNnHup5*ȿ?:S.t3.&6`]4n]JS4*@͂?w\ =:)iN$a1}{ظ"'J4zuRҜH:t,2=w\=.&*Dpr4OM Q( >޿TI,@\h^/ wqѷ'_I,A\hza ·h]zjif)(kpNv\j$z( p%h4ơo/+( p@HzzEp.Ev=@SLJfZh(9P7-xԗMF(A8A"yf6=ńFA aĺ0}zga(G(Bwؐ;<-=ʄF jՌwL#F(A8! _zr 4 %A8CRmS%sf@PCjQ=}5~  ThzrBIT^E]囯Q4 %A8Mp^]ABIBu+M(&')o;4|4d>:' /DGCfy!f0<|{uT \($/B7]>b82p(CTk0:L7I2Y@7'FA ¡05:$]x($P,BǝEpuS\ޜ41}M?t=Q@A R6oý׋+z[C2Q Q3ǩͨ^T>;3A4ilL(C_kF,&JhSa}+x~Dx!B!׋sJݭr4 J+@ (Jj[nh˱rDžO)qK)IQpc;?7IO0r[_oz*Ii#tj,ujO8r" .BL?T0聤(8A3zPjS('xGfh\*>W%Q< .9c9ejt1kKr8ѦiԻGG蟵SW$h8dw@E߲dnGϫ4ףօ{Aaz 5ѣeofZ6H5A 4 =r:-X>&aH5^:MQr'?NKtA0qѩ4zk疆=.*uFz^uFFa3uZFhW<@uQQޥ5귍>(f^h>Fw2Ŕ h&QaکYmgSQ–iѷjXj,@ μo^7< hYj3gM/-7{B49Bi2ys_l=T0舵kyǃF? gs'Ɯu/MA]~vO?,fՙz) L@Xc}kkQO/u&- 嫇oz4DDH.7K[{46LSD$Sorl_fĺ (r\ճuzDOf4àYFa#20譽P.34ތFٚ$ (lbLSښ3WAlhvU)kϾ.gNރݬik4ibY3dԨz |062hmpbM^鿰՞- ܟ_̊ &ˠY!hcׯb85zotӥ(v#[#z< 0si.%rI~ pJom1yz'kp?;<)|>S/phoZ|35F^aF\ˑ ^͌Gzs>{&<&Lt-`YkjGD3Nc5zlֱrExun-bSLuN+8r=Qf;T>\dltfaP}msi q589E~1834_i5ؘfy4:BaЉ=zH~Y-rV  Ѧ4Oh"f?nhxzxxSL#֨ i>I8Іa׌ÓEq]gv2(^a4j. 릓v:a?R~^ѨRdَ%D͙P& 5.瓖蜥4ϙr(flrFeNe)g?c${JkU;.K;O9ԳF科nՃEG-g,&ǔY~1)Lkߨڧ.F?$7yQ͐hl*~ofrY^/h[iO&5InpF2֨۽ rK*xw(/[>[s&i,For,4轸I$ר5Өq +E1CAb'ѫuoi=wCnFO؈6:hH$륟odeQ3Ϧ ٓM#A)~CƢ. ȥɚ}劼`šR%0z^l`om`? ׃Fiim5 Uh.("Z[(}j/>Xi)֬T"]SL;Izq4Qk*cSÎr%?9j5J$O[!UN"㔏daA"$ Х7%iiV($8rz<ٚ>ƤnI鵪RBX[#FZ,AGj ֤y)h g_6|FvvID!DFL9ٯYXZF!'?Ť $QW?f_/Ʀ=DpJ-Aʼܜu5EU&~M\ޒgiI%)ڞwqjm7Ʀ=BL~];>Eڅ7+o4M&`k}޸Wj\U;{LU5O=NoPjq][ ojY5k7oӏBRHU,-R}c]"׫)iTB[R^/7w9VYdO"B@-IDATҨI)=PDQa>C6"Jݻ|Lǵx=,W۬67E}lVߪ>w3iTLXn1󪨚)YUUݛϗ&+FjwB"]m1<%Σ#> :vF)jTtm"0g8Ixo4MOȭ%kfialHBcv*JR^\LgJ}hfmKDV6񧷩dkHP6 eb$#Qdӏ~%~6o*&ʀ5j3'Tg]nd=zlk#v9m*\~nvu܀Y8U7\gL.E^-'Þh6)2;(ڿ2uel֨.&\@QQL?w;k5ܩ5*mOyv)m *Y3J{r[0!=^Կ^N;DP#݈A?V \ǂVf9ɤ7GXh{'t/7zrzja*b U qV9Xoڷr4݊-)ةU%F3qoMhL Y5Tͼzb bĭ0"mސ9 ۚ$ofW!xښD#nEǎ6cAK{C\u -w#Ǿ^7_ٶy }&Z(H"^fqn"{t7{iTjBEx㒂}G_{϶=y,(5%D }}LU{i ĭ4_oҨZR4e3U.||cZ4I12#) 1 wQ.-)w15lQ!joBm@S??4⿽G%IiǟL1y'ӐFu^*HPjIvh iuo//oE:gl|괌:&Piuڗxk̬{ϥ? ~\G]?׎1[t,3}#N0X5I 5s9v2Viuk3%-ùU|pjq*d0F?;v&=9R!+8ʱNÓ$iG+ub5øH}@/BV)95*W$`鋘9zrET8V7ߋ\ũ Q޵ǖZgVL5j-ܟ.K>hIR )lOPbƣjH:؃h[Iw4UX[{Btty#uUblKsU_UkdƓIFճg7$Lrf-RASW8\ ǫQt{R]$QHK4"Io׀͟3H@_[N$kMN`6h'FoU$8[j9F [ի;8>FjިHm.VK,WG^w^ӣFk)nքiIb*X~~_źEOSLSD5MprFΣ?4G:Vď\-]l"Em].ˇuޘ3W"T/wj3n&FNjz'ڀ[f4zGB=X:g̦4,RӨ-]н֮5Rj(U=lij"׍NN ߕ_)c#P=6@4F-tpOrĮӈ f Thj2FіFo朷e3O#+fXS|8,UHx[A3z4q4b1.GX+d &8Ƨkt J͕F m! .5T7ȺZ ehdHFJ_Jqf%?DNo<4\]j=͕I_Y+8h4\u>('8]Ѩ:*Bi,[6V'^?5͠HuFɸmGjh5ev'=]'ƪ4EmI9=ըK 8ީ,{ E2[ĬQ5ۗD?à(Uq jcw;ĮQ7;{^?$+uՋkbc㎈ѝ4S lWRTQl4'uSM+Qh6*-U.El G5@U4&q^ŧǨ˕-)( hl׌۠j|^iWP*ZBݗ)&Q4o4ڿ9#czPM3W=-w$}2#-aO=tME۩K$[D@.:Mɡw!4 vLҢ^ѯ{Rd6OulO$=DuSר|9Z=}$U&W@ط8/ vd'tWg5F2~{YM:@UT@ЧB8mᔱñwI$jcS OeM)J*8Hk4H,x,W}\1uű8Z#Fv@w3f^轠*5JFE4il=鉃q_>x[ݱ o/F},w*lS5qmo.Fizx<r+^רH:b?}!BRmB.W̛d޼#>*Ƥѩ1/+z꣠QCWN&0״{ek/h:jR_W,EMߑt-fjTN4 t, 'PӸ㋤l KYb(Nٽ4LirM3 ɆK[2%4y:/Y07}z}I6XW1閴F?(UvK]Js*?SkT+ ߷9S$VtRL`e鐿䦚 3 j{%SmJAbhkzx)RӬҾ2T4R,Th5) Ͷ4ћRS2ZR,=_h5+^ jRUJ)ȱʳUYǖ5J7XeRkH2\֨n=a[?ߴ8d!ԊTޠI>aekF7tU[?KuRT=)!ϕ6*ՐWU:m~>j}~7hT~}:MS)5#Ut>ihTTn)6CƇG:g߄AiZ6ՌVˉѹ37FΠ#IiZEYSjVʼn1lrb%=D]=~N]A'b_/JkčiJ%4arCu>m{pׇ]tRl"`ܤH4&wn.dT4u)Yf_ё2ң6icQUqx|F_:}5'ݰƚZ)~c4 wL^ȨFWD<juìIf:IL/i&DޏȧBkcHΨ5m^-px#y~n,է}qJm^My ~X IL#/ŋ-IS5: FdS7"tW~i42YaD=G>Չ_`h{n"/9+DsGȦ6k{7 zmy)TFQx[U.#TqJMʽSkՎOuGԪ|~oIdS5/e4 ~9]hlǥgE[-eȥ.qkvwYjlڻRE҈"/M6U>"hUu[8uk9#qiS([Dȥ*!5z[&a:~$DXG٢V@O65ivo>W13JɈ4bcE[E[ͤ_\jLj1⩤I><4#" (ir%ɠ \*LW5zU-oN>rFΊXr%zȡL*Jo/ʈ_>;<0<|r"YQJ!`Vnv>27~nzK\ү=&RTH2,ڊ"ZdS4ZtV D;Ds<,­`Vj/T#&ium?;FKѾR""\A4 q{@ <Qi+@O1M` <F6w+M` <jvo7 <~!hJQ( wyㇿjOuiV>.45uG;,Uk+q|<T){PO\>~MC$_հ%ђFj6÷bì|<ԥ(]-j (h 4 p8F@NQ'(h 4 p8F@NQ'(h 4 p8F@NQ'($ͭjzkAy($ QH[O͗u~|A4 IF!ff]]ߏF',8hsw'ɠQǵuh~Ⱥ7I5z~LžFp.hNb5jCk51S?1unAp>N_+ufZ7zѬ%5퓲bhO1 񟆇ǖ~Gf©_d=yx ٠QA=<^_JZƏʸ5mF(^L(xB`(QH4 qW,.&QH4 p8F@NQ'(h 4 p8F@NQ'(h 4 p8F2 IENDB`gstat/vignettes/figures/pred_daily_means_PM10.png0000644000176200001440000024167614646417261021645 0ustar liggesusersPNG  IHDRFZo_PLTE.:Rf3s:\f(.::::::::@@@@LR^dffffjv|3:.̐ \fRs呶̶'+2ۀ.ې:6:BFMQY]ehltx|tpldaRYUMIfF>:s2.'ې# H`Z9^ pHYs&? IDATxu(v\?⊹`$Ob rWV|oIěw?:8uNUWUW >Ғ`sG[l ho`-n[lŢb-Xbct-bQln[,-bE1[l(6Fb-[lŢb-Xbct-bQln[,-bE1[l(6Fb-[lŢb-Xbct-bQln[,-bE1[l(6Fb-[lŢb-Xbct-bQln[,->g?Okct-x%jvtct-x룿)K'WI6FbٟTrtct-xǟ+@tIbct-x;e.Jb9G[l;f|t1zE:bN&1͇ .F7F=bN&s[vre'[rrх?|6F;:#':gsrA_~v+4hY5;>AaL_[PےQ=7!ҽ=Q?/Oγ#>O蛝ɑ_c/OݓtMhaY7;>ADt#?H_r1 w*0ݻF~>DX|'N|pTP|1ic͎O;QWhӴ:;/`4oˉ)VN?xNt❆?fm&VZEd߈cv׬d緪Kł{t~wYW̎Oh*~{~AKs7ԓ(`qƁgǎeSN~p&x whgm&Gf7lmk*<;0dSM'|  zHowўىv1f'hcT_f{xN/`vv2[ݑ῾M'|  Okfv|6FQ4+(P|z;;=kCһwMǿcV͎OhSν1kv$6*G0ٙO?Pcrװ+~2MGicV͎Oh:boWs(|#:@vfMhx?ѵٙ]x7;ݓ#<&z |]8{v;Mز-;ؒ{[lŎ'>0])^x Pw#ewLr\|f$kvNl9qlÃm:SvNmN8>X,h#h=x o߾U[Uw_#:Be'dTI1>U"/w_#Vڱ|C1`?}n˯ɠZ`Tj[^~XQՂ,'c O'A׈Uv3Q1\Bo2Ԕ^~X!$A:WqNNF5au Q'yvQ.vk~_Yuh(NwZѳI;tx`*G5hϾ6:C(2=N*9qhQݱ?쬲cr4G~-( -Dqx[;ڦb(7F OoͮpssgFG3W,d}fcWqwQszǚeT[3LMgc4)Q(dt[3=E輣莒MΎS)dtGi{{XQ(dtGwUS(TtW )dtQՎ0t4c!;۱эt]l*St{(TP\ ;n\=Fy)at7KlөxwFҎ1 ^ 7A0j_/ऒi߫ wve+7Fۦ6TbKuO͎uꔜ.o:,L"mßڍ_3 >S+eǴYFtvVޱwjA[gv[ſbv2$+UpM'(QN/cexqwv xUr Sم5忼nv*Eww7f~j1}z*zkCvVޱ jKO/i:q"OfX2)&fXv2*:40nF5`Tw0 Yy^Q3,jݦ:x{UZѕs5uފ˜cT#~v;;]o(%gD? 볳5SŨtN5 h:f 0VOs}]؎Ɛ3h0f"ͶM4_[qKҊXQ?4,Z(){uN ` سiK03WBFO|<z;:[(ETݞ{BWG)GXPnFnϸ"5/UϤ] $h~קױ}Agg4ƔrE硸UQקۦӬUp\x!+:Oz|\NLvQvuh<p6|Q3Z5N ^ <@(;}dg>=Adgjt"1?C9avj4-Xo“Ĩ٦Sƭyicjlf/}sq9fd.3Sa%`̖6] 囻{vk2:qwo泣zqٱMgg}Fy¦όLS>{m:nҌdCe1SI^ӱѱ5;qֶ= W=Yx>mJ g}O.{hp,0_>O.zu3,=`e\q+͕ 7y2Tx>tɱ?Y5{k:Ž.]*ņgڱpvɟ\"F۲1GPDEF}Q-ݔ0!ԗne?&kEAPq,Kώf2:[cb^SNOhJMu<;,z*QKvBFhujci;h"(K%N)~Urs8)MѽBaߧi<j>0 Xv|}PIu7)~Uۉ􌼵=qs@e2Z'1jesI7F#2QUZD#FOJvB8j ,I*aMըhI3FVzsL9e)z3C[-;(Wjl3󊞜)j;Xڌgl鎵1яw(0J9X*F!;h'&5{gT?P(٩n:}n^TnTg8|F S¨Sv+n)a 3gJRhFXln7B_Ps#K/_NRv`iذVn3Y:m(# n~&2iםكrXl9I,%F ίl[=OHt$XXy!rz}SfSrO)uù1EGF+pEZGc88T2:$foqEm`7:AfT6;(bF=GkCatH0߱4ZG1;Wn-9FFFx"V,C)'\_xK農3W%o^?i"r{٩3:0۱xT2 6;ϰ1Zj2c+dwEJTS쨱QV;9ER/HT#/d4c50Jo:pkzMu<3 /YD޹/eT 3;tnfFMsYySF;FvDP}e}C6*hҠ_vlٱC#dƀxLbΨjJT.9foGAGbnh.9IAA5P\*M۱,%Rv;G|`R96 V6љ2aQ+ڎ^7F+SPou F?0-7{C7Fʔd'Fq-9@%,-9cQxzQU>;hwNy3| v#Ĩ8\J1Z(0ԁjz8dF Rv|CFQM'dTe!2*f'`T^F!ZA[5JlmAq—gCяECRrtn]gŋ0AFeY_eT0Z9SzL8d!+F%FOҧcTβ˫YFRFac4n}zɤF C0V9ZN.<@mr@Q!fT%2Kd.Vd^W(::D^wꏡ0h+ Ӆs7C`Taޔ=y ~=0Auޞ)K ^fG}AʎkY3Bm{psg U#^QxX";j7CP@k폩eGO@cien/D#۱qw3N}~9Žf~sBGy(" >XÇpUU1:1͎w2;gtr4fTFSx]LaY#'LQA϶ҒFkv,I3:h`s`wQVJ0jQU Nf1`|g=gLR IDATSČ~쾲Q99ffY~eQEcT?I=FMV᎕g FA%o&MgUUSb>uM60J<Ǩ)H¡2j3J1"ljj5 j4N'K.9QsNa3s/Gf:᎕etcsL/3 :wQf@-ŷ÷/]]87%۱O1J.d4 eþ7o]|oHڢ/ ʧ ?XEPzP}?LUꨞpΙnJ<2(xsOҙIN4hh{fFCw0K'sbKgZ<rg)AyvsٹJerRF<*JSb;t$;f|j\Q`B!uV%F'EwhUv3C40BJ3JQc2:7bRѨSߍQ F=f y3>& )FQ ][bFWd9j2e>[F?|[ȨzVϖQ,;Ah =֌~nHalj^O!L՗X¹ѧO;0+3芌SjT`t)F-xZјd0F}21zY/^1TQ1$WbT%R(Q3M\e5Q/;Poh2U©" mW%'ڱNSF;yFO 8F/(量IFM5jT)fT-]gx\`4ܹ}mQS Ε1Aed0jgTh-A0Fͺ"FUAj([ҟQ8  ?PҎUƨڱ.=gT%\v1,%'j Os P_P Q;KL3ʹxx}nP Av"9ޚJ 4-ώ˫R!.xBD7.QAf d*;hG {CC\4 sh^~0AcFb1GNeߚ^/n@՟S+h]2`TeQ)`#gv̨C_ԌL1:iFo⩳SF?( m-dt uHg mZP(c3 ;fY:uF.`cTN,ZPz#QuApzE'Fu\ƊƌavҘڐQXQ;h'!gT+҄#بUt=Fݫ79^cqꅱըKϨ"vH\w`OAFKQjX4b4uhFCS(F]#55(xը4`ԝdFݺOkdt3Ꚏf#Gqѕ^X.;hi5jޡQ O5xflv6F5Ķ5:F+0 5cmGjFǢO8X(к | mhKvf=-c i8ROFAjb}jt,c1j劮ĨΎ˹CEKq;]hG!:;"-rA>ݸ( jgG-F~#9{,M%.,!FwZ1vmm|C4%F5q )F z=KQ*Bq1z&QS5mQ=U_ Wڢ]~MFӊٱqQ0{Q+'^ȹ*F2 C1{èN=H"nQu21 E$kQ DFu 2٩g4!BFذ8iQ[?jvRFZ 5ӧU 2 H%(Ey)6 C 7kQx.C]f{*QӛciMv܃m6'N2⟇V%A ]b4M=RP^x҆h$Ȩ@g.ޱRR,dԑqcq b/{9u ;kީF:QӟGGM0(9'i SMv>|gy2 So 3=ƠbԒYFtQQQ<T1>eTס.- Ϩ3kkiBbjֈQԦJR2q#0jUTgg_B)gf0(UknjIHЧ'Vnʎ/ g43룣?w'sOnNM5qQQtTdtj7X3Z7SO5XN}z?QrFc7'kFmuipFy (91 եRR3J甝Qx X>3 告?{w{ͨVQ78xO03(F zl0*W;nTrPp4QVah %ݒ:T3zrW5ݳl5J{Icա;=_ s+ *p\VP7:󍒡>)s\pQhÁ&;Y73)k9?8GqRb\]1o\3޽ށ]hJ_MSkŨ^n#0WP(>'ַow؏ﶽd-d6_. ~+ɓizੋӂ1ǟcM_rtg>Qęm`e|=FaёQUZF0ژ1zN ($zd -br6=2 '1j7zcɓ0B7q;du(h(-tGfMF:QU;])m1=1 f<ͨ9* K c#7F/"F_IFɓ1l҆]~,d9;2 ""fmR(&5fS.`T9'dT%G1]C ̋QS>aT0V^< -,c_dGDeFU5 O1?Ǒ [;OӝbʪQcTA*bT5  %Nc`i+PvVet,fԇ笃T0.%geFQ,;3 e>/bTRvvhJG?cK%k7E zrʌ-'A2+I?eRo,*j4fTO1y Y:62u?]Pg4Ng-=qvZt #hheE*} T7p-ǎ.:AqrF|ic_c퉄ޙu#r~>=)>0 t4ɨ@Zqz+z5Fsف1^B_PJ{<)Bsats3|*~=fQQ Q*0,F1;@rd'"F>|ictb[G11zӓQ  lJBtk9?hT1 N˥<~]6F{2J٩cT٦ ]8Qp{bM12*m%=A Xх٩aԻI?FqXTuz**0ꆍ#z0:teuR&ŒͺPǨwy>lJ,a?WctYv%>;UAgg gtYv=@z3F(egtQr%>;1&2e%gt43-QACߕQ:ib5,;NveBFjtYv*UKЯSNJQ4piRT}!ElyP7%o\h&OUr4uT:v X/"6 R9$ "9哥gӪk|,7@Uj AҋemQ}&3S5bU#MZ=%F];d^~j-|J׈w~䊖߿a{1J*HSGFˇ bF61Jax=-oF_.FBFd(Fg}ۑ*;dW~=/j4Vѧ!M0-0޲xÃ͓t:>wA/o/fGFSvn9[\P%Yf=%Tu> zt?A|(i0*I|JmSvNFTM=ɵƦlL\3#)F f0 oèTד}ч,%ٹEJ2ZնgRB1HrF[ڊ& / A$(g03|btԛmW ]^PRT x:047E[kOlhPtJs&D7uM0*qT cR?rL*ɶێFJfa0 ]at-cU%`TgS̃b9ZhxGf3bgQFKgtbR)g45TXtvϨARFbDvU5ڋQ0EJh;gheӹh/FS]QcTTQW7KvfvPV6}1 uF2*g!05hgTkt((,tje",b͎ -[Sg:0!X:66Zʌ08t.cȷΔQICd( L=a3]1juϑbOZj<'2+ƅ(gQe4KVvfT?EFQ(ufx"e<<8}6x5>MчөgQDQ [01 (%`ԉ ppUFt]D2gcQׇRnj4`Nk8F?bty5gYFӝ^.f)>^0Q=[ߣ =ctUs ^Nr' Qb*v1SHfR1x͡:%)YQhM,,~3FZ sfDc&;KGD-`1*ՠ.hSU;3MgQHj'T 2ؼMըn|C*;G|QF ڕBFF'HCF^o5%1 #F'HCF~a]yI/+oXFbFsM\ѯ eSH!SeGر-eR|F1$҅3<(x@Al*>Ѫb4ӧ.GJNѸl&nمs2/kt^^ v~׌ˎa=1 >iHOVR=_kFy9+F Fm 6 :2KqtQխOB_ñc~cQP(,F$Ք(8F}S 2Gaa5 nhQ?56Jc4ݩfPX@S[:gb9Ϩ6J(& ctԬ\yF N=:*qy%O+J-6٩/d4a(N1jÞa'sR] TQ)զj2\ ^KCFLZ ?5}v޺e3Mv$*sZM9aI:hR#NWKth(֬od1Jw,? Wf Qd ~+ٳOvNMG*xқY=P\ǂZF=G0,Fx{O>F HM 3 dThJO2>Ǩ:Ύ\pu3z;FcEj!iF!(5QE`|Ѯ&G*O?r_Qj{ 3E/!W0 қPy3F!˨{ Qt~T;ܡ9F!Ǩm:)]~VFEGNz^g꟧}gf'bT(2 ȖjG3J+a'FCn\G=^}Q$ѫEpghԳ0Uu!`F? O3~Q<(ͬ{1*9Z_Ɓf9FDZQef:/dGSQUm|P7fDy(2zsN23o4ޟˌhgTp~l49FDy 1*9*N+71Oҗ :;Cd$d6M(\_;J1O2z_dNqhizo:p&Vf@:)F,BKx)Ȏ &$vI{69t((k:B 2O0cť$0'@?0* IDATR9+n5gC9:5M/zFw(o:^%ٜ憎թ/e49S_oh>;!` !~JFFϋ}ىQg69c# !WjAyj⫀+7 ړQV2O0xe]nh1'gL0gƨk:ը0ഀ+ P~" s}3g zK?v0 >. 劶2 +x3fQoѨ$OcjT8J1*գL70&F7F+SfUu}9KnTH~SO=WJgEgA1?6*d4I(̎$q[lf,"XaFnߔ-AIв|xCBF <1z9(?Qu|"Fn~(`4ߡQaAN}ܧmX`D>Ǩv.gvͨĨ&C9/V` 'eӭ3:=Djƴv`});FF+ SL)FM24 ~S:=h30tWj`^<˞,F`Wmp-U͎էX. M1ZjU RW-gKPG,EcL KұQ_XQFPqhc L|`'eP R6)txF' KN]0EE%_c u3%L"eFaޮhX&%3F{3 3*U9D}1{clo`pg)X0u140:3:^1P[癊cTTS%C1)ըN /0:3*")jxD4dѐQoDQ}jtƨ__IՌ{LR*BAwDb&' u-EGMWiQ2Fmr.ā Xu*G!OX͎ͨEjH@iQc}uM5H_rH;1Z<6'3^3*t EBcI39#^Wߚcj5C8+0Z<6ԍQ Sv21wk'@([" zH\Pڧ]'RE {OԩOqDOzu*U^!~ <:Y:R*ZM]fQwSlv=/5hjbFT ʟ=#=-5 v }ģR4$&S(څтg{c3ЗQb|3*Lg.2 d(8JӌRvQPQoGARr8ӗQbQ_'ṥcB]lQ7-؅Q5(dsQ 9Fjف2Q^h\V}2+F3*gQt5ЗQa}'K;1P(E 8`P ET%^, -e4t2d,fN}Li=p/U;3af; 1%oy$o)H}KOŘ]3 ݵ;ϔbt6~DʎY#F4Ũ ujN@~oP*[Z:ţtL2%l)8Y(e/r* ONV BBMc\f F/0t+c//-VUu'{j]s͛ΌYRF7Pͨ3TWOԗQ<%QΨY֗QZ_hG2ጂe<-FjFa¨0:xM _fT/+5yi3jy0:,%KvdtZF<(L[ ՇcTףE)G/XT3jzbN܅сh_fT}J3o'K0vg4ge59FotQnH;,3TwFM=7F/ƳŽh4ϴj3j*,0NhFi~c 6F_,,PP{b:ZŨ gn)Ξީgh9ф+v(tUocH7@JQL)j?yFU-#-u<Ծ]| Z׌PzDg< NyZTbASNs!\Wu^òt>LO),F աmxC V@ok9V )'"¨Qc*tҀ/ 2(^so(u-{7=FXQZQhg4"DэѮR=lFȀeƨԅ(H7F v[їh{5v%Fp=2=Fjt~1dcg5z?FתF1FF0Z0Iݪѣ@sΎITYMOR$(=B38vX5K|\1(/HY*1R?Tk5o };_~ XJmg{EO%3F6!m -7\VUh!Sy=F=zD>>b 0IFR9]Q}L569jt)`\sЌјQ|Ж0g..}:XF(mvUkKuJA32_>F1V hE_Y3ЇQJͧWfԊ̓ F ;0!0Q( nQ(e@! Ռ2 ՄՌ½f[\(RF`T5g?3 Qo1U'8PF_/ftBm^e2ʎAM /q 2OMRhpjsj yA  QڄmKKp]00c (%FV:r^B @f2o^qk;Qh@dt$O&E~WYi WN %Hp(:(RfQL>("bFA`TW2ވ&-cT6x9F]-)Fph9BDX≛ӌFըfјљj1[ږzpT`ԎjH)UF3k jyw%%EҌTW#3|`&}®uMF9.\ҙQ%)V`u1^`TFFu5 2 b,h\`_NhѮz}t?3*j*yXQfю(vA{!F0(]d^5H}0 u}ʳQ(cԛ/`4{qBhsV0TƫKtSZ)b \]U%W .eFeG{0:uQx;(-bB!PЩ1uQtL^5`Tj^`Q0&hFVfdG1u mFըB42S2ʗ>a\1x%uRzygv@h}IMpcb›m}V׷FF/=Q`X:x3+ j;uޚ&]u/#9: O0!N=5QŨdCIfvRiD>$rw08jPfeuEQQ\S5( X/W1)Kq=;]ٽ60׈~1!0z1(nWɨw`EobeYWiFo e3Ima4tTbNߓP'Ql $F@3I`1z%'` X>̔eh 6eC2OЕWQ(gԵR{<UgBc>GR) j^#ktѨLW'ѩ[ Q9+Ӆ*gyQӱ:NnRΙ>Ҍ*D9Q! zXE~>3N5J To[)XEO+6:2:yF!=Lhxj)+]g]v1;zk&b׍ (.uQw}zFgLBF);vIF!V4dT ztd4z(K(A0)0N\LޞA'Ϥv #$QAq<IA1M4 f9tqɹ6uQOx޺|<|N1.NPhӧ./S;7,um6iXX'w -TG0QxEе||3==-b=O:3:=dxY_/aԽ4VQx7%ȨSXE}PzU_Պ>ө.at}è06څQՓä".Ҍ>}X5==61H6x8Yhtp+$vU3 9E[(:A3cT#:ѩd%ъ5yQ)9zP}0t44[N=R~1z8hĨVt'+M.U ѤKdF/Ռ^M?hVvFM^b4temQ3SߵmRtQwF Rt I1GF2p)&Q=\YiF[5?U^kN=j0(`hFѷfu'ٞIN=2G`t((שS1:3BHQkDi:bBH\,-|ш/x)$G734,1*Sn)h~l4XπKPRuRDly"f~~2Fŧm.ZzFsߨn6N Q+8t(8O`TPaui Ռh ZՌo1ZW1Z,c5jFS z2:]ƨ)0s~ShrFm1:5H bԿ0*((F!ϨU6io~#(~ [~Ōf<>fXdfEJ_ CѹgX K=5o3/(a=FbbFFݸk :J2]8f4qW RF;iDӇrFy> ث/F{2FQuT t}ѦjPcUB9j ~R;(˫ўr7FgW bS)RIlHs[FĨREAN綾-;\>S cԫG9{ON}OHJ":Iz{ ftz􂧓DΊ]7 ∸)Fm7ʊ<%hp4YAozcd%F,ZBF/QW1JF.d-` eݻ$uPh~Y(5 h5F}h)3 hƒeըT60jC1:3:QN6F FҌȌ51^Q(%gQySQQUbvaT);3*eg.3 vF홧Ĩ%gЊNb4A)OΨsF}OlM aO* *<4w fC,9=)b5qFn-.;_8LXǍ#SENcT5 Gh&3jIF?(DA3 K*3&;ӾҲ RN\s9٥yIBR*sexRy^b_fM;@@6XEhx4(^NI(M e؅_f(1z^Ũ% FUFJ(0dg%FF@}bEi FmvQ,fԙ)3B>-({9(%g%F ŲN}L.}({r<3Uh~:;ƨaTKQs:dtF:2 ڋ63 0sT=`ѝ1 %( w_ 2JkI+;&F5D!8Y(mZ3ᗌQha3*?(?/IQL4]h^}-̨FΌSƨՔIGs~ Z(Q ZQou[oFTuji~-Bv:1:QTS2ʒӗцZ+&/pke ZZL+!a&@??oq ;fOt>"2Cvy,-CJ5rȎLpa,K#(` +[TcւxػõXqo71jĿ`hN̨BF`*FnetRBJQ^0*Vt)iCic4E;R!F(f.Mc;A[hv[5KjQ"ڟweS_ʎylY(}1:#jKDvQܐ=?Mv1FSߊbv p?[~H6ydEJoU cώACi58P[*0*;yKU cIvJ!k3K)7e4HLp_<6*f4ZB+$QS1FU?8T`4zn O"nVE;0:T1j ZXQT#/k?T1juqjuYUWF/ ctbrD0\Pi1kώ1 ¦w|1:40JhQڍS(+EfʾC=z0 =hUWcTrтr4;uj@j4(?̨Q~Hc^` t~ j4 QTrFurQtj4h`F?|,(]AW &Q:ZʨٱxU7Fhs3sZcgJ/,ԟvfUdP(⺀ьMzP+3JM-F(W7"F ?.gCv,}`[@|jTHRA.,'>Ǧp_5M2Js^0IQh CO10>1?oT/gpTF_,`dNQuj+GjT=bb&;xkQe.FUHm(`f4_ҩ6FU"F3SSK"K:(RFWh3è0Q<3/at)cvǚcEF-ԇh0?q=њxN7](k9F2F˪ѪdS`r53:2^[Q{Mf;p.1z(eT(F\QLw3qk: 0*_Dd4F$u uQEtH2;Ϲ%3.Z/%0z׉^$9 ϏHǂ3W[:;.ӣi%$ 755&wF$_PdE5{Kp?=vNnjnɎ>0:36/2: ~W2j_)dt`zu١B3:=dUFdؤRzzɭMaHؕ_uQhhKrD8EǧvdzJ7tQ0*d&yFA5-b>;iFO [Y(Yëjцf4ٍg=zXQq5T!1Z K1߁Q3^-b:;N/02 p2J_}:Gʼn$Ψї0ڐjX3jFQrUZGѦ윀h4$RT5JDgjTWmzߚa_ dtB4fZ-fg)>jԑ9 yFql4dFyrfg'vFAg}JqigPʌj{9FUBFw3q2 c3U1 5}_39SVŨTl؍ܴ%FSu@ =f.Qdӏؤ,F頥9FW(0jj\嗮_e'&R¦ѷĨNhjtnb+pEeԈå#uꃓe.?iȨqT=k:1}_pl4(N}NH1 O}F/Kry.k05Qcu1zQ¨8q5vSK/M1Mڱ 4DaSo#(QhQLn:f\T`l4(e'өQ=p0/V藴cR4PRt(fK}4F H=^- g|FyaiQU:;܅+Ǖ(;؎u~tk :}J8ufgW?cCu8 jUUDsEԏjTfa$]b@w{ G&KuT/9"`kf)h`qSqjJWQ=9x}_ݗ|5fF!ї>]âz5NKeӝ{hېM:;{f!^@93E=F1 cku&F~Igl01 ;mQzan XF!\3;on0:DLt1VFDQ L|F(5>FPvDTTѦj u I1;軀Q=9I(DM zpWpQ]RjU3_͊L0meT|_س b_U_wrܾ'1c+ZV>-F'GF_:Fժ+։ƒkbtyn);8/hH=Qb1jFAsF);PP! }&;.A!~[$vl;QAjkҮMw,]1D }ʨT~5+Y^cԭj{(^Aep-&ict;#K/ `4FQ+3Pv0z/؛QcASLB5~(fg9F=ըeTذ ˟Cd®o5X* o P5Q3:b{!B8f{eM{X8>^R-¨f+@<#V`.N!&;ԤZUGF0j^-w>94]ώ nFUi`MQ:TG6&3>ZRzFg*et}g'tgQK3gc)gQ֩/fT}<`-Qw$ѮYĨVQZFºN=/SԎB2z7}`To `ìI i8^qO΢Wɠu0:nml?G0OϛӮíF݁53(FQK/;Y&"|])×쀵!)TQ\v*|cj#E{/TU辻vܼ(`w,CgYFa48n)#b SZ,sg5+Y09; 풵<2=ѱBFF (8*>(h˿hF?c)mag,`5ؽTcѮigwbʫљxibgr0kF505;FgP(jFifE G zYQ)f;]~1J51A5}JEQU+99ם,7qs/ *1_ɼ\%0ʿmx(Y4d?>v0(w#t}3I 13_ $"=y LN=N3}jFk{}cÎNGMvQ7T(عSXׇ(a.q]ݏQ? <ĥYUGth:fTW7FQ=c$>Q<-ǎYGct8uM3GF7FgfF1(Û١Q`Gv5K[rWs͌b(=^0: /<F!b;6voO*U~wW+#t6}uM1*YJo^ #1`e4N} 1$=P.MDECAb h1eYA_$#Gy`$=.ۤ5]j뽋y.DOiՎ =42ڥXQ=^jGF{Ԡ-Fћ}U(sMgmF!\Tp:=Ĩ.G(?bFa70g!t|{ 4FcFU8hԣ:hCF,xzl4ft_hݾ/ "d3m &ol<;aQQ`ITF`T>'H<.s4tcwZt_oYNGyvrn?ϥ(:A߫fS|3L_x78Z&)A:۠c10S=NAAO.rtݾv/enet.cT;*1 ;;`_v@gg(aFGc-enhw 3:2=]|Uo䀌P(%ѡQ039ѡ甝`kv=bTm樓&ѷN}sxITŌ&:B;gӉz\v3FMg1jeW icwvN}` b183av2z#wzT82:.fdFYBFݑMk1=9vcA 4mA׌rt<oR})FyF.ѵ3** 5)-`U+",o0*g3+gb_61;慣b'wg22'= ykr\.MجgNʎ3W<X0 7~žIx>+IR>LA{WFմp=0KқGT&N_Ρ?Eoɦ7A~qN0Owtg'0* 0 z,ƌ>16幤9ʡfQqNr>Π++.Q*!QOvsT5SwQV;2 3 ñsz2:ui7e17ڶٌ"QwhWFОvs;Do(Y (.dt:3'}z/WQQ0B:-9+k4߸0e3e~VQ0q.2F6@>ӌ0V×:ք'=kgӾM0>:>Q9d j1;`ؤըY(*IIFX(:ghųނn0_2FA0 aFScNc]_('sFF08Ȅvbtbv(ae(뵕}` 1HXFU_X2FkQ9wTaڜѥQmVL9勝qFvx\ Se((w'>:V/StNΘfp;u+e 6><)3VQbNLU8 OfrK} [av? |TPL~IXFCP]-,"X2e_'eG~&("R#Wb cMPg37рQ=n*,Z1*=ٝ(s23Qt4(xo9(/l95sTb~Fur&2 (`aT+&THQ20n]}.֘2J~ְa3:FQ1CYFǘf-Q|b|inX´j73z3[()L~} AF!Q/՟Wg0ʣ[b 匪TtW7Q3Z?ZMq5#HGQRyY(!G6N4_NўǰQ+AږڡN敥ՌTgg-ӍzS?I}-&@-2ʆe٤7? wJл>d+k*l[NʶD]^3N >pX|FQtdGu Wc9(h3FEa'2;S-F`&4}]чQpA 1 MtQ5UcFEbjԳf4Qk;L߄섫QO3 ,cfQ<ؔ(f=Q0QgMeTNUNa|F4VޏE\F(liFcDQY~Y(hkFՍRF2J]5ŃMYb5Fߖ2Z-h`Sv>Q=Ek-liFchFlFN9>fGp6;*RFT2Jܚj[a}fti],ⱠŅ0:6pʂG@qh!ۓ~jq+N3_O&BQig(MgL1SC3Z,=Y+uuGzwq'2&$LqE0)kOc*tBvvш!FG0Z訙 :Fч0Z(3$Qe<^l1J8q< 0l'-BGwx1 aF06}cѯ}8Ek;Fݷ]u:р`Mx6gcvoNnרy"ȨRc{iӨun DME3Zݨ{U}4l\QgSeљђd1j7Fgv׉0qDUj F'(ZhmvvQ ẂvZW0C=wVtǨHz^%}?p:C'XbT<@G68R OeҖLY7`םQQ߇g1 h}v tFa6F=#gg^FiSeą7lGͩ(!ZM|ӰPlf'(bZF(vvI&'Ex f*;;# 6}L0v e#)9o1Pf isF G3d9 'j3 }3GgbȎR6e'Sh95N2jh_a8Àlyw08 As`iP8ؖ>0O볣?w7WJ;(E[CGau=,"MFM9KdT-O$$4is>)]? ep}=!90:b4:SAXd]\ď]֟ь>Ȩ\*2˨tt&FMv f 5,@hz)݆([^Oc3bXhzi5;`OetF} FeF3f>dwQ߂Q;;Fd*37FeT1ѭFЌZbOFqסٙh*;ͨJ$Fj4̴PCݝ1: o cM#8FZա`a%5dd0; :طx5BvwRgӧ XHqv(7__Ug3mef#eF3J{2/bfKV6e4:ԁQިSKSFkte7K1[2(oup~[F+,2ї R(4c42{R>u `OLFh]eMѬ=+Й^ vXkAVu2 AdTq*0KuHꈷ:irvx[$AovQj$тzIJ 6MΎ̻8d PqBk?u}X7}l^fA`&F"F(FɌ"}'3:4et|Ծ}vqFa2HiFeB-#=9~o3!~.0 הQttvFS0*:{a߄Q3J\ľ3G7QX ;(qnhF.le5J 7i/d'RVf0N0J4QF0uFwQꤦ6A:?/8?-G7Qas@4S@g@qkP3_Oy5ͨ=RnFD_希ɒ:Ѷh4;Ռ~_! EiElОQb0zF;d^sFa]vNsFaMh9.Fg1U:T~F_N5!; ,h$9[[z/Q??ؔ_ݸjC=dg`tMhbשd3N0+S}@xb:w$?T:"4Yxg';:]Fzj';E6<J[=Cg1?cLJ1y1ƍ̕ F  ϒU͌HV1?ծ0*GZ 5bv! ;̨h&dN~]̳f3Y_mH=@'Fa1FgU ;Q.9Ѥ[}[m}huӶǂ:2QO&h)è?Ԡo8XcPt*]TK<`/zdPNeʎ zT|~I9\߶Qn 4Vw?iTҖJ*ZK>; 񙫲eC WKi zfMՅٶY-.5iXv3&ʌQfrIqʃ-*;1 ЃQOKz؊fTvjʨX3WՏ6>F0 R.30ۭ7j`׶w*A32`T.Ư,;}Վը3J9ڗ+}v:m+IKhvQ:*l=CxwGK (D_v$/UXQ*Eg 5\obaTiOy0C|JĄ@t3$h nYjZ Qr`/14;u12;;hz6FY]#ƓqG¨Ѽg3v5اe37귌ѥ̌X{(;a'F%G븡pPx<С,{rZى|XLRQb{{ױͺYhQ)ڙgfMv;'2vh:956}+F}4gt 7q~a4;h(ڻ3'; -d| 2×}ӼQ?{5M`4<ԋю0Z)x֝BW,x=GGfD QFQ(eh6`4̎uXg0F Fc'6btv2ʫQP9څA0ZDUF:(_H10EovMve FC:09;2ޗѮ)R4mNd~SFNތѻs1Zfo 0EVMv(E2j;ڑN ^btde53zF|;;=ђ.l1uB] [,ƞ p Ξz?dn /eup pX0 Ia=\-Lf=34tQyB(2}A1ф%3%pyRl٩blG+Nl&jǮδ0H˕/Mv}d0z5ZQndhu5=;Jb}iry=MTSwdrk1 Cahyvhŝщ9<;(\bu10.fgaЍQޣw{'ϼhɌP8eg*.XX.8?vK߼pWYJࡆxË븤^l{FG! z0|;;` Z¨ Q-!JtQp|)Z>zAFS1҅-2 hFhQ(l/s!umBOFMb?2FKI+`4hFo.o#n9ښ݇[N?Fӵ4F>RߑQцf-7)9= 95; s/gg.[w<9[g,NYw6joQ(u?<;xr6.CXJ(OPkiiwF/~z/ȴfrW-u6F윽w F3:y0v3;;mg4=´01jҷ{c37;=hߥI)1z-,Ռ E ^u;-NyՌOatҁh [[;.Ia) d0m#z4Nmsy&]ް[dF^N17d_9fԹHY{Ja^EZNhRͨ=vd0dK}&#u FR(3YmǨwGQQrڨFU3yOFhA5dQbTF_caty%s5]QߖQs'=wg>;(SW~.F] 1ӨohG)̮F:k7bvFoT IDAT(*:2R~ǂTԼ(p#FjZ= "92r+10FegюF2t)=?wђ׻׌ªg(u*JsF{BhYL(d4\eWr]Y3:a?FάAzuFf|PؽKlASv1;4B+,R`Աde{l+.ate^,Qny gtty5o:(;$g̎q*Gz/, [}dN?$誎Q(^?bGvƍ;x/V3 bFG1 !Fe+$\Zъ!ؾi|;uQZVA  }OΎV Wv$ښ k;[ٱoozW xsc-7}; 7̤yoe ?t&蕝F1_ʾc ykwAgħä~-KIc ;&١~rod Fh5l;ۘn51&F6!gl]KY 6١~roe/2kAqk){;[qozX&A $ ]Q(ooC:J-E49l-KN87$ha_7"0MKߨO'v&GMί'F%sv[?f0J/eS!umOC1ѳ۶fٱ eGom&P[ٱo5'h*ا|b2TDm}~}c ٱ~mmrXٮ̐V1 Zc̾oy30޼v14;O׿ mgrNX[#Uə#;֭K5Z(c|0vΚ| MAmEmv[# nӢ: co%gط}LFp&EVPE .M6Ύw82LԷL=#%gط j>CXZKL7z^r k=P62:;Oo?gmrܭ7nۚ̒Vl^LcUgP'"NQq4?uv&mI,n%;X%9XݧX%;X}%;X%9XݧX%;Xct%Xb0 F< 01wŷ$zѴo"Old 9Q8yz-Tm#`tM`u';u΁,)T No6AE{`U:G©LFyr֝%|(wv`V[s`-Zs0e1Z?]X >o(bp_[fg(ڽUO$'/V5&2mӁ0j1EMmyڎ;;`(+Ffop숽➊@-zvN]/Vw1M9Fp?S~N(QF032; S䬯(bښka4,qD_n{V  ylFv06rv&f<&:axFONNPka0DT>`Œ`tzGX ~&V?Ƞem_XP yO}֞=Y mBe?(ԇ{V1]5|p"3NV6ktd{X'AFrm 3QjF&eZݞ>"%_D%iANQh4&lFg'RVt=Q0v\FM+QQX7dT*~_t`0* }cTVG&=F`4=I_NUcA4eϨ1dPX$5p 9b9*JIʳ[Z47;بFuOu+%Qq`6=g>; ~Ȇj=>JY->+pTkT2.<4-R3:1zq]QW`( rYTwu?;Y1MQ# O#2On*{7gMǖ;+ߩgnFH0jZ/E􊚛C\gwj)w5FKjTW:pf=9[VhFl#x/Et?J&l3i1V ֊LF7ǝr&Zbړ~Kr(ݤoΡ(mRv S"͜Ѭ=#=R15R2*9btN2R2jԥ1F/|I6N2ZgEku Fn7y`QQb>"땴atwQBRwD yxk܀wΓy%S((y9χy mi lL>E\ud+ZQF_lj݉e$s^I3FٸҎ2CaFg0j=!ݲshӺA&=v~ɉhgF=E FX]}_H=vn҇YBF5 :tv2=Bq쌌>xPh-Eg߁uro(QF;v711SV^Ќь0ʯ,O9̬)Q:skdIϨV}`UVyx.ӖM4>+2]͓[v(}jTwfئohFr2w׏L~IlhctUɨ8դHSp7,OxuhFW^}ae_ś1u-;d!Nh6]{f'yVS~]EvAIl"󦈁q,]E'o񓸨Y`~rncrS/E()D.RRnՄQ eeT:}:-;m $LOQtY1Qh ;WBV0z{}NFC֩>U>~.δ!nFc (f jHϾ8C'h ;~$ӹo4hXы <=?뭵:FhJbTg귋0  ;VA:yLԞQV1XMg4/;] 6o45ъka4|5zFad,b+1U2 AE0z$ud+GŌgtaF>Z1z:x}dշRdT_,`4>+ejϿy#EW^͘~wN©c6z>+(.lm(t`bN$'Qq`5cSQ/w1p>C5O.7;5RC=sg%+1etctxV3FՁ3:T3ZQ"zLp7 1t,%1T\LA=KUڊѣf,魑FQ4*4;3'AsR'dRLI<;d{^Y%B,SQzFZOՌ&7bT ԯ7;b9j0:F;F3'8jQA_ɨbZ'30Z,!z r3Od=TRow G9=:;١^JF}FUr*eOor`q ˏV3:g{F%w]xn_pFPVRNeϳuvDfv8Vv$~a)JgF{f;;=xL'LT-F #wN_J_u$5tre(uQaŨ( ({ITv\FYh-D7Qizrq1*F?b 1zs06= u\FYh-O񗖅gЈDvQV.! ftZ>F4рSeF:R>ѓ ftiԛ`(z1cN09[$)]gEd' 6gfN+ʨcF1hFu{2FOE A)F3e6އTvvQaL3 S۹^FGyEvFEO1G(WbJ2NCF$1 6bI iF0 )ȨW#kF]'7j0 rjtѬ]gGd0'<d{~Xf4;4zQ<@9s0jգueQZuv]7:2zw 7wfXD厎=>Fr:;˨(ß4t?1aly8cT9:XV`nl;P^yJa:X(ͨ,F qn=1q`TQpuu`=Q2cc1 f1J0V?F]G:˨}~+F(%βl8ZŞ3*Wy*QQlzFQ&` LmL6|F]'(VjՇ咊uwIFE&Fsu aLHCLˀ0*,XvvQy9aGǒ?q-=RO6~0ķe_}b Q?{},#}4Nѱa1a34EQQsZxv|T jQfT GBf(a0+3Oau"Ĩ؝qG}X2F1Nw"F>Xfԙ:j;j2{TzĖy*͎<axv2ь^S^cb5Bu\\$N&*9QSѦQ3rFY$=FfwԤfbTrFH2ST:L/q?EQ n<"VKgg`t[F=ը(/1 U}U2ۨh{ԯE2 Q{D4;{(jǨ$&(1J2~eǨRM .MdBVy>2j8JNr'0 iFY bT2*/d"ԈQP(Ut,+ 镛8+rԶT^dPx-ð$9U $GUĘ<~g&QْWfYODF#:'&q t-eyL>:.WT3ՔؼhFHi鵘%=b|Ii1z'4qWiA <)Fq Wq;(2o aTHvjP(!٩`/aşf`4\k&*I$)e-ĂttehFZѭ=N BR9_-(xBfoPh>0ʗGEsUw.'`M*E3pQ2*dA*e2( y]~*(?R`ZD*ڞQZ^q/A}QhQO`Tͫ(bt (bFX; jQS5¨^,b4%N. FU`1R $\FbT(+9]5$zHFyr&1*EICFU߰qb'67ιK!=;3TS_XjLQH1fz9Xb]ZohAy7@nBǘBbd3MXZ q\hP <%C_}=stiR`G 1*-$9*;hYt2/]\E0ڃRٰT3:ދbץ%ٙQEiQ6}([@^=|!őoE9 F[Q[h;?gftXT3 d+I32VpIN|EF潵vsvvfd *MIFM ウF^>FOG$fcVoTFgΌrKWjT>pI* 05}28g32 ePqFm:#٢~)0 ͨJ1jSWp“ufo٧g,(`1ze42̌JCMG)Fm:#4)4{>$cjQ}(3G{fgmoC1 Bճapo1nO0+w5th,Feb/`TgBeݸW5pvQq3II:(X(nR>j| O(l=.?\~ >Q` Jw{.hc(~nQ~HJH!!P^2蒹E?=`q.p p"6>Y8:R+xn *Js{uZH,DFg`CQ%ՌgȨ7:#:(+G65Gs cuyQssJeie*;kc,ȨՌ7%0 PQ>#8ԑQw~>F Gu ѧG 8Ue.;FF/|Fev F>2UӜJG5vv(Fo{`Ե0`8g3e;6T.O`T'}oFy9U5aeTgT(՗Q\*.Äz"x\1֢fR5mxǙ $Zv{eLN~5>S,i<24h@Pʫ=RiNu -uco[}hbkP1hQV?Yèr)p/Z0e4b:%>cJ5m(tѩ&wߩza5Q\ n(fwbH1Q=.L"F}5zO &GNgtZrhjTͻMM: AFےMbTMy3RFhKQl1E@i)eVqS:;kbTMyjĨ}6=fT%d4,FQf}&r[ O&$zFjtھS(^dS0f .rUFV}&r~Fmy:_xB&)nP=k} uu7F̌ƨqtC-F[1{E%-hZt5ʶ;]FegSQΰIFo6luQWtv1JWjF\F Qh脙1k-gtJvV¨uẻNT1TA3FFQ6Sx{4-여6$dlwz(%6dnjUGs rVՁE3I~(Ku:;w!H'HO[Ћ=|\w8 4'9zu~s?O *zf!_S]goQ ˁ`ֶPthrMv(RfEߕ3d'hFuoC&Mbz[Us̿/l\Q4}aJɌQn%>73c\?dNF(>`HLqr *Foeg-f9Uh0Y:2c? jFE'):Q9w7ꃌ"qQY!z Q:ъ*hGF+-tFq]b=B8;,3uQj(p3N{Gl;x 70롱oبUiv WP(Mc;}A8}<'* !AZ&;)Z1_].* cѰegF U(~1zYa0:BΞ0Q=18шeof23?Ψu&+Z093jf'QhRVE5LFR(F雋-VT]%g;Qhhh9XgmT &&z6chYFCF߿H{8(b+x~r3Qj߳iM';/ /??"|x;~y PN`4!OC'4 \'F DRMv]TvI<3o<r.Td((톈\0:js,-yQRGP*֠an>1/R`Y-(1rg"b7쬕QBZQ:$h:;ke42F3 )Fٝ6Q0 IFJ#㌢9}Uh匲%67M1c) IF9i#Ҍ"d9ٌ1z(C4{ޮ0ړQ\^1:4`TMaf3zb6b'ըX9os`tH3'zF5:i^s:FÈ`^1*:(:ڌQP#TYhQ/ʙcpr 2ћkԋ]g͌jG3SU& Ey`wI8Rx^F]7%cְWeZ qf,!JNA)Fd9:9;:;#}%wg=Ug^x,P(Buv=bT/A/A7Ϩw{(^Y01Qp<2`4!STWSQ_"Qe45ZQ`>K$ݚG3bTU>0¬F%Ө³ɨA3:::}h,`Tק( HF./?;h&0b1z&`~wgtF)ڒQ=jZ_~m1CѬjt͌2Gur0zd1:Bb4]7ٙm)zQV:cF-FݫjtMmǫQ(f479Q&h07`ԮFG:F/G(SQ(ftoF3AU x$Hy/)H^*K2 ?#\'ui@vRvaFQeitKFͨ}F( 9QNCpQ)S`xgx~Q(;]瞸=ﱊ:j2 M| OF昝nhF gr`(eИ :`tID N3ʞ`Hgf{@ 5س$'0?LGӌ:sVDfط8tEh2j|HY޶M3-$uQGQOR4( ft@Fǂ(%fri˫p+fRhI5MfaWa 5fk(N g4k{Qs,FmVFsgaurvPNzFֻ;2`PQ>`?wS9o4hRѼ.Z}N[>QcfdXQ+Qw1 IDATsщF,0ZQbf4WHaFbv>88?DћјyfAڌQTEoFݓڕ_ͨqR=zoԜYhtf'g y MWb#ןɯ?oo$|/D`XcL |9-1崺=%#3,&BPB](qocqpΣїQdT;j):֘5g˨pB%¬1 .fԻ&0j~ɨ?RY&w6?}?}< +Ok YIl“mv!f4(HlG[3 3W*k7Q́&F.L3j/B2jM;mf/~+!*6XeMrhb*G ՓQ(xըm e2~߁Qm/AV'ZjGg`LGChjQcӦ1V(g1jU`j9o ..F! SߖQuuNYFa$d1jṲQe:T8˨HɃ_S%u]jCݗmص7ݍ\ 4v[Xqz"Z˟!(pz dvA] AL>2}dvrW 1E QF+U02z'."BX"}KDXg LKk [6δB&j2%P|9~?Q 6=Pb؉X*; QFo~yVe/jQ%ь Cه%u(A1>iisbF2(2rr *F'FiQ+2i'ӭ eT0)Dm-=ĨS9ȮE.YO!F1*`4;$?bcϩ_'/e#Fs$}R/`1YQsU#FE`Tg>ӖѲjTuNfTH qFur,vbU=$$%ٱ@3&PƓE(,ѩz>;F#Wm]щsFpv5!HIF[Ug|aj44f4pտSذ8t5^`іёи˖`/i9o\򊔜g47nӎ(NRiĨ6(=f%"潤{(oA$D2Rl"pڢl__ak{BHgC69|XbOchdjeg*9xX?ࡤ ~;n:'޼JBA1XE%(5Raz׹;fȎAsRzPmKe!; 1ʛ"T2j_׮Iea F#:ԜQoϡ1(i!XBƌZsS G1OQ:jf֌5,FŁe0 Qkƌ2F!;xFW&*+c&Mfԏ8TvdI+Fڱ d#+; Zgg+R4atZ=1 c UђїhF=:Z(zJS 䬍ƍiFY1³ǔsmިd7 Uђ3b~F=\=X!Xj =ёQb6-7*ӳIYQ5vF.ӵeO2 meVR*WzYH (,N݂69urik1DQ',?DY-#—b1t[Ӛ³gjFHPG3ROIeT,:jc%@1JXZī(!E8WP1Rh؉7Ñ BJ"a0p=(a#(Yx9(qfW'Q;:yOCQ5GŨ#h)NUd=tųnFYq o'nA3Q(ѿ8F4fT:[dFuvF+~z \1oaFoCVF\ͨ_Q0U]0Z-Zg 0d47ʪϓ&&WvBF^gg5h(d0jߚv]=K2Tӷ` D }gF.c!?J?Ț?Y_֞@j[J uEA`@0ʍ@Kotphbƨ3{iv $h czh1#X@1j[Z7dT5Neղ{xQ _&Ah;F8_GF1'?Un NǏd~dZ1*Χϩ_3T1jbZ1:& 9mѳt5*FӲ.ѧ-i(~}0zCMO,Uy۷wћ-i(~M*¬œ" }Re0*Z4(.3*qj2F$27ڎQ\;ZkQp&H35 N@|3dL%)|<#V}N?Fi>r F)KJ2:bPRP8a΁{v_=B1JXjf(I(^|;b( Y0zz:}p:^ ~689UJkPa(=F_NgtgT$`c V$X2:w!&sI>= 0WzLzA$b>>J.1:Fn@ّ@ AQ tF|F3?=M3ʯt"x1*ABbtS"7FK!VPN0!T0:><+a(iiQ*XeHQf##E4t~FyBV/cT7 6hg3,rHSre 2G_GR| ~-`.C]F_ff# Ό0ʟ _(HC)F!ΨS*:/9)Fe2 1 `~IFaFFFk!XG y>Eaj>`ؓQgQh4w-cfd.Qh?oT2::cT*fdTU;d1 ՐJGj>w 8{HcȧxJLY(&AEpϝtT[*h_at~@_"!Fd5j@@\I1:֣0*ӂRE5PjE@ȷ0ڜpbjrzuz`gwQQycIF!QIbH0:% mUOҨE+¨NN6sZyHFL 3z3zW)0zdTR*=8Vfcכ-h]9ZSbT)J1ʛޢQO;Zhp(ѦGFe׻T`{G0_usS%ѕ=/c5QŨzQ hmYӨ0Ekt.05Ѩ{GUɗ8SըVzu2 Q}{SFv>Zƨ]Q\F4ѫMU}pJ3d0ھRƅ"Fh-j0 $ը&SǨ7$q4q47$w1<GzT-F}FeѱLK1*;F\Fe}FFۺ%Q0 $ը#ZS.2¯2CX6xFkAr1 5Tߦ*WJy|ayOAw _0X-B9vTXRC$T PQO`sSw~QJPE|: u`Uqtp_N!S|2q~:2j=׌'rs]8!4~շ; x*@#%SPʦ1>c񾠕(PF}F31e {4ȥ~AFoNdA3bOG0PQH2jpĿC9fӍ06*E匆I申91zdByV% *DL3dhɸV+( ^5j0|jk\`WFC0QA1F1i`ԻEr 1Vӂpn`Tnd2j7cpŨWjD'0J F)j}ӌFnfsf/'33K>ɨ 0/>OyOEWFo F9Ad]ݺk%ѻVW^pF D)F3cD*~]fTO|}p*>kzèS;5Se8 =cT^DD%g7ֹ7=@*;Ύoݨzچbw> b Lp2 T]mpYcM<4L8X Z}ApðTԦ2(9I}Q֌rI}^( %VՌ#.eQ[ƪўBQ' FoCVIZĨ_^wbT:d8LWE"Btam5j3$D~:?aЬ&0*/5js4`5zLWeT4#js4`5jU9F`^)(ݪ/eyF>lj!jF|21J1 3 Oc92jI2[=i(/{2yJ1jn([ę_oyMf~xu$'vbl1(~ؓ^ Sͺ>ꍳX/EF lԶQpE\(:y(=<yy+i71JWGܐϝ`dG3{c:zqAIOj s`T[ʞ̎1$Ÿ USe MVvLF>.cTNf- KU3b8z8=N5Qf0hqKtۅdvz1bK5ʢQ0,QQ.Fx2՜Rz~I FiΨXlQg4ʨiYɨ ֌"Ph5Ŧ&ɟf2z/(ONsF=KیpbThDXI¨('ֽ] FQ~7g_ zFsU{BVuc`h(G"U T%jTX FӚP0f>KB=:;&A riF5Q T-z[3Q*ΨNNF-z2Oאe&0j:ui%kUޭg̎In0J(GxG j 㖂 3oxPT]߉Ƃx6#E۔AF ڝH}f^iWVKiJ]fu0tR:ln* =1uG KQū̎ɨciQJQ#z 2x1Lցe$ca4QF:s?Q a6(SJwQ-dtGեZFgC%V5 e:H37Q*Ru/ΙP(Y7BFO[3Jd N xaTסAF#5zTr{(1o(èΎd1o5D~r6suIAȨWB)@2 dTVNaDӊQSXҌκ3j.ct 0 I(y3J4[`k'UdvG=Fd Ҍ?QbF &5B(hq(h*XG)fT49n!F/2 N>Q`y)k^`T.gof2:ߋ:\F A5x Tqx~'}odmRJc F%^%JѰ7Gg'/(bT옌:=usO1 %@v25^7 :?T3jI,9,UAT $t&5΍MmDQ?ݹK |@L@v( bW6mTh@(!(Jߜ j:FĨ(D(F-rm3JeFLN \Q':>|FF2:t(8Ln2FQݏ2% bQ5vof3Jtd&0S脌*:|F@')Ĩ(B-at~49I|6eCL:9.RQ~Qq(1jؠ )3*&B-F]FSoMoOj*@v0 &pٌҿQO(bTf:xTpk3 uFC(FmFe2N}5 3 [eO-*F]EjdFJ/jf/Fuh ;atrݤs/Uտ(*@Oby0ͨ3"trS9b=m#6Ho Oi1N*RNMt 83Qla#fv4n9Vo!(zh9j0F'Q%(6陏*97p(g0jÃYur8s!2o{mn7!rF?DQݑ5Đ}'F|F]NN&sr̩H5dߞQmkh¡Ǩ@T/gyѩ/ˇymF9;ŨsfQ] -e'Q8f FߢotG]Gg'Q(..1 41;= O=|蘷Q3v7kU~(^bdJHklFHF ox$2ѽo+BTFm (Eҡ(fX) Uґ({5/c>*F͝1 WQQ@)SBcF!sQjr2?1*F FɇN2z!ИQ1&gǼ}*BNuh;m{1 G,(c9ە:?aVv,(F-DL49Ro 0ƎGʵE2zX vklW; Q@F8#eC"e|K;9|_X ɏ(݅/[ZrKޤw}ͮfTBXKKt kA^L_1!0>>>RS @j`]5gTw0  ګI6ˎu%=m(`Tg'QJ#bvRò(eI5pF76XUͿf?&aFdݳeff{i0_2ݱ4.QQo&מ(J1 <Ҍr2{F0 S m&vk (Z0 N,yp@CS5{aQ?g'Q(].p;;6eyjT<K83ʵM`Wfv*'`]+9(0*QW} t5GM Mx֨FoMѻ;Q(]9aԮFG5:3 4_ /U/QQ>~vFAb0 qFAQ^R6̎èZ`0z3FTeFYA(b uQQhI1}h%B+^(،Bl=CtE娓(X5/RDSdcˌ.&FAgeIQ}IˌH$PŨOӨw 5q5(،Bl=CtEAtΎ}(>)$Z6( " gP_uvWcr>˝HxLU)& 6#dzГaWh A=#(V,KM\PqIyź'*9lt)̩;mfl@ը=oQl)zA^Sb>"p{TvbG*w2ݡccԪFA\#[o<*dvB ˃{wr&=;5oՖ҆}0~`%(T0Eٿ,F C{19&F)JΌ!)AE}F~qQ;rR$AQhY(0j;(Za~.+Fyr F9ݣ&АQ ,Qf0 LXbhFh.hCG>F73oDFe=ZȨ_e2׃b}sbh]f"'˨tQ݈}шbTJxΨp`;H5McdxB*|TK=ICbxq!'_; F mz.Zt-BɌ0eXnQ mM#n/Ϟ\I5bF!(֠⿟$ku.~F^:1Fv&Yߑ(QKQ@ʾPBC /$>;rtF+1 AFeC2Q+y|.ݞ(wQ1z " YJ8mq@F᝷uh-{TT:.yd3}i(&Gk1>6QpTdMrTvT(4h+F(Yhe#wKhK(0;ojGmϨcFFuŗ7ѥG`FZF]V)ȟZ|q1_(88T̼UȨ͞<4i6 CQ3sq1?9ɹNN5wiq H~jQFХS_fT7[5ˮ9eԺ5ij cѬnڠٖ7wRK̍#?Yi:XaU F F!(ȿ5qF hԔ3{b*$f}b\njǨpԀ#*$&gj Fo F F!(%3QF{XC`clUFɩjTu.2Zq1;e>*cu^-0:77+S2FE5ʨ]&2 }U5 U/źTѨ.21o|[j%ZS(`fT_ $Ԩ矘lVRS0gR?FgjaTQF=ˢ6JEM5ʒS¨h3+*G`Q{TQ<Ѣ>X~ͲbQd$(O-FE~3#(F/^[^m@oY&9[aR4Ȩ4b^kc>FtFxiBrn 11?̼lèT3#Dw-Q[+BqZ$8}Ԋ(d !E-e셣S|^I ?tfUԌF-[Ťҙg@؋?yO=C6ώye=A)s(Fu>цrFRb]d3*&i6N9%:;qF/mCړ~Rm}T0 LQɲNN . 2f3:;aJjԛb`ԍjeg)QYʴ/- Փ}l6eaڱmUȨsOb6hsF|QЛ+/2B%+ӾգK ː^d^ʨB4f42FE GF:]`^|_FfǼ]NNNɳ)|T،jK/Dp/UIGKcT[:oə- bS;>:bAvF#pZKZ`T[ lKx@ؔ51~˲!Fο]CǼ]?|I[c;mDϟ 5vV=Ug cOeNQwHi%F[c;$ 6eip蘷K?uLuϦ _h >cfT6률eуc: mh}0:y/-G(FRt[6)gL=+o}\uvҎ^mp1*:>o GbEve׿!ӿB)|؄RG 1K 8%e,ۡQS`=ePDçIvbymyTa(DTF[8:X録0%.4Qn0ʂ3*P^V>G(fTQ0hF7x>УdX"-1`"~9!yo8Qa=2um`4ތn}iŨ[nh 0d!GhurtftkhCQn0jfǼ}nG19څ&(xv36蝚Z0: F7sz1j$[b͉e>FhB]! dT G^K3ʂ>1 Nuy6$64NݔvJBf'(wbT9쐌N>2_Ly13R 1hCGܮftV1[o9nmJFur\^h3c1J];m0ZFuvFP>Z0VnyMF}u5yhhs5]T3zQՎhtFveqvZ0&&ϦLFu޿\A16a<< (s nc_Lbx~#UU Yʖ(p`Ioe75cT˨`T;rKƝ@2Q@xjb13{k|% k+A߆r bQ1F9 $菶B=GQYrBy~z3feߜAEvdTxxY=e=R-  1j8*OW:{!5L}$?_шC9Aȳ(e1e)˳R+Ґ;Qc6ʎ{m%ԉ NךMx1p7z IDATn^ٌbϬnxct!*JQDC8IT*^[,g1 <2*?kOOFO:F_nMΌ6WAFt1)Ъoh29J.Rݪhۇ(~3jO*]jL;2ZE[.`tԞJsӗf%Ũ5ZR*L{2(9DF##kQ{h/q`QB!@U g6GÌѨƮQQF604Q(wӭF`3ڷQzd`[0r87Ag_rQW 'F?~[l#RFoRiGu鵠cL_5aɘg-l|"Q=$%'˨ \6¶J(2;}b߶;~)+B9&5>$Qѐ*,J65;+3-Ua(*v 'kY:*Fu۞ ?kYj*;ro5?=Ǚ, z2T2 zkI,0[3jdQ)Ӛc Q?hW0j$形 Ռq ٰ0zh-Fv# 0}bT'2x[5o";i!F25eFݪQAγgd&)u|Tjfr2ƨeFŜn\Vg>(Fh`VlU2FjT3Z1ԘQ0Qjv.[=)F(6QMZ5}5j0zـp5(( ^fT`ںՌV 3(c`"O@ɨg!dh0`M wl4ąOd|'"eGF}$;:.;_X(F5UӽO,B-7l.3Lne5T穻'pP66:Gxb ")OoM]͒ z[!F5uN~g14,hQ0V6d>FYL`Wz01 Q5o!G0/cTdFݾdF!g=ۛ2ʓ"k*`3gN܀[QQR6OSzؚeըdhF#Uw 2i ZR2bc_FiG3騙st2 0騙`6*Ό G{3za&'~fe_FMG;2A3RЌBA9T?6=1 1ьY>[Ѽ-FQHFovѼ}-F魕b4Q*Cl9Q0 )Q`tj\p.4o2Nx UŌ-NQa4T_OF+]-1F0N72 5}1vیӌŨΎ7˳d,F 02jjj7-k(_@d0:;jBڗ lsF->t[v9j15(SFKs!>+7F:a>D(MRP5HZ/vFC:? kMvè'4JgR`Bn:8gzAEUhAqZlY=Qwuf^KGC8iO|^O8luw#~O8| 1j EB9t ,G{072BvgQ隌ΎgG:ѝQe%92z]FNc`Ԋ(G}5lwaZF@_FWF?delԯjFhQߚh40SF׭F21z<;Өm]]ǙpVQcl-uSQߘsyp٩F I.*9{Ԩdr?P\SOv9GЇ8X8Hh(lF!:C#7;`ffɓ1@F%qM!T,ĥgoׂ3M}zu%Z(5;209Vv}'!56cTY(Jgf4 ([ dtg4F(l¨nׯ=DfhTdgc1z݄Q5Z 2挂jد(ˡ8U_0l(Wc O}2|OJvQLџ }]@?N%|KBPèptUFd:z)p)mF2!9> HJJ5zt}Fsb:zf~X )T̨zI>;S{@R*r תQ*h4XKI_`:; BP+UcQ[P | C[ChKU2;I'w)[Esю;~<jųqR負Yv޽fg0WQUebR u]kG0F +Y;ܓ}r5]Q&`4!fFev.A0Zg)z-&"V2f;`t9zP>tb (xV2F=}r6#{^&WE$ ='jpB3;3dI5G8'3δ=}^4 `԰ X!&(1T8`(u.Wɨ~zoꌪӄQzFkuv Qr0퓳YRa ^iZh4;Q&TF}jͫQV5!;Y6iFrtuFQV5gt9Qz8vγaCv,)Gz/n00cp8F{:¡s~s7`þByQn?ū;=ңdk/Bzu6m^ր2(MdS0)oz;b6񸽅[c+@F1B$ʟV'<7gS OO~j˨bT4ѫ(ɨAn1 pQeSF?4bUsF2˶`#|8yt0`4=~`T6a}{F)GamvԦC`~FG59TFj׾0ꗣفNhQGG5 |Xɏq{;JB} *R LĐ[=\A FHXPdmV721Xf?ZAjGQP:~AXzgY ժP&hZtett FC验ޫ)F1/D1:Ӵ_Z(FbK`kQ5otF3 !i0E0j*҆+eoWЂW`0 B1o4x~37|d*lnQhԫ:2Bò]vbw;ʨl'VX+h+k˼ތn ^xVKFA7eIFgTw,;1z:&4K 厮ʨ.I}ͨ *DzZKK&cT_sfL5:.AYQBPQ}:2))+;84˖M~Z"}62;fIJקԵTyDηV:(M94Ff'jF֌FSzb9bF7:0z2q(tb`4٬h('gVerьk0:3dgT F9^/ >Z KCͼ(%ګ@S)p:Qqmi'i }Di9,%m(ׁXeٹ.sXAPIh/Ƭh7F 2-܉ΥhF!%;E.dKhƨ~كYT1ڒYP誌owa҇vc4R}ҞQUܾ3JX,(Wjh/EFqTtUFg<;WQQ-0<9w[`4Rզo*k0p*1EPj.$gW55ZozdHk=5Bd-5Ph?U8n6K-:F-B,.(Ͱ:Կ,%QRPv Uv?_,Px|Bv 1Il}.RNyI xM5m(lٱhV]<J eQ?9k0i(lќeFQ]vb'Պh4gϘr4g]Cg0b{4oԓRteewjԯ(d=ӡotUFnKFSe}ӣQ.)oA z?Xo]s<-1j\#E$􍆲$FJ8"9~QZON Q>jԔ/q2:+m[N9dP?A@8ᩊI25;Էft8Qvbe2#}d4FAu:JsށQZf%^hCCQhwF˳33FӺӁрퟝ.tftCg:tQ!:5D,1LRQgO?,~5 3g,Ft_TdD)iJMvXZLŹ0"xgն h^_~r6uAJ@K1j:;[@Zus FuF;2fы-2Z"+:oҌz34Z29FF|Ft 2ʫт2 _:G.~YahFM/FhF_h~rlFe9((+0%MɎhSFe1;9{hu|]|G-#4!AӏFcZ @H1N!F3׽5>)JdT}lPK;R'( w4T E3#F2zF+00Z}xyNBWFgGgn'C@GFsMFI߉Qv:ц~hNB_F3/dq7F-`4sRArz2J }]=R?#F3g'W-9އ^3#de_l:E*NCq*ñ4ʨ/cTTӕ7lקLS+Oh i?QKY\ z.3j,^s,]tl~3\Fӑ(7u9:FcF}M흝hۆѾk(^#U ž3USkFw\B7Fa Fks܌NhɐɕZ3:w2WSЎ}F:2Zcۅg,_p#((Ld #A ׇх\Х+J8:))+GUevlK-5v }=ʨc6?E$zȣ:k]ū:/tvd*fo9~N\4h)F F_d]5F 2ѫbF{^a#/֥ux3Z1SжW6`繠FQ6a_vIj b5ڀъk1 F1y-Fґ֌^hG)~NGF_hqvQFw]5ڱV<'11[zscd貔{ CǢmAaj>F3鎈9F F"(e HO`$Q53^a :2^eh'GGFhr5ZhcbhdVbt CL;99ߚlVxC`cvюVT==ќۄѿ4rt]Fk~O¦gbgQj_vtmSsO'MGݝeF{[ǑV0o[¤((63:ϞYKv]њULekA96iΰt<9`QҨ׌ږ>׵+*DчyNFyv2eCѩWm)}2,Ok0@uyɉJ' kK. ^GEyTj!؏uOLF=݂iL$7-j/;'DY Ͼ 6F% i2~ߌ17hCQ4&j{^wpow {? $tAd҄~~7_}B)/7URr|%Ҵ&jʨc(hoq_иy@FmMf# !W.㜇5NhyiZr5Ie;j^6\i~?Y2uۃuOhE# >1nS&ֆiM$ֽ8[  ιM[v)B?54G8R~ĬwBeѠNhE^r5Ie6K`a`oZ<dܺ ~ĬwB٫8{H2*ˢiJ$Qk?gl[Mhowdd#fe'SdTPԃ4 2{.7nK6N(XKm?68g E=(LӖI*}gaͽm _#|Hl5 I&iBk/#;y,%4%j޸m=q׼4[7<"1(_a<$LAE} %Odfx MuNȗQK(G:' > 9!ϩ4 2bvsSa|L F`z;)/>3ʳ mA~Ƅ\MRݟd;- u~o x#/m@o6!DF~wBpWMsZ3JOKB&_e/Ⴞ>D_ho%YmB؝z؏uOJa4' OB&8>tv1W[m~,AF}f|BO ?"?! MTƚfO‰JO+B&gJ3%LetrSB)!̔f*L a0SܔfJ3%䦄0SB)!FQ555դeTL a0SܔfJ3%䦄0SB)!TF'7%L a2:)!̔fJ3M a0SBNnJ3%LeO`aJ3%n?os؉)!̔fJ3>6uL a0{ÄvcJ3%Lem?Oa%L a2”fJR<0SB=` 4%L a2=q%L a2V*k@hAIx!䕠6{'˨`pDsNEjJ6R&!h]\pҷ]HʼfM lu F}_Gv%!{(!%5=!Q,,הfJ3%q9 2B֗|MOHeǶITE*֗|)!.*kiWB8B7E au'x5GI*v!2J*!z7gQB =]F-Hno}Ѝ@UNgJs0gz:"mm7 !V&JZΡvC^B]ϖcMQ gKMAJu%Wn e#2zFDLL˻w%w0g!䈄.71فv ۗ9;?!RVS AޘD7y*!. x]ܭpٗ/JCRSBKHR$oDVBńqB*-hb~ (aAKHP$D^';P]1*΀.7 )勧G%ZT*!!7Njy+!5A3R=ƥtt†,ϑO%Ԕ"/0 %jB& .vَ[=\CO$잖}-P¡Y{"ILW-!rՐ . ^rs1;o;Bh{eo4^GlF(RBFNu%t/J|>284JYC-\%['PPй`=j8Pb%D=V=,{Zy:)=Hm!˲aGhSG%忈Ywa!Ŏ#^8 DM|y)B#W%t)!)־/b8Q{*ˆ8UB B_AB=F Ny_:稫}j %dD )!lzUF+Fm q[6JhQBWRݝ/8{JxS )!JIRݝ&VC|GhA{qPT aNTjB2˷:?[[ֹP+]40aIuPe M ^ea/'T(Z:~=,ўdt] 0 ]I^cu޷#T&K<uiKJD,sy{2< Meo/߾LGL~"͏=0Δe}~B>%uTPpı 9_GM0\8_Lp[Lӯ+"s92YH(| 7E#=FSRGLN#39_L}3*mRZ^ֹ'rd#p|U4ǑC+ (-GrZ4c9z4݄H2Jk?? (%YHh:5xYʷ?}J 9~jɄF~OhGB5ѿ3M&0JW22 c']1KTmI{C™r>Cr[MRFׇQؽ c ` y>!%< }6!2 _Be\tC#(ȿ:˱`_O 'Dч(~B2xwNM_**}f+YX* BrUA^OFA*{n4,eX0Cڭ hI:|` -A!2`g_B2>a W%ɜQ + Sn7T` &JM^_P駘v~)?M`z=t6s 2u,9D&*p =i- zSdoI~_TLHON$ YdK] H^8BsQ&mhB,}bB}~P&" _zY؅`UHp :^; W( b6beP}/|E/(o_ >LLj 0 [[y3B)~ چ2wxR<.7[-z%sY9EPXkEzL\Nm 1نw;U[ oC[q)21q>P){q2gBɯ#EHX%JHUmfUPPt6z0c&5B{9B.$HET"b<$TцΪH(݆HFHXހ2j;Ȇ2?8f}2sDńLLq  oSAFȟ^S3IBm\$0 B6D3 R=Ghcݾ00*JE# MYH N*֬! W:Uۆ"G;I8B '<L&G}uq:9COOr_XmhVn 2x=^s)i@oLjeAcl4BLh/D(Ќ2ҙjˍp# $B4qMV b]1/eDBT !bq%UCjCʨeFtS.yX2Zr$$HHHXFIXWGe\I(,o64CUQ4uDi3TFFISܴ7QBmhfMErebܲ']` lA]@ iKVBд2n&Fk6Gc, BvA vJVKPBjBmE+ B'n'drަ\ZF>Ba""ݠNOQ;":xvU\+>)H$mk zń("BBlSBz.ĝ\yH%԰ I"\{KBg =XFkek%,?-x|ѩtQ:B:"͜*BFGkC3J~zBhh9c:u-X>N=OT[(ABDvOB2o&TFel¶B7letLܳP%[nE i[ΫDk *vDpʵ.:hF!>Fety,6s,k'r!ietO{piT[\7 # K2\fvJɨ2{ymhM~=!FJ; d4O> Lhv-*q@4f# ;xВѐIum|B6?PӅYB' YB*t2*;_v#@|4:z$4HېU##_u't"&4^nt{}rݤ7P EPj75}7M\%bEq{54jE%DM\]PP sǎ"*˦'DWE(7s"eM$#(n_]Ԇny*hy#c,BvB,ŷb3*Nbzb,&pȄHBJ$4㉄2*Ahr%m{mN3cP+TQÀhzҼ9 {#F%Ҽ9 o$TjB(3p9b8Kh)S%%RH%J(TFÔBf;JhbׇJm>PJE&XBI$4o11 g񶤊f~ ?XE(<6RQO% 1dTaJhe@'K_Oa^>9?&PCQ Q7#1)Le4ְb0W߄,&PHPSEyB8¤]> ]Jhgm褄TF䵷ð7+CTgBTFIY{&$؆&`WnIY$[U:j.&^uύOH MH s*"%e)[s\80XF2BNmCqRB3h;Gh%XE'$ۆbPB7b)Pu"!uKׄ|u e_BSg|`ݪEp߄NUBi¬cB3+k;GCuC!݆j SB1 M,m:K $xR;7qj-'ZPByWFo/7^ɯPm~%!2Zmw8@ Iٔf}XF?0JH zPZ\P QRLn |B%(!J)%ZԆhUFߢ+i{;c%xB>%dm(ʨM\ig)_.=!7P 9gP JĄ0mhZ?WRb'Y%gB{V*)s fJHPbU<-!L$ېʨm%&~H|w¯ErRRV$eug>uT YhC);.3s~ʼß=JH P!Jh Udt^?Q[h&s~?m/EvB%(/FPF' $fJ%h΅6 %H] `_LCn,.'$f{(Zz|Ƿ c.|7OG O$$&#\9ZoپVV;B Ao`%\X-!^6޳YVr)]Iym/ t@ ^*LM~n -n6x P zd2ZX130`K:S9!T#222\m~2? q.L-oa&Gӈ B~2࿅Y eZ*LbZRͷ[&=!t[nCMV&?vsCj-Y+i}&>׹hy6h̄~Mqlؾ:p#-ELVBV8WBGHh1}; HMF% ͍9ϕv"q 6:LG蘋]UtLB mC {ل2 '2`F-x.Boi$ jBpfUtPBtDב&De(-86Pvs H$|&奐!bh <*Bhv6zDQU^Ɗ]4L tJ8W*6QBBmHetY8lȊ]G0L V4QJn?:8۷!oQ9w' g|uz$(:MlP}r_?Wo0ͻQWEKuAO09g廀O(N roC~6rѨeE%,](teG1ބPu($$vK–|PI(EF*iJ=%tqɭѸ m~~*Q Pm($T qX+)B> PmІ|nԻE =V1\_(/u?]Dv46 .!EBPHtI ChIڎ( XP|9ȹ9K39 !*ѫ~BNIWbf'^LcOQѭۘlA Qi[}9d2Z>BTtn^>N.[)vf:˾ѭ«P1n\DN@h)$4JUd3O$ H S}"gw]dBݷ!OFBQM* gQN2ngw1/Rn6ZLȔܶ [[B^Pmȕu! m2f+-˜ )7N]8 .!vl4(BLK 2d2L%"/bp|J eBd-!LEO!6#4'ńori{73F|AF a*mSѦTF\E/Q/E ]CHe%>]=urH2ryT- mzoڞ\kTQIF+ys,ħ>>:xBBi*Jh82Y1̨2fL` tZE:XPU?J(se欂 +1%WrٙUg>>8:uZi $$?wA(ԯ?HqM(h *wOgNCQ'O!ļ@B*)dTvbt_c< B< PH4hB I0[2#*ݒq!NAuAF[ėᒾImK(nG"&%JELK YK(FȞRFwl^m޿|&WGJRQ@H=K<5/se71 Z}3~!p_BՄ 맄+ PFsWdNw7zxXP87|uw&q ToP YB[|AQD RFkW ळ:92ZK(vȲP]hJH UJ(\mHW gそ2Bg ֆlO؄XUt*hІgBU?Fίtz?2|$utlOLB6%`ml"+_t4pq|SS2f3'KhCzvM*c4SpJe$ԱP6/mrG5ׯ5jC: ]F9[sli%)MO7RBU]HJ7W:ke;|JQ;\D\LD'2vYBZHN$!tx?j2''t-ύsQTGKLT$2$)Ir72B]DvHՏ%deO1Qe4X#s6/n+u#"pIĞH]NY$T׆ ܆z$T*nC\FBF\EMب.6}qdci8ݎY^Ի6emKB&{ڏGQ'sWeoYz-,萙gE5C6F,.!= r7B.Pl- PP͏ՄoC2{XxQk~ttMfeL-L=09mm~( B` *B/g2*ڎБu +ۣpfM.vȌ,:ѫ%PV#P/N1` t%` >ƶP؆*j'D(5jCVmh;WFSo+T=5a89ɁQjd)8!53s{SE#D7PԆ Ek yhC2ȝ$2,x5\TJ|&jޅ:x2ٸ.'>D(%lC\BU˔)mC@ z< 9aCV( |+#!$DQէ& ~@ ]BnJې16$2FhC2{Dvs7xV{#e&}حҊ2(pBAR𭄐w55%+ J . zk>7#] Kϫ(=MEswҩ0B~eB2hCLBn9x7$ڤ [Fh']h6F[_rlY{ڨp'B~5;CH<7#²C ma%"Bp ClІ$Fe4a22 |r tsے68X!LF*IV3 Gh'5Ak fHaZn1 ,]PYJ -KE4=!xX?BdwwODFm{l_[CJ6/Y3HC ]GB>e/B:_ܞ)E"bkPF!'.5bBby$ĔQ؉TH׽0\@h;Vb~8ߏUtjLN$X}({5X# 1etFB/ZP6G(y<t8\Mv }|}h߳`B/"킐>˕V*/b%" DZ]Fyi p$H(@D=-?!y28;&S.@& ?Bh`upFbey=`vB[r#D"djReo=ٷ.npIh JT} quІtQ媓ߧON?h~w+!8"t@@%G6r?zB,@64.e4ǹ6&Hp*KhC͔bB<@6df!4BqD'8݌i"t 1Dm6t=8eJB{M'[mO(~8$DWQ{3Ŕ*fɴ!3$ee[X/ZBX'`7bDZFe+zBJ-g .}U@ӈ( zCo  "lC\qBv9!2d:} Nhp xW.p;.i,EPpI܆ ZC 1v1;iC*\a|#JhMUɣ:ќJF=<&rǔ6lCkC {D2-.ic>l +A mRB[d tO祉y;nSe{m xZmHz_s/tw<Z'*RG`-Њ6n@vU9mm=ehzBw(iٱqƩp޼uA$ yke3arkCfk2vkU㬝}U%:ſ Ze4xnX6楈y 16΍yymhXr;O.ѕe4,~OMḧ́Zh? Ӳ%e4B/&2˕a|daw32 DŽ/Lhbe(|e|dn&Oe|Dۆcׁn{:B[:Zy\&Ը͞%{.f6^e^Bn,{Q^IhKGVÓQse*CF' &,rB)OHBF(PJsBy=!,Sr|^6X]{ZHGx*М?,SPvJfQwΞ pY%ZkDM BqRF;J!%c M#+i0J16pMvM8'n6TvΜ$2vvO EU(BaRJLHh6$,J(8׷6UX*z0Dޖ*QSD{BXPB6#䄥oB"C[$0'!VjDE[r;! 5 -**w}r+!*Ӷ&TFЂ+U.!J{ !V9 ԁV0!Ѳ:H?ȧà*-mHe<%L'JEk.7s =CF寠_%ټ4B 2ZomoDWQBMLHF#ja PBLHD#j*F(!Ԧ&$Jh1G+!qJdBѢb~}Y""Ƴ%ԼB3KQB*zPGQ!ϧg<+!SmUYha^~-ђ俇i P˼ZjQ2Z"\GkrBkH)R ;r˪TP*!)RS |U 9g|5~QG }@j$}S a>pUG薥bͯEVh)5$U"qOA-V*$c[[q괱Ƕ"q N{TBǶ2*G2F1+Q]\ 2BY'TkPBLIzZ"׊] TQ(~mi:EEZEhPmi* [cRFb+RFkbkvJlF-0)BϐQ._n.&t9$T$M(#)bz[UYWvcZ(Ue]KF(!),Q!SL_EHHE'#@#^Q=@F/Ee^F҇ULP~egz գq}tڠ*xBF('z) ;^ISӄAUB =dyls+R>i)Gzf[GJ!({FPY*J2yjb}U]DL?r3@ <f$4n3~kYoo42 y6F(zeDp?wm ksw^%wE(؄d9!esosH%x:HeBX)!v=@F]?n7w[xMTN PھڜPo +U].Sn ; Yh;..BVBJN/=.U52 Bpk(5;&c^ΚT!G(W%#-(S %T\{\&3˷u*0z_[w9NH<.9}qAGyJ+ B 6:B_^$&}h=ʏSo"MKs(!,G@[E  ?J wױnM"t /%O'`"ĭ}﷩t}/GQYB/!~1Y*TO4IJX/2 ֆ ߿I=1ӼtQaB+wk{;Ы g_6Le4sRq19^"WٿMIkNf-BBázS5h3z6ZK(jK9 Yg;W{ :'xQB7W[5є?nDq N:`{jԭ E,=!ϛ5ϏreO:r6cD _Wx-rv f{7KuN(f}OKMOxQB7 S{* M [W&x]$N#QBЫkuz7AB[ۏ:eoV(lۨ^lo":n%<9ƒQBЫ'dMd.7$Σ|?Jq>Ԧ2jm."`kR'ۂ0" ϾDbB@MPN$J~ɞ}mHI*.7'zJ*Q8ޔM a&'t5Z4oocpUB-JlRr۸* E %|)!TF=Pm %q:$p]NKp RSФv#E ey0eXplttIPBq~(ЄDgIB{u Me4:7RS2#z𞍮%LAHR$|qT dF&$\TFDr[g-xVB$eW%`u%tx!1SBNʫXIk7&NT91˗okhdM o"t%"b%DehTt4somB"q6B*\]H(S'8.PҖHlˡv=ЧO)UBY67zvu#pGњ!!RMΦCDB>tT mRI O=IFa.||tTx!D|uq03䰺>r{WrX]?gV$?.$d|l:p`K yQ%tXBF[:PBFbQ0!zB2(BHJXF@Q{ ԫDHUF2 7e>9Om2(BXE@MՈ! 2ږ 2z~o1%[_s_zBQأ QC QcTF}pP|]vFav?Q뱇.p*!bUBA;FHe6].(XwK/] M+oCJȳHEP`N:B*DAVNC]$ݞ[7,RȪJ%!sl\ܻ@Gx=~%[Z}BsB7eR]lh*/6(ߢ&gA=3 G64!9ې貋D՚f%ճIM[y =AwA2mR͹ܒmk,NMC"Zo Ah62{va K[4j-btE*= A 13OzdT%zO]Ag7Z m4!Dμm2!0THU1szWp>c!؆'D.ӶҟI8*Uf. D >B=!>5 =JFW<=aRGno T"dT | [I5Q.PCU5PmU5(鲺%0 6?uŒxⲎRKz.LLDezBxmU0J!څuK!2j9`7`[?JTwWQ`op C+B=(hxц`u M- }l5h:%ϺkaR" "!x( V Gz2 ᦵ!pk`6 _oI.'9M#p%F)^:֎A' #IAŠm2RQF=gBNVIZͪ F$D8" g֔m>B aDBdԟDXFNaͪ M(n, ڜ(ZACv¨.B(\:jC eTB\bxmhR=4YA; աPuz@R"P$GbmYY2x̤ pdXۗ$>#8 a*z-sz4Dр6Yf2s^r{.YrEB- 'dx OQ !']bɊԼuʷ!7rw2mh2n#!+m<5XE mv܍ ǷߖPBן9z4N"mm(Q4{ej TePB%!4,r<%ډNN EOp&'zЖ4:sLF@2*dgtم&^ l"׈TL QЬ2AJ-Qn9_BHho>B.-+ga&@ M uJhZ^ARF5) _rJv2!b5+cPfGjn7p.E%ٱe4)yrkYh"BnJ(&\}8 G6!!tlPmgtԫ nB:ZeGK0#S * !ΪD\m „TFm-UQIUŤDKʘPB@|B_#DB&2z$vQg.%~eoB |% KG+˦'Bo]ߟ[Fߢ[·IEșG,/eMF UF ^>PBζDOF!2Z,1"L1>)X2*7:!fRuRe.?H~=u B^AINF$$:}ntFdpo)&RѸO K#w4L^ZKHB(\B<7$QQђ{J|B=T4!'a;!9>JFɉ2K/)S;ѻ ɩdT*odku+e, l&Bz9,SBtUFô*ZIJŸ$ԭ|F17+ZB)!̔fTFϴo|6<%eP/\`[F$2$^7rR.KWʨ੓ B)!̔f*aZfr*j.:bj.&jA6!!|2ZTB2j+RPF3 eVD&J3%ʨH 喔Ѣ**2uJ(!toT d Hz.PK(4%Œ12z]|nWE+r =@ 90 ,Y_Ѐҍ]JB%¬cB݇ƴjURijwN(l )>"MzPA![cu(!ߔfTF_z>>"My$!ZInfBT"XŸxAcMyャO$t6W%QBQq{ԖH3[CG RIYcBn{S祒&J+Ih^-]en +[M [JTdg&QsZY]&a'<_9'G)~8r] ]LJ_BY/ 4nQ7a4gwOϺkLl d=ru0,!C=9e.3?p*r55!?A 2J1B>%_v~MLEb8]K?t&Tt.POJhRBLPOf-r)fK=B*Zy$e(+xz&3kfk*e.n p!JWљ y7 ݳJBNPe6n=(2*eoM9?o8Qy-r(h(FA¥ߺ* D.u>5F&#T) d,,YJF_UFs?2r KsUXh5*ы@ %Yѷm2jۤhh-^7SҞfrshPBh?\&2H2}'MjUL8z6dLEKDb|BV#x)!422!k6k_s&-q S)-wu-EB.&'zBflBN/35)58h[_z@l#NWQңɜ4BCBv9NC"ц"V2_;Q(6Vt4#f$Uda B0&!j&!J`>gR%lmସH^y}yY>Z1Mݫ 9*!(mBsZh:Upg./m_VKX y)!Ž!$&]|)ټʅ[X.-{*S}bu%t m,h?#uhBb2T3g"o-4z_ mQ/_N-B5f#{NDI~_[7\^|"5*OűԄ.U3Yr{B+)8#UFNh^5>WOIPĄ-Y4%Qׄv-gh z_)fvS[Ly6 (!{<ź+OPrH yjNBU,cJy*ȼ&P2Մ%)!L&QIi3ɺG1NwgN+!,JȄg81Ќ2:#uPYH&.TBK%|dԐ)/E<,V>L ኲ6W3{JH g2J M&3O3nS{-hn&,~ ! }`O3(%ekt@,0(v+Pθ:M =3I^j1Ә9O9y~bϙ2&05!^)"%POd2Jɾ}/'a\g=/Lj5%(*lJA2JcEnňlsx͗!Fl>NM ۣdBB?uCE|Q C DbB5OƔPO&6)L9!Pl-`XJo"SBTgɨȓ[)DV)-b%{} :AOF@݆%dGQъ6u /3/UǷ-PB QEm(rmhB6-!{<6(8bx `/"+ 흀Y UT Jh7mWBxP\p/Z~Ra|8JD&I|!5q6tfU|ʙ&+oE,`zה}߉1ޢ  xLzB9N럖au}.LrϡuZC^CmOQ{a¶}mRȎ]w 00^I;M))!eD(̯0B2Z\|2tH |^{1NބPN>_"!FWQB޻B2ZaҨeW7,9t.-^ snTB^u3!lBF Ih=WFK,E d*ɗ̥FP^!SO(|;=!H( -hYhmjt(bh%!bQTmOBBfpB2ZHQuBCџ8/@FgmH(Y)([أ YE+=mp@ά0T"7"h %$Bh_ M0ȟT%02&1v33TR.$htN uFhl-k%.?PxV祉JpַN?[Ḧ́D> -zvBFt@hQB٦-Eht-.шw}@e,?Z)cPBlB&H)>"z8J㦅"GQ 0 GU|*!U#B +M&5I+b2%smDuTF QB:u]eTxL}Fou83lu< 윕S<.ROF'dE(&+lj.ɨt=`͙Jq ]5(XJKB*a.{L@|,DT /ǔ[ a/9MT rI/bHn݀Z aO(Xw N\t ֙(28VB&[T/cwy8~R*թdT"Xkqz#W tSŠ3 gBt+ Uɨb#wsih5$ڄoIメa<mH(ԟFF| nX<NkGm%߁O+tZEi:z!w~S*JeȦwOG]ܺ2Y%r C0`} jG)0r>ftlj靦LG|HMR a.9@V!,:BQ:"cY!'9fJErNJ3; "ēQ3G8'Sh4-;& ( a2z-! Yy>8Mˏɨ^ :AtjS;NLG#&`%vK- ONU}?OȞSFrY6턻IUguT p0!T <؅goe%d4hP$>.#̃SZ aey` !AhQB so\Nh^f ʨEkƁ?͗ 0c.] Bne''tzdUDdSYx/Rjp2ZTț&ɷk©8denm|eetףfPMrǔQgQTK4DMTHHTfB9!6T#+!{g@BOхk}LUU%d4VDB^% 6| adԻguгe|ަq&!5Q˦f՝<(&mRFu%2JcI/;*kmN :B60$BEm9ʪ"WFCkCxvu(mDqZ:B6GydBѱU!{<=2zt^wM(aA% B{YB5$iCBe*J մ!{<١|a.qsޞ$?(ZB&JVZ$Ԭ Sn2z#wYڏG\be?dl= t^; =U4t'sPNEڮ#Iڎ\%R6PnAExY(cPuAV[PFE[گ!nCPbB2|Ħ"k/qXj1PP"TY!PBEW'nCab)B2MT%@*%-XE$M)BdΕgPXv<&8$8 !qSD'SͻsBCrz.c ېGHD n( ΰshu=@)VO`! ąv@Ƚ MH [S? x`<eCF$R{U] s PGȻՆ$MH 2jʫ-df'.DTفʥfBB^Yk^:c!r&kC̚~'(Lh64ASyyıdT[y(@#{QJ$Pt)6ddTєCbHU՞ȜImPd@.& y+h>SU<^d '!_ ?Wщdw2ZT*Q[Mc @axr=![ ې8\І /%r y\Mha#قxe;g.mأ్/U>YPXQk6װPsB\E(!{T"B*:!xoyd8b5G F#25ЃeU\ Em0_w[.Ẅ́ ,2znk#|z0NCFQ5R烋퇐 d#iC *B20oNfTGŎD\A׆|@"-!^P&^QTF,['}E5=  @ن /Gv. 7C(脓c8BW؆XE/ ?RF f,&Jcg6H&%@!N u uIm(r\~娗ڎQSE#lҩ1lu ݃q<h(YC'&ZCTBYNjB/Jq*EYDYvM{P#Ju(!ĭ{H气q0=!{P 'J`B<=WFK݌I u!J5%Y#B2*3KOȨg5 )!̝S P3}w)K a&&,2f{%\e(M B{Ȩ|cV%Xt%r(yrB2d>Kk*Vj !fE@;JsX hzBh;㟶~] 扟4SBA'~-~\.+#6 B_Iv%{!*']F{L )h'Ht%$|!2'QF>F ;tPBH '[7z d4 ]F[LnSsXQ] vL%Z|BB @ p]="lvfm ZP %}`A5ZL@F%Nh pdt Tԏӷs%}%}`QBIj Ɨ̍z܃fQn2 ]H(NMoNhx}0Tt?vK]tЈ GP>jt9h%" NhN>~|8F̥"w?DUB"D!>DCBhf6? Wy'D)Bֻz,!"^Fk﬌6J!"B~qB'4&ӟ@;a2[_yZe"..Ȧ0P^6z5[2ĩm{JгcLBVm:B-{2j7xyx_דHEZFFp-!dkCh}xnJBfxB{2( p'2FIs?^pS5zkTqme#蕄SxIB{(F%z[UD(!Uֶ/ Zoœv mWP 'ĮuXJ#D(N:y3/)(۝e4z̶bMjdHFOI?߹9p5"$:z3挣IHe4ˤ۝wH1ZXk:xowPkHJOs w7RJw89W{˘׶|:~\spz}Q4(!J^ HhP^2>Ŀ 12,(2jWj)Q%*M aֶ;0+!a9Q26s*z!Hus*1xTrUAw{>7MU*{o0%<)#Ĩ1b-{2Q piLo7{r**HȭU]+_Eg$jCo%Բ .v= l8oTQq^Yr81TtB|j3ʷY .ɇ~q"9ړTq+3~{A4!@h?&NnIX1%! MJhx]6;+Zu0"4x#OlCv.8s*…,{0=PBmRBE aiP&$GRFo:mqE*sa2(jqx+&tZM~(./DNFс_uz2@ͻ@MJJ?ZFmJF'ߗx- +RoR.}y|k&TXdT Y{l_]|R{zʙJNWc0)d8J͘v!vMH6\mH"-4PTYL6=5՛LU\ݴg˒m sKЇշQ~5^~\64?>+@B$4NiEGQ6 fzb{+WQys?P*BHCŽP>s l4b^;50u BbLq7BIPnvO˻!__יeӟ#O~VTч$]eCBE҇肐F~t*]s}35=K?#&΂ B;|{bP׏?F ~uIZۧ$mՑZj=n=J}. y`F8$ $!tD(f탐G7*,'qvP_3Jb $|vAf?ׇ~I Z9=7nK +j \""sF; d|qOG=S_:mF /nnN3B il‹%l״$jm&xm"E,GWB_R˽n7UY]tHGF,(uOxBV5poKk]PLhH0ÛpBVLhp͓NJiuIE%4*oQIa&ibn,iViqY$Dh\-m(#/`ł vʕ-j7¡6Z:B y!I:6*ƷP-v6-GkAHQQ\,$ $HIutK !I:И6WLvEȴOrCt AmTXl..4nx:]\9!IFWy+*p@%$l ʳ9srC>\ F"4_t_;`zB Cz&4(AHlb` O$ԄQGءETFI!$e<3!lԔkܤ"4ǽ0YԡE6BR`Qw)*70E"!!1YQ߱L/o $2'AHHSAC٨XDm!7㒊[*FۯD Om"2,Ȳ2#2@H* a&m(U Tں.F9?lhDՁom Zt3fRo'[̤!,!yuLFM:BȻC`hJ24F =  !$%6jP9~!Щ4Q盂# ړs67eH6j}T9K zHAHUV6.w%^S*FUnGpK&{ݤgPYGTDh U#<a9uR:{߬0aDMvˎ^RY+2l4K*ϱ_$f W8F+6/Sn ݧ ql;*>фn6›/|qI4#Bt* QlTKɏZ*/1!NJ.nƋ06k.܊fld*A(JI*&Fʏo]{DBYiJ!IXe5}$m)6Z5%!L $鲫 {.jcz Gƻ<%u]BN.:i.L# $„|\t<{\\҄\<BLEѪ:9A+uiB!Q&ب=B)z"Wɇ6f,䤕{ Ke&k2 aUeYsmBb>YAHIp}%!)25h{@XZp1*~(?zL$!BH$dzBrn?B#2‹\{a|6kE2>!cvE6z^ KBe!OCȘ!p2yب"v^3y@{2-[u5,!EChme);M9&%3=}m?QK51CFj&#mRzJCR g¬OM/6CR f;$h*&3^yxB!ЄF <6zBYsȄ܃ ůdr]PN%PBiuAHLҞ6y̆jd{7P?Щ$M[voϔK?j.:<t-B>G b}pn^7#$:Wԣ+ZB#*F iތqczJ׋nҬG@>͕&A㷻;&WB׷Qam^w?B<ٞGLNͣvPHC}Em4e/1Uz.~ !P[~P<~ 1%d=-H^wBR?:$$9Fy{ϓ8ɖlb/;̽‷4YCh'T="BRDB'&4my9]T~FBEʐi ͗#!q7SMU<.6ci9/̡p  #H~ZB=(B-'f[%F1"I(B"I(B"I(B"I(B"I(B"I(B"I(B"I(B"I(B"I(B"I(B"I(B"I(B"I(B"I(B"I(B"I(B"I(BcI7fIENDB`gstat/vignettes/figures/singleStationTimeSeries.png0000644000176200001440000005170714646417261022420 0ustar liggesusersPNG  IHDR=Tr"PLTE:f:::f:dff::::ff:::ff:ff:ffff:f:ېf:ې۶ې:fېB pHYsC IDATx ۺrw;iOIz&9խy/IP<"xyNstP%'H=@ `O{$  'H=@ `O{$  'H=@ `O{$  'H=@ `O{$  'H=@ `O{$  'H=@ `O{$ ~}k#_f~+OM7qX@@>{>Gmٺ=UIl1.`r1 (=c=U_8d{d9N-e9Hcx,O[̀=`XjK9p|5cד+>ܪ ̞>jjͱm1=/o o'x{NmaJfO},MniFT4zN|0k?MN1;ݲj@gϥQMY8Ce/ѵGO{Z-wmO]|`n'sfzd9qD1vhG)y5s.Cw3S;{=%FfQǬ2$zJOnɞhӞhztR{ȵgO3 C=מzE[ML4y(:t,]`ϯ=t(ҞzpIl3;?f{QG s­iOzpIU6Wo ?ikO&ҾdO\1Ҟp#'ړNSϞӊkϘQ#wj=7MSd]gԌi';cB<b[F y~ -G g,M^ӝ-߻E&`O vԈL/I5XRܼ[ӽRS/^=XRmeú'fƒ;/f뛄k2w qF'=6/xf˓%ԤŞ?{R;ԩ$e)󏞷rYo2x7`O ʕKMC3|f=#JwG6Ơ=ƞK7s '{({zñn\fc]@gO̻pĵfۓC]=?إ=UgA]95 'H=@ `O{$  'H=@ `O{$  'H=@ `O{$  'H=@ `O{$  'H=@ `O{$  'H=@ `O{L|43Þ?>7S,e ϯA>'.D%,4kY2Mth{>-#8wrr=}oC'8wrr=~1mitkh4k{-%=T!a"\{4k {ѣFF1+Ig-mOX#NᘕYKLسg }7[>C#8wrr=>y&dYXYID˽}usO\~8c⧖3'\ƌv,NNg}p NN?h~=bVf-1Y '#Y1+Ig-㔥;yYKLسNaϱ3 ž{Ĭ$Zbžp{/],GJҬ%&Y gpq.g;8wrr{<`O ˹L^UJ^s3{h4kY},s8cVf-1aOؓWj#gNK9z`Ϝ\ܞh4kYgܡwP9aXI&-8 d1+I5s=;_橈ln]zkIcXN*,쉘 gv?C59R?M9F)~,UM98Ht_^T d1+IUST{|GSk+踢9幸=2"чz}|4udNݘtɊQ :.F{ =|/fW=KbVf-1k#ij?i'cW&. d1+I3喝ю ZIQ Z]9 !Qj{ۿ}X#Ns B G{oZg{~NE'=YIĬA=Uo2L+=U%7 `y9SGӶ=gUݚڞSt9ayow=i-,쉘 ˵FsؓuϜ'YIĬ՞ З# [/5~=u1^7'PѺ{NLhT;kOU,Sn}4elFlm0ٴyF'Z{Ĭ$ZbVr1M}m2V9nug `O퉖1+IUس'b*$Yس'b*$Yس'b*$Yس'b*$Y@NN.nOYID˽`y;F.:ח-+<7|t%ugu]E/nOԹn1lS׷ wF9 .n˖[#=O4kY=_Vu9}au}yYKܳsa<.dv9,t΃Q~q؋o=k:܀)TuJZY1OrG{\Xo~FܙKd+?Lrs^6}aO55?UPMK?/0^=K{"BoL݆z^ Z}6ѧ׳nsHϹ>8kg&#uIַ 5Cgxч~D |tGՇS_~:=tFC=\G))zh{ϖ=Z1'#;:۳?#pN';n6\;g9}=瞸l$3t6_y4rWbO{&;< ..k]B iž ؓ{ 9(҄='%lOyyBy4aO{x{JpJ |^L ;.wP3~O`w{6Sz]{怑g|#绰faAR0а79-=r 얘ԖmD3:ONFe6_y4rW=68;D ErP3 {*`Oiyn<=,FNT0oTc̽aɞdO8=^T!hmS-gڶ-1~}bpA1ϐ&Z sJ+Ԟcuq=i}{ iž s{=yNFmў蘩A!} s5|SQLO-H)ӛL=?>ž=}jT{z-^~ .ϭk ӿlϟ_L[6-T{E@ (ϝ}nٳ>oĘEG1'qq{{a2lTlkt%eO-xCEL:-w=/>RSg-w;Od$ױg׿=mGb)ݞy= y۩qLE}}g,e@O^%T)f1\ZĬ;: Ǟ"{*gKgԁ=jLz&|4ƌ9 {J9=zQMWj?_0'$`ʒ9˘}Խpaq)fB%!H ܿmvSxr$6eLznϮS=ppʡ {6{ϝ]ygGeȘߦ>~%_3btN?]iY<r8=}noN9'NcooG{O[Xsm*-c|9:4}O".|m%ӑs?W5x=v%Ӟ"I݊p)o)g(amV)u[==#q0Uϐ={~yz+~؞K3dO2$;r %Xd!qbz=g[6wxKH7//әt{z_9c c3ǎduo3=_峧=\Z~{D+1g2=P,m\sx= {lN-Cw IDATγtu~Etz{N{F=3>vg`{ZcFq{GW>tWG:o+s^UsbGΜWBnRgO|PJq륯6ZϤK2ši_&sWs}H!ٳ >ܑPɩjQmÞ:կmG_FJd j{xCL' +K1% vq{rhzjsЙr{=Stbgak0p7`WXmT{3ώ̻I=\DyyB;$tg{{/8='\{.Şд3fgiizѬ\ʝk -ԗA9)8VxЖgٺ+ƞnPFFO;K'l 2m\g$gB{O-gO~||5>/t۔}TTٳ`gpY8I}:LkW=W)Tjƒ6_O0n !c1(b>Iri>=m̝Ѧ!+={<_fn}m}=KӐTxĽW/z1rLN%Ct{9Gdav{Z;P{jy6BT=}2ҫUgͪ~4sz$ۓn{٦^ǩtw$fg{cj}l s7I,խ*UbOf>ӈHzFL0}.Yĵg(hڶzΞaޤ.ŞǞqy l15h@:Ak4F=&Y Dn%[Ӥ-]0|n= KړV:g;hZe,Ijcy ۺEii74S=ZP绗zz.lkӆ{,(Ѡ{dI1%a#r{ޓU",">[g#iqw=S&ō؈ Z =Qb; *9Iܔ:+31od<ʞ橞؅9ma= c8di-f }ԉN=LgX;ڞZߞvgbi5b[\0KFu*8̞O QUNbOyy{5EA'o `4F\¥ZITw{;z>csk乷QtOX{1=3qdؓr!=luX91JsDŽ܌=}cϾ=N(9iI2_N' ({F5ҋ(46>,՞V՞!͞ϝ(ޔ[w'?ٓ lǸn4Rd[sx {&j$ ozF*]i8Sf8T_JiCEoϵFx=N+޴zhg}+ϞyslRX$/>X {ANk9=+;h絧awWl/*Ǟ˸!kjCafDgݺ?Ϣ]_KF-H^֞ʿStIχnޞwiF $%y-s7ys>*: B{؞OAp#d~m?C+ 3gKW/39nŘODk{ٳ%j7fVt[jNʌiEɞ3CssS9ks,1`A3SjnzeO!}ٳ秉IӐ c8j|%hO^ъߑ!{fbdsv= ײ2WeҔtG\33=5{g=ln{knQ>{ƏpRT w =Ub7q뙇ʧ#O'[7 lXC=gN#.nOE9&)H1=õ>'ii{?`Kl0~D<$smnjx{FH*?ZjO7:C/[&K}e%;>m:C=#H+z/QL!/)f = yn8O$L1-u|#joyW[*&_Nh,”ѧ&$'`/{6{} [sy;J[;K;-]w8oǯ:q*nie޷)2yVIȱFo3n۴Vױe? ߜ~ƺb U.&ۘjXXUz N\N ;_ľWgz;mVkĹ ؐnFF1s H5d{ g ;(l)Q~Oj1DSe^Edh&ɞ3`O]? Ӎ8{ Y/G(%eGŪbE\Q̖aϵ6$T>Q _@'~pP&١L~q=c͋ 3,萈5gJY+iF[[6Kөe;Eݷٓ|p0;}gU>=9u4W5I\*[XEd>w'zuͭ Gmq{ۓ,iψ:mOP T=}tפ ֶh={1{Pîzng,lHQzNŴGؓ3nOZ׬̭_*?_>]3m7δc3=ɕ"Ϙց3G6:.ӗigOxNc==g=c9j=1=-ynqfҬz4%MY_fv؊ayi-v|ű|wcO_bӧ fbU}ʿp?ΞHOHHmm~䯏e>(!eṈI*$M:=A3ٞ4&٤I=ӕJ>Yq/:Z=u兛~O+1tr\Dj;߰VzGbʼTyt*3Hsg}*\-;Ӯz¹b͞2T='",hϨ+^h{FtM`dV}W=aO [t~b$THȷbuT3rD1\*V+{[st1sl{?:;nb^bbt2wGBΓTc D<6ډ)Nh5H{΃I幄kad5lϥnnƤj,j$ U>'^]t(ؓl'S:>wU ܰ6u7u{&3c<9/nؓ v&س_Wh{&RTiU$Z"{37t/ߞᕌ݆6{ ){ObOsh{҇YIwmsƌ•OߞƏZg!Wѧ1?gYe9By_-NYӞY|SOI1Tj [JX4k`ٞwVh|o.K$P2yv՞^dvDUVw[F5̉Ua{O0qn{g=e2aZ4;w\Vm%b={ᮗLnJZ opݞvRnOj~J6nÄb=]fuu]ynYI'?g~pDU=WqL v:ֽCa3IS9՜.h{*B&Kpg=㇍Vwdb=g TC4ٞ;]LoO]'Vƶ< {pglsxTnOz5ŵ uŶ^^#iCsaތgw14NwUV{Oazسi,ij%؞;hH}Zړ9(,`OP4$ȉ |7RԞwL)K<1wŞ[T?CF)\qgsaV3"93p2O$>lH|eO:&$g,F)6:{nlDgy3a23_0r"ڞFݞt_tf|bԞlTJ V&ՂdJKd %=ɞ}ԞS5#۲ڋ֝n 7N W=)KKG]ö5ұqMg=Ϙ|zNnOs;$na]{&gX4iO0fy. ٓv> B} Ԟ1i =CbOVeed iqPf峴=e8LyR̞Kcܝ/$Sӟָ&kPzž=;=[n,tOzMf{No㫞e{cpj{iT~{)KђPEQ|#vTΩhFHȪgm|43Js,bۓ칭b-S#g r9-nKi#: S4]n6tDeT>=-vҐY?>7s1_ȫR{U=^aK홵fgJ=Cg{*WuZķZ ϯA>SZrf]wL359Dj؆I ;}硾4Bw#3wsEaiT=waoO~rA`'Ad{ꘑIUr[L}g{L|۞ߞ}h{ ۓsIVjO>ێ1 TPwg>|}|ϜŮ Wkn}3 l~5N"xRޤeP Lm^@Ky'8*=}ZJkt42z3Og.g ӖM t \C@rgLJdJVd^mϻ0餯v7SܘWUO~3Q );|70ې쌡 %q'ߔWr_0=gg$Vg?eX$ĞYhOfkTtN^Z !70W5spFW>JN^- dhB 9./0ogGQgfn_I+bO׳=:_6}CjL=`OjΜY=IU>)YzRxdϸOIϞ:b{FwzWgO]zt=sħzvEdmO]s'ʭzs{[=_JΖ_#PЗl!Ghi.^[!\n4,aO{Нk!`O|jώigD'yCs7f+-LI&{Cs䕚AO-qNPO 2.ɒws'O{1e3 X4q1Xty3nֲ'DޖV.=uՠۈߌW7JTYzVG|UNMrdSyy=;gVcOos:ҍb7USg{#S;۳~[j}}]ߒ^ؼ8@OL{t!GU׵ο~\c5>1-[?[isוֹ^!wp:FAc1۸cp= {ʋ]i}VyCUO)ݖsmy\ХŅ>juFmhHog yk~-=̍` ۻ6|YV˰sGrat 4#*̭pa1YYZ-{O}q( E5k3S;c}c#(y6p[ ,e1Ӗg>#LU3ƞLmS{9UOghqFWN7_Lgg NGNq./1bt|<3<t+'W,Ny{S*׬VZ߭ >#wLxR0& W';S߸kM)yjy`.hڼֳFzb:%uT4*]Rz=-ws׹;'_/S?=Io0zǙlt[$Mw'_=gw`hqq#L3q=!i=< nc\LK>|78j9I2Q'GL{y߲qWҴM<7KLEZbܣQ>p 3|IKdHRMQunŔTkKy:-n8a fBy=_nJؓ )%KΦQ>Mu4<6O'V>ړ9Uqmc=O7~==}lS6LF<!n\;k=<1au3XY^sgQaNf{D$"Mvd*B{'ăы3bҌy$,ExIY|&䘒xYly,3c)=ia9yy[*I\ p hKF|2;m'n:s3;$w%\mWj!i]<ž6 WaOi)49(?w ՜ЎlcLZ}!|iaoVV44= sj{bϕSZl=:\x:4{۳:+qjm;X֏8h:Yf{i͙=n{CR9zyL=L uf{i@i?+t%;ƞjwɲ$xS@ОCީs.Xr?Zcqƻ)fggPЅ{žDJEx,'nQٳP'M`&MҢyvbBjxq{͖$iu4+Mv(Ui39Ds7 HzEUߧ˜!:Zb%$QsOY3 e/VI'}Jy ݙҼDJҼ[sCyA~8cVf-1+Io"{Js1myG_{^W_5KqV nel>/O+a6UsC6ڟ>ޚ<ؚK?VWZ0fsH:*7ޟ WRg:GˋJ\K_hO+C|?Ef*f<+-yk`n!)pP|U{==,|mqc1|Ľh=7$\>gɛ)/ƛp}2>>O3WCh<-7pEs1[S;yT2tfOZ~X͟i>i}GjRJ_dO;GcNbzV$ *Unfzl͉[-Cp˞CusJ^OtCN8r}5[|3hJ\Y%K/.=ٚy55B=>i#{XKm_B{T:5_^$}͔Kߵcrؽ[Nf>4O# u=N|yjZÉ(m&5yI5{Uu#猿Z~R|=:lYM=2/VH3n1d? Lio\TO_H!ΟIPɎfsҊ1[?Y鐭)ȓ&\JԞ~O9cin͝!)Na }K/Ao[:<_KF'Q|=1}J27ȟ穒_ϖ!՞ Ζ!b9oMa[Se)~2 =UԱ;˨wCPgz 0//Y=3}2'CVS%3cĜ'xN 9yǟJ([S[s6n}de=cQ*,Wl:N"{=//~4{ߞϚi%eJ[7!O1az<6SWɚkĽr;j)sIps_s1U>sn-6G=31jEӟ>7}ElI׹;)&w"OvHo;'e}yYL12[&)Ix7ȸuk }kk*2{%̊r΍6q(7 N,}3wD \{>cfI{<>Heh;VzCoMIGlMzܩ(iO\68zgSe=//>-kVr~O~S{VeO߲`ysff7 4xsry6)#J0v5 | #w|=׏OkS|?ENSAU2 ojf{9hBLPUY^cglquz|sne`R[RMfD@;s2-$ې۶  C`) pHYs&? IDATx콍IzU{朜92bDL%b$$$,$FeaH .$127Nlx ,pYޥGwUS]v=~]  ڷQ"AEF!B  *0 AT$` H(APQ"AEF!B  *0 AT$` H(APQ"AEF!B  *0 AT$` H(APQ"AEF!B  *0 AT$` H(APQ"AEF!TQAB*e%j(Rpa]~S`KF!MB4- h[ 70ڹ^߹ϴW{o4VWG}j}hqK\(}5}2/=zqK\(Ŕ8J%'`sĊ@o.AڋntFuĊ/Vb/UW[(/jK?P(17_o[,D-WMZTm~] 29緖_}1 +&OWiG"YmOӳaaMҭCqiy o1'-ƥىcTu1GtA41jKy<  i/J4~fxŨ8ySKNLFjFvC4Jpcs~7x5eSo-DRDm1*:99XŜLνKkƯc?4~fLMn=1 K^ z7|o-DRD1*pO_X0:Mޤ{BF9M4~fxt_NLF[c-_WJ | ޸2;Q[&M? 6MazksI)c/׻:F6[#o,/]7)O  3aF=Ge[o\Za5y':H]Qq Fb zd5Kk F݌5r"raT4y DKIF0"Ќ]'F;Jz)MK]yj6atzKn`4[.ʎ!q01[rBMob,J[۽tot62|oT<߂{9#+ 5cFӱQr-㕘F4DKn6RojF+z_0Hup 0 Yj3b#y(,ٶDMwԦɋ+Yt8~HFߚF2;QyIk$r0?@&0r~d+x3"m&nڌ'U*'cZbgӯn,$)hc?-'QolRf'jQVmnm31Q|[RJ ٭ 0 Yj3UOLR0<:>69J<5_oY~ŲL}WCḺʵfW~Fy~l,>TgCț r%7caQ+`tS4_X1phF7Ձm=4 Tw`,`tS8ށіC?MuxF[j:F!ZH1JV (C~S`KF!MB4- h[ 7;,` o*`o)T(D#RpQF~S`KF!MB4- h[ 70 o*`o)T(D#Rp_a]~S`KF!MB4- h[ 70 o*`o)T(D#RpQF~S`KF!MB4-J0 [ 70 o*`o)T(D#RpQF~S`KF!MB4- h[ 70 o*`o)T(D#Rpa]~S`KF!MB4- h[ 70 o*`o)T(D#Rp(01 Eu*o)T}χY[ 7U9F߾`+Rl-T,RpaG盫!}su:[n  orNzbUgmbMEQ޲GP`KJ"q\iMrێdZֺ~SlvgξCzvf˶:kMu 0z#&-Ζ 9a[_U:P STuovV]EM*1zηG6(ʂMu8s1PtB=VBbo֥D;$TG?7k.*us嶭d0 եPrT{6ܧ2iz>0j5&~o|mk\^By\uƟ[btsa>,=8Vc:Fӯ;hKpon~JݛΫ7 7F=ݖoV熜=_TWU-uS•~R%~GkJJw{ >ku!vPVNJ>wٖzo3R+3)mUpze*e.qwwU輍%U`.;Nu+ΪsiW[2YP>j!E}Uԍ%f˞R7UnQ 7 >걭r'@>a*P:iK7Q]37[u ?և~9GhhfNA؟UN{?0gWVi3:hg`4gOᢶis?naػMe?͈emؿNjY4n?0ZPJKP^?0zgFm 뻕?{py -fۙpE{=[v*F#R=J(oЖ6H ~4~ b3D4yt3wBSJK։1չʼ os8oi홳hɟQw=Lea +MQ,ܗufĵ] vDX~ܱ-Fm ;u/b(귗cw#F"1we8ULct%o 'D *u0 ^A]^tO B TfuXeh˟ѩw**NVPSkTV+:@F/נb5˦)״m4~`yWWkz\`IEhUmϊQ`Q-~R7ݟ0zHnϊѥrcU8ܟ1zPolnAtB6=@F)J)F5nK3iwD&=@F[Gf=҃ؿ;xQ2PߊhoHpGz9ke$ooAvdaYۣhgǨ\B"jK?O4aj;̴*4~`T|Xa(kBz@QY U~]Az@Q##)[푑C&V!}?߄h͞Oܺ]1*pusBۦ{QF5ƃT;Ro=RO @z`i \m&Ymn+B`T%v{~ qt])-FNH70-O?0~tޗXyяu6}H5Um'蛫U|%|3|(AMG8(ᄃC_~obtiqzR|~̇||?*MɍCqr(`4ྯ_~o8Zo_s;߬-ݏzFCK DJp}sŻ4oFtw.ڞ[{qw߱M쯺z5~Fmu;@?E%VI@2<qt~FSQm2ust'?ݩohFU%boF1݋ [ȇGOjvu ֋90F}-=1[yW p; FGSNM 5 oL~?F7.ky}ǬFGhh4FC-K0٢?hGڲWĨg؟Yksc(hI${7xS>:G#1*q>KRT ۯYHFͮ{.7.dchnuK({:_@_}`,ϊ`t a4=F5({b (U粟 FuF%}|tbbR/c+h$GOdU7cT=:&qustf!x5L9͇hwߙ~O!Ǩ8j<]9z&aWt-thzou;s3GFGw#4~`4eW"1٠] dR&a;scTa9zD'Mږ7{BR1єI$ƨщ+E?c1/QMݢeMhooSF]8*at䨻r EbpKfx:[n+&v-7]=-0pTǨLQ>'9z٥}?Hk11::MS :ECw/~sB}z*F S1ʧ=7=Oѷ/G0:sĨ}l{{+ޟs5\4;_ш6xMhۻ)F'1:qTǨeǙjNz' Z)JBs}JE0a?0Qtt~I$QO3UR_ν")-Nm\Me0#G'Y۞|D1р'hO?`sߟ9*5m{ a9n0t2"¢0*qTƨ@㆐Ǩ x)#G%zMA_8δ I$ۈQQ>f=aTh~Mg$F4~cE]0⨜0L g=mѮ0zïj-c6"х쑁oGY[äצwυ\%W]w^4: b4_"1=`trL@Tfڜ=afEwq솷$눘zctype OĨQ6sT,6hJ0pT Lz{z-J} G9FW *%+(7iL!]q߂QEڕ3@&4HZ8>-9Zbzy 2*؞}>Qѵ+eOdW6< ]`0=>^h?YR) Ś8:bT(ǪQmR dbt1?$-t]b(oIQGY6$IF 9,թm[[Q'VlSIG]ct(cT(zr"kRÍ@F8rGw ^胍8 FoيQ1#T6 *8`t4noٓ n[_bT츊9(:XuQ6QqBvt#7JM1+ǨcOdt-/9jQUMMFlVj0*qMwBmm~~~> n -?sQ+{&GUrz0*8N~dkQPGijQ8*.;&F?5W1+Ei#F6K4FU>9:|ճvTt:F]h~F+G%JH=y(I[jQSL,Q N *h}h\翌oatQv߅Qt38F#b98Qy^c%Vu4Q~ |tsmF%NJ]0:p0:pT28F#bJ0mN ]{9Tt}+#gQbtS`hՄF#up7F-{ݱ[1j<7Rn-&8"ߓE59[G'ۘLQ1gAڧ0$F w:15GQmrc5߳jBk FbtcS|ieQ)稽SF)3-_Y0:qtŪ<%2(: i<4G˘QGmA:>[㑈~W|](:qTsmsԅэ9 Rn/=V(ĨQ'F2!*D59 ҥsA}odtb|6uPt[hTG5V:Ү{0qF`Q'E5lQ'; FG9FI 9Q)zON )_{^e@pԇщk 8:Q 2DQW1tTp4Ч `'FK嶁r ?FUZ0 bj;)jt N{m1c00RtIQBs:ߐx{:23]0GQmC42'FPCR^3WY&G(/b*c<{1A꠺w IDAT#&^ \x;(:Ee.yu2_Rt;V։1rԎ_ѩL[0r7xNH-ǽ*kNQ*&N):a\,r$|"0ѭ8 n,Gh]#Yy!frZeèyxw Wk<Y$FׄT~Ӡ>̤pTrd:(J-U"y^CBCdcw6aTNGG:Q*L娋|ckZhCg{qpJхLF/0r}a˙`Eatd_W飨$ (at0+FUǼ5@jp"k1:_lǨOL税QE?AJN`t[@D̤徽z:QHRiH ST娺dщR_ǼA~uרʉk* PHQϤk]9EI S? rtԍϘӷ3QQEiRD?FG/.g|3,Q}ƨ EqB9S: S$ |9j))0JmD9,Q#Heگbt\\DOm[V )2FGN2HӐsYeʟQoA0 EK a}˸fY(:h(uvW kW RAQ GI-׾f22q_YP`vۨ09jb?\騙Z;cH' F:oJQ rԑSz)KGQH蓕#F- (0*e> uRt> QGO:AX3QQ_2*c7vo}`TNGsD$`tEKMGs?\SQQ Eg.ɣd 8Th^ٌP~Z6VhBA~FctgόJ ;F#`HFhwQ?FSGX E२;hӞ~W- (cA@z'NW`v۸"1m- F )G$㥨3.]| G 1*wYOLAQqύQg:ڝ8TaÙKQ* Vkh /GW~0a^ +GCɨڂFft@Ĩ?EWrgB+Sԙv~FG% U((?~*]oO}K=]FCUC̃QKl QG d陣!~j{rt_蔐$&Ehwľ=S*FGJ>v5 iEm-Q ')05Z.=vg_U8 2Q 6d+{0NOl\F)b1jpxA)iɨOc8.S F? `t W1cthV2*OH ΌсFi$e>J()0T^ޯ) rsTh|G'g#[#vߞjmOh`Qc-9̂x0st?_ pt$Qeѵc?a6Q-$X5;ϘckW70jKGg} ]Ş٦aètFoURR?FTE1?Fş RR2zb^`WD^G5j51`ZuHMɨQK: SbԸ3ẍ́4> Pf_QsӰr2 +uVo>rᲜRةѡ'z$Qh+zLGAQM- 7 F] .0o}Tҹat/gQy&`trBIQ*GU8j^I2¨F1r4 lkd4.mƿ~KzDRT(30: GBRIFokkIsd?G *èjy'%1hO /NG *`Tߖd4&ؒt Rj71*?3bQ)%LFm]eՒ(*cj {FQ. =2/;%¨9ٖ/sƤ=[ |31,*]Hj8m(0JmAfy¨xcoFr g:jbThBؒ&'蒘 vQ)X4E,HFmKZQ[:Ycm,' s@bQ F%z77(*N@2EQ#A,QQ+Gw]$$hEbTNHCѬ vFcthZIpC0 rZQaZ8Rۺat}o7@^Rm&SAiިW@h.FׄԲ, 5f:8Xh FWZTh 0~#$ N"F6Gy$$DQFg6 hWct5/oǨ `2hdKGuU9¨QGс-2 - c1%1 v~ƞZcr|2JGreuIy~1ZZQ F:1z_ W 喤qԏP8{{?C <_:Jx:7QFwbt#$Tk0Z10g1*sgE%bsԚj-1-mkIqʈwxі.cTp4x( FiJbv9*ƿPT?`hau6([͏c3%ХkGܢ8QN>Yl&GQGљ~]'"OFQmb&2GO,JOhjLQG1ju!Q]\s`tNH-騵 VQɨQm b59btx 7: >jtK 1*8`MM3HZQ)U"Y,mAI%`hF܏JGGt?G^}q:I Q`|ےX FuaYXxJGe G0FhF峨oq?Q&z(#GU(7 RFۖƨ 8僧bԝ1Fєp4QS8QQ>9E1'FaxNԱOZŢ0r4%#كt8 Eg>^RMG{ dtT({β1`Z3muby<(K6aT{8'DQX,C'Ѭ?m#f1st~Q``T([s${9.E%`ThFs@jW?k7~8 id--(J̡%sQQ¨6?`T`tMHg*dFQ#1r45(1=FG#1g?n/^QF(;GTJJ{^[(9eɗH.M69U@Nq?=縟"ħwL5 $e+< o.W0PzbFebTY"a%lZσN̍, YOR02`|䲴/ jR- z(պ(.w߁]\Ēk<G8 7& M9Fɷ-.QkcHJ9у`TvFK39z+GSQe-`|۔=X>]P"F Q=_bQr>ݷbtƿ1G#1-kuz0TZ0S&:A^,Q}4=F헰$hGw`?Ya7hLYl+*fѴb_ez #G#1:ʴNMd'ƿ~C~zIDޗRW2P (7Qmc לbaD {0jֿ@NuߏQ3ètt~DtљRg2*sT<wF# HO3Dž1`c>IO{ 4~Q1z0F=sD0uvD|{bn9ѢQ*h(S1/{7k*i~Ͼ0-隟OS\F#jQ:mucc#(a2ڼ+u@j`thF3>QijE,;HwaАDKe~>\f[(Ϣ&.ZIIdZox;9-bb4m)}Ư>2dǨ:XLa-c }x"K DbthF a}Jt4c|^(qתRo:JJ)(Ѷo_ oIo>rVXJ)}87G@u?uNGQ7~BGMhF i?ۊ4_uy*,R6h^:j?JJ 11 a1:[oFcthv^0z|:] .8=]>_s|6FOgè=%h(}oёquV_$ѿ>P30/ȹ/8P ;0j1&Dy [ӡaThèSHG{Ǩ>Hj:QK:j\5~WL`קghtu6>uȒ0ˇ0LPlY{ۉRw 9aTIH0j8DChh&F*'ƨ ʥJ$a;=5"y%S6Z (G9O:ENi!uQB^F`44~aqcn3/FY F{W6{_y{q}7ܗIR^ϷGEQ$t>}wih8*0|$27b>|c}&Oy,#rc jїfu_.)蜐~RdfwŌtHѱ洈*4o}}&c91/r$XfYHg!޹4\.ؚFL}S0z_\t_Iѱ00Q-̫k¨HHلс{}Wd2z#Y^dmicE~FMIGٯo\bړd#8 _eKH˯Z]Ok2daziڬ5q,y=4Ž}ƨ!Z#/O̖~U\)@K_y?+:[n;Ϛ{ҳ8yF Hο&dGatٯ8XWS6~S0zօ(^9:;蛫{?'&CǞ}ƴ f7qDrA6‚G΢0:$́р@ܧl~)U0wKQl.h}aUgm+G[ﲋ95:t3fB7Ɲ|Q62ݏT}ݧmA޷pU2uJR̄i7KΖۊ)muO1糠jNQˈ dԝ֎~ON^;>Bm_? [1)(JZߪ#eqlm}Y8:n*Gz#O]I iy;gn2+¨Q1Qu/Ǖ"qTæl ,O2yIN`x8zgY(#ȅn ˍQaQ?G%35BelH@Av/(ј J,}B~4$o{h[)OKB*|~u)hQ=[Chpw֑z'U]GJ vШi{J _w$P,f&Gc}rkx9Z?QiOuƱ;k Fb#+_ƨlVSa,ceFSwQOˍ$h;(QvݹP=mh~Ũ5e;NstS~8}eO(:\Ypuk986#F;Z+/CEX-#e?!Xz e'ES}Fr\BCYk IDATnN+؎[F35u1kFn?jX F'܏xYZl>Y/b=4~`ԫkOCC U"9XFERT> ը:mChEo `4V{RR0*@rbw]x[ݲvb?0ћ{7[Q(eu^eD64~]1nF=^^jݷ?%JX\Fz]Wm?K(7U[Y9s4ȎF/o_83~ےMh{]Wlȷ]&Khα8G ?u'-T&bP\Banjٽ/J1:)s,z3>=?Ql+/u](-`F{W1_ud^nGٵyX·`n)kČښKo_?[rp(JbzZwnW1ˏmIX3%:Zv!&g/(öwenN׳?^+կaAiㆶW"`u)<~ACZ~4~1z\{jPwxeڔmNeJr&Wr]ZRJ=jjc-[tٟGύQ~SEyu4oP;iq;ZdBQ]4c9O͈k(dO=s73ct0~g΍n=w[cv7b-)] d'[ߑgo(2]coU&ƞ0jz2GeDY5?y?9FkZ\ MZرɩqL_ZO.秝pZX?ʖ DdD5*%{/QS{sč/f#\YLRkoۺ&늭A#H?0/ʗARaQ5Jq C{uY(oi?ĉRJY[uݺVG3עmw?0*4O ,U ,V"J4c?|/X"#urM>J1G層GIEi3S:w?0j1N: ޕa_`u"K7C]Osu?i袷|-l؛K~A|BSB̿Sm>ԩ$XVF{gR7W쏎͇FoO֩0:L2[; \T/~>țkUmbRN~MvTUu[p yWKhQ?/QbZG]C'uk_?SFUͫoysn}7˲7AL}O ֮V@RHiܯlD5?J~]*:뿾eŤx;CI>Dj?w?oOQCjׁ-qci3~9saJ]{N_~+`SԵLbi|7kѐ|Mv1 DKJ{pg ,bϟ/)߯p`sty4.!mŸ]<$Z 5xTk,nk[FRx ~[$w_?SȢ܎jlok?PFzx<7LswƬxLv>t3Ukog_ڻ]atS?0_zͶPa^Q్|`^}`z)g}TA ]}Ȍ &W goi[F=Vl$ok~7un"mH]GL,b.Ը!c9&AiO$~۟5~`)5E`hA,--) xeu\7.M/ h~WX{c)%7pO.?HW: .¿*2-hZ&@j<]ގT"ih?ܿQcyumk^z5?`B(ih?ܿѐ̹V{{]bU*.o!~MF#,Vtm= 2z"Z4~`4iDZ->($n }Ov$op}osJOֆ!8_cb\k~ڏ[_{TߗnhƹhCkWz9?jL<'@ܒ^#ڗLBߗnhnģ93hfLB;Nir؍jXi^1nzPOF#`pKF'U%oR#qjlJoÅz`K~7X0oo]bވ'ަs-[ih$X[Wu"U w$M7:l$ƭxp(mJ-4~`4GbYu͢v{~iˊ,A w 'F _?ܶA&mnl+=oo)Thngy \{oZRܻTտ/d34OB< o*`4_oILѭ/Zxk}+QKoD~yt.սq}Fo*iXM7Wsq2#~?|&TDʂ- [~{+zymq9"C- %ԱD۵c;1F샿~[ 70J#n۵m˦{vY[ 70J7 _'buY%xOxxo)T(=([Ҽ4XO- cNbsg`KFI-jc~+2o)T(Ow_De o*`Lw|z V- MlƖ-J_ u˿[ 70J_`f- h[ 70 o*"Fnr;mVgmbMEeuZQr[X~S`t1UTu*o)TeFUgmbME%b1TgmbME4$0?wu*o)T]^~S!h[ 7(,` o*`o)TH[ 7)F1oĂ-x鼂-+SL [ 7-F$/Fw+Rp0Z:[n  o*`o)T(D#RpQF~S`KR0BvMB4- h[ 70 o#a d? nB-v#`o)`P`K[ F(/Rh7b?0 [ Fh1c__~zW~&\Bdov#`]i5>_oI?}̚Gz?Mh7Fh%~CԥV}1塣۱~n6^V0:@p/iF0@C|K~FZJiF0J/{n"~8ސ|K4 >s9>y1__> +WV38I,꫶sH3vUqwv#`\f矜6b !Ti6cc?xRGI* F-~1W(Ŵ#&`zŦ#SO_|g?O[/SX">2V]_g|%~Y9otv#`\/4mBX)'Y9^N=Di+3:IGگ`uW?^g< pn yR9ΖߊY?\F\X˔[3Fm~.FqB/^N0ڍr4`]%K|?䟆̷ܘXS6oBJ3MEcve F  i0yKt|h;Og~Vm%_0܁?iF0Jnt|+|F';gWsߔJ1N0ڍQ:d|E6zIpχWcTfRi8Mh7F)J̓+?X-f|!+ _Sg| 1dCJ3ʂ?Mh7F|ub, F(NFF|ub?0 0 QQ:B*d2[ w#`o)ߍQ(_~7F|[ w#`o)ߍQ(_~7F|[ w#`o)ߍQ(_~7bVX(do)ߍQ(_~7F|[ w#`o)ߍQ(_~7F|[ w#`o)ߍQ(_~7F|[ w#ݰQ.RpP`KnB-0 F(/RpP`KnB-0 F(/RpP`KnB-,,` F(/RpP`KnB-0 F(/RpP`KnB-0 F(/RpP`KnB-F!`KnB-Q.Fo'Uh-T,Rpb`Snѷ/> [ wLGWFBł-Q&F_? [ wL޲bcV~7ei)hێ$['ֺ>Tl 6voҳcTD.CyurM"=5FLhʞbFK&w{"Q} Rn5/DZt,Q*o OimPF1cQU%}X5 Q=Fm9SY] 211D2qTuh'ǵj.uǵZBF߾͓L;>#PE ::DECLDUhJB΂PE(/>{$0Z]y(];">+w.u/uWM(=w>!`^mF>T&`W{ NuЦbRXhRo]V=iu:Qze]=r5~ױjtZĪIB}QBLmCYm>F(6tweQU.`DᕲuGKE -ICrpm|P ;)p*0Z(0}p_:͏ҁ,`DdQLܶ -5&&D mh0j\7ڳF3vG 5oZ~l8a; b-͉ M])u*ba'qr W絋 hӿr_CeF#wT7R o[ nplG!`4f/c#yUv a0l"ys7{vvGm4jFAnn"`tmp_n)࠳vm;T`˧JC9:8ֽسQ5KHyD.`T|Ir?Wz"z0Ԩi-&{-?V`mbj= 敗Fh2)jQwwV=b Ӷh7F-jn3ٚv#`[6vUpR-Fa\i@TF]?^#'!"o^d dpwY\Dcc<G%}%lɵwd{{c?0ڍѷ/GCގ/Iq ΁>ͦ;r"|BM'-,9[a~Ӗh7:Fy#7덧%b߃ni?0ڍNewEuwtI6 ߃dؿT]Ls4AShZ(.#~h7:՝tQT*a6h'qh7bhX-[YQ{4Ψ&  Z^DcFErr&$s"`?YѬ2:jP/Fa?Y@꙽a~=QZjk?0ڍ2(#E:h~`% ޳P eﳫ24FhI!(݄όMzFh&Χ l]SW;FhaϾiNث흃i$dBO{p"0JPfGp"0J@UKDwE!ۺ?nFRTJ}#at)=v#`9< L(jfcpNFљ1rʨ7Up.7(vk?0ڍΌQBxA%y vm!6E6~`͑Z5qtT%nL|?e@$FcZ?V!kiF(}sL@c}.D./@Fr>> IDATRqͶxl7SL*Fd"N~ τ]R/oc?CF * me2ItT4H~wٸB1_9[F a2Gǘ.)6~c6oYdFXQ[_ܛh7bPXu͛9 Ga'FUa@-{˛+ Emk+h`L*l0ztnw3ctk3UF4ƅg5)Ňmn~`a_}1Uh0(c:FAJFc(0j^.aQPF߾,s D2{bwUS/ob30jh~`*Y0:ıdjJecpjt@QF/SS/Bl݇$e"vms dʑϋ=ӈ_"Rݏi}^ĞO?5@dh^0z0gިdkĨ+G0*8:GQcqDցq?QÛ5!0:tb> *t)0pt rKNm@J X1:'J+]6L vL-Dd:"Y1:pTq}jNQ6St vQc賬ѧ3E厽Mѣ@ L3W>6CF0)*sT 3{* H^ #Gg. ܣP L%6bsucThm ޫQ+EgJW1I&d=ΆXqFN]h]6hAN1OeW1k*Hуl\Gcè *G'y@_0~ULS}U,D))0z09}&ߟ ?'~v֚ )`*Gի*F+t:ZaԈ0F2~}VV )~3Fjew{+F+V}΃јb#yaT(QK2jn倻*f90깊0pw ޛGkݟ}\\FH0PTz{2jTL}1W1 Oul9$j$CFbu_8:]RRdG0*>ՙAFtt]هrKrgD_Ų1:qty(k} q`T uzqTZPG]yu^>5bŰQDG0*aTiie[|臮g_~qg`Tq({^żuO80z4R9eU(:p-pT㙣82#yFojGatpQ,QDCG0*8_fd?FDŽTd0ߢc${=WF=*槨0z4R92 F98)}v4g*9cKFhVF5g_/bGXD;s*0*QW }fF K \ctf? PTOH[,`R9aR)*s8V)*n*aT~OM~;*\+}\'ǨV(. Q F]騍گ@Z@V߰Ĩ*è+^t疀!20cT-G d=@hC { 1TO{ ʉI]8jl;EُQFMMMh:'|[VoCFr0a0:QkGN\Z7ܷQk\0*љi? ppY 3FW1/F嫘E `T*H d=@T}/ CaSMӀ~EcԖcMFԵ7 FO4tbQ.>elu>T,`t-HUj?9Oű24 OaT?֨~e(&S܇2ݮ#af=GA~QO g`8J K _)QQ蚐rLd=]K G`t)1F@vWe2Ev3fw}dV $ӹ0z}b-(YJf G}kFQ:M ٿ,he1KL Pi?0z< |gf>50jp|9*ubʧ;Oh7:=Fr1ʟZ1jR 0Գ[@3CZg{dTo-=&*n%eat|̤@d7Eu.Zp`T~i~`:FFA@.èl HN)g\8Rtu<GXd2d?0z@ efBtΝ!)*HfwިwaELc11oh}Qc4]Vy"r$@f#H8@|e3MSF5Mjbt2_uHH uanG\}PPR0@_4_@3R"y dQ+H=x8:'~}FiSBjynx%u.1>J '>.<18pF2Hn%ksWrw 3(㗱Ct6zJJcI9d)FH^޻JHq83k1 +wK1:/fĞ^s?=A]JRcTD4􀢏Ğa2B=SQG"R_2hFr0^Qʋ.l ih6}xKʺ9ib辺<hgA~.E [9j -~wIHY$EGC kBzGׄ4ꥃs*0Eѕl(Qk$ iƺO<#,Eщ g2FbD_~n e'FGW9(^U8jԍѻuF0)0 d[$'`t^ d-:+GQc"i}h=`rB:Mё @eF}e30}x&!?q,w'm 2ʢX&F#b>J7H-GCܱpch?FeL52Vx4sFr$W1~0Grb#8jaT̘0gG] n.bPֹ1Dr*Fy$3_G=ELsp2¢/brBj?LTXݏ~.bPpY,y8O7(ߛ Wfb"]Ġ2޲5,֨up41:=?2чV8 F 1#9 QǨMUZeYwp|frT_ch?:#F\}">0˒0r4uڢ9BmYue$F} =GfMHwutB}D _ HVݧst DɎy\XQ})qy9E aw?/_h0`5kd(sSm ѧ9j؟Ql2Eуl%yNDZ4Ȅe1Qb*CB'FG廯ѯW1GDŽ_*F@qD [(Dr(ɨD\n<1 W쏾3>(0z2Xc!KǨ_ ;Wl[*$O KӍm &/Q}u?VNҧPIM̩ct·JkU58x8"ci_O5PKa GACUt#}w..!MǨ<ұ'RT29}֛/v,FŸի'\{.bdԁыr+O:/Fc)@~fN٧&Gj2+B ,,}>S|[9|{QE"âv`T֍}"/Ȯ8~{Ql7FcY۔[s腹1za >H՟ MLF-]g;t%|+G9(UFO1EwS1z'*LF/*G}wJvct|.Qz;4`cc??ȇtQLGD{. 0/c?]CLMыJ LYTcT񑥨Hc6s=627&+a&_b3I%}4|`~F}ΈQIbm|#?d3FQ-ehQwȫJI?_櫯 ath&FMiP΍QX:XVȮ88:O2k, Q@vp/8l2ÇGAt*hQFێM?E iꉤa̎ ]i%f~fBjIptrY a܇(U=ctԱ(Ee樉 (k: d#ܿГo:1Jv}T'r/1XF^\98L+bBO Sl \&l RѮ܇HU@(DVѶC" }DO&FW,e>:!*)}Elv'`Wme/{r"UFP Bm/AT0džG6-AMQF~{X/Ulg/!Raԕ'Bm'Ǫ0{J׎'Qb;Dǀ_rZ5"+`["%z;ᄒ S2zs"UF[O" #w&g;`QISVud*hI3,Kk:mv}TE4[֑PVѶKmvc9rzD/_TC* ɫTѶBqjKEXm ݟ7gg|é݇HQyȋ+Bm$_mZ]p4Gq|4ڊ"J V=cVtw#.b=Ev# 5ZM7hRqomZelBQ7WL>hcAqbuaFQQ~$ EBm,}䣡 ==:Kxx>5?/[ .ۗf$AnTvo7pBBmGE81.;զ[_kI+'~iy*F;s)h7*~Ph6{Z0*BY Jah7FSwTKfZ"y;"m~-n&lsZU!=5)vdn~%nu+H1Zy1)S c>cnz v;oh8vS^LHiS4#v#`ԫkˣ1adV.a?U#EakwwL6Xy@vڟ[懲q}BVwȍdx[Z쮫?jE> `ԣw?wqMU<\ {*v`/w_?h+β>Zڟ79bC$:=Fkq+1wms51:s:}3>dgdDCʎBiﰢs1ze 9fc\r̜HDJPfX}>y כh#2Gh̜^HZd+6.F1ˏ*)n| f/(>~f% wյF̽RYŴLinI3/kϫM#8fڨ-_Yhl]6϶5t ;IDAT_uK;kd?0ڍN|2WJ7UB3xsEvmGmd?0ڍQ1b⽷SbA=jJFPh7:=F_?td5gYPc>n[(_lڛh7:3F_ً{ttUɮ;(#vScrRquɭ{0#=ng?0ڍNQ7Wߔ,̈j}͒Gb5KFѹ19%_SJ8&/;7Jl%zmi?0ڍ΍Q.i.xIJb^coK=>4fcSn2sAOEU(~4LLFsҲH`KnNq̈] |Vy<[2+~Zd}v#`Thns=}_)2m~*Տ.znrMsnJ&/2'עJ^<8D~g֏J՝$bnr97" +5*y}i*T}߫>h7b{X'(V⍊dysZz>m3tWDNү>h7FWC9O^Di2m?5F0A#އ|%%;^WMk(ĭ|_-F~]n9 'vn}EFNQEK^܈>Djmŭșh4WF&>FI#Ή-9?2  u/p@C3u,FkCo{S ۓ0cĉjrC3E-O~+|^)~&WUoj?0ڍѐ|/;a@N{9ŐF}_p5K"$%?F:5Fo<&Fqp>ﵽ, )Z{s댥߮DFF_5"`cg!dCǼvj>$ި&YYokMta/!=Hd+ȮY  HYVd "1!0w]r{f_u}NO ^KO*WQfP/. ^Sy@x?m/zo=3FW5㗷t{Yr{ c/z w?W5ga >QKs]m>rBT3kOAh [=y.=Gdv-]^߰NqBgfԨ0;&ϯ8gMo/,|-8׌5ƪvT>9v->n+OAiY8|C1[3qp>naw?t\8kOAycIv9WdM6wGY^1~j jt!쯵ēG*\_)SfPSºnc橕CR ;n|5FpO;َM6Hʎc 긾a{Ew]~ӨQ3ix\F—rsϚQڭf_5~j jt0juT2uU=zQvbWʩOAլro.k(yFzA,NcG\tpZWvASfPs]{USuEkt=9@?i_FF͠Fj_+[n6^M}7qqv}|Işi1;SfP%-aá%969oXUEA"~Q3F~o:ٗ<<l 5fԨ"-H{@ɱ=O3)fԨ"Fx&IF.hO?h'U5F͠FsTaS>yL tk?BSfPn6arbj!uϼ(mCQ3GӨ;Ə;jK8w6m~rhB#DA.{\ky/E'BQ3eQ{Mm0~8&2*}{.|"=DA.&Nm~x׼cmSe\]v+ ~MԨh.ezڙ=5`G\4sϓ-DAol8{'fT|/+t5QfPv~!~'7ttej܅w~{? _5j5}ks_i!{rݬqį5O[kSc;~gkF͠F%n7Avl'S1/Wnji踁Yr s[k2>Ԩ,q W C QRg_7D ,q yG5i5*rmYkF͠Fe|_zQ!~ME"k"}35zi==Yįh7U}75z_!fiӿѓEH a^9Ehμӿ%^#~Mo`f m$/,Ĉ_!Fќ%d]#~MoƬ~5z_(&7E>Df;LC/DfQfk"}3J=Գn&7X"~MoF{w.\Y&7X>%d|g!FH 4Ek"}3Q#~Mo5|į͠F5(&7E>DfPGH j_A"k"}3Q#~Mo5|į8V!!DQF@jDQF@jDQF@jDQF@jDQF@jDQF@jDQF@jDQF@jDQF@jDg-ğIENDB`gstat/vignettes/figures/allVgmsWireframe.png0000644000176200001440000012673714646417261021060 0ustar liggesusersPNG  IHDRFZoUPLTE.3:<FORXafkt}3.3R3s:::f:\s\ffff$+3::::f:::::::\R:f:s:::::AHPW^eff:f3f\.ffff:ffffffsffffffmt{3::::f\ffff.:ېsېů̐ \ff::f۶sې寶̶"&+04ۀ.ې:ې۶f۶ې۶9>BGLPUY^cglquz|wsnie`R[WRMIfD@;s62-($ې۶  &C`qN pHYs&? IDATx.u<C&M#qC3HV.&,`4tkIJ%t;[ E͵^{}us[[k}j DAD}K0*DID"Q"H$H$%I0*DID"Q"H$H$%I0*DID"Q"H$H$%I0*DID"Q"H$H$%I0*DID"Q"H$H$%I0*DID"Q"H$H$%I0*DID"Q"H$H$%I0*DIDԝ0"u,s1`T$:__=/H `T$zz}ɯv}~ؘ`T$޸w.Άw.}f[XkQHtZ0z9!u.CǢ4@H$h}F?U_S~Ui"(7a+/=I5%WU^^*+Fo*+Fq{0S/TUbMUU ֍J$U_S~UU^oqF//>꟮?{0?]2+?T 5{0~h^1zkzei%a$0xe^Qk8_^쁣0OQ]f_0W\vozڔ`q~h^q1[+X|%-9*Ɓ񧟞|3d%sV>] Ԑq}>. ~zdﺚ߆_==M+uVϜz48 <=ߙFџ^EcSCDS3koQohP禍[\Ҍ jh0dN= FK֜}t._v|sk{OӘӟT3kTNYl`ŨdۧRei t71eN= FK{z})c)s:9sZ]G׌qowq0*cThq}OO#6\kԏ"SOzp0.g/+CC֭f-_50Nva;F]M?u.MG:9먀Q,sI`4TcD;Yo3ŜSr9d<H|j~p8ڏЙhQ{izz2ŤOޛS}}1̩'hy\g,qwF?5v0m`4# o]h;0oYGnNYyl_6%G[Oƙuz0m`4|:$4- a5}8D4N1 53A9ocr4k1}Fgcion_è+sI0ZXKN=69͍4V 7Ӭ5YEͿhi~4=S?@Z gpF}0߲>Lk5F")T3ic`^7z4ct]=֍Z?Fո?o (F}0߲j`7~W671:]83]13l?95utk*=]5ꖥI]/o}qrPQ\*F}0߲.ݚ}?"flQSLs,q733l!U5tkۧwp0jO1* OvMYz|yS_ n"0~˚>fTCCwj-C1Z[/hq4*`NeH0ZUӨ܃;!hU FNrZU%mN;=ؿSkV1aT$jH1q/DkJܯ*(J0*#0%kJܯ*(J0*#H)q<kJܯ*(J0*#H)q4~ FEJ0*#H)q<kJܯ*(J0*#H)q<kJܯ* _Q.H)q<kJܯ*(J0*#H)q<kJܯ*(J0*#0W~ FEJ0*#H)q<kJܯ*(J0*#H)q<kJܯ* `TK)q<kJܯ*(J0*#H)q<kJܯ*(J0*#0 "\bMU%_S~U FEy$ה_UQQ5%W`TGbMU%_S~U FEy$ה_UQQ5%Wџ%kJܯ*(J0ښEצ:5.cilHܯ#_0ZUwKc]~MQ F{:V5;=+jgUUut Fk>v_R]U$W1/\X7l/͎boTu%&k@n-&YUbOŶׂ< #Ai3~5|v܏v=T0[աz4DvRObX,h[~r 6HڂѬb/2 A9%8 ERG%B>CzQ[l V^pRXP4Hk~ݧH5~`Q 4Gbi/i-ؿK-w RhUx}5QOSw I[ǃ!QvJQ G_\S%HwƖc`4#Ȁ RA A5cɚ%D;~}[!f_0y /C:W/_#:sH+ܷ@ڽ18mF\<0}{^_u/ϒvh-c>,U {HR,5ndϾ{v8bw,I{q)L)K)C~F+ F;pô+NHء ֬eXv[f'mL@V_~b85Ǝ#=X9ո5\޹w.:^~򫇾<=KءD@:^:]=$}=D?oYd/QjP8'߬} h$F޸+1C[ml?zy?w a}ȶf?hJ_>r֎Z`gorT~:I蝋 jKN sSJ!T*v]e,j51їO7P/H>wEZ3F iavLt3vING&iy/~yk9;}yc= L??S5z3 FF^` qmw?e[蘖78 * TY<~tڅu^ r@ R˓c(ݕzz٩E|"G1@oX2@:Fҷ`~:FZ(00YI"ݢ&j~FWMyrKOۛ$@؟[^|9ӾgYc/ Rc8 5ؽ~z[VW^MhTnqs{D);8f 3F/tFyaWO?s{/c)[YxdM8Zb4dRܴHػzl3UHz7{v ?[W2KqTqQ-KOֻ1/O)Hڿm;wsUyJG d7&@vM=;& 04{ڮcGk}т-Ƿщ?RHϝ(HMGoIѲ:װbt7I;Ֆs=\.!AjTNhvc:t K^N6E~2M!E?W G8jf}z#Y9/fy X2Q 5GRr4{ F_, J ]UO= ҫ{nD~}ܶHf ޙ h;PL 'voA "#)8Z"ȯrmNHJ@=jri\wp޺H G_25bKCcwC84pL F_WaP_mQeQ稲Q3[7aPh Gs_4<2xz[GpQ*\w0: (G$G"z9^ڭ &$Fμ %;,}w8_.gz.^6798JN؛C)%9Z0Ŧ(Q>X,?gvS/\sK`ck7 ObA:B%-:bFG]U; ͎w)Fހ1. *όfGih>5PG㕡Ma4<_E:M(dq IDAT5LjW>?^bm]9hstkS<#G;:8o.\FSmGfLd_*'Ql9Z1(Gm'rtrQ_r4{+F޸!\ %z] 02&-68]ݭ؉Qe>G(F_-[?WzGm u)8* r۝T#6HU B7E9:R¨v-[~ɥ i(}v[oj)46GCQ}m F]drT 9\ UNE9 c(hꤵݭ_Ҙh_z/ώ^qGsQ~k<r_0:Eқ4:}?8r_x.1^񙓣1NrT]rԘXzuFB!C2:F=WG8grTr_gbQ Y?&m.}7+EMjW|W}F5jUO0ێr_Ew pX) 0(鸘tu12/ͿUŅXiST):rw0Rэ0wو]@p/ e8.t9F^{DZQ'F)UO}1,& *:E}Sɸ>E"oF3Dè}6F~d?G.GR@Jdo#+j<>c8ZdptuƨRY (;~р-H/%V^a㨅7+_$p@ӭlnQ=?"0jMm{KxvM&%/ța4.i!Q딦sU(t~p^0|pp=582qܝݭ9F{d1!wקaܧ1Q5&G_|KdN&oRtŨo9}~5E} Fmo;1 5[~hGQs[ }.yiy?R2UD;yͥ( '2#0.C#R(59 X9:ﹶ~ /s4 FK~Hѵc?9(bt)p,·9 3Cc8'.wׂLd0M_3y]hǵyFe)E+aj>}1_QAgp#()TVO0pt?=( / *ͱmӭ8!ёD+HDŽ+v&+/嶢iE9j^}%,{EQآ']gV;¨Q~~BD"19$rt28P4[? P,GW9*Ͷ%FrTY: c E'9qhŧX 51j[Id_& Eѩ ȥd_xVPN ]Nс%ѡ+Ũ{hB9:V"_ֿAh(GnCYakVpt;S45(2,urtg(GPf")9ٓ;(Qsq,` ~}y}dg8 Fmm(Ø24cV5[rG]a4[?pTIc5Y#( RWyF YL0mKv+&G4GN G5GQkһ ap9ڻrԵc: ֭wO^daT rT0mK~+=G%ʡ&8-࿢p`~-G5Hrt__NW~%8(7徎ѠndR`oدvg1>RK@)GA-J9xV %f6f;ߕDv'ّ{s?. ]8XiLF1qT/X0:RqNb}Qxg;KnbL†(n[X}uwuK s4f2ơ)o2ˆR(5hC!ƹ *p";(0Fq@ FY2є19:B4k9z4ullstܸ c~o ڏFv F[Wa^?6G6G0S4'G N3FՋn=qDY:Fހ̃Q; /hf^1jptLP:g(cŨ1={֭o 9їr"m mfZ%cRè[V·S8zL喣d"|'L;FH9~^o`31L70qt^ jgra4,1JpԘ%2.(Q'/?/)2 E1b?w6zPN*G)6y1jl%rqYutwtPYL0ЌEOGƗ=E x9'1V'ݩt9Eb$`4ߖQ8VqèU);EQ4rt/a֋/G']nG9 ]'QYl T[mՌK}(NѸrt(\Gt{ҝL.G3}~⺃{(Q&t0<+.~hP34GM&E0 o~])jsX0#zG+A9w(KdYGo@sa]wpFc4Qko8:tY&GQ)rԙp4f"k)]GaT9ned;s<E9(JcT~1q?`b9jOrT0qv08hrt`h/GхrP"!rtNdhGm5SQ~[Ft"QG)G. 1XHڬP)Q D(c8ژ0ڟP>Qh-۱9:dNF З%r`3х㖵Drt([ߘg1aE(n?Fo:,SU.59ѩeqDRV"<0(m8.gP:79I(GLh,G#(G~;.Y.y4G=GrLdxꩧG0vJ Z5+GIq8,3&H>3{?ܹ |]8:1 (GўcoE<,:Bb@ǖ#8*_{xKx$-YNӒD8]jßf~S1.GaJ'̜eQ7Gh+G)c~n`4vO\ 7r.12̥h0YQ=vnэ1?br=4DSJt5n9jp93Ǖ-/y9iBuDQǢ'{wxtD۟Qn^^UΉe2Uv'Y2_4WٝH F1*kts,n^١rTyn\AJ0ʼe^*\9J֭*G[޽}2rHƗ|lcgǔe-(Liխ7 rv?U`4m~L(c_cJodgi]<ڡ[>#y.+T1Rv(3Q%RFG,6;˴~Í1d9tWj?{)_}OɈQ~ĭBvȖCLs\/W*3Eс&G9zue؟ 1h+?Qn}XgS: !;ՖyZ8F9:Q4bڦkQ/QǜY2>r4}W9Q!b1z ʸ55C[m%7GnE9zek[w9_ rXn tѯ8rT0/0 TV[fjɹIbP0хAͪ!O9j=<s8 ,fSeÈQeM/7d2WKrԼR*F9]Vߴl QxKpƒcj G9jTncat֌`t؎.GFQw~(~q}Ӳ5d%%2y\_[rQ#LLۜŤMm.G ( rG04`Zջ9؉QG/֠1gqg1r4WEZ0T9Qr Q%r@9ːJnƻoHM<,6eb(QG9}|ZQX"-&G5Ο<QHp_>,_7:lX92So*ݚnC&Q@%2-~"tVǹߝ\9Z1zW1M21q(Qo* ;qcy@&2>uwɡ<i-ȌQ~ԭBvh-s6=ErT}0QzІgZ2_9%XOY&4YqcpT2cTq냀jˬM(ǀ(ў!Qiijl-}U≌pthl9Z⋶ٔar~o?}'F7X evh-6ert(R!+Gs=Z,[KQ!W9\q&$i t>(GYwqu5%Ҕ٭0QEzkx5Z,[KF](&GKU,sPIsbQ폙e,K0X/Ggr(-EK5 ]rT%d"s;fQh`tW@ rԁQv9P4/HM@24Q*L7RQ7i4 (YSV9 FfZ8ƨBQ~J䡙Dir54v$~6d:FG,GIM)8RQFE(+,_KQQ-EyFs55w:9 Ԛ'/}IP֠h;NQQ RJ䝎Lgh (Or_7ނwf9Q 2nFuSQWh-c-F9ja) [_;bu?4FcbT߿ FmE܆Q7UEv9kƫ(FOaI&-NVV0zgNDci]LQn921"=V vWREXlF3x^6KCf"0ԭOMLhrt|sihCLkFr> #n_l ^1<;D=(,-G=O⾧υ$2Q2O` IDAT֎6~# F֭ӫfU6lu,^v 80+G fh#[keܷ0H.D3WeIo"ckE1b}I{㛹Z;m fSS)G{Z (GLҷȥܷ~֏QO9zt)Gߛ'~ ^ r4C2YS6.9M١ir߷isgܷёFٓYB ^-QTr"籭! o="t?e޹8sF\Wg>#4u?!**GhY}O}mg{щQC)yO:NO%&r@3 ~0(?e^QL0<:ҖCJhhKsd;01 O {!D3E1$qf5} 3qdqW+~/FS <6v:F8h]r?;.\c㺸]yh\ DC(~Fwm`ԡ;gWta qKdt1xs?¨ct4f_0=ӑױ'1v2j"E;ƨqS!4_0z{g}IQ3(GO1m$ѨCi -*Mc/F޸g$E}|>|\w[H?O}y1M ~_nj~M2P8Gâ{\w'RH?"1OwG#n ݀QU0<>}pш4^rXD<\q]{XC&hLd(4a.ߏcSOk@w1:h|p9 R1ʪ^o5\mq]Lf?!0[5;tt F5 'P C*ڣ.> Ee?(s6_o&ƅۥB]SHG!{˒CnC3?`tԼ*3365R c? 7WuZYQ΂^0:HY>Km?pҕ|j~}W&3Kvgрi`t_ê1g {⪈1:J^֢ʸfg?`TѰn6+gEgG͛>#7k? fݧv_0jXCŻ3 {<=+޽1k~*9E[fݧ,`tU_t{}_>Àk 8CPe?~wEw nv{Ra7#߱c\l=ԨYbO`Ttшы.s3TuӾS3|Pq_I`Te{=mgPBvϵ\L]+Hy2ut=4(X^Ph~Iv^0z5DPwS 90K1~iD*.>ct=Nb ߸Q] է>wk D`{\qw=~롬L_?rhR:spv{7} 1bx==3Nvaz(QmR/twO'<'7Pxzw')ntrF>tO_ƻMZ/Kg_bt{3c ˩xo39pǸGނ_0ѕ8^ b _!&ƈ{nT<:=m(nkuK)`f)Cgo{v5T~?#D/uy`< Կ0f:ڿw(yN7j >!cE6_-=sS`ԡa ac{[d|FMDߍק#?r~K4F1ȑ;ՖMwok7<{^󫸥s d(w2uGGނ?CLG\#ءdhX]<_qas8q*Ber86tK$FgCukү?p9.GK$?{,#? ?bFC[m1~ 8w,)>{:-?(g:bܯe:yV[zGx/{Mɠ{ڙzSZ.;ʞLYy. T5nڗCߗG]ѣ]7jzZ5^qsțWs?2Cyڕ`8v'tq^dh:Qk+\?ߡǂ!hRhh%#ƅ0O874,oy2Ҟ|]ݽo݉r]삧 Mgj)B qK|thmZ:WCbMf FIpWޞ:pO>y;p5 ~hqqQ62<@?7x5t7N k/7]OX6t׵ukON厊2*~3/НqgT8!n|qѷI)q?DP?Js")溯χtt9*g5%W`4^wd\p0Ĵ.L4D>z47ʹg_S~U F2>#e"iJ?3یkJܯ*hypatT ̫@Ɖ$0 \w8|Qas~~f_S~U Fsh~"_>,PIw/a{6.?a~ߑ 5%W`4phɇ'b7n^wbt$ה_U<ns5Q谰o½'.}C%ה_U\C̼'x;³.׍{5%W`49Zf6J0Wk%ה_UF`)j268;#5%W`4y ٧ʿU"%ה_Ulꚧ̡0n%0:-%ה_U|rq%ה_Uь]MbMU%_S~U FEy$ה_UQQ5%Wo%kJܯ*(J0*#H)q<kJܯ*(J0*#H)q4~/_S~U FEy$ה_UQQ5%W`TGbMU%_S~U FEy$ה_UQQ5%W`TGbMUa)"\bMU%_S~U FEy$ה_UQQ5%W`TGbMU%_S~U FEy$ה_UDŽQH$!CO2F?U_S~U FEy$ה_UQQ5%W`TGbMU%_S~U FEy$ה_UQQ5%W`Y_{Oz[^<,7x?a}l( F-SJj +8tM=afq54>`4;>tqX4>ʲ:7kGI0ڎviO?.[ϞL5>SoWPGI0ڎvi_ Qs Tc-VGI0~E5Ѻ(OD^^u[p߭ s#܀F\y]et ˋ_a)bhn筮: FW7;$F]xi\}<k$>H:_IM?MZ 8zz.Zi F;;dДQ%6ϬM>x}k:JS8R-5a-LP9f~3F1;o?uݜ._:$F]x )Hxz>7ؙ"a8y|=v"G//~Ow{Xʺٺ`˺oJuuQ%6G硡Ȯⷦ s\ Y\SMLP]oqq3F1;Yq; 7G\{Gq4>`4Nsa2<0 .5a4aO^Uë?{<,el]t;R8icC/}ڈ-_1jr:uMU=a*{.[K֎( F)eF$125bxԇXgv_7t拔k?Q0 "\bM5vN,J0*#q_0*H쯩F FE)kǨH$Րʡc4^%ה_UQQ5%W`TGbMUaQ"\bMU%_S~U FEy$ה_UQQ5%W`TGbMU%_S~U FEy$ה_UQQ5%W`TGbMUa~ FEJ0*#H)q<kJܯ*(J0*#H)q<kJܯ* %kJܯ*(J0*#ʂ+YjKQ5%WU^YjKQ5%WU^ؼ{_v0s١e_S~Uc}u/?YjKQ5%WU:F\/ ;Ֆ kJܯ* _>\}>N1eXV[2H)q1h8O1 FOXbMU^^ FOYbMUH蝋{*Fφ/'-1tOL K)q1zb=ʺӕ_S~Ucp5M1UL'-0_{cXԳtzyiRAbMUm{ܟkRAbMUvh-E$ה_U= IDATQQ5%W`TGbMU%_S~U FEy$ה_UQQ5%W`TGbMUa+~ FEJ0*#H)q<kJܯ*(J0*#H)q<kJܯ* %kJܯ*hk^VF=!q~h])X_Uc`bioIܯ_0ZI7Ϊ֐0jP;hWUu F7v Kv:RADt\NNvs}|}쥢 ~膢>Ry(}qQ`t+b=%Wձ/Dqc$W /-.H4Kmݨ$Mܤ ~hY1~Sөx ~hAvc/#RCpXjtu~N~ 8w ٠Xjrwٹlqz?z_ J0ZV! :4W۩=5~wmoo=P>6ʭOt:Yμѽt}}6e\ "/VK KdQ'6H[ʵw`U/`4P/іRNfDr+;Z"?+y3ףAC;nDv&H؍FߤDEN˧R/Ѐ 5HП\#g"G`nr-g1 طPUya3ww~dNDTFsB,mkًҗW3Tn/-=I-}y1~4F !}qٗwxn^mbTڳ;c S6F@J~=C`UؙэS%-|]Lv&Q?dnʵ76f0.\ʍ߱,g} F! olH91hbA QЅb\6`h+piB%&hXf aǐhz&~}a0Pw h9ZsY~sCoİ]{ w`_&x|MߋӺZ0POс*FKsh*oo!HμcCXLmpїwt+b`4p8Zѥݖbik ]t -gMǍ)rT/ ͹/URrԼ0Tg8GӢP,mjaмsy}dYLgh} R D"ݪQbmB%sqS0G;99ۯ&Lªٛyo}$ftL;p_:cI=0NhrsY~{8o 6$Zf> @9J `m0;z;M]{9\~m| (YnA泿֗sQD jTy/Sr&&G!Ѭ i&g ^ p$G$60qnFYZBh0u:Hq3sD FӘ;}eGQkH4?GR 7,t@Sg{Kh+OGc5sC9?OkJsQkHGsR~?'uJWG$Vl"簿x4NDg~CFD,4U:e9Q{5;hq51ѥ,sؿځp7@ك_0R..TrQmD$G 1}kIGΤ9[(~}%K~ҙM#?ͅh G~[h)5Gwo?_IGK݀9Q/5[Q }##=D68Jצ w51ԗ+}IggѱҦ6(v:ro}בc}JPLjh$G'8!j>yZFDor IޒmwxtGM_00Bgy69]!Z[o^4FBIeu&ijk} EGD -'Q|:!}28GD{ ~wq%9:yO2-`=Q^uj_d1:lQRΈԡ9]K\ր:0M/8:qD.c=#~NQx/x&Nk G]A֗ G񘫎Q"5!UV+D>˗QGqQ7 Ǩ3{oGɛ4Qx_}d_Qsen$G;~т8QO!V/8sc"@Bѷ98F ik?S9y<[cGDqt(`tnҕ)j`ѵKۻ$F'IvRxEU5< E-mbQF!_QG ]y W:8chQF}j]E6KwU:.Y hy7u?, Fj#k4Gh(GBTh(,96]&tsuο d[J_ndQ BCã󈴏5_04st@"DgrrQÐ>o=ypJ`_܍*G_}}),h2"hjnUDuqTTQ0jRb??'D꘨[_=}b yb1GIV ~ޯ18js1hG!Q型x H*1GOb c4]?EgQ~Qc]X 08xВH(ڐ(Ѱ#8Yg*"mQ/iY=G'9j=5ɇG`,U76ͤ,eqTg7pr4\ɺE R'G pqo;ư>ѵxpu?|AR (@3[CTè9<04~ϜA61ӗ䖣Z(Բ Mmc|\ZSh/9ٱ~1Q{hGGAQ9l ꕘFgpt8%91Z;O@Kr{ G~ȈhQ]GFDOc Kz9j ״.G@OsԼw~,xguD 3Dz*cZ0jQ|D4*Dn=p ~*mc[ZC&G!C_ҍQ{ *‡0 ]ljQ )G縧8 c!ʼGI9ׂQ Gu2GDC9 2. ڵ0)DF{SrH11ʾGI!rA~}~HZ<+7)Qkن=;isTPAã=D *aŹ(4kjTA#Ts5}bm4R9pz*hZ0sZzcqth8F-8ʸ(4ki$Fst]Ð(s"wHh5wr ?+G 1N6H`4Ӗ6]uS9 DMR&q}׸,!QU: h?qM1UDI/ M.#0Fp3㥯 .G9:C_n]6ChWX:YE!hhP3Q}ޱ`>%)ŴqikY4oQyZMdS"#o9 oIzcUV g0 a- ~~}{ՙCaIA][l]TGk/sɯv}~dPѨr4vl-]4GTeLk9:8?H]Y8Zo.77O#kR ~kHfc<~5Dҝ{~X4#H8 kFhD"/y2QtUf8v0ﵟv?>=JR )`I;+/YrIGPODu*L-["W{ɅJx+}<>ŧ ۿoS(qad9Fal5z2n$E7T.}Ӛf (GGֵL98Z`1٭_O_sZ o~ٺ(G^Zi3g2O#\Gʸer5 ]@׭_ pt/epn$q DV][In9brtx9ڙ05¶>\]\'ʸe%^GpTUD8;I;D_3O6!7~}~of:' {Vp_?z _w(90jrtBH$9q*Qc]V$S\D+D WO]v~=} =J^ŵQb[ãt]Xnj蝋H;qйb#.U7yw~!j`t\6I[X8!2ZV9 @ʈ1_|UFmQ[*kyoӚ ƈݡ[^\>QY#DM#\6IsYdoӷȑuL_PBm}4FYvQu4PVx( gZUGDxH2uJ&=}[mQmLkBD <N"c5/LQm*G19j@sQC$f ~GQ͞FQl RrD*G0㖣3D9ŸrނH[^HlpPnfF|Wƚ~_ʲJaj,_cwh-zW=aFDrԵ)FD)/G D^'2s`##G#ݧ>_N6n4c+(G= U>+;WE8GDhyIc&Ga(*4ft;0Z#KP1*ۣkR@qwE8{j*vU71:sZ/GD~>cM0(Th"#DA4O=7([#hB{~KG"FjVzP>+F_LMC)`L~a%9Bjg.]O/+Ĩ2Jbg[ͦ=`4[?+D5u[%rd~5y8&`Qɑ=ϩȥ~ݧ9qg1h-[hQCvgj['2QO(5Qf"O[\X"< F7O0~,K#eBbFf2nTjUGDkrLn>0$<&KD^YDމ+xg[/Q:ڈ(Ub9[D^ ^"[Kt2щg:^"ocTtJRGQF$Q7Gɧ"<Hk&ٓ1e -n=< rM`4F~(Q^"z(<ѩ`"owgruP(i`4ߖ ͘0Lu#CQo9 EQ ~u2#istHp3>urQ~z (lj`4ؘ]5!E5pt(%f"uDVS;FQd}F4.pBDŽH"K DѭGF9K,2Y;qEKc?=/ewјf`e(1^j D#ѧ4_KDV-V"g1Oјf`Cu`tyMY&x&3]ۭbf1'Gw}&Fybt9q_0q˴f@gF}z!([߇h<)QG"H'u{̙{Ĩ~G3B IDATL2m`4C3FYsTX&)iT"O3rLXJJ9ڧbi 'e$+aE0/u(G_pĨ] (u%<:1 !HQ'GhrTi?(n`4㖩D&FDŽ>`4[NR>E(bw&FTj{ ~«f&kʈtDRsQGs?rv_?5bь[q[W+QF'GKfZ< 4FEOFUǓh'NAԘ70q(m?Q F3nގ8aTl3,6ȱyܹXj4RRy)Emܘ"?bvb`'YDY=D]㨞 ,K9:f;LޱN50j;!z%bF威Lz8R'2i%9ݱN/׳-Gy< Fډ(G\Y%2s(yr k"QL1{vi Fra`4W_eڃEO Ff(Galc?hiQ͑D~QG7_w(iT9h? ^4<˳ڛ_!Z|=O_~8"'IF3~GqbAt0zƽL/w.ss.`娓D?׍|BQoy8Ǘh|jzfAqX"WΛ ?L(~UOẍ~=ULNK0: E9Pu2>03MpQr&? >#eiibh\95]^f-Qȉ(C4Gz_7'fQ?|ʯctbe}1U&_FB~ըgV1Ӗ8Y=U' ? qQzg/ͺe֖δG#+! ̾O̕p\7Z^EH`{#HH2h,T[3W]TF.K,'9Yv튊|7OFFF8e zl45sR:h҆(6:W' reirԓoPя~:~ب+U[ZtDtbrXhG]U 4qCqHO"'m']гyZ 7cҏب~2~ب+u[|DFD||J- yWlt=U4L8~~hW(G}D~بJK{l[.}sL@7)GS-(i:<-tӯ?lTѭ% %f䢴Q!UMP8Y7'"h7*G9>_~بNKèN.GT 4qCrt6aȤrԘ ']*W?Q}m9Y ~بRK3&f>}MQQhP SQD nedZ?GUj&FhnQwZS>92Гi8DvT]U+o~;.(ѝIm4GO&QG Ek&nv3"m/29۹oɍOᇍj4@9ʱE>*GGS4qKJ؁TLGPxF5 sfjR٨1'!h]-ؑɞ]hL%rjJzOJ`b>Z?lT)B9:׸Oѓ.f>ϤD]syC*z Fc(GK4 r4FM>@s5%ixD2|4r$UWQ")X浸`㉤amM4G)Q3?oQY"0UτG?G ᇍ^ t5l4裤c#& "ZL6=v"omHE%͘~ПO/uc6*jj$oG"C(L?ӄ "{y"g::Z_Y 6*hjyױQc(JgVK}|yDIcn"ovHE&0:+GS,Ji 6o .yݐ|zU&?Cוbf9!~S4>Z,mDh5}tn_38?z (>Gi㻰QWʚ|)GWmXu&:Qe} -12Ic9jBsƗޥMg'1بPDQ.G{MOy`/!5w6ѴP*Md1}R9Lm=j9: ?>,VEFبi\4>aK5"hT;z9'ۧ?>TQR[iNn|5хR|4@UGk8%gh"JϤO+G+%rC.ʸOPi"Sr4@g'KF_VgNkc.T6>:&}B9:MdN-F4SMLv M7b (G6Xiw#ߖ}B9kza\Oey3|tڽa0D֠/GGlҡD_X.]y 8I-mt!%薷D(9#}<$w$%e|qwh*`98vب+wvn,ZhV<eʪ&~T->Z|jLBzlt.Q:{aK?Z@NLd='5/}t_^ߘD6ܟ{ G c3r4D^s{|4"FJO8ŌLܞо 5~lΓXV1'h"}G9ZcFGƚIr4vY/+Xvry,)GkcV?QYL|6q]7v[ZzJ9:QrȿJFUG.(r4s]Q~,~"./G:ʍlthLkr3SQrOB}ޓ5FǍe?FhZz 潬l\1 *BQ/}Y,+:ܬ;e9jKFy.Ʊ з794(Gsa"K;X7l?uhojƼ[grT޻‰лP9|­lr4@68]/QFڙy{rԚF> Uzch,s_#}{:ѧ{cCSY掾myYt?|GE=:!rT~q]!=#h}6."Ԕy-:rTЭ!JۨQ1)%,z+?~u7ץHͲav=K=Cl|ͳmtYtD>LVP㢧L$rJ9*Α鶖)Ccg1aTuhlLoM+GuҊNk~^꡸Y뼪ӌNkق߁_FU$zw^c:(~W 9Vn:6 KN92H|XKby_vn KŦ6|3hrT+JPǼDVj_1m&[]Ǖz9'y=4R1~A_>ܾxnr8G }tW.Zz͠yF&e}TEf=oFٻ?TlT('l$6[ UC?oA0ب+M$ٓ޵QgPzd]\ ͵&o++q^'hJ-w׬ Dhszǻ?Ϟcd\s(3QmuIk}V=yS$70:6jg~~xo36 W=[YZnI;W$-K'8l4U10Th*Hٺ1?>K3flnvzZlա^yqڦpG#6(G5 Pi"xmffLվhhTR&iӆl[^>cuhWۮwoX6a)&ݙn4#.3}3NcV"+MW_9ܱc۽W? -ZlF]h&SF>֤ HcD#罋ڨf-Blӡ^٨[6;w61 X;no>6hF<#>m8'LQ!<)~2W~vܟeM]t(Ok<#v0/}3vTU΄wwώTN޶NzzQ:G74ǬFf!]&k&.X97ڙb*>:(U7i9KѭȌ2<'WwWN|FrerT8U q(&iy"h!ʃ߁$;6f|>>:hMr[|6ʠ?cr" +~/\ w;o4So6(Ge.ff6^9K[i= 뎊#k3mt'ݧoŻg9&h%FmpQFYHz6ڃl<&ڇ[:+ 5Qdj ݩ'*5+(__mBmԻe.CkF[i6*yFor4l8ꃟlY Ozڔrn (f;{ϖ) Dֿ)q-X\W~hX}/={2ym{H^u0iy4#)?I6^<9~J~+q]zVɃzr'UE^g~4#)?]sѸ\f!FFwш2T'cTDwS}^fn_!gǛb!a!5~NRYlLeHE+y9Md}kdZ@iрn![g 'v]Էz?b"]}[$Dрv~捤ԛ.(h/DWNdug׶jFOqHJe|Q9oLP%SO:DI`5!1pQFzI2IcqM?l1\ =?-Пبh,kڂ)죰os_$\}4Poz(Oy B=WH?eo~9K=Z69:#-rAoCj'- Y5/Mԁ)} 2v}}̇ˀO uNm5O6P0l =&`4(m_K_58~OE{g]Ry>z0׳w^ٰxW]I)}MuhA,Eb%Q룉G1z\P{"{9q~Q8٧ci ~/_Q_l lMcj/F56vEr6)h/7+#?j+hNʡsG׏w$P{#zjC¿} kQ{5ڝg)o&KGRѤ F/m4md# F>p84\#)Y#=IQ&kq1K?u6Kq]?᝝9̟;FTQw,Id=#]1b>lf=)}1sMy ?vґj=o>* +QM]K|/ۘ/~a?Q/}6Koj k o"U 6D7QZhcs )dA(.8mMuۨUq`7YrR6[g}mGb|"i"Lt_@\i7Q{R>%0MljMC{]P\v/>lԥ8"cDzZ?;L}zx4UEOonя?6ڪgO3o\4ܩ'5)wWQxaz{Hd>zǃ0o(/u6L3?DmQ}芞oNbȯŧUćSOZ}ovGPݔ ~OB>jw a5Yi-3Ux8vȑsW_ }B\FGsڵ`I4^|{-C UkeeLJߏF=Ρ; ⬳Ԏl4mp]:!+EL'>,kX ?lfG3[a}O;/Me[%j$tʍۀ)*?ltӗߵe'grDvn`,e IDATP~D^ǚa(˧NViF;3Fn"1>ޙn.jڐjx"gط7/Aro%aS)y}fm6&qx]Zd0ud6K*s⯚w)ѩ6N=cdOm*ntR?[ϋv mFeƻ<>CdfHm$]طqwhzHbѡ`"goBљD)w*]9ǢC;cFL`Olor#*~adwuᯛ27хvKa?ܑ>w˿ iO'.n{o8#D;WD_O6q09Ng}a0Kͅ7G;s诌o-aƑi(8ER1ӽɩAH? X6.mNk X0 }=f=t}}v+I4g;uoCk ~ƋoǺfܿwN_K[qu ?96*ӿdW f[LߎyIi[~o%4uW诊/(u6jSZ{!%%L٘`ӆ=3ԯC/=au޴l~/{a)u\F>۩dw2n!&?7D҃6ꗝ]?Ϥ#=1_i*o5g_ZFjv'S:0>("uTuWQvm~d E)%c"3r^]0_0?lԧ]FPL\1Y<=\G ~?Qv9Εݨl%EU>)_R_T`!yS*gF~sS_R_TQ5'¸@`Zw+@`z x* .&/)/*(#/)/*(#/)/*(#/)/T\Q-/)/*(#/)/*(#/)/*(#/)/*(#/)/*(#/)/*(#/)/*(#/)/d\Q-/)/*(#/)/*(#/)/*(#/)/*(#/)/*(#/)/*(#/)/*(#/)/*(#/)/D\Q-/)/*(#/)/*K5ltҰѝ1z> ݨ@l`^xg>TZ%E`W>9}}QZ%E%ǻg/O<ݟjRJHA_R_Trж(UP+!JCQm 6 A$l H$(AHܩ ڨj7 AQAFto'@ լMB-(AHQ `A"F!DB  6 A$l H$(AHQ `A"F!DB  6 A$l H$(AHQ `A"F!DB  6 A$l H$(AHQ `A"F!DBSjIENDB`gstat/vignettes/figures/daily_means_PM10.png0000644000176200001440000014034214646417261020617 0ustar liggesusersPNG  IHDRFZoYPLTE.:Rf3s:\f(.::::::::@LR^dffffjv|3:.̐ \fRs呶̶'+2ۀ.ې:6:BFMQY]ehltx|tpldaRYUMIfF>:s2.'ې# H`̰w pHYs&? IDATxmIwm&nd 7EiMI6 iYt9k%NH@qsTp>>/n}녪+5jԨbԨQƺjF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF{}wO MQ5ZF=GQFv37MWVjF5{o7F_ǁU5j}A?spi;LJ5j>펇F)=5*jԨQcwZ]BG%DE%xhhQ !QaQ asUE%DE%Fx?T5Z^TBHT@XTBXhtgcQ !QaQ aO#E%DE%FNW10LJg=/OUKhk̢6 X( xBHϚHN;?}0_CQx7m2[FWקQ~BF'np(\FoEe"  =O^B5ߛ2PH0uAxoٟ߂3_:˺r oVyxx@`ϡ2J a,@Z̄4'ԧFIxX5m?eXնAh?5V@aT yx@`u3|H/椪vѯGo~ͦ>kKN`9ߚ^`%{d܄?|O0E2z_2*Q&7!IUJtz?ZeZ_ hz5.}Ӭ<sC#a!ƴetB} V&7!Ic7諫MY;4?O{Fv_UQ<~3vk<\Q: $C}H/椪))Uv+aD>|Y ueq!3 +kVBFe|-u/` ?V{ ht:vy4 y?|߆| ZцFwLHsRhY9Nm'}dpf 0E2zl,S'=e2ҜT5:Lesׄv:`F[7k4!VAѨ#O.і靓cSxB̓椪\B tqjlպ Lw%b3p(Tlc,em\Wb^R+Ah=?ߪG]WNp}n`JXLTBXTvq~YجGBooU]T"Q5^${!T5Z5ꈪQ," A;`2htC2I2c/Qţ376F( PS B;h3YTOj+׷d5By*!G샐تFɢVa5k(!g 啐+vAhmK(A+c*|ֶarcQ%UM%k/+!z2!ZR5 r|>p\Ш%JIUBU!wyM,Hhm B$Q м$T5*H{K$+Bܒd#!ï5:#]f9x]BLX m5:nEPf]Qra&!.VBhڹFǙJ) <)\c4"ľ&ɄSIB{רvtu#t2l^gbB4l  ]rwt9YDFB|*NM@◁,4B\SٹޛF7I(ǑJȓmزFՑ+tHij |H){dzԆ7zIBڝ<+! NP {6j0yъSţみqSmУGG '5KH# Yqrxt%T5J“\akT7g}2oУGG e;˗LHݙwwɉ\Fc6SG5{5!QFB4B?x8 !BDh.BUꖾ2n#G~8==*/Gi]УGG L-Sl,LɉQCU!p,䂼4uPRը FR2AH(3LJ*j4'Qu֏5o9 }rUG8~s fBF+!Kf\F-Q PP)q}XF!kPuB"J.k4Q}/޻Tw:rb8v-Y1["DBEY e"4VBvFh>BUðd;PСLbxR2!yP]eM^$E%^`&T5&~FDjoNa?pd𧟅P 8nÑ~7izzz4).$䐐,2%DKˣUJF3:>vyC=AqvQ2O6ϟ< VxQ/CqW\R %K"Ѝ6.6o蹡%?ߺ}Qآ&~ArBKz(HiGoݸ1y={w;j iԗڕBzsGMPnf\ǏG_ryBY9^qcˣ{&tQ7v%s,/.&:5 k$wG]++OujB |nP< ݽxԩ2 U_((Ո:tmdN&pzX Fs ɔ+dqC(}{W(b U9QpG'k(By>Bf';?!F%T5BQܧ, iO1e'wQ%QBFSLBFSLY 5)Fe"4(F Oaon6ˀQhSQr &[~?V+!ݢr Uj]5BivXS2LEAK"Y`.{'[4/!wV IըQ2Y1].%lbE"^ӥPB9!"k#K [U!tFLU<\P*_YGF@FB9E xўwh6E ^G{BOUBJʎ[%tyўa*ړktڈEPtXiEyܺ\:#EG;BS6wax&|Bюs*M]tG2ʣ!RE{{!Qzv֭0f"4H./=4WGc;rv[=(9ljV<Ћ}(̣$1D=zrLƳH]^{ԜJVОTIsAc4zVG$'JGse1PFON=4){hOF_)ь3*ĤQZr-FI]֯_@Igg ĤpB6d}6M4׫їm`oj9P'j4 25%[OHhBUj>{{t\%j o _F[4F_= h!hN޹{hBͨQ-lFhը+== O4N}pS]X%KvKУ !"'X"У !-29 ZT(/!BemQ ZThB]>{fzTׁm4EЩX6ʄ'V|izGȱI(֢2Uwujn4ܐ zkFIhQpPZTZ7f5L sh! h^Vƥ̻6<nQ.f%0[_XF Oo)%!&h1IZTzt5uLxR .H( *!ׄ'iQQ$zLu9BU;j QnxdhT ǤEGzcK<5a=k ; hLQ\õKm䮘| ^Ĥjt(ml}օPʁ52 pI{^ĤjtE4jg*iu}Pivw!B 1 uoX-Ij{K=7M}!__#ZKW$az4`-);'_UE!z+4ℚe ŞbڔF?rN=3_LS1YESoJCh( %Lb|4N/@!6GA-Fhcʡgٖ[KMܔгï"4l&I,%]n !jCɄԍQ!膨Eg'm?|இVYomQ!Kzr’*dZKq4r[Wa$r[D"z++-EI@ ϣF;0ԣ5)7CNI8hCB`yvo)<0MBTIx KBF!BnIH잂x{E մ'q>BE+!3LPFx ր!Ƅk6#ctir@MЎ qgi7mG(N߽O1FiZkXǸ%sz!s(Gmr{zx _+/HH RnO$A'4nCk%n+M&DkA2Zߊ?bZF"N#ƴ+|QGK„dDDhܣ'ӽ=r {dBzgAQ+ŷ'khmGG  B#yI"!.+! x9/hw$w~j%.>Q3/wGG!& 94 9^PFw^csBY~ˣrv>f34:6*Kcs*!oWBCϝYPFwN{Jbx;FxOU.=FzL( 95Z oy8N)yF?(^jfaw b\_ 4'i4BAzB.j !F_'SW1{XXQ]UBzP#k!i,-BԨeNO(R?uaiE`ӣˮ c,/rY -tK2B; tǶ(JhTӇ_ %Kح^@ 'm$W+ OeP`e]jQ!!nˠ4BEInȠ41N}z̴5̦4tZoyB=P }iGY%!iQ۷C< BҢrS(ţUy5 _Omu w XRsۢ:M|?tBr[T'PAHnj4q 7`5\ ֠e Aʩ5J9ԦáGm@P +4!Fڧ4VZd$DШ~Orΰ:94jըRZ?ժLG(Q3mӢGzӢG?.$ iBN #mGKxVCz2E-r̈ ʦ'e'Dനх3rZ^ 9-jy4Pըg#xiQãPFӢGy3k"䴨rZh(mk4<h6EpZT(-gƟe $䴨QR<|чrZT LiQpBU;>=گ*%~e '4u"!Pij!턬hx3FS ~n )%Dhѩl/>bl?(QZݲ =bl?QRLs#WI5JPx~+3 `V:ʆCãztBϟ%TFYYWG*P,y-фFs| Cݣ7&&'xhVdBϟM %&&uoBQR͒ YFI5F4*/-{l%,vyTyi#,ak'ͣK'djt8fD}=6j]X!;ktn@Fӝ%17!SiN'diTv$=)F k45kNUEIj%Kh*!{(ZɄ 'Uǝ6GEծpBoj6GEծGwUR&6E,EhӢGpXt8r0lKQ!`6s*+YpX9G EmYZG&u IDATss[tG$T$}WzT ۣ0~]zT\j'am֣]ӤQWzAJ#t)or4VfBŭgޕ5iխ.k3̄-zL]cZeJ[ϼD%u% $T5FuX(J$jXegTIhwF'rhtKj [,u (Yђ50+)PFs*Me!{#ĈhrtBU1>qtKG(xc4o/Ps&&xc4oݭP>}TPSP UGEc>uwG(آ1 ˣ4I h!WCD(آ R U2~_uC ‰Oǧtل^_N.MSGS&B];JȥѨѥ 7 \#ߙ 2VI3Wsq!85S4O  eS1Ь;+z-0jT,M4OVƓQ B_{]M_}xޣ|[Ji ƝzA*-iԗ-ţÓS/Zd\{d*PFJ˗G h]$X4LvO`c^D!ʴQ!FƂ^Ci(u=0XP߻ y4 7^5ڌDvLEq(ŪЋ'R5Zw)T,v*bIj5J1M_ѶbQw7LHE'GIn E4vB8@,JXF`e] e`Z^Urh7oe`Fv(!_#K~OH륯O%Gqv%bږF+|;On`o(8ݩעN؟ע9Ehg/Ei6ѮYH#~Nߠt^ x-)᪻BŠעH}X1!-M#%[!M^mTV!ۏC8aAar9&?W0Gm$IbCnUQTF`&﷐;'2f8NRУGGB !Bo=xr< ڇFE&ilB lУ!D1(P|h֣ sO{ըYgApmD4^-uF=<-uߞ =jKP&RBOaB &xZ':JvCpPEA-]X ,aB .ߡF5 DPOE\+AC(V. !&`Q+iX/B8ڊGZd _E%"B>=BŃZ9,nH6fJ#اhOVQkE&EGoޔ "{w:L =!S=zv&=!`%ʢ IO0q#գ׮IG>c"գ7opr&sLwf zLhY lBI7VBgS!{gЍvMhY Vi]?v5zQZ'h#9GVŠ@!E(YggGi՜#܄A]5U:ڈjnBŠWBvM(Е6sQbP+4wzћ7MvyM-$ѳ3ӣ]mxj=|:PF8ZWn\ Ž{M,&kLvyAyMq|ބFIqףoG&Am<~ÇM%$ mC:{4 mޕq G9MOVQ%^}-o{4 8ŽlrxC~lr^Q(hFBlry%W{du9jGx#GCOIB#sI^>|m-5xN0Ub{2x4'!LF]WqJrRNӝ`5ze>5ʡDB>I$NYQmc?2r[Q '"&^ ܥ'ktO5E>ܥ'kc+h|'߃d"/.=YQ1RR)սaX4Xo3xALa.e}Y22,QkME2,˨ќhtm`xtq|;!c 4(!EQ6Ec<BEQ6EcXTtvG8+~IV|A?bQ}S1^B(붖8bQ}  AjG(Fg\qfwh|V 12^i 6>VqXW:8;XT~юPt]MH cĢXv"t[+!r bQm}F;B}3|'+hڶbF1=($8Fx&6E{}@DfK'$1aFA,sсȻCD2^6yAhG,{PQH]꟬U)It sjkRN`N+9mUE01^D)'DF'BڵBиI dM,'DF'BhJ D_ƝmJ{LHhxC;Ƅ2 RݿAUWqisBD(a,ҮM%. z7OBYT%(&;eA JH;DhxVƏ0z]ij9C9jNlw?P/86%LlQqÄ4BxuÎ o٢Ʊ M 3#-j2f꟬V4:7&ER1SSIf`BmQ㓚M"tn貄Bpn(z5"hk~dteω55<ߣ55J!$B#hk1Ѣ<%5j?2d"ZxQHjԬ}L1͑ kU|CQ~Bȶh=:FZۢ#Ģ܄\9ZՌX4cXazEZ `-}$#!j3-ڈip@GZ ,l4F(jr9S)M󍴴]6)!Z)Ӣb͸>d-$5@iр@'Zz5֣! N,WLaUE5JCϦj4!EU,pDF R5DcQG"5:#t jmQG/S`Z( !UE$AA Skl9z,J|NBFsXhoഝӈn<P'g$(ͣ Y GycQG"i4ģ<yjԕS/G8lJoAͧQvhtNB'I!P;o+V4-lsT)OPiTviFBa5$1'!4:'!բگF&vvxa;5v~>BU~{>BUj9 jνV<&F=J. zيxOȘ4xN<=xNHhHk'լa/11nkE'&&q$Uwb`[&Q$!E= zIeJh EQBKph0ԣi0A9A}nǶÍgGۢBbl; % 5'M#|-N??];)=4e| Goܿg E j9,&m=T8HLaQ/A̦rO^ȭ_{+ps4E970ihAEat\G(z`BqQPXhQ.!~2~BJ8~֯G?m~MIH]e)5+L2|x簘ȗ*& KkQ ?ofzG@~4aH?Tw]/lp!VN[%4S=Bi76@nJKBov1 !CVNԷ[ h4EV\i`B`!NZ`$QE6'!aJvU=CH pZ|_v\dk4}_Ǎʗ8B/v9qAD=jÕkQm-'M WݻGYi7-е6\?oyAC.!yShxVn_}Qš^@ȸjɄ=ryTxThTqѰIB =|LqQBmK&tˣ2śoh"M>weXYGo}2.%zJh2۷5@YCأ*![Ʉ]*еkGUB4z]L}ݛ75Lj.QѴ>w/УGG Fxђ =|{Ti4OL5أZ Y`hjej4,QDBFRI#УF @ݺMÇGF  K1'k@5rl~]DW1$k4aO8y:`b:;3|8]BhÙW֨ٙн6|aZ0O1y]}?]oÙW֨Ձ {u&  M>þ-FkU`S!C ]\<4 LxJ"dh4;{\rYu&<#!C ](ҨAÕLN鑸S[3fшN5E;Eg tˣ(!SNB>1R4y@hѸs1q5=Joy݆1,]3Dw]\%lCuT,pP].MEMrn: *M$j\.}&΢GIU7F_+E21քyzPxBORQJѣCZ!Eۢ ݻ(%M}eBom섮_wxגּKO(Os1Šy4yzhNm9д;/(rhLWk:̢^ Kh>ёш,`FDcg] #=YF-lZ̠F_GB 9P襌0BrY 3nvK(|{NڠT\FΊk%25ۺxV"z-Sajy0~IFF/boW35Ԩ x+ŁIG-55xj5>@t84(Q3TF`uOƠQE1R5]ΉW>F}ń4g v+H&(C&ǴQ(LFK|UBtȰF֭#ܣv&PF9}UBXrnq*ڙB)EQ/r]އc(FjQt7|Xb-Q &NB}{웿HjTt>7[ ըލi[w0BݙF}"W_Lp&^6tZY1™C;yQ= Lp&NjEEz61™PB"΢pOr hWh('8kx&HZN4QM0+F5H!,Ѧ ! &4jn*&|FדO?=!(ӝ| "tmt)wFCۣ~5qz ϫ>tǔw.*I! #cmh$ {駐GR ,+X IDATE=RoaX@c-~ OCӊFa2LH5aQnBhxVz#u o׵k 0$@,HmU=r8LYvA3,;ԙҰѮm@cch6BS]} Բˣ!p#PejTx-}eƲe}t>ZT޿{fY#kE3ˣiƪkQr\ik,J'Q&B^vؑ, {" Hh6MLŷFˢ9NV֞%q܄NO?ġ FEAK{h2!a%t—&$mCoXzhnBi[mmxeQУ@AUlx^\h?"n=\!1kV쑳s#A#DG_0R =3=LHJ"vktF%ѥ'k" )m:tPd,*2w-ijܣ<ʦ0BjTWqnS z("DHq>h(,Xth^Wqr^(`QwʫlШ-ky4:|4j>n<4E"5*@ "$O6P d%v@g*駘e^6PjO֭Qhk4!p(tdx"Sz5  4YlԩǏ{RN1%{IHhbh_`)#DQT.,2r)96QgNS71s{O]5-AԨ]bQ!,,z<Dݢ#y5*}'4®nB<]z<o9 b4z 嵼[bCG?#v?7unQ [vGUHfZnj-~BF Y'̴Z .eF Y `BDHEۢ.&Μ5q#|hmþ~waai=D:b['dXFcգ6!fqBڡBG(6!f*r)k<^R?dbv4zuIbeՆy(aޤ]({g=N8&5Дrfѹ g#W4(!W#txB5zUF~(:ںFڧQu/%+[:FH?0F`F05̩ #YU8!{L2׼PdzUa,{jtg^~2hectJ:Ghdޥ{4ѼƜ_C(wmf"Xf%,'{Ѩ#ydmqԨOrnG J(RFYCErbHI2gEg!?٧F# V^`H>ݻM!dX43!2Clzbr܄'kըH`arg»O Zy,:J@]G Lh*4:wPKsVMj2l)jdP*FƨWbj[KHh^B$?6N5B\Y%-e 2cyBÓjTkIdX& = =q]! !G&Bu)s֞T =VBʤPOEg!kte8n;i)}O֪a7,C>E]!e,CZRd\htL#4mGwh#F5k(sYtĻUBhfJ5[U?F`% %;T '4ˆvP=iqyJTBH^ɞ4J]I9:BgЪtBb儦'h\m*N|y=T\jwE>BJ5SH3jJ'ID%!dGUFdFyF%LȪrO֩Ѵיb\ SI(OJp;pӨ ֜9PL`'-1+!NOVncop򤫄t EeNQ&GMFQ5RI>o~u`n0MFBIB/Z{u#'( QaȒ`֋,*!,6ÇG37do<%%VNh:nW 9q& z50LZT3N }9dUBJdBB ÓxQٷ616> ?AȵcB)CУ!r:W44:uyQ$MH_sͣ%ttDK["n6h=ZF3] `5q&ѣ%H"| q#zt-A/]FLT:4:dwMKuHb儬NuJbH,BQFDh=>S?K>^Kh9-Bb IܻQ= xTOB;hXi2L_$fXR4(ӆ9#S4RUaJ' hXJ2f]fQ~Daιz 6EGWMWfQ >6jFv^606E'e#QYt{spf0 ͢G3ʚ}QYth[f_-k.`Q9Oj|A XT~;w4L(k: {E6nPE凾rEv]imѱӧGrp Dͣ&g&<  ^yEh+(XGjTgQ!Eq. A~kt5zB9k"3-𺵇oSl.BD4nB.uituitKVQ[pMBZ 3xF+!%5BҨrO ǡdPfmp#' 1jBYܒH!oų:i1]Bƨ]<mpۦFU#u]k?,ӄ'Fcb?#$FBm('$G86s:9h&BƉ ]"B~ ihWJ*F9| BH'tq{tzu6BϞ1{TAm2uQYu>B''5 ]k#5mt6BW˸%6ͧ]/لq<9{T't e [3zۣƶփ.r d By.Oۣk]% c dZt>BW{tSSGz a,aw‡}~jnrxԩW;G$GuIךG$trQеknzߣ[觟:<+M[P1ɭ[uv܄rkG?&zsʭk<%2Kj[Ou&:A@uQ^lB܄2kG?zT]sʬk|iTQ;ШS@@)RLjkCШS@@rF'%E=QnBF3j:&L̄4f T5*Nd ucP0 uc'+FQZ'rB4JK'Qb-R1BUfM6~6ÑmEhEYzj,mrbةoTfBr5:&آmbĄj}hIEMFyiC'!4@wL]r~)kuFyP._ !j#'7+{Mt98ȉzբ}oi^p2O/Mx2r hF)`$du5:Zt*|~{tx8 zm&hѩy0MȨ6 ,&B>jsM*Yt=VQJEesG:R;EFu&z~ʞlEOgƴ(эZF:Z<9TG8mî *_w _!n^cBza$چF&L5OB#{S"X#䜧_ < m5:>bhf^0B+(W%hV5uB(l~dY F7H. F#{5BFb-6QbQ:5ۍ̾ NngMȩB.25xv }Ղ.#" 9!\Aȱ1}BhHL!i#(#)9_}^hQ(WM[>:U~y&;,I6"Ьf4lDLPaђ=j?a`BHB*!EKh|-٣xCJ9ҢQFax1QB /;,R 59,UڢF[7o<:Ϫ2\18"J%D !厈q#ͣ I̽=&ѣ+YQJ =|b >M YzܸuڬFph42+F8FE40h4ZDC)wQ✬F8F5Z,gI %ktvF9#kkt]3\FBT#tJ([PFg"$f$ԨV4B;h3RQIh|f/dJ(Ox42 %bZhTVR-̸lB>7T6JD(բ ZYitbA6\x{AgѢ_t " zi)j6dS!Eo"ivSԂmȦB gLڽFylQGUGɻ2;OzF="[рzt~B gL-کF6{z*գEXQr'OR=JLh}QrTJ-gLB ._ݹz+θ)A΂R31ӓ' %ۨGiNOJTOy3o:=ͣ"d wkUite xRZc:G,XF#ĖIQjjZ<ͺ^FK#ĖMQj8δ)A'D()F 4Z!J2R).کFE:Dkn^Beb"57ziHL-EFS`%'chqE'<1YH~r4]ӕpipsk4\ ]ܒ:SBW;N<8~֯5:6~;!T$*!,a4x[љzјokt|@+NlEw" Jfyד3T5ez3%IZ"ez3FdeW1e+!<5+!,c5k~/xKԜ3ez3%څF{:oYjr|3תR #JͷB)Mi;FwC sBOSKsTt[Ѹ\9Ove,Q%fB/-Q5jжf!t O #6<6I(ޕ6P販47{-89z,FiWн{^Nhɉףã"F3R{tB%qrh%tףsO'2~q3eJ;~Tz5T}نμTz=TiX.!D9 i?zBjtTz\^J]\}h5{E4\Qu[hR D/GSh&BwHMh&BWJڍF˟mɣI-'X4/<:z&fܙuI;aI3:kziP B|DHd!y"kHp8Ȓ!4@d%&JDH}:Zk]S{[/ AL5*!!{TlSٛFc,]テ*DoTbf ETzHhz4/!x`;ړ]htܶWt\ Ck(HxC,2*!zD yDoh*!FVBT.Ch$:'0 IDATG]m*L -Ph؆L\"4<^<=htڎws~z5VH֐^:@*!^B K5ZF xkB¢¢jtQ !QaQ aQ5zTBHT@XTBXTn=*!$* ,*!,FU[J JQ;L`?W3p W/8zo YπWVelPVKxó_1>FzRۍ8T?qp6|*3>]%x WǬ|@z19ZqDըHԻqf~-_MkǯOb+(/!귲(m 3kF@+%d88UFka(>84R}֖%ov2[?+(3!dNBƫsF/غFV ?o#Q_뻿NPke֘Z&F,Q< -ZVJHuzѪ)\Z?c|Xν(~]ҝwsz C>'{7zdfGbNzf~ʓs>'u2^`ajoC1 | .3h[F\k(/ m,c}2Z'!Un!CTq89o. k52)V pҞee`-deIq b<'mTB8ncv/#+]l:rq'T5f#teb@'CTB8bۄ J< A?"t,)a1Q5&uŕ+(Ӡl֣L7ѪQ5Yը+FŢjtmũy4!B4Z ajtqPn$,E["GF7KhFXe[#O1m)&գ&T5ڏE5B*!GL5nxǖ5:d 1N u~_ ANbkrrl:!ƾ*g+!0^B+3i( 8js Q !JlFC0 X2!zeD%&(Q7e˞M&BhVC_,gFx j۞II&kܫ;L4+JJKD(&HNw\ׇvC=ZFG}'JɓBIAB_JɶuBioOwoz1SM(T) ._%a芒²mPF|UA;?Fie$K(!J^,Q2!Q!PFu 9pr ~8/_5>Q`'tt{P.@Usiݹy}B!E DQ#'e5* ٧!]H.JȎEn~]]˴b#ioeOeT_ a e&m[qTITBPɹEjtMݤd7NF?֊r;+xohcV,i$DQb< X) & A&F3hnIF{yP 7)L50G4w-Zti]2Ohm բ2ls!TGTB@ɹbJ4>p%QڔGFRϿłeC!ydPI(58~$Dhr&BUDZMYѓ{G+Br^B{L!CH^hoWBahS b_umb;mцP@JL0!;hHaqOcAߞqհuqB"!i'BXTգ>Q aC+VBXBbMFA$pL2<\sK_TBֳb U9seFZ)k7NJk!>T؏畐`BU}nK߱oilΕ@}/3Pj&Н'%!Q L(Աm'sŖeT YJjTϝ bzTFܙ vR eT soPը:aɐ_mJ"9C}Sڕ Fk#8uteڝ7pd!TT~ ܁"҆#'"QeO/o.zj }XD$!5xQ!P!_8o4]'..Е+.Ghn0:ɣã`h{ Ԯ+3CbF.BH7pxB{wxX;+W-5/&oByH֊XW.AH7pxBYwY)wxG$$#:P~ѿQ:$71j5MMo8kƟ=cpcHXQ-cPTd)kʦeq8T'NTNp\BUZjWnբ{*RFIE+ R1ˢ!֦Y'!4}^BaɭZ?D-7ޙU8MmO-PN@!1+!-IMSQ=ףX]BW/ڈ5r ;!UJ"'md! BUm /b<U.ۈ KNgL"%%D}5ҽmolC9 ݼchc{F~QsQy"ʣ72ȣOy56Og#tf% "t$?}"ңhQG::J(Fy5{AB[u4bnތD1nH(@H{!q5k1G/^{2УYMAy5Gr|hx`hB7ogSEy%1.N}p[xAG:=%yiԇU0]iP<#ԃfSj͌w*֢)&eHJ!Т2Uu-ڗ;kC&tzj{Ch_ N-DhO|( ORZt(ɉQ/!ȢѠPChWQJIdѮ1ڇFqR_m? 9KhPe }xF) rq-JLQ !Ȣm3qA.n4 ,ږ8><!1hTLif-:nj_A iQG5J#Xll B]P7g#4J#Xt!vqQRXt<!h4$տaoW?pf˗Tw6H7"D>S6Hl.E."qkm]5nǪP%>WdRKGQϺ &4]T?ލ1z%Ŏ 7FuB׺d5!Ԩ *U[G4*ճxQFt" շ#0񔶞i OuhbGP i]{Q!hF>GQ\hO]IyXbblYǴџ(還5?x(CfQBsQ\æF#T5Lۡr*nԂ`,mx5jB,:zdBa= ^=dZF BEGIN?-Ij3qS5:zZsԎ%y4vϠP5J ԀЛF TI;F TIjЛPhh-EZ=*7c^SLBF sBH(tAi4gyyN1Qi%:.pZP)MiTCOP;4Q|)Ѣx;23vQB-|43!4Z4;!c%\nOH<@+iO6ѩ1Lz\A([ajE4&wYmpBd:a[4MjrWՍѡ Fi а-1,ChKMnZ5jUȲ~o)%5 ~m)Yӄ'!P!Z$@H92J jtBlEiO6Q{ӁH2-.zޛFjlBTIxޓb5jsO'45dX؊fmd'msE*si(;LAD!Y"DTP,JHNvDB[(\h1YTLBIִ 1R~]< &D\BE+!8&B(f5?1X;rڂJ;z1R~BEC xB M !A#D,w]HHFP[FwآF{LN {)z@. j0unBEbGT5;6!gsY(njljRFBM !Ff:4!FnEwQzI1aZYqY(%hV YtW ᔎik,{vRb"#6))A͢%f=i4hE)aݱb5SMHnJ0}J"N3n)PըYâ/(X~@; u=qHu&vщPZ>-"UNeKBI{Z-yW B"ԤzѣjZ T5:75B57f.1o.+ BMIHǢG'T5O?A <4JZ2!s}!(DY[UBF m[?ҨHxO%4*;ғ f&dkTvԨl~9Bht#ahTQ M#d܄LVBfX]G(9tF\5~sU2%1溡J C%ڴFg)w1բFE eζѣBc.20E{N]PPQG~ )7i- rXІ5:hѢn%'T/Лo=t~[ Q7iQgvHhɐE!]n>ѫH:ĥzSFsdBSX%h0Bo*APifBJYFH'[{U|`t^" #F ktehj4:`h4QMMnK(&7*Be0}4kICh}sˣ4BUhQ5Zg#h(Bׯu*Nߐ 4.z h sˣDBU 1Lw}ن<ַJ m_xԙK3# &t:QG%τZ<>F=dE<%)LjGC e_R<3\Ɇj4mSb)B=|t0 94%Jokh(!FIJȥQ it6_|~!t*Ǹ58!&?+mF't|{OhKYsktqBM^BArkukT%( IDATM ֛W,(jQKu F'DZth#eO:>&x]isǒwۨUZd\ixRזG)J&DӨ'ŕ+GG.NQO[TpӯM gwdڲFDF_T=QR jգZ4Fd޺zt2l5Jgw%eڲF^QR4˗G_޺zT5lhdwMхW?8.>2ikˣV"W7y xk2MȧQ +m{s OnBBy\}m{ޛ#Lxrhʯ=|JA~/k(!A~&TF:Q2MjTKmtߺ,Šs4 AtyF] e-~1ht5j@R!̢CIehFcEBy!vIqE4:|-*/a9(+'4Z@hF&\rdr Xtme8PecwE[4nX?]DE:D߈qrIE[4!G.a` 4X E ]PoP˹ F~FmlWLh4ڕĪ ahWoQvBЊ@Bע4B[(TH+?PPaZ1E5 #Y$+%h%$ٳFRx a;ZTm8/UBS[`k@I(>w%4>٨FRYD( 5oTSWM$kȌH&BQFWEqPbh0>BMbGrפ3R"h=(D~R#$_oDFtXBA46 tr^1/Iq`*tr(:Q xR%M1?UG$痋~9\È7q賜! z_v )PHo"2V'(@NO'bC2PejBRsM/SrT7GQ]M+42 *J{16Qsgf/7x4{[ U@NN<ﲮT! -O!D cT^~G1>S!FcpSHAa(w0el\mM6g# eb=VB;h g[B^bs[0ԤA/$FYSweB3K8ggR]B3"li y0VVPț˱FYE* =i:#qtq y./b]BhP[1.N!Oؾ5cv~|%[j` D36G < }]BBl^6)BDl>>j+-vgt'cϞQ(I!t'ѩBl.Z!t'Bl^^R8I!O>cc& N:GR*~WB|>{Sbq q(r? c*Ks)M rz6B>F 34>bc3mrF 3BuơnNk :gbch+Š5!۶hW 6G~ si"+Yn}̦AO=:(W T!.F 9z|,t q1zyisPl?uPhX'FaK1:`>sTQH1:@GG*읣BbQM0G9P!ў~ ߭B:1-sgT59fF@!;Zz4ѣ#yrR}:= sX)3Bzn (o_9/ƞRH`ހӧaIW$x 9z|lsem%UH`h|w:p&иNz'@~F.ؓF}Q FcwR!&p \'@|hZؓF}Q FݫLo@J!̦(_pT5F!hLI!,F_)ƨoT͢(_9:T+90L!XLN!e6[!$F_st% YbԷj*Ą6 F 3):ԃ|!rTjLߜLF!t&>V5% Jʤ8Pb~cMUV,Ԅ'Fs%G ;#L&<10=FCQ-P>0]B O +o̶/!0j;h 0jTFͶg&P]h1~lѪt6 9ٺ>f[0EkΡ8]!6$CL+h'F~쬕7a aW"}}V-èwS4Ijx !?T S C!H| ?^~Jyh?@5̡Ly (hͭP=KSH3)4<>Bav޽^1|G͔uIrUp 0]ʆg|R^N ۣ(4RH·A՜Ph\=i~=C9*n12f!auN!ZUò CZxSvkj:F+N1Yoi22B?rhBul.|joĮlCJ 90 T"*4]Y`0 l(/"YˆQW`A^UU0F5RJ$e&c'T8̈́Wڨr.o3aU7J*- 8 3;F y8'%THiXEYˎ yKF7թiwTK?=|"cT^@t `t:/Ѭ"d0:|S+"jDN!ÞcT 3591|[njg@Qc4B%W "ǨBO7E+5>ҐNQ+g< [h ڠtIrRtl6zc{cBy&K4c4n>/E74Γ(䤨m:} n\]mLSJw) 娎Ѭ MPP꧀p5xԜ %5I{ , MPPn):~c{8jQ y20*{w@j@V1 ( \ ˽`B*(¨XAoN=q3*j?c8cTB >nv)(:$@%cPk*B8(tX9:lNEATOջ1QLpdz"QLpBr._oMʨЇ8jW[f!щb;16!xv/a"*iz"Ѯ alk xLɜ Q!Fs(ԯdl2Wʨ[j3 ǏaIJ!1IЋaI3)ĨF!=PBbTLи"uZ5+BHN} ZNQ7GY ʵP/Q(QBN) hޞ IFs+Y:hIF uVQaJ _}E\N*¨]@OB ` FN=Qt&&:GѨBub4M1 Zƽxڢm~u 1Q!s~R]g.ͨ-:BP"n)Ec ֈ]``궭FW WCѮ>ujL! Fn y(WK Fn%8 y(QX<|[X*hP!-*1*Xc;CLBCXoxE/fB>}VJ0t2*gUu_TC!h>BA+Ĩtל?ɑ'}W6 E # ]!(EQHM20*XCEɠrumWSwGHC EPWP(mD]+& VQ۶ʂPQ :'k XuwgpTD!K2Jh"OA!!h=mhPQ BT_]$ ]6x4\B(hVhR~EoL NP븿ݙP\d }t!hG{(`{P(`KWHB;GT?`ZݝQ%Pȍ&1ozhQhbGq ҭGїIfiPK]FH^B 2i֧O nD!ݵE;R!e*T i WQ^(A\Fp7c5r8[BZXB">^YcO]B ]\ݢBڑ5bq Zy0jeq`Q+B]Ʃ?x5|<7LfPjY<_!,g{-&F % :s`us2u^!6FqњIp3HLBE(stRl"9uYʁQt}o3c F=WiDŽ'BF+d!g ]f򽶹ZBF+tshB5bxצfP|yŭ,fP`1T;MY?<*txAQTG*m6Uu{sK!Rt2J6-?NQBO͠5Z^Z>ƽ1$8 R\pPbp,\!mc^&$a4ӧ}p =ysPSP@n<>&yW0E4~sF ֓$^my%FO}T%*c)rP8h2K\)s0:,ƚOׯu FcyuRt~ 1x{x5>6ѬCI2lE<ɥѬHq w=hWs)h4jB,B~F6VQ cLJ 9WO!*$Ȥ0x\o)Љf"v?bUcy0 !>ypT) fxy!B7Nֆxvի)E#ba$W8 Q4щH(FU;hN\EB0Z=hjy</ Ľy3]1QW8BdG9*V0b!JS(]Z 4OM`ۢ0 @rL)k_mV)Jﮔ(Ga{?mZ ] G9 5Ji iDV;>{ GM>B# FA57(q:؏]{6+8FR mQQ#mbD0jbh*du# X!1jbh*# ޫG7F-JLݞp8O4!֨ݷEEꡀ(\!EQko(t}(\!EQko(tU/ph F? k(Jߎwơ0ڕ+^( ŨG2 T@a=\ QBmzSKS}Bb`*h֎ҋ(tuqQB$n!dc3m汭hc4S`ڍ1<|`c4>C8R̓?ko&WPpp Q( bJUQ}+5!I60Z)Xmֳ~rJQG'%L*7Hd )saJQr(e R4BU7)jr$Ԇ̨PꟺF*ꎛKnc M(HvREQDriBJ̼!R1:Gw4] 9!RH˫/\aNx (3B!R{ʤѪ[O|[ q[&F1~?wjJQ'G]E{䨂]H+$ySJpՔNfSe+gU&T:h5ىP4Bӫ6F)Eu^HLvc{VWg ?Д.:*;<6?B=:ݾ)E]u|[!e"9laRQǷ$N?Q!m,VS8k XPvcu UG2d,07W W(_Q!AwװFTHjQ=ΰ#GorF*vQ=ƒBrK!m}N2]Bz1쾇(sZE39<֎wu0RHo``\ѸB BB:Ɓ&J Yҧ`=Nq106Vщf3ͦ"Ÿܓmڅ6F߽҈E!M-QS6F{R )F@!'uI F*|N"74]wv:F(n#ەR\X?V9zCFk}A!vF=kFXxs^Ջ(d d^u|[ v/O9Jom&7dIDAT*0dRXUW+)z*s?駖1^!k؇Z9E}+hwFA~vV "[ކ*f.j՚B=b1B"T&=EIZ0*b[¨QhUH5Sg%(A!t,BvzYB tYd5c6\@BS)JQ(]wqڢB90j(1R5 !N*QZ%kQb\lZBƓvq5bTuKs/P'NQ#dZ_u]ܾV`BStCov|ʴF+;I]STAh1M5zYD!sBeV(dcA 2Ai۝PRjÃщBF͇߬d?>@cIB֌ VPmasf&VfBL!]!B F'o \}y[heqRm'C犲(iV|oӋ(d%!Wɧ56 [!U>-[ءt($*EZ1huZR{;|:3BQ*eTNiʠ7(_f&ͤPFL(M@&5&UHhtJR.T!F#f3{R4f63Y;͢PZ>CYGe(cI|UhJ*BDZN*d,BHZNr(4nY([0RP}aLd0):\$TFy YUH9 Y,ˣv ͤPV*ƔZ mhs B)RzctleQ\# VY6֋QZd6mH6 o& )qHTdb qi-, eh"H46VQ5];^[DȂ$Ǩʍ.ShDEPt? u+h (>^jHO/6I/f(EשPV ɘuQ(y WQ򵋒1Q DQ((ͽdJ1J vHzBRP,^6^m;ݢ Cv\_Eh(4n V 4L8҃qQ(* EV9RB [YFWQZn)J(:|sb9а+J&1D8ת(v:|sb9аRkدlK#K%* Z Pe뗔uG {蘭 8Z9dx- EGa?Gj*>'O9cZH%Q9LPޓ,B~Z~L\rQo=G^}DJ(&q3bPAhMnvLSB߅R5pQ+ ;%D:2c4B+[r~֟(B56k+XZ!{%+4޼qvYs+ I6ݛӖۿ|_SQϘB,ֺz\RQϘB,[[G[!!O!F7>nHcrrԃќ_BLF*$29[(tu[RF`0)"B݇ќ epPȋm+tuQzt~m v+웁qlV:E6(,rmB:Ek|nZ!F+[(s=`2):p"-3m $*GW(F+G q 􈻣;uU+k,V&EMДSʤ^B&G IQ[PvmJPCQLU?ziw #2)st Ů3XLvUyJQj E2)qt; 10*X zN?~48\븦P#}^g( ͭPJw2#(68UZhX)R$F_N7  )v eC*[`tHQctHvVѦWZ$ˉV! #|]BH0 @oA RHm.0 ;$l:nԤtR*l>) 5ZҜ9[Ph4Δr5FNoIK1M3\ MYL %lUX%n΅9᩻N~(X!^!c^iVrlivr"Q/$x 简RxΌeB@}{ȕYZgMa &&Sjӧ!)fc4G' )uzt F)tr"Qb OͧP9Lлi ؖ0ZUjy;OcCLĈ ~MBks6?{W Hsjk\ mhY1MS'Ph4BB+htӘVNc(IDcľ4ƴQH!96iLӠ-orQ(6iL[<-1mR(vFߏJ=>z9|(*٧wovS訐RQGE+deOA8QtM E$8GcYӣPtQ%)uæG?脣xrlm7:5= E'݁BM~B G1y?> s4q˞!~$wy FV\5F=h9B/4Μ1]BYc qN?F٩ρB( V [ZRlB FiXBS?(U (4G!- u(Y!Z6L6Q| )gI!a.Z!_ *$L *$L(6{#.Q+Y5,1h~ yoR!.FkVzEQt9*>FTEѷQl|)(-îp| 9(z[ՊR 19j&zN' U!7E]Bst{ )J:$F ;q 1WKV,qFJ}h6*lV+t{J"FV^_zy*89`(o߲9J̈ ${xIKuno%fDae(F wd_BBo29X 7ݺBLC`/hNU0P |WY FgSh5)6uaw-d\l.V!Иl]֌ ]Bh5hFMV2ct J5aI! @`Ϫ-y@MJ!6ELF$6E)fR=Ĵ 6/Q5RuHP[P_3DbRuH,;F*V@- ˗9jUH7|><09*.SHaiNr)h92J]b{ `Jp>GaSTlb[ q[oS4QhHYFRh8 RgV͛Ga~Z Vehf|p(YV0p}ߊP:y&ѬD0yY1xיbti 15Z0*`4fƬ`4fϲQ 1r.0*3TAʞ:#Q!&P a4YV0q!5$1ᩉ4 1ILxj- bCLhSHj)YV0z("JQ3̈́QBQIP4$P IMxO˭Ԅ|g1|DWj=1>H܇Ax)p.b(Hbwu͵DO$I0;: T[ 7 R(TE]Bèx}d['${ q3Ee+?r;=fZ$+$"evE+T0񥚏55mZB DQ(SH% (.z-aT$F$Iyl -:S;[B;èWQ!TxbN F^e*HX(qvQv#x((UQ(7@ B(9aVC8P%)$0bq( >TC ^Zu(| F9qО!LMC| FYS(@Ƭ.a.a Fl\M-(| Fo.Z1TPFW;N Qh1יP*%;X1d ǢP<9uj p1E+{T.j ZB$n(f&\IJv+}*tq'/u][mŋ %PHbvq F1rwḧ́QL/”XB3E!]\9&Qxһ0G3/م\/”XE]\9'9`mF~͈D\($)dP.^TfMmF(BSa49Q(M fB h2GghBnnF )"Ԋc4Q :r#Baa(C!꙳޿9hbMQ)Q^!D5Q+@IE_gfS W(6ĔHb i~Ռ BFQAי5(^+hn4S`iI.FYr(fDthteQ(L4 e9#Fם0Ec)BaF΢к0y`Y91 V2fwD=1*%-G( 1Cwx0!.:F!!nX!!`=m)9+{tdA!FgRTĨB7QލBcsC (K!*$*, r49.FFxF M4Q43$fQG9:=h$`R`umY1ʘ #=dxV($ #e=8, OY9^&%QTN`kКx)X͎gt2>`Q4;$wb<@.j):rQ E FQ_68J+Y1:Pt(#8f@сRp([/ ҃cJh(&Gɑ5I4 W3؃ ̫eE!w/ 2>W0Qr`i;I={fp{t`_Srex(#t- 丼R Ĩ0 M/{溅QFhN1*dbS Qxr$hAS_'s5FIQgE@2}zƨ3ɆF+xHկHQ:Fhx*1*T(VA6BaňW(DQ`>C)ĹPZ|*r9ۺ1s4M!s"4+hpraThz%dEBM@[t U)>FO;FM#;E@;B*BHT}w zE(d4}aKkr" -z5;FԾV(Dδu- }m+*,/SPA!$|Gp[| mͽT0̩^WE( ·LrCVB)_(DzVuyFJ37kr;J@ys1nO!t/Co 1C] 0-EҜN^~%Mzċ~9 , !QeصBT~|5JޑDV :>Â*l4nrV( dl0뿪?Q !/F^vWa%3[9H154ۃB @Z^~GQR!h/?ьR Ay(X?T3bVHD!Ohu a3PYT <ͣ |_SۺM*Q9%{%Έѕ*/ 'B6RSѾ6J,VXΤE`XboŊ+ƲbŊcYhbŊl֑bŊۀ9oXb6`s>TXb?m&@L}bŊm¾)wFbŊcYhbŊ`XbXV0ZXb,+-VX1+V F+VeŊ+ƲbŊcYhbŊ`XbXV0ZXb,+-VX1+V F+VeŊ+ƲbŊcYhbŊ`XbXV0ZXb,+-VX1+V F+VeŊ+ƲbŊcYhbŊ`XbXV0ZXb,+-VX1!8vcIENDB`gstat/vignettes/spatio-temporal-kriging.bib0000644000176200001440000003163514646417261020655 0ustar liggesusers% Encoding: windows-1252 @Article{bakar2015, author = {Bakar, Khandoker Shuvo and Sahu, Sujit K}, title = {{spTimer}: Spatio-Temporal Bayesian Modelling Using {R}}, journal = {Journal of Statistical Software}, year = {2015}, volume = {63}, number = {15}, pages = {1--32}, url = {http://dx.doi.org/10.18637/jss.v063.i15} } @Manual{Beygelzimer2013, Title = {{FNN}: Fast Nearest Neighbor Search Algorithms and Applications}, Author = {Alina Beygelzimer and Sham Kakadet and John Langford and Sunil Arya and David Mount and Shengqiao Li}, Note = {R package version 1.1}, Year = {2013}, Url = {https://CRAN.R-project.org/package=FNN} } @Article{Bilonick1988, Title = {Monthly hydrogen ion deposition maps for the northeastern {U.S.} from {J}uly 1982 to {S}eptember 1984}, Author = {Richard A. Bilonick}, Journal = {Atmospheric Environment (1967) }, Year = {1988}, Number = {9}, Pages = {1909 - 1924}, Volume = {22}, ISSN = {0004-6981}, Keywords = {\{NCA\} Precipitation Quality Network}, Url = {http://www.sciencedirect.com/science/article/pii/0004698188900807} } @Article{biondi, Title = {Space-time kriging extension of precipitation variability at 12 km spacing from tree-ring chronologies and its implications for drought analysis }, Author = {Biondi, F.}, Journal = {Hydrology and Earth System Sciences Discussussions}, Year = {2013}, Pages = {4301-4335}, Volume = { 10 }, Url = {http://dx.doi.org/10.5194/hessd-10-4301-2013} } @Book{Cressie2011, Title = {Statistics for spatio-temporal data}, Author = {Cressie, Noel and Wikle, Christopher K}, Publisher = {Wiley}, Year = {2011} } @Article{DeCesare2001, Title = {Estimating and modeling space-time correlation structures}, Author = {L. {De Cesare} and D.E Myers and D Posa}, Journal = {Statistics \& Probability Letters}, Year = {2001}, Number = {1}, Pages = {9--14}, Volume = {51}, Url = {http://dx.doi.org/10.1016/S0167-7152(00)00131-0}, ISSN = {0167-7152}, Keywords = {Space–time correlation}, Owner = {b_grae02}, Timestamp = {2013.04.17} } @Article{DeIaco2001, Title = {Space-time analysis using a general product-sum model}, Author = {De Iaco, S. and D.E. Myers and D. Posa}, Journal = {Statistics \& Probability Letters}, Year = {2001}, Number = {1}, Pages = {21--28}, Volume = {52}, Url = {http://dx.doi.org/10.1016/S0167-7152(00)00200-5}, ISSN = {0167-7152}, Keywords = {Space–time random fields}, Owner = {b_grae02}, Timestamp = {2013.04.17} } @Article{finley2015, author = {Finley, Andrew O and Banerjee, Sudipto and Gelfand, Alan E}, title = {{spBayes} for Large Univariate and Multivariate Point-Referenced Spatio-Temporal Data Models}, journal = {Journal of Statistical Software}, year = {2015}, volume = {63}, number = {13}, url = {http://dx.doi.org/10.18637/jss.v063.i13} } @Article{Gasch2015, author = {Caley K. Gasch and Tomislav Hengl and Benedikt Gr{\"a}ler and Hanna Meyer and Troy S. Magney and David J. Brown}, title = {Spatio-temporal interpolation of soil water, temperature, and electrical conductivity in {3D} + {T}: The {C}ook Agronomy Farm data set}, journal = {Spatial Statistics}, year = {2015}, volume = {14, Part A}, pages = {70 - 90}, issn = {2211-6753}, keywords = {Digital soil mapping}, url = {http://www.sciencedirect.com/science/article/pii/S2211675315000251} } @Article{hu, Title = {Spatio-temporal Transmission and Environmental Determinants of Schistosomiasis Japonica in Anhui Province, China}, Author = {Yi Hu and Rui Li and Robert Bergquist and Henry Lynn and Fenghua Gao and Qizhi Wang and Shiqing Zhang and Liqian Sun and Zhijie Zhang and Qingwu Jiang}, Journal = {PLoS Neglected Tropical Diseases}, Year = {2015}, Number = {2}, Volume = {9}, Url = {http://dx.doi.org/10.1371/journal.pntd.0003470} } @Article{Kilibarda2014, Title = {Spatio-temporal interpolation of daily temperatures for global land areas at 1 km resolution}, Author = {Kilibarda, Milan and Hengl, Tomislav and Heuvelink, Gerard B. M. and Gr{\"a}ler, Benedikt and Pebesma, Edzer and Per\v{c}ec Tadi{\'c}, Melita and Bajat, Branislav}, Journal = {Journal of Geophysical Research: Atmospheres}, Year = {2014}, Number = {5}, Pages = {2294--2313}, Volume = {119}, ISSN = {2169-8996}, Keywords = {spatio-temporal kriging, spatio-temporal interpolation, daily air temperature, MODIS LST}, Url = {http://dx.doi.org/10.1002/2013JD020803} } @Article{kj99, Title = {Geostatistical Space-Time Models: A Review}, Author = {Kyriakidis, Phaedon C. and Journel, Andr\'{e} G.}, Journal = {Mathematical Geology}, Year = {1999}, Number = {6}, Pages = {651--684}, Volume = {31}, Url = {http://dx.doi.org/10.1023/A:1007528426688}, Publisher = {Kluwer Academic Publishers-Plenum Publishers} } @Article{lindgren2015, author = {Lindgren, Finn and Rue, H{\aa}vard}, title = {Bayesian spatial modelling with {R-INLA}}, journal = {Journal of Statistical Software}, year = {2015}, volume = {63}, number = {19}, publisher = {University of Bath}, url = {http://dx.doi.org/10.18637/jss.v063.i19} } @Article{marek, Title = {Using geovisual analytics in {G}oogle {E}arth to understand disease distribution: a case study of campylobacteriosis in the {C}zech {R}epublic (2008--2012)}, Author = {Luk\'{a}\u{s} Marek and Pavel Tu\u{c}ek and V\'{i}t P\'{a}szto}, Journal = {International Journal of Health Geographics}, Year = {2015}, Number = {7}, Pages = {1--13}, Volume = {14}, Url = {http://www.ij-healthgeographics.com/content/14/1/7} } @Article{Nash2014, Title = {On Best Practice Optimization Methods in {R}}, Author = {John C. Nash}, Journal = {Journal of Statistical Software}, Year = {2014}, Number = {2}, Pages = {1--14}, Volume = {60}, Url = {http://www.jstatsoft.org/v60/i02} } @Article{optim, Title = {Numerical Optimization in {R}: {B}eyond optim}, Author = {Ravi Varadhan}, Journal = {Journal of Statistical Software}, Year = {2014}, Month = {9}, Number = {1}, Pages = {1--3}, Volume = {60}, Url = {http://dx.doi.org/10.18637/jss.v060.i01} } @Article{pe1, Title = {Mapping Sea Bird Densities over the {N}orth {S}ea: Spatially Aggregated Estimates and Temporal Changes}, Author = { Edzer J. Pebesma and Richard N.M. Duin and Peter A. Burrough}, Journal = {Environmetrics}, Year = { 2005 }, Number = {6}, Pages = {573--587}, Volume = {16}, Url = {http://dx.doi.org/10.1002/env.723} } @InCollection{pe2, Title = {Spatio-temporal mapping of sea floor sediment pollution in the {N}orth {S}ea}, Author = {Edzer J. Pebesma and Richard N.M. Duin}, Booktitle = {Fifth European Conference on Geostatistics for Environmental Applications, GeoENV2004}, Publisher = {Springer}, Year = {2005}, Editor = { Philip Renard and Roland Froidevaux }, Pages = { 367--378 }, Url = {http://dx.doi.org/10.1007/3-540-26535-X_31} } @Article{Pebesma2004, Title = {Multivariable geostatistics in {S}: the gstat package}, Author = {Edzer J. Pebesma}, Journal = {Computers \& Geosciences}, Year = {2004}, Pages = {683--691}, Volume = {30}, Owner = {b_grae02}, Timestamp = {2013.04.17}, Url = {http://dx.doi.org/10.1016/j.cageo.2004.03.012} } @Article{Pebesma2012, Title = {{spacetime}: Spatio-Temporal Data in {R}}, Author = {Edzer Pebesma}, Journal = {Journal of Statistical Software}, Year = {2012}, Number = {7}, Pages = {1--30}, Volume = {51}, Url = {http://www.jstatsoft.org/v51/i07/} } @Manual{RCoreTeam2014, Title = {R: A Language and Environment for Statistical Computing}, Address = {Vienna, Austria}, Author = {{R Core Team}}, Organization = {R Foundation for Statistical Computing}, Year = {2014}, Url = {http://www.R-project.org/} } @Manual{RCoreTeam2015, title = {R: A Language and Environment for Statistical Computing}, author = {{R Core Team}}, organization = {R Foundation for Statistical Computing}, address = {Vienna, Austria}, year = {2015}, url = {https://www.R-project.org/} } @Article{Schlather2014, Title = {Analysis, Simulation and Prediction of Multivariate Random Fields with Package {RandomFields}}, Author = {Martin Schlather and Alexander Malinowski and Peter J. Menck and Marco Oesting and Kirstin Strokorb}, Journal = {Journal of Statistical Software}, Year = {2014}, Number = {8}, Pages = {1--25}, Volume = {63}, Url = {http://www.jstatsoft.org/v63/i08} } @Article{sigrist2015, author = {Fabio Sigrist and Hans R. K\"unsch and Werner A. Stahel}, title = {{spate}: An {R} Package for Spatio-Temporal Modeling with a Stochastic Advection-Diffusion Process}, journal = {Journal of Statistical Software}, year = {2015}, volume = {63}, number = {14}, pages = {1--23}, url = {http://www.jstatsoft.org/v63/i14/} } @Article{Snepvangers2003, Title = {Soil water content interpolation using spatio-temporal kriging with external drift}, Author = {J.J.J.C Snepvangers and G.B.M Heuvelink and J.A Huisman}, Journal = {Geoderma}, Year = {2003}, Number = {3 -- 4}, Pages = {253--271}, Volume = {112}, Url = {http://dx.doi.org/10.1016/S0016-7061(02)00310-5}, ISSN = {0016-7061}, Keywords = {Geostatistics}, Owner = {b_grae02}, Timestamp = {2013.04.17} } @Article{yoon, author = {Seo Youn Yoon and Srinath K. Ravulaparthy and Konstadinos G. Goulias}, title = {Dynamic diurnal social taxonomy of urban environments using data from a geocoded time use activity-travel diary and point-based business establishment inventory }, journal = {Transportation Research Part A: Policy and Practice }, year = {2014}, volume = {68}, number = {0}, pages = {3 - 17}, url = {http://dx.doi.org/10.1016/j.tra.2014.01.004}, issn = {0965-8564} } gstat/vignettes/.install_extras0000644000176200001440000000003314646417261016450 0ustar liggesusersspatio-temporal-kriging.bibgstat/vignettes/st.Rnw0000644000176200001440000003643514646417261014550 0ustar liggesusers%% Document started, Sat Jul 3 19:30:52 CEST 2004, my 37th birthday, %% while being stuck for 24 hours at Philadelphia airport, on my way %% back from the joint TIES/Accuracy 2004 symposium in Portland, ME. %% Continued, Oct 28, during the Apmosphere mid-term review. Oh, shame. \documentclass[a4paper]{article} \usepackage[colorlinks=true,urlcolor=blue]{hyperref} \newcommand{\code}[1]{{\tt #1}} \SweaveOpts{echo=TRUE} \title{Introduction to Spatio-Temporal Variography } % \VignetteIndexEntry{ Introduction to Spatio-Temporal Variography } \author{ \includegraphics[width=.4\columnwidth]{ifgi-logo_int}\\ \href{mailto:edzer.pebesma@uni-muenster.de}{Edzer Pebesma}, \href{mailto:ben.graeler@uni-muenster.de}{Benedikt Gr\"{a}ler} } \date{\small \today } \begin{document} \setkeys{Gin}{width=0.9\textwidth} \maketitle \section{Introduction} Since \code{gstat} package version 1.0-0, a dependency of gstat on the R package \code{spacetime} was introduced, allowing the code in \code{gstat} to exploit spatio-temporal data structures from that package. This vignette describes the possibilities and limitations of the package for spatio-temporal geostatistics. To understand some of the possibilities and limitations, some knowledge of the history of the software is needed. The original \code{gstat} software (Pebesma and Wesseling, 1998) was a standalone computer {\em program} written in around 25,000 lines of C code, and would do geostatistical modelling, prediction and simulation. The \code{gstat} R package (Pebesma, 2004) consisted mostly of an R interface to this C code, together with convenience functions to use R's modelling interface (formula's, see \code{?lm}) and graphic capabilities (trellis graphics in package \code{lattice} to show cross variogram as matrix plots; interaction with variogram clouds using base plots). Starting 2003, a group of programmers developed a set of classes and methods for dealing with spatial data in R (points, lines, polygons, grids), which was supported by the publications of the well-known ASDAR book (Bivand et al. 2008; see also \url{http://www.asdar-book.org/}) and helped convergence in the user community, with in 2011 over 2000 subscribers on the {\tt r-sig-geo} mailing list. Package \code{gstat} was one of the first packages that adopted and benefited from these classes. To realize a particular idea, writing code in C typically takes about 10-20 times as long as writing it in R. C code can be more efficient, gives more control over memory usage, but is also more error prone--mistakes in C code make an R session crash, something that is hard to do when writing R code. The original C code of \code{gstat} (Pebesma and Wesseling, 1998) provides all kriging varieties (universal, ordinary, simple; univariable, or multivariable as in cokriging) for two- or three-dimensional data. When the spatial domain is constrained to two dimensions (and this might cover over 99\% of the use cases!), the third dimension might be used to represent time. As such, the {\em metric} variogram model, which allows for geometric anisotropy definition in three dimensions, can be used for spatio-temporal kriging. When defining the three-dimensional variogram as the sum of 2 or more nested variogram (summed) models, one can choose anisotropy coefficients for a single model such that this model is {\em effectively} zero in some directions, e.g. in space {\em or} in time; this allows one to approximate the so-called space-time sum model. It should be noted that at the C code there is no knowledge whether a third dimension represents space, or time. As such, particular characteristics of time cannot be taken care of. Since the second half of 2010, the development of an R package \code{spacetime} started. It provides methods and classes for spatio-temporal data, and builds on the spatial data classes in \code{sp} and time series classes in \code{xts}. This document will explain how data in this form, and methods provided by this package, can be used for spatio-temporal geostatistics. We will work with a data set with air quality (PM10) measurements over germany, taken from rural background stations available in the data sets provided by the European Environmental Agency. <<>>= library(spacetime) rm(list = ls()) data(air) ls() @ \section{Variography} \subsection{Temporal autocorrelation and cross correlation} We will look into a subset of the data, ranging from 2005 to 2010, and remove stations that have only missing values in this period: <<>>= if (!exists("rural")) rural = STFDF(stations, dates, data.frame(PM10 = as.vector(air))) rr = rural[,"2005::2010"] unsel = which(apply(as(rr, "xts"), 2, function(x) all(is.na(x)))) r5to10 = rr[-unsel,] summary(r5to10) @ Next, we will (rather arbitrarily) select four stations, which have the following labels: <<>>= rn = row.names(r5to10@sp)[4:7] rn @ In the following, autocorrelation functions are computed and plotted. The resulting plot is shown in Figure~\ref{fig:acf}. <>= par(mfrow=c(2,2)) # select 4, 5, 6, 7 for(i in rn) acf(na.omit(r5to10[i,]), main = i) par(mfrow=c(1,1)) @ \begin{figure}[hbt] \begin{center} <>= par(mfrow=c(2,2)) # select 4, 5, 6, 7 rn = row.names(r5to10@sp)[4:7] for(i in rn) acf(na.omit(r5to10[i,]), main = i) @ \end{center} \caption{Autocorrelations for PM10; time lag unit in days.} \label{fig:acf} \end{figure} Auto- and cross correlations can be computed when a multivariate time series object is passed to {\tt acf}: <>= acf(na.omit(as(r5to10[rn,], "xts"))) @ The resulting plot is shown in Figure~\ref{fig:ccf}. \begin{figure}[hbt] \begin{center} <>= acf(na.omit(as(r5to10[rn,], "xts"))) @ \end{center} \caption{autocorrelations (diagonal) and cross correlations (off-diagonal) for the four stations selected; time lag unit in days. } \label{fig:ccf} \end{figure} From these graphs one should be able to observe the following \begin{itemize} \item autocorrelations for lag 0 are always 1 \item cross correlations for lag 0 are not always 1 \item cross correlations can be asymmetric, meaning that when $\rho_{AB}(h)$ is the correlation between $Z(s_A,t)$ and $Z(s_B,t+h)$, $$\rho_{AB}(h) = \rho_{BA}(-h) \ne \rho_{AB}(-h)$$ with $s_A$ and $s_B$ the two stations between which a cross correlation is computed, and $h$ the (directional!) lag between the series. \end{itemize} The plot further more shows that for these four stations the asymmetry is not very strong, but that cross correlations are fairly strong and of a similar form of autocorrelations. This kind of plot does not work very well in layouts of e.g. 10 x 10 sub-plots; {\tt acf} automatically chooses 4 x 4 as the maximum a single plot. To try this out, do a 7 x 7 plot <>= acf(na.omit(as(r5to10[4:10,], "xts"))) @ and note that here we see in the last figure (DESH \& DESN04) a pair of plots with nearly no cross correlation. This might have to do with the spatial distance between these two stations: <<>>= library(sp) print(spDists(r5to10[4:10,]@sp), digits=3) @ (What is the spatial distance between stations DESH and DESN04?) \subsection{Spatial correlation, variograms} In the next steps, we will sample 100 time instances randomly, <<>>= rs = sample(dim(r5to10)[2], 100) @ we select these instances as a {\tt SpatialPointsDataFrame} and add a time index to them. After this we bind them together in a single {\tt SpatialPointsDataFrame} which has a time index {\tt ti}: <<>>= lst = lapply(rs, function(i) { x = r5to10[,i]; x$ti = i; rownames(x@coords) = NULL; x} ) pts = do.call(rbind, lst) @ Then, we can compute the pooled variogram <<>>= library(gstat) v = variogram(PM10~ti, pts[!is.na(pts$PM10),], dX=0) @ and plot it (Figure~\ref{fig:vgm}): <>= # plot(v, fit.variogram(v, vgm(1, "Exp", 200, 1))) vmod = fit.variogram(v, vgm(100, "Exp", 200)) plot(v, vmod) @ \begin{figure}[hbt] \begin{center} <>= # plot(v, fit.variogram(v, vgm(1, "Exp", 200, 1))) vmod = fit.variogram(v, vgm(100, "Exp", 200)) print(plot(v, vmod)) @ \end{center} \caption{sample spatial variogram, averaged over 100 randomly chosen time steps} \label{fig:vgm} \end{figure} The fitted model is this: <<>>= vmod @ One should note that the fit is rather poor, and not forget that we only have 53 stations selected. The time resolution is rich (1862 days) but the number of stations is small: <<>>= dim(r5to10) @ We can fit a spatio-temporal variogram the usual way, by passing an object of class {\tt STFDF} (Pebesma, 2012): <>= vv = variogram(PM10~1, r5to10, width=20, cutoff = 200, tlags=0:5) @ Alternatively, if this takes too long, a temporal subset can be taken, e.g. using the first 200 days: <>= vv = variogram(PM10~1, r5to10, width=20, cutoff = 200, tlags=0:5) @ taking random days from the full period will lead to the a wrong assumption that every time index increment reflect a constant lag increase. As an alternative, we will here load the precomputed S/T variogram: <<>>= data(vv) @ % remove the model column to keep text and figures in line. <>= vv <- vv[c("np", "dist", "gamma", "id", "timelag", "spacelag")] @ Plotting this object can be done in several ways, two 2D-plots are shown in Figure~\ref{fig:map} and a 3D wireplot is shown in Figure~\ref{fig:wire}: <>= plot(vv) plot(vv, map = FALSE) @ \begin{figure}[hbt] \begin{center} <>= print(plot(vv), split = c(1,1,1,2), more = TRUE) print(plot(vv, map = FALSE), split = c(1,2,1,2)) @ \end{center} \caption{Spatio-temporal sample variogram map (top) and sample variograms for each time lag (bottom); both figures depict the information of object {\tt vv}.} \label{fig:map} \end{figure} \subsection{Fitting a spatio-temporal variogram model} At first, we try to fit a metric model with spatio-temporal anisotropy: <<>>== metricVgm <- vgmST("metric", joint=vgm(50,"Exp",100,0), stAni=50) metricVgm <- fit.StVariogram(vv, metricVgm) @ As numerical criterion to judge the goodness of fit of model and sample variogram, the root-mean-squared-difference between the surfaces can be obtained by: <<>>= attr(metricVgm, "optim")$value @ The final model can be plotted with the sample variogram (Figure~\ref{fig:mm}): <>= plot(vv, metricVgm) @ \begin{figure}[hbt] \begin{center} <>= print(plot(vv, metricVgm)) @ \end{center} \caption{Sample variogram map (left) and fitted metric model (right).} \label{fig:mm} \end{figure} \pagebreak Now, let us try to fit and plot a separable model (Figure~\ref{fig:sm}): <<>>== sepVgm <- vgmST("separable", space=vgm(0.9,"Exp", 123, 0.1), time =vgm(0.9,"Exp", 2.9, 0.1), sill=100) sepVgm <- fit.StVariogram(vv, sepVgm, method = "L-BFGS-B", lower = c(10,0,0.01,0,1), upper = c(500,1,20,1,200)) @ To compare this model with the previous one, we look at the optimized root-mean-squared-differences between the two surfaces and plot sample and both models: <<>>= attr(sepVgm, "optim")$value plot(vv, list(sepVgm, metricVgm)) @ \begin{figure}[hbt] \begin{center} <>= print(plot(vv, list(sepVgm, metricVgm))) @ \end{center} \caption{Sample variogram map (left), fitted separable model (middle) and fittted metric model (right).} \label{fig:sm} \end{figure} A wireframe (3D) plot of sample variogram and fitted variogram models can be obtained e.g. by <>= library(lattice) plot(vv, list(sepVgm, metricVgm), all=T, wireframe=T, zlim=c(0,120), zlab=NULL, xlab=list("distance (km)", rot=30), ylab=list("time lag (days)", rot=-35), scales=list(arrows=F, z = list(distance = 5))) @ which is shown in Figure~\ref{fig:wire}. Further spatio-temporal model definitions can be found in the help pages of {\tt fit.StVariogram} and {\tt variogramSurface}. The demo {\tt stkrige} presents further examples and illustrates an interactive 3D-plot of sample variogram and the fitted variogram model. An interactive variogram exploration web-tool is avaialble at \url{http://giv-graeler.uni-muenster.de:3838/spacetime/}. \begin{figure}[hbt] \begin{center} <>= library(lattice) print(plot(vv, list(sepVgm, metricVgm), all=T, wireframe=T, zlim=c(0,120), zlab=NULL, xlab=list("distance (km)", rot=30), ylab=list("time lag (days)", rot=-35), scales=list(arrows=F, z = list(distance = 5)))) @ \end{center} \caption{Wireframe plots of sample and fitted space-time variograms.} \label{fig:wire} \end{figure} \clearpage \section{Spatio-temporal prediction} The vignette in package \code{spacetime} gives an example of using the gstat function \code{krigeST} for spatio-temporal kriging of the Irish wind data. The \code{krigeST} function uses global kriging, but only needs to invert the purely spatial and purely time covariance matrices in the separable case. For more generic spatio-temporal kriging where space is two-dimensional, one could use \code{krige}, defining the observations and prediction locations as three-dimensional data sets, see for an example <>= demo(gstat3D) @ It needs to be pointed out that in that case, the time (typically the third dimension) needs to be numeric, and three-dimensional anisotropy needs to be defined properly (see \code{?vgm}). In case the data set is too large for global kriging, one could try to use local kriging, and select data within some distance, or by specifying \code{nmax} (the nearest $n$ observations). In both cases, it is advisable to transform time such that one can use an {\em isotropic} variogram model in the three dimensions, as only in that case the nearest $n$ observations correspond to the $n$ most correlated observations. \code{krigeST} provides a solution where a \code{bufferNmax}-times larger neighbourhood is evaluated within the covariance model and the strongest correlated \code{nmax} neighbours are selected. An additional consideration is that in space-time, observations may not be regularly spaced. In some cases, the nearest $n$ observations may come from a single measurement location, which may lead to sharp jumps/boundaries in the interpolated values. This might be solved by using larger neighbourhoods, or by setting the \code{omax} in \code{krige} or \code{gstat} calls to the neighbourhood size to select {\em per octant} (this should be combined with specifying \code{maxdist}). %\section{Spatio-temporal simulation} \section*{References} \begin{itemize} \item Bivand, R., E. Pebesma and V. Gomez-Rubio, 2008. Applied Spatial Data Analysis with R. Springer. \item Cressie, N.A.C., 1993. Statistics for Spatial Data. Wiley. \item Cressie, N. and C. Wikle, 2011. Statistics for Spatio-temporal Data. Wiley. \item Pebesma, E., 2012. spacetime: Spatio-Temporal Data in R. Journal of Statistical Software, volume 51, issue 7; \href{http://www.jstatsoft.org/v51/i07/}{1-30}. \item Pebesma, E.J., Wesseling, C.G., 1998. Gstat, a program for geostatistical modelling, prediction and simulation. Computers \& Geosciences, 24 (1), pp. 17--31. \item Pebesma, E.J., 2004. Multivariable geostatistics in S: the gstat package. Computers \& Geosciences \href{http://www.sciencedirect.com/science/journal/00983004}{30: 683-691} \item Ver Hoef, J.M., Cressie, N.A.C, 1993. Multivariable Spatial Prediction. Mathematical Geology, 25 (2), pp. 219--240. \end{itemize} \end{document} gstat/vignettes/spatio-temporal-kriging.Rnw0000644000176200001440000015665014646417261020674 0ustar liggesusers\documentclass[a4paper]{article} \usepackage[colorlinks=true,urlcolor=blue,citecolor=blue]{hyperref} \usepackage{alltt} \usepackage{amsfonts} \usepackage{enumerate} \usepackage{graphicx} \usepackage{multirow} \usepackage{natbib} %% following the RJournal.sty \usepackage{geometry} \usepackage{booktabs} \usepackage{amsmath} \RequirePackage{fancyvrb} \RequirePackage{alltt} \DefineVerbatimEnvironment{example}{Verbatim}{} \renewenvironment{example*}{\begin{alltt}}{\end{alltt}} \RequirePackage[font=small,labelfont=bf]{caption} \geometry{a4paper, textwidth=14cm, top=1cm, bottom=1cm, includehead,includefoot,centering, footskip=1.5cm} \raggedbottom \RequirePackage{setspace} \renewcommand{\abstract}[1]{% \setstretch{1}% \noindent% \small% \textbf{Abstract} #1 } \newcommand{\address}[1]{\addvspace{\baselineskip}\noindent\emph{#1}} \date{\footnotesize Mar 25, 2016} \newcommand{\code}[1]{{\footnotesize\tt #1}} \newcommand{\samp}[1]{{\tt #1}} \newcommand{\pkg}[1]{{\bf #1}} \newcommand{\CRANpkg}[1]{{\href{https://cran.r-project.org/package=#1}{\bf #1}}} \newcommand{\email}[1]{{\href{mailto:#1}{#1}}} \newcommand{\dfn}[1]{{\normalfont\textsl{#1}}} \bibliographystyle{plainnat} % \VignetteIndexEntry{Spatio-Temporal Geostatistics using gstat} \title{Spatio-Temporal Interpolation using \pkg{gstat}} % \VignetteIndexEntry{Spatio-Temporal Geostatistics using gstat} \author{by Benedikt Gr{\"a}ler, Edzer Pebesma and Gerard Heuvelink} \graphicspath{{figures/}} \begin{document} \SweaveOpts{concordance=TRUE} \maketitle \abstract{ We present new spatio-temporal geostatistical modelling and interpolation capabilities of the R package \pkg{gstat}. Various spatio-temporal covariance models have been implemented, such as the separable, product-sum, metric and sum-metric models. In a real-world application we compare spatio-temporal interpolations using these models with a purely spatial kriging approach. The target variable of the application is the daily mean $\rm{PM}_{10}$ concentration measured at rural air quality monitoring stations across Germany in 2005. R code for variogram fitting and interpolation is presented in this paper to illustrate the workflow of spatio-temporal interpolation using \pkg{gstat}. We conclude that the system works properly and that the extension of \pkg{gstat} facilitates and eases spatio-temporal geostatistical modelling and prediction for R users. } %% main text \section{Introduction}\label{sec:intro} The collection and processing of spatio-temporal data is rapidly increasing due to technological advances and the societal need for analysis of variables that vary in space and time, such as weather and air quality variables, and crop yields. Analysis of spatial and temporal correlations is useful in itself to get insight into the character and causes of variability, but they are also important to predict values at points from neighbouring observations. Spatio-temporal interpolation can potentially provide more accurate predictions than spatial interpolation because observations taken at other times can be included. In addition, spatio-temporal interpolation allows predictions to be made at single locations or entire fields in between and beyond observation times. However, adding the temporal domain implies that variability in space and time must be modelled, which is more complicated than modelling purely spatial or purely temporal variability. The spatial, temporal and spatio-temporal dependence structures, for instance represented as variograms, do not necessarily coincide with each other in terms of their parameters nor in terms of their family. In the simplest case, a spatio-temporal anisotropy parameter might be enough to deal with the different dependence structures, but this poses strong assumptions on the process. Interpolation of spatial random fields is a common task in geostatistics. Simple approaches like inverse distance weighted predictions or the well known kriging procedures have routinely been applied for many years. Nowadays, modern sensors allow to monitor different variables at an increasing temporal resolution producing rich spatio-temporal data sets. This calls as well for theory and methods to deal with these data sets to gain a better understanding of the observed spatio-temporal processes. While the theoretical aspects of spatio-temporal geostatistics show good progress \citep{Cressie2011}, implementations lack behind. This hinders a wide application of spatio-temporal modelling, as typically extensive scripting and thorough understanding is necessary to build spatio-temporal models. Handling of spatio-temporal data in R is provided by the \CRANpkg{spacetime} package \citep{Pebesma2012}. In this paper, we present an extension of the \CRANpkg{gstat} package \citep{Pebesma2004} (version 1.1-3) that reuses the \pkg{spacetime} classes for the estimation of spatio-temporal covariance/variogram models and to perform spatio-temporal interpolation. Our implementation handles various types of spatio-temporal covariance structures and facilitates spatio-temporal interpolation. The notation of functions in \pkg{gstat} are extended in a way closely following the purely spatial design. This allows a researcher acquainted with \pkg{gstat} to readily use spatio-temporal tools. The use of the newly implemented functions is presented and illustrated by mapping spatio-temporal air-quality data. Another package that offers extensive spatio-temporal geostatistical functionality is \CRANpkg{RandomFields} \citep{Schlather2014}; further packages are mentioned in the SpatioTemporal CRAN task view\footnote{\url{https://cran.r-project.org/web/views/SpatioTemporal.html}}. The paper is organised as follows. The next section introduces the general interpolation routine and describes the different spatio-temporal covariance models, followed by a section introducing the German rural background data set for 2005 and performing the parameter estimation (i.e.\ covariance model fitting). Cross-validation results are presented and discussed in the section thereafter. Conclusions are drawn in the closing section. R scripts reproducing this study are available from within the \pkg{gstat} package as demos. \code{stkrige} re-estimates the variogram models, \code{stkrige-prediction} re-executes the prediction for a time series and a couple of stations, and \code{stkrige-crossvalidation} re-runs the entire leave-one-out cross-validation (note that the latter takes a few hours). \section{Spatio-temporal dependence modelling and kriging}\label{sec:theory} In the following, we will assume a Gaussian spatio-temporal random field $Z$ defined over a spatial domain $\mathcal{S}$ and temporal domain $\mathcal{T}$. Typically, a sample $\mathbf{z} = \left(z(s_1,t_1),\dots,z(s_n,t_n)\right)$ has been observed at a set of distinct spatio-temporal locations $(s_1, t_1), \dots, (s_n,t_n) \in \mathcal{S}\times \mathcal{T} \subseteq \mathbb{R}^2 \times \mathbb{R}$ that may include repeated measurements at the same location or simultaneous measurements at multiple spatial locations. Often, one is interested in modelling $Z$ from the sample $\mathbf{z}$ in order to predict at unobserved locations in space and time or simulate from the conditional distribution. Across our domain of interest $\mathcal{S} \times \mathcal{T}$, we assume the random field $Z$ to be stationary and spatially isotropic. Hence, the field can be characterised through a mean $\mu$ and a covariance function $C_{\rm st}$ where the spatio-temporal covariance only depends on the separating distances across space $h \in \mathbb{R}_{\geq 0}$ and time $u \in \mathbb{R}_{\geq 0}$. Note that extensions beyond this set-up can easily be derived as has been done for the pure spatial case using for instance universal kriging to overcome the stationarity of the mean. The general spatio-temporal covariance function is given by $C_{\rm st}(h,u) = {\rm Cov}\left(Z(s,t), Z(\tilde{s},\tilde{t})\right)$ for a separating spatial distance $h$ and temporal distance $u$ and any pair of points $(s,t), (\tilde{s},\tilde{t}) \in \mathcal{S}\times\mathcal{T}$ with $||s-\tilde{s}||=h$ and $|t-\tilde{t}|=u$. In general, this covariance function is hard to estimate but a couple of models using simplifying assumptions will be presented in the following together with their spatio-temporal variograms $\gamma_{\rm st}(h,u) = C_{\rm st}(0,0)-C_{\rm st}(h,u)$ and encoding in \pkg{gstat}. Given a valid covariance function, the covariance matrices used in the linear predictor are easily obtained and the same algebraic operations as in the well known spatial case yield predictions of the desired random field \citep{Cressie2011}. A major difference is, however, the computational complexity of the matrix inversion. Typically, observations are made at a rather high temporal frequency leading to a number of spatio-temporal locations that is too large for global kriging. Hence, interpolation based on a selected neighbourhood of a subset of all data points becomes beneficial. Additionally, this relaxes the assumption of stationarity, as smooth variations in the mean value across the domain can be respected. The related class of dynamic models also addresses the computational complexity resulting in a temporal Markov structure. Implementations can be found in \CRANpkg{spTimer} by \citet{bakar2015}, \CRANpkg{spBayes} by \citet{finley2015}, \CRANpkg{spate} by \citet{sigrist2015} or \pkg{INLA} by \citet{lindgren2015}. \subsection{Covariance models} The covariance models implemented in \pkg{gstat} and presented in this paper are introduced in the following. Besides further extensions we focus on the basic classes of the \emph{separable}, \emph{product-sum}, \emph{metric} and \emph{sum-metric} spatio-temporal covariance functions. The building blocks (in the following denoted as \code{spatialVgm}, \code{temporalVgm} or \code{jointVgm}) of the spatio-temporal covariance functions are any of the purely spatial variogram models already available in \pkg{gstat}. Each one of the building blocks is created by a call of the function \code{gstat::vgm()}. Remaining arguments such as \code{sill} (the joint sill), \code{nug} (the joint nugget component) or \code{stAni} (the spatio-temporal anisotropy used in the \code{jointVgm}) are scalars and refer to parameters of the entire spatio-temporal covariance function: \begin{enumerate}[a)] \item The \dfn{separable covariance model} assumes that the spatio-temporal covariance function can be represented as the product of a spatial and temporal term: $$C_{\rm sep}(h,u)=C_{\rm s}(h)C_t(u)$$ Its variogram is given by (see Appendix for details): $$\gamma_{\rm sep}(h,u) = {\rm sill} \cdot \left( \bar{\gamma}_s(h)+\bar{\gamma}_t(u)-\bar{\gamma}_s(h)\bar{\gamma}_t(u) \right)$$ where $\bar{\gamma}_s$ and $\bar{\gamma}_t$ are standardised spatial and temporal variograms with separate nugget effects and (joint) sill of 1. The overall sill parameter is denoted by "sill". The R package \pkg{gstat} encodes this model as: \code{vgmST("separable", space = spatialVgm, time = temporalVgm, sill = sill)} The separable model has a strong computational advantage in the setting where each spatial location has an observation at each temporal instance (a \code{"STFDF"} without \samp{NA}s, \cite{Pebesma2012}). In these cases, the covariance matrix (and its inverse) can be composed using the Kronecker-product of the purely spatial and purely temporal covariance matrices (respectively their inverse). \item The above model extends to the \dfn{product-sum covariance model} that we give here in a slightly different notation as \citet{DeCesare2001} and \citet{DeIaco2001} by $$C_{\rm ps}(h,u)=k C_{\rm s}(h)C_{\rm t}(u) + C_{\rm s}(h) + C_{\rm t}(u)$$ with $k > 0$. The corresponding variogram can be written as $$\gamma_{\rm ps}(h,u) = \left(k \cdot {\rm sill}_{\rm t} + 1\right) \gamma_{\rm s}(h) + \left(k \cdot {\rm sill}_{\rm s} + 1\right) \gamma_{\rm t}(u) - k \gamma_{\rm s}(h) \gamma_{\rm t}(u)$$ where ${\gamma}_{\rm s}$ and $\gamma_{\rm t}$ are spatial and temporal variograms (see Appendix for details). The parameter $k$ needs to be positive and the following identity defines the overall sill (${\rm sill}_{\rm st}$) of the model in terms of the model's spatial and temporal sills: $${\rm sill}_{\rm st} = k \cdot {\rm sill}_{\rm s} \cdot {\rm sill}_{\rm t} + {\rm sill}_{\rm s} + {\rm sill}_{\rm t}$$ The above equation can also be used to estimate $k$ based on the three sill values. An alternative formulation of the product-sum variogram can be found in \citet{DeIaco2001}. The \pkg{gstat} definition of this model reads: \begin{example*} vgmST("productSum", space = spatialVgm, time = temporalVgm, k = k) \end{example*} \item Assuming identical spatial and temporal covariance functions except for spatio-temporal anisotropy, allows to use a spatio-temporal \dfn{metric covariance model} where, after matching space and time by an anisotropy correction $\kappa$ (\code{stAni}), the spatial, temporal and spatio-temporal distances are treated equally resulting in a single covariance model $C_{\rm joint}$: $$C_{\rm m}(h,u)=C_{\rm joint}\left(\sqrt{h^2+(\kappa\cdot u)^2}\right)$$ The variogram evaluates to $$ \gamma_{\rm m} (h,u) = \gamma_{\rm joint}\left(\sqrt{h^2+(\kappa\cdot u)^2}\right) $$ where $\gamma_{\rm joint}$ (\code{jointVgm}) is any known variogram that may include a nugget effect. The following line generates the model in \pkg{gstat}: \begin{example*} vgmST("metric", joint = jointVgm, stAni = stAni) \end{example*} The spatio-temporal anisotropy parameter $\kappa$ (\code{stAni}) is given as spatial unit per temporal unit. In many cases, this will be in m/second, as these are the base units in our implementation. All temporal distances are hence internally re-scaled to an equivalent spatial distance using \code{stAni} and treated as metric 3D-space. \item A combination of spatial, temporal and a metric model including an anisotropy parameter $\kappa$ is found in \citet{Bilonick1988} and revisited by \citet{Snepvangers2003} as the \dfn{sum-metric covariance model}: $$C_{\rm sm}(h,u)=C_{\rm s}(h)+C_{\rm t}(u)+C_{\rm joint}\left(\sqrt{h^2+(\kappa\cdot u)^2}\right)$$ This model allows for spatial, temporal and joint nugget effects. Thus, the variogram is given by $$ \gamma_{\rm sm}(h,u)= \gamma_{\rm s}(h) + \gamma_{\rm t}(u) + \gamma_{\rm joint}\left(\sqrt{h^2+(\kappa\cdot u)^2}\right)$$ where $\gamma_{\rm s}$, $\gamma_{\rm t}$ and $\gamma_{\rm joint}$ are spatial, temporal and joint variograms with separate nugget-effects. This model can be defined in \pkg{gstat} through: \begin{example*} vgmST("sumMetric", space = spatialVgm, time = temporalVgm, joint = jointVgm, stAni = stAni) \end{example*} \item A simplified version of the above model is to restrict the spatial, temporal and joint variograms to nugget free models. Additionally, a single spatio-temporal nugget is introduced and the variogram takes the representation: $$\gamma_{\rm ssm}(h,u) = {\rm nug}\cdot {\bf1}_{h>0 \vee u>0} + \gamma_{\rm s}(h) + \gamma_{\rm t}(u) + \gamma_{\rm joint}\left(\sqrt{h^2+(\kappa\cdot u)^2}\right)$$ The \dfn{simple sum-metric covariance model} can be obtained by: \begin{example*} vgmST("simpleSumMetric", space = spatialVgm, time = temporalVgm, joint = jointVgm, nugget = nug, stAni = stAni) \end{example*} \end{enumerate} \noindent Note that the above mentioned spatial, temporal and joint components of the spatio-temporal covariance and variogram models need not necessarily exhibit the same structure. Taking for instance the product-sum and sum-metric models that both contain single temporal and spatial variogram models: the best fits of the respective spatio-temporal models might suggest different variogram families and parameters for the pure spatial and temporal ones. This is due to the target of finding the best overall variogram surface resulting in (potentially) different marginal models. \subsection{Parameter estimation} Fitting routines for the above variogram models are implemented in \pkg{gstat} through the function \code{fit.StVariogram()}, which calls \code{optim()} from the R core package \pkg{stats}. Additional parameters to improve the numerical optimisation can be provided to \code{fit.StVariogram()} and will be passed on to \code{optim()} (using R's three-dots mechanism). As some of the parameters are limited to certain ranges (nuggets need to be non-negative, ranges must be positive), it is advised to use an optimisation routine that allows to impose limits on the search space (i.e.\ \code{L-BFGS-B}) and provide sensible limits via \code{lower} and \code{upper}. By default, the method \code{L-BFGS-B} is called and the smallest lower and largest upper bounds supported by the model are given. The estimation of the spatio-temporal variogram models relies on a sample variogram empirically derived from the data. In contrast to the spatial variogram line, the spatio-temporal variogram is represented by a surface for lag classes composed of a spatial and temporal separation distance. Different from the spatial case, a spatio-temporal sample variogram contains lag-classes of zero spatial separation describing pure temporal dependencies. Without duplicate observations, no estimates can be made for the lag-class with both zero spatial and zero temporal separation. The sample variogram is calculated through the function \code{variogram()} that dispatches the call for spatio-temporal data objects (of class \code{"STFDF"}, \code{"STSDF"}, or \code{"STIDF"}) from \pkg{spacetime}. For a visual judgement of the fit between sample and fitted variograms the \code{plot()} function can be called to show the variogram surfaces next to each other as coloured level plots. Alternatively, a wireframe plot is obtained by setting the parameter \code{wireframe = TRUE} (Figure~\ref{fig:allVgmsWireframe}). A further option is to plot the differences between the sample and model variogram surfaces by setting \code{diff = TRUE}, see Figure~\ref{fig:allVgmsDiffWireframe}. Additionally to visual comparison, \code{fit.StVariogram()} provides the output of \code{optim} as attribute \code{optim.out} of the returned S3-class \code{"StVariogram"}. This attribute includes valuable information to diagnose the success of the \code{optim} routine. It contains for instance the convergence code (\code{\$convergence}) or message (\code{\$message}) and the optimised value (\code{\$value}), which is the mean of the (weighted) squared deviations between sample and fitted variogram surface. Furthermore, it is advised to check the estimated parameters against the parameter boundaries and starting values. Additionally, starting values might also influence the success and result of the optimisation, as local optima may occur due to the interdependence of the parameters. Alternatively, the user might want to start a grid search in order to better asses the sensitivity of the estimates. The fitting approach is identical for all covariance models. However, with the flexibility of the model also the number of parameters increases, making a numerical estimation at times cumbersome. Starting values can in most cases be read from the sample variogram. Parameters of the spatial and temporal variograms can be assessed from the spatio-temporal surface fixing the counterpart at 0. The overall spatio-temporal sill including the nugget can be deducted from the plateau that a nicely behaving sample variogram reaches for 'large' spatial and temporal distances. An important issue is the potentially different orders of magnitude of the parameters. It is at times advisable to rescale spatial and temporal distances to ranges similar to the ones of sills and nuggets using the parameter \code{parscale}. \code{parscale} needs to be provided via \code{control = list(parscale=\dots)} and holds a vector of the same length as the number of parameters to be optimised (see the documentation of \code{optim} for further details). \begin{table} \center \caption{List of implemented weighting schemes for variogram optimisation. Methods 3, 4, and 5 are kept for compatibility reasons with the purely spatial \code{fit.variogram} function. The following notation is used: $N_j$ number of pairs, $h_j$ mean spatial distance and $u_j$ mean temporal distance for each bin $j$, $\gamma$ the actual proposed variogram model and \code{stAni} a spatio-temporal anisotropy scaling.}\label{tab:weighting} {\small \begin{tabular}{ll} \toprule \code{fit.method} & weights \\ \midrule 0 & no fitting\\ 1 and 3 & $N_j$ \\ 2 and 4 & $N_j/\gamma\left(h_j, u_j\right)^2$ \\ 5 & reserved for REML \\ 6 & 1, no weighting\\ 7 & $N_j/\left(h_j^2 + {\rm stAni}^2\cdot u_j^2\right)$ \\ 8 & $N_j/h_j^2$ \\ 9 & $N_j/u_j^2$ \\ 10 & $1/\gamma\left(h_j,u_j\right)^2$ \\ 11 & $1/\left(h_j^2 + {\rm stAni}^2\cdot u_j^2\right)$ \\ 12 & $1/h_j^2$ \\ 13 & $1/u_j^2$ \\ \bottomrule \end{tabular}} \end{table} Currently, the implemented fitting routines are based on the (weighted) mean squared difference between model and sample variogram surfaces. By default, all values are associated the same weight (\code{fit.method = 6}), but other options are available that allow for different weighting schemes based on the number of pairs, spatial, temporal and spatio-temporal distances or the variogram's value. Table~\ref{tab:weighting} lists all currently implemented options. Depending on the target neighbourhood size of the desired interpolation, it might be beneficial to narrow down the spatial and temporal distances and to introduce a cutoff. This ensures that the model is fitted to the differences over space and time actually used in the interpolation, and reduces the risk of overfitting the variogram model to large distances not used for prediction. Please note that methods 2 and 10 (Table~\ref{tab:weighting}) involve weights based on the fitted variogram that might lead to bad convergence properties of the parameter estimates. Furthermore, the scalar \code{stAni} in methods 7 and 11 will either be the actual fitted spatio-temporal anisotropy if it is included in the model or a fixed value that has to be passed as \code{stAni} by the user to \code{fit.StVariogram}. The latter is advised, as the former might lead to bad convergence properties as in the case of weights based on the fitted variogram mentioned above. As the estimation of an anisotropy scaling might be cumbersome on a visual basis, we provide the function \code{estiStAni} that provides estimates based on the empirical spatio-temporal variogram. Four heuristics are available based on (i) rescaling a linear model (\code{linear}), (ii) estimating equal ranges (\code{range}), (iii) rescaling a pure spatial variogram (\code{vgm}) or (iv) estimating a complete spatio-temporal metric variogram model and returning its spatio-temporal anisotropy parameter (\code{metric}). The choice of the weighting scheme will influence the selected model and different weightings might be further assessed in a cross-validation of the selected model. To increase numerical stability, it is advisable to use weights that do not change with the current model fit. \subsection{Kriging} Standard kriging (\code{krigeST}) and trans Gaussian kriging (\code{krigeSTTg}) have been implemented. As spatio-temporal kriging based on the complete data set might be too computationally expensive, local kriging is an attractive alternative. This poses the question of how to select the "nearest" neighbours from the spatio-temporal space $\mathcal{S}\times\mathcal{T}$. A natural choice would be to select the spatio-temporal locations exhibiting the strongest correlation to the unobserved location. Depending on the spatio-temporal covariance model, the relation between spatial and temporal distance in determining the strength of correlation will vary. As a proxy, we use a spatio-temporal anisotropy parameter that relates spatial and temporal distances in the same manner as in the metric covariance models. The k-nearest neighbours within this metric spatio-temporal space $\mathcal{S}\times\mathcal{T}$ are selected using the R package \CRANpkg{FNN} \citep{Beygelzimer2013}. The interpolation performs iteratively for each spatio-temporal prediction location with a local subset of the data set. Without neighbourhood selection, kriging uses all data. As the metric induced by the spatial and rescaled temporal distances are only proxies to the strength of correlation between locations (see Figure~\ref{fig:vgmVsDist}), we provide an option to search a larger metric neighbourhood. Within this larger neighbourhood, the covariance function is evaluated for all spatio-temporal locations and the neighbouring locations with the largest covariance values are then selected for prediction. However, this approach might still suffer from a clustering of locations and alternatives such as a staged search (find spatial neighbours first and select a set of temporal instances for each spatial neighbour) or an octant search (select neighbours per spatial quadrant from preceding and following time stamps separately) could be considered. However, these alternatives are not yet available in \pkg{gstat}. \begin{figure} \centering \includegraphics[width=0.9\textwidth]{vgmVsMetricDist.png} \caption{A contourplot showing how the spatio-temporal sum-metric variogram model (as estimated in the application below) and a metric distance relate to each other. Distances are rescaled by 1/5 for easy plotting.}\label{fig:vgmVsDist} \end{figure} \section{Application and illustration}\label{sec:data} The data set used is taken from AirBase\footnote{\href{http://www.eea.europa.eu/data-and-maps/data/airbase-the-european-air-quality-database-6}{AirBase - The European air quality database}}, the air quality data base for Europe provided by the European Environmental Agency (EEA). We focus on a single air quality indicator, particulate matter with a diameter less than 10~$\mu\rm m$, measured at rural background stations for 2005 (${\rm PM}_{10}$). The data base contains data for many years. Besides rural, also urban areas are monitored and not only at background locations (e.g.\ traffic stations). However, these processes are considered to be of a different nature and should be treated separately. As a use case, we therefore limit our data set to the rural background stations in Germany. Figure \ref{fig:dailyMeans} shows for 8 randomly chosen days daily mean values of ${\rm PM}_{10}$ concentrations for the entire monitoring network over Germany in 2005 with 69 rural background stations. \begin{figure} \centering \includegraphics[width=0.95\textwidth]{daily_means_PM10.png} \caption{Daily mean $\rm{PM}_{10}$ concentration $[\mu\rm{g/m}^3]$ at 8 randomly selected days in 2005.}\label{fig:dailyMeans} \end{figure} In order to fit a spatio-temporal model to the air quality data set, the empirical variogram surface is computed and used as input for the fitting routines of the different models. The empirical variogram is based on spatio-temporal bins that span regularly over space and time. Regular measurements over time (i.e.\ hourly, daily) motivate regular binning intervals of the same temporal resolution. Nevertheless, flexible binning boundaries can be passed for spatial and temporal dimensions. This allows for instance to use smaller bins at small distances and larger ones for large distances. Temporal boundaries, instead of lags, are required when the sampling of the data is non-regular. In cases where regular temporal observations can be assumed, this is utilised in the sample variogram calculations and any two temporal consecutive observations are assumed to have the same temporal distance. Figure~\ref{fig:allVgmsWireframe} shows the empirical variogram along with the proposed best fitting model of each spatio-temporal variogram family as perspective wireframe plots. In order to better identify structural shortcomings of the selected model, a difference plot (Figure~\ref{fig:allVgmsDiffWireframe}) is a helpful visual diagnostic plot. Beyond the selection of the spatio-temporal variogram family, each component of this model can be chosen from any implemented one-dimensional variogram. In Table~\ref{tab:vgmFits} a selection of fitted models in terms of their residuals compared to the sample variogram surface are shown. The best fitting spatio-temporal model of each family is given as: \begin{enumerate}[a)] \item separable model (weighted MSE: 6.82): \nopagebreak \begin{tabular}{l|rlrlrr} \toprule & partial sill & model & \multicolumn{2}{c}{range} & nugget & sp.-temp. sill \\ \midrule space & 0.86 & Exp & 558 & \hspace{-2\tabcolsep}~km & 0.14 & \multirow{2}{*}{124} \\ time & 1.00 & Sph & 5.6 & \hspace{-2\tabcolsep}~days & 0.00 & \\ \bottomrule \end{tabular} obtained via: \begin{example*} separableModel <- vgmST("separable", space = vgm(0.9, "Exp", 200, 0.1), time = vgm(0.9, "Sph", 3.5, 0.1), sill = 124) fit.StVariogram(empVgm, separableModel, fit.method = 7, stAni = 117.3, method = "L-BFGS-B", control = list(parscale = c(100, 1, 10, 1, 100)), lower = c(10, 0, 0.1, 0, 0.1), upper = c(2000, 1, 12, 1, 200)) \end{example*} \item product-sum model (weighted MSE: 6.91) \nopagebreak \begin{tabular}{l|rlrlrc} \toprule & partial sill & model & \multicolumn{2}{c}{range} & nugget & k\\ \midrule space & 6.8 & Exp & 542 & \hspace{-2\tabcolsep}~km & 1.2 & \multirow{2}{*}{1.61} \\ time & 8.7 & Sph & 5.5 & \hspace{-2\tabcolsep}~days & 0.0 & \\ \bottomrule \end{tabular} obtained via \begin{example*} prodSumModel <- vgmST("productSum", space = vgm(10, "Exp", 200, 1), time = vgm(10, "Sph", 2, 1), k=2) fit.StVariogram(empVgm, prodSumModel, fit.method = 7, stAni = 117.3, method = "L-BFGS-B", control = list(parscale = c(1, 10, 1, 1, 0.1, 1, 10)), lower = rep(0.0001, 7)) \end{example*} \item metric model (weighted MSE: 10.05) \nopagebreak \begin{tabular}{l|rlrlrrl} \toprule & partial sill & model & \multicolumn{2}{c}{range} & nugget & \multicolumn{2}{c}{anisotropy}\\ \midrule joint & 123.4 & ${\rm Mat}_{\kappa=0.6}$ & 453 & \hspace{-2\tabcolsep}~km & 17.4 & 189 & \hspace{-2\tabcolsep}~km/day \\ \bottomrule \end{tabular} obtained via \begin{example*} metricModel <- vgmST("metric", joint = vgm(60, "Mat", 150, 10, kappa = 0.6), stAni = 60) fit.StVariogram(empVgm, metricModel, fit.method = 7, stAni = 117.3, method = "L-BFGS-B", control = list(parscale = c(10, 20, 5, 10)), lower = c(80, 50, 5, 50), upper = c(200, 1500, 60, 300)) \end{example*} \item\label{bestfit} sum-metric model (weighted MSE: 3.31) \nopagebreak \begin{tabular}{l|rlrlrrl} \toprule & partial sill & model & \multicolumn{2}{c}{range} & nugget & \multicolumn{2}{c}{anisotropy}\\ \midrule space & 16.4 & Sph & 67 & \hspace{-2\tabcolsep}~km & 0 & & \\ time & 9.3 & Exp & 0.9 & \hspace{-2\tabcolsep}~days & 0 & & \\ joint & 91.5 & Sph & 999 & \hspace{-2\tabcolsep}~km & 7.3 & 185 & \hspace{-2\tabcolsep}~km/day \\ \bottomrule \end{tabular} obtained via \begin{example*} sumMetricModel <- vgmST("sumMetric", space = vgm(20, "Sph", 150, 1), time = vgm(10, "Exp", 2, 0.5), joint = vgm(80, "Sph", 1500, 2.5), stAni = 120) fit.StVariogram(empVgm, sumMetricModel, fit.method = 7, stAni = 117.3, method = "L-BFGS-B", control = list(parscale = c(1, 100, 1, 1, 0.5, 1, 1, 100, 1, 100), maxit=10000), lower = c(sill.s = 0, range.s = 10, nugget.s = 0, sill.t = 0, range.t = 0.1, nugget.t = 0, sill.st = 0, range.st = 10, nugget.st = 0, anis = 40), upper = c(sill.s = 200, range.s = 1000, nugget.s = 20, sill.t = 200, range.t = 75, nugget.t = 20, sill.st= 200, range.st = 5000, nugget.st = 20, anis = 500)) \end{example*} \item simple sum-metric model (weighted MSE: 3.31) \nopagebreak \begin{tabular}{l|rlrlrlc} \toprule & partial sill & model & \multicolumn{2}{c}{range} & \multicolumn{2}{c}{anisotropy} & sp.-temp. nugget \\ \midrule space & 16.4 & Sph & 67 & \hspace{-2\tabcolsep}~km & & & \multirow{3}{*}{$\Bigg\}$ 7.3} \\ time & 9.3 & Exp & 0.9 & \hspace{-2\tabcolsep}~days & & & \\ joint & 91.5 & Sph & 999 & \hspace{-2\tabcolsep}~km & 185 & \hspace{-2\tabcolsep}~km/day & \\ \bottomrule \end{tabular} obtained via \begin{example*} simpleSumMetricModel <- vgmST("simpleSumMetric", space=vgm(120, "Sph", 150), time =vgm(120, "Exp", 10), joint=vgm(120, "Sph", 150), nugget = 10, stAni = 150) fit.StVariogram(empVgm, simpleSumMetricModel, fit.method = 7, stAni = 117.3, method = "L-BFGS-B", control = list(parscale = c(1, 10, 1, 1, 1, 100, 1, 10)) lower = c(sill.s = 0, range.s = 10, sill.t = 0, range.t = 0.1, sill.st= 0, range.st= 10, nugget = 0, anis = 40), upper = c(sill.s = 200, range.s = 500, sill.t = 200, range.t = 20, sill.st= 200, range.st = 5000#, nugget = 100, anis = 1000)) \end{example*} \end{enumerate} The variogram parameters are numerically optimised using the function \code{fit.StVariogram} and the \code{L-BFGS-B} routine of \code{optim}. The parameter \code{fit.method} that controls the weighing of the residuals between empirical and model surface of \code{fit.StVariogram} is set to \code{7} (the spatio-temporal analog to the commonly used spatial weighting). A full list of all weighting schemes is presented in Table~\ref{tab:weighting}. In our application, the residuals are multiplied by the number of pairs in the corresponding spatio-temporal bin divided by the metric distance: $N_j/(h_j^2 + {\rm stAni}^2\cdot u_j^2)$. The spatio-temporal anisotropy is estimated beforehand and fixed at 118~km/day. This weighting scheme puts higher confidence in lags filled with many pairs of spatio-temporal locations, but respects to some degree the need of an accurate model for short distances, as these short distances are the main source of information in the prediction step. Note, that different weighting schemes will in general result in different model parameters generating different interpolation values. Our selection is based on the assumption that well filled bins provide more reliable empirical variogram estimates and the fact that short distances are the most important ones for a local interpolation. \begin{table}[t!] \centering \caption{Weighted MSE (\code{fit.method = 7, see Table~\ref{tab:weighting}}) for different spatio-temporal variogram families and different choices for the one-dimensional variogram components. Columns denote the spatial and temporal variogram choices. The metric model is only applicable if both domains use the same family.}\label{tab:vgmFits} \begin{tabular}{ll|rrrrr} \toprule model & joint & Exp+Exp & Exp+Sph & Sph+Exp & Sph+Sph & ${\rm Mat}_{\kappa=0.6}$ \\ \midrule {separable} & $~~\cdot$ & 9.87 & \bf{6.82} & 10.42 & 7.50 & $\cdot~~$ \\ {product-sum} & $~~\cdot$ & 10.09 & \bf{6.91} & 10.64 & 7.59 & $\cdot~~$ \\ {metric} & $~~\cdot$ & 10.25 & $\cdot~~$ & $\cdot~~$ & 10.59 & \bf{10.05} \\ \multirow{2}{*}{sum-metric} & Exp & 4.10 & 3.60 & 3.89 & 3.32 & $\cdot~~$ \\ & Sph & 3.74 & 3.73 & \bf{3.31} & 3.36 & $\cdot~~$ \\ \multirow{2}{*}{simple sum-metric}& Exp & 4.10 & 3.60 & 3.94 & 3.32 & $\cdot~~$ \\ & Sph & 3.74 & 3.98 & \bf{3.31} & 3.56 & $\cdot~~$ \\ \bottomrule \end{tabular} \end{table} \begin{figure} \centering \includegraphics[width=0.95\textwidth]{allVgmsWireframe.png} \caption{Sample and the best fitting spatio-temporal variogram of each family.}\label{fig:allVgmsWireframe} \end{figure} \begin{figure} \centering \includegraphics[width=0.95\textwidth]{allVgmsDiffWireframe.png} \caption{Differences between the sample and the best fitting spatio-temporal variogram of each family.}\label{fig:allVgmsDiffWireframe} \end{figure} \begin{figure}[b!] \centering \includegraphics[width=0.95\textwidth]{pred_daily_means_PM10.png} \caption{Spatio-temporal interpolation of daily mean $\rm{PM}_{10}$ concentrations using the sum-metric covariance model with the closest 50 neighbouring spatio-temporal locations. The crosses indicate sampling locations. The cell size of the grid in UTM projection is $10~\rm{km}\times10~\rm{km}$.}\label{fig:pred_daily} \end{figure} For comparison with classical approaches, we interpolate across Germany iteratively for each single day using all available data for variogram estimation. The purely spatial empirical variogram can directly be obtained from the empirical spatio-temporal variogram, by fixing the temporal lag at 0 separation. From the same set of variogram models as investigated for the spatio-temporal models, the exponential model (partial sill:~66.5, range:~224~km, nugget:~13.5) is the best suited based on the optimisation criterion. Alternatively, we could have fitted the spatial variogram for each day separately using observations from that day only. However, given the small number of observation stations, this produced unstable variograms for several days and we decided to use the single spatial variogram derived from all spatio-temporal locations treating time slices as uncorrelated copies of the spatial random field. Once the best fitting spatio-temporal variogram model is identified, the interpolation can be executed with the help of the function \code{krigeST}. We use the sum-metric model that obtained the smallest RMSE (compare Table~\ref{tab:vgmFits}) to produce a gridded prediction. The interpolation domain consists of daily values for a regular grid spanning over Germany in UTM projection. The cell size is $10~\rm{km}\times10~\rm{km}$. Figure~\ref{fig:pred_daily} shows the interpolated grid for the same days as Figure~\ref{fig:dailyMeans} alongside with all sampling locations. Additionally, maps depicting the differences from a leave-one-out cross-validation are presented in Figure~\ref{fig:diffs_daily}. A time series view is presented in Figure~\ref{fig:timeseries} showing the observed and predicted time series at a single location along with its 95~\% prediction intervals. An animation of the entire year of daily mean ${\rm PM}_{10}$ prediction maps can be viewed online.\footnote{\url{http://gstat.r-forge.r-project.org/STpred.html}}. The interpolated maps are generated for a set of time stamps \code{tIDs} and a grid over Germany \code{DE\_pred} by \begin{example*} krigeST(PM10~1, data = DE_RB_2005[ , tIDS], newdata = DE_pred, fitSumMetricModel, nmax = 50, stAni = fitMetricModel$stAni/24/3600) \end{example*} \begin{figure}[t!] \centering \includegraphics[width=0.95\textwidth]{diffs_daily_means_PM10.png} \caption{Differences of spatio-temporal predictions and observed daily mean $\rm{PM}_{10}$ concentrations using the sum-metric covariance model with the closest (approx. strongest correlated) 50 neighbouring spatio-temporal locations.}\label{fig:diffs_daily} \end{figure} \begin{figure}[h!] \centering \includegraphics[width=0.9\textwidth]{singleStationTimeSeries.png} \caption{Subset of the time series of observed and predicted ${\rm PM}_{10}$ at a single station in Lower Saxony along with its 95~\% prediction intervals.}\label{fig:timeseries} \end{figure} To further compare the different approaches, a leave-one-out cross-validation was carried out. The spatio-temporal interpolations are done for the closest 50 and 10 neighbours assessing the impact of the neighbourhood size. Inspection of the ranges of the variograms in the temporal domain, suggests that any station more than at most 6 days apart does not meaningfully contribute. Furthermore, the local estimation allows the spatio-temporal random field to have a varying mean value over space and time. The purely spatial interpolation can be considered as the extreme temporally local case, where only observations from the same time instance are considered. \begin{table} \caption{Leave-one-out cross-validation results. The column wMSE refers to the optimised value from the variogram estimation.}\label{tab:cv} \centering \begin{tabular}{lrr|rrrr} \toprule covariance model & wMSE & neigh. & RMSE & MAE & ME & COR \\ \midrule pure Spatial & & 10 & 6.15 & 4.09 & -0.01 & 0.84 \\ separable &\hspace{-\tabcolsep}[6.82]& 10 & 6.08 & 4.04 & -0.01 & 0.84 \\ product-sum &\hspace{-\tabcolsep}[6.91]& 10 & 6.08& 4.04& -0.01 & 0.84 \\ metric &\hspace{-\tabcolsep}[10.05]& 10 & 6.11 & 4.07 & 0.03 & 0.84 \\ sum-metric &\hspace{-\tabcolsep}[3.31]& 10 & 6.16 & 4.08 & -0.06 & 0.84 \\ simple sum-metric &\hspace{-\tabcolsep}[3.31]& 10 & 6.14 & 4.08 & -0.02 & 0.84 \\ \midrule pure Spatial & & 50 & 6.10 & 4.07 & 0.00 & 0.84 \\ separable &\hspace{-\tabcolsep}[6.82]& 50 & 6.05 & 4.04 & 0.01 & 0.84 \\ product-sum &\hspace{-\tabcolsep}[6.91]& 50 & 6.05 & 4.04 & 0.00 & 0.84 \\ metric &\hspace{-\tabcolsep}[10.05]& 50 & 6.07 & 4.08 & 0.03 & 0.84 \\ sum-metric &\hspace{-\tabcolsep}[3.31]& 50 & 6.14 & 4.09 & -0.01 & 0.84 \\ simple sum-metric &\hspace{-\tabcolsep}[3.31]& 50 & 6.14 & 4.08 & -0.02 & 0.84 \\ \bottomrule \end{tabular} \end{table} \section{Results and discussion}\label{sec:resultsDiscuss} In terms of added value of spatio-temporal kriging measured in cross-validation results, Table~\ref{tab:cv} shows hardly any benefit in the illustrative example. This effect can to a large degree already be explained from the spatio-temporal variograms: a temporal lag of one or a few days leads already to a large variability compared to spatial distances of few hundred kilometres, implying that the temporal correlation is too weak to considerably improve the overall prediction. Nevertheless, investigating a process with a higher temporal frequency will likely show a stronger correlation in the temporal domain. Looking into station-wise cross-validation statistics (not shown), the four stations with an RMSE of 10 and larger correspond to the locations with the largest annual mean concentrations ($>22~\mu{\rm g}/{\rm m}^3$). The added value of spatio-temporal kriging lies in the flexibility of the model. We are now in the position to not only interpolate at unobserved locations in space, but also at unobserved time instances. This makes spatio-temporal kriging a suitable tool to fill gaps in time series not only based on the time series solely, but also including some of its spatial neighbours. A very irregular sampled data set would as well largely benefit from a spatio-temporal approach, as spatially close but unobserved locations in one time slice are not of any help in a purely spatial approach, but the spatio-temporal model would benefit from the observed value nearby at another time instance. In a completely regular data set, the distance to a spatio-temporal neighbour is at least as large as the pure spatial distance and hence the correlation is weaker. Furthermore, being able to capture the covariance structure over space and time might foster a better understanding of the process under study. While we see spatio-temporal modelling being a powerful tool, the cross-validation results in Table~\ref{tab:cv} show that spatio-temporal kriging will not solve the problem of all poorly spatially captured phenomena. Further preprocessing steps might be necessary to improve the modelling of this $\rm{PM}_{10}$ data set such as for instance a temporal AR-model followed by spatio-temporal residual kriging or using further covariates in a preceding (linear) modelling step. Providing the best possible model of $\rm{PM}_{10}$ concentrations across Germany was beyond the scope of this paper. The selection of a spatio-temporal covariance model should not only be made based on the (weighted) mean squared difference between the empirical and model variogram surfaces (presented in Table~\ref{tab:vgmFits}), but also on conceptional choices and visual (Figure~\ref{fig:allVgmsWireframe}) judgement of the fits. Even though the function \code{fit.StVariogram} provides optimisation routines to fit different spatio-temporal variogram models, the numerical routines in the background may struggle to find the optimal parameters. Besides the lower and upper boundaries of the parameter space, the control parameter \code{parscale} of the \code{optim} function is a valuable option to improve the convergence of the optimisation. With passing \code{parscale} as entry of the list \code{control} a vector of scalars must be passed that controls the different levels of magnitude of the variogram parameters. In most applications, a change of 1 in the sills will have a stronger influence on the variogram surface than a change of 1 in the ranges. The problem becomes more difficult with an increasing number of parameters. In our application, using the simple sum-metric model as starting values for the full sum-metric model improved the convergence speed of the more complex model. In the presented application, the sum-metric models turns out to be the same as the simple sum-metric model. While this might at first sight be due to using the simpler model to generate starting values, different non simplified starting models converged to the same result. Generally, it is important to keep in mind the strong interaction of the model parameters. It is typically not easy to distinguish how much of the spatio-temporal nugget and sill is attributed to spatial, temporal or joint components. In this paper we considered a joint numerical approach, but step-wise approaches where the components are estimated separately could as well be considered. The interested reader is also referred to \cite{Nash2014}. However, all optimisation approaches follow the premise that the studied process can be approximated with the given model and available data. If this premise fails, no optimal model can be selected. An extension towards a restricted maximum likelihood method (REML) to fit the spatio-temporal variogram model would be desirable, as it overcomes some of the above mentioned drawbacks of the method of moments based approaches and would additionally provide standard errors for the parameter estimates. A REML approach would allow to take into account that sample variogram values are correlated. However, for large datasets (as in the spatio-temporal case), it is computationally more feasible to use a least squares fitting. To reduce the correlation of the variogram values, some randomisation could be implemented in large data sets, to calculate the sample variogram based on partially overlapping or even disjoint sets of observations. The selected anisotropy as proxy to the relation of spatial and temporal distance in determining the strongest correlated neighbours might show a distortion for some models when only few neighbours are used towards the true set of the most correlated locations. However, this effect vanishes as soon as the spatio-temporal range of the model is sufficiently represented through the set of nearest neighbours. As mentioned by \cite{kj99}, an alternative to space-time kriging might be co-kriging. However, this is only feasible if the number of time replicates is (very) small, as the number of cross variograms to be modelled equals the number of {\em pairs} of time replicates. Also, co-kriging can only interpolate for these time slices, and not inbetween or beyond them. It does however provide prediction error covariances, which can help assessing the significance of estimated {\em change} parameters \citep{pe1,pe2}. Several of the space-time variograms presented here may be approximated by sets of direct variograms and cross-variograms. Fitting variogram models to sample space-time variograms is in our implementation done by \code{stats::optim}. Our example script uses method \code{L-BFGS-B} and provides upper and lower parameter boundaries, e.g.\ to make sure sill parameters do not become negative. There has been a lot of research in optimization since the methods in \code{optim}, some of which has been reported in the special issue of the Journal of Statistical Software \citep{optim}, and we do see potential to improve the options in this respect. The approximate selection of the most correlated neighbours solves the lack of a natural notion of a joint distance across space and time. However, other sampling properties might introduce a bias in the prediction. The prediction at an unobserved location with a cluster of observations at one side will be biased towards this cluster and neglect the locations towards the other directions. Similar as the quadrant search in the pure spatial case an octant wise search strategy for the local neighbourhood would solve this limitation. A simpler stepwise approach to define an $n$-dimensional neighbourhood might already be sufficient in which at first $n_s$ spatial neighbours and then from each spatial neighbour $n_t$ time instances are selected, such that $n_s \cdot n_t \approx n$. The presented example considers stationary random fields that are isotropic in space. Further extensions towards more sophisticated variogram estimations allowing also for spatial geometric anisotropy are desirable. One could for instance plot variogram maps for spatial separation in North and South direction for each temporal lag. However, the current implementation does not allow to use the anisotropy parameter \code{anis} of the pure spatial variogram definition. Nevertheless, a preliminary rescaling of coordinates would be a possible workaround. This route has for instance been taken by \citet{Gasch2015} performing 3D+T kriging . The soil profiles in their study show a clear difference in horizontal and vertical variography. To correct for this, the depth dimension of the data has been rescaled to correspond with the dimensions of the horizontal distances before hand. In the subsequent study, these pseudo 3D coordinates have been used to fit the spatio-temporal variograms and perform kriging. The code in model definitions is meant to be kept both flexible and simple. This is based on i) re-producing the notion of the geostatistical models in the R code and in ii) reusing existing definitions and functions of the pure spatial cases that have been available for many years in \pkg{gstat}. The data handling benefits to a large degree from the implementations in the \pkg{spacetime} R package. \section{Conclusions}\label{sec:conclusions} The spatio-temporal extensions to \pkg{gstat} allow to model a set of spatio-temporal covariance functions. The implemented functionality eases estimation, visualisation and understanding of spatio-temporal covariance functions. The extension and reuse of already available function structures and nomenclature facilitates an easy translation of spatial workflows to handle spatio-temporal data. The numerical estimation of the variogram parameters might be tricky and needs a large degree of the users attention. It is advised to carefully check the outcome of the \code{optim} routine after optimisation. Spatio-temporal kriging predictions can be made in a global and a local neighbourhood set-up, while the latter will be the preferred solution for most spatio-temporal data sets and common computer hardware configurations. Spatio-temporal covariance structures carry valuable information, but a spatio-temporal model is not guaranteed to outperform pure spatial predictions. The benefit in terms of prediction quality of spatio-temporal kriging becomes only apparent if sufficiently strong correlated locations are added with the temporal dimension (i.e.\, if the model permits strong correlation across time). Nevertheless, the spatio-temporal covariance model might be of interest in itself. Besides some publications where the authors of this paper were involved in, such as \cite{Kilibarda2014}, the software presented here has proven useful in several independent publications, examples of which are \citep{marek, biondi, hu, yoon}. \section{Acknowledgements} This research has partly been funded by the German Research Foundation (DFG) under project number PE 1632/4-1. We thank two anonymous reviewers for their valuable comments. \bibliography{spatio-temporal-kriging} \pagebreak \address{Benedikt Gr{\"a}ler\\ Institute for Geoinformatics, University of M{\"u}nster\\ Heisenbergstr. 2, 48149, M{\"u}nster\\ Germany}\\ \email{ben.graeler@uni-muenster.de} \address{Edzer Pebesma\\ Institute for Geoinformatics, University of M{\"u}nster\\ Heisenbergstr. 2, 48149, M{\"u}nster\\ Germany}\\ \email{edzer.pebesma@uni-muenster.de} \address{Gerard Heuvelink\\ Department of Environmental Sciences, Wageningen University\\ PO Box 47, 6700AA, Wageningen\\ The Netherlands}\\ \email{gerard.heuvelink@wur.nl} \section{Appendix} \subsection{Derivation of the separable covariance and variogram identities}\label{sec:derivSep} The separable covariance and variogram identity is readily available through \begin{align*} C_{\rm sep}(h,u) &= C_{\rm s}(h)C_{\rm t}(u) = sill \cdot \bar{c}_s(h)\bar{c}_t(u) \\ \gamma_{\rm sep}(h,u) &= C_{\rm sep}(0,0) - C_{\rm sep}(h,u) \\ &= sill \left(1- \bar{c}_s(h) \cdot \bar{c}_t(u) \right) \\ &= sill \left(1- \left(1-\bar{\gamma}_s(h)\right)\left(1-\bar{\gamma}_t(u)\right) \right) \\ &= sill \left(1- \left(1-\bar{\gamma}_s(h) -\bar{\gamma}_t(u) + \bar{\gamma}_s(h)\bar{\gamma}_t(u)\right) \right) \\ &= sill \left(\bar{\gamma}_s(h) + \bar{\gamma}_t(u) - \bar{\gamma}_s(h)\bar{\gamma}_t(u)\right) \end{align*} where $\bar{c}$ and $\bar{\gamma}$ are normalised correlation and correlogram functions respectively. \subsection{Derivation of the product-sum covariance and variogram identities}\label{sec:derivPs} The product-sum covariance and variogram identity is readily available through: \begin{align*} C_{\rm ps}(h,u) = & \ k \cdot C_{\rm s}(h)C_{\rm t}(u) + C_{\rm s}(h) + C_{\rm t}(u) \\ \gamma_{\rm ps}(h,u) = & \ C_{\rm ps}(0,0) - C_{\rm ps}(h,u) \\ = & \ k \cdot C_{\rm s}(0)C_{\rm t}(0) + C_{\rm s}(0) + C_{\rm t}(0) \\ & - \left(k \cdot C_{\rm s}(h)C_{\rm t}(u) + C_{\rm s}(h) + C_{\rm t}(u)\right) \\ = & \ k \cdot {\rm sill}_{\rm s} \cdot {\rm sill}_{\rm t} + {\rm sill}_{\rm s} + {\rm sill}_{\rm t} \\ & - k \cdot \left[ \left({\rm sill}_{\rm s} - \gamma_{\rm s}(h)\right)\left({\rm sill}_{\rm t} - \gamma_{\rm t}(u)\right)\right] - \left({\rm sill}_{\rm s} - \gamma_{\rm s}(h)\right) - \left({\rm sill}_{\rm t} - \gamma_{\rm t}(u)\right) \\ = & \ k \cdot {\rm sill}_{\rm s} \cdot {\rm sill}_{\rm t} + {\rm sill}_{\rm s} + {\rm sill}_{\rm t} \\ & - k \cdot \left[ {\rm sill}_{\rm s} \cdot {\rm sill}_{\rm t} - {\rm sill}_{\rm s} \cdot \gamma_{\rm t}(u) - {\rm sill}_{\rm t} \cdot \gamma_{\rm s}(h) + \gamma_{\rm s}(h) \gamma_{\rm t}(u) \right] \\ & - {\rm sill}_{\rm s} + \gamma_{\rm s}(h) - {\rm sill}_{\rm t} + \gamma_{\rm t}(u) \\ = & \ k \cdot {\rm sill}_{\rm t} \gamma_{\rm s}(h) + k \cdot {\rm sill}_{\rm s} \gamma_{\rm t}(u) - k \gamma_{\rm s}(h) \gamma_{\rm t}(u) + \gamma_{\rm s}(h) + \gamma_{\rm t}(u) \\ = & \ (k \cdot {\rm sill}_{\rm t} + 1) \gamma_{\rm s}(h) + (k \cdot {\rm sill}_{\rm s} + 1) \gamma_{\rm t}(u) - k \gamma_{\rm s}(h) \gamma_{\rm t}(u) \end{align*} %%%%%%%%%% \end{document} gstat/vignettes/gstat.Rnw0000644000176200001440000003154014646417261015234 0ustar liggesusers%% Document started, Sat Jul 3 19:30:52 CEST 2004, my 37th birthday, %% while being stuck for 24 hours at Philadelphia airport, on my way %% back from the joint TIES/Accuracy 2004 symposium in Portland, ME. %% Continued, Oct 28, during the Apmosphere mid-term review. Oh, shame. % \VignetteIndexEntry{ The meuse data set: a tutorial for the gstat R package } \documentclass[a4paper]{article} \usepackage{hyperref} \newcommand{\code}[1]{{\tt #1}} \SweaveOpts{echo=TRUE} \title{The meuse data set: a brief tutorial\\ for the {\tt gstat} R package } \author{\href{mailto:edzer.pebesma@uni-muenster.de}{Edzer Pebesma}} \date{\today} \begin{document} \maketitle \section{Introduction} The \code{meuse} data set provided by package \code{sp} is a data set comprising of four heavy metals measured in the top soil in a flood plain along the river Meuse, along with a handful of covariates. The process governing heavy metal distribution seems that polluted sediment is carried by the river, and mostly deposited close to the river bank, and areas with low elevation. This document shows a geostatistical analysis of this data set. The data set was introduced by Burrough and McDonnell, 1998. This tutorial introduced the functionality of the R package \code{gstat}, used in conjunction with package \code{sp}. Package \code{gstat} provides a wide range of univariable and multivariable geostatistical modelling, prediction and simulation functions, where package \code{sp} provides general purpose classes and methods for defining, importing/exporting and visualizing spatial data. \section{R geostatistics packages} Package \code{gstat} (Pebesma, 2004) is an R package that provides basic functionality for univariable and multivariable geostatistical analysis, including \begin{itemize} \item variogram modelling, residual variogram modelling, and cross variogram modelling using fitting of parametric models to sample variograms \item geometric anisotropy specfied for each partial variogram model \item restricted maximum likelihood fitting of partial sills \item variogram and cross variogram maps \item simple, ordinary, universal and external drift (co)kriging \item (sequential) Gaussian (co)simulation equivalents for each of the kriging varieties \item indicator (co)kriging and sequential indicator (co)simulation \item kriging in a local or global neighbourhood \item block (co)kriging or simulation for each of the varieties, for rectangular or irregular blocks \end{itemize} Other geostatistical packages for R usually lack part of these options (e.g. block kriging, local kriging, or cokriging) but provide others: e.g. package \code{geoR} and \code{geoRglm} (by Paulo Ribeiro and Ole Christensen) provide the model-based geostatistics framework described in Diggle et al. (1998), package \code{fields} (Doug Nychka and others) provides thin plate spline interpolation, covariance functions for spherical coordinates (unprojected data), and routines for spatial sampling design optimization. \section{Spatial data frames} As an example, we will look at the meuse data set, which is a regular data frame that comes with package \code{gstat} (remove the 88 from the colour strings to make a plot without alpha transparency on windows or X11): <>= library(sp) data(meuse) class(meuse) names(meuse) coordinates(meuse) = ~x+y class(meuse) summary(meuse) coordinates(meuse)[1:5,] bubble(meuse, "zinc", col=c("#00ff0088", "#00ff0088"), main = "zinc concentrations (ppm)") @ % the following is needed because lattice plots (bubble wraps xyplot) do not % show without an explicit print; in order not to confuse users, we hide this: <>= print(bubble(meuse, "zinc", col=c("#00ff0088", "#00ff0088"), main = "zinc concentrations (ppm)") ) @ and note the following: \begin{enumerate} \item the function \code{coordinates}, when assigned (i.e. on the left-hand side of an \verb|=| or \verb|<-| sign), promotes the \code{data.frame} meuse into a \code{SpatialPointsDataFrame}, which knows about its spatial coordinates; coordinates may be specified by a formula, a character vector, or a numeric matrix or data frame with the actual coordinates \item the function \code{coordinates}, when not assigned, {\em retrieves} the spatial coordinates from a \code{SpatialPointsDataFrame}. \item the two plotting functions used, \code{plot} and \code{bubble} assume that the $x$- and $y$-axis are the spatial coordinates. \end{enumerate} \section{Spatial data on a regular grid} <>= data(meuse.grid) summary(meuse.grid) class(meuse.grid) coordinates(meuse.grid) = ~x+y class(meuse.grid) gridded(meuse.grid) = TRUE class(meuse.grid) image(meuse.grid["dist"]) title("distance to river (red = 0)") library(gstat) zinc.idw = idw(zinc~1, meuse, meuse.grid) class(zinc.idw) spplot(zinc.idw["var1.pred"], main = "zinc inverse distance weighted interpolations") @ <>= print(spplot(zinc.idw["var1.pred"], main = "zinc inverse distance weighted interpolations")) @ If you compare the bubble plot of zinc measurements with the map with distances to the river, it becomes evident that the larger concentrations are measured at locations close to the river. This relationship can be linearized by log-transforming the zinc concentrations, and taking the square root of distance to the river: <>= plot(log(zinc)~sqrt(dist), meuse) abline(lm(log(zinc)~sqrt(dist), meuse)) @ \section{Variograms } Variograms are calculated using the function \code{variogram}, which takes a formula as its first argument: \verb|log(zinc)~1| means that we assume a constant trend for the variable log(zinc). <>= lzn.vgm = variogram(log(zinc)~1, meuse) lzn.vgm lzn.fit = fit.variogram(lzn.vgm, model = vgm(1, "Sph", 900, 1)) lzn.fit plot(lzn.vgm, lzn.fit) @ <>= print(plot(lzn.vgm, lzn.fit)) @ Instead of the constant mean, denoted by \verb|~1|, we can specify a mean function, e.g. using \verb|~sqrt(dist)| as a predictor variable: <>= lznr.vgm = variogram(log(zinc)~sqrt(dist), meuse) lznr.fit = fit.variogram(lznr.vgm, model = vgm(1, "Exp", 300, 1)) lznr.fit plot(lznr.vgm, lznr.fit) @ <>= print(plot(lznr.vgm, lznr.fit)) @ In this case, the variogram of residuals with respect to a fitted mean function are shown. Residuals were calculated using ordinary least squares. \section{Kriging} <>= lzn.kriged = krige(log(zinc)~1, meuse, meuse.grid, model = lzn.fit) spplot(lzn.kriged["var1.pred"]) @ <>= print(spplot(lzn.kriged["var1.pred"])) @ \section{Conditional simulation} <>= lzn.condsim = krige(log(zinc)~1, meuse, meuse.grid, model = lzn.fit, nmax = 30, nsim = 4) spplot(lzn.condsim, main = "four conditional simulations") @ <>= print(spplot(lzn.condsim, main = "four conditional simulations")) @ For UK/residuals: <>= lzn.condsim2 = krige(log(zinc)~sqrt(dist), meuse, meuse.grid, model = lznr.fit, nmax = 30, nsim = 4) spplot(lzn.condsim2, main = "four UK conditional simulations") @ <>= print(spplot(lzn.condsim2, main = "four UK conditional simulations")) @ \section{Directional variograms} The following command calculates a directional sample variogram, where directions are binned by direction angle alone. For two point pairs, $Z(s)$ and $Z(s+h)$, the separation vector is $h$, and it has a direction. Here, we will classify directions into four direction intervals: <>= lzn.dir = variogram(log(zinc)~1, meuse, alpha = c(0, 45, 90, 135)) lzndir.fit = vgm(.59, "Sph", 1200, .05, anis = c(45, .4)) plot(lzn.dir, lzndir.fit, as.table = TRUE) @ <>= print(plot(lzn.dir, lzndir.fit, as.table = TRUE)) @ Looking at directions between 180 and 360 degrees will repeat the image shown above, because the variogram is a symmetric measure: $(Z(s)-Z(s+h))^2=(Z(s+h)-Z(s))^2$. The first plot gives the variogram in the zero direction, which is North; 90 degrees is East. By default, point pairs are assigned to the directional variorgram panel with their nearest direction, so North contains everything between -22.5 and 22.5 degrees (North-West to North-East). After classifying by direction, point pairs are binned by separation distance class, as is done in the usual omnidirectional case. In the figure, the partial sill, nugget and model type of the model are equal to those of the omnidirectional model fitted above; the range is that in the direction with the largest range (45$^o$), and the anisotropy ratio, the range in the 135 direction and the range in the 45 direction, estimated ``by eye'' by comparing the 45 and 135 degrees sample variograms. Gstat does not fit anisotropy parameters automatically. We do not claim that the model fitted here is ``best'' in some way; in order to get to a better model we may want to look at more directions, other directions (e.g. try {\tt alpha = c(22, 67, 112, 157) }), and to variogram maps (see below). More elaborate approaches may use directions in three dimensions, and want to further control the direction tolerance (which may be set such that direction intervals overlap). For the residual variogram from the linear regression model using \code{sqrt(dist)} as covariate, the directional dependence is much less obvious; the fitted model here is the fitted isotropic model (equal in all directions). <>= lznr.dir = variogram(log(zinc)~sqrt(dist), meuse, alpha = c(0, 45, 90, 135)) plot(lznr.dir, lznr.fit, as.table = TRUE) @ <>= print(plot(lznr.dir, lznr.fit, as.table = TRUE)) @ \section{Variogram maps} Another means of looking at directional dependence in semivariograms is obtained by looking at variogram maps. Instead of classifying point pairs $Z(s)$ and $Z(s+h)$ by direction and distance class {\em separately}, we can classify them {\em jointly}. If $h=\{x,y\}$ be the two-dimentional coordinates of the separation vector, in the variogram map the semivariance contribution of each point pair $(Z(s)-Z(s+h))^2$ is attributed to the grid cell in which $h$ lies. The map is centered around $(0,0)$, as $h$ is geographical distance rather than geographical location. Cutoff and width correspond to some extent to map extent and cell size; the semivariance map is point symmetric around $(0,0)$, as $\gamma(h)=\gamma(-h)$. <>= vgm.map = variogram(log(zinc)~sqrt(dist), meuse, cutoff = 1500, width = 100, map = TRUE) plot(vgm.map, threshold = 5) @ <>= print(plot(vgm.map, threshold = 5)) @ The threshold assures that only semivariogram map values based on at least 5 point pairs are shown, removing too noisy estimation. % The plot is plagued by one or two extreme values, corresponding to cells % with very small number of point pairs, which should be removed. \section{Cross variography} Fitting a linear model of coregionalization. <>= g = gstat(NULL, "log(zn)", log(zinc)~sqrt(dist), meuse) g = gstat(g, "log(cd)", log(cadmium)~sqrt(dist), meuse) g = gstat(g, "log(pb)", log(lead)~sqrt(dist), meuse) g = gstat(g, "log(cu)", log(copper)~sqrt(dist), meuse) v = variogram(g) g = gstat(g, model = vgm(1, "Exp", 300, 1), fill.all = TRUE) g.fit = fit.lmc(v, g) g.fit plot(v, g.fit) vgm.map = variogram(g, cutoff = 1500, width = 100, map = TRUE) plot(vgm.map, threshold = 5, col.regions = bpy.colors(), xlab = "", ylab = "") @ <>= print(plot(v, g.fit)) @ <>= print(plot(vgm.map, threshold = 5, col.regions = bpy.colors(), ylab = "", xlab = "")) @ \section*{References} \begin{itemize} % \item Abrahamsen, P., F. Espen Benth, 2001. Kriging with inequality % constraints. Mathematical Geology 33 (6), 719--744. % \item Bivand, R.S., 2003. Approaches to classes for spatial data in R. % In: K.~Hornik \& F.~Leisch (Eds.), Proceedings of the 3rd International % Workshop on Distributed Statistical Computing (DSC 2003) March 20--22, % Vienna, Austria. ISSN 1609-395X; available from [1]. \item Burrough, P.A., R.A. McDonnell, 1998. Principles of Geographical Information Systems, 2nd Edition. Oxford University Press. \item Diggle, P.J., J.A. Tawn, R.A. Moyeed, 1998. Model-based geostatistics. Applied Statistics 47(3), pp 299-350. % \item Pebesma, E.J., Wesseling, C.G., 1998. Gstat, a program for % geostatistical modelling, prediction and simulation. Computers \& % Geosciences, 24 (1), pp. 17--31. \item Pebesma, E.J., 2004. Multivariable geostatistics in S: the gstat package. Computers \& Geosciences \href{http://dx.doi.org/10.1016/j.cageo.2004.03.012}{30: 683-691}. % \item Ver Hoef, J.M., Cressie, N.A.C, 1993. Multivariable Spatial % Prediction. Mathematical Geology, 25 (2), pp. 219--240. \item Wackernagel, H., 1998. Multivariate Geostatistics; an introduction with applications, $2^{\mbox{nd}}$ edn., Springer, Berlin, 291 pp. \end{itemize} \end{document} # g = gstat(NULL, "log.zinc", log(zinc)~1, meuse) # g = gstat(g, "log.zinc.res", log(zinc)~sqrt(dist), meuse) # lplot(vgm.map[["map"]], c("log.zinc", "log.zinc.res")) % vim:syntax=tex gstat/data/0000755000176200001440000000000014646417261012320 5ustar liggesusersgstat/data/oxford.rda0000644000176200001440000000544714750415431014314 0ustar liggesusersBZh91AY&SY$t@@@F@@@@@I Ʈ}wD{xrjhS SG2djbzFM4i2 AT4'PPb4 4P0D16a4h !#FLFAOFD@hQ) h 2dC&&##&& &`L1 #4L(4&CM4M4hѐ 4ѦOHёd))5sF L8ndb&f\11!666Ӷ $4@ЀcTM0 ˖^ρ H,J1z%Q҂fh(R Ta6v \\'7O^bZ.\GY Shvآ뮖Uq涠ђGF֭58SO;0lT`׃W a HrܣaВH2M!(XH3IY_+Ffyvw^pn2m+se7W2h*wk˻v^cxSxDmx[$2Rz* @&#2^2w4f,Ӈ;u UBUH dcmW E)C` UP!!J?KTmP~#~uuB@DCi @9s \.8F¶n_^9gO/K[5V6̳2kiU-=l+f7nFO6"rVlg&7i] Glcl?cQ^_rVgĕ(PRxF2q#*1$r'TP־C^<7~`D٢u5`dYlVɝ5҃UE~* 46wV])V=(j/?=2vy=3ˏ/=&Ϲe\L<ɷ/&+hr?LOV|ݦmp-;V lBcj[(Bǵ-A8s:&o3?'Wjӄ[-K;kW)르)rwkEH.R#q/MU7UX!&ϒBξ)L7&T1{eA 00 &r 8I$I$I$I$I$I$I$I$I$I$I&?PI$$I$I@n!Y7t,w5͂'@HlUQhTdh$kd7ummwwt3j*-n]wrw];]u;Nr7&PiC5s-9]ZZwn"D媨YVբފμmUxX;:fJ> >a"KCjQ0 *ЂE2sn*LK9* Ӯ$=in>ffnnnnldK1[Ci]qң +,NA衠EMTO>-|\`u\\iqht'u2΀٘0 hJ_ʥQ-TwD)UB&g+w1KֆѸ;>#f'(254i.֗i_UC Eh{pB|8軜4/ORڥK6%RhE)Ȩn$ H7R!tDbGWuisXﵦ #@7' Oy]|b L2F qʘY3`exr&sH *p<e{ku0mC!XsKF@m%*(kS:03pH ޴gstat/data/sic97.rda0000644000176200001440000035461314750415431013753 0ustar liggesusersBZh91AY&SYJ2!/( J*UUUA T!PE Uh( 7(= 4ެ׃5CU(UUVlUUm.6U@SL-km@Aiz@P];hUlfݥi65-ۛ֝Vde&5TͶմi:cB TkmI S5ZҬf(c6ReFZٵ֪QI5 4ƚVlU4VhTm(E@PRlZ(lQI$*TI)@PPPl@)@  4A@Q@@ h H@ 4 hB@( Ҕ B@F*|@DB$DDH6bDI!$DBD$$$H$$I$"E$H$"D"D"I"$D!"DM"D"D$$ %"HE"$"DDKI#fH)$D"K}"$DD$HD>آD"I!"D"IFlHI"H$DlDHDH*I"Kn@ "D"ID"I"$D$HDI$fd"D"DH"Dm$DH"HI"D$<&PꟄ hѠ?4M0R{A$iUOLL44C0F0M`0&C#BB) Md6i LFSiOhFOCGad%(omFO&i d5Oʘ54cQOj M 2d`  &a0hdiLM2h 0&&Rf̄D4Ѩ'&Sb<"=#5Oa12xOO"3AOSQP lČd?TziSjzI~ӿ[?If|8*jB$hvߑA߫ 9V]Ho7_+ݏ&>;;v;;?iiϛ[_c7=z'xxybbh$8"T"`SQ4!JDD@$h%`*&T5P*(=Q4@VM*Ǫ4Yf' (VPT A2}ʚ'ǞCQLITXC59EJ%PQPUTQDTbrԘUAB*i9l/u$H҂)v±V=LlT!Ud4 8A2Q!*?Ov'N|^ЖKtOи$S/FWv~}{fzo>rQ>Oo;:[N͖v_bo'/潹`(47jiR@A9C X$qPN=D=E@zLA!UTEEOQ ՒEdQafqI , VGPLDPE#j4ۈ <r 2]Dx buF{NrG+ա6Jq7s9řEN:]7{xԱ&IK5=_gБ{)d[]ֺ()ϋFlv掮_{3TEs4!":Oesoޙnci;{0rD+b^0Ǒ .j"pIu; п+kcL0_UNw7.7ys˝2@XF"DBդ@v˅gSB~^@Bw)_<%R__繚D1mn^2X}r4Xdv,t9ߓX8[ 'Iy{y~wqŷ(ݮ79dݟ/qm[~spo<>~0tXs0z\p.X~f_N\0TA׻B䣶[^LŽwo( V7!^ U*S٘{7Qh-Z{  3_ }VcǸqӫ7+vkaº;XgjndFbq7(F1qmۏ4U!SU|0 3aMjDC qIaܣT? "$WTƔOKޒBLP ڵTY@m4CAwT׮oށyDYoj\F2kŎhNB mrHP?.Sbq+w0)- ӠPFS V,L 'eɋvS!OKz/4{?=SCUeO&SDC5}( +és>B4M^8tf`Nn~haa%i=vˈ6ЍbWjooaѮբE]:ASI'= ݖ =b&eZM NDcsPT+FiB'X{q1r(mhG )8CgQQbt58*F|:vSTQ;]^it˶MW}E(>e~0#hFTH ;U: h2[.q̂udK#%[s.3Gf{k/܉9شv^:(€ȖwvrT_5NIͣUJ%1]5MvdӶqлryN7Sg0ZIs@AD4;Gag'XjYk%7Ҳ9kq6Fi)\$ƋpO-O=^~ O@~JC {zٞ4z&SOy2xȑY$]yx@?Foc(h!>~lڭ,x}ōq #̰Vc̖iyjh2U*5NIfDtJG >TcJ=\L:.,dDe9{qYc#ڭ!eS)a8f=9ŎD]fŦ/-f[TU OsvJfbU==AFJ7YBc_PҲDU:,bNm]`өcfwSAl9bGE~48`d|uOҲđu Y!H@0Fyq F&Si+lkXKa9bGLX›Qh57V8=5A͆C.r^] gqYNӝi*G[EzH&XX1͋$ҕH[;yOxi٨N7 λrC~zTa Fi OY5x1۶^([&]2HfW6qJhOrVgX잡J8 f/ BΒK8v 9gL:x G {FO6YM!T5KgRӝyh1n 7L .*ѴVef|;U}t{<ϱNw>a-9 We+hXvi'rN}G[}o&i B>NBURSة]f#=7‘{-/9Jڛ:t$+[G ^]MaڴGJVСk#eb.K 3Z]O& 3o?]r׫KVoɃz%R59K=~jtY65nuǪI}Xh7+u`񾉮ݝ}"-#".Zb0lpQ!d=$tI}}NC糑#ǯ]{"ף]S7u#h5Y!Qs~BC9H?np]=Ug%B'@l'qeC1kݞP -3/IO%PhvIXg ='V[?J!rb)͓^uβlc.<9uup$)dWrM \\-T`*XThR"ILdпGhVhh墢Ha`O4w]Q^J?f)dw;&vMgpHf̘ mK \Ę@?+!lV`9kab{Xb-ݜH̅yr} Ĉrp5lR/^zWu+) }dk2*Z&MMiu ;BnC&s9NvƩ䪼ֱf v,M,V=q @{Zwgs̎)q*Vj$ۘH 4,T>C(1QiԶك>I(FʜʜaYLmXɨ^icqь *ce.RaV/K.4'~ZL{##x\b PӴ$&̎Dh67xtqozR BU684ձ5GihGHt2}X]-$&H=~\MЫk ٹn'Bt?KW"ގ4Ǟ2 )bJtH^1ۜ5ňYQjS}Zz86w};<ȟNZgPB)"(Hàs<]{ny6qvVnL =֍Q5B:w5yTY䂃 Hmݍzajé]p jM&n0=OCkҬ5yqfܬQ!)uRpUB  g8aC? 4F?;fj+=W9d=m'|m#oGꪧꥅ>@Ҩ<2=3z/""zt\D_il%>tNe]NBZ(2icmVk;imK  c_kcAL$l~lc1S1م2esVLc!e},- f-?Jm[NOkY.U>u2Ljj5ήdL!)ߑXerF§o|6+cƾQl{#)h#y(M@V67$QwȑÔWR;O0ox\xte'UX*gngUT8ba^q(.kmq~#L},hGCvX\SY&V4TdHzޙL*cuvsѕUOY&LtXƗ=)yZD}`iٜI!Hg`,k|-5!>Y`i%K!; kJ޾,fld&gȥŽ[^pXlk9Բo}̛ZA`I2Dcb<ەXӇE.i%jQk)SJ#mla{FoqCvE([Pgu=&=}Fi|ޝmԹ-Κ!k*;i/%Z癒&r<*-JNhS^c1ɿxk," %h.X4CZl=I 9->7<uLLJe6e:,e FFܲx}CIKn RtEA(v;s+@s_Vk6gUBmjK(5ӥ[Yњuն5yJi3X'>o|!BTUKhOxsxNuRїJM:Yx % mWs!V60g y2 3T"e%HhQu.RmUܫu^5Hl\=N{R;Jln>|fxn훩D) lÙT#]X\Jj>kW0zտxߝ% ˏ>}nb[ X#37Ksmo \N1rwQ˴K[՝Ͳn$3q_|\'T_Z83z2cT-hXf%?Qv 1jJG w#9oˍ}T,'8/3жN0*Y$u\hnB,8XE K$m^U.g~`WK>r« 9D$J7 x(_Hፎ*A2r3Zom㷸rv!7W=~ŭ$-wJ5Q"! իsL^$PTHqbuOZ~[-͖#WnM]>i6B+Da:sl MZf:.{v@bB R8QS-O5n{DeT:mahQF-غ+,Dx\5׬:sms 3DyA'jG]rWmvg5ѿO[.j=_同N6t6Kmnݛ]NϚ q>C%@WN~ |t$pzY mՎ_7vͭ\dSɢ(m1 {[SP^M:" FLҵE cҦ%/D-]SAe/Ɵ1QnÎjL+Bd@`qEWx ,.8:ed KVF찜Xf d)rc:5)&[S뫏Hm2%!& ;vz_/t;~$$]>GcB \ YX=s8x,|r;AÏ+.PeC\@:X52Z!V㓼y{۝]%ޫ%E\;4yYĄmi!W3ThljCW"EӺhkQs9*J iaVa'veeeĖ|5%vmv{&q$[|4.~Mwm/4o`v`[nZ[@㛳~1+>3Y97@H&&#Ҕk3*YkcgA ؉cuղd$߈@,*hs:{Mn.e(BduTGb=H# T+Ma‘~g)Я3Fp:(7նu$jyN1V yYnt|٪4LmzG0";5ک4tTߓ9/TAG%vT1؜+2yQ%DH\f~$fO'%:ZzvPdBX mEK13ҔNH-k/(Zi*QsAF av& Ljd;4]½`\|ևs]B,mäb!6t$h%zs%8 27Bp:!j` 3+>MCewNJK{Af%8HͫGnX]♣OXJMcŽsy`N|QNpM`ߪ kEh>5C6)*s\=# 5yt%+B sjika9፯ b xYad,T)hqFQtߏ1I*( O0MG)6ӮF)Ϩw' 6iNtG]^avz[n:3$L4<=d!_j`pI'٤=;@q zL6g?BO)^Ȓpa{vpd?h=fl~07]!c 6R eD pfqBeFݡ L)1n_<|MqJs'lY/]yǴnFX0k v.ﰁ^棔$E\SqL2d'|dz@g uT?[zQ>0,`Cin7Oː;B˾YtM>7B"qFe(p*v-m2̽`|9B 1t姬]rHWς>R`IMQm&@*c6:`T@:=$U[pD% yM*!栰<;(ǹq^vOq*rQ슄rRR#~.i2/n4!YW/rb RG ;s0$RtEȷ XN8?Pp/7'j.+, ɍhҍ\>mIѿR%@̦Y* 2||!u?-|SO)p#2 I95-}$ij*j fl:c%x&d;ڵܠ'vSLN(hE;""UwK5Ÿim~V&1`GE{eP#k:9߮Ktl'ow;}NK6/BkIc?wHؾ毁gBec9\LiAtԈ]@ rq(^nǾlG҇yU:xI;ܗt| eCJ L0w)9!u:҉]ÔM'?JcD-ن?,-+˃:VD^u@۩0s|-^@퐣惓rAٰ3noF M 5ޤQg< QG Am!HOm 5ÍXP*M/hjzLx Vw~1+8pXw4/溓DTh_P.vRRqz(ss6NOxv$#CД`@Ƭ(5ģUş)١#bjufN"ږeux!=6Y;-M$.t`~ݓ=XC<>y ":0@ c!$$<GzobNQONv*z<6'r*g\~G [U^h-Xi$Ha%_%aC CNj}G.mZr&sG=` 򁏁aIElEʉvjm |N6|lۦkqVzkl ri)_ӰLtkM32ޟJ{=Kv5ιeqB@!ل$ Y:Ñ U>Z{ӂȇAZyQ#ee佷[r(.ԢU HOnGE(T`AHyEE)x 0Ӷ{LvhYVr)ՊD%Kz:TLMRSH6 L(Sy=F^F',}Ƀ g1G˾S!1>_\@X4Ŝ!=L;`+_Rk2D)lPgXX%H﹓l̓,1q~EZn0<`t =@ÚΉңlO',D)aMeݚ88zҳWak7x=S:0]@c'k3=X/ҁ ]eH%&c?hH|PwLʥZR}t^k=~Rtǹ#ǯj,zY],9Ib?E<#u)|!9eNDZncyY~_4Ęvaƃ2w(ӯ۔30شA]n K\u p]  GχNh~R_Jg TObߘz/~ ޡ/{6.Tm|)}Tތ@=bL L o  !]@ D#\^iBdhnǹ+ ݉@6f kCXѓX tOӣ~u&^]7MUɳIo't}{,sӗ]H1彶G o=~k40X')ƿ"Wie1<@S)4lGz'hV5ҲS;@8>~0J4 3g)!۸M&>/]dZyp Ikʮ{ud-N#M;7%:i0l9t8mΖvS `Rz|&YyHoLa;Fગߙ>I1`sV=CY2&) Se8huP*(藿rsT1 j?Co;y)/Nc͎Wap^^<; +`>ڝ_PG"ӓ>i nQ8}REZSHlYp: ܹFH1-I G5 pcq]V5-<8rɰ34*LQ^/jv\4w!c |o{g@5 ^ēuFu ",*<&upEbPZINEmbPAH!0Btaq<Pwn/HD*L05k!Ƶw4Ex]:D͎{A ێge߄vzZAUzb/(0|lz e>u`g<[!gkɸw OAӐ郯wO\ ߙ؋XfnJHm?߰$êkS+vV~Η8vԹu==-;I^!:J{#d&򚠎wPe WE ?jz@{9jG,%GHwP1*Kk/s[_ [ٺj~f{G_GڴJ>*$`ia%]=rUAYSE6Es:Ki ~6OfQ]ϦRĆ`)ZI s 9fk LZƷ-tnUhW&ƷڜbYIpmz= E\w=8nnu̷ćJ~;G>?I С~=S[w(5k;V6E}>MҐ<ijjE"/ŵ0{kuNVdxW$+||f4xH`օU FiyV+;h*9XZw_ɶ~?>ƁKy'H~ MpgCa=㷅~xgwO | D&C=5q_W2')P1*JCxCzC*`uE LItPH0 ֬Ҷa.%[4f*kh_hSqHDcݶ׀| ՛Fĭk~֛G;vTsyis~4W =5Ib.Ւ1UCn])HMT.B7TRj%|~Usb5 ]S_a>+G6CG;yl!F\!԰C"Q5({% <ٌ3t`WlsL J UiCHTʁa3O.gpŠzUSȶQ W, 7s ~[梃SoᑗXO)# o75+=1Չf&B0QR8k"1}Vr?̥?>?J[!3*³Īy*Ӕh "{D9 ub\CxC1DbƫufCm>N~[&}t_8Uܥ~ۤC#Z\3{OЦ/ 9ֈ{,L Ȁl}n>/ݨm07Qd0#`'hONuq[yÛC.rn Ux>0A2-]m ټk?;K TT7ڒSm%[MU6/Z^/UAWG4H3.g8*>!W.ن! +r"F PJVtmfmJӯd;SpSu$T֜o>(}v\HjѡA-46i K6N,NyC $ӑjCl[*X}>gʱ5 S| DfDj]:{EӑVzߥ7x74]7k zVR;,Yq`9@c=`?)4'ڼi^ݶ nvD{g=4SKezǺ{u#նJm4%?]>NB֣svhLiLjhiفu-ND)U\1ɋ2'GHS?hTdR#=K_YߓѺڿM~1aat5htxx윇BE9Q'WdRz8?EY}/ k`a&f6Zpe n,P{YZ<U(:ٚue+Hy6-*#f[vkMk\B[Hq@i!-i h42ïovU4l 0WS"\  5G&To{œYyWR*<dxաΤ L[GGv^&FȾCVYH"KH/X.G3;XE%&p˯;*2& `d%mEΗQ~*5kBJ Ьc62԰']P0  x FUJ.b _ |=|;N^o޿ zH򻷇#<pK1^%NAY5O K٤d ,i7?seϩyiIZWd{#|mxIA{I}AHEgǩ H2FađX 1.CF`])rB4g,d>D)rH͐D/ro-m;"у)kFL)mP>"B]v$EF~Pf#W}# M|QR[s}%2ZR!g_L"_m6 UrqOa *b&8S?nܯ(z^ᡌfTlc'tn>XbksSVa4rbYz촨=^{5+F[59VVe \|c1hBe!)Qo/4E-a( Ely;'9r@`*h 9gkW"t%;%/PwJko6bͫ۩Pu=m4 -D^d#X&`<qr>`_Y {n^wG`)z"CF@ h"f( LE5O8BDc}D,@kP7[]KHxNYlfA $2%mU?Hn1 _]1e[jglPS+8wv[#EGe6O^]!CyW   ߉ rp_3) `22k%֭JVhrh7-&$vflC8 n(3?vfA%X0݇ZpBG|/G=)d yf\I͙hI z-Ad%w<9)Rn}`EIfF3?G4L,r[N޵xcᚳC tt.E? te [Uux58=0F jաCj\ WO-nj|OPpwm^&Ѿ>k#kz uZ~49$3@CB2 o73>[kuUʫ=YO4nx,D‰k"5^K9Ʒ88&^KH+M"졥y$xF8WH2v;.N^Z4;`1l#O.EZC=*Au{vKݦ{la=PxRc/kS.@ *"vedus"ڶ* ^U(ȵ _ӫ~%6`!lq`S N [ (YQHODiI(@blvdKtcǞvh Sg$f#ha+p+?A'QNZ$Rd/3X⊵l wf]@ߡ ,Nh 9:l6ҖgJ UNiW84۴*Ù=5ޣU7Vo> -QSozRKҷ)Dߋ<eII)O }aHNkƵCa.qN-o$o1yUQPͦ0e&|{vб6l b 18 ((dn*Z=`b ,uK dpzs?y3 #p? *kH?k\F?X86)H&*RoX/1cXgNzO4>Hi))\ .8:[NNg\JΈ}txPp^yc+6? ^ԞWkIvPTzdʔN)AأQĕrH*6:$RWaI缗hAJBӣm;*%ͮQLh{u<{8v&'[KMd pZ9 B59v#ϭŒJ8UБQ!hH_S&3F|0`1@:'fwPn\[|tø =yjc|/@]s#`|_E+Iw6k ^ͪn0+t':σZn+ mHsFN CY `8ecIa!{- x1'qγ h1BI,2Uvh[50 70nr\Sx&TM|M~_[zlWuU&=dgNƱоj#eHQL@6#(#kȮB|lQ@ #TR]XצrMHkLJTѶ+:%.IY΀|ƺ82dgs}KoP0h'Qnč`pO3c^!!̥YzNF]ᝁ{_ԻrHcӊq!˶"6,/bύx-G"DBO(r|v:zh֙dYݚ]-尦, [;!A|3L 0*^ڇ\LmqGuPaST4Z2@CyAG1KPk @BG07c-;V4x["mSo>ǥb*<,H&gMkaSVD'qz,2Q^m X#Iʙ<$s Wz|侢N2(Qz|vZI@YhǝȞ:טd̛p'R[3\ԧ †i:y+/Me<LI‰g7`ܢh>gHs&"?g{;7-d/9i-4I?")8I9i8憋ٺQ~z[p6=[KuPnAL %C/95% 7lA,3:qoB]TG@vCXeĥױO"/JLο.ˋҚXV,H(k5^<=( @\Ao E~ql;ھ~eѣy?+XեLÚp)3=G5Wi)SmU[²{5 %%wP2ě(/ BRL)KxCtBG(37:H^a9i͋k5ܙWX -1B|ЄMXʐ) @8Ȧ5 qQDџښ5ưxU’o _N1GbjRI|'i-SX N-yn;;5{/8ZfOAoRWPU_Q}ԩ;ix#<E )^m3ҁ%VKLQsS2(;{dQI?p}ֶGYCχEN" 5GN\R "SGh kM7cL|&![$Gͼp` 76~"ݸ ʫ >ԩ a`඲WJ:&d8A6²OH{Ԍ ZM"AQܟ~PӲK:Kv=RuN}Bα已0|.?:װCRTsl^g //!2O DfAinyo`.s^ױX6$QQĀBo g/kP8!wgt7tɸ?TSlJ^)aɑYZ&J["ғ-?uL*Cj-+t\KqgEst:N1eD#~ZucF1Qo4 60U{OnEkF?L0sCAO]-} Mc~=~>Zˮy"̲HK3<=Q(,$k@b=aw1fbpJEqo)ҜpVةht0q ' H GCIo+6՗?m$OeHW~~EK@p^G7Wii^?}I u9ݱJ:s{bx+ 7w3P~g*} X,yeyI0٣@myu` KyT1"੘"qj"k{hAn.H _"f56_3Ma+[h\NM o*p~P+}HtnB@h& CBiQG (t:E =0 mxs~Q_8nSLƺOӤۍTcvZXjU]kQHn8AOCz;57OSN)ٶ_6/m42zJ!0 T"a.6 Ϧ9N&/6LoJ7Ӧ|$w*T@|@WkKլ$:zLeEK8z ?2v^`5u"", vW,(yХ?oH a[B =fc/uiGʙ;ԁn?PoȌ|43ٱc1*̦9sLyJ'i( 1Fy $DOX_,-6,eA̬Kؾ6d‡(Qq}5*q؊ nrg"b,7ע{x1/j cvړF.)fy1׻Gh䔲Q"@vnG&Ը`/ ؏;51.\&:mU&x_608VbB/2#c 900BSjAF/ :,^l̷~xC 9GoBiVa),?.زmpK}sZ̈́o,I<ÎE7 iT bT4IkLʷ&G4t1P2C 4>wv&);./mne>8%PǼe]$.O0|_BVG,]xoؐOVnFʵ? 4oV)XkJϧ깚*tHD]M5S)˲1KK`+FXA2;@u.c6h8baځ$'h)J 1kER+lԇ-pxmg&ӄmOU˴ OMs &td)&c7 }Kgh5 :IG\g㸁a|}A7XS.p{M(I独u i)Y}]BqZM"NEiITjVP,;JPΫJJHnRH-$`ֆ}V9W^)eabj3udpv Ì潒3F0d)]yJ~FkSEL=@z::=ݰJݓf1=WDlzޢʉnN"oϩn@>C~.@!*8ǵiMB̄.PpT4r+ hfo<=z|l! `BT`2^CA* Y$3dMvOf4e`EQ5a} {)IqZJ.܆jAa.ntu4NH"rUo ^jydDiNW+44%C@5n\ #T_).X bC; R<8M=&.U M9L uz'[iȣi`hcOXHs-d4e<ZIH)Cz4ݿq}L7]R`nLO+$jRTӻUD"L&$!čhCۦ hXs,}-#-,1-Ni38^ !5f0B/#ڬ)Y7{3f|At?ϵƮ@W +(V8 v)D4j](c#.y=c]/NxWZ/nVx f.79,aNMktaF'8>:۳\-ޭL$itMCp蓊 ˅Q}Rl:0k PrHb'`-P\g$RΪ8XR)ՁA2]y>L'>>!δYC ~xk%g4\&yeiSivrc6@E8΋/d? {GWl`8Jۨ$"&^D[>*2YZG^=B EBGdpMbkNH|0kɔĥ_1F8BC7%MI!9ˆs3^5nw~9&{鯤_r8BYaЌOWk5et!phJT.XM/ez=1\#!''S*C^t0Qɪ~#?ַI$K=Vg/c=ǃ!Ş DL3d́\ϭ=^U-l gnzd _)ョh w^뚡Yڧwt M Mڅ ; 28/OZHj0' (l=ӒTҪ,ּze{"@A,z~LazJj0Kz4]s[-gL zs1i 6П =s!İt!`t ;n ɘ]w+dz|_y۫9e&#'X-n`@Nσ|~s$,4"׃3'@jz<8\O9$oZmqa1+u{*:n- ;ER@}>yE͝ar(]茬$ @"0 +H}o⽫x<D9BaMn |%gUE{dnT-y(>:ⷂF(ig",VZ,jʃ7A૯gV=,)ZxS#b! ]<"CݝʘK} )-cGZXAEs=$Hn6@{c;[(S7ctS~r`W1FN'O%Ae†w" zz.l(1Ol' saa#3x q@Ӹ!pJwZeU^4P?g|{nG8#^̨1]fEH qgKh:0㮬dD3Y !֡=5XywȦ@jQ-܇4Dw 0PxBgZJRKwRT`lc ̽y v󭣝?1VB ND8[$P( ; OhNiP8zh˥D\&wkP7=!xz(!6u̽d .D$ :UGZWJ҄+-=!ҀPo@,7V'oB繆6* l^ kZ:Ǯ} '"/zWU5Aq )[@7lf).;`z8c/z^]}o>.Iq;+!#iA&*֫Ew`ܙx_)V:L\W-=M[3B//`X,rp/^ɽxrd[ϼdiL2"9XÆ\WEk0<zh*UOEx"T }ޣ6Ykovt̢8󉈶 v I36,`_3sDo轿=+kEuQ6K2V3y**ҏ̬l͟:9 iQVfaepZy|y4ػv]GF3LT䊆LTop8Ћ| CٳDr::-kfў_N,Am=mqP\3~甯>}tlC=LKasm5wXL7? KQaͪ+[|~l!T iDҍf(7'oSFi>r@"Eb3Ov:JJ7E|LJͶh1B? [& 閭΢$]#梲^ƗR'@%k5IQ wErX i{=En2-9s BȐfACb yuNx|T*lfwS$#+}|6E@.pfHn&p$oL2TSѕwSy>Π8 ą,r|9򑣕.6a#; ~s=zH J ۛLPTpq=pf:HY=2f'HɕI=gB<EfjIȔ)~ej]y &tZksZa),$,UA d9̖qˬ;UHnDCVq.a$RLkאQPFLa#a`ምU]nT@MmmFv$b!,nbLXV`̔8Fk泃P j;osdɦD@w&8~x;l΁q﷢(4 BkV*Yb s z6ƿL9t K!h$V, dfIjttݬZ&{xT̀wk.B!@+AMU{-L bla[><0oˊ;]@6˄gA8DqoՆ \(ux^g XeW;;8# M²x>B~*{ 𱻒̄%nyDw(&yN4'o#F ';='5:ςJpn%B4@y)fr:b톢^iuoyW ύB+t(欂X8fN=&/C򫗔t1a_GH8L5\ l]||Ŋ.4?pEvb-R#AAp!%/1C<]jqSWR(P!k@1!S*vU:Ԅ)+::BLKރ[{;<7s駫x|vy5sA #GѰop ik \93l]L^$]dQ8/$[$?$20bJ)&>Lhf* (H4 p)Zy#-wq]RLSH{Qt&c&='3Qbk& UR7 :eh6 7-Ky؃Y23BJ^8;^=wV%B$ ɇj\ކ(DK"!t#+mBq'< X/Kolm=W_CQ_+^V0/ZIRUgB! U^ ja_"6Tt -:]y(ڎk~/f9]I׊}QӴ:DSvߓL|Jf䧟7jdakIQx}% an!/@kqSԟUN=Q`|LʜH]6-\Aq%KԱ6m(K rИs +n*my99 (Wʭ59iQX}6qͤH.ɰ0 i52kdk?2Nl}F5QR!Zd҈}v l,ۊ! 'uXiuRm<#QM>/'+?5dp2X&ɤQd reY4XcZ: =7%S~: }4'Qn]9`y3ՆQ05 o=EY ͰmUldG(ls=T!H2dp2([ 7W&|`t~ J3G3I)si٬]¥&rd,grk$L&x WRb\W-]/_E(B90@ b62sTc%F!lCyz3|%Iqy ۡ[qkga 1N|a4SYy1i1 4;7LY6IwqLL\.:"?> oiwA5qmx2/}[st-Dǒ4{f"+3iŽ?P)d0|EI b5_,YzpY4Ke:YTɞ{H~ S;9sɌT8qiUC, {0<:Ӱ)0˼!^ѯw ϼwdJ-ҧ>h K@GLTR9b+* nřpI&3. 9cփ{ ߐŧᥨ=KܡCc3#E?CnZv=uьMA` -L]l,HgC*噑jRb&3_K~+} IoAߌ84q$~o `gbX$"9Ov$t~zm)Љ֯8l?SwӡklS n~XnY Qz1)$Ph8Lf7ok˰j Hv7(> ƥk1u/-hYln1Yk*bP4@o-pٹUw5'Q}cߪSC6>1蕩PͰml$YxR2cx[o,"J(ˡ$Ҍ`LzI>2LQ}=!6JCF&Z5N$}zOeZLh"Υ~ʪPa&q8i#NV:V|QX>;\vi {. ,QWD}xo[r;%"uj2,'Wፂ0o*t(mDlSV@/ 8t{Ǡ)Twvp#6"0:O\!<}Fl`jr&kd1)^J=WgkԷTx6SWE v`ptP*4ѮR)%Wdn H=?bO4D$HFPl9fX Us +ɜ05. hQI (!;ipHz9wlXO iݍBg`I+ {"Tau߶B1e[wRsoӼgQTs4QK9c~OO^$.uJ8rfiy_O 6 ӔjH+9"( AT YP8]-w% Y=qD9T!Ak%LY_[පm.Ll TeשO=4ILn{h:U[.up.ߞxdú L8Wo|M3xKf[^5w~`{|w&2Gz6m/]:(:_dm#YۺA`Rz`7kMΌ0d]I 6.Q{ّҁlA^=c \墣sf3h8uŧÝ"JG5"%9k# BECgS;6d5D?6<! =sʶ- VV,`b&FtEDP[F5LN6h^lyeX?O' 5aJVޅE)<  1 - d EZ4v[ TwЕ ?(wJ_}c*CoZkx5lT弎|%VVz٤^~*R+lbБ4@0WꢡcJ j|[-Dž!P\ߨ.|YM"QOV'1iTTxhoeBeMaR9m-$75mjMxZ8Z &8lRDףmpgYsC9⑍-%1 =W|Q>cK~)YIF>L,7NdKc|$"5N^G497,0-3-UX.~c:0h|llҼ ?nd6$#s$bPl(y=~i\݇`TT0L*9I=NBdr@>IҜdqL=Vxpjmw1}(KCEa[S_U=ƿFڛ˗9& VT3bۛ@s(#ȣ .ld &Fno"!U{ 붥<T$'PxeȽ$@ _i;Y԰WieiSa (*qǸvF2 DB[,a;iޛ֤EkHEbVw}#n~_"٫ س^t2]}LqFW'H<,zS-H8Ql:fO]Mcf@3Dd9Q q9AHUi2Dp[RQǼa$/+_pd[(qR^4eu'2DtLnzF`1<-Ny hq%M5Gˆ, TuDBw Ż%y ~oJ?,ΟE[*0gSE&Dz;9㦡^`b}[Hή 럀 ? 1yQJ=Ie/Ę;Sdk*lːT%} /{_ -whEsF 0^m \_lh),#ujNn(5i ڢgyNq_&;4(?dv-U+=-x,3b&V7q?=:>ij+G{U!aJP G'쐽>*,Xߚ nIxJnPUfO~ٖKd?:s78uPx-pF;V%r V$_z'ra!fZD,pcs&<;;>Q=hcȹ3JL򀣈hl, 1!x)TbȶS&bF' TF48+WQ9_ޟ]}_G>㹨HD͒-72P/,9ms;RP~r7_&EZ܌15}7t)/);`d\93]#5Y@W 韼 4?^bQ.c6Ci4GpaM;b`2j0^ق3lA*75$N S?v-m`)Y.\{ Bhd#- D_IU );n?#:}u91S>y TrI3)7u;`7**-΅/ MVl$\Ba(%* q\ud|$̷\M%9I~%Lߌ!P%G :E@EKϿv)'O,3׍" Rf#vL$|/e:{s/lqY,TceZ8hJ| s;P;D`r0[!@E+Q0i9dlDmHR;ET%(ɲ.2"Ldp sutgȋd%H:Ԍ98 #^jc9M$8J+nZ`eoMe9_ʸ@DG/KZ\P~b7]I'2 Ik(4tr| 5eZ* 挸@(%7*&-OfnOn֝h=g>c`5KlxTjsHU,C]$)hIg࣮l0E沩 /= kw˸ΚmA5kr1=8ҳdۡի,ѰQ&gbw3[l$'\H:Ewr%SyQ٥n 3<-*|㧗mϬ=v}0%|B@K6KrqiUW3+{Z;2JGpX~ou_|TOrG_˸ g8IKXv02nvCjde6k}]Yjx_fw -DZ;̧|aA[h64SoB"SxtM=޺ N4pÓl($pg Ebb1 V],gd7T5I#rRHlȤyg}2uRɛJ;$STK?<@,;ɔGN`W^ci[} PgYy ^浧=ziJvSA1Z_Y\ ́tal01u2Q]P @&h}T6]RW[m(킚h+O>"v4[ / o^ks8=-&hi1۷WǼPmBrrBtNzIeAi̙<"(;cm2V2*kC2z@{ej jB ne|dR !Bn=/D2գɽn[U&C;P[e6 Jm*afQh8IJd. 1jedAp3yřɺ>K0J,hCQAzW4'U. Nͯ?/1aM=Ԋ)_2:72j>aL ` Xb6xqFP&4q; u}"X(*4L-MVP;)+WH pcт eRi]02Ph9W̆vT(e1w_}l.]Q0-!QB]ird6b 3 4}Y\O?jg NQ4mY_UN ea],NAP)}MnEu0rvLLF+Q4ۢtf+Α K q!85Ț ? ط{ x2"4v8[BqyV5> <3<">7ApޞtVK9|'oH=_@r±;)p*b`$2-fK.=qV*&] uieB,21ft҈o#D:"5H~?3HJMa05w\ 2_ik+O j^+;?ZYThgˆglZَ֢LS#]OCU(dh(,`^c>RVH;7硔*AU4/m6aZ `^. J3}/xE1nLLpEVz&D y{(pjwR=|AW0/5<>sZeA8DѼ#^txZ*ۥ0CK5@gtS a8{C(HhYCzKIN.DPɭ' fݾ`nS m+zbGޯ*,KHֈb4Aڼjm~Y} GD@/eH$/s ROg POԓ.ZMKw8lnIL2#KZ}E, yO( ?|7x:Ff/t~TRY8$,=G$)Jv[}݁ ‹-vxM77LK# z':؛e ؠʹ ➔NB[:78~\nZHb@8$ :ag)ǹhv,Hy/4mNFɄ{s>#ށ)Ahٯ<vuxC0DĿgKt}@`SZ(cًJ"6"/fj;_f᪼ 7ǶϳS1!dn`CE <6#s_X5inz+ 52^@6wsW.h֪?$xAٸ..4GǐIۇgOU0?ЅP ܓKM3,6ʜTp eFkL CYeK*F <@ڵ vo#4T9*Ff*$,wh\G^#GO*ղq gf:r1PfT $fY~9nF(c[{6VaK@,b=14[PbQ %Qi Yĩ+r<"/@dfwߦ49ܝ2ASoS`х[{ ]:;BM䃀1ܩ_ 0ٚH}4h_dc|ALY#oUί~75tc*s_]&BsrQjR3{&8Stz! kW*l"> g= bzA )#ec*a5]qy"S 榋kCɒr- E=ܷ7O ;OV%ƔʌCBe%J1|>ī $ƲMЁa>ױkZd:lm@E./*f"pRRfo6i^qptne͂i'-ڍzBA[Ѱ{Ii<6܍yYo'#%xBqIJHu}0j)p\6jlfF#mQt?]l_ q\CUY%l{H=-:O)mqNpK ASHč D +6e3woO?]] F*2l˟z䠨V`Ofo^6ߝ 7ʑ<%uLChFI;Ao_/[HqJXCz[u W椇>d5`stsV0e8ee FO) ypT\ۻVWG\OLI:W< J!t_H|t_G[I`)K*Y1g`s ~RAew76%*jiVzhF+|xqZKUIԹ_/gY'%K "SW4q_kJP(ܓYgV^@E1/)mHyȺ;'zsQ[Uj  C)@@2U)PB#|[*f" zi=j)sD&I=w:Qi?L;3t`ŭPwnҮC~wiԀ,NrmÌ#ws"< ɽ.+PZMIآPYZ{씕،,ƑEw&AM,4YR$֝cB%WhqQh8rӃV?S ?K|Nyc  5(TGZGJK17å!6WeCyҐ:4k'R$B$}3- @FnB|ޤ#xu 6U|aiVS!Mb2U>Kg-f*C6YG[oDn hGfhhI]Iy˰2q6 (\0hLk=5z~K hR#I U dk69$AQES-/Є ԚD"&,2kD/3 ;%>0]5.Y6tmw6ӱIU=sSѻB_›"Q0kI ow}._Ԯeg"o3~DxGE{{!4, $~ ?.oL̲,XLm:2}ov'QK{6YKضI=[RDc>3yj ORVZo)crh?kIPU8%AxgX4]GzyCxY }̅mD/kڔ#d C]0Ipbu+ SW -}GL{?)` gR<Q*8Z (nd -/SSGg˖ ۷+\xߴŊl7Ҡ 5 y-D쒌Q<_8[::,Ϩ9λYˋ F! ]b4w;*"c |<(k\omFJ/COm0jѫEsa U`.)0(F:y^SِJA(*J~{eTK\ckg}odl~-X2M "cպRNp҂&/GwReˮf],u $>MaQ?S'0H>ᐁ,-?xv/EW_uT(b]b`+  %~8 =$tjL*>Ҹ'LhP5zU9> 墄F"]2=v=lfkgG*?&;@=6FJzͦ? s^H+>҉r,E~(s)TZ\[&Lq[kDbX!C ػLb^͡t1xTAѤy*2,HrS̓92\7(kҐEk1%_UxcO۸Ux&D}וJGӖoUHQoN*EC{୐w.& "v2'8-&#ZEp@_9$$m DzT-f ńw"jqRۡd_?ϧ'?t4VpSLFtSϴ.w1wذWT7 MұлMtiu4:7%;m>ѿx;g1!#{4|vI3Gc@7DŽF̓YH~ z#.BɁK?&X)u\.\%3 a`C8ȸRa~"+ܟēxÍHpqԍ]q4DC(S CH@. +Y l͙[H|3'")\]Аm$u<{c"K@Oט5>*:zhfʐ'sG'6GN3Q/,s6Jqٻ<kyp G<@+{3왖j\(*;aѿLVv9*չSnK D{sxrrd v2;5Oܫ4pr4Qr׍mn:ѵXi'͍BÔ^n_B^WU+PyJDTfC(JO:FG?eq%7aA7-% >bԜ%qE|oIQ>3Bv^ ?>$crpB:ݤnH=v~ ]5ǹY5]Ё?"Xh‹eNݾ1Bĺ6 ՏBJ8r!&lS~P^1ϕtdk%NHM>:Y}B)+nNM6nxG}2|BrxhU# N$$%-jR??_@k\E(7;֌۷6Y*JSI@X:բ'0.b)uИbI&.fŸy.[CՔAtwشG=nd+J  %)  Mׄ[?Qh& HLxj#Q]~NUW\Dxӆe4@%*`3z(:zp6r uy$_0ɩ%!PMa7= 75<0PlO\!eDkf7L+_(*U8EYbeoSş Ȗ<4a,nݲw 1)o~BTsxA- ReL9QLkrÇ#o  LJs'f ^3嬺&aiQj Ibr>_fsm-#k*]zLHN?uH՜-)ixʾ~*ƴ*v˧%ki2^)NoG¼<,^};9ZDE2j^{"♟SU͍v\ v.FV|ګY [1]Ca3L/?i"5 ,`)pϭؤ >:TkU/{R8c~.? ;3p.t11z  ,ܨR>W"ob<*~d}^q6\#(ךuTS41բ-e-BD%hKN \U,} ,6!oFgT)Gܳ[ҲnCR1ld?@:%vŽX(vk{Ez?g.,ofD\8?~  {}? fwK0V׏e52A$2WYb>ؙ%9289.^#N;]b%a.͝dF`p݊pcٻ0(d(:xP~5\wj'%2IY' %8ae}1 e 䭈]u0;g[!@7+/QX>ԂNKG:3 !Uuyq ^M_KՄs33lriؑjX˜<;i CCxP g-FxpOg7&6ء mWkN9FXw`Zb`ёU/5"m7Je`ɑd^iS_{uR`AeyfJU Æ' yx[櫚DHBƄ]ET1JJ,:^o躦Kλ˙puiXjr/[I&$qT|U |KWwr_HEPZTS̕4 8Gm;_.~n&`Q|UJUuw);%?R)vAf҃I>,B304@SOjB8B'@s 1z$wG%g모Me, lQeͥS'YG[fMWȖ8=+\>\6S?UT4?'JY_P`>St*GGJ&& -`4 g"m^N׎޷mLRA,5By0x Jh{g; u z.<\Cߋ&`_GXC?tY36M* :6;a?B~ nѿi̛QΊl upU_ wLEdCe7Q|An'~跙7]{O!ީ'f;%A|K$G2ܣש`1TU(i^T(RՀչx mR0v:%ۦĺC nO%9(:3 r5a^xJy#-^PTI~gY:vF޻A ɱ ΣD8d ~m 0ҙK;Q9{AZȟ nmU 6qTEȰc"W j/NQnٙ!lH8E8Hp̵MxՈlC{eE6Wb; ɻ$VŚ[KcV`$|hL6Abm|YO猞_(Cv$ASҟGzN\ƀ1q{a2_ç)!eɧl\jBP& d xu{𦖁~,; S5`';0a77R3+L5x˰co/}>C2J{I667\H@>0J"DKzbƍU)hZmrձ憛pɥ\|e=Au$5fAǯ* 7Ȓ;CJvEȉ[%I0?j*UCTqpJXy=hU W]:Tu=GZ@+88[ xl#pՉ7t:2% N&è-,%{ =B^j#~v):-ݑ=s XVڮvq,,')w [olK1e܅Mb]VGC Uͤ(C"!2lN`,zb̻i*E՟fMNy8r1 2"@#rC"HcI)B4Nm Q2-1 ]F㳾ǹtdɟBR]Ayw"r-%fQ[F {ml~Dܝ"x^ 5Ϸפopnԏ!WX, vLZM}YDdU5#V"(Nk,/lۿHƣLs٫OKZCvc<U@P|d3Kg=Gg;;W-9x+2WPs>M[dbUs;EPdr+PI &&)odg'z6oJy$}TkN@XOQx䎑R rE] 5jz^y)av !pʯv?0õI(DR iJq]D y)} xLt09].e؉}BůRpQJ1BJH33f2%z7p VJ([-s_5Cb`m3k\G>C8`Z<}cH$+ChC}tOW`@kڔ0Υ\K\qn3Ch漯gjЧno7زs95:E=bœ]SiBBP9xyfAВ~1=RTR9ّ"~[%3n%v.aeKe ±KMB/~ۣȎ>.̀F%T=GF|{.]U5XZA qh(eF {#SƛHi&=vIQ.XcSOlVy_:6T*T+n[ȊV%EO"n] 72U1_d`#DL>Ax#\L97 {W͓֒#9]F}dJ‘  g&8vq d *7OE  eǷ(G-m:2ё!]S^Px&VwU#,"u3,mB ]o .bAdĠ;^v|I=E$fo<=MzDUABNF*kN~AjU=a=WZp%1 s~F0`dIj5LQW;C %iT^ ш]N4$.#Rȣ3HMEѺ9|ODn%y$YN?4>Sϟ* /d %!ɕd,rޟ8$0Ej;c 78{黆EF+%FǾU` 1?KHn?TiNDUCj^nC)e߅7ooŻ `N Z`8Q;oBÊn#F[x 1 PzЅ;Tks\^hpפ[< ;K׭q謓>^]"傚'~ lŒr6喛 ]vؤQAERHn'4>۔nX<ʺǢmF"g}wҭ1Fz=aLΒa%=L{fѱD4McwpYav I+ĕQb EKr hk9T{SL60|/1?pGAbk˭ 4p^߄=lTQDi?s+hޙ m7+gXpFãaҨ9J :Ak75~DH9{()Zcb١Q/o -ܮ86{QglINLtlPTћt^MB;y#~#750nBB,WiaeQ\ji`O7*X)fRj;*ܶ]DpXZ1:>8Ga>%v9JhЩu U#"thP֬q"юG=nL`muDvL^LZ p.{.B9 zX=Tݖ0s? Gq3^ˏ̽lF_t DK]by>LikY1BŸ+]" b.K 噱ZGUʻˠ߼U{eJ;P`hRb :v k<("%$cRy7:N/ 5#FFtf.KѹK͈AޣT4>l<]kN'f>X`8Gjń)Ig] |dyt$ʇ|C4&p:sE V|s %i{ӖjX]n;QlIgxp+$e~%w\9C uX,EPpۆۋlc&{ uWE<Ɗd|kZ8MZFv΋?ԙAo_۶ PZ Q`r|d:R.ڔXEe:>yu9EH[O :4ϲ.Ig. x خmyjp7\5/Z̚n%y1Ʀx cVXLȌaέ {ﴴrOm 0kgV"\KdK$iN[_6J< x^{,>6(E~Ԯ2xMҠ-Cכ$ !?I3n܇NdYc'͖~n:<6 8FQ`r4Z":^?X0شY[j2[S"0pA%T0аƛ&8vJ0eekW7Tto47皠cQCE:Pï 8b}=vWp|A&v{;R NG+ d r\8DL$*mE,^s1`ktN+DbOA@ cC/|kQ"LE顓 -ȮM܊,bM:Kq p|]󹱥=w/< MpJȼ3϶~ql#;qWJރq̖~rRļx遂'/ØWEep,KMVvĒsH=ujͬ^6gfڢRvZ1 [l-mY!7F^3 !z—6݌~ɡHʧY%S}'ഠ/Wƞ:ʱ8-N 5O4GM ؉m(jy+p7!E ytvMx/0A9Xe;^Dh 6%xyv.?֫n\:s;9n w@+>im`8L(wTnm17Bz"d\zc5Ǽ@>| 5(LSKKmczwao9n'{Ff$2hdӘ  Qf"Uܰ? I0X$TgnDPx&C<ڔG JFlq|]=dhu8?.[3^ɱ|֙ |=f3N0ƫ47ѽ2 r\Er`mz”ƶygɕ\ӣ4U/]@ njtfIzIYV >Na`;K7"r3Mpo@*']JxP/nM[t0?] ^o)F܊ysl5Qד!nwsK막6ƠZʉKݬ6 USa b}X_ y. Jx],|>,E d 0D7{Cֱ QqeU|t9vyX߇LnbI=d'r_-9FV*.ڶ!+ yŶk-w˂ UR4Hq~CГ@TM=O{퍷V& `6E_?'בFfGmOs9Wǣ,wTTcnod{T R﫺t5B>O#ԈS[LnhPWrq : k 8<2a3D9W^_Ez=PT/'3\]Qy' g[Sef}!;6ET7"H< 01nbԿjz mPar]&2ꮛ;1ߟxM(%O*zR* $ef7t ZqI; ,!A+T=Όt>rz+r|Rb@ɖ]'R0 ddSL5DV}'.9SDE]7޸D4R7P);DUWvEץvΊKD>VѶXᳬr5)/a-XKw@.[g孍a+$Qw,WX*Jp>DlX9>1HfXg? OVt9;7WI[6#d&>| 4"G xnXLCcGF_.$&Ovsx,t{`YFRHqqһT4IhH壓aQGBC㨛}e(wsٟMA,W=wcTzs;>2ܿBigA{>4oz(MWR:TAڌ #TYzJgag9DcV${j~UbwK՛RKK钲꽮o޵U.E_SDf8ߏվFaǔRپ!»(Q:^[ UBrd阊(k$5gVjtޠ {^O Ī&t8)Vi*K @=W|,ڋ0!b"ow0Us:_q(TĶM2hD,hKg[`ul.Ixq2;eD$FEL+p~ QԹ3hb7e=:ahBbWm<Wstf 5%rLޝWb2v$S'xh3lK|!^ Tf{mlfY{V29RP\Mp#Q6F߮sUBFTɶVHʼ)?!f,\"xwǾ_IPzV1WHiDM^ުo<[dNTΣ$qʇBkrvVƑ=%$c(=C2Fmw8 I$,#mWI<3lA|!H|A,OkH}cxbޣOva#]^N: yM]H)=":}K眠0Z`̌/4Hco;>!V}K)GR>\g!a˭ix:ʲ#OIgf#*}xOQx6XfJEYNkra'}Jё,ОD%1^)4#v$E.ԥހE[<FJ?Rs0ZU?gO/W a~wGmvs4m?ηFq:–bMsO*k,t;vmր6ٯΎпa\'M<~1rBSV9Vڍ"o$nq?$~*,嵎M;pjIHRu+Fej!YM lRD.Uyo%:ٯ,ng3>儺f2 v{!ƄYltLpI2:9½i4E ^r/^ ­}MfkDl~[WvzT>業aŝA^aqAGwo},ħxD,ϺbL(Ы`֍'.ԓG/֕c[QqǍ(*3 sߟ;۲'k84N_:=m9`'H2Z (MlOs~. uC#O<:"1:iyCϳV& S"8{@ (ڬSħ5ź@Z_I倍:BRC/c1N~vYsm)oc(z#$K .GҚ SRekF Tiu"#o_әgX $X~ xQC#-{//Ձ·p;ۣV҇26씧gkhWB~yIB,b]`4nEOQnEvie%W3` ]L#_ .G?x]$1v^>;AX Hd%wK*z0m͝²qnexS?ma3xrP1+ z/ 26ڜ47lv=- (G#"Djb {hs_档Ī-Be3j64P$#_)gd K+"'BFJ1^lS0Xִ hBضvITd;zM8(S( |르<9-( 5_K:ο[ 7o<vͦzAt;%Ϟ]vf"Zmߞ8sEGW 8kH7tA 6zv؅xh>дKQ`a k' a=돠kc'fYkz?8:5\%}BӋ)„,aߖO9*]=aK'p2sjWrfNϥ}CskZ4JRՀ{-6FQ4`|SfALc觙3[#(ͳTi+hόo2c# pb3e5UF8W.NY:EL@=Fu~$F(/ $J drb:[A aGkuYMq&ʁCI *ɖ+[a>xXr+{j9B8Xa]AaBMfR#gˇ? ;7c As7K=EU <"88̤_>Ԫ:[HKT~q++9"f%~ϡG 'jQyY|ͦBGW$&MF3} ty!мĤH˺>-CĥFSkիh=.n*]'Cu&JѷC*Ǯ1*4}DD{{ҙGd׋rM^g:c{[L,Hs%#ێN}G8f4# [5`am!iIt;noDDcU2]r/ҲhiqW"j٠eŸ!>K i%,P=@uoi,tԒPȀ9^Y2q ,EYQ2E]DZ+գ.'J'.wOcW[_pDb>mĐs5m ^Ye)dsMDB*@>{מZO$$` $t?Yi?#C5x[yegn;AD4ezadu|sH=)'xh~ro= J4?.eӜ|U`4Ƭu1%з %c(!9 PohUdbxH_u_wK&B:)fhlg~ϚIWv̛T>cGȏ\ml\yídBl;[s% Lx6ᢹƌwtZZ@GDKC7oglBo6`)ƢQ4_Qvgf޻J\wMS#z2^!**RkŠө(&Ve,ޞ"m]Xj v~Q!>HxMɪ fL$.]-.TF_p\HuAW#8%9벝;`"bPpy{x'o_whW&f_jwhB+{ެpN'X欦7cGFZe Sb9yL[04hYtqS 2;_м) b0-^$ g1;[ %J&#ذ{au#JENtkC򹦘f3QiYΑ$,Fn|zqh]D c^@Gpfu1)[(#{SfI,#vnրG gxx?.Q4j# :{0{A4U$ : 1l<2qܕ9ؔ/ndnUdv܀N3ΏܴP(^EK{ wؽ )){PV= "]47Y_őgM{^ )ҏ+S:?T#M%QɝEM X`6p_/QngRdS38MόXG~ZKZHKVcAM{y[ 洰Z3uGlF-yw8OFۄ{YTV"NV=}3 cf _\iҺXLA-TR^%djLp&FcWU{[O8 sc} -;Iޖ<a _Tݵ#ss^hEOSԚ`9iЭar<^$m7H,lu?(?vф}捬P32X 1~'K`jZĚ?!w"Ag}V'.,"[8̋aU!VN5dU AWV$m'tC(gؖ<(tl1)Z?bZy4J4ڒ}y Lkey\Jάz2G}h)=weE6~#:8z.ߵ:&OG'5k:ߌ܎e,Uk:.|1x6)ʴ`0/IDLz2M1-+  )\b\p36DͰ|jPgUSUC t~-oghk)XYSar1-W[ZGlB %7jnMu,$L>G”Z<?X.pڶl-z'ln.O%q Y~`{ $_~4"B*0WހGS2< F$ReEX* Udxy uk,~f>XzRs`K$[oAwyN>ږ/"9@'4)ehc:6M$_c rWS܈ Ԧ]CB$M|#Y@2ˮ>}5"@;en2 2U( ːO*E}14{:s{\ =cQ-}xyV|L͉iBBO_7,{!7zam `1 P7[u;Nf NB~ %EqGUf>xX)独icwZ*I!K2~Q KWBf2/\ԯyh!Rf}D *[M M2urhzs^,7^%r^A7ɸXa`6akZ$NJQj JEXAP8|f E&ѴS;T ǚ.In Dcl,-yh8ۨ%W@H#Q2] 2 U7ms:%ǟ^"qL˿ s2i[ C5gwؔ7ZLD%yy~ix6\?P$Ձ/S}Z6W#|c.N` fLv6U(IV/7<\—M-_&9m X/*OiM;6Z*.OA9|^2>VXh h}8UlʈgX8SCܽ6}^#ļKvpnDbՒDL40@uhm qm?fiH0YqVlvU,gS+OU8oakLrzx 쪟ǻOͲFn8P?ɢg) ~PYd8k4zec#pzPßdXeqؒW9%/meQRwGdH$B2eH TH>;@ċ?wgGt( /*~ '^C}jiݍy@ $V V/>'@ՌmlDӇkBCǟ>2IZP侫ADclP3$.:@tyT2X6P++wWqvq*_̅ѽEB=(Bڼ>R gn}@M&|ayǗc{7q#/0vqDvzJwIĿ40J\pz bl%Z|~Id 8ԚN_K?0#nק z?&1gC4?'baOw\Hp뭲DQ^%]T)Oo0e>:tW2wGQ ܐ;o1^ZR!YUII]UKL01A+訾!(^An:j[&lv.RU.,O*LW.".QdIkg𖛠ڍkrk;<ŊwT+S0:aq`.Kgg}PKWjh8KG6=3t~t+Pp{Kb }+d2apƍ-CjKئ֥ kpd6=4ɠe+R^Ɲz2]o xΈ{eU7LTҔ4Zo /tF(*@u$%0N^Qsyw5Ci^_M!0)]%wR~4jV:fGXϻtC?LaQW[6MX !!qcp04V:il9 zn$}T+G P'bUQ/ung.Ln6?YF P|J 24]~hX93ͣ(g  ".VKf,.IDIW'ق0;4|6 ~fuv0L tRzOGB;C %+P󃀖c"CJ,iuei QKQ2keՖ0sDdbt|PEB,yvkEA XK1JݳTv;P#3J@` IkĮV0̼y`aewebnjzp9]߬5ǵcIvZ>+* e| XOj7be|8E (Л-޷&r:U=*4j}a;`Hy$S.W O?AFd:bu<٣@qEN.kʔeEI4 >*fbss#4Gl2;/jFUa04m= vΐh/Ik,$b`cUs R 8a{VSOy2T}P|G P=Ƞ@z4up@qFcxt|ˢ!T$y{b~(Pٙ3Wy%#\Y-nt":8W&SKj 9^w_ɲkZ(tD#Gpy]a%UD)?@[7Y;OO(?9C$!זv*]&@bb@x_D"7-|=dɆE BPnjJi2Kp}G"a(e^>7 Clqm$ ;ӇDwDlBgA[mG~dD6eLwiA۲V:[*` QݵL_(:CD`&B]wm=g."// KMVK#Xϧ2X̍@<;X`@ r eN=ľ^0BGXD|2ffkTUM b\$%W0@2=rT-L]fx6Ak3S%3wT%I!8vqzu5veE! eᦌeu,PUVEK׭iF[UQȫ$X|3% o(g'Ђ bzВpYW%x#( `FU5g Lfb>FIaOF@8@,!.i\E'Hv.؂Jq]S!Dm,^weVP^;+%,IlUN|q13,d_"3z1Մ .ga||'H{+ǙѤ̆Xr]s2X|}@L|gϘrU 4] fR,ܓmb)+:Xt\O%쎹7 ElFINy#R@)&luSsm+VAV"C:}ء am:Hոf_& .ZTE4uIyż\qҨz,2oL}ME<3ѻXn<@nש; `=)Ϟ7:y|;{)[9rr1($Z?SHgw 9a~6HBߢ:Y* }wNg!.1N:4XN.RR~(#F.PyFa *ʲ[j ht)8{9ʚ\fݿ @b5xfC*Z<LfVO[:9;q-&k 7k'jdV^DzԖ34lMq鎬Wd2(\*8[$".- ]|5ۇ140ȟ:W0ZϿr֘Z= FU9,`~xRhr])1ޱg6?YAx߾4U6˯mRs:#Hl-">{Q YwoUSW4z'u,]e"B{^ɨ0KANp7~ E7Z`e`e\(pMI@"I14 -ݩ-5bj#=+2s6AwR}!7Jk562]lnu,BlXՑX6b8˼k V ۤBrժPIڇZ)(G {Pr0A ;u_ŐroZ^&؊=ud~jMCS6udTH?&0Ti7HAf%C'Vnwٗwv1E:Y=:r2oURZf&@ mAеÂA"e(&{,YWUT67AJ<,'x 6BA5FWgp?29 zms9y_ȃx3jfDAgнl؄v3F7kU :䨟nP8MQtm+rfaŲՠL-l?xڎYt b6HFzN*!  5c%p/QUSӽ㜔ZKʭAmC3ưο YvW ֨Qm'hCGk%%,R[GbU. "4أ72; h˘Y]#Viט1:x8PuޡG .V 5.:ԖzΌ7!q{I CU:N }K/?(ZpQ7:"pޚӲ..H-~p$gWvSlk![I%UĆHҭX{GJDՒbdIHۀm J족f}1QkQBōqأW$XΙX+$'. .#tq=jiJ^)쫸3ǝAEGcIɛ0a?.xwʧiO^c", uZ˛9D :Kw"sfqJ4pNܩ9=FH L8UM̻Z74%vş[/BC>:}vl$LtN<}FhJ֦X`P˕O 3Z>E2f2Y˥f¢6LKx? xR=JYYZxROѣ<y_m:நoQ؎ƏJ'r3܉R*摙6} < >kq #:X~F6)M CmNh3T +TV| Ch$dzX TD%B/s2v6q]t {k @1cL_O;xynsW~(rZbĤ;&5uAィ[eʲZ=뢗aĕreEۀXü\J}CekbɴڢX=P1{2޳Xb '9A߉c?4ؑgR6Ohخ? +Jz4qofn&/Y:ޓ HΑ|ə=LiK4r@x [ x;~&ŗf9Nl@i)(k" q({ѠihT'*zՕɯXvD{,>ڕy)?bSuJANշ+ư5VEziHg*dg=݃7VO,A4ISo~Y+p1422j4?%5|}Gq7LZX7E`YA%+C ,e<90`L |`^;qלG5;:*/09B^N/Z된mUZfv~k=㥐v}![ÿ= -d2U»DW*Ƞ ܄ُ8/1'{+S@'ZWhHy͙K_UmGYjv-{BRoVj ;vnj_iQM(a OZ\,ab;fv_>K7ȗ_S=d;ܨCC'ʒ 4?t9X 9^9Rob!ó0v͒By}]t43q Ǘ&X~52ٞ W]"Io.N΀+V|NL4IXߎ;9N+.+_* *@%laǔK%MC5P.la!NX.o>L Rbr*2K~ A:S#wTR]Ӽ15e-^~ky1uk/Z(K=.8^JR>uͼp'ƈZ6Ӫ,L8bdB#;njߞ\J7+A |O;\J=q#K6nz=\ZYP*Gʷ<мXsT9 fm0%|ǹh Cdmu5:A4efPTBTMBPykME4[ \8ohN!moF! (pfF j}oqB2ʌy <ħwxod5H2jp%HD9o@=LFݮ-TS[gݠ@.Oo,>:4^?+,TX='K[F_Y1%(|r902Qf}/£̴Sۿ^c8IMG"t Z|/TDn)ۆI!㐐ܤ4MO~)i9#Q%wx-\hl?KԊuDtڛCNEzZ{#"B?zЧE<BvF>M ȫiux+rML>A 8fR nh.jwmp?'D4 a!~Tj!!Nz*dIԽ`Tn)p`k^/ @5G"Pu5]MFwm+Y&9y MEGXMS<],iǐa.C` 2 ևJ?fwԃMl9|u+]X8X.a(a__CF$%TQjn}aVW-%"3GEfՖjNq<`G-50 6;j-:%}~KaCh]<([dR AL"Xqխ=nEu.(enq >?CF.i9 ]kr:>fůuM9Y1t؛uh*POIЮ2Q #SaYU2)nhv0ͳ.N^㮬6+Nߞ~e?Tmr*ZWTZv%v Ue>ԅVNl"eRrʙ4_Ƙx2g]}&J0Rh]V򞥼! 6EWz)>ˆHB e;fgXk+ˢguς#/!1Egaц"zs{L-O@~6&.ԁ\=_7 _\4pQZD C# f W(ޡB VқzoL%lqXZEMPzj:$/6oM4iRK2r ;cVFjt(TV]%0EwJ!!@q=jUqhۆwSkMLp,PW">O7@!Kӎ PG@<{l_JrSvZAغ yWUÔk驪]B adt3f:) wm殻9KU %bYWA (xFNQdHʘeNB51o\_6"@PkvgFe)i6*̛XLt*@r~d# X]c*8*(N_Uw[Bj'7ou+2݇'b_nPoq>5D*e@2$[yHH1(Mo3^P<:,^p(Mﶿ,vwb+olr '(+!n:8o٪m>>47rv~[-vȜ$I0p /l1]܍YcAX㧂̿SZ2 j_͵QxrIx,.XHUmM:I0uQtY ߜv +wXϏ-?%!5CHol+,XCk 8R&йGjRDQBNu|$?"wҸB?zőzoA yD#ؒ4U8u69 Q-ɄrD!#A$eb{#\YE\|QpFdɼ!*#.4ihBrb2r@2#Fpr/qrNUDLj:XL^dlDj0H,[0\ ?"26IBZdQ8b0DO7ڂkvچ*;8Z8ryx(6<4VnK"x {U q~IEzWt6@e1{&-gU 痊V*ST|.ň7vdZH>[AjhI'Դ=O{ FsPMS6֣DxwDs`$K= ׻i4r1KO%tf}.?s1ۃ"ɇ- f0 'Mf0uل<*0CBϏu\(dyՒʈFWzCcq \*L꿋%j ;u\K lZǶ?*E{Wh<,≼v1f`.〝$zd_ sck3_V9bs'#X~n-P}0$?Оc?~r@C֝j.=t^c}BRq9~ƞxgMmoKElt([TY>$wS[GR:p Fx!k 'wTe;^}b8:IװVA$|D~x:*if+ | y#>^9*̙FՋSPb@Pg@ԼݓTwoAyTEZTHdWB *A^_͓K"tݔp*,MeF4М⳼֩9k5?tY+Z}aکؐLN†H!Hq9)/ Antr lų^?&aR=N5{CeCyAdeY1 PkNPƍ.6ǂ{tC='@L7PHDEud(O}GI#.D"X5_TOE5e 3l?Y ױ\ǣ2{egNO9E2@BடՂHZI܎meV垁muj[ӣi?QMt%:\TsBHՋ҆9c EzUv,hs+›%G?M*mY9S`# 0*Z)_ʉhqEa˰ fAT7R-ey0ٟ=*qu |(JT7ě\&nfxMWJ"P: z-`9H+ *45zC  mJi"⇩~2y6 qI%U̧P\B`j-C;]je,,qR#sJyYga]=,e5(u^71$g9BDu*F8.]VwXHJ0W |CNZkI0Ug n PShDQ8&xW3 Z.IcNN+DoV0o`. 2n׻a@+w1#zJS)bg|Yb9e9+8ee`[-DQK @r:,}"X56DWwa̴r?&w ;;۝X^;sθ2pVN΂!K XkWc,7Je4;4<:z=A vz9д)M 1KX'*mJHC*OCa@iI{@ Rrm.a#t3u M 4ƈ7" 7j2:}:d5>p7/6kDkb2NJw2}LCw>_W{!ES;VY`S{یn!M!6>  "7{&:ód͎-_lSb{Ț^Lt|/g'@9RAׅmB#zcoB_| twc)"RX">D%z?M5˂rw xmEqhJ̬Ed%_Ap5XAO)ZG}Zd;w\bU-'2^©2;ùZ 罿ЧԮ㲧 dv"'S綎h:L^8""<"`fYEnje g,Njtte:c/! ԧ ~-6쌓"If/QPDvB ]m5$xx AJ6}5hL4kʳ껷ce kjJ'3[%J&oL}ߓ)w'+2*V1-C;ܭzOalc#υ{N#=ebހoMn%ȫPhHXYQ㉠< xR>Y%qPZ2m,K902f1CP& C#Z˗/̐ªhMًb]OGflÛ LTs2r=_t57ijhCX^Sx +O uY<्=7_v7 )D~6f4$4 EVI][=چbs5v/YdS{zvmUp,?z!Hg7k7bTqz̯*x?~Uwc]35JA췕ES|c(y;qY;*ӳu{똯_'FE "%M/j2v?-30%EG<g'IJU˾G= kǺB,@}pG=N-k<9f\=#`^gZP(3w{& I1 ޿3yc'Wj.0/ܨؿV,U [<`yiTrX$L+LZȯ[LFDFD̟S\ēɥ>H!87#x$Q fgiޢog(:笴p58rp@^ۈ-Gq<;lhNO ,f[HbiI᧧x Д u[u9"Iq!1Xǰ~bx &AQ"Bc&݀NKGhҕAΨH]L&xwpm`bHSR5Rv/OpJxG^_]Ғoڌ{PU^h{`pBx v3P,2 -鑫eBtxvK9#6`䉅!b/uz9v^.|aZa_OB+I>= aUsIT\__w,?9o9<(-tUQ,3mi71>5d('.4nZit/#xu|Ղt#y8\^x7=ޛ"ulF@_=zo*Li'lǿ6LS#%c;&:;2hwKs7L*̀[P&]Fќo_+zHSJ6k&QWU,bpr6N/?\T~Ϸ427ptIl`h$[rCd)(#@@(_9NxcJMJf(fzaVmj-ǽ?Α}fPum~r 4fB/BH+e}ޱ!/PM 6} uv/NvQ+I]aD)N0 %N+,\r` &TՔ'&Oϧ|21pvaOcNq\؊W~ϛJt{mrR.kuQkgyD= cE;j_iԣ5"@x.u>aq\-}҄t*C =L,B_ldxQE#I̪]|'5:{NA9Lu,(yvanӛ\fӳ7/"X穋MyDvvx2,Z]]_ǼKkN->h+M|BEb:TRaicnΎH>ʑ8jv(OF)d.P>wyXG݉D;;IeYmL7 g ԟښkٗcYR,ֲӉj4狕-DQ,j ZhUfug"bkuoW3c4k3ie񣸣;M,6W(lm4Nyرn Adzشcogh{0Q.13azp6}o<Ԅpd"O;w ?dFFfY|d=y_%Na鷙ݐ?-SYEE6£z< (oV"xG-]bg3^g>X\Fa$ ߅9Ya;K] -R+4U_0`=]-5Tr,Kr>>REv1}]ܖ^Aʻ,jWs4,vY,Ķ싿cza1U~Jmxf:Hj( ;͗ENXGf͢^boo og{FX7Bz,qU]H,mG/vAHþ!q;Cv 9Way#v)+ zgaU#.=ru_w^ 6wK:@N:bzj7G;r(q.yX{m]Os'n`JwHXs6&iͷ! 2 3-#,-Xm;}.[ %wv1AK@Df*IL2ir3/ka ۂ2Չùmh K ccvKr1-~x&`~ԝwJZT^}FfӘ1U5[E.љ3LBy02O[\ۥd-xŢnh&2OE ~57 K> @O4){`|[XǴ 8䀈3Ut>We~P9.Qe&1Xk ;̷ ңszP`$ Uy^^zd|ڌ WT[7ɜsfZH&#eσ;=^YS.NO~]"Іw g^ҭT\k;PpG >'Fv]:n:m@R}E,G~$L=V yHH I( *ҭr8Bf՚>GɊfᚰύl)Z`CC{2S~D&,ˍn@p5QNcH.J9P Q8| ,H-KSXddMP׾3fbxF%ru Ãh{v8:RkZ5;;p`d'zƾ`Ql%S~?~[r ܣf,}pEʳAHWsѼyakBw@8['}iu.'MG7;NK1\QOJT;YWuP/ڧ#v~Yf$mP̏Wz^rBWIw$3٬wv#eqԕ`|hA/op t7#IR%N o!6>IK|Ķ#$S@v %c$d~ X/`DfiSo!ɠfmHcնiBɻpF1'SKVj*+SOv ~m-1HgulFMsݗWBb9~I쓖ܩ#\DY78@Af\:.='Y9k2`bّ=B_?VB77oLdzD!S(8\F @!ږK'eO/kx8YXZ $߬ƌʽZ%ʭ,Ǟ3 N2բ쐠h0` >+9Ndw H\jteWPDI8jf碫wy2^rS-~,b%I5]ż7>2?˥ZZJϢ3MZtE@@PFpVHuu ciOBD]N/9*Dh"_ٝ4 tW2fzRSY5^RlAUoj$kLc.U=Ku-(H^xEVxHWyCqgiiv+Puһv]Y4^4Emጨ)_aO/2.s?cEUcTh \nrHAg/π岒.VR}čIxx"tD.|PVWP%[ ňosp/8FEÈ%5UQØC+)@=U5ow 5BmΰZIk3ZJ``B?v󡽷(p~Oe4ڊxmv Q3K{.`cNh O8b6&6Z;|946QYznS,̓3fC^~CDtQGOۑ6 &|Cݻ@C y:!)6C)Y6DsQkJ|RPf\?~Xr9H;.r=u,?[WV6K&-ޜ>X(F N=|$Vy${ŏߚ箇Z4 lb-NGTTAYP[x>O̶Vvƚdi<˴`!xsiDg[!2$i쐣ka e|"d+wo/c[9Sïq\J[GdJ1x7-5j؊nZ'@\lÜld5}>}g*i˰B5O~8 7p>>hIu?~,(E ^^9CID@/׽sT+C9$]A#3uFwc|hd"Jq @tʱuh.ZE'LwsT#O6׈f̔`f"m+YYAI5#_o $l愐WB|ʦ^mf5;^D=΍JJ?Tgʆ aaFڨ`@5;`ѪB_&*vf᷑=9oYĎL H("X7ntG/i=CW=Po`4OvLxGS~d,D4ђ/sW͜0`Lm/OP;B׻Β{xnϝi֑[|^#1` <U`e?60,dOXp%Fړ";4Н _NeKFb>}嫘&gb=vZo#vv)xlOtBtՎD:(P{.=ma5 ,=AuMm /}nGc36d>:/7pza%q\r{.<ѐ'@Xd]ypIf6D.L#Y|ӟo)ˇ"3du /\En!lckM>F+&~lHom$IO˴RI~z1+ml jiDCnM]x|%:sZ)s6 %|E.~GŏO:8 I{Ʀaګ&璶7ރ@?Ĕ 2+o\~EvҤ}֝: N%⿽"(]|\bdhKO$?@hƼ=~a!ڍ-J$ZLH#(Ӻڹĵ^ h^ʂ~eFڔN9ki[t(N/ M ÷j/;('D~G#9/vCbi'.MU_u6wp(25fƺ炒,.3T\$ݎW,IC|a26yR9xvoͰ_h.QuyF<Ύ-Hum9K<]L!8v8q]o3)l_" ƌ{:|C&WD^hGYT~FKgYz'ޏYދm>O.9KQ=8@!gT ޱ+f4idۘ.iqBtUTxN=S;2S$|;r~vFeWgjώ/9E?(8n,ۭGOm3i؜%~dUcO}uVɆ[2#Iy okiL 5~27Ɨ[R^[D%z#p0$ %8%)@XCOZrrp+?_𗗪9y5sxdzw_=\8]:R*K ._6\oC|땧j3wX,vuЪ]m DZ!0YH[>"1)l%i\6u+'N*q d0hV%9Qxv2u̶2ރ^Tۓ) |52%_8!$hzvxI){٤Oi}M'%.k~bpKJ"W.,:͂ \KBQhoun>S{@6SP@jT} GxݽEڮBe=Ĕ&+\4GvI켜 ٯ|ꟶ`6Z\5tپM*~澂Na@I.Cϵ+ᯥ=I32?Ւi#:^dNgMwvx9e#]D>m|>4*'4.-o^IDꖔ^Q8hesTk?doKSu3XGZ:?!ƓEn҂sBpv1Q@5Iطœ?)]fY!Κ7W٤RS͘4*AX~9>{HH+ޗL eW<k6m &{™\MZ:N\ZPm98qK b/fք4qUdj}8~֣14}+k ;sX EFϝH.PUDqF2E83KB,Lh*nP#t>N5G?G_br@w(;4oI$t0SiI#?f6Nu"{(/#h;/׾'Tw xSs16M:.[T3ϯM JBA@Yb'fQKb}}>Ҷ?r'TG4}ҢaŐ_uu fk'ݦ3Qw6 àQޏ KRjM/h]/oX.09 mEd&jm(M#]e7y Qjhġ}59j,BWzy=nŠD]|j{siZ&@qkW>H-p) F{+Εz5_nBLO:[?I*Ȩ $Jdy/T9*CES&(uUu.Jh >;ZM<1ZH姤_BRc䇹2~A.fr[e ّ^XXȮBoh" uE4~Mz>=6ĘlW Dfܻ1ՖVS7a Slݏ3w֋/Al\h6NTlN.^Z\qײ.Zq<4xQĭ^'mVyQ-d銭1C|8tcQf@DŸ&tD9 |n\6sBakh2 -CALj"Sw"XGDL"4OJ׸>)Bi2G<+JXB)=,/ZAkxlzXpŒ[x-VcƤ԰{yr\1S(dY؟[tp©S/ ^񻦴OSKs# w[A 75v z%]*0JJ؄bY洓/>NeQ&vp;h_>b{J0>L0;iOF4D-rXIl#|$T36[wF(}?@s4^xg7dkll ǩ(xbmߌƓ)]С &5*lx=f3lGj,`x;DWA o(6^@?0 Yie3&-J96Z L^^J3#7Pc$0}6 ,SGd)0Fg6b">#Պ(ZsxC'!FXUCX |E؅ܩ|i9Xx ' O(2g]2]Q ;?c28U~\F}V,UI1? I x΃jeD#<2L8g3F)rr 'tŸX3xpՌjv/2pP#*:-_ *,RZQ* "_HyH TnpBz6}:}.Zxe ~<{CǸEUK/)}X"(a܏\5gl8!+(3;ΞCApuN.1:*n]>u Zv0z㐬f7 Cwe'@n϶ή7J`$4Ď=ɈS_07Z62}3;=L>ǝ,Yg4x1o-WhOL%vK{ΓYBw׎'k ,RMپ.E0٨JD]}ڠ>4OA0z1-](!:dWP8mvZ|aGE\_.S}`m Ց"K-G4-Af1/Dq|B7 P^} 905U򫫞 }F=)CBp!W7Iinϛ񜺇 > .n/:x/b\RVGxLkbfFY Cwݑ R P`jF9^#T]7a'{8- >o|YgQ#JpTݬT4/L!}|.Djm S }໻x_zDc/Nqyo^[w< Á&ϴMLǁUkYDGBR+ݡ)b+hk?|7l3ZN p>aG|z d,aI)bT i#i׋hh;lҢ .] =!UF4eQfdQ7T|8셌DH\SNL8a͔"(TT}_0WFݾjJ$Uj Nry{L(QqnD"ۙcɮ*W} ]}Z_B۴e 5x 1?D\\PuUfN @HuӤ5up$0;aqOBU$:Xɉ*1'lXB-j˪ [AH[ɗܦ\"~qtOxK-٤hgs?z% kK(Y;Cx'@QvQt('@zJ1,uJgfpc˽o7vxhF}F /Iyr d!ECS#s`"݇P!  zhD 4 QƝ MT֒{Y̖X!t)D{?t98A Agـ~ H}w@K'PՋ+fcč8.vf0&JAdU|2d1=:Պ2`9H]PvӴ?3%똳s"A-*3}'@A3VھcH bm%6pI#fj8- 8:+ ?G=ecIm$GccleA]'sQN]kpzl![dP6 ܰV?A9h,ƽI[IlGΜv۷u@z`$ASb5&u.yxAU^uq04\jbѶԧC?ԫ$v>hgk_r0BnLEe:d;$ \&pT*L\R&+KVOKtAݾiAoNC~i)ɥN۹NeepoRDR5N19]K'?;2,w]Qv݄4_[4$A|#SAg}s}ѧ . ke݉;]1e~l$|Np[4" p3ctD鴈 A/xtuL(XI-\"rFOʼn{XM~ L0RSz] qrBTP#NMٽE#nۃZacB bn%.9>&k־-,MoCUkUƊWvXN5 `:s'KP+:8'';{QҍRK&nǠzJ)۬6|%_}P簭{>fDY˼ hNhƇV 0|vb~^W~uAD4]/F %‡:nfsM#˚B'~[X3#z.'f̚-AEǜ0n+J&?ّtb-Sj"Ǻk+vs}?xg=j jҢoFyqQbۧe R言/θ_Qw*;0E΍4cMvL< r{'sLDXpJЫ8Bb,MB\[ :͓N_nסy{I OAnH"QbLqzʭmTL M!aghWVt X6#Ź-X:~ /x5e|ш:S%vnnNN@uTA" kj ynٯ:0ί~oI ݷQCr -zU{!$ŷAΘuqrs}V5q졋<j;jF~9r.GBGt.695#7XB_2$zՑXbo<'2 !;#W9gz_lszVÃ\V`Em߇:_3=EW!1Q8A {dP|!p /;P`F9<7 4fsm5@gr/\e俚lea_E} lNӱPʗ7eDz|iT_1@ ~[;r䌗Ψ+?TxL`LBc[}c/(iڧ@@ F+AK% OU]J0&11% V O6xܟ)eNw= |Տ+V|1_>- =LxPQG4T"S+`~?” ӜʍfƠ_/ Ԓn0B!<.!ea }MF'@^ٹ%YMSo,@9%"mL<=gHaO(q0,uf.)[x_I֤h9aŭ~GFDCj8}-MqC}|{SXϯn\-ѓ{yj)|cdyW_rEYϽ=`<싏L6C9S}[.[$]p%]j*I"~c gz-\9mf_ yārF9X1HzOObM[^g52& ,/%v*ڜ=6<;\KIlXjdAg62 ;:'JYХ}vVT{)7>K@\q7Z>s~e{7'wr6{V H!Nc;ކXq';xf*/ IM\h;ЎE!=^ktp(i[qVejҏ<RښQŃ0Φ,(AF\=zM8;Gmrb#Sd5IE:e-w[!6|R(LlXY~/y~GxMeQw[^?m1(LJ $ puaa&3sș8,9=ƊW22:[|_:iRxNcp-5IzU7\BxVϼG+\Қ9y|A44=t/:L:hW")`k386@U͌ Gtm=2ݵOz5AƲR!(sye>(q~yh &.jJ>c0 nޢA?!%W㉊چPqHZ!2F #~qx4bNiZzC$=ɠ e]C Tm]|z8s̔Bx*?! )DtOZ5?rP;kROF'aih-Hzؙ O\n%q3p ђ];|M`,VaJ/( իvvʼn@b0 ܋S /p8i?srA@s%"~__6ZaRF&qrhPPoWH@ӵqcƤC>e2|I7RRd{/Xa^>],y(t ծ*8xk-b,FҦ(T3cgƈW9z8+BY|+rڤoIN2f>-z"1u8X85-yZl*~9+CּIYdIWkQ@\=4l c`I_\pp 4A*bw6P}U(ŠRt08^6Je4_ hBk ^"f3z&v3 {jmXRU[[rYuc?\RPܖ; L `G27sdb~'t:pm&x^[J~XM\? "@@xM/W0WK\_6۟Uweb6X#cNR3tsS> X_M{_T 0HJ{s! sQK6B֔1: v+?Rɓw}cp0/r&~@0G(R  gw ?A @!$$CTK,'I; Ld I$2" # HI ~`BC !C$@RI),$EY"|TUK$RH$[R$$" b!IL*#fnEs#0)Brͮ84@3Ous.X}I$! q`H$?A$@ QzBHRbI (*!$ !$iB$%!X[Ew@c Pc1@TT04@Hb1|nIvīp"ȐCl7'E3"זL.`,$ @Ir Cq$M$P R@&! !I_*ݬ$*@PPQڂI"$,]QC)cfgW Ne٤D<9fĻXFw㓆ʗgum()|NC $@I$qHBVB $݁YBԄ$zTX.Օ*IF,Ģ"l¢frs)ؼm;l3![-d,0F}Newo8m 9m+g3a$c$a Ł$NBHH~ $IP T*c&va^ d82ll[Hf Đ! 7X+<ݤvͤZqiFܰ RceD^sy5@BHHC! &B,fcӒM%$\ @@u^Y:mqKFu=1J&+("ù[7!$0$vI ? ْ ]-E+90Ÿ͓JC˂Jc%" s0#hntiaCJ1( HDT٩$!taAd? PMf*XL`٪-$p$`DuRNo[lyH,em$Z)-ku찅vt%ig-p̫Sn^!! <@Ą6!,ZkATVɓ̥U6p28D:ps7rn뗒؇"Å&B*$\IAzB )NC0!X(yMND906FbifH3 =Q;KYq{#@D[—<}~ $d$,9$I$MZsd1Y*y&XOfV K%Y)Ӳy\!bMI4l Xڶcc/~H2!jLʭ$++ԖIZZw bBZJal,۰XlPA~uI܊m% }Z Z>Na$I'4!{HsJ$PВIN{H32W%cT! Q&&0BlH x8D>k|ehkqkF8F$R.W.\nZ`w[;Ї$$滑<,1 >3:Ѭ N"6CLudQIH(a&y2{"ӧnYjJ-U˞6UcZ5Cbܚ@i(|:R}7u$?0^Ą9I i$V,HVA-D<3Œsv%V%2Jv[6wiP+*$HN c*PY*j1D*VVKµ̒aFe @9krTngigb_~ry E"++ Y,h. aiq%1ƹ|`D(4,_$Za fS[6+Ԝr'/H8ӎ^is< frM`i%B,&X$T $2&F0$a"k+:Wv^%W0lvuy]PXʘKLՆFy>_-;$Z+d͘QDQX82E`,PANrf< EXEXPumtV;gU8#e˻o.A;R'uxCmy22J TRQH&X6CXPrHNS&)̈́˿.AyrˌX6gtUpp FF : k܉؅eC7cn>m>މ'6Ctf:b"@*+iEf1(AbGV#[:km&( !d%fSV0-\}4Z{5ߦt"1 R)&0S2J'DP dm"㉌=[ݫ*MLS}]nYbdcu51%QZt"|OɶP"b*)]Մ d\* ̤;.aII%*mLdY޴#%#mBC)IegvS[eUm9a[[,=֦~yKssHRG) D2T$Ij䔁 )AݷSI-&D gηfGl26uIapq*rZZsuů.i= ;q{}">}?0.TE',+$R Bkc ,R >2ʰᚴb&GRi "R0Д"X|klao;QljPWD+qd@I$b'sڰ $!X%=sv (l-pW"v#KGeb!{~ O_2TJ" JbĒT&5NtZUz4# E켻Ik+y6UX{i {_:0igT1 C-YU3*cfJn†l)4DAbkN0.Y^Zfϕ͈0 BJdLJ frf5"kmL-n˝.5ɷlfN*tMjXQaA>o۶"d2rJ$v,43N0dB)mղKYtI`- u76YӜn]AM&js+f|ϫ?[0EɲB,Ax% R U 1eb8t$W6ݶ pn;)N&Ya-K8+mdg}k*uv̀ixϨ9y@F'&)˖a(BLjmS#ݍ찢XFi&\B"+u˙ߎ m0PLڱ}gߡnw9Xk&Xl 3i ,P(FҐ9؁[N"l\]m" -B\ZD,weX @wrsdEEEݑB*PŴ*ay+[KQ7E]2ӏ!:)c L#eLJ[7hĜ ɓICg8 b!Y¦b就aNL:2am[hA XbgUm\#ձc G~~k.II*hVIH(&" QA[F l~FP-Jb, +7l٧!Qa h+m#PYؑq#hcS{$dXBc"AF`1:3(uB:.LXq"T Z5֫aQkzeQu*^/rm8n"iKٕ RcOtRS˜ZR$k7[޳!gvlRF/Yxt f֣oL񞱼!,ߦBBTDX1'6ABVUESfssI3Le'Нl&yY],FF$xFm3Ky1}~g>Ox  5|(EV>i!B,X-lY[/PQ7uߌe(&Pf%FՆAJ#:Qޚ=Gj<uH}{5  /%Lf"(*RVKs1="ܦ jKBX&#"0.)>뿕8&rܶe=*zoĄ~/ݶl ĂLTS~%$"F k..]Cbqx 6٥nFVF[eIdD:ҡQLDw2l๞<#!ѕe--bEDj*"H_7;a.@ 4ԕۧ/ X.#G3.s3>d^H@ dR EvQR  Փ}\0($b2)-rapBi@;;Ąl‚ؼsqV2SySVyשcd7UY7a%Hn㵒 `5 +"ŽmɳD!!*wD%N=ʥ}N0V/ 1b1*!&0N)P֩fr.X&G[4mƟK+,\ VL 6)=:MCC]Nk(JN*Hud )V҅+XT+dTD^*-s\iS/, dc#+YC4a aiDV*C䌄XEgeIֈh02%ZU%X,b~9]\f (!J@U^XpJX|SMiG+.~^PATT b1UbEV,EQEUPndX EI`("X"R  )"XE@QAda,AdUYAE  vHĂZE$+EYPCIxX*QJU0bIArز)\IZr+6H+]%bql|#.1-oxQ`?>^P  " ͨ1#XǚVAA +*!Tl@<'qnn% I+h7;e*i4X&%|ӓY ,+ 02Eڻ2 Jb@XԨGnBǦj˶X"2vM~S͞y1rI# VJ#mQ#ܰ1R:t7Y}l]K鉧vtH1)BVvelHNCڲ$H…~f~}y nDXMң2`"imDFhb`dLl!ȳ87K 6!ĬQe1[zD3~~:It, ""ElѮގAM*i.P%Yz#4}67shlrnAn< MD\2UPўV) ɒ9;iCgVXptR$1Ȣp]rtsw]黃-ڙp 49QfǸ[_O:ZRtJjTLeE!& ֢E @+}jq-lgK,JogjhOnH hXsS7 l ":@XELX*R@ #"5*5 6WHA>q<.4@XňcRmyʠ>?Ϛ6Tc$h+Y*P9TQŦ%J騩&ksV D @ vn[77u]cn!Ǟrr`EEBrk *Y 92DgvM߻/fhŧ bRL ! kQ-/Hw䛬Dv Đ')G8N"ETb*Jqj60"k-f, #"NKrЌ 4n!(}Kp%PT6]v`"{ZJ{?Zbm~=sDDDcyҪ,XCT%`,&1Nd1= hZ$֒T"Y[mT%H KA43SK }fŌntC2@Pb$,HlSS) BR İdO<Z2:)Grwh ɎUnM)_?zD{d肝):&! ƪf J2ڶ,ãU2ts-0J0,~HB%+0=JC>v1J:! ZNW!e5ϔW &"/PY%`ȥj))*kFG!?S㛷dӑln?5T3DA3дչO}MJ\07CX*(2lY1 - f蜆v )@%i&LYEw\X@P&V1%D6hR.5",BC nlҗnk]h3@V[ YZ R++?=!9c![\˗2uWo}ߩת@:zeĩ ȠV4 TD+ 1 Ȏ,c-m2$za{oc^@r>e.O*UJڷ{v2)$YbAE19etX8Ak Lr@ެ٩Zn0: -Dcnk:K ۦڙb(ԪRh}>09!9$*E%BSQm(yyY)QQ 'wUbAhNS};CLX Ck.n1Zl J{GKO>)6b6dTB$6ъ۶TT+*2 Kh..sl]4\I*Rmlmߪݥ1PS mNGt3~OK eXl@ ]b@MjH lU/"B.GuФ4amC\cjn,B12C/qagc)b( P.RdN53ojqS&[TmPi"A$T.$aRq^4 d3M HQƊ!"Hh_mp#Rd3pF,ڈu \4 HJ@Ohq?{n-! 0( ЊD ŘJ5+e"cQbB"ڌgO ZX"m,חe0O9X?nb*;J%@$<,LL @Vj`"$&6'2 IIVRO ݮċ)Ů7ŁXɤ.3tiG)[ մGeCG៬^6vd$Ą :df++SdYQ0iXЭ*k!Qq i&=.&^5-`NN߻ׂOVTfX !YwmH-`ڪkPXu[Y9nmi-ɤmpḼj;UJw᪩s8{_z+@g2l32vT |M$u"UPR{䐨JC,%HQ[Z{>u1mpe@MPO- e'6XJ΃iݬo t-mhK?M۲kg_we*1w*4*N 6\fRd);=]z~wfadtZ tyt8@l Wp%cB29uږ#iĶ9[˲}³Pl9_kUN$ d+ dEn BeT,b?;-XF22kHB~Km% =[gɘ,|7dIAy `-!XeJ @,n[gbJBmĢ6/gnK!mawl6jjk)Ua|ipD3?I?;o%۝N(Pmj/(q)(Z2RI1N0j \1&XWV3mtQ#Ok6oިC8WZnqif!zS!Om'g_?ߞC2@Eud8kP7/ɢ$eK\ٶnZ 7F[QXX}ċ8}y Z7?O[}F_^4&Tx !BDSj%gY$ȡmcABuBuˋ3:&P큤uBH2meGNVSaP,HTjMU+;{fzǀ=i j !QTWĭTX(K f&! DSQs4int4 SimRLˍ7(lU *NV DҰ! f2IpP!b CĶ]ٶPkWx^su |̥h->qBNH]P+I)AQPP9RT"#JagDDlGT-,lv}<#"e B(VG,d3+!R ((%0T$X/s1wd%v,ҔCH+jNMЌ(bR|}/{'Hb$y,~O-H  @0 &%`0OmJTQBFJeZ fe]L\б,3nNqPM8ݡ'O'ߞ}KԬőUu`E: q13BO`))7Ap`6 K[j=\vTtm,N[lvrCHvk E$PjPՂR MP$'{@W(δ&4v-2ZNQ =H@!Pd%ϰ"=0,aвPcdOA6 &@qO=2hD80%5>Uro,չYX}/xgOi~i*^O&$+ZddĪ̲43& O`*04J2):Ec>^snc )\ƩaZx\8>r>1;3jC Ola1"RLdT1+$+؅f%V[kb @8qCHC2t5ݔ&Bi"$ Rؒ50:n*qVuK@6jRjE@j%BTʈХiCFcNet4jl2wA#le#+;Pv G(WJ0Hi"v[?P$OG˱& Pm]7xXqb7S=c4} nS=?z:sd$j6$X,b֊"(sy$Ĩ$)4 D$#/Que&r$طePO4&Rydwٵ\U0G?c=m8ɌX.'qbHNeWZX )%e%Rlؗi+ sy$%>/nebEPunR*{ŕ;VO?ϋ˴I; XVc;R5b ":()+ (dHF}iHHɕ, grAHf6#3.TO6)w_Y>}@+ XdLՄc*K`Jʛ|k/,' f݀R k\$'A-7G' ɿ ]}/ -a "ԣJXɜM&jm 4rJR` k44DInXvٲ hN1J-"#i/OrXwFEd98JC2@ݷ wNX7N׷-`RZ~A)j%̥m3N0a>7  Y݇h !)O߸Z*) =0Y7E3ETi/"fAřestw/vJWYiy~]_M.!iϦ) vl&~zq܄Ěa4 򛶞+O;Q>$dXIXRH)HȤeJ*}?C-T,+͐7ے,pk%-ٵT!xaZX:nkh[>'[llY rUfHnm0m^ J YJf 0mF5"NeHtJ^`^z~. rlcc8b2q?gIԔPDX Ԭ9SՋBC='[P" w(DEJ)G ķdӮs-͸_Sz:dx Y(&$ hJ)ʎVXQf Q2DmZm5]$k~][f-dhBJ,#E{[,pVۍ-?g4F5 dh,,ɆP *O$&@7w@-Df|JF Z&YI4*)m퍕;V! L[]L>_9 QDH$S,8Rhƌ.dȱgf%*VL"z =(rק.K! dQH+AddNIS5iZ ɤ*(&,#3;6mj]#=X]Rd-18rHwI8EZ H!31 c3",M('rq,r*rrPy5ܤӏ/~3~  HXm"tejYXV5fB"IvDKmhY,,.,y+K iU42֕| iGa$"d$#mb rEdLB@%)%kq1`J;v{1F.a{ h5G:\˄"]N7mkGjǒd,eEXKH03UZA we'.l1ĄT%q老"Yuǖ=6ߕ7dEi X֭T ЩO3g9f#4cm+oZޔ ŘPi^>b'HM6~Im%d@HsI(%Dy\Hɒ5i]D5!;ma'o)l%O$]H ʹtϯ{~ٽCtFCv1)1PP*VTĨf"'^.rcapNXl ܎vW9]p$PL[5֣V1WX]gD ؊݀X PUUFJ$7kSv2"Q@*P44Fii VaFRԂ[⦒M%&Jֆl|ko UAwjIPt&e 3 Wo]@H`&'2iR KmpĖB2%Y۫61Er",Y1 `Ճ>>;/Gq5=1""aE< iJbK1$I))XbFòPZ_*"R]75Y≫umB,+Ya$ݑQH)  wffbDJdp HX'ѶQDŌ>cPSdW%9ٻ4M[2U?+d nȱJE T*U2id U$ WʼnVQñ)Lj3O x,!+ EV_͹3N3ǗtI;4"lriJq.QJAr2vVԅm[+98;&9lء7w#x٣Nq^WNքVI#V*NCZĀ@s!Жk)T'b .Zqm"Ii xCK[YrΝM(i9I耪*=,Ą*eJ QE(Ug mgI_%+![HJ3͛ $9&ݠ:4eÝU1n<{dd$;ZHT{R3@œⱂ0V`J_;9y8Xri$ֆ** ^eq[ӳ1ā t+$4UP9`LږYHȒha J QTՀPP[lv$ 9e2&Hqjpm5VX`zڨDm5Ŝ^pa(aoO7=,@ QV!QU5t0PPRsQHN*D` +ѕA#j0܅#YID!l cIA `Fm5$>g/Bd NVi(U`V:TjW+"&0J""ô`Oցk_v#Xؚ[atBblٲCF* R #r~wj_9ȼ:ʲqoX%q/=(JoGnr/}t%_% LϴEA*TDƩQ3lb[J>r+ ]݄TVUCYLk?A&R5X>r> Ɋ),UYfH+Q AaY* hP"@ 4,Dm^۽yN]7HNMȣ /F{u射ْA`$TSfJEGULjl[1pU*1vkw! Ȥp{aKM Ybʭ\O_G*#3:awx"+v;dCH[JsE[,-­hU=q HX & DEa F#,fvK 6muXvHr#LX}S|P{OuG: I0FSC,1&1KdPSTx&WWDU=G뒒v#"IeR+)zI|4K|?9 sJIR ,%@PDZWz\e@ d kDTHyB&bOwvn-YcR/nsfۮSwm;Է/~ӞHtADy()1¥B\CIX aTĮ+R?3.`9^-X RYI!K-0d֚ySOO#ȒE II¤ ч<*9kYRV z<٤1 }nD4GF&cا,fa.u1L@R_>˒^[ JU+ ,dАUYPb@Sdr#EaբZЃS rF(ٶ$u[9PcFp!\?f&̀°1 IP `DAaQJ&2pFKY[:E=n]2yPg5\Ze1z_@~YuX ¤%EHTQi J'QiSLzt-xBh͊PmԾ ,8^UzQVzRQQ_t9 El s@Y 3)=_\5Gm)uME6"ȬU&MDPFA'M;ˋa`a"/* n)!X*+ !c&2EaeI ct|R@jЄ%@ B $<*d1TͥYFvJB ux6UM4٧}W;{P$ (om6qLeGʎ5ƢŘōh Cύ #m.[/p+q Dr͕SG,Iu^;OUp`TRHBQ[aV `@)2AgEABdS4Ĕ S)KD CwiڱD3R_iߖyRNPb ,Z8 ! lϹ:N-T@:$$+JJ dEfm $\ Ԩ?*/VK *!@ʶ0T0hO鱰((IL$PeHXHH "K$+hRǑݛJg@DԷ,CuoLNkjM4UAr뜿SnL6\HIb"2ͪUJE$b:bJXbb;zcn˔--39; ή%p۴?O S|ؗN-gK&W * k],l>|pIȇV(xAw_DMdUPgptOQ=p.Z޴;iˮe>[!ҁ`W"$!1O,b, eT`aR!&/ McBSP7 d+of LWU}>+XU',V 1Ub+bFE"AH(ȠEE dU,QTQYX(,AA@QB(bb)?zfI !ߠڈA`yI iP4W5VfZ.[x2bx4 ؿf3RB`Bv.))wUjrIߞlqgqk*w*BVw,SaX 0`T6턜N ń1'Ĩ͔3 >\5k] L|;}/n~#CT*@m VJ荕 EZb*8M(>aha! >#jX=TUm% Aqo\뙏]7{k{sÚ-H-TJbȎ$ $JdlEKp-Bag+gBn9nd&jW-t8I"d{hT$YU"#D~>8vm&u96\9f^v%\XV>2WA\tU;{zIETI(,HUq&d,kMٌX)\9l@l[uviKH -[-,cvl3ax\cg~$̒MеA"RYFV'`]l2"IJUH! m~M,b`V&v$r`x.VHWcQfZ7vgA?1|ߛT!1XCAFeLL/xYjwM軻"$cwe*Cvh͔en즞mf?#o׶/T$"1)$UPiRL qa#D&|1e fE/m%iY3vpj=5{#{qׄ!*=mYQ WLus*FgVk-e՘ G OL#JJdn_whhՕ.ۻyr%-^gSwb˳a!xDz.p%mHWTuSN[l{=G]p?.o$H`CȁXTQdX(*LJVR  XM,ݍ(\ Vf6F]]7 kKm3HV6e+GY=I=z缰8s!搁 UYJlFuj9nY! k0)g3Kq9bNBKR0@tHY uAΚZ4ml9XzuoK SZʓZ1.R)Xtm`Xrkg03ܔ.GjQU]=؛!v4Үz.|8Cbk6bI"w@^t e`)!DE^vnMP%$X +iLħdUդ"\b#L!pb_*C+Lc*_z{?OXT*@YYgZX, zZL)@ -7G 0g & XkcʕD*Q#䅖Aƫ:ӪU~IWDC~wГ ER RqdVeQ"jLwm EH|64i62 lr)@m>'jzT66H(1V"ł@*I23WYC ]s%m !% [H*w],шpVu3YEXc c݇xK0O4ܒ$%dX #%@CtJsZNHkCI@,lnmJk_KPteS]ՆJ TDEyNSau*?tC +"!%H(tB2*& zY蔚$*VC'nt`ClkjB_V!P͛y g[&luԞ=_8œg{t 0d+'k%eˈ( QAf14JY;la)p$|k]b9+٦#U ʱ/n&_CkoӴg}:"R їTXLdRV e)qWuJ!GjO~۾~R! va7B6 64帑rsUx~~pI9PXb'66bda$I7-|Lg9vD2T}:gHBvRIXV""-%`fPȨ/\*T fz\LF%dq/MXC߉-Ϫ. [;vvSg le05#Z #4B$I2Ҷnͱ!cybႇz1-(hYٱS: J2cxf 1Dﷳ~= >} $R,bRATX͹eJVΉARԦzb(e4;mVnmDGӄnpt\I v @^ ̛! QAB,MqMvʒF Q9Y'D!al-p꤯t۪kh](,CY)^Sa%{ϦɟC (uaRJNM2Th Hi(kYR9h" 'v"st@&챉J< ީB=*uvR֖깄'6nTENif[$RH, AƼbSXBDU i5 5p >BX>x uc08s7^s,ccB@䐝tV^T1 TBҜX5WӞv7Y[@3I,ӆo;+ BgƤ%1fNEqJt8}.X~{H̀u+jI*HUt2VAd2:zb""[Q%"Yr߂]]x\!xOq kIݤx(& NS>"'m$"$](`&3mk3&ԣSV*Pl-*N`&eRz9^ ԧU/ n qgDNtF9! g;JQ`ŋZѸ2y)#\QnZKNA˨X#y)f[,)Թ`K>8V+XguF ńJȵhVȰҕPkiZn'WFYiDduۓLtH ,_wnҎuռ:۬zEEE؁6@Yr@6d0M*(%`(b@ٕWY\rLM<%;9n5`[c 嶱V!)*wRK:ciw,rK#@ :0Eb ,EȔLI4li F,^O$;-3rYwIkc[oQjeiih=͐TWi [Ua T]V,IQ`(T٘1ACLGMʲ⢝es9ʣ]#5h=Վ0Sl1'"ꛁ !7`V,F $P-dj&̓v@UYPImD^fh )#XMvu&ծ 5 +JݩT=t?񖂉\";c$6BbҲ0[XVPl8`joVpK(|촄v4<Z҉3sUЋ!"o$TXȪ fb$2]iԕ ZiOOfi6M$1gΪ]l-j Q*Yۗb S>ޞ׷SH$NjBBۙM!#ۙX*6J_)Xʯ.i6$4\)1+[JF|BDD[oGttwS^C Y 1$ ַ)$ D.aF6ͺKG6T1OqwmXebT#OVz TA`$>^ئʁXH 41lk*tMbrK)c2m:SFm)x#I¿-KSdcm:,!+"COer0II&XD[||k"h @S{ӈ1r, h_]#íjU6bQQSN}CfXohBتVR, .JT2KHD]i F&M+^Urך5d$ %k&۰bajSNp9;X` yy$PȪ1EsH4Ē3 +Jk"6,(<.vݚE!lsv;)sIL47ip懵`N(CuQRPQ@PȘ̨uauLKS1%"C5p۫@U]fLM3!c=̷:`Ŋ *Il!Dٕ!QHы# [!2^N^r&nKleYP z9f8-HΓu2}'d'jT6H{iUBE bIچ-;ia0I/eCPB&ݬ@.ځ=*PJ=Ji{XiПrvlqCdR-,Q5eXʆrȑy$gsZ.^#Hp[fZ:ܭxFWn )YH":#S״6BreA`(TIRV3dRP dJt @ a: IfvR8ňDqꊞrMwe%%SpBi~zIc:9VOxP/Ё:=$:$Df*F Sʹ٤ˎzwT8J0,! [79sjJF 'y@,ZBTvBQ:sXR6bJsim'-UujTEqI&3I6P`""vdp$T {zY+FdBBۄdD낙e-X#,kp3QaɀYd$DŊ$+R.5y%Xِ&k){+Q@7{rlM؄&9m.Q BxkMwcsv>Td?96>sC tN1cכU<M"5 PXJj..kKJpBQ]1W) @+@τšBH+*#R" t|Si߬zxJ.p d(gstat/data/vv.rda0000644000176200001440000000320514750415431013434 0ustar liggesusersyPSW *u @EQ' HiBb+:AqQA[7PY4B{_2̛9|y7'='k{jSŢYLFSZL\.(8n[\pqqJsZC+j9Kl[c}n6BoPj ,V 6IJpQZ?Jc >p\= sED:Y뀹#)ڂ*p^s5ż^p56Om5sq~pURor:G*pɻӮo(0׈pwqEE;Om>VkX+'\-ŏʧl|p?S̍pXk_f W kyԢ > 1g!଱W$2yxo5(^j&'/9qw\> zF!nKv1:+qYg#rXu7n󭲝zkMg'>|qS Dܱ.V|->Yz niECZ{/]_xxulv4qO@ܔA)d!U igj6eR),ȒG\wFO+؃6+rz7_~掸?C\ˍU{S{9}zFV36O1ݍ=fg1L" ݰqqgV#*G n̈́ BK:=V%MW_y[6i&R өm6;7v/Ļg԰'w(Lz{ذ`8(ĻtyL}2`81vJph_] Nο ׍Wgn_i+8Yx0,{k͎oܸ\pq8/x%.[ηcMjX쪶'zY\R:rAfH{R2a/3r_KJY._ei_ģyZvypoaos<]فaGU) 57mg! 8xFq %t<<γ9o@pAt.,vUV[4@= xɒ~)8q{hM.| /; ܹ}y`NKbxl)5_7`O>`Olc/E(PLaYSUP]D0OF&HUHԇ?` (D|q ܸLz +DJ)擿x̨sjs( gD#֐;h$iB#}5U;0J/W4k~>5V]ynju|~ܞGO- R=U E|<$Q2UJiUDD,L" B?vՌZ.g =Պ _aZ{ M4lD0)Qf2-L%jOԅQ/K?Qa`L GRU"ZF[@y_{gstat/data/pcb.rda0000644000176200001440000001264314750415431013553 0ustar liggesusers[yxLWDUB2wYޓd3R!j,**v--)Rjj-j -KiKwsr>}<_{|gv=ՀEIWjcZak6к5(e?DvU!{ d':>sb]5Zܽm;]o-A q [Zꎘ6 &;ߖd m|6 wm+x6hJhqU &m]o5nu>nۛKum+,2p=m Rjn+IvDnh0`wt|y](]\hh[Z?\o`qn;iN y]Pa={mZ; ~p{{#Xo uY Z9ltu"1 !!F><8҈C_)4T1^qg55pM[;&vyN`5\jE#AF{l+תL-E fO֚ jz\zدGne& q.My3q km4 #NCM[6umvt퍺I8mũF}'̸U^gri]#1¥_n^;C~fyWLt"V_e<u'RKyC!?V_/kd#fl[n!4?[~Q.۬?퉀< YXh&S bT$<Ǩo)_0٭7r+ze- +ck~ƺX k׌:])X ,i?yY? f쇀o=un'[jb_5gv-3'B& u͹fZ?VaOhڧDQ߆z|"wg QUȧH3/9oǜS|su9=^`ɑp}L ׻d@7}zO~vAۛ\Gk}o^L_"=. i9Mf>6/?oX?ofsx  UTl'z^3a\gJKd] K97y9;w iyN+1mX) 6EYWt7 Uk; 95|7oOvg?ku?=<8y_9|y6&~>z<||旰S2x=-cI#.{ZAzwo< W~7~=s{Sz]x~ u8^`}zQ7!~>==?^S vZ'scTMEóq7y硪8Ux6œx1+M\~L7ŗ?uRh c64VPyVӸ2ZngUm[i쨬v~?IUfmcb#v.?{_ilg_m͸fL ?8kYx1/VV7s&\_Z?vjk'il)1ƭXỵY5׉yum{?WU=XYk'gs%=N7kq18VNS?﫨>;j.籾gR윝GߡJaȚk⼠c}MiPo6%n/N $Җޖ_=׉<iMjg:Fɳ_K6ʨi_K4%f}4fk'41b> l.v5+A+҄i&t#XiF[z*,Ͷ;ik3ݥW7iD8K3aM]aKgc]?Nբ_?Ey3 1N)/}4-%oIղC7nM3j_\l-K47*ո-.ijJ+ cVNȓ iӮvf_4)-Dm3߰u'ܨzMTq37}NGr1YSe% cեۯBIQ%Rů{/QE4vlNtnhTiܽ) <4ҬB)'mjKiY联#hBifgRAn7Ԃg~q;AD 2}{;m0$6m{Gy埖A4cI|QFiԠvT٣34Kj)#*KT9T\sr_ww4@_i8q6~eQ4S;фS!lJî#h^>JKih;uLh=M˾Ҙ M:SWIאȀߧ K[ӈ}OMqfNiM>97"n2uk)M}!zT|pa7.ԃaUV~hC]7Nf ;Ԍf􎹝yeMl3BmPE*ݬ i܉ΟwSu"Uu҆EiZ'o=@R&N-W']]!4Εi:[ ͽkB̼ܔetеl4n;g~*q?25? uj@ iԉn'K B7SZp&޻SwUc\O:Oz+}M9x4a_Jpܻ_JN7JlL awWJZvӯ҆^K$G+eMۖ>)JȮt_wC1M֧VOߍ:ʖ*o(Uj} %7Wغt YHSrx{x!i3GN&xǟҗX=f4_'/$tIy PUxyܪgosϣ~ݿam +xx~𛏯1{o2p*9[n;z~giOڀGyelOe;=|gQbu~wU'ZW\/Sbqn#W~R/+iyܸ٘)<z2{uuSPMvr}wMxܹL3_X>,_{*?PA|CZ_ >F!F ]㪟Jvwaߥ<'Zn4V0$'+f 7\7O ;(g8᝱BC^N>8h؈\M If#ilIYyTxOu:EO,wPHvSDO="z$z:n%tK.%E%@qq_nǮ]u`7 * ]T8*TT"*"`K .A "$"B""$"B""$ehY"Z*QEHBI" U$$ jjKBmI- 9́`s D{hu"qD\'Dɨ"U$d"qׅs];@ŲWAWUjKYŚT$"*lPT(+JŊRDŊRC߰TAĪ7Չ1*P s&\dZp.EŴd.E s{vub7 ` #X( !d9E"X\ >GOEmԆK' $&X`UjI 8'Hk eLÍ ɑ8XF"9CāF"OIA<I<%A@ɉ,<>r'yps">u|('G1[_ ώO3"'>w1јeY,;8gstat/data/ncp.grid.rda0000644000176200001440000001147014750415431014510 0ustar liggesusers7zXZi"6!XH])TW"nRʟVD`FXb<;w`[vJZ x܍tN[$ J3◍`\c+ ptS8L$=[J m-?  xm[nHZ 9AۙHzI(~CRs ́io[;Rmb/KUN,$ f4˘*lq&Tꋡ>{'V†YWQ 5 6(iJ2 Z%0FG )94΂W`ˆhHTEBHj!K a~ Ʈd&pTM.Ҁ 'L9U|$!+]dk!re7ÇF26Dksǂ2I_2VZzqx޶辦 }ᒚ =Dhv*?->bG6E0=}xrxׁ rpz&81g͠>ϧkTk vwsc1lغ8OwA+%5{cm?#9O7u؀.^l) ,SL|vDHtdò ..]!ņ D$4N}1{:`f;e6̇4C2Ft |DvÔ7dVy8- J#wC8FL2Hf?P {JTpâ@,D2z/&єWhgf.ksjHVk* ,COVrwaܺgp݃3| bϷҲ%\8Ca {v/ mԓjgMy!h۸Ur4IRwL!yva:Y1TlxDž3Cm4``_,cep^Us3/F[Ti~ͫV6:K)Y$o saQ@=%m7<8? n8~&4C\=ZW"b΀\f%@e49r !Mm52KRV&) :4c? rJ"?[3뎀kv5"D86]=$0Q^ ([ظ/,s:{|u˨Jr?}Q[!mJ4-]C>AɆe8n2'` HgO|ًhs㽢OYݹ vb@`M;2EͻAm EثR{wP.)mG K'D3\7L~ɔ bx%Ƹ=PQr*T[uCamIgoXq0̪F0?y}үBQҚT(-YM5O %:-J7.9Ou΁c i"'d9Qja-["Tp#gy4'pV!VL0{ybuU`+2ꟋxNuA^2wk=7fN/)naY1(?}~ʟE.VujXZtrod a;E){,2\@O4)ĩ/6 iUGNX2A0.v^)]ϝ*Nt8X->TH U5?$-F(gugc @)N aBgC>,DW18l[)-5mx]bI4K{_Xe+L9if]څI_) Dd0 ThTgg.M))LԹzA!A9vh0WYc ,'7 W:ls/ݲv'U)7>xMK&|zׁU]ŕG1;v=Ye ]V&~0V`o/)kWqNlNe} ;*rNy8k̓ɀGzlr_z7oRi#|Aߝ&s8q aeI Kl!&܄jJ'0>J.)C}lp,noZG:\))gۍz4s1e!(CɸSTM| 4!hj y;DG""|ؐ%uT W zj@Uke卞8&)%L!+rPgsEQRCђtPw @"Ol԰;U|&5H,QnP wRm_:V1PC>y0&o= |9"0?#5\E ͔Bp{,m;sZS46!hFgoMjpTځ+p~WSHX"1T>q|MQ!Du]hfXgL&_Nc77ļ؇HzL eea_K !R5J _+FO̕KCqvwƎ5#fA/yᅾ+I6DFY|;d DU =@כYf`.$'ԩ_m.c/83KN)`ų)f/0)fli. ŞlC8cL#t\\g"«7gM@3m߆$_ɶ=~_:7&2*x62tnps~=4xR6YyMZL6V=a+/S0|IG!mJ$fL==T^.*𴗈0_RDPq?2TmbtL. ȉAjg N>SvEXB:S ɴ!'5" Mr2GxzV=cj^1$=ViuË_"V3]q^i蹕ܶ $鳏cQnѯu,'y@& ^3; *;Z 1`Ŭ:/OKI^ ,&A3J9R7p*Amk(蠱R1A)x8Hq֧cNgY 퓐ܘT2APjQ)ƶD/lcr_ 1E6¢ɤTУk_h<t^'޿CncVȬꚬgF ;xb ؐ]|0tuD#av ae*ʍbiG ʾFYOO8TR. ܇f *`%*o_<9@(@/(U"v̦=$ITR~&b1ͿNgJ jbS:o:wb6OX]Lvhcz7&Aٖ%iubsdg-ueJDHng?. 1b }L/Ng:7Å[[P!B߯W}{W`IMcڥIq!̂jPh?ܝ#6\E!%4i0P߭'\2qӁIn%zA!OLnN~p@ٽܿl"PIN Ya"u}JhqtҀ>@N";i0ڞ#k8fUsWa[][_g { ،ehlO[!tOb?Rq0BTG)hpn`5`K.uiF?6Y1vZ H.U=IއD#W.co$A&Gˈu=&꫿~kBN@ >uya:/.=6Prcw7?qtMЅ=yۧ Y1ew=w/B3̷YO7yǡDZ0%zZiSb!E:ai_|C2&=ƑUk/bՔ-o>>,5|uNW,T Jg%j(69 0]~v\:ܱg.Y!:=vRhČ]jjTjsp2'A/JGWoְ"fEY7TYט0WxXPP[ϽF(J>]p kYvߦnY&ɞ>0 YZgstat/data/fulmar.rda0000644000176200001440000004137414750415431014300 0ustar liggesusers7zXZi"6!X3'B])TW"nRʟVD`FX@c&vrtt5䫘`NXa+Zb  &Њ ge~_}2m>ȑ<3{vP}%NF ݆a*԰k*Y@$0!\ sc8p7GBar.3Bta4>a*)Yqr({UcACVġiJ.=-Mzɣ%||:6{ (P.Q(2df#aSeͲrM;s_R|g #ְ=m 1gi'q_[p>8]h&T>~D`O.CJ(8 d n%8W1QZ=),A^;[1z>ycإ5DeuʜyzΤQnA$oP3Z,\c"@[;†XDXHwOтI,)`::gXl19"tX@M>X֎&g׆*pwIWWi@d1wЙJ@ltPRͽKhݥ{Gc%R-ʈDPLǁu1c\~}7mQF dEiӍ%(%@>C(jI`j*Ы5|Ҽ•HL=qT3R)ld(U4Z$(27@@SðȂ!6*s91?7'[[";\ct_,*}Zpň]6>@Њh+9Ux4ēd6/g`ptn㭐y bTƫ B㟫%=i+ {`×&.Is|( eAV.[_@rc,x?VFvADjH؛P ?לPt c@C,w=9`_sRxJ E/|=dHSoi#yl- 6EL>4ԯBd!ܫDZn(zc`H/gCUK2U6nJјN]&-F7ɣwDPbr~LP,ZxΔ_-5Ζ=*AcZ] 4 seעK8b?ܺ Js7_{BKd|hJLOLat E =Ib%lŞ֊P/t^UJu,FYo8[Av7id>Ƿ$tȦJy637 ",rЪ?X"4p) 7ܠ( ai>dFT$Oo cJ/4C-vqrRX˨u,ֿhazC]IXb.᧊m4"QY_@RՆ6xJ};2ֽ?GZ`!fԤ)HY~_l0E)CI1e| Ns[-q-.I孔!.NS"Z̋7Զ-6 XyikOW .ȿi%³~TQzU96 ]>q9ږZM̼2JI},6΀S=&FXDO|n{͊;aWS#ާHVvFGu+͞oMF@.v×WJWxђ]?F/Q{y@ס8ڟ)V1nw^$竱m ~6CE?d^EDV>3PeQ!/Z[BVdGM6A/f*u-"۽>զ6Ep;Dm< ?0.YSUP7?W)ACdt<_{F(H\ԺK/TTy =Ht7)m<.LDR$IP?L2Fu Cc)$l3%N|;Z,d[uM}+B X ±2$,$ClBa#v;rf6Z!@6@5ͿKB,f&&NGw`q.wNXʎ$ vSo~CAT2Z׉I,ۣb4q:kSe~o4;T!v++2Ķj מ>VĄ"k) (Z+T90huV˩Bhv,OoآMFM&h\$%3ؙ2"/N|`QC齓eд92G,d epWR[l|M_ y~v a ‰lK8"9;ғbhځKB01P ,SrId&^)ɔ'uǹ+C:Z(8޹xuyK["OieAiJ hSAQ ie^M$1 e5;#jYaWް_xPq'*zy/c:g%S =up{X=J̕|TIk7i-a!<x@s=/ϙHOG׿ɠ*Vò@ ŋrAw=^0Uw lK" ?}Po#'׶VkSt_iKpE ?*2ڳtD{m"QLP`$yK_g"/4|̇ T*K,vde v!$"\/= KBHw =~X@ Q#N3:Uê|`1Dy#y7аE%wN4P I( ˇ%FxWq#6 Ȃ!;z8z#ЁTMb| O\r?i6ٰY-3-i, Qy8I]eIGƐ*f,nK:\*Ls4,3:.3XC\j2Q~ @7jFX!ZoP?v0_h I)˨/w<q)]5s=Y􅲕&M &3Bxy@=lf11%j=} ^91zEb@UKLT pzwr3yhRl: SGyQc=Vآ9UYS!$] ^i\\8eӼ$SSOX We׸ _i\!qQ8LAțh8*g-cS>ODrYhL y%탩hemVi,Jy5kΫhLL~ҫs'c=ϫw aV]W}L/,1Q>0SHBw~_+Rt#̣os h":/ikNQȵ(wtG!G44|4M?{ԍ޹\JZ3f18y;VÛT>Ik.y6()ȇGՑLZDLA _P|#=W4T*ǦoIykUA.Gj.+e͖_ۍ~XxWP\(J[tcS%EŶdޭlizy )5\U}CԟN[̳/oTĝxl-h/\2^)r>c\r%H#2n?1)ЁTF֣ҋ=;YQ p)JL 5ƐLn+e8Ĭ&g9\H"aJIkK(`.a & ;8ˁB"t&sent,&yj(?ܰne] om |/@W>2;;KAAHBsėy5S36'Iu% GmBDSAi/c} LGcb#,ed*q" Z5b\U :@*3u{=Zc>/;>(GSs9EVI\[G6\F$tUMhQԁN`;]ԌnQ`qt%Ir0Ɔ ~;ϸrŘnOWPsDVo5(r@q>MO QPÍ5Z^ ,!]BՂQVsqd4K<^|b艏YWX, zdCJ 6y3-V#sߚ`t)/tߦɂ {Gp okDmɫ =33NlRH@};Y.2dk]0?-VC{YgxF!4vp0B"5Oe*6\`^/NXMce%qƱy S3G$V 9zL>(&I;,Z"<9+`;F vXE{ I.äeՃf_Ѥv3.z.Wgl  9Uwv_'Pw&\7xL-*O M);p=1Df[٪ޙJv}vI&tb!;i{PTv up58r9USIdz;BBOẹSW۱}1I8"ˤ4͈iu?kTN)8>^sbl&~ jߚyߦ!!,+Aݜ>qbA|)K܆hJS tʺ%TI XRk,ȀC"58ʯ&4Y^)#[+YZM`rr%e} { q|OwjFYSbAI \] bI6:@! pqns$սY|iѝmz? >{oڱt)(=2))y]X!ESӀK)˒%O8ܐ^0r@Y c]R(7}B~0bxű%c~xnS{n 2#U6 4I%=c{Rllv܇縂ʜT#"5Z2 $l^EB Mx}vqm]kOL)E x֝D˘h*BizfpV,Y`x}ac ͍w}rEY^ .;he|?SZ$5dDx϶<G5KF]{7a}Hg[ b\4yݎ݁ܮd239:lSf<7:_|1cy{[۵];~ /ZV=Fm#T: μQJod>WhgxIyuG^KtccJJ,=b_Z1%q\{/BU; @ҙa-zUSmtS}-Ջeh6';>[˖o?0|zGMRc^>֑-;㬕)ddUg4Œjι< F. Lq! 82zjPt`Ӷ갮LI̓݋R)i[pTH1K ^͢zzctwGFjo+v>j*w/5b@ʥ]YSTd.@gmv/m ~#3Hw$ї mhd'{x᛬qT)־2-ҋ@5\'Ai5D'@nқFBȜ|K$nB\,qc;rG4Oę[e/&NC`~qb0Dn^M7YC2Ak rk2۹0ٽKj5S͠?a{WMT+gyb4vkBCznR*vN8 _f&p` E" R[BEidvjNA{P@J'pdy)] J x+LONj8jBeK ZOoO84d),S@1`-OOä4r{ͩ'tg4GBǀ/UcTat~;7*ٯehjYq*]M姛3 u֡udž Xbb0V}0N=,]Ґ˶@p˽<ĚHfħM;RT]X*_PÒ}$B١I ?X/(Aի6?i38b*a}%Ή7) #O휊ibJ񿭷a}­YQhe7[$p\g|cn-hBݟW2k4]MA2 Bи[,~OPGC&22pf'+!_ )R l_C^*?,7YЉmi%IA  &UW;fQnT BW'`Iy>!tO{"arYQs%?]_}oC~;XnNr+x-oO Rl||*ebSPw Nvb@:h+]B'bK6wp^:hCR$ٸiX‘0F 8yҶ55ة77Hn1hah[5@({EC?ă15E쎊xR JjNsZ5bgj0e\،NחaF>;qr#Òj{7fmGɂ_Bˆ ӆO+:$=.[Iw}LnK3Rs)Z8j{OAS`J"cKs%!)<) 6Y,)Vי:?-J6S c-G+6ӳ-]5# -$Dz@8c6,3̐c\z{JEc@l:kFHLXS t$|m@r# @?7rSn~SJ k`h~' 7iՋ~5`v/ @޸9ߌY9l1mI?X$~wM-r֕@hp(/eP?Θ)=Dm>}XbF6kuqS@e/~e^nm`fn#BQ_k#lWr49:in4a+K#W9O4+jŸ!lWxr%TNԨ?=O׋P>( pn%zgތQN(qD'8Ƈr&/6EEN;Od<Dn=Uօo߇'y y,sq5v\zGl1h1qyjs"]OV/I+)CI,φvdTuLNiQh@JiRH?%xpvTrozvwл9TlgHG:n(?%fE.h"9 m W*)GAUx(k gڈ5S {ʀJ@ᏇbHGUu,MO,{A!%FKonܧ)1U֖nzX?ܯQL$z[feҧVrwXTY)bZH]=ݱmedCG4Z SPX,9t`/Z$ɩt_Նo]郖kh _+õ;E9,mz1Ť'n$ puۚ6;=jxOD\0\]M.Td±ORDљNEgc?z::8,VIh] l ZĂysL})j \Pb;ix(eKsn`OӚB weל?0P9t@c̼*p3QENX˭'Sު.$B\RrJC?VWyrj1.{ T;SoAէUF܈WHʈ4)h+PD<(c5?"6|psS|đ6hpy&\ ~|v}] XA꾻6,NO`30/Qڤ_} K]K}M+I}Wz4 <H i|8ߵ\a~hhWU#9PB[@gdC%/hɕiMVԪh_ nl0]&Cjʵ @tg93֋=?"Qq;`3>+Zm?\Ty/nk;ᶘAwtXdԃje-KNKʴȣ*:H3>{b&WB=A *tn;b/E;&P;!I]$w4*'/I#|\Y e8޹$t`wdo{(BoբbR>H^[:_)Wa<0 øJdDuD5X$2?7-3IRŭcrh7KE8 HO%7.;didݙ ֎|4ap7ڪ۲-S?G̈7OAbEB\zƸ C7(D7&Kfb4nʻImAFHۅ'r"1%Ci6harO1 K0E&ۛNܖҫ̜Vѝ/2U}_<Ŏi>"I}dd]quzT#T.D3y9} +fR0 1!;lxʟo"}Q<'ߜ9C)lTC`*d<`/_&E.O|TL_ Zo >=  )ovDMwaޤhyB (9j Rdmϡ!Sf((abQ $$R䭶gp Xmr>_;I( cNՁ~ԫi*mm!7A EE.D!xd&m;Lp}#u}Ӊk~[_h"G Y/<k ۢԖ*2xwd޼`ۄ ,+֍1C/4MWŀ')t> WUk@L#\3cUHsR[nv34EBoϹG-w&WHY8lj*-o;fRXP"_)ޞ7Tl"j ]Ki\^1dKfݝvPQO/+G1Y|߭;Rh$Y>_LVBT2dbEW4*!]зL -S)P%FH]m3'mt9j/K]YfI[^i4[ VSYHz89nYHʑ*eM4[Z4L.X#@&7k b:y%oD xeis[-4*lq,_0 D3=(ubd~w Uh-l TTpd^9TBLˢm~^++,bX"̫9P4*Y 6q/$.GacJ?{ԼF%6^} g.Q ܳoGTHG ɳj*7ƂY˫lR)FofU3~ i4y*ZwDuq{ng aSO5_d凷sW-Db;Y:LAs4N2 qe׷Kq|%_G5RpQ )~LUf(Yn~q$2)DS=~YX$g~@V5saftPB.zhCM;*AW`:~z'{u^&ʗ04dM2uQ6vn2u+N~. Y}qo:c j;Yw=sTWT=# K;fkoFb)ʵԏUE#dZo*_A&(GF}_Gj^v|:N`<78IէE!bK=AMSL򰵂  fG3D[R `LEbd+Au=${|uih&5 ֩lܮi>7׮K"%i`e~JtBrAiAR!)L 5Y`#F∴f8@jXq.'TYd^JTXFHxW㍭ATipxs8d6{PV̀‰#M2xGJ/4P"d*KmشKZ4XR˱KM''L3aGZ9B:ͥNFp]U`q 安v14V`8Dx]leLb~z[.:e"d@@Z6;ZwoJC_5QQX (6JP8T9Z+rXT; B@ xTC=hg=(-5䦌K-$~m-ryO}JhnAyU;oq^xW]e錴Tj b)}"At?N{z*bJV0=j{,5XQm1 +J}PiS@$x8+Aq7'Wb*' ?9uI(ɯ<Vf1Y*mow)F ="DPD/4 99;k6=pzx";6Tkt`_ڷ(GI>[f Bv!%fG2I.MIX[a2oVz&kwx E:,:J._,E#bݏ*r;k7ս{h]խ8fbXVlF.]\tckJ1k+? GB g :kG`ZThڒ6 x aJE%#C,<͙dLfbZF"r͋ݛ_rI~ʲV>:ei>'hOd!.3wlFƉ-`?/8pw\{=A DyP92]b,.>s cp.m_J| |kvnd-8Ж5=q).i7%⊺xdb;O0$?2=b-6 Rb "f_gTuj}BQXѮwߺENYABpv=)JCT.i@$ÿ3]!P" ~74(?-=E'39G{7д2ł c=xh9N6{4$SK4 [Fу0Ku? J*u',f >/[얙9@܁lnT`Di1s 7nMU ?V.)YHS}e+\oɈ4^t^KPCe."ntuJוSKNd$ЄY+ZK$a!"ܧ{e޳5C_5$xֹ̻)HK²Ot^R<,2z{+44m+ "?ZI㕖$*zQQw* e1΋q[Nlu"^^6~|'ȹMEB~#kȭk=ۉ/: ;&F,hC+",z0\=qOg<< q VQ dVF} ka sh eikAd]H78Rk4%b[=Q|sr5|ݠcndȺqG=Y_ ?> 9zFi@D|ĕtU-(=~8iDZ*-B-ZUL#P2YX;){^:l3dF\АO>uߐ\o;V!)Eրw'OekOPj 4q[C\89) {м1n`Rwidtպ-@ifJA2+^5|*+5QRfm8ɛMIp]v: cK,|֛l*- ;F3օ>0 YZgstat/data/DE_RB_2005.rda0000644000176200001440000017400414750415430014327 0ustar liggesusers7zXZi"6!X])TW"nRʟVD`FX"˒#OEr۪2P5='vBl<6fV: _"N9V'Z xD[ڀm26{Rp͡0Ͽ# _< eLiV iW&_c?S -8˨^%z!\oTy0W6VSld۳k1zR(sdZF! sYw\g<*`;|[Ms erGǔ |5W &^j3pwkģsOxEfD X|Ͻ ^l 1x90pr}/uOCp5[w:PY8Lp{ou1ȋ[e&0}蓻AqWhQ8BݗX"meZMK, Z\XEnrMg8Vm@xCm%('9`#Ah~g97U5!3;gEy)>x>t@k{5 t5#V|pz ԖZV&]`5s;|Ox$[yY+8ji^*+QR푯CkKqU&>fwR9(aJ<%ױ3|0n_gV9RĮTޝi`Zb7β%F'iaya 6>SZ bYskb"jHszrXڊ}Ixs6* 00hfh^dqlCA|=c$-Ji_>W񺶤~yc~ +j/`Tгu8%%[[? 浂#DX fu2&W+(`AI.o˟huׅx'+2?\볧wS*;¥f7^i~LI [i F%;;l"ڞ|1 ۽gP@m[k%ƓP}F) ?4벚cpg}ی"U&&#=]YKdWμ4yS$`X a›KS{dD\?NLX(Oaf&`'R>K[ }b4Z ݊vUP;VP31,c" EJإ8dbfb'odxcdߌIfɚ $m0?5M HUn/!* }b^օ] D{S>gs w-_XZ|EpTqZ *[9aKޝ*^&։;ac&_-G+!]J"7^76}3|d Ga(.A8"O0R/=J6"*&<}w'~|VA0s3zT* L\:*[-9j AS$Ha;qD7osx**!K{Q_Pt1֪P}h zM $F92M&dZ"+HYP+x2J׎]QJ,LbcZmޔ/B'N+D*OQS{]" ٬J?h7!,NT:JyO w ]ɹ ι%/]RFe>r DK2)b~,)8K-(ZdΙQ/UޯZF P?hED*?ԅ ᬺѭCIpxc>i1hL'&An&8RlňdD,JeQasaQp '0fgh^X:~늵'LzPf<=xn(8'sǕd@PsJu.ӁwYh~FFň$bܧAMm[s霫V`)zZb<&rnкGLdY\8I ߎY[lkl>}iV"f5 OMZEPCq)΂ʎz=-'#lS&Eub6EV-tɼ8N 'MKsX|@0ITjy<WvȀTG NF9ZR1?fQhaT|]ŷ h4pCmI_!"A3V>="Ę+f+ 5tTa2UHkfܜ7gyҙkE4(I{Su&_.":Ub)!Xw I:c+qޭIQ x-ĔeR~N;~,UF>ߨ2*fzOHdsҥ Wz1M̜ۘP4"'Lm5޻SmoPEm&YR5m0ֲ ElNm[Oʯܤkv[Χ zX8vǿsu]5BvL2 UB|Eii^,؄"GgB5r,'`\b\-lE?rTOV|O[T 7f p@A99yj7W5iE,e@Znq9\{~807[_k8#>>zZued%sx%`j9z&֒Wk I-1IV 2;+>=uSHJ_<@0P\R|oYڛZ['@McH!K4 y`#+6%q O?SL!U<U4f”X8qt[>sɿ;"=Fli I?߫L=Jo+ruU/elٔ% ^f&FriU;֮\۸v{P HP_f"wVe웝Jz Qֈ 8fbfC&/ڶCOGbZ.31Ό8cv Ų,,l/ؗmJ_.2Ln;۷b(-?NZםQ=('k >ϙWS1+*ڶ (m浅㓰ru pXZ(M/ (hx{|z8 H|YF.#PF@˭tv n;a(b} rMq?deW d)MaWhMVrlH p뱛7Hoj8t|0V#%v\vKV[`ilg2D {5hxW*)}TR^H$ĭ+.$h>Y *ЇWJ()~b"9p֊_}?< w = ѺJ*Л͵D ѹ)_Q&i=ekJS#ґ%N(~H/򧃬%ŕj9ٓ魴uLh!)g~K 'r}Nsa Q@7E33fq_\2fF8^Cn@-`\H(CM\D3c8pUE]xD K?P,p['a EUYg9mI:N-vnOtwOHvFl(h#&iEaFw! 0b(cDՈ~DcC0IŸ/g|`}kOcL&i/Aj.Kb#Aq[eDutI5''cEDkDAlsR]B[lV`!#iSJV>f[ P0(_! =q-ė*b |KuUNP!Ϲwcv^C)+Do Xc긑C'FZjk⬧ gq$8՝c<k_ČP6 96cfW; rܡv>qboofYXṿ>D;X1N VRC{ UI;9AHZA򞩿µd^bŭ q\Mx[]y!0gGx`:GxT~oa g?U<3 5ʺTI=m Rʖ-;)@7p>Uګ^Ai(wDq|o/傼}υ0GuS+_>2~C"K,%=߰I"3ݓ\LGZH?WYߍD05l(WZF,(+3VOHWLԺ2f,ŏ @/H`q873-~}AӅ'tMI\zgJ?5l17R pOCӸSK7*>Ê;%ҟ_ds\2%ZLj е Bm{ȶH /ew ^B‹A+ ls y L:7 S< f:SE9@蒛SR)R;hIW.qsldO1eܼ^1Bf-3͈6KNK9Ł1 YXFШ$KEaaa0+C*ֆe2+JRqFi v++_@jo[:t;>2:er &z'3R>4)FqD !x+שu[Ao6\VLHGG@ؓ'{%CMٹO 說kQ`d-[KcukťkLGkI(JsCK3B9JƓ/o=?mZُ{T.x&G'@C?kٜC*>cLSsRi{Gۚ|:"JQ>wXjƵ__lj߲d9sW}/ Nwu R> ?ڬgR/ R02oi튍?z8oHM45$gsJ߸SMV6xnM?w+dٜez 0̀Z -}TCI':g9e|1L<6Y`XzfXzn6frIǘZ\RR͘ Tc[b.ۮFT}c~Z2o#RC Qq !;-d˕NinxXoĻ<~r-q :ƿ>M2 3YC:ފ2:\i_c( d~i =HWr4 - <3Vȕvaq)|q]@l 2fyС kIrxxP_G*φrE n{]VވB4w?ZqG7l}eA\O;r!B2]̅Av2&g.lMg=\F1Umi0QeӀ)$GBhtFÄQM/ <5+W(AxƵ4 ²rIXW-p\!F֒ۅB/}Y&5fh|h<ӓ9K}hihDs=1ijqɭ&#I-kC3ߓ,)ZJ6"0N'= `gV"Jqnn{$J|B׺,rQ6ߥ =SF;M[֎';r'V#<$-՘/xi$l?S;Vn&IUFyA.aZ!dLz=N&Qݒ TV<F\O}il#%S-W ZzޥVNg=9]'*~J*O#*i(n͸D)Y0v;-Nq[Umg/|+Y[U\6"BDV$ #/eJ5ZNJa PlV,.SZ=Z.1em>(.[ ܆S\syOC9@,l*P B!H031e~Jby|q¹$O3ﰳǮxV{ b}eґU0Ʊl%RbLvo.'%n-ffW!)8qg+Pxѹ`Um@THfZqam.E<2Y=Z- s6eAVݫ^KrJ!s_ XQ߄&ԌCz v:]߈FuY1LxbWӔ( K Fw w(qhT_tW #qLa{ >;ýy&_(eHQarV<JxJD Fp+iU>gX-ayn+!LvaS]N'0w PпSY8SXd=OMZp a hwIdn^-jo8ZBM4=䦒ڬ<5LvcZo2B4$.?w*^{&^ zE()pf;eVӣxtPO,E7P7 jM\ z'wR5%2?+dz7+W>8lZ>ZIE+dpi~\H$_ykܧY'-UKg`.A4ᚎM`_xF;b.N5ڳ@+\(rD"5nTgJh.1>u:5"@;ix87|wM#UsZۆ+Igأ PX%C2\R2qc@)X_f Y]wuY*)| RsOW6mja*$.?E_)ltw*^n5Odh ):p 79ډs70qfu2F&wR&$Ya>PB>"{1*ȊRN0[j'q)M(tFh 3\߸WŸu8EU C 5ݡ="u: YIh1{@xC5zF ᾶy GBsq40⣣ډ}Rc\^lC5x?vy?Yqbmu^F$TN6\;@9ahG"?%I6|G̸j`GRUa̓QUT,8yːFv#H[~`(X oɛoip*#aGzDdB 625+GyC# vaÔ>.k(e¸jh|7c=S_R JǸΚ|Fy7xa%})d_%ڠ iϒ-˛ )4Y~^dJGQZNM~nJ[쿯Zu˦2Sԃo#.xNH=Whd Y}L~9:Ym3#bǧ7WĻ_Ab>?`%ĴY~=nO`ߧyY{w|їTAS!.=j9I`E"R2lNxm8خG_nF@K?vm"iUN_Ňy|!4"RA[3}!K^{/굟s aNA LbPM1ӻSx_atۦ-EZT~!zԠ8`ہR|#a00x<P>a0f(~[s]SHMc]bW\q)xVvX.N<Xsv&2AͫBTr%&+5x-nWZbgWB,"Jo:iЃ bНRB?ȓI.:"6&v,h*WXx\bo2YEN?%XYcRI:d _?d`mB(QIo|Ø0]tX"(1兿*rhEr!`b\D!CpGSJR?eޫ_ "6ɾ EgR ni5$V:hN#ӵiޚH7aG:Ji2f ɓl3hot[3W* ('ƍ1M[[t{/[o}ZJ8Ur~s5IJ?J$bYoL:/mL_&rPtb#Ňv'%n%IKB\loUW`Qw6E: B:daz@*klXqVeD:' t(;m[E0EjPװY,,6IR2,IJ/Ȧ9m6I ) g90 wD/tdLR geKf+I*]|PL?8̗ kieQ72;jO(5Y83+èGf30ҧ\A {#o7>͌ C{cx5ц:o:*,vCBۢ:HkE0DzL\JwBDC-nZ?R^{V|G.^Wq۰h Te]]8߀$ T#2i2ĭ,~$w>{v)<( `u 7|ĆYY2idxJufǷ/iΥt mJxe N$T(5*f]3-n.^ L],aގ(}8GX嵻FD(&{}hǁwWgWqgd=ژU&!-oaM§R2{辯;9q4;]бC14۸J-~fȫ1.@/A&%ћ##@6թX#G[ QJjn)/ǗO/t a2 iM-O¾*Z2l FcIJ5[޹Why3Kh*Iw4}_zǝ=ڕJ"޷oIl%@^ҀkaunPBӑ(=0v9JJ?Msz_%Emn}11P.C:`A6fOO{,1$UA P<WzQyxl'9"oR_}tع#ħdvyG=ZP.io>)0>P7}R=Ɔ]|^{e+ s\ dqх czŖjڊ7nMۦ  u ޞ"ܤU%U8M !{ȸw J -3;Z-V>$QvhC|N кԝ5fLh5\Zʦ(ӕd1 bf7&<vV t,b4'%d+a ==퐇\W9nDu$}7ey%&bC w=u>i F>a= {9o[(6h 1字#㘻Gì]qJJ?wZl5~Fʺ CZI)3oZ1#-9خL&Ak# Ͽ g&bi0$`LA|޼[;FNBL sm۰eèθ}!Z9^u9פ&=b0E^,cAZp3 ]2.cg 䪠T&Ȭxt F',5\ۖ+<]wO?!HVgJh߹:[ X cǸX?&Y6\^Sͪ&uK>lDѢo-~ hɎF08n@׀:=byb pVI2geUH\rȸ%[z+cxRBj<k* xݡYڔqDʳhzc0MlM IŇfclT-&4S6Qԝ3lpQ<:ad\gYs<"]@Dj樚xp˺d! %J &tL3c[鮫G6/m8%46Mڪ~mÁ:V7#+\yˍrûDTM M&VKgV6{.^`[#l$Eϻky׿.ТYو9q=b z-pT83(SK5H-V/哟 d«£)ۼU=NAkO4#F}{N;Y@eH7PwH>B>Ͷ[7x#CԖR'2W4VM޿sמD6npݬ^%G1)VwS&v'z5[{\HB>E fvPƾXdG Yl!?_@ #!V,&T4ho0eޱs|KB_#62-3-i: \5bʲa,QI_HH΀TDqG͂'R|}("괺uMBȯy1V2*ShCF P%,ceQcU}u c,! dsKʾnuw*?)a@YФD=xGB{+\CV O]oEK.KM)ES DۿT9Eb6؅(=| яIV Zʳ)Ŧ O%05ZPX7ĪDN>@k3@KFzM'[ 1G6y*~9`R5!`DܺSe9Xar_'ZߍK݈99˜?rIr 0l / p|6X)'SW]^I&+|LQ]_3́mLsJ$HI0*x,z(Oj̤5J@ #\4b;j<T* (m Y;¸|+폝,T k8쒫jQǧ~ٛۯTa@W%%<Þlu ;ke =.ހêzDjA*PFlq8?rV뗇3dc-er%X #r|æ: 7iY(I!Y\7JD5]8'۵\ _fOep׫J%]8JSb9 WX >/H6HkmO߂Yb D؃r0DʜFof D6\.j&;o÷վ;l$y(9`2&?"?܃ʪxpLHЭbVtsηs b:u<>jT% )~]fV[V-s {T4uUQ~>;NSiI(v}f*W\eh=ϣQprXSwS9 g]ց icns.KV{QV3lMT{]`N &?[Cg[ }\7y2BL#vgӅߛ]>ެKW`dKY2fMǪ~4Ccd08v( HњJ/wc&VR$BrRHϛ.D_C(c7[e >_hP2rVdHB @?sRnBw]eہ@U]#ěa+go%/9ɞR=}lzd 2s$dd:)q~+6pVLPlQd'`共ݶ30ڃ٣a.`t\LHdؐx qo[,5 EEDm4+ˍJWW1E>:,=ɪt.9Ľ~bd<0RL]73c 35*Ui!!9,y2tDn9nSve;+nGKȑn.UPc47)] '*.?WO6PRR_|+4ʸ9nIǚi}+3W#zC'/ 5 5S {y)ѕt:>z"PcKKWm⛳ ,%a:"?U060 'f;E3t?O@ l. ҿSHPrF:8iBp8'X6!d`+m:B]Jw?ZҸ53x7f>`Pd`NMV汍l -lf/Rɮkvtאt 3UipP<= T+& Js0ψ1(G#+s_ö>b>Az6%E!Xsuk#rCIh4l,&y\꿍8y.{Pxb҉f)q%:aaZU[33I| _}]F? DdKq fƓcsKA>7[R:ފ& 칰(,_Hr{‰ZBM a>3ʴC[1W&nŒ^;?ɚwP_vJ`krVeM hF K\͓0,r|1t.K?;K~5wmny' @S/UۏCl\QBv!Ks.ɂCX:5 +] IddԺn+K!jg ߏHÅdb?#% kOťVg)c~d_Or, >:0lcq0*CҎez:}Ùh{:\Mp !놰q~ʕ&%~}k}'S3xh,>t*;´ YTV~Gz%!;E-xf9SƢ ,b쬽c:b| s{>b, (_8/Tb_gKc_dVD3{,ѭi㢤T>UY;"?sG/1q& sQMP=a. -c'qeUq`XYU]J:j>yWfu3[BԹ$,fb_[z:LM@ObHSڻkeh:c)$$1<y}, Ig×d"p%r7v*J|{m4// 8-1 v`!a̝0wCcPk S5;mP""kSF]!h87ιE|x>$2a. vwl>ݗ”ti@f~d2-ޚC9澶U8E|Ss{\ݐb=g1\( rQ5l*>+rDȾ*f$E{S@!Yf4JiZƩnb|K"[/֏569Wy0Rw*6f;ʾdѴ{ 4*ͻp(8] Ʀ J>sf9.d!o%Lv{}?g.r:wS0aPԝ!6SvcޏXad$2ns/ s2愹R|X E.jO+5;TݯO7>j`W^(۔ 'UܮWarRwk^ -冯0_!>;3!Qۅ:?)^VG!spU>0;sχEqqZ@7"2'~tO[(*Jۈ?Zr%bp1Ќ4"E/vx$IO'PQ[|7| |h@W+*&XǾGELfڶc1,LV^'O[=_ě_GO0xnc(A CUnSŧ(˾;VltQOMk.Y/E&j3Gkx~va ೃQ6<[%EUYH"BbD"ZW6ayY1?7Cn : L8Yy"]y2e#+{HqBkq|&ɶڈj;~, (Kʹn>o6Jp9Sb\ʴGd#ym˱'# NJ'M7Q(FsuɅu+iyFT+IBSn %b~@z^ 4U;g\눵a#7pӌos&mD EM.螫I`g ೞc3nIeם^rQ/ /=Aϓ v_t[z9 D@|F7QMTCN0s<6p?a,'B}Uu_! r7NYb8z: 0W2RxR#CuK~T/P2P)]&[ϖueCb yFN޼r/1u,#3k{J͐0ԏ)u6񻂜ut UpF;kibNr#)P[b#;J2M/a_)!JC Ęg/ỎV%-X-ܨPJK'sܛ;<+Nw~bT=^Wݥh LgmB A`XtyBer=EubI8_21imrͩHhNm~t [ Z=P'eUC8e+Ƀ͗ZYU0Q Q&Cm6 H*'1 ٣} ]u-teC{"!zSY JmYZkJ 7V5l$@SP gMlbo^=f1s-1niɲiSm58 hjRԟ\S#Ғp>53"%l\L;) : `R f,-^'9L÷F2.Zl 9{v3 = 6`|5?g@ni ZG|V7+Ӿ&Ŧiuu6^81S@~HOA3V|rŧv<9j.b#qJW]]y>]D}dN{.G.~`Qqzol"IVbuW-b)eIUH>MlSSCV*֐g?cJ'|v$)y+Kͪ=Y;bS,K +R3C^` ث;$X/Lf!ީ/ `=V@MLg?m,"PTC\o}3nHwVWY^ӎE/+XAt}7*ND+ITQga23rKZSԞ؎#X,HUȖֱCd0k=.%m h@^h}WCDdW;<hS9dLjV"ssv}MucB{ְK?>quMZƸHTC48J5'Ǚȷσ>;)@߀R H~LY.U 5_ϳVN"G"٢JQwBz35TS2ݥ cH3[OCsx*龃9[uaZgƸa e/Fub2E qT->ЗE=O:⁰R%B 3&YQS,m ',?~KQ˥8OI'I4vf,(.-(DSC5JU8<7|%R N>I?jAI_(Cij>iZ&cmqxhPN0:ogxԅPYHQu+6`7D @3(סdfuB MIk/t&ue,K#οfFs"q ]:&#s2$$! $fNd<-(,2j=ػr^rDyC9q8ؐ#O&w֋Y֡g] eĩ̤50c;>Ct?D2IM6B9S|pƂ BKmF(da){fJQVd#ő:[=+Y\Z.pYrE%0j!fqDJOݯ¢%  ~* RX'OK3-׳E#ϟnJ+uצ4;guh #h,w u k­.#Ҥ9[giX15Xj=Zz 6v0v~#TPwX%*،g8jR)AXd4"% -W`$DZ׎Ȋ0(tʱ]v v4]eF7M֪_mVM`SPVUyd(u+VQEm%齑&ٶqx_xG:5a*р' DT,Ю=o]0ߐ5ٝRO8b:zGmC5lQZN,i'CM LUc'N'IשOEdA:Q\!6?:3f0y@1&TWE/򳱕dTZ݈Ɗu0G|FB B < sZ>U6Om4q UH3b`{׭S#9<9! s'jZH ך;{03Rmym)%8;ST%]pC Kj fg\.A?gEhlŦRJ O}"eweuC*x [R4!NJR`-0Eqi/:w& 1O^٨'T~{ٸ%`+̻]["&U,nUϚ=}E4 UBzIX"8"[$qo'hPRbwET1/?QJ {|fG8ĭ- ~NY:Z;2E1=QQ?EgIB,eVo2u+MJ.7 O:R]Fы N^iVߏO;g:KA5 Ä T/uhA3s!X7bfZ(A`V! OQt5ݣ,Mղ;.vܧmQ<4-9)7ߚf->ua)|Ը͍`k#1oKQ&ӗ5SJKB]׬Ip[tFȋW0 1Ѵk2aHGg^Gx~` {)^MY-49d)1,̋X{m8/Ab=[Œr=8Z13o x//3JQhzV KuHx,ׯ:Dv"y~IQkxPxg/N?A2.;LCZ BҰ> PN+#0<ugvIfmz7Vx%a{Ad -5ߊ*Ba6w @^ʴ2b" O? 5)erryIdxUΦNL{b:cjegd&| QYxkOKISbj 5{/uNJ 螽5΄H#:,zfĎt ͱS^iilu}ۜ}Ce'6mfysU%LxvgKf@,d(OtvRn8 ;-Irxt{ ,)/Ρo/(6"C;tXyG?@3 A,툽 l*nk}`Eܢ $Mxg7UVf'#u'f@D8$ vUD#ӯ;qhtY^ζ۾ _r)lKq\{C͞jagDBoSK-#Zõp8{m\# nj\.@_À^FxzCH/iwY08mzAg&}7U(4j87R1ƌ0b1)RYMHl5&IvD5f#}LओG`^x5 >g-`H_Q}[TЛ`!6$y~)@D&U5~H1Fnӕ( >UDYB!^D'v @!R\di#/7U) d}߬ˈ^$5,>.[4)UKsY l9Z21yHo即fOy֒jMJ* _ϗ;?l%>5JkHL]4``vic"Pr鳹񎾏UZGPbͳOkӆ$AaW{i 1zR.= ۶^*[#EVʝ+k kcY'wˌ/2stS*JS_0->X2owU6oNOo $$VzЍ~'#Lg kc@:nJڏr%^) .'wQ^Vd M!@^unzV=x'uwYUPJ qa~gxeA>i10^ؤ0^ ;*$sz/C|!#)6GmgfDzy*N\O9R-W'e&N?\o9)QT,~~M=ӤXiN19J9_c ;~ /unU:xoyEI=‹RMr? ۴2JpY8̠\?K?j{3yϾī%ܜ:`OJH(k~@)FC/ghYk *-<oxd.c7e H xh'b2Tad~I=ZD'<17V w)d8u*{oD]h ٘{Gv~O]*g[|I ;˔.r&lz]]FE@<>Gٿ!VjcS S\]omDLȼ8'AsrTI:lPy]YJR iDQ)}r!ʜ {HWI "REXάJqp*;'p!x@a@ ܿ65%¢kUH LgaS[򣆰8}acXT^L{Tˎ%oRb+{>4s)΃ $ 3 G֔{tbtkұod"L>D^ Wu;*/ m3gކ|'\էwE cz7dƕ^:[__ {c˂B홭ek'`8]+  9]%ݩvЈ5v٨Xn]z.e܆` cx:ylU4nTq5c .4]?mlB:n&ۺ2o `YcpVv#jjz}"Ǩpg -B}Z9aA"6x19 jFǎ=}yl_C㏨91 ('^u >5!U'>KH+C6 bt{nQW{9t={v׏5W@烺[#  2KfOD/SyQQ9C! R&I@xݮJ)^7ެT*sg_͊Qy\o@3cB0wOjpe: {2gWƙ=֯5>>u`1n VMu#`5C6l>O"۫JJ%iII/ vS.Bn®>Vl!-T;*$h;S9(DR0}D"V$0bF+r)6!e4J3w]Vw_9$vIjY6+cTŀRs'=cZPRTHT}  pdi9 Dy\X72ba @f+D}q "{L%UxzK C{9Z 8Цkg}`YJc~.2]38mԿPZ;d3GBt v?W.ӳ ,inK[d͞ Yn'ʯ{2ցFE <](0$s23!5E\Sd XPz=!ttFZJUs.ztgkRxkv!ubIM8YP(c41(.μdn)=~zdsn[$!r". P%scýЋ+óω9}`7Nfeve$8:\q1NMhP . @.$dR{A/{ ޴3 1Ldu!}3e+ <>D<[AR^k815vt/4 ?뀛3> ,f4%jN| B! =oh[Bpk)GHKKiÉYT)H.w@n, {o&uݶ$ϳ+/j}ϵ3 ^S*Z֜~Z\`,>պS3?Qo)_<$h44[Dvj2B/}RH $ ócB)մ㿷<6U'ᦴ'9TÀ':^S-xQi =xN 4-탻RuK! Fń(3"~3"Ihi行Ӫf[O1+z=qWL+Da7T.8~l~S{n5YEKa(_I6E|SHU&%PXbSYlKD.횕Ra)zYh_ّ5c.ϊ;#1i&?:[KEht#c@1u03 ^c*`mxG'OkDPL=p{D .rڶ[,Hmׁ$MuYP & %ZT_W k*?=U|רL lA,":4?5D1rAE\* R,&bu%/? [@I8Z:K 5ɺZ<"=WpQZVoXL}ݪqU!ѝ>APoǓr鈿X a5VJ7M3Fay2,r{Q8}נed8&_~=As?G xK/H#~*r_PxW/B;V$yB)'"- 9gxs"乛I>}YxṱMtgFM&UP̨a> (MtNtaRfuaإsB/HO2hЎQ `iez}<C @t7R+b2f`O _Ttx rgQbg|)g{8&tY6q*q/HcIlpYu̥  Mȓ) M Ǖf-!&8KjnR;r/\x;H7ɢ"[`b_`c`cC+;V%#\_=fVY4qB)?)Z$4Fk}S=lrbh2dh6tvgn׻nCg6`%D-ĝ8eb_d릕,~IKm("h1v%^ hw_%hQ.&Sjˎ$u&)ѓ %qW 2+ N{ j C—"hsOy7A{̘eA\? \hґWʌASdGDb|ʥ٧@E[$ctS9,zt\]jS Gz$ⴚ j )uC<3ʇϓ ]o3 .Hj 9 >\7LdLdksE}:s2!L$7Zm;Q6 .HyE%`oJNyqe덅]huŇjOzdON'sfs^m4UV"ԶP*S?W>(V฿%kUZf5W,Gs"rZ힏_;a"e(֝ 27H(8 ]N4l0S ڢ,-Lc*XKOpv'8XV9'ϹKZJ)>TT R`v^A{{V sϢ>2E%I˄t?` qq6&/A).͘[TJ eDIzEsXs,sfݏi]|F{Jc~WСz`m)5ֹoN]3QH 癋8tO @z>`GzY >Nط% o8[}7hK|ՅV@ a\A3Z$C4ZZB?L\2t&gf+NƢ&mکی{^"l1rue_=pwG]=@=tjokl"gPrBt(9Jw!6 vrZ,kj)5(P?Y!LqE P,iY"E,Ka Dq ?7d I$cNGO~'\jp:{ R X%Ҭܗ$*pc^bm>~U{J Wͻ'4z25 X}B lx 6kku例 ,,qqe)ͥwOzBZ,Yzs뀄H-dj &5ŢsLJ'8hvT `fN!~eV&-Gw| ؉{h\^=}.Wulf_.tW@y`Y+>B N)RCvޥprPQᤤv$&wH(D%)qod&^Wƒsˬ*^º +ALw7G0A.p?OGT&5-F,_qrA TSvb!>^,jZZ OFpmEP 4FH8{Et}25m㩇GvUhv?B E7{),ǎߍ&j.˂W/dU7"F*{U 9k9D9;PC%VeGlr9I<;ãKU1;Zy+ "26 {'ۉFBeNF?q( _7޺M‹%h}F+ r*F<//# %zQ`qG(Dd{.4"O[!I |k[ n֏z-k ҩȏ( UfGFStEY0PB0 )40J r6R0_yÄӁ[\QAnw6c+1 ]h ܳ Kl/tua|fˆ~,l"U1+E#9GSȡ # /%ܞ$Q#{6*qw>8FR)ˤ$D x_4dGΝ9T=fe-CS 8;pB5dq[H_SX]˲tN|S9G`Ao0£^.*i,ކy"َ7li({ dZTuķ=~e5 ac¡%Z=+7-oS⅂R0گ\4@BS/3 ̍,|܌tU* ȮI{ ! xZYg)yI.3Ae48ReMK7yTsDÐ9xfwMw[{FLUhks 7ƻSd'Z|Wf3^[[`J~TqJ M/f X!'aҤ>-m݅(AIF}ghٿM_UsIk̀ӨCW'n$>"EKN.=g(^?_1c>f9.9d;cq /KbQm&?CMsP>V8k)& sW\\"C &@qp5p:_io ؁9Yhq'_R ULJRФO ;*M.Tu{˯S]E[[z'򛲎rjU3|.ؒ8l?fȭM(>"iTl*Cvk-(Ak(HedAxӄHSW EtEE ɒG?vOFxxsRbkŁ-}ƣDxaN.*CZCt0JG86rD@?e#𙛭kg&:*t̿,u4gLp> e?/h@yh$`u,+Zݘxv#4GT6ۆ8@wFtK$Yrwtj1{`r$0=$w"ķ#l^Zn{d֗Np=zRyb(DvV*YŰ-ȵ$_#!t5 y8o?,g"-"gpŜxc2`R#ިqzԹ6Q'UzA4 } 6g *$3 D%?U5G%["L6-}E!ӱa}%7=kdf̴C`FBɗ^ZALK]ǡSNga8hs"qE1#Ȼ̶(("IGELv$Ӹfd8ikkŁ[Rmn.2KD=NŽГhDRbMh e[*϶ZjVjNX^zk7w>w{![),#}kh/ {&Rpo)Lex,2sk9]4.%MhGRDS" p̙w5Owt5slv LmB*Gv]#tyTNTK@rJC( ("#qN N+gv7~ -vv)gsR%Yݸx8JoR{>)ϖocx-~ޣ~킔ٔsÿ%x-79JT7{)hˇLB6)Gܸ7gga n䪬 9PuJ 9F*"HK I[^Iey{sؓW:kEd'Wx9%Y Q_Qܵ$t%ACr{$ؤb EmpK0OpXZ(+m6G@N6# , DJ+g +{"`vԹ)x't*-aֹ-Pڪ;\?z~Ƕ@,8^n'@4~:aG&A3 l2u#Ȋ5Qx"0 lON/@C)m\OYޕ$Gtr5I\@dleY%P-RJ`- z`@Ԟ.y_υ*1iSm}ޯrF]47q8"蜞Jl9lJnOiAi]}PZuAVBX.ͭElηsD 9I&P j6_n==2\%AyeV [XK̐˝!q܊,e: D'톷=>1$ڄ]VS뜘-[5?C}cA:f3ڈ9-ޚV-9@YD$)0|{+3{^Z꟧:GGEF7 ͌,Ar{3~I.)>ll,K-sC?CGxxlo¥,u,>6 bEo7ֲ 4bo[*|_V&>,?5!^>҂i0I[gWA`ryROhZwPeԩ]ÎO= 5tQ`K&= }RAPQAI HpSz 2[ ⽁&җ7,c}RT%Jh$^J&-5W{:@oh^A>@3c{Az"A菲X0 #䙵Im'" ښ c V#?ȸ{=+] ;pڪ">, Mr,0sED d%F1eMB~ӌ|I؞&_ySRިƀ 0f*@R5VV)$A+:'sC;td{r*1s)YĮ0NANÑiHq.J\ɪᢏTp z@sJը!}Bl>HPhW՞. /caaRxR$Q\%U{pװvo Ԅ\/3iJdOIf&!Q_(LUQ%a؎s4l',אr'ڽ MP/#e<ĵ5i2Nˇr_ ho|]YSfm j!4G:㶉;WxgWOvHe^30":ҐYo<Әסzs-oӕYsl:DRgڄTSa2qk]ҵH\J*ôֆ C#^/CHo?£lg~wk=Z0Y!G KͧRۆzҴ|KIt&@n'z Ս*àtNH& ܞǶ&>MQm:ٌ}ǿ'X<7eO)43blpbr6ji'LfAtxr/x9-v*<*fS:↑ܝ*`vfC7uҞ1{F(-Kuy5K "tݎB^p7p{UҀa@vq%n..+˺4؋C'?6Ib&9Z4@u{ _{-(C&IYER6Ne!@͘\O<5fCѪ.;V!{S%kAR˕Z+n]L @|QX5ìAg >N76nEKXry'$Kqqw><  R|SM\f`a5 ⼁%yۨ[8Hd&:lG2jAC-H_-TU]XfD Eo'$v(J0yEa @7&/,B l)#wW.zۯy@;ys#ަ{g< afYClǀcF;>xՎ\L*nXK:)I VTye`\2˘(ÙhUL4lF5t;<-0h-Y5D m*bZ3mj}vǚ[rx}=A%#F@Ц։YgEr7O_` ,ºsRr'KӣAGBWo1h-ZZ,M3{}idK)pw(4rBs nȕ5ο­#q(-JgbR!>ÿ]weUO'3SBq:!dwOu&A"wmL;("~#+y1ʣEQjsWs -DwA;C}*[JfARb0Slȉ Q[+h|:MѝJ VlE,Bd5'=pD8NȷXܙ2ziHBΘ _o&K4YHC5FPbMY[95$$E oD`J(D_$^Ag3w% ˨I%ƉopGO$3& xd(9iK!nC+z8ݶq*nLQ8 9!^J]`J0#"$h(UG| SXN>1]8ӏ>>3{%[IxiT8EJ,Y9Gd0T}[;&`@hA䵘;9Wy&H"345!6涴a6㭁TPMSE*e<޹̟dZWDF,}IʰL7ƕq3",}_9s Q:.D7JrY#Pԉ9ohGp]6)bǮ* AGw5QCLMwGݴT}hiߺ*rЫ4'sj$rU -6HT~Z_s+:fEԚc]}hA>,4~f16#$dIm-0,#gw`H@+~=*_ySS>؎9UAoUh]\%\rˡLa HYAJU+ioEAO)`%ѵAۏ؄ Q$ԌL#SE3CJGCLRU;}m6t˪4oC)i~k$쓴z1g9on*WqIu FqdBq}@[kP{:s+{D!6^6n Fs0kz54=_=I,Qjaolhz; ft;cJ> MT "]̃i HХhzY5Mn$dvɇj=K$u7,m|rfX&DCl~~ Ք,q*"mar1AކB"n& y_wN ܣM/!5~Tʈ!Є|kHu\WP834yo.Q.k{Mfr6]@!IWчX>.17ЋO85zyN(uyv6v 㜭qKOyP!aH 1==̕?qs{> B(B6(5Zs&QK3A3zq@ 6R@?6?&lVP'-pp& @A6d̹r4, pi9Z= (.fcmcixĭqibFw;>TߚF{TpV}>WJks0chXp0V/1Qwڽ1:1dT|9`R i7>"iY-Qg ǺoLb=*׾JqEMx]~@ q1E*^~jiA6/9-cS {y\Wv3r|{!hD ΍k\DIZM ގG"Xj>4\&.uh:AݑcXV& Z׿P`.`iTKF/$?0@/퍟"xs|a|tHk;x]U-ҞYhUh;@R`a3GްC/fMg3/ &_ q# /wj_/UlpeX1G1GSW".|~ּqdeqw0ԻerDiS/TS3w YJ H–驃Ku\ⵅ^wK9Q4m 9)ӯK[LmbuOI 3:D+ǬgnVjʼnEU8qbHj YLrK^QZV8bbX"(`?/R)[mj= 2FV~ 2m13YR˟L^_ $M7ZԵ1?vԁPf6wR˭:˃L6o0p"g~Yz(ZD.9w! _@#$ahٖ9[ PHoJu7o2;wH":ܤkBv[ͫKCqCd?J#3U}oC:+KWmĝVf4kػ& sNkt4j"qkF8TՎmTūڀsڴ]jr LRc{1VLAqN9>fzK(LX7g*n.Vw2I6{*剴7G o8Hg>!?9e1c|[wѴd >&@tp 5M;aL'VRZ_ungŐJY.%<#0&1m9ZJF5wP*m6QVH9%rk~B{/{ϓpC>fI:^*n|}ݷ0ʝ [hvVJh5?Zo,v`sѲh\)'Cj]mc#mwSSzf10ueIxeCCF(|1fNitZ iA} ȚCWmצ渕H44%O/8 Boqj< Z(i#{xfbjfВCjr `ݴ E8DW%Qj% ̨!O>pP|=>+~m:<ЙtGVJnDL| 1bd^SOX';×Pz%R1h 0kCQN\|rlŁkw@f# Z /Hf4ͧ5?v<%ˊt(Q)39'mlP-lV=ioo&-Ķ350n3;j"[s^ݗr,+1yg#K^֍yi4%'.)FRewCK.L!\MMTgMyRh"?`&Ŗ)5W;8;me|lX%V !4PLӀ\Y)g 70&fcd>:tk^ q}SjL^ҋM!meW*C˻+q %Y3 Zmڝ~^x$)O&\FM 1wGoHx P1.6Q)a1ǯřuѕV7kSf+Ș!]x?* )g\Hxh3‡'=B@xwmm"? ]vRet%5ndI4"⟸RKW9g{3[(D ك5BjTJ .ql%3m%5| @sϴpkխJD=^}FMN~ʯڧQYe}ogJ#IK0rjւ[Q`A B?:;\G%LxG顮o~椛VbMwhzAf5YP)\)& @A.%9\ZnJp_x2TZDER`?gPv )`Â^\&U#SvA+a1gElOVMN sKoLnxF.t{s:x LUy"fEeg@{BGzĂhC4?֩c-rӬ(`s_&V<׭BõfjN3Y,c9ZiU#v3dgds!x:2 G(hlQ|/*ai6-0Cg ]&\ J2(i\\>eɓ~۲4a"TDLHo/^*1)1"h*Q*jP$ey)Ջ]4MDQ6gAe i3\⩔_Y{ՍBTV7m  KdېLr=ma+__J?8{/>ģGT.Xu,,RP OO xd+G灾ɱ9)sm~qEJed%!z*K~agCUmw偹PrRUn/ZQygD6T͘ŠG vP4M]ۂ:PRx-xfD^edIѦNȱev 6=ITD bҬ}nL:.Z(u6bPt+rѰcPJܷ9at8l$$׉)A~|_ځxkQ 9Nۜ*/D-́,.۬~9TqZ [kwr ;-,NB);<k*Brf-'br.ӡatUY=[/G[n<ZOC ukGx 3 #^ݻ;v^qw^emQޕUxsspXZx4;p 3rк⧖ %i6,\= b2zED *C<%nn8s3DuO+!9tx[ǜsv0YIy䑾[8w+qeC5w fָčE,R,x\G / ܚ 1&;S4l2 = R W쵗WlZLבYɛ!5~LA;S}.=r`Ȫz]kMsL&S6ti!~/!9zMnLBHސìnѿDcIob>KY*K?vZGe^Y@ah_r7O6n]o++#V Akdc;e;vAQë\c*UǴFmus姧|?-l;> ȯǽ@Y/,kѠȽo3d$Qe!_*_P܎љ$"U_6J_I%W[&/LMqBHBPG.vHUűrޡmT$Ohz/q,v2j ;a?r;./2}WFz^0~'|GԳLHݡS[ ]6cmYhTED/qͬ$9>+b\!(ue 'sRaz % =Lj`:~)ae, 0)639+0ci]([!ڵr|K0 5:a;Z+#ËY@jRQe(uRw񇉟^r-KpvS[7_}#|>/[Qr/*7 ^#ԃ9> 䴎ϭY4Pl,\L.T N`D#i|=LKunۓ?Kmcn5TS9*)}iƼӪb0ԱծYIKM,ޥlL{\Fc,U2ٓ[xYsRx|\`,6oݜpg"H% MDFFoeʗ(f5>r#uJdUDk6i0LYd/0HLAm+˾X8!9XEhj;4򰟠 ߋ[㥻h2C6؜<$F"^P>y1?Ex?bڼXpEj$Lhv#;V@Xx_cNVԸ.qk5VEY/~QN/ҽ"nK5}TVLAfJh2Qpv0 d:"P,y'̶gzB613>:V`e]ĹT QĢlO[}cH?Rd \1< Z,Pf;1ƴdf jH@%;3i)ݘt~l0[iiLIi9Nt~Ćv* U6clyt=NEqP} }tP70Tb ɏeg7CunZmIJ/s~mL~L\3V҅HP73sf [Ko+\vUHBV4 2ikxR>Ƈ'90MV,kڰɿqc`lu;ۼM(Q5ϫFH Y璠;Ү4x׼sRlc[]a[*f>I=폂nv09t6w:?~"F NТ`Xf<sHz [:\rީv@)p[b~ LRi[^sĐ4">3$߇ԏo6η hʸy,Hw 18Ҏi2*Ǣ 7zuOD-uYUV0; n?Bs %>eu rˌ4?1БV(MŶS1}̍ʊa3Ck`ų?n|}g*&_qDH.3ղMqk1f0!)&XЈ³ MfTzXqtF3|5KKe5 a{f*eH,>$B7_0TF>NN&;b``= B )P`Np{n/]x4+iGMN6pE 嚼{H_N,zMӶ>hPiБU 2g U]vmx:Ӭrnrg詀\8~o_5P*U"@f EʬoLƱzu,+04L}pdm #;%#pn{,r8T[Pg3v`$q]csD`xVǙߞbubRKO"(<ƃPD(b= ;X^I'PL? -Jg=(y/_"(ΰ6mNc!\g9G?· iADp l :c?Q©cl5`G5YvRhX0 P#qCx5`X˞80!`0-IHri?ן. ^X=7t)UjW{ZV`rve.=z^\$!m/6y#$uV=.}HA 셗}p}-* VJB4ql{=On\bʟK?k'f .}1;+y;zF5; ԥᦑ ^,ۚ'1.VØ &_kH/1!Lgt+l ̅\ˏ-czbkQ}`)J.0"P9~)~je lvs~\IE#{Eb&q\uQ`&%dGX~O~5k1zn X7 T*zGO { حoJO F[ LƢƁ}=s!TDҿ*F z]>Vcf\>kAx)\x"6m&; >ibDAo!cSr@c]#CnҫAW'Ofmlq@AΉB'WJ9vc0-캦ݦHE!6##U$ϔSdy⯱䅾'!YdwaNƃh"+B)΃3wcWz9HĉfvjFWQ;ЁϢEo$/_ͨSDŠYl兮(92gN'DгB|8\QusNQ %Mz`? BAɥVɎh+bi*mGGS&be E)!ZvS?>1߇.s ~imdA6Ɵ2"rlFY|ӜVfP-!SYֿҕ=1"웦 AX #+xV@֓mh\~9)a-b)/14^GC/XCcŒ56`bɋhqMOD&d^Pa2 gZqrq 8tgAە}|d,q9;^. Hf9k ei)cggRN|Oԟzs%4 LvAͩzKɘ+<2,8/pw'h%2 |~V>A] cG{6>0iA,:A9{I3YlѷkwWNY\u0Zx5PlNr`\)ÃG No%9c/{ \OnF'_ ԣ8Iahk)6z7:*۪xSr=!c@vpW9R"-Ha5{u!ϥd }"Ų8e[asp|F|YBWio+1Vu ?kFImDX)@TcՋ>Ltƺil+_x1UX8+7cK%:0W;RK)7̌z ʼnyOe<;_M[ܒiAt7>~Af=KT`'6jV|vf{ud~qDS-ŀ2c& JԵhh n809fY?&8rf0޼{v'}JMMb?Dak+xQb 7Zn7ޛ Rp#C(s$iHp-"LiN+yT:KlTOm2..vuƢqn'q@0Qsx!gc}3?]lvKf`sDG_@pJt_12b1|̡coRHqɨrhf2q:Ss"+̮$* BĽ.M4xD=nKx_Qo 휇Z-? 4Fy=U x]LM\gCs9{;?Dv/ ߨêx$4sRZi>N 'C>_t9rA'X|:ǵD98 X[䲛26IH[.nlO)ީIz\!{(kTMIkDIR|26A^/SNirj00T#^yC1-']_}HqbDfF7.TtzЂ&;dޏ3P&Α-pܸ;['v,5u3bpƺ/^.!߫] =ݹ 4ٯ0Uc8@YWFtS42zҚk{-XpڝsDZєoͩ~RU`=rƏt1kMRUWu̝,up*T0wIQy4 j'/fF L')sFݛu"Z~Au5@\6 Ro !bQ7d܂tӻ^,|:&jr,w&sL~D jeJqέSsک`'8`x!<7шmc<P_[XY3_{l=r|^@FPK@{i̾WnYL7Led b B"5oZZ9WH>P_~ht3=Rq4o%T>.7%F75nR&'f,sy9fٱǜ.{Ek*m;kpbQ.@ȪEn:akͥ4n=n& H3% Å siBLpFlhH9>;&; +ޓv~j*\ Wge M%7{nNuKk$,F*Ɠ| BLij `ofpIpFv\ gJr2d)XnEZ o)n|,&uJwo\oDقl p2^no]( )^F)ⓄJlwlӉJa[j1$A4qP!iPC6FڶۮprGqp ٙ'.p~œ{-Gl64, p. /&< ~Ix,90!{(q/"XSbU,f0GXIsFҦvd*]g  Lw% 1D pX+w;Hq5t1%p>.= Ks&8kSdD8*y4n~T5Y[F2ߜ<̝Kq,=R!'\C22QhF!HExTo&_ oQV CcaҞZ$0ࣤ 6#N/NԷ~L1(aKxX\怺ANCUKf=E+Nz#qN)KZKY1w1E;pWb0U۶йxRKGw?^5;mkpQ[uR26$np$I_Oda:dVt0iE v=hEIƍ' _id0Yt}tJ+,%}?h(SFjbN)3&eb0+,g#1 (ax Z RG=OiMO ߁sc'gqLN7nLps| 6XQC-vNqL`,9gFU%iZȐΉà*5qp7z/%hVN zB(-hjLI9mW Aʟ" A{u(ٻM[8.e*ߠ-Z(/\mHIՀ<2tcWIK>c caOhφ9D΄$̛3|@꧁A2lri g *.Hh˪Cckm>im NjՆuV&^ånDa_T6lP>TY~Hۡ~eL p4tpԿ JA{ϊŏl4퇌UF 2 ȑI.M-K'uz^ǜ|(ȴi8!*\qhC"!{Jѧ,>Yec<<{Y@qߛȟtwR8c& U$`4ʪ|M-+UNKU[Ag/".)GL.USHWkڕh\*&~? 0Fd-C 8\^wQYǤU֕G١љa@XOtsDJm5Vn i1^TyLڧQqMy P!W]iˢx[y\L2I|k,\x99ri7md`u@b_p y)Fa!޿L~EaLxha)Jq&wUřη@q7"DYnIb$ť}9WHCUx^rp=~}lp_㟠IV۟Äv pϠ>(UQ}]4 lU8ȎaV]hҲ^aǣH2oAi>SݙgGH pznε;'b^4(g"h>b7Jg~ wF(%ޫQfՕP崧]:6u$aQ`ɦ\"NHVk4~I)m,?AhٯPw#|B\cB^>g@9QGxfx.ujØ^ޙaT6f(跭 ZucyiNC_n|W)U_hPlQ{潻ō"':.cFByiD-?C2<.8#YEkx \%FIh?An, 58_3#A1Z:Oh/u.u^q;=lupNu6>WAVlcno$ZQgdXVLٵ΀хkHsՌ,Vkd.eN'ɧ9G3u+9(#8 - P Z!=@LfJW靳! U^sx\ # A^Y_b!Gd 큓ICo>>_悌PV; ]SX9iZ 9:jGݤK8|UQgFS~x9uH߿s`hV~92Rh}fg_[ /6V<$LNYJ:/m˜~&Z9=_-k 㟜ojEjXi_ז*hZ-j?mF[:d1K 3,Ԗkq&3gJ{yܷ{TrT5uL?x])CОce:t:EϺ8(ݔsS!YXFi@pí(->0 YZgstat/data/wind.rda0000644000176200001440000030020614750415432013744 0ustar liggesusersBZh91AY&SYXBƱmIr[vw5_Pj<zCB%HJ@>hAT@QPtR#)@}PDTTτx4ZUJDH'pA$E/́pHY$Ul\fҬMa. HWg@}!%>>|@(U? QQИCb4`AFL!M1 4&T IELyOOH&i2 bb#LzMd` FTAI$&F3Pe6FM4iѠhd44 OH*zS?RzID A=@  CF~IcFOb2$iLҞ14ʏQO!ȢCL':^:{pvPoU.\'[~A?wAhcӭki(k4vH.YxL۶3j;RR^+tB\ iam^@Nj73[%׆{_reXq{Q8cĺv7s XsNKJ .jXV6 :9QQ9L[#ilCa= goEmGO5Dƾ\Gdz}G?I{1|:FUs}b*|NO^#z 3 gDv ^bcmwa6p!3b{geB XFg3cѐ~(xte&UP~.º.+b0er 1i %7^)׳+n5%qpa >Nqű蠍*, UȞ}YjK* A$ݢzcl}F6 &"d䇜A$#$^!p_lnޝ7)?TC<*؉jC͡:w:}Fv-߹ZHU^CvY/!5&?uTŽ<|9iТ7odNM3MJoפO>D$;cIiM<}ŇJ_m?C:ggmP~{^nolf꿵aīOzkM'Fxm\vusgGwx1gQ"+ϚL˴\#\X7'w;]c"KZM{@ çև.hy C_ywo6ͻjpxd޾+.:_n}:R߄v]K8vvHw*3>-;vrg#)kقy.@-D/?VāuDSnKh=6wXsk̩RCLyw}LmTLC):IR/cɳtPG#˽BI)!]"qC:]Ma%^럐n7&=;6Crp?Lh؟Btv[hBQ49X~Fwt וM_g ¬wU{lLc%uJXrhwΘ^x=e&#`y6=3>wq#KO0%܃T`c= }K4y~vm#?uߨq0(ȉnmuKc+MOg\ԌꞄyCމQ{GmE[ǧ߲=x'M*\|Uq} #߻7̠ȥѹ,7iM?.#9Ӣ5t>˜PSPբ×ca_昫SwɱbOV?;#o?=~6>qZxߌ|F{fJx[s/JS|+있I#_oN7'3.x <-7oT3]٦!d4{W履tyqĽ: x ~0tr|ȥ[`gc1QTZawT~p02  M;瞞v-s;FN ^@'Zx6r[)0##5c_oTTY$[RǤ>t)NOx\Fl 3/^ty_γNl '/τKjW]{+,@f`xt?qzOىy& ``saXwz7> v}[t:$~a?d=^B|5~3tu!nX(t<2A#m|:u}i۷C6ā=K xzn_)p~A~1^:Nߏ*:yPn- P=Ҟ?(G`pG^@Ot@$=šۤX#F~c -ߒ:@ݵY" ~ʵrz"_ U>V18Z7i \}#S`C8~LۖzO㫳U ۑȋ Ϣo_67 ڿce~ս96.b1$P82AܽJz^gxvg}DR\2XIJaD .-:[B8 .&ʓp҉V` Ąmw쮁׬4ǗI4OQug~~K^.'uM"-'G^^dom W{ mļFќy0ȍ~6Ȑ3W~e.ןye4+?cA`rNy0_SgV Lo.+uR$<^HkڟX;G}{5_/E<ӈWns^cRG9`ksP;J3(9/0$n|M;#/y(b;vd]4F>^Zݝ :)U zEV#X[~;E˚TٚGB<Io{c^CjR+j3VxM0wNF_[]W X&S `! ys0,Bl߳gAI;SKڜ3l !UFG_ۯoŷOÉnN*& JN,܈2QjuWEBT ӯC>#;bc6aKJJ` vʚB7i(r CDw/_=e}c kG x0lDA!݃L!1 I0':fH@ aA@!w2c" bڲ B v8jȃ@I08 HQ4Ȃ@!l!c~.&Q`$,ԃnT$4$HO7oB/=7*1‐P43@H^ !jB!y$/<瀐`B@H^X sĀ\$/BBGI ؒ=$$$I BBG!#HHPАމ!#P !#BGn VN];~HYC@HwO=8$ HHBW| @$!V $w?&Zf{S⾽hF AC3Fom'mVH9/r Ĉ@TDHL Z[ñ N訨e.-:2.i13¨޶̺^4qש[/ [[!@^/-WQeT"S[83Q?5dIOh5@ ҧҨ7o?^oUUfӴfTÍ?# c[9I/z|,0eoAl{NFa N2sGbp[l% _އ${PEFf( _2Nuda4^=v]p㏔ 62~Qw_m6z- oiC;m5#- gP&!g_؅]FŃS ]Vw>po _pF\ pHHZ{PШ)EkB;S]շMI: Ъ'ޠh'$0#LVTѤCIS F Ah(X̃qHkIN)Ey$wMZa)w/SVy)e&|o?Op-W94o[7^5Y. hepZuks i6b4"=X&F2X6F)2+h7Gܿmy^Ǽ}9C'wW`:^ߎ%Sz>.3cJ76MMzZ!pr7?ɔ7}b#sC2YF>ss&2-~f,,Y>>5QSN1a q@JP-.b GfB"UPMF9(iL$KxRz5"CiJAㄔ8KPCH$\@_X}|JN~_ yyG Idbhci4*Ld[9Bcu m}썎E"ɲ7*jˠA (M0EuA 撢jA!-f:iAs2/j!p ˒b 7@~A O+6Aw0 E' ŘgdD ł _{"_-yOPY踾o#-&p4!@v[OzƪNt)Dt5w&x^N8[ *J$!%44B5&{\?#%?Q}֪9ND'j2O`0#%!=Y` Ǣ|c4JB="(%Й`es)"ФĮIIYOD luRDUGh 4jka+ת洆f$bZ1(3LR.щ(A'; kV3T {Cdă]JDdˌy.S0F (j9*iW~$Xw> 8`hUxgQSZP4) ~J.-Uq:Ȗ8"T[ Y1jYiSL ]Lz L0yQQ1%ldByP&Ba{N嘅0H(H AU3` 5`E;Eq#i=hij+0\ذYJ)HM#[#XM}>h~@Z6E6ՊlZ+Dm*MVѭb66&ѶQTj-حFcQŵڍbQZlT[bضQFѭXj*"EbXƊ Ţ(%ch m5, mb5ѓ[EjQjF5Z,ƣFآ6,h1Y(ATBlZKQb(A5cZ()4U%Eb-EFKIDDi6XIRXc&(#XFhlM$6*$4E&0lV0fQAF6C VFJTEFEf0AV1DF0RJThh F1ɣEHfADY(ك"Ta1cF( lL bL`2!RQb 6&Jh( Ŋ1I#4DQfd#SL̄BRF cdˆc&A$4HA2ZRa IDQ0F[k|UV[UZUյ[[u;#M2UV­U־u[l֕mfU֬֫m-ZolB*K5dëui +1J&6oKIN6@V),$1 4fȢa!UBy*"mqMBnQSRDV(%'A I)s5YN>(MrnjĚdtfnsgM3!KX %s6ߕ2U?!H I$$(III|2$[k|Ov(uyNikŬđ6G VܕVBFHtHBG&!$4!$ lfuZ8t]u^$0! Bhuη~Eg~ǯi?3ot{Wwge׾6N'mK0nȺg:f'wO_E}~V ,v?>WjEOSI(/wȪG&?BexfCQ>A*H bc8a2ڿ,ɩ +iG+ a25_|nJ悚QxT ;99k@b&, bGt$58F:w?Xq'4ؒ{51e5$ BYp|bp5rH9^״e[&d:* |Mʉa6M^i(#h"T'80 &dzR i)Yf\&ȆU bsBr R٨7ڣ)eDR_f8p-X&)U({`SnmŬFv$"ƶlۈE5!#f1Kv=Dq^H vS|Hq#]a$c 6b%=8 dͪq*|i{j / МK^_sӉ5bTF4Z5n/J7J&Jqxep,uՊkJGq l}]C&\CejCMo\E<n%RdjcE$'z%yS)3SC8q vW5R~¬4J1 TuLDHݱsEآ'4G)+]g4zlw *c xb%†ń5vO nEdժIݜhŠդ#KHI1mW^i̤MkQ8{kI3U*AKE$Im}*peȆymYgF%\e&6o:8&Rb"d hZ-k*B"!{ Di7B@?;BJ!#qV¾iMR B{dk٬ H1|yB8'(gԸk"-s*YoA2mcLt89U2Md4hm P_çbz_hP N$)֦$KbME :ev:rjZ7`EzIXk<m0!w#爖^#iU-} c+`eĨC "CSH"`G@Z$'r Z(:1`6%n<#uG-1D e4(C6XJ} Tj,k'5jwT"A:oC{Aʤ -ZS kݸJ*ej 4"Z!̳BنY 7#Q01UuHn6J UirUjנ<[@2p#pb4+ˬ[1# hKp)N^Aʙ~"ZDل4%`NBJZkIwwX [0%a\0d2jXlk h 4>ƛJ:T=C4)%"ꠋ:SlKDʜq+v#e=͌Y8YJ`RVb_6En2ljj(s͌!Q0#X-4U2,W(2n8+Llj"Lk^TSah9,j#0d@cAR `LRJ:HA@9J@jȰ10dR:[AUz G~3 ;#ꥮsa p;jә@p0f!e3 H 4U`){|Ҳ`Em kr.H.-ƧBUvIF[H8zHW=`(AhLz "liT:ZuB *ZZ<$J!RQ 4 #旃,=jYܗE[8WfCѓQBzbeV &XkMLc̨J#lAh$(BJ:b!bO1r]4تXZ&w\PuXGj3\E/ % ܗr`zpfx /byyhY-dbi#¦)ۂģDDPCa#M!Nuo+@$.@HI.ݠIfi}+]QfliUFE-a)  4!;X)4"ZZci솯/8x,z dê0-34F:+Gf6i4ı91dh^L0d3&׊R mHBho|jHA⒱84Wlx+F dcĥUnaLL'KMЄ q 餐FG-! 2a )BH l־ǂeެċQɗDs1 aCͶ6Zg# Jw&n5@CWknb8>+|9Ve|04d]C;\ CI6ÝaFm=v|lĊoz}=%؜(.1)mx=#=)_T0`Ĕn]BN8%k䣥\ٷ]947]wJ4uP :!F LIe6*Mjmm6&mBi!\z2䮖8R\\ws;-4cj} p)ɐmnFDEmmoui0e"Lq00ERb\Yq.q@Xd y#;F(o(;vJYyn򬸵 KC( YH@r5v3tٔ 6ʑ\D[M(nDCG&Gg5E 0Đor-UٻKywΌ0E0bb޷.c>pl@\Ȝ$0T) &K&Aa.D),6gfbD97(ipB{EhvTidb UH<1S `ڪ /m8wfy.M5E{\z0X7B"\DzآkNdyᯜڗ:P%F?\Yɸs9rƗ3g`E6kT. + )Lxkc!Rt ir\Č\`vs sl Mpp'u3m*%\xM)prjE&(S^i27WiCU㻯`T(bfDSt`w7wwe1㠲Wpb(dꕸME(njY[rANw4Ls.mebȘfp˫8ٌK\op @je[U5kڼym+zt-޺No-yXy˛Wm{w9{׼ns;Ӻs^iܞwךy WGH{tcy^=ב9^d{{{s^{˲GuvO.Fzs'zD.Ε.wI޻=9(m@4e2`,LSƍ#GMe",.\7{Oyy症zfMa d&Mm˜=wwyw\ME0ILI&[)2YgI!4a!"II0[I0M _wh;ywwxZ%za,AZ ֽ/oq4Woz){?/wBRD#?GE0n4-VDM~l̪ -VwC[]>1-f_?%0KTZd2&*ș/C, i'Aj|Q1/X5:& )^sS1ԙX)\܁TH ~$g @5A\؃-pC`)D Ԇ3(2glw"`nif5#4mA>qx_l Zl7Ҩ 1ৢu*L4,wے@tc5èR>/iPoi k(5& 2*A|£GQRqw|iBEwo7@G,R ~LS xhbRHlFFIR`y+jM' uϲWi佩L\0Ҝ4m{wkz]ˍ1Y\LkV[ _µ=Ë 9]}Zq }Nrl3Ֆ"uryW|³sV#ý@.i6_:otURխnZA%o5Lyսi˗z{6TT!F6@%[$+ b4RԶih]ENIB۪&G(`Qv ` )/$OO!!s_L]]:5{'9(~Ԃ)9)Q}gq"6V @J@$QE~/4$J6H}y:T[iPd%@hR¼}똊20 ^i?2Sf꫾fa3U{Vx- gm? Y\2U2{[%#ȕ>h*$BNEn0!ԇn6ߗo:UnS0}`l0tm^ ReaaTeALyDj=PcRXuSb$fC +DF^ }`js󚴧 'O.?J׈vf :/Ys/wy"aХ X`jV\@t%. ) ۪0X\g)5IҾS͍x-{@i,Rgw~,gCuRz;iݮQs wHYPqMc~hS>4h%v7X0s<'s4C:Nx0z/( eRL̦V_~;#"#DG~«VJ=FK0yds؎Ok)PBA\MtTMxd4T"z>=ɖdT[hVTHhJj`7eCdA?Q֝\>pdja>qAE-#q() (D$#Am [Ydslt:WK}mkezN^?"byB/Z`,pLJ^rs?`?KyS0?Im)@ h`:j“'d8wޞǀrV%¤j7wV$dezޓk(RʟLśUs;3i,17^-L?LHV(]zba ~ 0ZJ @r!sd#D P(%y%UsEXy$qApg k٢H9LJٙr?c;zLQaӆbrP ŐM57/,Sm] H%ػ¯ޡyͮd]/x4_|%m Zԏ4"Ƚ鏁dvpLG5p,x0l{ n.Xic\'Lѧ7<ؿJՊP*A?EeBAL$YԒ JA ,cK$12S$!BWhT'r,PU7j8 &)m8^`TCoA |3.D:X#~m\Tw_PkGc؋yԥ9ݪe2kkĄE >w ܰlKpԫU hSf$ϰfl ?x?M A:&s-¥o LR r l}BFHHE4LțD٪mOTS ~x#DZ~M+(jYzZXr,JQ9C1~:"ճjBDQ7W.`Zlʦg ѮbU<@bP?Gid š)Ʉ<ݹL1ɋ@jm~[oQC&*5&;'5 j#d+Yկg]! :m#2VFyϑRyA!\jffǵ>.?;p-t\ګd0<\6X5:P BElJRCOA e=~FX"QE M~k"哥A95[P&G3Ţt! q.h"]YP~$B%ގ+T+Z5$utQ[=gcrV#ͩU lY5:s'~}rҳס6/&U! =?) 5a~6ZG&C옡m[Oo߽PHoh PJ!>q n L$dCth/g`h)hVqGո!؜5QErÒ6I=ST6F+y_y٨~vPk>)!7wXEB3N}E֧?<\ޕ7me/?[xaiM_8K*3[9]4^16.FpbQt#BC7f"á6?貆Clԏ+l``W!hi)Gh֑ `^O 6 T<=k~;:搡\[aF mbvDj1cmq36]@(sGY=jS1o&O5(g)87'xa<Tlh]v>\ϬrSncmt Rwd*&_Ŕ>hvDsbxMw.>cNlM&iQ\wW0niA.S~qyĬ<%6dz'/e22,jFSGScDS!35!_K/%0oC'k`r()'!@-dH ;>s,IWʾF,{F!Y44m * ū-qhѐKPF1"Ke@V^(+Us3L7bOYl EE JhqҠ4dP1`oIF[m4`КUh`\J4ݾ%gz\>ŗodiSg2J~ ApWpv*3"(os0r-* L4SU}5YZ.]J䘉`5(j#Vq7l^s wUB-1]q? gP^aoL@Jċ񧌴?x vJX"UVPN/ˣ:lR菨=6TjGHG@zn,# )Yu[HEcY d邽Kz$ k".(Z t_.+@6~ *2=ZÜBq\Vyu},]k?9r cM bMaL}MhZ(, _[fG$%\~ ˂Nap5C?eD J$ `!WـplE45l/]+ʲtɵ[\rPn;6E-VǣM~.X-"lf.> D4Ӳa5E XYTvJu dAmAb=]9t40rlR8aw'ɽ~=ROXA4 H S=/"d䵩(O@~O8ouW]h`54&`N.}-3Pqc &KZ٤JKUݔlS)H!_ϙ: \XeG_ <"FbK.!TJ8Q<0,Id!~J~ `4i,Jt O5Sl@KQ?DS4;rgoTl^K4j +u{Fw&av<"%n9!VxpI\wDdȈ.;L`C L` Е;W;|2֩i,M0df*EE|YO[j!3Rzf9 @ S.]6i۹8"cg0?7b1!#h qax'*B;&Bظ:/v!n>kL |Ga))}em&,ږP(Osf鸛SRY3k-wC㔀R$+]ēQt\shfpx 50_d Ԭe%7`jDM, 䍱\7FPX  d̤0`doBQ*_qL~ KwhFP?g`12"-B_D*>YCB}K)Ub%8?Z;s=3RCYه/ɩ!#z뻹A8 \/ʃ:AqY@]jqg<'+YܦVI(EВ}DNSe4M1Bd=,-Q {Mn0pl \A{Y0b/dL;u M8ϕ2 }mP `J1oDƦ$H<ԸXP ~! ~3u>sx<%蛉-MV)":=pX /X՗.0 v2Xj%P6ty} > =nՁkt;$}=B)5佈m}7b}ƌw S0u2l嶑Z?vѠlv(,PP堤 6L遥4BTNz0= YA"c?+LcB @1}EKL62$P\H ~9sdt8n;>!6ِXW<ң8% vQF| EƄAQnOзB3t1a,!B':8j"! mD:q-SU2/[ W[V,ӇA2ZnH80D:/S'M[hkd /ݒttD"'LR@@CrC5&o`Z!Y@K*aw~Q6`sYr;{(>^,پw!LL<|N& D/׬O #FUȦ-5'xq`>I2 CBin3%$d!H/eJ_ #fTCq"LHV$ƲgqQD0M± 2R2T:# RvQ<~K>?=lhP5C`;ǔ=&C͓ um1*n1,r)Ą-^n$ZB9zpL2 'po59ܓ6tB5ӑE* pUL/QC,)94Fm[!200f\t [Չ3HH拌cT/G` ql ?6#|Ӌ;q.=i3.XTiJ`7")`h@Z)2ZH-),,άb,ZH%rGD$Bpb<b12a"0:xJ5F&vd m6O7Tt!e{S v,)nq&7kKUq;H~?+N`|4Jt0] }33`E FQ̘nۄOu^+ެIG1黸J4:iԼ3}?XƎ'5,((EuR:ܞԠ$݁.`ń(SQlOE6I3G$*ytz(wJjm!uQ'vLq( `3^ Qxe4g:+G bI $Oed-}ޠ3yvISr0#2R{Zݡ";G$V~_UJR>\U4:;>i@7v#!ZZ zE$ O=(%+.BD2k@3Zr4*a/{Q="$ 82spF\**Ι.&5|wsl$ECbo[#w$v*2'զ vc ;M@8 B1 bb X7J14,N( uv=Rx!&C/NM[8uكR0~mC|'tmI|-̉W}b8G"ip85V}N%,wTy4DLi pm1 =U6m)c/OKg ÓC)JcUX:+b<\޷f-@^j-9 '`y0#~ñ|Y7my#Q(Z> 'Yb FO(cHӐ-4:gx|[4 +d9EXJXPҥt^ȶJ9A(*R(0#KޛP d{(Gp->77F B_HHH]A`D? tѸ 2f&i&dhxKب$1J2#2X.Z54Y-&>Cs묥*b uvyPjݗ*21q D&o]xUD t P>"UDp_:kRæ-ZpOXcJ0ۂSldhS˫0qCJT|{P,%N*VO4A Ip=tH zz+6؁MJxؑ/FZѰW#& r"D)V|#3gqI-#zf@j<0Elߌ!8]&l4[k%c.ʩPdlٓ0D.Rʖ1∢&,O)N,L]$n b  IF#tl:߱[qae<RjW6#&>ɕ-Tz*hm)٘viRIA&.G+-ĕq>,~=Ec4M4 J&?ְRL8b՘d'>ƵUB9]an[hW4f0V͹

*]~i!coT ,j.F>I0Ej+p¡Ml*>F,PC$aunr7!&LCP2RthgNN?B=SgKMy]/භ҃Ё |3!L$ \DT%%XiET>/^SsιE@Vv1OW"*(j=#qL!-/|$?:'gqu>o~ݿ^GCE A  2&K ^bęLLLh V"9ђ}Eu h5M DGlv,r7UFTSn(G8#:,9(U,u?ѰL8h}:{dD*1#݇J.`%X *%!!Ee "A9|:QRU>0[-8mެ%M0Y ZӞGWӘE (WXf{ε܌>)J"4=h`LbZD ^Y)\G٢O8kx\EUovV@H ҮMz4'>[u[UE;(rMړ:ʥЉa7~ϥ`Jxr(DN8f6 ZjRW8m ,J @}Zyw*.)rq)3G77!& Kp=ډv>d#cLBfTdꎴ ]gC>Y֔S6`P\]QNwVrGɢ |8Ѝ,#ϝvL+wh|7=I;S 9 H"( j. Ń;0Gz:Oq=|G9DC i(߷g5K2>smPo$&a;uw/~3=m/ S?ꥤDWS'}ͷxHdd+NDj:>+Z!JQQIw_Z;#h3x +u *nn[XpֺP8zh FjudphN! ]e_+73>μSң%aT%a\(E,@tY:Ӗ P$ If^VhCeX $шt\EW5kfHE6("!ݸ-4a:#jD<)wG=έuqEuDe# ^GҶ+UvtExLPk*:>v)&"SR{җjN1m:?c56pT!o &v ]03YI=:>N .Z4C f@K8tr)- 0q A0 tC3 a萟)<Ǵ>NQlk `tSb'< E~{M0 הah_;=ENi!SAP5AӰ! G%,!r^42T %+ !nZaͰgǹUa.nq"TW=)TlC.K w*>$3O_GC\--̪֣0M^ݑK@1z~Uۙ앜D?~0.7Nf`]Y‘zD*ʆIAOsXBII/9x $\qsys~2yT7JegtY}GC,4NW{cȳl%L}o$ DQ`T+2:P]B Q *Zp 82%K={ҧ{fMCYWY=s !08hVpmy˛fp҇ȋ4K/vBl %KPVBddhg?;TQG0M_4xE5Uotz!4;) pZ=0B ~8ڸ >XTh:zQGSkBM[PD2yTA 820Ls#ЗO|*O}ٮįѠ12⨏g"& D$2EZݱw?s$M ΌQK1 `map݄[cg7$ۼaȭ)sia*,Z!SG|x,82Nm "@xYxId3r=VpUPZ;ZMij кgĘEh$'k4-,աL8ehmk{-IKAM#BjZ\8{"(D\lkhlA,ck2 ¬gwZdؠDx9V8Mt]Xj ef9jWacց3#*Y>J;,%R~"X>CN EI`vq 1|ϯM?3֕KJeD0B!V(  Fڦ%̶RuP@Pc V Vs1 \DRa{FD!P-lNKjiuS+&&¡jPD6xk!W^J$6Q;iܶp`v3 J?D$ģR?:a_?Nlt\.}>nԛȔH3n72'&6 #C03@7?n3><%Uł^%NWK)S㠛iž3of|;:uݝߎC*~z "0VDW4{+*' ">PsґpٯQ4S 1*afA[-6C %ԛ(MMXKڀX<ߢ)^m)xS8FTD*^CCu\uGUD&w\;/u#Q#`F Uh@ BG ȄC9LUޕyŢa yO::0Vw1kP^*=KQZ=# m{uZl{ (4wmH)Q#JeS/6)ՃL8 1(̰/&:҉Kp{4sE\P!yHjeD' _9g;Q>.=qPen`n 'ޚ k"ʇ4AA5KcМ'uACabR 5q REq-^iYXH"ʭuBXSPJJ_/QP0 v`LNey It"Z~3(td!?LyFA|4%hS@=tL(m"|/=[c=(HC?O:jpʦ~ o:t#)5Ta(& RBu梴,!%dVSA֭q`h &w!c7yU/ct'2='d27 -Y׿a v}EBPT {KbpMH+wY"|98 ހ VZB0 |)9_dw>XL&Z҉[ ^Z}0,{C9-p:ګM+2H*U,nQdJ!VAmmf\\hY %0Ѽ&3.%6e{ЪEvDv{ۂ @?M (gMXJ$z#-C^/DþЛ5CQkrZ~ L@h>mދY䳬.nMP̀jeUz]ۊm:pf}ҏ^\Nu `o;oh֒+јN}^=a`xرR(< q Do( ҕ-Q 4\<1?U W]MYQ>0ڶ~$i/$TS{3acmOCvX\{ǶAbG0E6_ٮ@'$,|xH0}J8Pv(10YkRϊPs|k4؆yDջ_(9gSNMVd~N0&6(3* hGD^l̍n8&iq`w( X4Rح5rD4@>jFNOUqv u G;K|18Mf a _Lh3 s/.ADB4VJ9y߅,ӵAmH}Rizox8.(','ödН'B^+?dՉ%A**F7\I?IV jz~᪗8Cc DHv&|5F8jiˮV ,#>A\Zbwӟ UAW0*4`w\5Yɝ\P.tH0-0UJ݂"e_A p)(DS?~J-%9v BW$.#DЪ!+uQ+ %ABǨifU6R;(B) c(S  Co?' DJDv浍k8L}i@T3ۻB@gw7AM˜e0៊t^cc¦AG#$2pt* zO$+ל<0j(rn?${_ŝ|1ݛW<]=ꐃ|4gB ޑYc%j ½rQJK4+E%ȧk*ԟ-l2n)瘎*/[`'mW ATCDDne-fPL\rsޝ4MCE iC%Q DkS$.*zQ OfW0F(Q5O 1>E#EBIB:ӃMnSDnd[CN-)[-Kh]U{OuvfUKql#۹z+يھv'ε)n??_'⩃$%u|ulP]֤[=jSTR:=(w)܃Dpv}bEԬ4G˷z3xP&ieX|, T#g):}; LlPTe ,?5C7_V#cnETfóK71@Y!Ю ?t\fscVD9  S2ӈs76oJ9fʤ.Nt-^dElzTD/ŘlOS2&fm8;݀ĝhR NAO5yj0TNOkրm \t#Υ s˪;|Co>y"b3=/]RTGYk)O/GdI4,]-0bB2æcZy/4W_8ˎNFB~uOSL3cJLu40:/cGϤ1%6xjjU/u]"E <*lb>P8{u2$] Z8+Ay̠]ުq7jZESDlQ\& n`j%70e;BUc\>ƩkW:>bFr8mǮms6WO-M$.RV ˒{R6Q/@؇Zf0PRnjNhN\ "1$mf`w8%L-0 6*䨨*ʣfȘR fVmUi*bJPhPslQ* 'lIVGQ蜌)s=QdBd=`M9>a0G7Ec'3WO7&c1ʨ䲿/+!7gPݲt0 LF+LYrY@3Q9W@:%/%!EQQMxbOVE&uP~Nᐾ'Q`RPRIM4cq%E (WBۂ"H h{5!7N;gA}<5;1%)Iix=0>%^(&@4屯 I?jR%>Yb@hx 8j?/)z!^rOp7FÁdAjA7p.z|'Q/}5>2z[DS?Sޕ$EISk)ڔ\YATT&rO{MV*Tui<TolJq֋jHLwsL/&& LUlF#.T# H.QX\HD`(=0!*S2]ońJa3^Ă"J|@Zx#2| uU4xro`P*EwVj!tYH hKna !}ح̟*<NN5hc4\điQ2Ho"H.,&jO^..< ǀc!ZXF;; a7BATl‰wadFhU4jZeu8UQ ڃQ'MG[EHqN}U wN'~qTk<)Vbˮtwٻz"˜ L9KDO-CJ.?v=U֞hzV:t1w5;-KG={cޚ&qD B1K0YNb/pASxmTjxh? l4R<& c_h'-EJ?yG"%`hx°z^س1A_:2gAL4bԉi ÖR$J&Ժ9D@ؕ Wrii|MKD23ǘAk!L\& MĈM .>?Wv|㑛Ԅ;pQ΍^iJuըInP3fa"Zެh*9Z{NK檢*wOl{A)q8^;MuW<Dj 7E5~r67MF9ET`ĉrn h<2/0ԭs#ݮ-D)zZoU@A"jW F/Fhg Ph<كȠD5KfoD`2\@7Tkٔemkzx0+o1uKF׃ q/G+I-\c@L(%=ěК5Rёa0H!X^4ᄤw* ʰ,G~zCL*]o%2Ǔyyjv6U0A#h;5VH*k< v+jLR2r$-OiG5ߧNDr wC,hA|9S ]I \(AHmȧ c`CDLsK1",6Aw7fE/ELmZ*ΰN@f i(i<'#+ztRHo1G+n(d͡Nyiu6Vat!NpŠW^?7[o%1X0ycWё"xl"0^ߊ8un چlT@my.K# JU$'+b%\*6mZv($sjs Ɵ mHl+Є"CDf_(H4QܕnN8( OT<ҢJqC7Lv2;$17mzcң!, pXLd%p-s.q"=^TbL-u:ШB/KR=T3K0H  u@V߽1  8^MԪmԞ>?+wTO}nF&A5[9,H| rOgw][հP&t "Jz )-o?VOęa-Kj߂wfx>†^#㭞rN0P mJlЃ q ȅ$gS@6• j" ژI-5D.2I"D)=-4SjMa[ꭺ9b5QLaY J%G3zSn2I:cիUx*q!`HZtӃiPc<P,|C};Y+UKe7݂h'S7N"`C8nn}C :D h{X寶HvG[ SmhoKK&WncglVABEZϥpԻ FLȆ;$N ?v:'qbD)^[aiy{.r5jy! FGZ)넨)aZ]xn5fTX:yz:~w;j Q;{_!dRqEbrO> .ES$뀄E(ku TLU VblX9-]3 (:˧n{{R +tRbtf^G:tU=!fƮ}^|&̋~OMfjJ=ۧ5۶X,{9xhPI5q4lD"*SaL`L 0rMf>w򫕶P~˙>.`Ɛ?-g)C@AI1RxfEBhO/ ;i"2Nxli X--q7-3aKJ0ۘ#ߘҸVI }G޾"Srf^/u;USsW4h"027Mqt]2.gfO<:zD/܏0/ qTn̅*ZG#L>߾I|\*}XL<`xgJ^v` NAɊ>< kBuE3$v"cEMHg[xpq7VXSN'м"4 c .b)4Gg&TX@WLBY{6:7vѹO*Btf=ޙQ vs&MIō|._zbF zRov RRG|7 qH4.D $ :J:jEOqJWL6(fcޛ=aɞ) ,!bݢCLtF{,{#-!C?{P+t45J5m%304L~E4-RH >!vؚ$WĜYѴat#jZƗz/HoD` fڀ{9ȿG CkB.aBj}}yF0@KL;Ә!X@Z5j 8g$n5ȼ2ݟQp`:i>[Fia7QpM:L1J{Fp8H(Vb.:"T/j9i'G:|i W!F5EE^&ΘyU( /&!btʾ ~<ɣC_uF"M@Q MI_qS>-\ޫY 47!vd-~T ܪ?nq`8ClY?5|C83mMC]tߌt2*e]tdZ`iq{ v ul7FI[tg+Ke26FW0`@UC .3=w )~KZ? FP{[j$m)ƆlҠ;ה8Ԇn%j*؋5M-cev%Riɇ`-Q- 0/ r0K'31@kTU[cj@T JiB?[$UeY}Ӛ0YӢ Pm}Ƈ➛ t.7"2bmUD(x5h$7(l"H=jҵbǼ,>d KW)KI'C!)"0"Rw۽W}/gؗzSo-V+2.1ʲȑuZ^rB 8A DA-5)@ղ˙ [TM)kgA`2{qZD]^Kl6-OV6 DOm"U\q)O@`(H0ih|vJAϵugJhfՂJňCbnL9-c,*N>Xs6"b_W,:ѫ-m)%#@A]U":ŕ|A:59о<`،*jf@GDrV7'vLƩ}`$ voYL!3 kMfCc$s`љfMunqs0ǮÍ(5}Y^(3o@ioL'4 Q Vj~ID% _:VN`|l[%΁tfzvUk"ςV)oN϶a@y"ݧxˈ7ژ0m̝mZTv]T~CˬcI3|NI_5)d'TY?ĐkAîJ'Of14cF2JYf~1QduCQKFK8mL;c\ӸaJhz5-4kH n12ͽ!J#7vCH\EP!ųa-/qC:jw nhdVD4o"4G\)[^r Q Ɂ*(1-RQ1³ $D0A'ԚvH=b}.Pw6X Hmj){,;3US9LַT EH=3dy%n_F(bR M1?`[7$IR"2]?t~GE DŽ}\U B`M`:$A5\=> k|Wf}>cK`Ze!RK(BNfb޴aXJ80L #](g|,+`XڥbuFtݮiʶzI~:axg^XNbR[UP|t.U̸O#Qb=n՛溜mp, R6OF,QT }s۲J;٫nv4ct/!aP+dam]9sd6V;eG"\pp٧4d{X< Mֱew3!}g і1/@mPәO[nvXg!mhȸ;ו+1wh`ey";AcQ?y:p9R16@.$F><'P[7X)78&)E1 P0HzMZr݈$uIv42g<վnR ' pG]Lӫ7O#&Z;FYAn>f9NaP#94v!8o(l` 81"Sb2KX^^q EOGi*r4@@Ąu$pUؽ(8z,X=hQ=C_buӁNoĶd ']oWUz*ī˿%F7[%ULf LG˘4yL.vY[K?b=v;\ѱ֗550IcY١4>aԣ Øaj ߷;oˬ)#v^1N -zn BhEu 7!^ 6Fmíť 9vx`$F)+Ac/s @)ln$\je/{6X11n =HJH~ײ7ȟ.N~nB KFD{ʩ\\5+MsgZݥȏvpQK؝;\T<[At)jTU`J'ȓU76g^$> ª<` VbXa&jkȣ$2c?5^eWc0 d|,aڮ l2N tZ Rd׀|VzdWQ͛VA2]|wp4 1T*2઴j^~'!ZN6A0>i,ȑL*MxzX'U Ds-50LMtҝz\-4&2] 3؂=w!2#!_}˦L^%7N ŹhÛ˄wW#@B=f9r ٹΏGH&7i, eB K5۴!?WPd9" ̅w"MG>bЂs2vbd?-V(s΀J} HiRe`@o bO ֈYJ T-%lEZy C >$zP D\<>b3PR ?'ӔEEj7W긠P_6U-(E2^#[q߬f|*,/!#b$|DIxǹӋ7-ͦ_rItg$ ۓbX6&i3fp6C{aHZ}h\vA*=Ip}&50ޖ[ dz,~s>DJ> [P5N|FW:eT . & QM%~2L%ǵk.ȡ$LB#TNsCn2<Qu.(h Dk,B}Y,4;8ךmNDv^jXv^%&u5.%4`ቑ/Wgm %vi,5&2g*shIL:GORdY΁QHFL\&rΊ @4)a]&R#x~q⍿ySOIs{oS^w{ ֶ 'Q2T]B^& (#Cv9 ā9Γ 83Vym!Pn=%b ,+m x.@&$GגD|,ZMں)QcJ[:Ė"~jt}+Y)F%a0fB$@nuDLܲ)T LQkgomB a1z~rzU˖$ax{c2+!5"7 "'bRz{D&1>LF쑈Ib o*7MRXaJ8 $""5XF]4\ײ_3j$75[ ෯ 8!UMum M2 bΦor(0$[Fmgh{Ü++:[wE V!sN%&!L:oTjnyǶ߬-v">2;ߴ*e "Sw.y4rkȉִPEEKp'EY9ѥD34Cf K `ÊM3 HQyϹ yfe2rኛûh ɬ|{j) Qt4em#(0Cؐ{ʤy_ @KUc@ bS)?Wm3BAa>+C٧ CåIDSu"_z\YgnaUI#Y@iiUnԈųrJëR7BH y0ouj a[֦rm$V $7/O.E {y(j#0kdc?!nI7D"l*-}ȥ.dM:wx" S/kiVA$q7vlA dܠfdWė5;hMg@hH80@BHKՇrTl\GŖO!Ԕߊpz:ٰXQmq7 e 46H Bz>F=rS!8 :ą[Nx҇ *\U38ܦ\O=5ʓ+MÆa]T4+'mH Нs]0϶7})=]1U(ImɮΩQ#A˖[X5i"4M%ZhqX*sxa"o"b[Tiʩ6l@vQp'rld1Rby;{u(s&YK(aZ؎ =c-<ۑ5}s{J՞SdVI('@"P0m\iiTRTX듨 W}MLQ%%R[aXq[3U t&a!n(\j+p=9_k>5ϒ *b wnSU'ufV0E@iXǎ ~iǛ%H3I8%fnT^S( 0]-\TorҊ6 2 bEb,u$֨``FV rr|˰}^`*E0L.;nT*:pT#[զ`hfɊIZƮ4s^FocF9ʒlОVuS!2v=dq0wȜ DW=\~2jH4v]{)hÂA6ҘSBCgc]26 hq9ĮȲS 4P< 5j;_sXv6'OBJIo) 1rjZza8d ̓hξD;" zqH Nbb5}:=1MZ4--V(1a-][nCW L҇MLE4Bp54ms &AKS0_1Z!;V֨^ d3!(VlË[>O"hKpNSM-PE11JS7vwd>75S~5O]wAx[­).Rqu)$qF(hސ]ՒeS ͦstkqS=detD-S>r3NS2:7MYd;M}z; O NrUoօY\V2YT^NvXX9"߽W^=dy'Kh2:(T1fN)C\s}E@cax& 24Z|SPJ Tm)5|kލ)t-7 UurXĴJC˂ Jňw}l c>^<(P: iB3AIȻ@t *G@lMl]G}mӸ}wRlOsa$6`cc#ڠ{ Z3Qz h:`;<Ũ v=iV'}.1c$GU0#QG:7/o!I @F:YPP\]aDM4DŇ"|# 5mrUY.vu4XgQ-:Y/C scܲq4+sYOh(,1К1*Ija=εpEmVΡ ZLcBsw?s. G-y#5 (\ER4 Z8TщGM#jg7hAYr CF$p,Tjm =)]њyǺPhjJvV*V-I^*>EBj=.>ƁBw?(n)TbST5k\OH^2AfTY}[f3ih> 0}F4F ̓lqނX{ޟdxgKt~fHר|- :R9I+GOJ8P'4+UV9X9*ƴ7r&"YJI4(Cؚs1^N=u|`!XӼ&֥0:kڧ(mkS.@D4X9D"Z@&PagA#Ŗ;R$3ԍFΚ j>]2\RyJnz2bԠR$$m^q MvgêRd*!cP5Eu%g >rwyc~sܯ[M)eJ-Ik6 Ν%Q2Eg* `&&pOxۺN5F'Zu!߯vS'strw ;5)-KNe!t 638Ve[pCʻa EǃW馞[9u j8kxgJ2hCfP6MWFB&\\ʀU7J4 AKIOΥ–l-H稉d[%޹9emr=؍`ɫ¶ַ2epHc4锚x/QiA]EN_n@ay<{<@1<".0V ?nL&[C! PI`h:auQtڄ;)H]Tw2{="ٹ2yɥe|"̤4F5p46:qCc7{{0DљmpG^]Zt~nPmͱ~K-򭉨`)pV.0i]9' ]ڊ^E8fcMEȸʉ`*  QrI8V-j>Ԝ i4_~yyW8S[-^j ~i'=OZa->􁶉a!#/tT/:{jpF6 *Cop87(%gVlLt0?eji+t\^?/nU1I+SB l E%{]Ɵ'.O)y~T^U"1yLorhzeq7v75mdF5kGc:<l=/^+ f?"Z:ZJxvR_)KZb^%M 4rk[uKh3-IM M$ 1e 6K37::=zl'KQWzOչ6OiE7]/j<8%>6=BQEy]=Uk9c (bb" bpfC٢7tH?NOQJIf":c$<;"ia6~Еk #Z%*ե~hwVmh*Hi#B7̘M4 xRF4VevȢ ZDph@,NqC¥J)) yJASYTTHΪ ĭx,j 4N(($MLRKaдW\9+Tm,ؑHAR@$ bjÅLE`pA<-#ƙIE ])rn$5R\U *Ɯ"բkɀd2SdfADjŒ*m"PNʋ1@bLn$(!4EZ kmd\Gb6$8øhĬ!I2G2 A tRwNL1RKuc,$.FB k()+0Y-ui ˄,FÊL0:,rfeUm*) $Ω5,X(;s1c*$ɚ3JU1lDf1k0eVR&qup5V0չ1*x)&3]sʥ["[hmQ K!I (uJ]aA-&h G6mR:j M NR&$1 IBJ[C*aZu!^BZL5׆d5 B-$$0I >"?7 5;,O^`V_zP*=VQk~d+/KN7lx/q3[XOjUS;E ZY~݆9Y4 qZ(2MbAӛ‚6bi n=ί|BS3;0>w7c凄U 8 h9'# .%ğKI/;o=kJufF+&Qjb2P%W´C"$d2-HKٍuzVFQ~olSgwXmKǐoع4bJ*PM_:@ujg+*˻C_øG{y_;-V^OR?s%dzAtPJso 莚M^Ru_b_èU`+'x?)B*/twUGYTU;N@j5aB U:$2Cէ KTb8LdU)LJą\S;EDX ٮM$U|HHq!:T7gH]s LDz__t 2[~}T,t7=l=~hռ伻m _}7'?^9Sޑ:#{uSzA?4O[_ȭ~hkn7a/|k2O~?=1A0&] ,xn}@_ҞoX7/9U<?Ó^/ N`GQT֧qXmh@*GSώl&߫iwƓ?;ճjhv&O~a/zg["g~3G#{_k?x!tJUg':~8 騴|7O!̨7w>T OD7Gy_ُ46hf7E>RFQX-9A*m>B$ę4_S_}]xY@2#W FR}!r[ׂt[|?ښ{v֕d{*דM̹ڠ֘;;|~W2R]z?@>5맍3Ww~~awל/Wג^*G{uպ'0_9_Ϣ"lgOo@Ҽ45 ~3S.ooj-4/RoacB@c|W[GOj(ڈ|Lcߙ!rkz=2:[ޕƌst8~P?y}CMۿ}M]I!?#B7 b \ߝN}GOץm]uEO_oE񶽲A~O_khZWU̓ՠ-]G{۞E:PܹH:cm'LpES\lMZ*jE3X'Hߨz܂I ζ.LR 瀺jcEDHѭL}L 2ABhO-ZڂB9̏ysf"]&]D;OHPAJh_ qt!DY"=-BoWNGff#=,I$@c~H~i:Rw1'Jt}wCHi x&D7׀<5[dё708[ڴB8eI=hB+VU:تWQ4A4䡤,8 6ichٮG6َO(f '%*bPK%sPyx#%)YreEXt}Nv/<7$ټouZ O jHאKTn_(cvN\`zv!S"r]Y!s`2kRC ?"\@M.PRC vW牆r t1+Yjm+F9c$X0A3Y#5QБ ) EZ]mȁN\ *gin%96ӨW.{/'C!ς/z CmŤLδRmզu6k9]Vj0={Hd 7yN!3I6ժc&\U3߾#D@.8KC] 7vwzfZ-/A5L.qj;,<&#=y5Z_"{]12oy({R;d7ߍ]!\nm˞u>NNoX&|mBH`<\ 7*ELuJC+2f͟}3B/]z|~5*)4UrDwYofH;t:GzTiCɉZuglwHQxoeb}jw\_7;6š V>]Iir]u]̅!~kjC,[<ó>,. C(\Lyn:ۇ!Ki 2-񂏁eM^'e@3흯h$]⼹t>NamDKVv5RHb۬ΐB cto8soIVHNu(%C$+Ţ<=AIj\8߯z'PR|{RJi,Ԓx:S\yQ:Y}-Gv/a 8:7kHJ4s>o"Yǖrt>rwowfA7~мI `ARmZTW[jSOuthmŻnA'^ޏr\`ovHQ!(yHktBx~~z,/BC8pO}.sۡe{OE*=Gk4?{__ 7?Y6[u߾`}߳ 51y$1f?N<{'B_re:9^w|0M@+h&86}ohT״uҬ7;b[O*|H 4aD IFHċ0Q@$hL0 "i0J$cF$̐HIJhB!D%4 A#H3@%$) )  0 2Y%1#HDJRH`XAĐ)2#)LJ4# bdi!he$jFLMDb0IH$ J (I1c`M!eJLҠ)$I`0(%Ɋ3E,͘L4AQ2HI! $`i!J4̖R#4LH ĊhِS)B"Lc)4H fLL!@I&bR$L"B3cPeH"bAE33%K(Y$R(4J&4IH#H$d!#2Dʼn!DeHR DL$$%dD 2S   2)pdH DlBD f,A4Љ0Q&&4I@ɤȖ"&hLIIdCs`c!V¿:uۗtrˮG9ss˺88$G@HIrw?(d9:L-6a_: pqOb,"R?(bK8IEF ,3)l]# -0 ~C>w$WoqvH#Q&ADd^$ֺxόdN೏_{K cwa7 兄 ^;;3ۃdoI %Ѻ6!+Mqq(al]. 6MW#_zi*sQX661TRTDCLLDfP"lIib04}ZJ! I%/udLEI"J03l*&]DJ ˀF{H 77d PI!ܻ#v4]LE(3$uH ̀$`Id4{ ,#% S(rHF ̄Av((sK])1Ɠ Ddǜsѐ˱$00CF{hDk%帤@dJQΉPw]ˢSY"Ag1hL +qO8LyQ)X!z0@i!0%syr$!& &.)s2u(wqBaCi1M ,2q.Җ1T+`{FtК`ҍ0I.9spL`ғ)HfD"L:IH{'o˓EL%f D0Q.;nF9p!{v{Xˈ$s %ι \` X+u %$O.Ό=Stф,M]DQr.&{(3D͈csw27H󻝸wdQ0cFe2 &IWy:x{rryՍ(9m) 6m;=;$M۝JIݮN˱빘1HWl1pY"e#pdcK B;aBJ2XR$;dÎ9ܼw{=7Wc9VLr2׺n]ئ.'TRb1Vi! 6LUΈ;8 0TIoKj͌k CScV:kUEHJ9i-Bkqԁ DeNJ-6F2kl*K$Ҵ[ii TA$"lh v%.)R* K2() TL&JA))҆*EP vU22ƂLKyf#2IŕH\5 DQ@\1$9ERlȉY19FU֥F ڛ-*ڪTآj@TkB֒4XkRERzLĚXRЭmi2&X(5 i jXQj ҈&ᕥ][@Pʑ(A)Uiԫ-2Zhz[RNB %QZ)"" RD Xި \j2%A$Y4eF$7BRBez@L9qܮhv* V#N%@kF6[[P!#DR#& %HLtL4R HDRHRQD q"&FicaD)n˕Bׇ0/B\xP|$.ywwX_/3:yѽnzooҙ4ۖ9+wekzw2Yު(|}]n`9Gk@agdtgڍ4\v|J-ZMξVbk5;ji7 Wx.!*V?8T"+[KY3};5\uR;so7; ! 7P2nxW# H2@AJd61 #,߬K?򫌭!虐6w>" +k^bVZJld[قkK_脱b/m^b'0eѷ~Ukcs v(4I}[RȊ)r64pDRBF'GA7ѨBG$yXi ? ,k??[xW].}[RapbZHO7%*!^uo sp ?k"P$,rkh D?CG^ Րu-,RDJ rM5kQ:9D(c?m=ݿ;?SRǴW0jt~ۙ8˜㩿XRA*jb{O|!Ϳy}{LΠ1\|-k|39fnV^/ilmҋZO:T.߿P|o}ʭ8YJsg[?uߕ[F]6X7纇y_|RNDf+QFtcv]"k y:N_X5}@WC@iHk:4׭u{D7'M)@v^}~ֽQո}tַʂu;-0q3" ^jH7N+=?c]{ ?*6I,U3o}zjO"K3>;(1V+R`c@U~솊Z 7un<`< ?4:A)ZW;nV;LygP-א8:XHSX59{$N`}4Fwu|We8tyq5RIJt[*K>wx˿5SuAqQtxCD UP +R#$tr‹1"g*2IP$1[Ȑ1uQ&t0z$(<8)/jB$+x41%Ic{D6pAaɰ{"Vl-E0x!s.I $ړA U_{ s@I:7jHC"2b`̖qAE'a K9hp*_4R.8ɺɉ.Ua䴫S26[2XGBf)ciN0K2q^ tI[btAB橐) `6mˁ*Ҫj iʕQZ`zNZ04Έ0è5jqd9wݦ%szi^!so=M)-;75\C 妡yyǙG7f2VJą)Q#220uMY^SY)!u`OPaSFX6|壔YF.E$wc8q2weE]qwrEV`O0a>uHq>#6^ɻhP[v B񡌷؟-XS{osN';ܙf1ܦ9bS8syqm+ JjTM6PRS'l!)jV+1MA˻BV-٨SJTY[uw2=Ւb9cv\UXчR qpT%,h8TWk 9)9:D/K7wSy/c"oT|܏[oNoOUW{khpa[x{gtqR"ths],8T 8Q}vtBXpc\puL˜X"Eѥ)cy"J|HJg8"97h-c!ؠEX31UC#bhiN(H{2$d'*NKckVq8C-"k$nSZ 7 f3\مvn\Fۙ0( eFl!XQ)J%͚vjD4hɳfeV)O{!+tPxnw&a.F<3YL^ gx̚bwxEK16=z ?dvSdCn L;Du@08ت<9hDnb*I⑪4IiHKkd^0 oMd[X@v;V@&ڦ$ޱj]kE 30IpE؀$!Ȥ)Nhm_r鬤!QPT3x9c+gj?C{S Y?{UNoZ KE ̵G UG~H6,!D*S!%ٟ^ p:frK볏Sx˒rs8.}Jq - "”EOWߨA%PvQKAqr.go^mvGuILSà,{"eZcLwkO:Tt~h[8f Kj* fⳅ='`Bd dKq.DaK_A -'rqԊi!M|:p7?b?۪?|F߁Ku~yMfG[O }>x&ALg{zd_ ?7=O}8y<٘~nNLU!_9( HcNK+0x :3\C0Ϥ9&j($B$ yj*(ıZ8H2'iZ)ͧϐDrz!Q=}GTqȁ~8o["/զ̞Na~7moOurC ryCXEɢ@MCoϭ n5+7:fR\L1zAX+15E1 p"bGj /kH, ILEԓI+H#$H?ʤлF!~;^)ʆ~{W?9TNoMH-ܵq݇o $ =OO?w]s?|6Pb @Qnr0FN 3)5bFl 1DE-E9bC~JEaC!z4r[s^BSNA~H@J BpD f?bTJH%֨PeaxiA]rX-kGn= 5!\Pd+]aA[+lz2WRf|ѸS1*Pa74JM! mlaXhIE(aѻaXwhFr"MّMqa21E CkIph: IJ -K&!%NLHYTPbp>Ѥus9Q l"<i7 hgwA6qyB~; FDpLS8pqʦ$HG ;Z(F EWNZ- &nٷzohlIC#SR4XcJJ2!q)rm`LqAk.#.]rcrFA̜\0Xk7aTRL\H!]4E PI)8s&\VA]qnqI =w/?ULO*d_O;u{BarRB)œTr咵!g=nV(,+lVjˆ@Nd7G:3&{;:;XRtKς˵]̓ZCAi B"O4ds+ާ*H֧ ډ83N TP|50i%6)8{SKиL>aiO@*Sy$9ĂֹuaRD)h11Μ;]BSWX2nuXq8E)h PiRVH*"iІ)sgaaqļZ$t )f3K6"7u@'FH0lXfQO*T36EP )iVH^e}v*3cuSoxM/XH FɕPdj>34fD`_k4A&S: "s8tn?f|zF B^bګb5,Gqw(8*|-ɋȤiLt9Zhw"S޴1ݠn>ښN'{jCM'|F"bzE_ Pk興W;[U8e> 7os3pUjb_>6R Zl0,PpsOu-p߸z*IBj5S O4d!v&ZC:~Oŝ2fx7Zw? C/ȇ\;7fv)Wǥx{vqdrrܮXHIFh 6f+Bjyh72'Ĺ5=KӶ l+|\HiKƣ OyƷ&O )#8[by J vSUk>;/zGQyb]%YyZt̊]Y\:/㾵dc \ѴXK4Nu -pC|3ʽ/;+{Yv(`+ư3u!0$ \PTȚo|λsϊ_Ϛo=kf!гpuM)َi9;BkonVA$ac} go5!i7liQcΦ/7J/WKKte4l"*X8ic@yn>;_tq}nFbnjs05zK*9&õt`+F;=jA>s&%h_lY`7a\BcfSL 1gIg`);*9+V-h^U  g-QNE|3uJBv(r砥-fqZ+u Ajv(qte.`V<-K۷7状5-ݳHPfkwݟ C~AEk:51U;q'}8SyB549U 7wȈh&)Μ41 yoHymUǻj7c{XjP6_''iS/ D7 m/I! &m 1b m4.=t4ChrdNlF] }!OY|ËZw#9=  !H(A,t}|hJw0 @>t 0&i?#CoBxB7@A!I1 pf~x?e;{+X*&|IN՘.TVZ4*@5"gQBPK1[ɜ\QR$Px&Ye fز5^[`> q]Ga| >n}k՟_؅ ÄߦK[Q/:X|;Km @t"|1q]9E"n|@esΖ<՚:{.y3?D|^V؋?+YwyD/2r>Jk^}r;HrB7E;ԙDM+ o5h{]36j`٧COC{4}V3!q@t(H04> ƙK~MJ}r5J_Xez %dfABW= zިt)o8!m8K$:KGM+4kUr"ZƗ[ZPK. 2Z99јj;NʉE8S+ϟy@Q!xrEmj~K/R )4胾i~E_k쏵D#jej+iRb00 @6Ű]%NDv]zg7?¯D Q#x9m 8Wlt@^ɱJk+ԉp{ cQuԖ{5<_Q {lAO_VwRr7Y(rt!p9O<[}M6z )^MC_rGJ}`ξW6hGkJѮY |.pݒ 0LutXHJ9{l\bp5aIyt_Ճ.3b]x*ǿ>اnFE[L~>޾7Xm;o^Ͻrd_y?ܧuUۚi:t_0%s;_TK9|ÙߩZp/ľk$ 8? 4ov 4a9%PTL,OV]?<z-4 ~Gv|k<O-mp>zf~O|ՕԙUčȵDPr 5X'3d= HQB?|YjǭJiO6_Kc{X љ Z˙1Aʾ(f.)5av}ymS?ͰwA.:tYH'뎪O¤ 4e(({,\c:B‹@M@FgS-Hhf|m > 471ԉ #kBmmQkm*-V66EFj7}X ']ev'eb 䕄YFZȑlb G#szR\XMG\34!z9Ȼ][FIhB { DI ɽ0l # ж1 e$Kؙig> lRy^p`LGwlw{nk,_|fo'~K1p6`pp!NM*q%mYG od-qSC[<9Bk..'nNZuk{(c]]ոBJ/^w\:_-5ON"RWQt}^JF"9_[z?no_/!ȴiְI,y+1yCC6O,*<3XÔo6^1 VL$T+ja)Y#8q=eE $^7C`JEiB5Uq&XFc%H:PD adVi)M%dܘ!4R q,«Dt #  3l&%`" t X371V k̬m[f/] 6Rx*/zܕ*ishIgG.V"pƦKbXEXsCy2/d)ʱцzuټ $ΈVNbъVf3(1E 4HiA/je^B-sVj ;txh)L1P7%qSowQ`g{$Ь"7{ć,tp'j7f9 jzB@hp z0Ue)qox\  cT [fB*!kc`R30Fc E5p7F6&,- EMZ+ZODF-t % [\{𢠥V$.t9#Dq-evv^cc2/JYѶCdaXAa.$%ibVu0Vz´`k>6cZ:aNS)67N:A- s^@Q{ڌ*؅х BL %a)iDRo_ȹ5#T_ *>,pC,2ԒFmn7B/4H Os;H`X ǒhEGh`ԲMpXT풆cqBPvPp E۶S7]k2DmfJ 6 "kE;{12n(TTR#\c@eĀ/ؠ3vh 7Bȡ{DPW\|cKwPQZdB P4r 3# }5{E|4" <J9h6dE[Fy@Ͳ9rJ--vXP=a5|ei\Zg g k/^64h~H#ŹՐi8 ѱRulV+\;B73ȗQ7\ M0OjTcJ$8 Lv B[ˏt>V&5:|71*"*Q`ӧMXs5xݔkf(ƓEE:8uQd5nlN2y^NML@DESxP6 LX;.sՑhxY(| = #*+9UCʚ0EpOH#B v[@Q*>*u[$A6\5(! \º{6̕ !ZfȺK@ OC T 4K=ȴS{k:&¤c-7(e߁pWSGGM\p U*o.An2[im82|PBKT TeQRkrYc%jt VLGvn/R2`fN1!䖌kc#n,yK7f yP3Q1Y8n2^"^.6U`E L;|!GGWb+PDU =[" \^!;7aJ`-3yla4AEXw}:TqhMzwrm@W$Q8.` 1LYN3uc X>iX%MQsDQwj3ԃL /U4Drg^YlMaeJ,ړ_[!oڦ$bpŭw$؆ғ&P"^=w/*(LYG)x˞`n7}{ ԛL$v(p,$7\7+3!Uu3܏1ѩnwㄗ nnScVWÈN'#djv,% $ȼA8N! $:ox%\G K(ߞ*9FL6tK mvhC;-r!Nu+A j쎝 X=>o 7,ǁtBgZާ2U-q|oT<,MvUQ$\ T5177іtzc(Bj;izW:쒝O0]ʉ]j[Vu>BHؔ+Q>$ebS --ȥz(+lĊt5Y6,SB!")l 9r<ث<dUl rhVKKZƟʘXK,d-$*l)2pd ^nM0-+43*4J) HP|bD K ug\hxo{ћEoC(fϕ-ڙ,y9B)-=;: `L丩{bS KyY!qFZzZʀ-@PW<vlY˙ɍ6} TeG 327X˽!ضw"0)#Dܒѧj)Q,Y:[8#)}9>H"yQ6]d.論7;wmicR`A"u#a y0Y;Ts+Wӊ/SoD~pKAtf f b6$ LDD$ lG ƫ|/"[/>\X*D-44XKT`\ .SP]KTIZҲTJZIt'6HIPAX¼fcbu?s5ٍ0Gq4{ÖAD QG$焭: ܭ4}$$K ]@vmq#-lfjTx) L1!]n2$ã1wO}G_ڪ֫X3m5dȥ.c&Ԙs& y|~^GGL I:-lTZ!2~|~Bfq- $ƘDX-"&7KDhsf91SFIi!@r $X?ڋ6:.u. ڴ%b">+{Y$P%ԱG8T42ݢNs<@XufI# x(щ_ƗuNծm9}LKdw(X‘BXfs !K99G A ~}lՁq4j%m¢-ED<4ȉ#Tdi~ &Ņ.g3-/rIA77q}[kd(ήmkgrH)<\~>/Щ (~}QGʋf7#0?1A>$$-h哏S–x\V?6Nֶ//qװ쥧"ym 9yKFo]ڔW&0y\eLVg,? in/nK&e-;b:,SnǺʮ:6j4# 'ts9JὪsX %ddؾbQffelA GC[-fH4XsQmtDU/YGF]_]H/}T<ކ0EI?G]a?z[Ps6X1鮞ptw>-4cXa_֏휱&w di|Qߎgy" |uA OA7 `D={i0 s-82yP'Μlv;Ne3淺=Mߚ+?;$Zכ]k@7܅؀5 ~dDb2(2/\Rݟy'}g`#ҭW祐i+vKQPہƯq ݎiol[eΗwĨH{囄oQ OL\5~xK=m~y[Vߧ;/9"_a|v-^Lfr`Sn4% R=&Lc>hXd97wBpN⧡ӉOy2s@ǭ $ԧ4tdju`hoСW٨]چ*<S! "Yχ4ԬۗhxBHVZw J֡HKm*'灶!}<@.om{"__b32^7͍m$[6$̫P /~=gxLܕﻞ7͓/G@~Qa =м(f'v ẑRyshHI319ZA|Ѻ7Q 0GFRC~-]Kww2/aQzjμ3p}?#q϶3,ml_%eU}jo$K7B&yʨ6yPss)-%\[? ߔDa'}k9Yy7ӥ&(B+p?<|i5 #&bn*j&"29)|͋fC2 Gve"DyuzDct4}}T$C_֊3"I3MQsjGXBT6 ę 6ky)(i(DYpNqVB$% 8HkИق+Ia1c@G7,(i%B]HmE5yur%)Z> tB{9Xt]&<_$ZjO7j1B uL\cU3HFFQ|pIu˘7+@ӊ H͂/??|!>For鳟_[v$q#m(!MPS0&@fC ж9@'*+rw1VJŶ(k|V(֫EmZ*ڍ5[h֍kFڍbműUcE-dQjTQU[Fm-clVhRhcm-QmQb( 1UFŶ1cjQZ5FlQ+k-566Qj,cƨd,ZƣU+-#QTQjŋEQTEb,F-XMTmEbbKƍ lk%EM +AQj(bFFEbL"1XQ%F* 4L#i6161, a2JRS&D$!CBI $qR7wl ċUkoխKxnsw\pv;ܻ"w]wNWNw\9]wܺ;wN8H-+V>F۰cU7Pt#R8 vrf8:% IebX v( |h2H3Vaya_W"a,A !FKz5WELJ՘+6KR"8{ɢXIyD*DP%urLm\21D!~u[[D[ULX0?t9U<}kO5|ڂ[`+EXj5sU1i,cEF(bт%j"Z4[(ɢ[&cbXň4Ai%(1FcccEmMIFi6#щ,Q,jKѠѨEQb릋RZ(@A5"4i( 6"1d4m(rESXƣPlD&bsaQFUQ!bض#HPMD3b0" ,D-ƌSlEh,[ hƓl(ٓ,Em5sp؊6)*11l*BJcQMF1LhFFcQl 1P%JcbCDQ(2ѣF@TA$lhт4b̡dHk(2#фIQd26K&fd(#&*5&XL25(G0A.L麳"_i[,EjmCR 5ƌwYN]W$7e`eB_qhxEQ4=<\OjOx LF淒:v35Asn7ш:ܛQǦSǎ`!sؐ]l U۸>LX^$λ)Vb @͉Q6G w alD.-lBs`i(*K+i$GC|arr+أL7kC̉zo]U&ܧKf#* 7}Z^TdXR`4~衺z'yK)Dv.zGYD,E!56X? 0 ܊]ƒ6ޔ?* HF7g\LŲ`Do}:i=0/!Й 7ACCU~҈9?e@R2&cOA<>R`f[n8ΙOIK6FCEJ"Wn$#O`؋VnɐRsh1y7ҙN쿳ɀ.>qf0le^{'P 8::;dב2 n)}z)-;P6n.?S#p!-R1ĠdElttȝ7:nƽ`8=."#/;Xg=S?ᯑX=pUmZ8[?=lS?/֠A3.sEy§?7xQ |t՝Y+NF~kdV2&N0=L?}qTn\d% wE]*DS.Su~ y܊Tv VkkhK۴0V1fe'w>qr@H<84h#sY 2:%Qd99ΫXz۶tOa6,vqr;l3^ʹg Ю8{=𞣈*6 oZt͛bY&@E #x*LdLIf!7tsﲩeŒb^z؆#HpYaID 3 AM0My/Ƈ(+P=WdK1|M7~`КѯlqDZ?YmVS6~Ye0;9-.AM7^~ͫ'ҭ$z>{K&C%X^a[7֢_4:.@ -✧ć=`{C6zMӋ 1>_(oB/d or.TRg* 0Cj^{M:mX\v`b,o0ޯrG; ^~6ӸgQ;*͞yEXHN{M+9 B KȀC$u{wdϔgi~Ѓ -~SG#Z؛en<{LD{vؚזy7_Чk2Ĕw'=zp5PtDCDEC1L'>Ќ^*UB  4BSoc*i0z^){~ o2ԣy8I wlRd > '&uKkTR) 8lrFxpW>D8=Ϭċ= pʵ^c]nB>m T/cʵir.HM1=8Zj4SYq~7T0]53I=!{hyV*0 ^5/Kl5 [\iьuۊUEf+0.z]U;!1W#^@}[ؽRK*1jf{^W[D3&aЊ0H=zc+Mbwj3E*"\&j9LX pW˼"'_\ome׊SxzTC=cuZ6QEi%uxWu4МW:cjϓpk fJmӱ wF#*?UOUc1v&:0WG=K^E(TpTF?0d(LsҬ1(zj;rcuR1TJ@VA[9بKɁ.?njGzifwNN%*H4kƌ69]ZD5q9/q/ ?R-r^.bkClDi& ۶7˦/^94Le"6PF&IŬ]Y!~T9 ܲLͲ! H$csqk\6=ssC -=ݞ7KP}Q_c ъCn> ^8v"()+H8#~PCDa3#1'.wQmyQ5Ī)}^1HBY=~z":Sd]|K E˼Ts]{Д.B4qƒٌ)yM(by}KCܣoA2D) ԣY8 )2d7jB[^KRL6qs y3ʵICE8ïL)^g砫ԮVcJ_cIwFb k,aIW[~c^nZ.$J.U#SRsbbz |C2'U4ywV)S`٢6F7]K MgElEg[ IvC[[qa T+DdrŷY3n&Z?0[c87y)'tgȨ+_ys>Da͟ עfDğiaL6 5=]gN$7 ?jNJŏ-׻Ѓ].TߓU=M |#m0לv:Vy>aRL,9_ȁ.uvWCȕ2 N=4%X$JMm\FHu͝qc;U0XGMІ( BQ,jU[i_rƿ<Ͽ& D xo B6 qtˏ ޙ%zvP~JƎev-FQ MKQ)cLdXW[zBntC"OtMyP=E!SWIr~0\>F'xRIqBk -;87LL(3ٸS(n(, w]΀%ۺx'f;+Zu͉L=oV=0ǵge .ؿB?ē4)㱬D#_S\k5bA+L]w)L,6<8N%E2tfA: L1͟6M a{%V;ַ;rkӓ >ZXܘVe<9L['GpO5C&ao k"N$?4ؖ n]]T7\1P(q8Z:Fs@á&!_<~JL ?O6PɭɡMOvqmL}bZkJ:AW&פּ]_l=(dl7!D:(2hgg4¾0X`Q 𴃭|@:rqce! aQ&ݤުl[Oǣp.'ꕐt#LB:yv\A,zo\Ao#5A( QsUI&iznL*4\y>%/%۬ݵ7e 靂]B') b_|OK FbLt|䛉-Jb.Ő^G%i8ht-\Fif\)wq$_'G|Ozx#ۘC &,ogX>i٤O"OZNCi< . &;>0=n#$SLoTظ?=Hl#CJ ̍3q}ٚ8TWH\Xdq%$"\ 9,R&|WM3N#|CL6В5yo:|T&ʪ5 %B3xh)oh?w3" 0DdoyW p0hy87tcT$B"u5~Ȟ)nL& Yr"C5F!i'r`& ɞ JIV{&:*3/6RɅxSzg@gzC*̑IR>DVҷ1XCn?1)0"U_ QRE>ikc{_b1W0?pStuӕj6.mL$v\ᙝvJE>BѽUA*>)_i ^)/ c+bQNJU6)KKBQg ^=nj[ H@KUHTjY$r{dtHf0 ~%X:"$N9b"x΃gJ:C #g N^B=GWNPȨ-4JYTh̪B^]bP؀E )N? QTYi]]8W`by _i*PJvXvzL,o6I'lLvm6P/qZd Aq;u?uj8JpwQY8ق#!o2T9:qVu<9YYZj L9pҋ [A~}o"YdfA&.y,~}z6n=o'?m:O-q@]ժ<"WOB"87PMWW%p 1:ke&&o*FMF$_ckDEI؛Qo1pv|~{ĀF`S,kPZk0`'dj_"nn'^{٥q2? j8ɟe ^$Tl 49Q ƀcuL=7!fj39;X\.ܫY UQmDj-!M&W+X=Z "!2qסQwU7P8EIR N0A)H^j|2  н5<$Gzx+ /5>])NK\\v*aUt~>~;9eeAYiG\:3yWDXJmŅ"qɂ 045s X¹tȶ]QF "8ZBV1<{/ԳwC:#Ƴ7vC@I |;/نY;{D k~GV_(PQi#XÄCv@cx<4 ߃-P+~Y4\"D4ێB(9aHǼ=^3qLJJHNqȮ5&.k$8o hd2,|< yt\T/d1sgNK\Suf7~O@Pqdx- Xf %]E ,G#\? . GI56kZ`"ľDqQ;v/~j1=/Jr$#?϶ "f}ϡ@"" 鞛޵$k ҅h+Xk/-^Yh01Ԣ:R]V<(cpuw{4%QޮY^SvgkxOGHG=,7Z u|Ed$;S^-|N^jY#|[V2^SⱲ4.GKNj!T/B+" AD7C3gsv:O)8 [~%dY\ ̀dO÷˞LX/K*{7hbZ!^4dF(yTں6sO|%~rggM*a*tnVjzG>ugk0Śsݎʵ#՗z^[yem`M7MH|L Ky}T@}95Kӻ!XF"?aP'pLkx[ ܱi#h4QJ9dr~稂YܖQY hCHD|ʈ :hh Ojt9GQ{F,7&F'Q]1%t|qG0+R\yJRcou7+2R̿7m'-cwߔ4->Rƿ1&] p'WLBUҏ7fjJ *7=Xk>- IDΡrkǑ,Z[n1@eN!xBRIug k(SEI<ɇ`T'Kp3pZCj 7;1n6,c{Z) _n{NN'K+0ei74MlWpL @k`**J.TzX)(40 {1SqB󭏭p>qƨ7(Ќ(|uSW5 D+o X'B7}?焺,E;1'Pj1׆]"VU:%S '/jd+P$r ސtW/MA!3OkмJ-ˆǀ|2 %sZ~Xq5c_ӡR|HT&=mUVK&Ⱦy%:u />-r@fJu0I& I;GsV\ 4Ajwٲ%{WU"%j?N#'Ћwo[`l9*CS&+j޹[_E ;_ Je[KS'c?9q`9sqaSk_ 3kA~D`TsȢ;pΕ#%ȭzЬZV|d6ux̵PJC`U[h9N`G;}*PnBiT!vqrlXHb`Ӑ3Ÿ^Iոl> ?`/vߖh!_.O1[C./e)9DEQ` >38GV!2sJKJwzP~٪71~›ĤI3:>jO m<Ao:) D>".eTEf}6 "Ϳijg+DK+|Œ P%Co1d6Ze3'i3]YaiB0߈ tx0]zB3#UΜ%])fg J]WsP6;׺9.<~+w 8P#20GNIOsF(XSȫ23@v`'^e- 8ڵ5nepX+P;.Y|I4X ݀f†g/:F`>B tT qX @648 11SL}_LYʖ3! $-Uz[E_lɓϐs83l^hf UIJc")`APp%U7njէy8|:8oϘ5+PFv P\fYK` 07,vO~>mȦCUQfZB0DXٍ+'sIҌRx#jHRC-ľhmOi𔊦a-CJɏ_?Sr8kkprXH ķ# z4\ƿgB$sM\U=pʗFա1}Pk= 揇 Kڕ bgt&0<ˀr0PVӞR]"K˟n72E Y3y~E6 wil*]oǣbGSb2}0_zGSV.DX9\d ~ѝEani(fi]!c3$|oP_S60PIn8|2\iD@e$YET"yg {5jS"蔈"_ZF sΗ$XP}XrKRO^`ٖ5l>@HށuP܌H,MG?3ēW6}.pfdCmio$攗Ӗ%hg -6RsXBlm C(4/PqMlE(ĎvW>.99yUD365)OoD)tN"d؄K-(lv&UkSQS([JSU +HׇհWu&H%f_, Z|@=fM.^i?/zcիk>n؝ b&Zf rF(2 >+-w`W2 E;x}BiݹH j >^hB5URL-wTQI\qSgK쌃q8[g/ sjpK7N 7(Aǃo0,A45 w'Qh>Ow }WTZce7tӡM &k8&IS͔ZVUW3t*ѥv2( '"A251"O?nu="}r6ͧ@Љ,-nqyʅ-#O:$܄g\?.9YGSuL2 6]s1@=]ШY}ohbwoLI%|APQD:% BmB dz x@CDǾ#bǔz1BLc+NUF]XpZSMvqv Oـ#V&K-*Z64"ruۢ97*?ěs7Eg_ͤ uqͷRf{@.v03x*$VC}oY/䚠D$kJ'b,(VzؖW|0+KExfm e9Q-ueխL؀Fc[C& 7+taDŒx|8Y/xЗI hY [OC5?5X| 'T36E%Ә@=՝>L Ƈ+)ߡ]v΋c%VX@('rrMHduR +ZmF^.)j9*qr|GU:_m<[.վDT鐛.tj` Ӽpb_f ڲǰBuA7v;%rФ꯱V0koYTf|ai9ZK2><]vqC~tOũłeMs%p3:`@_ vG+zmtg:RxG(ߏb3sV,ߺs{ڰ/WQ=6_fnxk!? k/"z k'Y,UN<䐺~Y\o 3d D C6;י]d5qh@c9P{CkM~g-kyr\G!ybJuދ_MaRRwC{SzBWVkZ_B'"/>ړ"D%"ӿkW˺x'e9~}v;o; g>K%dtZY5|5آ1Ƽo+פq[={޸s l6K|G-u91=mD!>{³CfpO=H8J1}k# w2z W-G7n)퟊Jq?]tyOi˶!Kr`횝/yn-7I:5fhUlzy\M>= Dmqly\Qi A \h9&v, E0Dn&b:67h_S)޸)rSs%΍ӯ6Rj&;Ŕt#N4q`^g,؋L Cqb֘$1+Woõ <]c?*CfŒRmTZfQf欫Ӽ=_@IHIbF7>a#=1nW$R}{Ē 3~M܊hp\θʸi{LOْ_Oϐm64Z%Q룠sy.bjI |x*m"VPXW#AX\. cq?_$ 8a>"`n3R0amͮU|#^Bb!˂'˵ۙ40ց\"DY_)!kb   2LxVŜ P"|/:##u1t\m2; :gs%ך% Dj>` =m^K+gT;Agi䶅7ÁK| 1Vl!\2Fud (tn BxOB>$xv,M\7sOX`4MlL5peA>M؋ *>ˈ -> ሃ9>f*a--fM.سUÀ3 C4D.2lBBK &; I[ӕK:/~XKϾd D;ҍ5GW3b#.=I>JKWa4v<UdR^(Lqm-@7xµk`Jˏ> pFBKoc].@Q? rxF~~zb },.DuYi֠B ]rھ%(٢7st6=MXL>ݕPrfj͘]8M;\  '9;hM[FoE4PauLk")[_VvX1-P)y6\hգuAb\/nфʶqezײn ۩"| [bKnbF>9۳(6kYq}E;=}2PZiJÐw)x?~^?lWV4,vȎ,a-|úBR_>ȉsW) DAfL88Bo :TԆ~^n-l|Y h ѭ(y;[ݤ/є t&ƿD=QA;cAC>'wgR"+W‡+@E&%t^4A 4Ws𳀚ݖ"+ar)/#Z. {~GRj}r%]hSn|4\I]H)e` P9jS.] |ޛrhFIWqv Lf^gn ]՞<^c`eLci<ۆ-f` YF& SRd,EuVqK*񕠑9nHw^]P%[ H_qLxCꖱpNwϗn'zz8RGFk0q|ȯo0!VB_Y]N~qmp"(ZU-Hx,YeYx@0¼H_[wcovbs)ƒJ_;0o0ɻW5q_鍉;VnPrhV~ #Zt'<$vCF$ dd[D=JY J$hL] LA $DR𹌟1CCcPѭOTHO:Ȏ.X}x4 VFkRgu0YC?x%IǿAǐbj)\ONpQKC)Ypp[hv~65v̅4pXuʌ1ZBv/ C`l3J<C7+H|),D&+6Mxji#z&8]݂(i4Vyln&(z<߅1쟚w-Y[,[F{~<#'٣p қ O*YQ@w* pJH{W6奠6Dqnd}H!bbn= upeƥu 8e]0G蔸?ڝQ)lN)6`iJ"5g^J[ 'h.]͓KeW~BWT甑BjMXowu&gR>G@ҡUFclǗd8&/#2FyC\=uĵȘ};/2D6<2BTyfoM@6 ):"Zo%E ~bPFa&enc@)08=s~2ʜ*$}=-#-i\!_T3^-Տ@K7 NcQeo,vEkrr5!b渽~P ,5LRxxܯ7Q[3KALѱ\RKH4hfe>[ VC#QqwPU&ہ%sxҼ.sܬ-ц/6\n{k\Lv>- $w{i Ɛ58GX@OCBlNI-a Oo< [9 '2wEqsItJ4B _P Mz]IgDSEguٿTmRY3F72d*q  ZNنQ*/s 2_*麴KO˜M][NQ,NgFs ^U]? L!̋/c nb{a3vwF2)KZ (Dmd "TaR&/V7 mFVL"(I ;<ƥO}LkRذ<خ{_:3B٢~Za! ]#:2 NGJ= ¶S90YH%]y4FNjUK븯~i٫YV,Qדι4e0t dG/ǕLߪ T~pM=XH@PLjYVm8aԍ*俱5Q~,=4F-nQUBf+1I5O˃Dc]0#07*1~d@k0봍|>]U]PІ>Ps԰DW)%`fp~^NJrmDöNijt2a# l['%w8IY#5МNzr(Wz ¤ uFDX/DFaaa%שJy> rm_*?>H b@Ĝ (91^BsجҚuzMYniFMɼL)K6sȁPf"b83/#'Wñ/ׄVn5 CoqSS|I,=paP`Z\M;snnݸ]5grܕVDf,k0ŵRSIҜ˹!*mUF ZSV 2ʒ>Z2.`R~37bh&x+l'$iHtJ4l9G-5W&``T$uP2ooZ5{IdY s j7C3P .R-8n"eW!~M7pnr@jFԶ;F%f?aQLE?2zCq*IꚐvtsjoԹi!N  P(9 | a&|!L"y=Oy+W78gɜ26hUfݮzD~PX-9VW*_mtǹDԞ|| VՠK?Zh&QwM ."y,DyD;_@U5.6$l?DgK"8ϥsb ?:.!N[ktnčcK/)ʋ͚[7If_ə7QmsNɽ\҆䣶>[\ XC%:>~U)bǗyԥE<\0;Vˢ͏C"{&S"Y!e]L7F|txZ`cfԎ 4 b 2EV擰|QT&;r2,( j(^$;J&i2F=Û2YX>{D`ROY VHډj$dw b1;<10ɨ |4[ 2a@Sdc',Z!"-A!hEAbԨspO{kӝq1>t;R.ep;qG:D#[(HәDϺ>whGFgDN$7TٳnT<у<|<~5]eըY!i?d 3&G4^/ۧh`KؓOi.YaLY`T.Ej>(ig(s/pcʈO+R#g*f=K[&|JY m]汾 Oʺs,q'Ѭ8w? ҳEn+C\.q$~_i_c,P!h LpAE {eO\4RٙUj!W]i~V,͕+%Vf^Q,e,٢}9E@smu6 ќJXP1ilf[Qv4Oe<ﺞ*F@5dO8tٞ,9y2RV5|Tu6cN ̥SaNt1cWrrY]X:ՐYͱ= 27~*|C{T4MMծhF-l+9NX1h͸p 5FZW uwѣY#pcXSki_G&UXY!#=8[ ~>{g_%_{Xr~hÙU5L25Jy_c1;|7\#`ĩ6[TE~i sam\ADhMpJ(VW.vZ%"HN| 4HP/Ё+TU"Κ iU`۴[Y,tj0V7:\z(ZN!W1Ċ%  L ~9[\ݽ6~Ѧ㴕c5`nC8)wѻ3ϯ2[B *jw>F@tnĻ+#guOʤ Iۿ G|<<:g 8LZl%OriXGLLGx m3&Gi:#) uıfGg8d_mP#ՈVLfv¡Hh::!.("z'ZGv PrW^Hk8%~kLqgNEB^⛪?SW)jFW 3YLTZ3J~WÊl-MIY*znA|qldF+z]rO3;A޺üV Hlξ' muHAn6(nD,BA(@02u̵XL DTCr8 (`(OؔpN$5Őx}#oETbקc{A/V=T,1%$}wUϩy84C܅{ݧ5[`vLUp^A0.l។R)6T˦t>TG3oJӪ ]}U%FA.jk7;G+TCib}Pd[<OnAݠDݬ(4W[-1Ο$6?R*f)à">c qۻ{ʎX$aЭ^l6Y] ~ޟ/lbfXHjkq=YQFB۲ Uaw8g|Ҝ>m!CGv R1Z4ㄫd5gRυ>:U fJlb1ѩ5aoHh8G^㡀I9kTԌTc=њ:Ws9Gk`ع%+5fVOr7m}a9ՒQr:BJJfiŠ7Q iIRHH7|uh 5 @Q-JEcM-&BtU 5]^L,'|Ь}2*NpqqqpQY\: >TV³Hޕ"|ŎgP9iwiySUraB-H+c*ֽ'V)7ǼmgZM5MM,\4˗ؗ-$,=:*_PhoZzW;U!_'ko4zE_AyVP紆˰H|Ӄ)ۆGt UB+y.}NZCd Mtw/q3]Yo€jf&j:DSt-k/&ty'^j=qpALxo&GhǗJ(!:?Z0NW~Qq6R;8w֊@)_8 $VQ;o;{}2-?X_(9v^ĮA8TbrV Q;1L_C71(&V?աϭ>Wfln&;BY=y- gh ZALW |zG0N6l^kE5b57x!ar_-IJN:qP$%6e\f ?2cH14ev: Y+ ziҽr[E`҉RdT+pi- 3-^\A&V^RqN8 L04^XYw'M(\q{~!,=dR<ؽ:rdd,} owhm티g4*Faj9/fS,ront9 R؛-q,vU9zc9o^1ڍN+WƟ# lki1Hw~{!|*]Evzkx#Nc4>RX~ʌЈ;ӛ&k򤹵wAϥEnWK ^.:\痃,Aiq 49^<̡:|%I=dPA,xGv @ȗ\Bu_`Y[Ҩ} 'ty̞Ou|ɳݭg}Cw |+g< E&b̝f ovuN:|kpMZ]}'[{nL7V1*`br@{|[!S یt~zh`/1a 0˼FGu4nT< t`Ң)I{%#F@O\1B\(hwnn9[u휪U|h)9h`B!X;"+ hUn#^4:TP#&[c.j`C;Q9<(my[v~ޜ{ ntW %/`՚s UOG! zbt]k Vj\dpSUi|J$:C4΋DEFޏsau# T8D@.v= 1\^KAXYrF>K]twtLts5ȹK·trBBԛp^*Wc*2G?%qu#aٯo箷pҫwQ쓣DL} +e((|@"vG{PZWG摦m˭?7f\R:ʋ$pJʍU1ʱؾY鎝Fki@{o/gk$Ixr>k"tpDd^A 5Lrs ENxMo-an<)}"se_rmmeÛȮ_ڏj'Cl98+vM[G̪m7gVrsO<<㥩h˳QLۉ S]=aZ;թ,l9d=?nQi0xVW#;u`v%pw7!-'5T:ĥrJsuCH# !-^֟;,Ԋ((Ij*_lY~|"ڍ8bӮ,j׍khwlHFNq^ ޽Ma-`9VH1!|Ag[}/Za]KoY_F]:9.\pxRir}oՕ2v8d?d֚r5QRǘ"l>^ b"|v ۮ&Qښ0>VmcIH7g"cƿH q.^)m—gοW1bv嬧W%I 4~,{ h!ԭ-%pO RnsحT*W@1C R?yZ0OY8b%%J~&y, x)IulqHvVʕ%X6]M? k[в2dKj-K:o欅MAءlh}yf믎/$$VaZnbL8h&1'NqSDc@]zr7a\7}H)] Z,xu *&+`1H* HCF''.7eN%B`.ϋ$!dߤKU-뜠7@.hVln 6BRyTLW4i%ꎒ%) MOѧ+#_۞ٸ5tʐ[>AÖb)]O_TL8e3 #;#6 ki]{PonNc VwUELr?RנXsMs+hb2؞eJVCwQ,i+yIB4܏F,$U46ʅ\|-[yꨨ'ɵW#ͭ{.;Pq͜TVJ+I !"ڛ)QdWɛ7ўSS'HͧA,{m&:c/3>.*)'9ஙh[ ]Hኃ[T1 WvyeSڔ<3VH2~lzH2j\W3[&S݄ yͦ,lSzyPZRMy`PPF:ıt}K ԜSIGBA2dQ6Nc\=ַӋ;ɂ{S,v!fp4z$?Qc#E#@(sPpF-΍;AX EPiů ';Sn~P6OwY|fno^iE `d |y"*Xape9Ձ9P1|oK٭ K b&cu%Z!x1c*YړU|Rsl_l;sk s$$Nh.>| PsOMaS͕u61]Fۄ|@oUICbMX}/b-aGNNVâP}R!M/l-V5ߦJRJAmN)7WVHx"񿴼6k iӒg6!hr{6ft\Ua$Bù6v,V^@HNKAf )u* dO,MNYOh}Zl"<4n?Ž.}:HSLPۏ!*'RƑu?CjNP@ݖGv4PVÐ"Zi=ˏTDJАZgL2"#놃I1mR>C1T1e<`#\^U<{;O:+pzi=RPxffed-=}RCrttdߑs6RlջN p旨hI!{7!mg"dq",㪙_$>@|7k?7sFKg/mA6@s|Q&zb2.]1uy}k-'s;@N1.,V@1%b^AgymICӕq$%nظ)%]PADRJh5ǝ1κ&xRTgn>{sFVTT!azhk!=h;3^i2x}ZyٹmL< y <"Ǯ{O 8)bg8pj(%>8{ wY lZ3'2]Bs*pd,x>蠭fKV es 2,<ڳj ހt9BQs{n:\\"7gZUPJtp2N o 6ί=E[ Qg!.SAԉ $z4pC ]u5 kj~ +0$WĽ/_Xs7\HJQm4łP1gPA^NLڮɹ[? 8†8U*gY0Gc6Gon ]Ie=nXNP- #5-F^#^l.v4u},\Rk&} [E^f`$Ł)KጏO?o$r.&9[uY5jS!K).]W 7;NVV۷#z1}!!8TS$yBRg@L{YŽg;#Ɇ\Ju/x5z|U?$5iQ$f1M%5Hցճ 56a )D_ޖ]!ى\=ΆWm]m?=z(A|6Ĉ/G MM4H+(Mӿ1vQt@[ g^ީ^6zCS)"tN=pA%oִnk@3[IF_C[vwԸ%%I .Ĝr눢s(XEx oL .C1!cs$Jn(3HI9AFJ0t߫M<(SC3ڱZTy '1t.g0mߡh*cWh1/}#x˗ X;9vԎAD-c@V#yLzm.87hRt/t8c\DiiopW;!H#

'tlJA+Bn{Pް}Y~GXQXPR7>va{G+YFrE't5KCBaϳx O&JǦ&mN(FQݴ#+sy5-ϟ3)#ر+W~3;]P5'r$;iA3"ԔyD ղtȱBBzO(Fk6]rkk0q=",1"s*ߥ~E[6W%o)z@_n 8>cYXǂI @tTH !LJhީ-KЏߑ4 [w`DyN;kȋkVs|rXZ02N x߄+IB|/eAA4zUwڞ\MJC{տEE cjǯYCD;ӜheHB~M~jЉpl6$_ Oc,J&57k33!48ݎ ^L:^lHHOVR SPfmk wsjDSqobx (;ۧ$u.ak/9~@>?&41t7֡wwyӤr'p*Ya=ߜ^sR9\cFU ~ ^"zwXjw UȜ,Cn[%H5SB]<[0ʰʦ{6i}xȻZO_^XpCR)[ؙ4dbOr9B7ahd$QH a}O0 ݴcQK*["@|Ȳ7 g 0fYa(xC5"k*N3hY6  ؎_;pg+ >a}E ]⭑ifE[^_ dxf%QtaD3\y?eeI%$ 1z+cqogMG-vYi(̒Eٱ"~ ".gưybߒX Q;yFzⅣyBj2-Zb@芮nKÝ>LI5V9Wn5L(M" N#sq/ۭKrgU}CV*wv~kM8\?䊁Fy$"sj1A%[ 'meV3=]fVɖ첩ujbg,"C8EmL{C=>ahc8iE ͽ(gMVjϼgdo`D Q/_ Rd׺~*F)Y=繠V.BU@-$~P#KRB YfeC-pV.ggn.GkNE([ wf.?3 ('2ԭxtP "g7I$+7|O̰hPXH9{az$6 $pdg]vg{K WCA^i2@FI%%=}6i*%"h"A4Pц~.Y÷䧈>SR bE+|[yG]'*!sf;G/`c:F="%1^iph#7Blpbfv0 !A{# \`-ګ6g 12lW0"!~^yYMQ/c2c\P` 3Qb@7/^&x94-b@]$s4P/5ړuuS[T F"8x۞f?98-?,`m֜(YTiDvSAGF́* a~ 1fF%_&ɦڂOΧCj2a(>pniE(NReǁdSɗ.ĺ, 0mc< |ZP[o.{`@7&? bG)1fp])R>[wE=m)nu Ȳk |w? !y+2R--fC]6ssw@膃bh8 8k4oj=M6v:w >rjU탉ŕn2r'Pd*j? k_ k cݞ'c~X_ZLM^K|~Eܪ~ZX1Τ97_#\Jk֠Xg:KV6 ѻt\P|8=\z@ʠ0f?w-_>;Y\XB9  ߶dBTY^=+ (!-{bG>!$n>7@3n?^bOIBжC4`sS:A~?aCuؾԻoNqԑ`*Ի G)ͿsNM%F^!+5Zb9=hdm1j I54#o8RhAfU]ɉk#c]9biQ$K/IhBRg3^[n)xO4 e8NrƎ՚Vzi =24uPr=ǢR:yi*?ׯA\ Hib$%IWO3~=phN61BܸJ z]{ɳe4`VT^ˠ&I?zߎhu-.Dj3/r&4Cs)!I†~łل@']P);5׏gD32o$؞R[Āw8N v@2z k{ @3(b+(hKoK[%+@"d-GĊjؘE[H W.g)+t5Ա%}|]lJ+6w7VqFPI5rOᧃKTb[ {w^; V0sʰƝiΰboQD!"02. [FvDD:t]݁'*l OIՁE> FϒobמS}V[Ķo7vKwb,f"rD- ē=(RC]ȔxO OQjN ?,=}䄻dQ]`Ekj'Yh] F(oMa@r  %($.$$s*2QζީqX3<qa9ӄl@Jfy.HgXYHU*tnBlnғ&m? >CPBi>5Vb!⠢dtN{ v=xɍ^H,>\MJɿYxhAw4y ^xe%x0 -JYMgzgdžV/.=F̯M9MWU:7GM:5!;mcQ"[zٲ5dF% b86 먠M`G7[XaXrTM t|\mfm@ +҈QG]@~l v4"^Zzxx|XF1 o9Bs`|Oꦁ EY,"# tQtz*!ccH?yywѷI51Vd'gU 3ޅJEhc'S7{ XU术5()S Q6:NI3BM?;j[pNαxzȸѠ9H3'ǜ>Sy%|F?+L*7.O .,疻ܩA嵲cSP&eiosVIBT)ynώCY ]լHk2yj޸&k|DƺS@9 2*ۑAՆLbgt0oڮa*Lм-]?@ kʀp҈9a~"$JkKOs"!SYbWyVP9l6\Y*_",#vL+ PDG+(Þ߲ 9Or1r3Gckrg_Php6AL -CT:&/0qi\9_f-q\N2\ת5 G2%-͂3ĝ1b@bI=iOZpt+1 ֠t6. a(nZ[r\VzH{QsGR|1w݌5qְqKRzVH|GwFpz,|3 ת@ 1$ZcS? G+Q/SD˶y&u`d_{eSX۹:$ ;d6҇=Cȯsfw{Q~א [s(7.W>B]hĬ-Tq cצ+{ 5;ejp4;8mΑ9 8 -yI&e*ɪav)T=Mrx]ISć|Eag%̋NqU9 1v_21}7Q -9&v]4>ba0YF}Zq> ,*u\?؃@i7' .%[H(ay HXe0ycɥ!\PR4yNɷ;=[УrB/.N?Plz}^J{PO?~T^Rf%"n_sppC<_yy5ʹyV=(?`o%%9-2^@pyElM]/Ό1(EZumv4Vo zNlHbqbȥlQ#"xG[}iw8!v&5VX^p##7"i}ڛ..ro <&8Z5̎$8+>q8d.OK/j`;:z¤!+û'c-M6@^FU'(t1FcfxԳ6FHA?C'!\@މ ZG3=EN[i4,e"5_b *BIͬ$p'rPt@FP9X#`MkJ:&_pK[V.ʍ[$tw|Hh;x^!B)M c%m4!XV& z_N̗\܆`%f™-46ެ*v \&lS&`pL#% !]Cr<ܛյ$;LlH k9zRy3LK*ZxEI X'q2I#㬯⓲7lr%w#[7E}D;]L!LS GY#WE!a9\%1Ao\~}o  /-i`I*sO{NOʭ¥CT\IY7e^5=ID"f F=@3S|:zZ, o6Ұ\Q*Bi#a14q>>`!fgBW[-5x-۱Օа ?d'ji~ ky_ll`BB]<[nsL[z( +pWɇ}kEHt 4ʦR_Njn}f9a"mnu0"KkO #kÌEnb3;=M&a,yimd5Ox]McɔP`%toť-uk[fmkXo}5/N:8~ XF¾Z̲Ecm u(;Y;=48IQc!2Zȁi 'Ru8NjawoL&XOYzbĐ f_9nw {HK5M M6|wto&c cBKcݿ[8rsQC2Ì9R.W^ Ē4G/TC gNAܣ׋LUB66p~}}(3mXLU"^B/:ܑqB)pȥ]=*dyQF 6P%隈D{n;F!7ʰST(' sͳD57|' ~ xY);YGιk෹)ppnnM ĽѤǪj譤ͤc[utR+s =ǍW}B\Xs7׺W&b\N8U˦~™f|kv#O@4nj6̨ƾiGU/UvxQ-܏2&Z>veEAH5L> tk>/[F3ʲs5ܽFԚ_^ &419L\M(n -(:f6p9&ѹ-jW;UA7n3:b%'dj! T` 0$;K"`B# &r9nhv@kS:e&z. z>25齓+7hOꐃpSy@ECjMn6P-(̭j's |k;i=';vSmX\rQD8&qdH&S R1mg3ǟZQN-;ٰ=?mDW39twa5)?ݿ]ܲ;ӨZPoRa@<ޏY#"bh3 z gf;9QyuI jy(o{͸uiVS0 %cxp"ZaWypZWҿ0!3Ñn\ҧ_fiXVq Q%:ʛ)ٴt?X sF d7MYzH |`gǦe\ &]i qi :C y5f7}'+;P0͖A:H^$|K9|أzUjpwUWWi zU`~l `۞Eܴ]ry;եg;v{SRAhp`0"kԵ<1&ymA{!!Yy.Ei@С*gH]&3 {,9>O͟7VrJ8z(@R|Pd ŞkBÜ |*EԬ-Ҹ> C`$)S>-#t^b$8uV':[ƃy \,{ˣ˳uG1Px\&Ph*Ik^#X@(s5~zHܨ\:/ l^+؜ ,Pd O/HՇ[=i(pM7j f*mH5*d'j~p1(-6)*t$OŎh5ucl /4zT+!N zһ'd憿ZϿI:p@z_B #P"eךj}f}Ǡ±2~Dt%0qҤ{en3bW+¯KE#$T(7bb"DL{ i8}=̧ ͕Iv0EC}GJ_4P ֖G,r/Yt3kqŅ`Zdo+zFE[\BƷ*][)IM hwJ$}!%q[~*!{>)R֣^0Z:ֲ[ۄy} /VF~qh LUIdFh5HBgv@4KvPDfq(fSi{ݞ8{a051p -sD mSu @7=iT<"ED?!LkO>tplsɭq,7KdS p43}RׄPӔu(\p7}Tӻ辈>W`C%Ó|qN3*lЛ]{{;^6P/mΔ3IpPDT68˼ '\yWza#Pk+g픂4P¸%3>9{}e&2̼jat&>.r'/4l>8Cipشblq c|Ȅ7mf#jc"i@"7iyQ<+'gA쩁l~MC3Hs vgYUϕ`Q5K0}})܉ǯNXE$f}@JŸI.@t Ld(dd$8I V=#ΊCguOy՟4.Մjit`F8/:^)GZO5 κ bK+~-/HO~AȘo&<*>´(VMTɼ]&O)>!]OY YWE@-REЯ?QqٶYYT>4ȩZ4;DЛ]p !n]/# 533R+`YJy i o6"ccm'ua[`s*p[fkuێ5lKx1ъ8l*[]xZu# f/.n$sFCIk6KbD7 z% ?o|}&-1 J@>9s䱹_{;[nb8)Eʇ_ٷ8@3QXtП#>ĉB}皧LlXԫR<՛Œ Lxxc͂yJpk,xwV _[/'NC(B77 Hʡ {>M\v6rN^^Dݝm gq[*cxch&ѝH5sXEv ĆQ@dtW ;eRV?czW͈Ho 0 z'!"G[aĿ<@KYp/˘qm0ʥy-TmP z:v֢Hۙ檖 bavd =mFBzٮ(4qFq#_{%syn99ɗ4 iW7 LH_E E5[i,V!b9 X3eb{~ q}:K\Kdrfh'(J\o3 @Vj^~>$30{Qvo s3d`36U;ǝ@]Q'9b*IssRiH8xߘcuK{ƪ="b MSV!|Z R3B]Pd?:(Q K y2Duq7_Qf^ĕ+#Lqh Vwmf9lnu sw^g2e\H%s D5#՞/c[W&5_oyFlPn'+i /9w/&dxz<`Ҷ8u(^Sa}% ~B<͊Y"} +٧41tA5lܹ!#X7d%Fw@aauYHxeJp#9_c-2mLYB ƕ=/\~\oS8@l<.rGDFya=Jmj;>m.jFҊW_iM&R筹nDHQhtE8Vԙ]OZθt(1ra(vϸt.m=MxtQ6 M8ʂݡse O_ՈW9H*k%Ĵ:vh"X,VOF;nTdz‹`Ȑ¡0Ȃl |xk>#.=Pn>c]xZm T*` (01D[gu-FRqȽB##`f% r->LyzwBO 9I`sRf 9vVTh3;µn)bߘtT2TJ.C_ڪt^ںQzuňnl rB5ZBiqe "F}B[32ZD@$I7 fjjgn@ڗvt;K,T}i,D\w>+ >-3V` Eߡ(hҢ3/^>b#>YO`m}5CK1nuyiA_b%(NE({a2Xʄxj'h遹IZB|) J]륗1_ؒg2a%|&t@=Vx˃qKXY}_I;HQ%J9NAMO ВWqf(04qGHֵEq}{ဓνT.ujj| ,:csM^L /8-l$͛ϴ*m5|!nJE9X͸MoEk/ Cb~Ze=Inì0wwK 췜  Ň<%;ԹB` hqeelP@sУ+4ePտ? Y,п D, An VwW἞W}mTd=d9mcRJ oývzJj,XCz"˴ OC(떏t/= m#BІ$OkĒ⴮5BZV'|-p"Cl~eR-Q`ISu*':}P2t/Mxǚ(wX'E3n#+dAwJ1P%e6|ub U#lRl{h̨Ay eǩ6K)V0x/wr46ѣ+4|x< Σ~F3r\6e+bZ'Y]?c(T;$tO 92|M[ pVgV1|v)<]]@+d'~i/Y93Vf"-_~Qm OFwspJkC!kW,`0+`2{Qzc/ J3HpM(J_` ,q@+r.L귒Ԋޭ޲VKL )!⤱[S JR̹Iw%[)ۺruÄG%>7DM`[Qd|I~V3z$tx, @=K6 |/ [TZ̧@2ѣc 3Uui2*TTT%@$=Zu; Q Tf,6Hc*\ n;8 :2h>k &dĈZ)}v}z5gZ 1t}Cޟu:hTH%Kk-lWJ9dBjN  )5Ɨ Erzow1?$gߚ~\`~ Ye 223agzeD[sp}@f2숬6hɏsxoU6D6g֤)zϓ6@@CƶO,#\G[i-,j5眏vT<{"Sƫ(IcAFKѫ4h#wuQLyx z/%[8gԋe@'3T-ԉ^k8׼ 9ЬI0˻YhQnIf 3$e4"koxp iCӀU]p? zt ~X4$\p0qD \].`1}CsEi7/`Ĺ]}{ ~!?ݦKzbxuFO͜kr55Tr/DE#b J_DŊf ZӠ_['u[-*R/T*ĥyڡ&am׽׺[:?c,ƩPSNx l~20$޷4S"ϫq{E c)kͮkhǂ%Ys8L] I޺R{o"val?,΁I;ݐo}bIfo3j&Q#*H$-XblcUأK*wy-Ҍ|p%ů6Hj &LOǍ:,~ӣg1H+8x0!U75UtЪLbR)^s*1"Latd$li4'ڲC6Y+6nG׬21?eXo$v@3W,&njHs5c+| n6;Q]ܱ&NQDz@ȀCʙ*q~9 XQw=Xgl(ATx?-bg0VUjӮ;hʿ ø=L=u%#װGX2dLx/bl4l5F: :7T;Rpzw5TBKYҢC]v[dR#Ȕ?P "\>t4=?XZȽbu2_&e5d\\'pΜ'ّ1xFfoG카)M_Q: Fv޽qFF$#%\ ?a8okHRڑ8̠D7%STi.Hw bdւ~U%}س6u:/y2к!|VG&۹fQQ-zR3;^yaBx# ({W Ew}Cf;!O\7=7;,n WV ʺA`Qp>(6̕c ^'ox7RW`_2KI@Zs:h#et^; u#w+=PUGy ZL\:wnLRԤ6}.ea׈00v !\o}' Y;gE6ίX(*KjwwKRۣH*|$do_6$EinpW+ٳZ/]?Ton`{hNfrȒ'v6 u\{o¤"p'OթGIy; vP=j¦JP|Rc;8CJ`oX?Pa\ 0Ѫ0fX-▭z#WAb(!Y Cq5yT9d&G!eYjScn hwyE|SrZPɼE 嚁De$NnI~ RI[4l:($^søH'W M7ސ+rכmVktg_0Oם~pק؂մV QJ7`>b}רo2C[W6nT9řŹ [̳_$MԘؐu<ZV&RL1ք*N@jbSJ^k<ʬu)wA6y" v2MOtpޅ1?.:3GOF$+OJzˢaUtJ=xL/'Y;Wr" @ ˪-b͹ֽЗOuFX2c9/9QJ]{x~86fJe@Ѫ5mZ#ĕfnlUAwFJ裯L |nnt=IB h4aqbڢld˒6򧤚b*K!=\ bIIZ^;b'@g 8o] *W>pII;Н-=vhb}GJ훷O'%YrAܭ6P/g!4Ӛ5-rmv^_p?{.6uizΩCijE[N ކ6U^S;[$L d{ Dw 8.=J#u&+6vhJ 2dz?J8<2Lm橴,9"{=E'SKMƎTޜ>R P%%URONp9ZMX޴h^\N RF Ȏ$tD/1޽}~*Wڤ8sr-QWYg|g 1>{*2C=L)*NG'q}ڧ϶_ l>X-ո%ǩ0G1l햬{Tb3z3 Ye燠o!Cѣ^M>I.(&鉐%Q2 h_ I7A6y-3I_QTl$=EX"Y Sܤ^0EKߘBa# |_>~JsԻAo3>U40w}R @gm+`ƽid[ER(5`,h1vO+súi,) : koaG#J$^tf8 s +rs.  -r+~opɘetQ*mu#s2AyD]$ ,X Rzoix1ꦈ,'6?)^']BDr!,7෕Û*:kPSWya%;q%/)D%. XbX|ǵu8m^F}0tĊ^!J/o<]s 2RXp$sRiqaATVE[Cc<a?N<aI'Ӱ%"Ac"&ӯIޚ|38}?{j 6G ڃh{ߣ(|jH4;{<{O I\p8p-=_x63!ѐwSt3cfZʬ|/ /5(:z)Xh}GA~*U$O\Q,%qm`v/JzO>S&V+OS<= lܛ#BT~Tt )SRD?,Wzc(ah-U<,%4U#?˪?)U羡,"{1J]FD`0{S17KO" \ـOFO*׫C&]e~`gL0.맷y |wf9 Vad7-TV)PE-^%Ө{0Zp6%DJշV7!9'XذqeP>٫(ҍbMYnI9w#$.ȧ ⩶ "s;kL}$NBy_ ߙLuOWr}Ѭˤ/LA,u]*-c"d |K;uayV-Ӣ% ˽x NTSwQZ/uh`ʋ;S KyST C o,@ʣ~58Ļ{D~bp)%keT^$*0$  [IV+Yy_Se˕TE՜~ـ[jIj  fM=r5ET"s J0)(sJaÑgyv$[7h jڵh|rBnv_i$8 5 r()}Va$(IkwCjzd'&W/51F>g+mx &l$[f6AJQh¢s)1bA(0*2 Žoa}E5}^ʇ&8] R~z VSblxlm/}G ^a'ys'aN ^6? qtMj[T[-uKOx_55:q/0Q}ӤX#@2Fj^Yxy0؂mdV=,?Itd{Yy}.Ь%,ְwoݟZ"3A>?C&Slu-:, pይhuY|KRn'by=<* %g=íc9"3hCs1l5ϳvCOo+eex9m|bU_ vkb'uCJi4&ޠ-pF&C/2uw#Zn]Xh q_]EƢhR5*;%IL-s{>|VZjhՋ N D@[Uլlmԇh*"2҅q~\Тm"0tiqdQΗ] oOW$Z *ښ\Dl9 痯f'+ck>v $DSLGn6?e>B( ӈr;DQFvl1?l|4BIy8E|Qi.ʶ%־+JV)L[ 9HIl7s6:A*HA{란iU''NBj |┯z.~pt_p乆#.,6=1mAWVLA.{gzH!lDw$z-ZRhnfz\cToӽ'5iF45NV1pZa o ‘~XwzH9骓B6K YVŖ{;o&lnիJ;Cs޹'L.k2L LQfoVF9dVb69غ80\_H}}QKן6ƆMOkS>Ө]r5+ZǦHi>G,3}Lyx_A;Bq_EٳiCJ}CQoh @b(i󂋾L@krKy>H,V< 6$L1ΨSu2Xۅۘ #wF ͂K7pߪo.TGދxGfm0$yqgt!;E 60mɎ4ðIxvh~͉/I`WGM Kv ~":ZnrM5hQZ؊ShIܛ+%xmr,91F3〩06YH# HV]v'ro ^zaZ@i.2@6x)#F%_6 NF"; Lژ]<bs?V*JsV$>tqyy=_;|QeۑHP°UѸVUz$ C˜5՟mMFZȈcK& uw^ak bpZ4Ai5~ ڤBD` PSG|k*mdɂE+\EAJlsFhr: َ?NƉ˥Q 5E@kVmy̍] $K Խσ"ߔ_+ef<9KB $8T6I vlƀȒ78ue;-UrnH,(4:cZ NmgHX_B Y!#ՌQʣ= `{K]╙}!w}^T0rv-&5, D(RekԿ`rx% (6. 8Y)r0nynLzؐH/) #cS֣Fy'l i]}RvjgYgS޳n[Vb*?IWۚݺ:(m aP(e%q}zp33!] CjoB۽N7ŋ&xԘV>H1 ֠m% ==9s҉:m38krPGG[9GqRi$m̔*#búNfGRzHa(MF"Y9>7to2#6[[Ńnpgg¨ߠ'E.JX.m_Fh`6*n°]" r}oڀF g+!Y|ޮ>FGx.Pԍ'k)e¹q0n¡q/I"u5ˀ6OI7\H`m+֡h-)i crtܣHvur)=wS D/C}+vq3EYwrɑ+88ˏnvD"iǃ޿B-fe5f'02صgYuw|g3kEuftPrC}E#OF)pio>GE35]ՃU/=;W{/pOˤVvғ XR 'P_Fcͩ̔A$O("L|o2[#d6.KI&BXA5vIڼ/r|?i =1Bwe/@%iwb?1mlxeaYuRWS]hmcJWKGs1ac|}mHW!U qIKQw̓H B<Ęb^+6A5em1Poy%y%5lėӪ2vLW0yM>ip(R ΂;;"MYZ l9=:gN!:kaV,9G1>L>T_uٰ9y@2fV&e̫ ,XnI9]өLwЕ]\z ߿ۤMq6ٴ27 N 6N7A(a- \]'_¬Nͥ:v  :3m^/\կQPTs4r\x;oNpNS0;7Fer' "r`J\-(.D04 boe"Ɓx<Y,ݘKeWlzӳr ( c9KVa>cz5U[4 $jB 58"|z`k+#r|IT]͇ 4E$g1[%mVժx[OʷKo&R-ؚkpM%!fb7M6«tNFBKA'u j{kEZ_b%>T;*E#=wlC :Ǧ.xO!`4ɱ: ӻᮩ+wdX5oٹ3h/a3!cS[@/ u4Enlpϝs4S3MSF.z^5/u3vfqTukI DNqDK |Hb.YȺ! Ll}K4!L!<QiS]n!'"JeЗ e!V B w*aJ!Ňeqx\GUr?WD> s} %1~cXxuZO<:דݼZIL}=8LΘm(rtQ$3VI$p:V*hn7V7|A5?{P8NQG þ.Kpe$ L`o2]R4zh֟{GWV6n[AJT01ܥmp0LPIQJn']q*k'{=D;8JJ$B'h6`OIC+ *dr:?()n۟ ‚Ũ =/ZnAn<6;DɊ3i`xNAB$md:a! ^Õ#==yfZ1i~2F#/561]Eƥٜ3}Xi;׈2oAqh]d:9 unˬa8Q:OBqOVPtUpb" >_/ͬkY%TٸK 1\e ˩Iu(J9XJֿ<Xr6[L ]Ŋ_̳je7ϊ_z/<']HYc'^ 2;~;܊Ve>0^K119u"BWb{Nԩ)hN;vseKõ$y(c5hD7=g)sEK2%'Za" aB@y-krKTDnX εYyH 4KCּ)^ 1X[CۋK0842%+ZEz^Mf?mF]5~9PxJݼi_seIA]H54IQ*N9.so~QqP0<׼Q H*ۊSC:%s* & Dh4_g@_c۲63=9k*|.*1mpvN..lX֩uٖc{dYALd'8^9STJ0G˭saqI6!V$H+-͊BӢWocaP^|4YHX!Vz1Kctn m!1z?-wVa\ΪGo-jIRq)!̪ߎ0pgy%FHT- *kE,3 f̀|45o&GgqwTP={:xk9Ӛ1 pR0&jqi6Σ*,-۵Hꓔ`^߉Y%Zٖ)?,qr'T\ HJd~2(WqWjXPoeFM+L?5Lz"A 굋LtG _N+r!>wN^911$e#|m}G.>7x.7VgpY`Zf4ԙ0x@Ll\0u23s&gN*\|Y uwY oKmCɰFy5YNhaTv\1a_N(uw@we2lk`AiX%x+Z|~YGF %|sqay05Y‘flPU d{O+T1WeؙA<+D }U,X+BQs{mĽyބ$dg*hJ R.Yz0oYHz \N&&HF|@^?wT}ݲ (lⴧ,~~T"_l/,H[:VH'<ǖK?]EM>.Ood n0VH%ld(i^ք;*1C.d FھQ;?* DDi l0$ 'UT;F_\zB,<49| ձ~2={$?]͒O2,tnqmGЉ"e=B:a?0`T= )O1ݝ$@N" ;E> /61S'0b?gTYSTK*sAȗYWR~ʷ*(F-Q,Mp!^&AU',_G7P @ՃSfTy<݅f[F˯z&CSx_6uǰ̤Z̧)?sΕ$le\$mV(di@b]D&Н6s@]'^m 1~6|BT W; f=AB^/sO+I08-a$w4ܑS(􍉟GK,ώf`L4 AkF#\숻e4ҮC19i߸TQSțծ\(ow m~,譮!.gl;)T2zd?L=ƕdNג"t 裎!)g^\e~6Lxz JfD$]5Z1S /!xJx<6P_rρC0:WEŹ\G/G 6]auQ6[PrihxDc$44m8TN& ]x%xu,(TܼB<1/>'9p` 7c&oi0OT`RN}ё[Kkܮo*(n\)p> P2p$LFSrU~~>: F7mPF̹azVt;sƝrI:|Ժ>\‚GN0QZ5r8xߒ8iDwJŚ~ s{q+KLeqZoܟ&C5GPlNt| g1v˷Chchu>v8a(!5]y1*{,\ sDcϝ6 o{.ZscM%'2bSNB/ͻ0 s52Ir<@S 7^%f8sٴuo1RD9zW|0qv~秿n:+&Nw6?<|ϥ^r*(p⹮WQ`o0fŵ:-j.‘=m]pƭ\(To 5/M(nG lTXnDI7݇Jˡ)$ z'rHl 2 I8 g'ioO]6W?1qm+ )qh%5-*L"v-Z~mZ#P¨ 4{o&8TW/bbkL R7H-dhv¡%xՃ:jzfJk^` l} =dqy*Yqxdhms*h}e1s0a:\?;\j9u7;@2˰hq.opmp!P><=kK\F/-%}bIWӪ3t\Gb.oVꓗkq+߬l~{Hy'+qti14[dqWr $FUb ^o ~U=A^ %aŦGZN ru?0*,ȴ@HJ*v=XQTۍ fFwMPgQ̽ 4lJ]yڒ:v'qC@[ژV* X[xP؋~ɒ:ԧSF{j3@&۫Xru8⊽qwp`W78P`<D?@͉Vו=l1?@ WQVd2 l $}Z>ۘ%-4Ґ|3$C<<ٙ+R~"ߛf{~"ɨu7e6}@*K Ƨ[ԃ(@PTB-0|鶡2,\B֊mJthhRUi7OL>MS)Xn m?ƍN${=Sһ"6*Ѻ2(8ގK=3\eiWy26<94H%|hpkM7c5!#bpT@^qqƆ:?I[9fui&ҥ1i[v0_a:tUPb b>e\IIM.w-ns̓)qx.nChp/44t\tv#`_*^޴e>\u6PQRK P--? FE MbG  6Dε[,r\s{pѧk'Cs(LMwra0 W{h HE|$te%zV:7eP2>]f68gCIp{4 K ժ8?ӳk*J)1 $Z= ,UЂLef:u򀅹/(hJR+@cP?Y/bg9@ye3[!NMla0[( !߇<(eif"}?w|`ӱ[,؃4>[᧮`:x7D(=~l(+bZ;nnjI1+9Z2k\Yc;ni48H91\DZ1+GU(ۻ|`2qRcbĂR?^Ꚛ[ڬ䞜̸[jHC/␻(nhƳo]"9c#ڠ$qaUސ8<55I΂ Bj RwEH8}2X%;cԮ.Z:U0<+OܥkKo-2cL3|QJYim]{Щen76A~D0:8hnW%2Dtǚz*{J}<`-qVnj=QXLKG$Ґ7 [_)ysBPNHi~a]@V{u9՜YlϵRL,!=IY vev{0Ldbx$e;qG}O%Ijs$q-*#B{D\? Q=`M:uJL GܥqLڐ g~#ܞA!cG"tʙvO˖ntDs4SF^AIIX&+ʳR]Ab9<+1e/Kf9 0?ڬ)|tah|4 :QYۜs|U$'s%(%+eĞE)H;P&*/ `[c5ř1ܕ)Fd'e)]C9cؗ?cp&1dl`tuLF7䠝{vUi9)Z);#h;>VI /'6t#|׌NDE Ce* S. %NF(^ צYнJ};rځ)uչ49jȪaYfW->g(V9(^TZܵ6a4e+뙁zz!a>)[j>ܱڊ_|eXXuFn0fF D2H;(ٖk66o((6*>^EOϋ( jU 5T<{$[XزMS,v";^;0;*Ё""$8 ?"Jk S>K"³SIz}i cؼEK}"x\$"Iv-Ia%;}e|6OJQ\LZڈ⸶,c*+Uk %NGX| Ån%}F}M]_D -ɾ'P MT+2ܫl '6h_ƞydccf@`l4s.| fYL' "n(<MVڠ#'c )_g !`o &Ey6?]D8E1=ijC(xp+PG1G(| #4g2Vj<;LA䃹Zwk^:>&+]bLLq$~$:/ԁ4Opq|v!JЉra i03;g9&hHs+&\(bwiVoJEpdaP< #?ޖuX|EY nٶtRfޏ'f&[qD pL!Ě(&CCX>bPYF蜯~1lGF2 Fd΁ }Ѵ|!{B\$ɢ?耾p :*C*{jɅpS c4j+H#-vOx/6l(*;OBi&#}\qhyslgJI\ Yr+Ix6Ews7rwiG?Anvi1H$hTTU|*г&$c[sgǟ2xZyx*퍷G& 6aF=ֶ66W? I7 &#zq?G h$LLDp apYgR?##w\So$MHЙOJ _+9)._ ǽ|ӳn%v}z<+y|L¢14!4 g6:Tabp dw/,4ΗUjF< 3T=kM#@*67Q~IQxFd606ݟ^gn ׂgD eV=u33h80[dElx`]UnP |]Wu=ܞR}d6Ҡ3kf&Ҭ~^I6A KJ7=7gYB~fph45QWnTfLVQVK=% d}>ݔ8GiԼ5ZFQʸFe aw<a.A֒66ۗv, =۬"?raz=N0ggDujB&Qsf(^d)revY^{BKM:*H 7H \JpP{efkGNA`榘w^E!DRmՑ?ˤRHeS=8tvӜvʋ՛xkጮa]aaщTkRo}.WOr?9W޼sg:WҜC% `(5NƂ U~~Ei:骎``L?;}Go-7ժYkwgJװj<1W!Qq2O>0 zcig^UGV7)̛B)nJ5R`zVP?(_ys/Zy`!ekW$[1QE0r_*pGYQxNL 'hs!87/VE|^:J=uHBE~,$uDח*5ֲl ckAφAO@G;- }?wE:YIEcf5EX/xerZ?Pnz}9UFa~eReCRp+!M-;{0CC A6LHj<4J%1K.-"HǛ465JƏ Ϫ)]aJ|hffFR71-WW?V|p_}$n蕙n[[wbЇ-sS`?[Ccl_E> 6Mӳxo_-"2MKC[&/ u-_d>3YYp6\B(9o&1}?W .eJИT3n/`\!;v":\qmiWpWp]@䕡h2sl(C%{/# cϵ`U\[t3u)d#0AO9;t>&4ZH8nk\V8DYcZ/q}T'| q6+n wWB:sOn݄q>`qoRט) p͆E%PAXzfmY;ny7I0^}x'ɗ3틶P`Z@ +61U(\KBU{~~d,NMKγJzif}Q(Lۢ$|JD oWhGW}zW^52:?>}mxc\Xg8wyVhPNUmĺPGc~S\VxSzU۬ZC \l% YDmv AH-txYɻP 8JorCfigGs5钃A g|3ƈ,f>q @NC4RyKS,&{ ͊r̷=~p0]_9'^`:ͩp@ R葇jGvY}h+Zd | h$*zHıWM,ڌÜܵ2,rN@4iԦ淵=k{nB˭)[ËN"eZr==CQOBc1IP] ^vޙZg~rvD䇜 czfh+Eu>P|30a l?Q7u@`xa͡9E><4'ƽ uwV#*dZpuG~,pEk?f/K]&ԢS7IrZvO O7K$k&T=f􉛽MVո=#hQyY[#[?9q~pM׭൦om`1L|ўn3,fKV=JwaȔw{YηV636"?qs>rh@&M IsЁ:eo΅T:ME ;ENF")Xrrl)OnIg/dP_;z˧WB"AvڭMC adzL#iHO[[X }.;o=dzY5\w_$"d.Q+ݒ%g\8`膋_܂ P[6մg"IFYkT1Y퐛Wj׾h }`9[sRݫxؾEWZHK4ϿYn5brݐ5mms}O4Z7STNkZ%& Ai7ZUgīz%NE}xόy  SSrwjlg"5'z<gM3{c;RbvZNU؂4~%~e˃ SGQ @AXQ2_`;6ٺ"rރ1M i4+)Q7^7% Jx<9K3:u#Y?I%u¨]Cd*Ȑp:HO9+VL`{YtdX:l_s(a y&A@NogO[aJ5Pzp䊔zP, JɁU&2j~[AazO<9|;n[Hf۫"23~v͖b~5#T+ʁzRɼֽ.2jԡïb_BTZ#ǨEm?`|/mDw"(G5jMs y[?lfl!g);K3ϜgZm^3zSTDC cs]+1 d 'Y\ybО|V7X=hʸ?gLϠZW~fg2uAXj t +B5 [Oj P$Z o1{ѡ #<.m^'N?Py|#sC7HLzۑ%>}>=q/Ln4'_\d|=/( X0\*7Hh-/f֮x jWӐU=w1b*E42:69*$Skx#&W{,LA^k^?%9ޤ\gygD;+(rʱPk):6;E#ؤC@11=)P}&^U^ޗ_6%,y_E2ïu(S8(%Vdօف}y]TD[\53 r@:'|W`Ye$RMQ & {?8Xd5`pJ "RD|#*)_B$.eĆ{䉻5~/I.tt06N<"P6e3tW_C6FtʨNZN{x<ƀʙ!%Do+ߵJxE=- ݞYbsa8"Vsu5Y`}M-ŗI)Kݻd#o' &j~aY|/&BfܜJNrt+^)k ]Α<੬$̔8[3Oee?ӓ{aXgMtX^xNKySaykc3ZX|=t~mEJz:Kٱ(؅u%1zW1'sXn `flٹOsG:PFz-NC}#E-9Ͽw@Ӝ[ ӽ3m|BWsq;k6؅uyވoF$TVC\򘩽۠ڟmP`_l`@bBٽv%]=u`"BI4!bkaڷ"$w蝐PdMsz%/X|Ƃj ǐ"Ne߮`ރLZܱm6B!sZF_#(+䳖Pkrk,.+b撿qdrg'T$[iv)j*{.('h5)Q# bg,Dxߢ:H (oTkz\,΋k]=)@;G=YfV37#tmG(54VZSk8%jFyS7 Õ=:E`Sw=USYrR'?G?(uMfƪ 3m fn ũ-GxjGy^n6)  `xFYYӨkЛ܆hCs WID|%RPV탆:R"ˣw>p=x43f#G u[5/f{sA] )ck:̷6о^V[Tߚxs@,ǟ[O1Kʩ``=PGI`mp} StW|~ƕ`۩H;umkυK?``-K^6{i:Z>88Bn~픐#ۣ7 8ja4d;h~xijI̴ae}7z"/"rY4_xVtt@e}{[!焰N'Kq̍ |!p;l4񮃺@sS$iV.Yc֋Wzv܏.iu6ۚNloCJėZÝMqgVO2qodƓ!iȕze _,ښ.v]?'yeiT޺$Im't֕08BL@Ծ Mۭ=H5E]E;#+`,Căta6\Kھ1z5,w:m?8A({eZGdn0:z)w]r l&T3e \IR :#&ʍsf/7 F1:7qZְa{%*NTd)}xw[σ@KJɫ0t!AWq1M&-9XJTbSs i,R_́p%+c &0n#$&Gʰ۫Ĝp5c`^&=)%V N8g,;"kAX5@M՞0=]QdDžFF[=qڽ- PB☰!ޕ(p"v6G(RT<[GZga+_)*ggw|'~- YE> wۣ<'YMO(ȶ` l( G ww;9dcx+G7=_798z4IAxMfHF=0 YZgstat/data/meuse.all.rda0000644000176200001440000001111514750415431014665 0ustar liggesusersBZh91AY&SY/-]]H϶yx\N=k{^l!wupZB>:䆈"iM4Țz#2iCQS#bzz=&&IɩyCIA#&@4h4h4ѦS2?T2zISmQm 4di @OH@d@z@jz <"hz@P44 iF4 $҉D?IꞞ $zi@44iMhhH&0L40@#L`0&04 D$iQLSii 226@ F4h ѡ4@+~[.\xv6vZ[RnԹc:}#Zs [ؔd#YMjcb.0fDg26 PRKc(AEiVީ;n0ȥ(PEE*QBљTLR"Yęb#[bXȺ(cJNd/GX҉~xQ2 &[U*z;"%'dsJWX,sURjAW$$̱>Iv2S(;Q2'QRmSɞQ$w9&1WY<)ԝ;lT+CUxIRJŀk֝|V[ @m $ЛgeL~ӷ1 ]1 \V'bs<Èa2YA2 R U|wAddI d׌IkY=N*jN"Är0&[ͤn2Q$ OI4쒈YqRDS9*I]ASLWyU٦C4.T|̕:M@Y Sԅ.oUu٤Ϲɹ^6*^_^;n-Rl 杹Du͉L+D- 2N7 [UM"MK*cfCY智@GJ!iܠ t3\Y( i;Ni40HNR=IJD@( ΁F@@m2-l3BEpṛ 7iTdyEwtZ"Wo씎N@wWP1U% *c t^P`ʪzꠅ\!)0R'Q!+PIւ-R'/;%糳$i$5R%⵬Ll(DDA%+]ߗ pD"٢a^8\HnP|B)G&` N?W\_3ֻ/1Saƺ6bw/]_&doAPH ]a inRt^A69JL1L'd_D +i i i i6,-Uٛ0%Y@ 1щ>Pmʔ\m&\e?] X>AƓQn (ΒXawԖ2Ҳ4o;C3 \,O_)E`ׯ 2y7-*Ҏw(ѭ-?^ISB x{ \ZFI2300d*ʐQ`aD b(T.lTb"*EbF "b(P "EEA(ȤU#P)"AEX Ab* EF(("( XR!P ,@7C$PYZH'[B(1*44DƂЃ#g2]*0;,+Pn1qr&DȘ̨sǡ7D>`Nƙq61gb 32r`\gwq~̦H"Cr&`6o&S$I?CVbyg~{ؼŗ1{|ٓڲ}rH.؂V]"Ľa`ØJvPiyG=Vdt7 Kl4 N{HD>ni&4+JN9O!rXob+mG`v|ӧo. D)|Obo 윑ްH"TǠ>ݥb "J<1bE- ,:ХM |F=AGn;! criP rDe-F~MfZ@"IBy_c,RuqPR@Cnz+-%푍ѣ]27Yw0-Z$yrB   YR%' |s?N tbh1Uh@Ma0` q=aZ̶1A?Q4 J 'ۘa"bm!Lt{e0lR]`kEAp e4m6VG(Kwsh>Atw7y{niݦx0FBe$/܀Cg~$^Z)(PRW'WQ^xKHWD/pᭅsprhobDp9!el2 :=C ^;mzOHlL ;a0ZJZ;lZGybm|UBȀ+!Rd5Ʋ00(VM7ݍ9F*8[>fՠ~/ /si3- '`_ʒ٤#Ef [mQ0*v}m 7>ꋨBD풣,.`&|57׫࿄:N6؎HhTSoaM޶=ASw=B 1PY( 0Q7Йl}M_uGڤ̚u+JA742ds#M`/-7wK`!1"iBb覈u}]F? 3d&E7RM}T6r:ǶmoVuUTޣ΋9р? ]&iuX蝅0?BYs٭*{8cB@"c)W&>}>]*Twxk`vzq @")~@8"ڻǐΟÈẻP /*SpG01Ԩ'TȚoDX#a7ޙmip1  piYA̗@1hYdmwTRÈ$">:G˺zGZіW>szB_y^>rs`Z1W J!^VR@4Sn+#r˵*ΜW+)tw7 џm $%}tJHE:_ X"O)Vp%ݣCUI k8qxFz/q ~0h:%$||zRym&wj!7e5j#f]ai2A4k $Pt3bwQAj+=Ɋ/s# n)bTqJ OwŇk~rUhn/K?VM ʩAK٘DCQeXP ^O%6$͠a3r c J\2SOFog lΨsd՛Z )]k[YA].}Nks8˦:W2ўEʲ;[4㿅StqܿUcfIOAG\rj L?FbJ;^ٔFxY6`0]p8Y}a Ƅ)U v 5$,h/o[| 4!7txN9 rdj\Ts/GOxy6Zw'<_[ V |5) P: )'W_类k#܌h4XP3\|89B9"\7ww*] 旟C+!#Xbk\/P2z|NK{/WL)T U*4'n@ zk'@L] Ҕx& : 6 o7+n y PMP?c+V2 wpx[!cߤSC1KMV4/޽D}NA`5bP(*(WrQh3=mL}Q=q9wY0yAB([ 4x/V++L.˰BA4"-I:BΔf$kɅB;s녥U$n m/fg,Q@Dl;`֔r'5;'rgj3cqN&wQ ™&V2; ?5RQŃʻ;?}Zd'COS&A>(du(U6KbêSNAJEZ[KWw侐QXzc!2{c rz[{A~I6 b7 H):`uQΤAsM6v8s/:Мū픒teo 60/̈tS%Fmɖ^&˻J'DoE6 gc ues|j tͮ"4kb׌?#i-SC> )).?P94߷0:&`Ξ>sIS+#{ wedU/a[ijϐ3)l ֓F@$5scw5{1W8$pH2$jjTK͜cVT-:e*kkBF,li)I|6g30Y(M1gP"ȍG`Qg8q*k?Su|k4KW)ȗv, &tt̥FoRS%QnY`Ɨ>4;&irwa JØxkM%>MP~\HǃTDYN5xVKA <=mnbwGAU!SD)~#vW=N`,P:W%>R-E\Vl:$iQAYb~AIT]=D$^%N<懤Uܔ ӜЫP9FN 6:oc껼HQ:}>mT Ļ XLt:V懷 >I Ǿ>9;QxmRf0iϛ6~Jw3b쉸oݱ WG_< dAu {=LAbG.vm!~ gt#ȉѥ7eT2cm-wlwlۉVu)&nfq/Tf`- J}(LFy( 3 şϣڻ,Hq^uE ɳ#&l_ɶ[O4\_c]ٚ*,j49B*\4Y&Ea_E epL=S"ty\|ǽ iž5?.RIxAe̘"Yá(d$^oGLuL˸8GB)JrZj9BW)jcSuъcŒYHf@reK BlLhO՚,p([f%N ,$,8c]\Qeg9%R be9zI0\rHd=z/چ{]q!#z69>mr7s J&1֕J7=R ; P65"-m7-TC ^ Ov/a#?m ʭl"e5Λ 22$+Cohx_RQc]]%+287/Ӊ.Rfxެ;()is~@)II 8Dē]lhQ@}>^^"]2L.Gsp궡)w@/BA& xCtvŜ3+ܗJCRx 'BkMmv#( ]>1cWd{۷4R!JG*\xWwYC]Pq=Nb94L ę6NiF(LhXEiz((sB)$B|';0Sk5y=s0 ڠb-.SXu,wsU8yNƩ!}p>gGƙg=@QFU|W@:Mze6C=(P{oD0R-Fg9>R!jBX3&G'S(֨32ҫ7}sKͷX@d1HmQk)X/H6PZ1[o}zkE uc &hrOded]>v1[h0=$Qi($/p̴_e њ}1J3'(p>ܮQ'nN;!=pJ Є֥2g Hp1IpI'3Ou1^x`}}󷒯` +T'd̡Y2Mv^P!Ne+n,:0 IC:{xQGMhuX^$޲zVb3)4@xQ!Č1'SH\)941 U' 쳠gfZѻ&KO(jӼDI})Odȟ3[ly Aqtm\9ח:}(4yQ TDG2HGcKri*7 Ar]o7&il2/)p{rjZ wr35 ;;`qfx6Ws<ы'zEKuҺjl;jRC֌ia5I{4aٲmilS-f_>Vp 6@QܹS~[cx3@&= }H!9JO)7%NL3*cIʌmVf8A,]BzsE9IEV^8v^?/E@ ^;tY5/jv܁]yӔ)+:6 .tŧאu\R/CfzaWfF#~:Sf(\Ɛ[f(Hw IGA.bXp~s`.ס3vNV~zE% 3%JbaCB1 oP@iY%?铒͆4*{{m7mX&ZhچP Ŧ.NxwYm=E^*[kA-]:u\Ȣc_حIĸñ?#[-]2dm$V# XJd N iaTɟM~վ+Oe O[Zרs膗T֧A> [/Gq98KuN}`*FmGJq;jدs;سF{C# V$@^ph՗PPI˜-lH~Xw>ƅRD4N}/:5A|R0N}r[KPplIV%UӺH8azMŮ2t /GNIzRm :gp^iV@k"bocnUZ342>w`_HPKLcg !MRKz!Fi:DhidN$NƊkG\г "Aj8i`&ekK)ң[`5 f~Tbb?tj[B;yI =űLgL|U瘨ιL!96xsd2V`v Ju 54g΢V)i^b;l2m$ )UlR)Ø!lo,0ZPU7ri^7*_Wޢ4_Y*'`,`{'X⟡ r穠$'q?r% Hg{1)3~Ozhu1^ yCI5S#UWB2tzjNxQcJ v g":=Ub[=3_M-xsByYĸ"&$C ћf zžk#H#U+o/˶7"ѣ+-߂TA9[~rǎJ!ALj"),-B14~l蟣)t͢vDVm\u|*zO^]&Ϧi%̵yM'H~kpi¨ @O-f wViCmp֟or庿Xzǝe۶DLF끖kd0\qW\{o*"řajG/ǃG}}Z୽%|l\{R-f9n,$V1~ { U9dF;)1*m(R+! 5 dC,q7@:n<ܼ=MX,|$-Ɛ{5@v̗>c ]8;5gډږ4'`I6Ş}&}~OUfjI4n3IDv!R7͛1eG팙 >=3ӟ]CL&sR!3j1-l?(or+Mv Q[Y&2/Yc5TM;U} y"^VMM|3 {41sp|׏!XN+wzɽq97vMXa[J#kmɮzI(L.` +\pyʎ)JFSEP~9Pdt*'컎:뒮vCIʚ 7}fm/\`"~7ڮHD9Z[4gۥ8 B|&C|wCkӏtTO|MHȟ )$d*1hF/U\hw@vT=S(1*z܇]-Z73P A' #棒|l,XPq@}#tvX;=Yde͠^!MGn5{sHzzYsu_@}c4X# X H&筞Ť\n4(f*`!v_մZ ih& ks6las(Bg+F_nW2rKŠ5q}St9n8C˷6 sBA Saԑ քYS+EX'XqQO8d 䎯I<AsȄ>ZQ\ !5twh< ð-i"#9m'-ps=+'=M\ (ץߝ˕`Kx1">+.DQg-܅z|Y0_'eYJ=ĬL-݉o 0i]MhlkW5;89WC!kR' H b_jF^6w$v}F('{tJ >^T+}@ƊŔ3[a4Vb>VKmoY7f6nMܑ͑%@ˁHU02 n--A4XD:5MFPZBFÕac/RQ.[NsVnd,ֆ2itE .c(i\Y(E\ $+uZIؗ/>8Do<btfóvE֣2Q=XQ/6y 7d /U˄ӻl/Cq~5ݻ!' iM*wؠIB6,u#9,4 -U&N9h9k ;2ct$nU趗ĈfYjbrleDӧ!swx1Y I7'j`ت |AI-L̃(|5u42Iwɿq"ߞJ؛e^ڗqLΌmհh[fuY`9ˤq0i{Hyy"k]Xq@zq_~>vԏKTkf2[Q_x~MV(sAQ1ߥy歲KLjϔŘ(M7a>(DYQXVtQ=KIтROnN7؋90%L;]3T((-Km(`5Ht}5hqe^߄r$U}N%ۭ <ۢN` }%_,fFIձ$Z%R]Rt~'cu]ePuh!\`S|o[=LECL#+;]GF]MD#Th쀟>{F>~]&ǁK4ߜүk[Sg z\$]Uw I{2.u+Co0!ugy%r;Bv}P.kR.JEtpČN"%yw?i$>y>6`;|CL?փSZI:'Bހlx|׽lN-p6*l!-)~*iS7Viv%|QD@G.uݮ}i_>1pIo UPiwXT xGqk_swN:qc DT.)H` !:$,BXRirRsyӶ'uE{f{^O{˞tOC5Rr-I>2;$s- ]<ҙ첱f\f8RڶwD =+䟩cتH!fAB:."iG#w|3QvP,TY%"l #w;|YJv^UG5Q$]WxpW2RE(?*ґ=x84пg|AvjnfYr"+4z8 W][ g]DR|}}{ቆ;xj~ nsrMK'VDŽ--rWGP0}TK (8A~uH6d,p<5QċTNt&+N:,zX "yh3BJ4)['p5-pW 5p=\iY֝ T!OqE <6TW;$)|?n.ҫ;FbGqsy^``6 ي\ dAvD?P!_; Q#vU9rl-$L(}<~+Nr? $pq7B07NT.,JYDo~%\C^vhr #1'OhR~[2rKb\Jb*pVHHMMoR( "j)T]Za`Π)`Nī쿳Lh3E[Y2Y`.s.y]g<":vny]Lv6Z{⊗08EF%Rs[&|4;oT 4#X@9N \Qa躒)QG#}?z~ST[O0sFZ'pcM#mEߖq ~x0FiWq+-{ ĖT00Lba4]bsP5Ga2ʦKP- .NA̐R!UIO JẔBDŽy:El)ĚV _h6$}]@13WR-gɰsydO]"a |ڱ w%wBd׌J܁ Z_35C~/mOwwĨP(8MaGjm4r v{E6mh(\՜x,)#v*s bľAw4 U#E#eߠ،\o;͖#e ҟ>@c( ?*He$⠖_;Vy7O~=Z'=XΚ^ɭ s@w%QCh]wpU Ss5m7֕$9bZ#dQ@FD1P.Ncfw#z&Qԥ+Hd/,^0&(]F 3z<͸.F>Q%/=(ѥ4~zGX>G6 C{A&%K_M;U `fe%v]?5,۰<1)\)~s6tgv-&sTI`+3tQh"TR < VrgmRf}5hipCPu##*7ިliP8_3?vL(Ւ>#/oFuByY!(bո4Sb#fM;+OEo4qj)/ԺxQ6}0xyO]VjUr; 0v |cjQ]qCuKM46M* DTҫgiȦ}+BE XMx՟5::6ΌFjAI{7 (LcHN¨gclôjG.&.+fAQ,VLu^?k7}U|Ĕ,?rI3EJV1_0 5ϟW%{X<39t(BQJ*$f0q6mp]A7#(p(YB)cfERsi+  y4졵۱O[fVDlqo]\]A+ ~G(tcD o\aA5- gNۤ20d^$Jx,mO86J\}lNfY$Su*c3[Rd7.$=YE-?/PIieNhߡoH)lZ +ޜMcb[1J$Zkʃ-Q9l2$-A/bZHiLH,8z <).K-*)U9FQkp= iV3 SH&cN.~7Fte*~ļި2/t'Q.P {($0}W褐֯vBUb}o0ȞMr ׭#u Z: KTmŠ' Ҙ9Z=\yƿr$=Rt>g-Q[d1YSR! +vzaRer FMSަÒl9*G>f/-5fDڛ \Qu6*`cI/yP~D[7Hze+;ƁW"N ?\~GB3&" @q 7»Tܲ''VJo;ܯ뜽8˘ nDE7phVZP ]Y^L?SJ4#MH`"a{94[sـn {d56M|b1 ĜrWb*[2Fdz&l\o@:gJhnC![]d?ʌF,Rj!rdҋgoeF)HCoC"H6<3ۏF*_4(mdhv_~3".Oh*\ 7OTFSwY2HG}-9\;L~3^Cfd^+݇'m# l%7wr'%u>JCaBr (5H1sVVTv,Oy >EUC,p?e`s!G{'ޙaɓ;aSL|%!v^ $Pid5`\!1i!.NFŋLx,EH4V|ɉ'/z1_ŧ:h,.I0oQ0/Ќ芮Mc+y 0oXn.an#ݍ5..&ZEnۍv_?cs肞Εu73PFKԣX;7 mK rS4>u԰z5VbޑS܎/猿T˧o*udx<s1cDiCKY\`+ŰzeyMmz>FDfާS';ϲrn9˯*(ѐFwɥebd5Jz#{ S7 w޴IRIH#uva\I@o5$cxhlQs4ziN|Zڥh&43]kI+ 5LuxpB`Fl1E ?<4;6akĆzʡ{^'',y> ߈T0amKJعd#4W,Ge_Oƞc4G 02D^fRl(Ӻ|VI&\5'FIv#z) 7;Ġ`}1 5t2 z=m[XUw0ghhFvͦ 7%嗶- TFTjf1?7 e,uFn a$6[ɘ}|hpDE:~>0K/8EĜR:ˌؙ&Qc~m^P^2,4J+Vr hTWk :jp#P;#oaèV2e̻q&X;h6_:X+S^ nc4Cc=ܜD,WEڣ0pR_DԔeKV!TWBʌ^ցpxE\l)%Zĵ\j&EIG˺Oc ©]c&H6?_UW)j T CVtxrCbop7Vf %AC~{e;z/@p* 6X`_o΍ JР[=NJf'N,(s]_?Q\UgHgjF\" ,yЄ,qoULZ_s.[[ wGz,DiqWQϙݾ^hf5S B-d4|q6'4ûޠKeR !ww fcTx?&x;x#I:Ր]: Ŏus

}+nAT^g4kmJR;0}=t? OZ>R,acЊePɄb~Ϛk>6ÆY-djFd=7sQE כu_()x6FqHlE|z&4ng9m @ԭ,>fmL۪AtնYs 1eb)-mB ͫB7ŒwE]JqtM o+ 'u't.&>h9jJMWxxGnCZOrP 򴡃)z'`+f'bmOJhȢI%kYU)fLz)q!6.j&5;܇>,Iw.5$da680%}w#\xn{H D2*s\cNF ,g6:4q<VOg 05Y_'(ߠ i ˾T&ʔ[B,+3~LN5Ć7{ܥr^ J5̹ XgT NAj9u"KAevtc=ͪϱDRD'yMؠ;Xaq6EύRK2ŧ΁ٸcSw%4"7!,H{Vz)s~AEԌSwu* wyIdLϦsbϞۍ]Q1F/rI/`\1f%giϿOl֍\;GU U {T%~@LiG&Kho8YUBNx݇3*fH)^q F1 wK2 ]]p~F\Z#md0Os1P zlIgf)Y&97lʽ} F|.t2弉GforY|( u3 ꉁnUȂ"Tm.4q?!fEx<"Pk "Џ6M ^q>Wu ȣFy-PGVWb{XY<б*aRU<;o~])pc[Xx=`\et$4obCNP@XG/o0񫓁, 5ȝYɿjjB/S1;5 >&งoKl" Z$з*o驵 z7wZp 1JraBc9LT1g>Uomi=(EÎZŹ$^㎖ΫB }A4aF/ 8y麨L8 P5P}eN/dj94QƳ@B,Ķ6ݑsrTS^DIH2C+ DlgO0'`, PrP*fNZ.iK(>FQ1,+ltޝz["_ wf wIvk He3 XY'Ժ4@*K- yAͩ i^ٶnkP7 ],`)tOz KBlp蒟%+`fG~uOƸĒ޺S!@n~,=) OFNUng&R-!t;`:fAGAXc J%@gFQw#ߞ[#E\t,zFqANCd啀B!1~0:HE˿aNoP;ud/ M BKZIq+N"cҗF^S4O93*҇B G C;4I]&ۍM*Χ{ KYEI;scII9t-R; ~x4b9Rr24N}9w-פ;ߥ'Uk?"+^5pʷIqIWv%\tg._|.I+QWӀ`gzǼjSkSE<0$c?mXCj4bA-6JRE Ga6KV6vR|)'<~GL+d mH,/8NRGVےHz51`撖9vlM6ki1q>ſ*ػցN?b:-dd$B77uWj%8@̞-:a<+4_#ӵ@!KK2AO6+ؓ7Dޔ{!3Mk30ih[A~:S,T J3B֡`U焆QuGDdQ3ikK.90|DuّBlI؉%0zxN'$(kTjx)>; X\m_i!.]i6jU(Đ-Ρ&GNsoXkXtLO+vT~Q|gN!4Wm<3=PmL!FbZEIhn33AuzUJ I`K+4Wҵ0nOú-@͞Z62꜒Nw8 amh˿qG6S5 c&XEm#zϵZrב Ё]K /_()niyºQDddhP^ 0h'> 6S~LH+ذg) ϯ&]i#Kaz*4H~I \s q9ë$jֿ[l sJ&0Vd?7m|[>Tރ<@-ir/1h`K;;2"|~ye;6݈~ mބ)77IGNf쎀dKF|&ҶR mr"mAK3Uk4r( И]DYձd2_kmch|ӫ9m寯;|eɊ (k)} ϲ}Ģ0-ٶ>Q/d_}K3AW#/}r(@dpyZZq"- %6(e|R6S.Tyb lr`~d4H;4em @(RBJuo[1@dZ>Y ?<4pN0uʷClE3Bqe \_igh-Ei,{KKK2[bpOqQzQ刃J`йkxkB>*8d/U|f/(u)n_د&RW%aESBQ/,Ntr*;pu˭5K*D{+1k6˸)h)/q03 ؛ot X,Y(FE݉}Өux\=6='򢏃WMu\_f(wtn-шJQюvATD,Y GȪZ3܅Ȑ.kk ; D̗\'ʽf\gIk xsCGkʞ 6ϡ=m߹orjMW䏬աQuabtl{!efKX`uCF3 ѩ4~ #qJoGWh@JE:nag~/U\ [xɖlsa緸èyƀӖN.(@''jc+&|mMo堽`[O6ңa7gNFe){Rm5qb- a 5GJޅ x1V5{M\t!˿y"PMNϬR<~{b38,3NJjIaX;>E3oKf/*Gn"m&% 0E~{F7o .RN(8u:u]TG5 Een~&}n4wP'|&}r*kAC "E3 071&J},vN\0ʥyr[W:$kVUk?ǣ".ßr}ݬP?F/ЌU ;Uf-loJx` ;Pz] >Y@ҮWҦ54:nvUSGeďӜ}C#qDQkSϫp 6`X`@ \UY ƶAZL<%sVbqCEƗeD*I7'㐗&зxi`EeC %R|n]#=I譑ш_2@q\0r̤d WV " `Jx`k%H3F{fGi BhT;FZbã0 nBcp4p3{3 KG9{㵄%#'ƍih ӕwN>ϐj25UʚndvhTזH(idEPžq!KnU'$<. ^mwr(KxBM6}r~ ?S?傇o8s}~ʇeTCbF3Zٔ| W/m|1m7bYSdre@0/8A/k$-P7:`s(ndH[ 2Z{JBrNw@:zAA ,px+u]Qb,Q Lj޻Y>?KGgsUi>uqBKI 3д<7õJVgqQkq0%c\StPh'z\@qwyXn峋4Z JW%\ "' ܽ ՘~Us@yY/CZ= " O FA{L!1ҎC/mJ`kbKK-1]}hKCWPh@ 2Ywt-cx-_(FkvZֺId.k"=A:wiU=p{6JB-G—{5adF nRzVVQґ&¬lqؼJ*'%Sl1O֧0I SzӑG$O4h0 G:IЛ{q\6I=wi\B2CH<6h1 U•`ԩ!P8 gM)'b%&Q83( dֻ&3]C'T+][󫛢:ji2j2tDŷ1%u$}(r@>xE$WPOai.Il(n(MՑ @j$}xWX;z2 bLT1!b`M '$?9?yRZo_ËӊivjSoDHlt 6Bm1cypVC$&p<0ױ_8^̴MPJ*5k9%lĹ@AՖOy?ckGW*sKG?-_܄5c;[&jݩXu~/^RjsHqhKě" rZ$<Ν0Pa^B T*\%eBcpMS FbߖxOC1եh4OvqMeC|'J뼞~F#8B,4->sZ0`{+jT"X!&EڷۋMbv$fd+P%+Sp{lq=MKuʑ6b5%:Xヌ{)}!5j$Fv{ Ez;++\ \@ W!v i$.ԋu~e܂$p\U!$iq'kőZΛqTlmҕ[hi9YҦ f@Y]U;7HFؓB5|A=RUc:úe۹\`X AQAྒྷ=v؁rZtdwv)MNWO%4_4ct?|n6pF̅^}4q̾rPA|/XӰD"*w'6=&|.=RG aSL(u.>ZYMYV&:O0s@Gӓ"y($5N9(2 3^ bCS 0𞴹pekBNRڑVw<_E=\; x;q 4k'"@#* ( @@zX쳎@"w(Z!Ǽ]YU(O'= d& ra'4ޒQFi(7fxH O21K@M4qLxEwqiRi\À毂Bizu, /G"3oҲ~.B+5l(b0z /} jMbGؑ #QrbLQ5_Nafm{p#F/ q*܀wA1c CjLtGEFH [Ή&QfVqUgr Twcg 452va; &~jz9*34c*k&Hz'"uέ-se@ T"˶9 TJm{* ܤH]OGPu%{ID nb`]ۡ T !iߏ#8si>f/'*2 *q6waVgV}­#Wctsa6_ ch71Io]d$_)!Qp }$q4e,h&~4gb5v񥂝| a>802eЉ<8*#iaKy*tz h`ucOH @ykN?؆5chɿ9B%39D0b7UoQZ륥#| )'N~Š`L1jR c#sy kKN DjSqmbݼ=lZ| |(DX8~W}Ajɏ@X /~{!ް[YbQ nGw.IUl$HuzZ52㼷i}eGfb #xSsN|ԅ\7M#!LHM=Bgp(drN q=q8DALQӭ\@rJ*-:D|{^\ $00$k7" 5my'` * iWEFoDB}K SW#\ٳ^kiG̴vf @!dd3Y<)p<[BQnp Vs z0SDl&nVuq¹CLJk]Jܵ%70k+]NZ/wFwÿ&cq'F<J'{cpPlWFy)[8)]V(l"_8YYDinVvߤ4N?#6cxY7/N !v<2 z?35qu$)akKE } -Y1&F9&9~kҏq/^d齭A<:,D#9"VC SQ:"~ ʇ.\3.Y. 5ﳷ|2ʯ`yTї) 8 _ ~REVTmn@B[<ܿ隸y/I.U3PcL4x$<+r>y;_1uTPj&MX #(-n\GCl2J:T8g9`*Q;hzuʃ5/\1or6sfbz6-jq>.P| ?\_< !K51}}q(O;h@[׺W.atO|!2{AEڴp PSgg<]|T@]vJ;hsa@PUns;DiJ,n"tdqBFeRǫLdͶn(K<VvA<~R1:HzҮY/䧜} :t(H=ϙx.5.ؿ󓍥-j0rd}|z[p=NN'RG,VD՞إWN ^x? %M/"U/tc:F)/vRV*Bj" qc>v-@f##CVlu'[1rPp& 2K'萗';Moq-Q3ڽE5G-9VwP~/rϒtY`|h`dPNHeFoS|*;5Im! y/<|m*E H_3v\dzU sM,rEo{$(͜հ!mZbQ"TKqʽfrFodꡋ() u<"(sc2.0⤖8LTwPF8JP5&hF5ʉdRd"P[[2IRF  .fK-S`Zϻ I2WQO#pr4w-xPYm2 sf~ #<7PʠHATC"G*= R|d t"eGYnu@Z+;Ɣ=B_KI5@m'b΍8! Qh饠kB)Y9 1jSp 1bZqRCULSmk,ur=hK;Փzzj ]>5Re:aۣFZ(ܕMdd#5S`_]gd"xT_[ոWъv-#""pNGm + #~z~4KT.X-,{7EB x̮ wJ-[wM7-Y?O@۽uQpجÖ)"g#کUzDڛ=*(.y H9\.f%3zﱇ`g>"܃/H8 k\"S=>&1鴇ՓwK]{#ī!:rB`9*AOϝ5qjVD+'߇bBNd댚49.+$t>ts@iV/鑔L7ON|)kp|,;s;,ɳMō?gvx3{Uţ3 f,(~6 SAhpM`>94ﱨ4qgfm1Ȧa,nڮ`%ء,JmLŢhēg7\ (JJH?WҔf?C7EM"f"41(&,4gU%bPJ#1cTr!q փS[uVڍgrj >4gaRf3,:KTb_He*d;!T\{<`tk⇥Stα$ _9)֛J 62X5th {.mӱ9ݰe%pc6f4"ݶ̽g][O20$ t6bSb[5YY,5BC%IfZ弪9*3 -˧)2˳u7{q˃7vBZXx]O:db{|MS]Svs'ĻO3 Z~׷]%L9S52.`egOPX,|xǂnc`Kd/b}C r/Q`SrncbnEk/R)#mX\D+梶^"!,.sڋ;vj!>U.5׮Eo.״P]6k鋵5]WW[frLaj4#bwC* ds&l97c;?72*.Tv6R6uru\i>'G ĥ4&<)&ixU@MT.]Q+N0}QK0n0cY8zԥ5ټ#zE_ݮ3I6ufXm!(p6=j@ NcShM'sOȔ#]<2ыhx,˳=[pu>8Њ5&LhG%= Bʍh FBԷ<5iۍN)϶U}rP]N +(8[ʗA^v}Z P 2i9L?@k̪{2#̯I7XIFVֿ2 إs u#g|3ڎ}ګS3p(t5G٫sb{/i{Ze? w4̺Z%νχyMɑk`Gq`l0_#kNa8JJA^YP3E*}Cߵ8dTb^MFȕfYޢ'6,{I`i]&G@4]?ipf?_SLPlMZt wTOA?w:wmԿHѠPEfs 'Nkc@TToy,s,';s),@ =yT4y^^k1ɔnfݿ~L }tn?>E+5RJG+ߨE/& ܰƶKJ?+-"KD;qx$`h O%Cb k_ `=J@|LRv {3p!DOKhn"Nb[~܄\nJ[0ZMPZɽ& M=و at;#ͩ^nNCNtSh!5ϩ!9#oՒ' įF/E aFP!+څeSd_4GX/P؁khnK=@{8#W4кeݛ]Z;q1ZJpOwϋ?[}μ%%s~lm&Cz^ɌL\&^5j'@<^O7mOÄ}RD &dB gHr m37tcCgR1ͦb-ANUۥW~ Ń[$p` 䮄hgӎ(a ?ye壩!Y.ţ W4#'xBDロUUWw9.mCܭm+_f;)"\4kE lh⫩l=aAMiXGFO[N)1D`'HAkLHܶ8!w*xC%VQ &`ٵh2Y%xI7QEZ"a>K>Goc-OIQݣ*72uΧ3(wԊҼ*"o<(Olw7P ۗM\6%&[S]\ ot$|w3g(_x( ?z5j`Hjz^hd:/@'T+P%?k.!q}JDS~V_&b>_poHˍ"̒_\ߞq_qJpjt SpW\J5h@T@g`27^v\l+5uR'tꠌy˪A(Ȟ3', X &RAvCP!9-M+zdgbk%Es}YbAMlN[!: U`,>Fok1n?2(dM`jw{,$ !$ӂ̸PFǯ,&54,Z],66kKjD Y9b S_>.QM9IJ3:.-BNk]1gUs2C_5jTO*6]U3+=jG,yN}l*<:!M@q4!QtyEz]l@QcVk# ':wyMwZHA]fw+q~}4To0ZJ?h@!|&`n5, 8 @L>dV7FLԖ.Nnta|o`gΨ۷#m)~3@bfrU"vXτ"'[H:rЫ$aY=+7EAp$ 1vQGQsNa$LJ2P9]ǡ3+OFR,Gxǧf7iRvjܼ% y7޷c/qb'kaC`I5dq>ctB3R ^hȤDfھC:Íc?5K|}mv1cl6h<:AoAjR:} W1j5V lV>KI|} 0&?kgDmtû(HMޘksk1 jnrBQƄJEy:L^xH0P $=(򱗉{Ж_#ˢ^a!!%:Iΐe3!(ҽPɈnIuw(ByBȟ(.RW]թ ɸk?ޖKRivɑCT=bhpFG)k&bNl&Nm7+ͣ==zP7u.]LQ5[Khٻ;Rzc+=G'=!љ.o xإ޷O"S!6^Ɣa<7wo H|%dYwbEvGl*TDE]_ QMn5eWE˘ܪ7a/G(g[VHkpʞr|M#Mzyv#7z~"Lefp^bPS.x [0.`+sS(G[|^Aٱ̅'ᒻN8Z}$_X_O@{&LC֓L'Neq̝JLx:wl,s(10h:cދk&IfE(cQ$?OVs!PO3 CZR5o(,% -Wkf5P69ԻD tdҶƊOūҌO2w/szU@v<Ǻ7l8ϝa dQw8]"0QE}X`\^2M(IyԜ= 8q?Eru3ѡ._;ܪSF~Ñ\٫𖄝1 f!23|e"F־SnJ)r_ԃ{ipktj~ Ymb%kU9ݣUy!&b'\SʈN|0px<[tm@#>wJiIt~>h^H<=xa Il<t4a)@t[3ҬjƅC-'Q:LMݰ&Dt|VQ_wsa_b̖1oSMXu*v-vcƐ#|Pdpʲ"eo9PJe&Wv_=HXO:3f%=4~'}S6*(]Tu0&v>}.P]~3<4AH7}Z:890.M ӑgYu>Kn:ˤ2&6-2zk%ת"7N_F8kz?DU%~=;<?˩l@=1( I qy"0/ M7 .kwE^utن4NF,k_g.G `Pe4 ~&&TYooD FzG ^Pk_)H,@Uհ2O\.%sX(#}y<( I=-`` bPR÷Ϗ6Kov\x|)|,?W8LULT {3 9nV*`8F[֡WψpfQ̓W?-[~ &=c Y3vYMmsr؉.2 [YlvgݢVD,e3z! (K:8fPًQkhד4fI,<K=d.{kMY}Zœ`mkĬ 1>g߹W&$8?ZTq> \ }vt6Uf%'DtUu{7jpn&XMkUe0@`KWB`64Ҫdo89C?[[d)8򊳫x84| #K~H閬{Nt<8+~IC._wh*Q8QfZ1(`ȃcpEqm#c,ٮ|;׎IM4P-Yvt3v1{9V6Al b_n1 Hw:OܽR~m,xjn8d%`.|o;$B!CZ 6dYANrA4Gzcl+ޏklyX?c'#{ٚl~v y 0`1H;[;t3UfFddas1oY;ȥ+R+qQyY0gPI{!7v*%cGxb: י'M/cKM<ɓDBg*,\^PXO[W2Q M*ڬ5< ? 뎝v?gO0n[VW "#\xȯ]Vb/&EZUgI- aբ@v7cSyYm_M?uё0ܕ(\6q- o ^Z<-J[uBSK}qǮ:h>I;$ d1do9 mlTHfyB'X%+{ژ= NjNR9XOʗӯ!ҝpR핏~ x\Pz7ȀU=hoafDPxJ.~ɊC%aNhBVOPu (VnLw](~:6ObJO+veibLNψ+@PtZ\E\7Zt7%/ZlyvgF[[CC8je@!̏L3)A4QS>#6)&nX2?Ǧ%Ѿ9l@M>k@rw5r? & eOmμ Za.K Tcv5 ̧Aů.I}xDslm\d?΃,,K!! #kJt&!&Kh`]2D7EK9qI]$hF]~C:m/+b6p\?x(Ond C1Ս1f,Df|TN7cY b:Y, *,I+|5; wc*&B/WS]`W,s?ֳbqEDf' Fϊ1bnOFk6'C$ޙm<ҋ^nxu=Fzj¨k0#1Q\a RO;}=tDGū^2t3}z7_.J🥑ۘ&o W#EIJ)uRx7'-tE+ >xOgYJvN*2E6;M> ơwJՏ-]Nڋjղ>vE9>x>VM>" <, emiά?+^;!1C܈͕J2)4 , m#8%lLDžA٩۝Ū45v;>U"3w*{ E>rE`sgi , Vdqr} j?C MP@L6B pK7Q'&S&T'|I;WylCRUJ"^|M6TJh;|ݷfIl*&:w֡l B,0D]&lj <mb. -/hc8K'o&PW;\c P?Ûcw;%M%C+<ݯVXLz؎SV$ւz4*Kea%=5Hɭ)pdu.)P¡bsW@ $m_QDI-Bh.Eix~ 8po &)_n 1"$u \znHHoIyw]ϰ9+WC怉ZAx9 C ~fA⩚q1U,}*Z쟢SVERxOfkBGxGܓ>i.!X)(Nwo+!=k)ggFxnAy`5bZvU!VlV=Jn;:fl3`)W-z\D,=}vU+ÓhN9ol{HݟtoJ".MP|V@ׁ{ 'E"!]S?|o@Ճ㤍.D0 ڥ0RLi]S؄q<η-k*/]R,hQ6ȄպDf>tSk D=}iUK/0:j {,86aȣ4caF!]^M*!W2/T3Fvkk\Lr?1dcDn0iki$Ixĥn#Oʊ'_.-w+.{"v?p?WG\+7GҤ1ԐʟqǙ)h:Іa!@G?z .Xv $ML%w)z6ֵtK^}<9A3S}DW}\OZ>k#aAIx#*F䘸SBHp0`U:sn[CA).pP0L?bq@_/Zx0@Mٵ7P]4--Z@?=ѿ]6.!J$<3DўX񼍰 ծZAI%d-2P'RAbAqJ%*ϊ{͔+~ gA3;"_ v7n L`}݌Wiǻ[g9HS@$?&G)۶`qޅC턷gc7VeZ51[功 C*O$anP-jB}p "5:TOA=IlɐkI'0Kh[#a)&0M껏jl<"(‘ڼIbωu؇&Ǒy,4/ 9un>Ua$fjlr//GAU8[y3N{?+!a(| )*u,ױ;U/rbE ˄G6l'WM4 C@E[,^6EB LR}I4\I1*HV[g&<;g/3&p :)FB.Pl_oևqaO8g!$2s1¬ ]<%RQij`C3B[mԭuM~Z^a5t򜆘0p-"11s)(J(~߯rBDCޮ"| GG\̢JB) 0<ڱؗo uo46}e` B%4w$ nL$H: ?p8h UB*۶5wm H%;Z 5%6"1mFi;}C>1LaQ H0})  qՏ.1X7y8PS,T 4ÔlR(1V\p)Ԟ20!{"]>E o`s :; .aIRbԺM @\1Z5zݽA+i |5L\%Daq@L *~v#Q~<6RJp`μ-Mu>K?~;d}lKk R)\ S*K+`^2F]k(tr-8`ԫQ>㵆^ e=RU}KEA&›\͂,$P<&x>Ls?G6ŀG4U4G5V;9;T unaLؑZ׼@Te6Yxfgnմ$&ӌJPa~d3 bLY ߡNO h%.fX)؊6Ui=1O7#tWᴈq(ն*łC%MY*U-uuީ,y'Y g+ to}R 7 f/蟔wHI%2RRT_Y?Yun0ϠL1Gsחg@6fx!Rr A=#mzƓw+aОj1>ů)CCsn4҉ N*#, ф_T)"9ػh!Ο'QDLɰ'77@dI|#TkxՑ 0gN4i;FyT_Q//!1 l;:SaCDFW`"+Tzt/=X:CQ[uX>|QU=A 7lP>5 3sL:7jWn ˟/阨BDn8GIa:Cv_L^ִqNh݄i'𒩥wI0ؽ#Fۑ59GȢ1v LOɞ #mɌR@]smgIt VܦJGFq@k][>c^1sș8T@ׯb}m8̓>1q͔3Gs5ÿGվ[%QU=޳@{۷!i.5(11Δd*-F/] G sqs/[WSβh_R[!")C!D>eW_4Ms4}>ZU(݌TȄ i|q$TA=v4w߳^"=3Eoœ;l!SH;7 [!C{//R*Ό̳" RwJ`uJ"q۬1YI9"_;Y slDm2ANg8Iu\`_oO[]"b5E/\W( Jɀv?7R)[V #3=ӿ.ױF!C](D!!UXP#I.424Yz nLڅ~N"CTL3+|8va [%P= DB>Lb6Zs: pc]>8%!zzk cjB翜Jȣی(l%):lDX 4¤$2)3p,}沤\LWrS/ ސGH?@l(FHUd#lÉ>=P>6xwYnIK\NU _=(5K/uNdx?:e |+k /~{Ua;}O!au=gU܄4n*ha0緸lOv̚y+W*K0}I 10õ݃Fm,^[ƙw*':WH臧=}(_Hyi,f5i?)I*xuV1شHy?*V l|yvkj/#l1)NB蚧üIh^PڄÓ{g2=ĄP2%!4Bai 18, ʖܲ=c\ 3Ky?!^8hʓ9|hN䯏.tgx$rP"`<2+f{5NamYVyǕ>ݩY0 qvg8@өR 679zm?ҮŵinDA| jHb͙EH&a#+9_S DT8 û+77ݐA 3#QE9DZ$:hŨC1e2,l6\GJDHV|8gPB/A2ѧVhB$GXu[|!65~_2aJ{ь˄kvxo^3 cǾ $Dq) ؐTɽ*\Vtt2_ͤj!JAnهdTꃰ x;Ժ[t[$Qww/}3Q5Bh׼gؿiuֲT AQZnj *>.(<<GxtePpY liHf`~&yjDԿ2F8gd/~>"^ivzE Ron4,T%RT<:NaB,6݈cS38&2UdoIi&—kkua%yL#{ExQ)jϨoEDr|!c K~[퀐QuWnс*fpnY]1,HKu V:lĽJ(Դ_O*s%ځgMUeU^;0Zh* ʯ%TjhU UL0"KՑ*(nE,v_S *?U# }'G &l3fm^zg^]J739vLI((/ EeI=G1y # sD/rU'p%^!tMU>Hˆ皳J}R!K-re-OO1ͅy-@:Ī@z `\pn)Rwz_,M:T>dHQeԇxPvǺ'?0^囌akLxن5]0JV-&o-1SgGNJW͡/(y Pf|ŷI!G]dD#S\`^D[rX&nERŒw{Imdnb1ݍ Dű]w]mc q#Jl80V1y}P,[bĘ)= 2}2.wTH?T؅D_%Gy`A=N?濘t6$c"!Alc} >od a,,CY"|pژH訚#[5z7qp6U)Qzʜ/bV/B *xoi'IzzPh,y3k.Sطvf5z-6+I* +S_Y&,t)P~ 8BqJ'mҠr0xoMB>FtEL+P+o?fqQD|ƍ_a=PJ4@c]ɡUE\wz`19e(vw "'& zQp#FG[0ۘnwEa_TQj;~v=X}#! ]&0m;r1HĂW/^wQ:csAy̲60y.Kd3םdfqYjN^BŢã C3s/Iǎ,E[' 6 &o40cFifX2?^uSE*l9;$w+UEe( i/'"jzx}rS\1 Qѷٴz&;lW:̩w.Y/=w IUJ!u^{6Ѹ({јuYz슪 C}訛uU^*NM w,$wom[ Fk@K ڹ)5(D$@ "増[*rXg2:?hMDW՛m$D}phh),ٿMdֹy `i߼Q@M~QKdž3+TAN(3mHi*I 1 7M"(7bLYw(uCKݓkǃ[$Fh|I:fQ ,e-C/"b})2[T ;mry#OTqBm^ #XuusgS)rɊ~w)?JG*V\shuVb}ոS(^RY)-#>1TSZ7VBNL~j,~Ķ'^FƝ{n>Oy"ZdM6ѓtt9lL>Dhjl_{z2wt MTe20Hx-NpZ"pY܍R)L5uf}|TTk8]ꩥ#k&nA@/4lوG]KpY%y}lhT!j켦fJ} a/&4;)SiN}O&>*-n__dwHp3;8K[ qSqfㄗ%on;OAg9䋕7emS< _GüfB'fHۨD9ˊn&\(f3Z| |XxMP[:w7w y ڵ?P;#t &UiH{|F]C\lNZ&Ҷ.p\=fst~ } -?Z Ь?\pսGexŒںwaj* P()K]̉&Y`h֥-⩭ACm}lbMT1/5<.Lو,rd96Jʼn7~0d_)(8$[YԽYvK?'ވ{-8D.K$ 5<ׇ҂EF$8¨h $[޸bS['zI q$rO} :t`{Fj~P?pZ”;_?1bM,>FeIdCxૌm\RJq(1pTZMՙX[5rF(hOi(U6o׎AUY?%gȎؚy>;O.⯇h;.YuVEAҞT'D䴱XʷP.sũog澙sp\//!ȎeX}+]cpƫLSpR=In i>iD--0Lq="*8x~-Lwd'ޕ$Pb2rT\:5Wf;t*Rq 3[UREI}'ZqaDR9?JLJxl`sn+ѧCڐB:㞋i,䆨,Zޗx#]V܎ ߙّ:fX\ &8ʔ%Er8b ]WETvyp!/q lV!)K 7z~tQ/Z/] t!rŏJq,̤by~ߋ &v: bDy$?]EV fZW [̧jX,ᅴVs΋"pR)3[fQ;T9_x⊲w fC"+ܲĪK;e،rwO=MGtLe{d)bJԂؕ]wx.13,XOp.Zj:T4[;78'щ'ͰUnt~I8gYMr/ネ^lgq DGv`7$0lhH>OƋKՒT/pCM,?(|<4MSBTڬ#11\-i]`\Luu۸"13*qR!zQslYسQ5E:% ;gH (Td0$SkϘPt*=  FV6(" fs*-3xr.mJ^ Y ٰ(Í VՏ|B3yZF"LF?6a*+5uӻꨉ3e)w)]w=W F@E]>U_~E5 X%WHW4u}K%NNTIlI89 kʔ -(;a,_-}ɰ:ήE%%6,dF]ldJsP$'ڲ]7COFHN@l8"H%Lۓ8_r bW~C. L_mY5`-Et4x&@/Ɯj9 @1 P=Ur(ٳX0؞&*rX/t^Յ`.igl:cw*pDVKN9"Ӯ*}ir7 Zº,UG /W] lyJUHT˔_Ojޞd̈́*iMПt6-  Sq)xˡTX W /R`؁>6pf0M}t6x2wD˙ Vn8fƣ<.^#uĤ L!g9S){FksIR):eW p]wW.Ld觍";{ªpu{ыXsx*DKY_R=GpW|ID^\[HwܠT2 } Xa4-)/uw_JsvItq͖z/fE.O7=s7?BnJ a}@u*fj7li[Rm{IA5G{{t7@"za&ҚXu"T p 32{ m녰y'2Y aOZdc;3%mmhDe+?9`q@1LJPcԱCF88аYU&1}zg~ŢdV[Uƈ:͝"po_lJHL*s=Rp+ME>̩@3W_9ɶ=ù3ǿ F |es6H8m]o:8^Xrdߟ Q&uRbӇmGۏE7%AﵣxO=(7RawY:"A>K6wQ! 1뢳Ù^XyY߁ǠP$e{顏 VS~aadldf|uuliohR7U(@F b)2HmWs52i9}W*V$AB`OR`KG\2bS@l&3¼^😸Zr+?M%KO.>}2vw,tiSey| wZ A4pOJ 鄅fbuHt܊>] NM2-9{7Ib/S_M8]Mq΁2mYɶ[wL 7ёyq CÁq饔Df+HsV%!\h n~XU$nIr鐸Lcb}ϭLqʣXaA{FAwDXm, =B4ca)M %m@h!a@ ~RA-}ϩ$c},SI||@%{u/'ܥc"8h]f&ˉY|d.,6pł>e[E\j¯޲ OU %_Tݪ+qW:XS@4ӭM.^}Af чcBsmVs QEEo|lK,?mRaMKD~s$nwZϬKB}C]URMgL:-lﭻ .AqS7&If{že8nBJ}=`)-Od):L$?0zvGKеsŗp@0WN]|/,XM>!%XL&+$RXϵֲi$, Eʟ[ ?%oM>Ɔ"36>^pǿ:$w['qX?-tءm/9`bJn A(`c,֟St5+#,hDDgTu)X u- WNo*+>De'G|_<걄?I;WlZ>w<[rOlD`4 (?oLe 3=`*8F{kӰB08%#j`;tThl'Vv%@ 2.> OjƍYYd8^aSpO ?uKeEd6=Gfam䐘mȁ=}=f/@~.\oX alr@d0u(W7o9y#Ȟ?b7e-_ j; .B1bfY3k9CvcDH8зu/ʧv_VW@\m˶DD*S==zI=J]*:͐֒pK+lXv9.U#PQ֩] zA b1 f!AچTr,q MX$;(2 ZTob4D<y\ *uP`y)%Y"4$X:jjrRQLDP]k2ןR Ռ!JU5Zޓ_odgo-+ !SkXǻwN@%ԗh8ӈ!g*N W/+6|+W25Z3fguIڡ20+RsBH,CәlWɮQr:N, 29@<*JKAG+N 7IYj)+829K@[bD^yxy~QkeaD~(^AQrX]֎e UmeRB>1.\ bpj '-Doy&FտG#@t5ڹyA~L&qd % eվʤ'xK8I1 PJIEA03m엷9X۱bdO"CmoHPZ8dtH輼FucwۙcU&p[+tٔU}qDk'(1i+v剀DaOTL4Fj>\mLjɒg+Bj)Lk]ؚLcr,׵=Gă~#lx؅zO)r[+P%q}y4%ɾ 4m2ԍ,L0BmR=,]?\ 1`6W񩒞*(:bS&&ahR+Nk>ļ N4eB8QDM'~y[m[X7 =:N׈]4J'7*m8˼Pk"(3[hp\`ͣ p`Ţ5mʨ) ة7t-+<= 7w&Zo#dxԱ%0a?[(zmfZ;AKO7h|TJ^:]Vc RuCjvxEvZfsŸhLЈ7L~Ɯ5⽟[j?tBgkT0ˍt4 ,7qaŻLF9RmiG OC`rUtZ Cv@HBt˛8~WR7lƧA7}$O;Tse3Qhw[&?}/ENCxU#ÑDtV.zܳvvy˄DK9]+{*&@R'hNL d*|4#b1z{L5bgܤ>-7~>pyDdA=p`VR'?H`suy=Q#'{@K+1򢐡d^“r%3)RƸ I~\}^BEH#BPlڨ"kw<6gO?/p}%mbosLT>\;xiA@:z*x9b$ 2_ð+gVغlzO܁Q I߅R{Ps`,7ReK$- f:7Z}&E^_ǯȑc>'&}ixMpMW.+eY]함4ǭխΌtCS$_E/r¤@zzuŀZxUzV(KcØo5 6rJCmsL<b%ЂS!w AiMV*[QnlYxRÒԿfMtr麇6TRmTDϭ8Q-uz|rNM`TT#B\\wLu!xG &[2 rI03mGQ13ͤ3{ߐL\wH2lUtP.Ӈ u4y&SF A[NwQ#gna4sZj ʼ1~ɭCVrӳ8JV_Yb߈ י4f W*SFl?k{>cmk2~U앺4 JJ%׌YS\-z3k= +m wU> 6gkL1sPfς?Q]uPCc;`}]Akc/!蜾0|xD6bF-Q5!$@ biPc"4̸`:~1ax YMmToMx O6F}yetX.e3h@r^v<ȱ^o( &3$@] RX||+˟Q쉅`^u ]_^^*„zE.C M֤Ά$T>7*sMDIMtBF]굆[eҵu֜r%Q'l!Ŵ y0=hAn{TP٢NkĉԪ*x*mUWhcZ*uF gTwW*|  7.\ɶ)hXP$]g<yJU+SqCxyh,IK 4.dpU;?ޚR<& ,.4z<oK$5C c1#\eE&̂Hofp|_Ff+~OKOW6z簊;\e,\jD> Z4R1,C\|VdP=}8;?y+ږ3g:k?]IhJ " kԷqljmrjꯧH!wےers dˣ r׍5*g$O_~.i Y3zWU?S7P&eMdz_fի̼}}JwVCu(M5 ӵ)W /\qU`d츍tO#L,9l$R EG§\rŠmi!P ߐ bx=.Gvs''7,~;T!4 Z[~ w'KAؒ,d`c p7K 줉,aFr ]'v5s-`,[:'|aw5߃M`s)+>$AXp68]*j\jIR.[ n+=dc7e>hEYG9|_1)AZgDqNFXG(™rXHĎgz% e?oK-ɢBWO8n&~Ԗ.VDjufp @ A!k R鷴׾k. 6JP8mkתs-tU&sPņL.xteIn.d~xf|tɌ9:ce!*Q=ȍaQКqjZxq.<tIYбZ֘*p 8m<_9GhC)~bP߈~M]45g "R-,,ɉCW6>u~( f!x:dhej/w{yN61 ўNd4%).C!o` 6$lJ 4qM[}G:ߔlP [@m *n?RAm{-j]ZVWf}9ltތ+E62Y3햧R|Y˕ #ZV82XSQ[M -;򂈱bY.W/?TY:``E5#+.7쇐fGFPµHZj_FҮ/{/0BnjbqّrbՌD٧<$R;D f ӖTB%fj^\Ā@2Rbq}ߴ\1M#\@ d $9 7 ^Sˆd`6uE8ڿ<8UjĆVRF{!y<>;}lmhn4Ʀ昿TfLO?Wj9do ij;uc8 wɣ?م"vo$ZLjfN|}V9kb5ItX1ngF1s9r" g>zJ Cw+enX[J]pK8_'_-s#tgbŏouc4*p"騚2IT*EM^l,]LkQljF4(2e,AeK<J2d+T{hE^2t.9XϚFUsb穵>ٯujVp?~֙H]~(Wqb*Gx%oVpp; 묌ix 𝆞 aSp`*ZKFqbzQ-y}.aTBar6]$6d=8%[msrW6qFx. oc ɤV+Fardpd ',b4PH&˘$-Tg%(c) nu >3ostbGa1 K~7AAo0 ؗ͝D4]nJƑX$D:!ZXT-e/3\orfF22F4dr`B ^1i&pmb)JBrjUbaGZOo8zn`a!=+vϱA'_c"G!UR\Wj7Ӡ낰pU%s:v|nXE$l3ͿyqecU2 rvT)fAwYȐ}l|ۂDzm3l`޹~**+L.n dTga^y+{Ƹy{6 lƌfLf:@?~e682DgM%j8fO/G1pltg]qs'N@.Zd uf=gAnK=7 kUi3, fWTݦ]؀z3c(02˃GRvnL]rbW zu28+m%L4ϑȘC)Գb-Rr!7~"7A uPN: w@8Qc Q09/y!1xf؇q|M2M9mhJk^s&IRG+|Bi Q5n_9xwl筏:C `Fۡ].:icTR݌lrshfBE^Q/x+#.ibwǍ[hȖkX a s \.{+eJ2ÈQθA߾FR1ʓi*VhNjy\ZmIh+W/!!aD&e Ή]VroSswႅ-jl\ j;8_o]ȽV FCbc/=yW#\QrY5;A*e)4 %`Ys$rM]󄳪.ArvR 壬!~!sљX[Jp7^RJ.C-CS/Lm ˶4g<ϘR;s`XN\|um~'ޑ"WI*hX032 L|v%&gxlQ/نŦC!a7}n) s? #lmDH=7rjU\&}^zc5Z16QxH^H/ԙ]9>)y[^[X1 vۿK^ :KY4d?*%$UE/0.L?=2hp(L`}i~NDKR[[մC su pM hyܡ b\_#[4(Yэ⋂crYǪ!פAL }_dG, 0g@^{ߨ ܮ^OWrkyJd3\ 4!9m([BwCe %6$Z$|Xc9]m<"YrpmKpj p~mugJ}]W <7-_gDh_:*ed\pr[Rӌb:4!)DN9ĩVt+I%iq(]sYҮ߻Ƚ6xu0T?}1r]404]&EHP+U}P#3Mv`J枳Z 3H:Z.LM a;^tw};oqeIJ_ /|;Ihp8޷ tVi)%g]LK:vv@>1SqWgL &A]˶p߈0`uFeiHrXpg$SqΡUAa3xpIeQ0fgڻX6}MQ~4Gʠ*>E5h@lQ\ρ`S/XR1/K/?u`0ܻN+}Ƙ9 ݱN,jt:qՑM_;@Ħ5uC v46\W9Edji!6F _{C;IS3L_h\p4tR{ %4'gl ML3+iAOysmykb|\mg5i`6N`~*miJ#1٩}AhLd10;A;Əa1͌meeUBO}.1D$޲4C:=ݭ6F!߄P{_{hf`1Wl\ ,`(*ToaPa<mpuAғ˱)-:Hʞ2Pw6?iW}9}Sg+Xg':WׄM:QMPe Zd@i0vjOo#YVO0!Chr#[(_N D{/EUL%^?"P2\cJǗՆ<`:+Isn:]Ӷl39ryukk] _ӵhlvF\WQUطJ`ϒȄ&[C SLv/MFg]K=ޘRCaja@hoto\W++{ @Dqn6Ɣu7 9XV S/0IvԳxF;7/+ ,;ZRFٟ,^^mR,N%-Չ n^d0P*(q[pĞN̏7DB-m!)! 5G>c*ȮXp}ptzپ 6AV:qFS]\rz=ϙ?uV^bQ[:\nmL 7{ @?Hs/ q/F_@N50RO3q~*C}tnhjz ;D7-@'pWhâ:gR[>DkuU=q߃NGhqbC [# |PŇd۸=kNhs$ _UH̰,,>OU2 b$†4KMhԟ^\Eʅ-#b箁,YmL,UD Vφ0cUNנ t.-f?ng!ޤ¨6c1qR ac fO:T9 "8oHҊl#~rGTR>iwlQIWCnf1Mr0H 4">T̥ 6~Re!Wl+kw_1<]J}Jy| H 70^/;a.͸yD%Gh"[u3W9Toڕ~y&yx5Yu8mf}UcYGK;D䤚q\NS: `[zP|g@ I&2_+N#R\f!p(;#s4\*L)M8rMNd/Y.Qs>G=I)J~Y&|F ^*Z;{DˏPT уBcO7E<;c:vX IYډ,ѵhwDt4ڕ;QfuƀOGT 3E8 {7eE[g `N.qH0(]OבM9雾V˨ŒƹDٰviFoƟů]ސ=۟膎>C4=rC ۺ{7A>x񼢤5nZpkU:f+o{S8KVR;Y΍6R u}%1!~%Q~7B~ҭaI dN)(}= րeLnm-WmngI%ׇw~.̯źظ52 I^/aD)MބVXlGy=bq,87˺Z]\ t]ԫ$tjqqjHi&.B$9'ia ?{J;>s(A7P!+̼C19ZYUb|Nq`Us&o0(5\t9;X/ff7|蒡3K lpU^S[;Fҁ.2a KIJNC JHL3 W n$~%Qa>"ϯGL᪣^/#>" -gnϡ,SP;?W&F`L=N\[c"C^w7PC~(ved1P SrPP<(= DBBErz՛PGu&-XybRL~u;8LFuT%ʒru3# )RX \ A>i߫NGr^SZ /5Ffݸx*P :7:[BRJ2$=dž: Q-bJXo@R/%~rLdž>{sV\c=`+x-no1yML1c%@LzEކ͋a#yύ.m=U8)Us>F;N㻰l=aZ U5Y8GCXΊ;qTބ;Xʗf x3s'BYe0hy|2Qss gvffT5oH#ÚNjOg28c13A؃RAܶ3Oh{s M=bjW=,PSKVVyrBy㱕4ViE z:@:ZM.:ceXcFi$z=P^GBR?) ;3}AC5< ХMP]gЧ^j4cOhG\:zJp;Kik%O`$pi3wsx-FxmZ-Cr C& ͷdxf#D{}$Łũj{벙Ú,\i )ygQsiM.CѐNƫx@ FCiXyzOda}ƀP weڈlٽ&C:Oc)\^Z@J*V0SZ`{ˏO`< zT !QHiUڇ9Z2W_<v Bw8U7rf1T i5W9Y';EܿHT(pu| 0:w68@PWeОrIMa$(z,qi]M*[Ũ^GeDX!σx슡v9M'Q*ZRK>"I>ac;p?Z}Y8~۝s&4q7P_̐))Euŷ+$oZJ@IDjhWꖮjØc F̨dXu>0 N/rZZ"FmP%Rxңto?z)?'Ho q}E4wY,5NPAݪQ¡B.E5^X/$E+! qw7=+Nف(H'+3F/˃gV1 G,*^9KX'la bu`& kg=wovN!!J 6TѬ߄c˾1_o |3'j):MNA!,][[(s臊UAsAtlm[27zC*v"PzUEFR@)y~P%ތpfk=%N*L7Cʤ+0>!+(g3f!fR!.la` &q}%n{+:,V=guI}[y8?R~ u Lud M@ apѦUHk| -5B!-eUZeYKh_G\ҋ|uЗGj(vV$$Lhh[zLgRnvMaJpjÔno_(m-VYbP5J_St"iq |y)DcD=!vcH[]>`Eh8[Q4`P-Q}oH_@9uE>Ei ^yLʨcR~:}'U@Q6 G:y dn;ц'w% [3fz6I=6PZ8eF1:Oumâh*,C$2ql,ab8'l#Pq+:s!_-z6Yܣ b5 ^(k_sզ'ċn<31ΨS7aFbˢOC#1ᝩo7k]w4}^#Y]XҜh0q yf[aOũ &#=P~ ~byق}.pnp1VϏv0hkwZkBz1_9>ǰ i˂ȧ8M{{(@3 u𴅈H\_uL]RY`9̏8hH Nf`!=òn  Թtc7@H)tcVc;M!=C"R\햣 | D_0x5yuleк=B rU*  95K\h7z_FG\p~C/tnbUGU\kcӯT+ /b?;*n>VL/l/\14jCg(SgKSLMF s+|g oL*/ma{)pJ5MNev4jlSu9v X뼾E L=M-W5ڙӶN+~A.k.CLخw<9WܹY sK YtVzr.z|o|q0`w<}o 4³kQ`2%hbIX P+ZqȟFp4K܎WGdՏfFq9UsPhGNyϕمl-S_P^&w c[ɫGzNV6u.I 6ѩޘ. G(C;OX䮥@v =?1Q6ws;]F]^ҭ]0Q9l6O OBt]\_ _W~ @@#~nݡK8'8v$""*͞B7:@_W;IɁ + GH"\hm"R['!npp ĥQ!tHˈK&P|* ?UWrf>%~}gNc#% ujFSG+o#4׎CyM57BUUIuN ȡDP}[H|dPpT+L #Mv>m>AJXc  CRubuVCxzU=f+cj3ȱArKήqv޴aÐGtQ)W7b_Q,~}NƩޅ۞t$.(_gb/G'w ,Y\v=* >7,vDW;x|[ ھ N`I;[*Ww og]%KR= +S~obT]/*1< S$^=p 9p$wä猪&2(]v ph$-AY?wǃ'RjmB}mR^A?rk&[zZY鑖8؍BHuNEU  v$vpwTal'ϽdLnbE2uSnTzӬO68h^"=$g NAXk$'xm6dDBͰ JmRewQ'tK5#smm)\|Qg86U+ĩ9>ĭ8 Fe \J A *~@߁#c|>I9L#0{.wA".7̄RƗ:_qf 05R_-Gf!AxQNZ*iP;PBdmU!fM$HR\"y&Օs):csim)}"s,uEٓQF?+|t&>ћi'XQN1ޡG;S tÆu5o/e.jd( 1 P%/# R?qM`ó9y7ṷtvзůä&.{W4[vso2vCқ$-8̬|ڒ?8!<wk"-Nݵ#suh7)wV&˱6.xz:WCShT %vCɍWdo;n,"3)^aI|Wmlpm~rfd hD쓄HKE?_3βa3%>'O( b#$  )05kRB5u*JKjh֮ڔH)&JWj#%ĻA0$gF^;\ƈ %|DvhT{J'1~E[f2I($S =Wp @$BB"%|9JR _Ra;P,KT A<@ /C*> k >ڦjBp1Fe/M [ʎE Ԗ3H "LJ0섏 ⑎D~1f.?(9)L Ma=0iq#}aaMXnRdzTz9@p9hJ}rև $+ (sR~K,l{¤F<ҙ%aSw)Vle9Fw1l>6O,zZE6O%rEy,-X l>$zʲCd;ty@m*b_g ʩ\npD-jfeDWK`-+i2%R"ZXx(W>`sIC3Y;d_@2*`#tQAӟ[jk׾Y d7s^kݍ&*1H%t JmS?2OPx,⢚$ׅP?Օ^|tLMC[4ɱ(x4dA[M08wE~'2TYϯ!G<NE$s׃l6vm\;Eb'z8" ,rfsT&4|06elE6j=._1_Q|g ߝi4㩶r^Ƹ% F-%Ә<{ֳ2iav1hSGRgqNH8> Gn䨰UZֹ~aVh-@駊Fϼ ]70w`eI0su,H}3"[< I"UmbXU #^31Qt\ ޑ.Fɞ>>MGNGQmtYs ܦ  B5vl(v>~jy1Lw귁^,PQy\BfC*7]Pܯh wD|»Pl2X҇\|OڳōB;`d 6PxdL/x-.: TƢpQ/!s(4[\X0IzV^̼~R5ky/s&s\3E,ڟ.gfoOAOWǖǏE7f}TKfO1RY0Jcĕ!hU#=qk: w}XEeOjHx|oTLvsu1C'F< 'Eؿ7kYΆ<}SҨV! ȱƘ . nG-_=B͚)g%|ؘn@z˃|ˆ^SnZlgΈt* vbrt=r(b{vdplLK}-Xy?X@'}j(ʇ7=u#6<\{9rjXӆ [.IND\t5-:N1u'؃ĎcU;df@Y +C6WRog6ė=HU=QD>%R[t̡ᷮruПiAj;UhV63pho^qz^T GC-umϓуctgb|oh1,T":e蚹L$1 l _8!<-)JYs`q7y2皣.^jsŐH؅vxI͂8!cjj(Zg<,wDں W>U!ܷYHu>&Y.I1R'e[:J$-̮it*~U Tvn[ES,7nf_3P7@SgkfLς~-W%0۽:/#qϰuO9`&޹76(\YAHzw#l=7܉<)De{wX2 ZUX!3N``nbK,44cJ@#8 ݴ l?lEMwk SJX(lLMZUWR/Xqk7[imq9T>n4JSpMwEޮZk'!!$ĸD\Y)yiMf\~pzep4?c}hA{` o: EcAP1JYkK+7eK<,mwnakJ&eхݷLקtG1DN-XXqQRDL TӅrBՄ2hfgzC#Ӂ*r0 4yM79"ʛO\I] ]4[jhЯܛiןhl x|  muE .:2p>@_~Kk̢LGy_'R ,[X'pEBn*Í/"T*2ƈ.0M*0灃奪ma^ #/Qt_v}M*:XU>Fa8 & l~CG")R!"0=O8k2FOIWhuGA[(N5M MW[guzF8Evw+%\0: $SՌP\Wa ]hDZ -coYll h=@z){u3/FQ*冝lEWfSςgU}CSX6L;dOݖxޚkA6!1>Jj>G1Ѭ]IpZ%@{[QVn /0WTk>/uC8+2k 8aܤ v&5 2%ŧ(Ū >x/SP]#Y*K/q$ˬv}w^<~]+D,?͸mNĩjM~!/#m">#BdF'&ko{r8pt)臬AWFƇx*s[w KuíT\ `Aat44ptf2 ceƈF:¦Ñ1 v'3} :t &~߮mƨ},5,$ALHxb\\WɄ@{9C> 8e fB2/1: flS-ʪoj/Tڗ/ y8MzlrNzŲ:!:E  X: 9 f!ė)5^~}jZ4ΝY/t ;|q"_ DO=J{.a{XA`V!z&@Zzso^r-D\F,0{@ OCcٽa@q_fg&yFjP{7^vI:DiUiє(2w,f9\2?Uf;><&ɋb +<,#G fPIΜޔW7CÆ5`Ô)u.jGlӾ@G|5Ei:1zX)PYT%>aavɥ a$?oi7>JZ1 ן;2kan zBw.0Uuzù1+\,^;̧Af%#DSR?֝4$VqƖ'DZ鑽ݾqDtW6]HO7_ +MhSe4cw"f,K#½ŕPiߚԄyc.:8T7p}aK+`9h8dH7 IML:O'ozo\r+>jḦ́0أ=M8Zx犣LQxŢx Uxn0/^\KQxf[tiUݮd39+C'!>xuvgV?Ʃ7$'?-q͕yEVt>ttXG4:]kRP Pڏ:/”J8+&$\r2RWte.Sr,hU\KYnH5'7X.S5d#S ,_J&Qo4J:M"MKVGyL@BG&e ,U&'ҢO[(tyEyNV[zH5 *~Gצo֠N~z~_Tv;*upL$[NP=b0vPh +=* xRazЉVy=4! o&dE>ENC^$tt E+Ѯw }L 4 B.IExw4 rܵv(;̿FYDNW>Pw5 (QiY˵ V#Vz_bS[Ɛ L d/RC=m MZuF+0te=){Iy჉ΛM !kyqZ-\mH}Bwn|!~jQ/,ELN0Q)c884E2.{LO~rcârUG>$#]G+ dWG ePzN@ vw=_k=U:"NJIx!eÇaπpNZ'hَ_ 0h_." "$bo%ЗHJu">p^Rp#t500SL.VB :bK1G}(9GKֈn_m5ؠlNت@6 j p;r2#}ls%1qzSs8e9rIzSV ST΁hޢ@ 1*S\LD@_Cs ~^i29*Q8Bn؋N{lbrIz#.X hCM-~8p@˾U?> ] dkAFQYc9X!|/%YC,3բ-?-nwko1Y-w+z}iʠp{k0'?~<rp:3Zb4xa?Na)-:$-t6cw)cNxii#:dVRP#q2&ԃ(tr_ vH-63\~~؈KI-G͝ޚbưZLУSN67BA^( ([/ᕭ A|52RJL1H\bqˬ `urғ7XS'R)QC $XuxM=9[G0@'&j)*Z'ݹ1$ ,e*qgW zgzBFwp+N[p'f,oOM6f3uq"٤:]l͓Ƚn$s%Ԙl1#;٬Et(L:+1 xLca!ʼC˝ʘ ۜ>L51Pi}|ݝGhURoCA)-]QMxu. &>4Rcҧ<{Q,Py:MjYoukq *ܗ*Z#ʯo&\9 ОG:ꨁ8i^=>O#D' sJqp݇ݧ c6WԂj(;ݞw ` T% `ʥ 9ftibuG.uGԼ뛘C؃+T0@0D͈R# FpALg38b4|*Ηz'Z5;4}Ъٖr@ɀ-{xYFN%1d ?vw:O$cu"=$~DA/MĥuTvC稬xj"w7'{n꿰iem8'ѩhiMAjp~i|>Hwv 2D{MI@q3*`-fwz6ԷK0sڌ܌la3 pl)'` I?ya1^P``@rA@O\2YZ!Qps2:Mm/E| ͸LE3?+PNta7A9ZMjuU%*Z˥{-xP "pt_y/N~Л*mjPH骎$~Fl{].{WGRk2-#=N^KNt!%0f )B(UOL`!Xew?M:ޝS/+\?7k;-5H*z?zP>4îMޓo^B'TJ@oV޶Di=#6ad}KX9d'ƓtDj?ޘR + +4nbHvƂ\_cJM0p Ul)9+0[S 6UPG]`#Ba7ptcÞ<豟=ŧ܏ez-F΁U r]@ARNR @'` NYHqIZ^ Ko<*~'6]̺ I|]NK~WēC? -^]: w=&NޟT7>RT+C!鞳x$R!P 0D^)UDx=I*񦡽brFB;_&c.AbBD+l@?Rz=ղ"khę2y]-oTC7&[:YҹE4% KB3Kͯ/ŴO4R~Iaɬh&lmB՟E4aWW3]: /Zuw T( 7l/X2cNSsx}n 'Qߚ ȿ>j8,v&?@쟋:KHkÈ7y)J,K, v*:>k)[4c:ՍX B/@ FscmQϮP|SH,FImV.Sh/$u*AV8Uk%ۈ##&Z"ԓNJjU4uke X}5ōRݙ(CJZLbcH|-۷ hRqVL(YEL/-n<,,ΪL\ݦv S$X` 2orbmOI3%sR+_lFNcOi6aוNv03Q&J`6Ү"s` EBn ߯zлGADͪFzP.UOVtJhMvF&VOx.ZM5i04;! j;9'$8vx)x$ҒR}y>;792P&S*į uq$T#[̂k |q8 JՌE*zLTKAבAȌ|MXgG`|aZ&o./åQta8ZGhS(2u4dwc^26QO !NG{DU}V#_t><$MP7z GΆ$ubTD#?U}0`)Hb |HSa{Dualv-J8Ґ,"Zg+r|㥟%dSEyάE#vT#~cn/X96ht/6ڵpgɑQ!jI218慠0N˴\,;4c+&h1dr{/!1Nδ؏  -^KOFngMOɗ9\N6).< (* %[`_(űn0KҌCBX7t#vJfRVzm8{c6rvc ~>qM.0_8TjMͧ[{LLIʗ$v(c I\g@kcI!gO{DTes0], UF dDpC_Fa QrvY=wȇAɷƑvh TܐD$p-˥ ce `VcYY\*)'؞&_X6KAZ[2" +1[b9+Y֒b! .09y_#2J sSTe (=̀tDTrvW;1#3ooZ!)2 <bG2xxDxbCL$oJ=83^O|p"bʉmY"[u9A=k"ه4M 6_l)%UC۝Wqv hV, '7?xz+.#ti+GqQQ^|K7ICIx!Chf,2";kfpԱpZNuSS*ҧ$&IhAʮӏݢQ@t*UFç5t>>tyPW) F-yĵU,/4`LjSYUryXKB!*@ຟCf,x@#< 3k9wLR[gM 8t oqi.!$.SLPa-9J;h>'7]?qb+:D-g`z[Mv{Q;Y>b%,ϛSq=XHW(CIRY z|_hKF;pg\]u8;ԦzkEcgAMOY@?Ҭ tB4]YxAO8J41 Av܌&$*LYx0$-c1m H.\M珇\o\]!L}nL'f琤u_,Uϛ(eXs΅I÷|i&.qet%?kxֺ~4㸔fo܈."6%8me,|écrx\x'E+$ׄ;?Wj4fz^aLQ}( N8蜊:dC+Q̬0OuZ <wmU룫Ĥ2E_4L^7;G5GV `aKđKG *Hsќ^ 3C#V b4P1=gi+Е5Y#'{;.#(qJ`fl%bq7~Œ>~ Q`)8=tWzt FX~*[wuhu& 0Lgge 7r/໎f0=L&i'gIPYB#} 2hV@}etȥ8w^P5(5Ux2qԨ8B{" IbRg>쵑HĪpx^xx⑕fnm[ -w^OV3 }Ha<3n2t.~Ȫb廖l`bvUj=)K_(աuD1]мOAGR:0(|0.\#_5*V[D]x09 \ tӈ L%V*351q7-[Pd\ՓSYG̢)RV<'Aېahk?J&t~AmEyA~C;ASPȹYm(%EҮ31؆NBKar┣ݽ66u4/SHp4ޮWt%H8qfiII1Aپ"c ` ZiExO"ƇV]֎OWr'fPL_#z1ʴaHS`d IlTnD?WJ6Y'v4&7BwTKɽ;/zqY(?`Nŷ@mW-))|:{2{|:{+GP 4$H/!#Rƭi{@{nD=s :\V5(oesT g K31qjxP[H63[AA+Qk OcnǛ}ɝ)^8nUH.hieu}lb&}c4Lo0ѹd(lPKӞ^<8l 8UޮJqV4i Jq]u _qkXJKEQ[͜z|y`o/ChZ/ Hߺ>{0?U]dFT_ff*>o70-^hW}@^pnYǧ|Ï''g X^`vO>-@f)$f 1'tʘOSU#7sV Y]gfhƬxӞBWW.N;љꧢ}1׬U,&DW:kq7M?ᄆJQ>,[e[Ȯ~ދ̀n;AD^}%F%֝rj3rV 1w."DŽ{J!ԼKl2ŀf.fMs1g"Äҝ%6 "1UalZzGCpcqdôogdkC^VOv '7y+zT%hOpÖDsssT"F>ۇ|/L3nyMol+Эp#H"?qՈ׀G9F>45?44.oof F?1$Sq*ɚ1`ZKC[)b57 ]і`{MFꊠ`d֩y5¯U !vGk9ڪNBu=GK} NT*ٹʄRQv5~3Dvu[74& Vu\q3C ${6v9]Xb9bA:dmRbP} s1%MVv?"?@ͥce&vׁ1v :TY3)u,.ָxY]$ߜ#s)'Q4@.u Q Iȸu[ ɛMcH9}i^E5A0"2 8 ̌:DX>yЈ.e%nb3} A9Y2w؝:dk2!sM^7^u>&DCh1%j({(L˩v¢8S8m^AU _x az45EӟWn'q}#$ζ;Y ;f4g݄I^)gY(#OntǦm^-}{Y )+u>„ITrn^B!//Z۷7vnDoͽ)&4Jb͞'[x6$g GI'0f@mtu(ȥBI] #19%G[2eRBGyƑ^NT> XsDZ=URݠd&Jѡг~5+D*%U~!o]S`eWU{V "3e 1(=`5dg!JzCi,ZW;lx n 2Ov=<ߪ GS1IHpciK__ew*T7 lz+yS?lΥ ַW|Ե,S EBjuO5I!>z̵{`MpѦ@~΀_Aƛ@뙼q =ޚ7cUjjVwydI%|2f'#i)^L >1uWeDSCZNO'S(e0%kҴL-34C1t~W_R}^s VP O]c \?Q Sb+n; /?y-9;0 5yQ {}5*[֮S"Q {rC @w9n^͘,%+:NiTE /Qh 6ʗ(ºNJߠWM#3g[K^W4xe=7l x.i߂6G0_)a:-ìe8`T{krVu7r}R L7E)[xT-egwK 1|/WB=߯|k7,EHa-rGU&̳-8ɻX :ֻm_Tgi硐.QQ%:zp>1g([:$]m{̓*~TgBm|7Aim쏈Zp#ё$gt D`|ad܁!3c>1< tuWc=֬P!n t>G%X|\#)x\1hg{"az\'M! 0`{!p'iia#X<2HDeEw؀tDId9K 9=Ӏ_eI(AVaꥊ޵:X4HS v`ߺ?zRAa(EoKwy"CdHxcJ<$R&/ٳ>9ؓ&)zʱ"cEXKT҃3ʵn-HDwm鳥I M(4teI$1XrEd8 b8Y5`k1曶 }PCL")/="UDey׬Y+y^ v^'Z️c>.ViGu";9_h\NI&XhJR%bW'cNLy+D2(GZ)Jء=u0!,):0rΛ ,r!f-aZ~/uNP`tYγDv{))ǸC@z;@P#4oJK*.1>S2ղU[9z0ć39A ?'ō926 L^i,zUUST-c&]x!pmWMv3*a%" a3~T69ɫ Mwn: wTokiBB[9g/E֧nPVHFbv3e4Z( 6ArՒ<"hR, !:N^wu܍R|ARrt,çc c; L"sw3VLxiu0qڒӸ ؜S:'ّyCPfpVNZo|"01hq.DO>S)$ݷt7uG-e D3-?joLj|ú` u!A1`/;/z9n]OZwrR Pveq #NL&HVL~/ph쩳&?gZ. 엖COȗbz#q>æhɷJ~PRH2~MXA#`ljK̃a =<8Ah|,ܟO7}㳫/3Ez:uX^C2(/L夵Xl/pSK=]:ZE(ֿM ^ui}tS@"SCu:}̎sa{;6(T֑JXU1QxoB@!n?U ]i/~vlGa_;wuiEuhU=،oek~'\'8g) tԜnŘaJ{xKix_ D{ypX^B}9>̼T1KZ]h dˬՄ/ vϝƻ>NS<|3ӛAJO!E)UfAGesU3:"4XQAc;V xQg>.` 㖅c|);o&ƆfnO[ }zS79aՀ wTCzH0VVDh9H'"ũc#=Vu7Ir<֙95mPAW f9Q-,^~JQcQn]/̓*kUބF[QӎALiBi?,dP*!ksmu}͠HcY}^dvnHTΙ>?8Y(*OD v 83' 1(Tg#LLѫ'}xb_A]mV\\p痸>ЪJ{zcp0❞2oGW^NC k澤fuO?hG#x8fʗIiVպݬSU-qH?vBΎ+<,]yں]7DI OXX}yI!lC@N)A&%C59 P Wx+RĖsD!^}Y8 YNVJ{^T䈌pXf:$6 b@D:m ȳ~Vu{ KsHU{1ڃ3#ͫ N؀g՜Ϝ%OӀ>IHs _}yvd;N]]Oئ)nCp^3V.d%/_~O{H5;E>ЌؿDz"N]LX#z:ESC"˒󼂸^[:wt-/sBL/9KR`<;ٟeNfy0lσ@,PU1%2Z5<Bùff@Kп8]|}qN%3a@-"~ukxp:>5%z֭n-y=צc=aSgLvϷ?lqe:~RRӚ}H}ؒOLEd{B[oQ>yʃpg]Y-{?>+Nm_5=]:bi }O=(>-u.lwuZK0⋔H–|Ӱq蚆OV9~&Mwg@:q_SG@cC1NV ?M͊csLH7ѼڋSF[slz_ᗜ$7 '|aP4u(АQ *qlƷ{% E*qGHܩP40xyvs[)Z7X?b ӻDDZ I0 $DɹVT8+=G*(v] !Jt4R̢?gF%Me\Q.+iB$3rSO6K1Xv cQ  웯9#`mBJHzu+Ow~'=(I 3~k#{uTc!tZFkcػ)S1Zq\753/D/|jE cN#!R8īHi4ty T( Ŭ~j*X X]^m6SzF =L5IR;р%ӝ#r(trBLTI+ж؞*RBΒxfY횲ù!U_\@=,heG_Rq{k IFip 陰Y;:^"?ҵ\y!O;9Qbƀw($쓻600\Exc8Ke2ʹ@}g $gabPFȕ;2d߃U(L\ nEE.G7`, ۀ8wl,hgIma%w0 PY)Bl1G P#1Gz"^@+șz3emjL~*8vCM+ZY;o98Dv84OQ_ả]AzXX/YNTBXDaeho0+ó[ER>% \`t(5.\yxdE^p(Ht4d&a9vOI"mñΧhPfRh_wB-8yrJeV+x1>wpG=\6%a? vɬgP K6nŲS%t܅2|aqUy^!Z8uFDFC@<$uh>MxW.r3o|] Fkm 9$zHYCV%Wd[ cb6\]w*0.!6,uHc&f93&|Stؚ['|~<`LyE,?UYD O֓Mi,S%Jsad5Qlq g! Qbo5߂> `% Bx&txM"Jݐ~ =aatg). M7'MIiHSi hwV"w Hxo1X8@ay88߬]#z$^GLL{xSd;z=ˋѣR߷ G{KUY%n{ b~?WֽBa[rhVg{Ip2k@YSԁt4%cr_Pqy[h ՟m/])i,/PYk.~}@ g O聹%#rULڂ5)7X\]VJpfh6?xlRN*ώE?/ }^ y<]Ř {%5NJ9odz}Gm;ęjĒǔ@)Ojܖ'z1z1MTYߥ.LǛy: =S\X>=Lm#%p8hzQlh4O uZ">w)K9-Zg.!CN^|B nC!/Ot}[S5:cNbG?WGH!ӷx2 \Lm{4]7 /h."";M/[FEÙehxwP#k!M3kq ߣg u9& LarlN;3aӳL ݂&R\~3-ÙNYh}n'UkIJ5[4>0c[1쫐i@v *Xsxp8oWNI dj_-dD&<Մ{uld/ alSV-Ә3TTf]|f@M#xbɷ㈌9pxD$j Qbl!~QsYswvOzkfQ에sMsvzw@>';YZث~` -l !Y#lt~qg+#ئ0{vܸךQS+OzpP݉ъ*HÎ3 K¬BC2"˦}am-A7 COn'[nn65Hx~]pw "Ɖ׈OK*d65i<mF#G / %Er+;Y&@"R j1lJB=.hёH^Z21a-nVܿHTeDT~t,&wd+Y!\6[z^_ )vZ.Erc98}gunT GN 7\Rྩ[q_J -ჲ.Y5!d|Ĝʰ-wC4 k{9 pTBO7d*m\-yBPl e"L(ؖ10Yߐĝŭ/w"~B I )@@$-o֨T!J K WXpv>>}E I<8ScsrЦտ/ת7N;bqsdq4mmMKd2}h:XJgGf-Q}kxz[Q ?IJZ,RIo]B1)$_71֎\E^JwpNVubXtϮE𙐮fٸ8>v:1+#zfXݬnkc1d-5b$;P#Uȑج%0%e]έX݊uCiW&y|NaUOͣ/kͯ.LGs 'tr%VTflQB8`Y2INb\cUx:U)iVbV%|դyfgU6`'M|kД>j%)tBf,(m($GG*yDLYhWEC/m E6n8 Y@Ad+(.Qnm ~M||4CgHBD&{7A${g *W XTF_M3ZFץ#e@v}̈́UI/A[5E%! _a FK$`i(M:Qz)=`u{95_<ęwQ}ᒁj @@7@0Ii{q#;I*j,Z$V4ԫ֗Kȗ{~y{nvwWO;3M.NƎȠ+_2;Yj27lXRxg| ijoZt,DpMkG)g9zWӲ2?y;x"|d-D/vO6H>?h,P u9/#sN;ݷ#^Srnz(kE-4\դE}#iߠQ]%{&3r>. '4. ۩ %D(NUNxKφ(c^MA)1;.SYD)#}FAL1BJ:m[ %iʐzF;i#cfފ>0z]en0_1kshQ&S& Gl즕2UqO' DKe1߻Y8 1ly+ssxn _?[BMi Զ9#|L.qA[I @0HrX5(w oڼҸ[xg!,$FOztqgeHK滄ՙmFΆa_u6m8TA6"Q ]Ug[WŞwYƄM G/t7L Bw,4|y|fDAEIf{v=/ \6XчɴlvXB3,2T1,>; 53j9ٟ3gikhCWlY (QS̑[SicVIHnøM/vh5儾%LF- G# Hyn_7ʫ&1Ir6rzGЄT$qjUڟ! ZtbKR`H7눩bw@Idqcz9 >k&N}V n - Yz6Ny2ʶ:(oPgݥmGT%6 /u`i+UZqŢfz~ނԫnS?_~Lz!+ , L;ae>Tu;֊l-~0?Mc&%_ž=W˃c{(Rd-z;c/ %|s 첪5I<ݜ0wdZ&pcr (`qbXp^'hLN1I"It5RT<ƴ{0MY3nvur od! ռXV"_zq" 79mʈ"AJI+Iޮ=^O+cC):M{Sjvĉ+7IϝXn)lv]D(^FcfFŦle/6 Td v7WPe0+_8q4dX9} V#x 5'v)1k lzIU=s> _b5ʉͮ=KWwO0Hph>.&@sxWJVe`#6EoY6\&_3F;&!O~A .&/7#eRongeܽ?R?~g- ?÷:_$q{J?O),rP#p'R0_XTG4Su1/z0!8R)lFLRT1X Ecpl/ZW]Ju_ 8reh2ʱU^|.d3D¨<>{^zUP9= Zj%ɓ$I dv"kumL{ 5'[B[ *(DwK 'V rmԨ_)ɧy}2,QríimBcHQH|`v nҁ*O5m–]&}֚ |N:ǦIGqw$hp2$B֢$>KRv\G^4e \WR2qm1F_Mj'J<0/;M~b#~b%uu῍9ҪuIX8uBcE*4zu9XbսC/D"NݞhMÛbF&I$);^hc,A*GL $N8?KTq׻O&HzتioL*h_rp1}O4^s.jY1Dr-g A[řy&=Ƒԅ{D8.싢p 뭄OD-Q^Q7y%6ꨡfᕕMq7zɲ gن!i\P/٪LC@}S+]T_\gR9-n{CɴyE9FDD2}eToFqUY%6. ϹDSxBz%YKIܓt_k惑)$Hʌ BH]l9 q+xk㤀2fS$ |aA1pպ+Æ^ ic0O0mTSwhqQPlܾO) ea5 ٘>v g~L*.6%2;( 7mûneŜ e-št{x0=rd'q=F_4`/Mw&U;(k[_(ۮj`͐sr9/w 2Ѯ'kd+*n/)NSlT-3ˆtc{@7,L`JBbD ś<_u<(J!)*f\3ΑR^(ã |-9 ] M7PaVA¨XzG򲴟wUH!ȟ܆;IbtHUGٚ5% gUn=E`gOb|sH $>A0Y%P"k.l[m~'%e 7#M. R{IN-Zc7XikK32+O`T&\VǑ.n;e8Y{H,LZgscTR7_&,(_MF0ջӆhI%trQE?6pX.pI|?#\ti3c@Iи TEaezJ?sBJ/t+G8P?1S|qth=JhޡS0Ї0@uL,8 BZjGY^-gaB٧h @q2׹+ȬJ`-)zWxQ];%< غ iґ$eINBz/X{89#M0y UB~}OЦ5U 5 @wTroILwnaH86$ްhdj ct&HCD}3G/\*۽`xOu^\w;iϟloь Z4qP'7hKӬWb#exX˫=9L\BbB HIwfҖWZ󮯶 |5ӚcօiAv Oyf 3뢖6N8^V@d C$ti'nf7"O>Wi1zlbs*ZYDgTߎS?0/RЊ;1]˧G͘Z`\xZlx!`+Vnك|Ҁ3V79PN#E^[pdЩOP#O@ˀMd6<|k͹3q~~uI:fԌgsAe>8K+E80XJz6렇@Rf v穑+[/8KXňE'΂[\31%PPu5*Ekt䛿s ACcHJvw嘆'}#**)hYxʴ BVI`N\}D G-JY.ƽZtK̜1, =9]F3-~;,^Ug߉İJtW/`޺}DV5v#FT)/g:Z|2ΚZM;Q 1frďLf{Te*wiM}q s5J: dz)҄1\рDWg]l48e`e>Qq䇋7Mݯ/ &:{^#fնFNrĩr"Z˞ "%ħՂJգ1C0y.U|:)0;(~E>SV cʨ؜lZo3U}٩g+0F诒/ٸJC&D1q nj*#~a%Mxd).%y̚ H7 rr&;J}v[׿@8~$rPYn lc@cYf pՕ4Cр.K=uBvvn 郁B>+_Rp]96&iT Ӧ[sԠ_#Xri> 57⢌ I8MvHAסt.x6m@,*z٢ XZ<~ WQMmԓh(g鍼 mu/n=4*4wcr*Y$]ޕzwӊN6:y^)\ Lԧ)lO{N84qD[='C?T'aF|'.t (_'|5U?Ų^;ZVũ<' 89XSZdGO4L#3IUHb~]JwICnIR4ϖٴ5 drӦmwd(~H g-X+|uiQFtp.`A < c*q񉊢dڐꉾ+Pҽ߸l@}HBUBO*HZ;c&Isޯ@1(}a#UgxSc䳵03⬡.!IQ5诜rtHEθN{F|~GnE8 {M @W#V_$rkoGl0mŀ췐dG RlÜ@7 Vmj>DΪ^c.ZM2ݴ<\ڲfƳ`/.R%5 X3 wI-dVwYnqzlQץΌ"OtXN=Y 2yS><$AG< o"|ajՄs=lUߤM;jB<VVWc:5zP851\ZПU(2I ۠ܢTF:NF ٨l=}WvvY9]"23#B T6867P?{)*32Bci9}e<^,N2ƪͰ:3JP H&w_F[ٴcGQmQ#!$_)LS(PkPO#+Cf?b5=vj諄\I<IvPvN,{(LO.qZmq~s%h*:$nTP<0ͼ.1SM-;mjʋ[c9ՠUx[odWg= q'^֑CeV|E̘^zĀo_It!kTź΍Dm(4Η"[k53=6hOz@{SkR `VԄ'6es|^b 3Y:Œzోcq9nL%w i!Xy6c$(.?r86W'Gj4/op'XW[Dd>}"%Qiܭ /}eP#C2hw IDe]va7Q| f<9HBʙ;;Ak=[i?~9e䔦@c΃D†w G;:LXrŹ*~}mPl]q3۽'V2g7F_\6Gl)1fAG{48d9\-'N;f6} w_fqP7Hq5U-QY+  iA2Y{lYו%=B! 8wLYf!?u-q{f4}^oURK^u-]Zp"fbfn, m؊9}@)V4M Kﬖ9njdO5c^L#ؒst7 hɈy_?΁2xpXd:[5E7 >7ˈ#{|kLcG4@;b {o\MVdWtv[<4JJjGo 8bʗ.Y8GKT5'̷!JL ݂@P٭O\wa7"k%o-C÷KĒF뭨VV۷d%T|~ L1#;2OKiv2ɜxw~\3L[>"n^Aw*lﯟPOsɑ2 @RSIȲVytAeLxw3ք (EmZgӃQRpQ%+59R?`hbR.-#19SL@aT%;gˡ>OUr\?E :R/.BP*X/OC51pXfʼnRWȑ$U˗m" ,dkmw)PӚhK mU\ۂv&;'I*TOWXu̗@FQ-qòRJuA ]q} P@d<"~gh C œXGAl6:S@QXO#ۂ%Gsp½L$+߷cOp5?)*٤6F\Y8ch?1I-yoA<.kҵh7A\|s4` )}Ν7 & YSNX WR#T#$4E 5c@eN7EK!,95P[ub@[+A\'.I0UOq\X *dpJ=Oyhgx ΐmu64U䪵AwhgWGlRgpp;8-;9=y3x=ΐ>A6%6 dh"۹"sap$Ty1ڨ-"B545> B]1\6H/Hmq#Y){Sv/%*$zd 7nP(s1v:NM|"U6}?ѵ?M*#lXLqQg|B4mkC ki0Z$ŹOsOiug&42(HdĒ; |^6*b G75̻iQñ$3vh0zJsEPX󽥑9uV!ʠffbQ>^+5A#{C1\?>Zı|[#eRfQ$/N]ș~}^7mԺ׆mh!ݜ Bo#R n8T8KWěu ek]<\Gx,V R!Ɠ;T@Qkzϫ(rk+:q]!A}ߒǤo G58sW m[iB'T7'FYA {0t3Nj /Wdj9 }^{.E3pSRk^DҞc$Md=PK~mL)%~vrЯa(yk~)A]i/hGte=ؼ/V/ Xuf j/^Q椪pdglȾj(Qj8QuϗcdQ i)\ܺ^&, s`3bV" ђY2-oJHnѕN<,<\Τ~MA37:bx,Lϧa"k%@n7 -\m??z9 l]]#d q!m>n_Ij4Զ׶~(%Eۅ Q !O W$VH>2]W\ Xvt"}m +ϖ𹶏|hU̪Z,&sl\1bAbٸ $=8ͧC l\B2j^,/H5nak&΃*+ҹhLhi7ods0n@XWjFi{NsW2\@lS)|yGsմLFOH]#i PyP/& 'sWSFԵ1vb4(SU1Gާ1GH=57{G\d9YX{=yda%=|Z(6u ڸU-u(mғtIX)W85݈ "K$+n+$7ȁ#=|ԚXv?g3xZU]vJZ $Ԟn¡lmaT.ޥBb^5ղ2^ƿB,%G$5Ͷ'$~K-1kDdZ#\i%% Ak: v.IǵiWm^jYQa|zTphTԁZ+Fw:*=W>1OaL | eIi൞i&$?6G&u0s&(C;7?ڂeT֍E;S,;d Nᑧ5ZP3C qwQG>[t%`&E{>i5v_pOWͭ5e4f/ dSܸiV%97G 8"2^= 97 8o+Q[n ]`oH 5޻tIOuZ8(מ\VR승[_2žnWVpP"NdGtcr,iZt_`P/,)2 KS>b!&%;Ò'FyΧwmtO-}Nc8ir gNE`o52SL JҤb[jb^IWrW-owap+ÅC4{a?X׈Qf?)Y5k$+I:TF}(2Jϒ\oʛ/S߭ JWNN`w aYRQ52Q,eO5&>[ab b7TViq')b؟@M.\ RQ2>џHƎ MMÎ{#ޕyW=DK T4n/\5Jӿn6`.#żz?rzR0nf9Oi4)eQEj:/x&5xx'}E%/4/g}vwʸƍ'1#3Nlp$uW|;H E|.v%eCdÿ9[-dWLStkHފo qfK±VFWO/+%ȤD4H\zp:oǾJN*5$x$'0Vy^8gɌI;9'LJ+J$}iw[*H"82|5ǭD\|8vC-΅NC[|s$i-xvLvU@xa } Z60x8/t C5)yقX!3lqa_GE07#B`wԿc.`^"~Bg5Vڊc0yoY;G㱸DʡT6'~!>؎?#}44sDF}Kug;/E[ #dR}Znԫ$bKh>Ͳج1"~ φzm>/0a}8H[qR#' vGZk:7@5eN;#IyӢu=|@gYW8{WŰ*,^4fH\_4C!h0.4Z*>D=_U៿l= ta5,Ha퍆¯|QZqVqn Y=1F3L&c!a)v3*0e9?ɇbH-Z .@r/+xaj SJ+^k'+iCY234d^tQ|5+ǰof -*5.O7ޠ;MJU_oFSJDf+ \~Ftw<W#_J'QJ[~qcSFI&$]54 `0Ijcى,ŇlU IkD|;v\CC =tB;2c ov#Jq4i C $h36i:jy~r)`ANnE*U6Xk !H4es A.;; lYTZQr#s;]+B:s+4:G!-J8K1*K#«z/b s :5"'C,Nv5`kVgx+;5C`%FJQZn]\XDI ?kFe~)tBV+-mCq;g~7`1h aY+eoA 5ER)tKG7jL&<b>s6%pQe4b {G^&ؒs.-w Rߞq{%8"FOAIknElI}42bBb NFc(!wԧ;{0ޤ"C8;ڹz: s{喛C#sDi58,BU틔b;a n %trhń3.NYmĀp aƪ&p&2'4d o??^jg+\bW!8@^!ߋØhr&yz<lkgsa'xcMt)闬[q,?ػ*QHΙf\E8~Cx*zt2W-UQAخ[w]XDnZMsИe&]tYDhL\J+>6^%HiuK{sh<|l]˖z~|eo0*6J⠴6#[J ,ϢNBs##r8fz\RKp-q0_p 0gBA4v.XRsz@)[U%~!խ%X% Th"lzhZx)p5+Q?%E}; ZVp{)ܦEASae(ƒ2-W}t? h'^_wq#0C[s,a ރ8 E5tTy ̦DMw]PJcK JhugͩtmPxHAOY(ٖ-t!OwpN͓~>^wҡpq`N|Zz^]"9Gn)+e2X7x1 /k 2a` Aw]@}pt|Su/8 O1ɧۋ$Q̱\>iY[v6{xhr #6l폃슂\nw z:052.rުYC|<{)V_݄Pp;=Zb퟿I. QgAv"d&wxQ Tv(Nđ\7?fEVRxōh+B2-fK-" gH(Q̚g{,i&hY &b|>A7fK(!T5M˘imE`qvq) ^B1#ޛr)yIy' y׏&!=^[9M-̋Qzr2/ &g7TdP2sme<S9zK;K8®㘭 ڔ~zldhW!ŊムCL(^j@T+Fa+0M+'$e#Pg!%HDbx/n_Oʶ\'Qu%+dbeliʝѯ;PW+[vu+7 |",&ʈ􌷯M Wc;0މV(J)4#-U7c2R⥫L)n̨|d~k?%?cf%P)dcYW|' 3 Y#f9-yʺNgτJ]L j2ha7K̿恹Pj2/5d# `µ+oUԪ:+Aض)`|{9VxCB*>d:I˔ ߈r t<s9a "T _,Gؙ瓤|nhEGqp-*A4CbqC1,d!]xTz"M%,uDn8w-%rO~hU:IGzmsXU4hN&uet)av<핆h@Rt#A_B̝ dLδsms'=8IzJYr,cs!u'㐵CǦ@DZ$1:珘|͙ f{o@/,% ܺ#>@&|9}H;yk[UqxƕkAX>l֭uX=Q;'Eqep`2|$ߗS96ڸV KK)\Wޡ1j"awݠ05d򜍆zfPG@"lM9oms;h٣ڇ43}aTi*euQ4s-g26u3>wstv3ks̄^.7VBt㬔נ-]~R;dt+| `(SEv[OS şjP϶l7!&ˈbO%˸ vڊ|^۔2m88L*,{P=8E OHA!S%fy!kNnACzK~-LI)Й:!*2E`ytZ~ϐξ)H6՟[P]\ݴA~@y\D'ڒ4 }LϮ-$ެFԟLL0WpwAgPc|qO*(e*oqAP!?WdZt~c_@M9ABFlQ о@TlEh.jTgSƏlⳂno-"M6 (!.gI[N+{E8 |b݅Fogx7mdD~^7A wgUqZK3]ww=^T] 43uRI7i޻*<ߐTrmk8a~h3ܬ`؈rTZx\^H)5ڨDzGzcmmn+B^"//]$?c#JOIkqT|P msX梢?;@rdvTzKhĢ< ,=~,3x&Q򛲘5>88DwjFy S/mej,=1f-("-5+YLP>oFfnj"]kO-8& ȋjj#r=wIPl4lぉvrc"2GN:`>,Ȩ-iGwʲ9!fhxy4`;˃?6&ᛄs4OHz~3fZ 讬_fYGH-azFuY@r\w3/(RJ6EB N~bZwYxU mݝS$p=uomYOV3nZy5mLn wPy$a礶ex͓˞Wlʍ?̫` ew w MU aiNRJ|nupEB0\JSb󇺽l1̓x< 8:T-&m% ôŦ=X ByʖE2fS,ۦV#4Nj>ZQ#,+SQsoFS7fUmCz!$X8t%m={r*4J(8!:~k1v{a .%E3ڻYڞHZJ2 Nq7h?p5샳D." y@$#ֽcp@"5Ir:2뽜 6 [/W[$XFJT v NM 7g`ݵp1XdqtUKpmЎGwחN`#%3յe@<*-[2*rtUdV.56@8U$4iP;ox/I;|^ڸz Nfƽv,mgQVhѥ?.+s ]э7>!#Vfj͊!GEslTyIs!T4$r,g&S\ZK\Y_{-/U?N\La0^?G3@[?c 0Prmu%UJCA}m_$DE>:VVҲȄ X1`DF R, ]Nvu?D6Y-?ag42DL?djFpP~ucLe_&;UU!|4YMu< DwDêOvnsIF&J>G[4zM qn,:;UAƋqLɤqڌՂTU+ W1CyQUZT>Tѱ0j*A'ن~AeR0ݽHo>!,smĈ~ SJazQaNviԗyPNsFY$ ckʼn+(Vn,1 2uj7s>͠S-LMBx`([I")@k "U'ioASOq;~pD_)0zίm7}=RxRXS㱶xU@`LeAO@YBT9y|}//2֮4LAg> ׽!f6bZ>{-ĤLF1L m?09e:D& NC+ QUsZhĞ>~ntHr~!t-k&Et1׿/%V@Ϲ)j9~SߩFB a^ T}}]㪟Բ9X裉K˕,zrBI:csi _XJ 'bEUYoOpC"QL _*UAffGӖv#[4 C@wjZ=פN{loإ'jTl0Nr`Wz#Qk P9l /q`xJ.ٚkz6fZ'@b Y m%cr[0!|yeaW7WV5˵qjUM \9>F|A;% V.]7% )O}{#eqe$O"z]D MlK(A\^(p46" v-G {JЏ8H-TdG]iӻi8juJpi@']G72zb-hhxx޶h7m&(gSP8VK.{87s= mR3oX7\ċGR9](Ū9ڂ7Jy@i lGmL!-3cQhgͭI5uso~켑=GjhιH_Sˡ9NN, AUBV~xK5#W2$(Դ@^oYB Aꙃ8 > S!Lvm7k(5 qCz -Kn'gx6(O* .8c*/nܞ e]O~K']J7EHpF=>sna1 ]^|M\ڋJ̔`V^0cǤ:6AG&Jx]]Џ\i#E)9_~TQuK^.hM q?<ѧ] =)fIq̅L*_rۥI%5iCwb5WM/Q=l&B|I/ؽnq)+AHjf;[ Iq4$`u'ĕܱ$ ϰdwuf&_trE!$|kb3&Z7z,饣F:9$D0߱o i YSc QiƢԶ$Dddu,%4J]bhQ5d5 ?.*e@ T4 {8o\E K [_;,g$5&J0 3 |{ %8EUL4~ a(ߎ V82ؕ2Dm}T 7ʎBHfJ":pы7٣֞" 7ׯn9]ؤmڇ,lR ѐU(9#1u|WJXas+9N"8e{ qoΡϵ<`|?- q *{r?]Y7h|n"WDUpgSɫ6{3_Y._iF&10e\5*/cH.&W*`%00)QL`eS%m,#S$Gdˈ#ݙ 2,T]qG}Qba3Ʀ$V"4쥎Ak#vs: Ol ՒwZRp}%X{Vsջ󔺜$Oij~9EyD/742$ϴ[:] zEA3oy!>æ-rFR`)aPӡ; C2&[A!.~ 8HesDE.q`;= /3ӣrC{)֏7|ـwq p PUywn.; 5*P҈}@*Ysg% 2B7* LR#P'/\c |I#ơ2cfǾc&vj_xFa R:7izʧB| =v߉Oai7?yyOE`J5lRENjlȏM Ѥ<̭C;jv)?J=F0d&œ__fUeLJ; (HԗOk(!rvfk]! Q̮p:65®m4\` ܝMgi.yL踘^ S \cƨ¬N i& u>4Tq#]8H4'LKy#/},Byy^hfsOI.M舕7ZrU[DS=u f||D&yc|?>=@H(1xٍȩյ\z$!A Oa٥3(RNe7Jk}$Хj=k@USZUrGD){6֋݆ԢQb[}*uD2E.VSUQ} f!w4rVϺVAT+֎2e Nu{BYDq9j%xʎR*i)Z$;4QYF OtI8Ow6 .%.gBK2@*Aȧ > qbWݚ*HuXR9Ru$Q}j$\q`l5[?q&5d =z;d}1h!z遤 y>/(̿*ڣ哵.Hnԉ2s}<؆r-_y5Ȫ W.s 0o0<{$ XE >aCkM6U9Ż?^mvSQ>IFaBb'J#s.ҿImp7wNg*悡!5яXkTb gz*{b``'M:yb;R0b zW̒gsI-Ⱦ4`_'b š.}(`׀SNN-ΐZXȝo5AiG pXr1i*ǘAoU$(_H%d?E|5(K/|ĻF'ܴqA/eMp+k/~W4ֺ[9_?w/zH Y|ӛefX ]hT]W`) 5:RL ~nCLIqRPѫMdxcSXMh9읡`N.mab?^ǬMB)Vz{]9y `m_@4 J'Wh[D?r'^j0vH3WU%[p7p.T}$sw?1k`&B 0 ]uw_[;T&* rgtߎ_b[I̷$ɻ8G!%DDq̍ނ|$%B[XlXyFq.2CV43R%x%0yRnCgZPZ' X%{ we. אu(;5\Gݝ3Yt3 Z[Lxő8cLHךB9,n '9 ;n'1M@TptBnk:M{jf%E0T%ڢqGT$YUU?f2_`RTmMэR;Kq ORT7R(hO~=U)c#m}lctW wmib1v}mr.C,,C#.(&IAtE7a.@o3NƐ}Wv]nwo"i/[[,ꆑTgC:;fġZ&b9 *ۗtwՍDF M> : g,IR{,k"Nۍ? %m9SE&/ Y]?#JƷ@ f;)_61V? E^ө^`@~j$%̿+װӭ}ڲ@ˀPs%e GMzs}ijA5_)[[,-";=tc),:쎥lbEt)h(9zԕd(;dv(lc@'/+ɛ?izbgs5)l2.$u{]δ@%--?1n,bY3M7Q6C{:e@9a7 ȯTP4巭FƑlcR )Epwy%XGcCWOsL+w{iex: |Z@{Nq]HzIW13?'FPYg1 qX.=Ǿm"9RE M`p 63,TG%"n"vU8W.y\fZ1./4 gCIF}/[bl]Agˍh0f\& q<>AI&iUs-x޶qM JŖ[atWaۗ lGUnZ`sJ!]DSQ '0L4} \Bj 7GG{)M#V-8alcJKrFi[)D~ރq!Rs~QGvfqE&T? qA{js6ǡ?fT60If'v*їWv/Rmi b$/7S$XЕGӍƚ} } hKF`ǾWDyRSp2`zk~H6쳖$DĢ7Z_笻o"q_w&/уj߼5~i SM) 쓔=0%,rr|A'C [ F6VCԌc;(Z;;~9k*ZË?S +WqWfW%ܻ(92/T:q_}:\9TDB7y+ǥ}8թ]C0ˢ+?'@OQLfvsjn%wSza10a`V)n+y`Xޟx0ޏWw (.d*}MOT:;O'ߍTGF"-e~HC5vk,Q^9 evm<ԩLL avcj )^ΐ҅Ct5A s7`G:[|B̳gw hBI9 P&='h˄{h:R)Y/xE̊1,-{ءA#Ïhb@FEen$+zCX^c}F͖$Q^ӯmNLL@,]3.VX&TΓtHe3؞|;u`JA&uxMW@<}9 ˑ97'*4*81!"_{ c'PXkv8!P Fעt!.Y@r-ӟ(f?ak {3a @ ͤȽy7䥪T}JrQA'nPص? k] ڽ#>1IRZ"q 3M 9|]6 T-V*ѹWu,eBa2OHsr v*|wf+O$SzQ*z -x"o"V$9n)Z≄thVq!@@b4^rQ 䊜 6=:%\5.Q3MuuAIj Lyza 6XUlK fuL!d80@amJ5Van8J{nw!^:^(Q 2Okb\Jcׂyx (1XD9 Y-#FIp/ˀEVYQտK>RbİkCiHYJջPܕ|껆^v\%>vi֙bbz+p;eD@Yyьn ~^$MdfTxhEqtFmz41ӘkfKG0vwЩ(UPGJ5YQbm:g^E}p-R+DC[cW_֠5ܮ+a}PvG"~Lj3"TFﷃnY3L?V7 rh.nQo {~/H|Y>8uS3GsnSfY~=]d_sb晹Z/LSd_(PB+c/m$ Z|q4 < D]0|ⴔ~h YPNjU]VҼ  >|cɴIqƛ#R'ryPѸhJM% ^؋k<^r(sKXSԌUR496IxdG=;I)kTbt8-m$R͖Kr=1ޡ3IJ! ^:B5+ש puXơ6xOEӑv\Em^ eAXrM42:RcGV=:GE&h+WRگΚ!.p0K$gXAVh~AK A2@LB:\<׫lRⷵU~/~P$>'M+ZvOBA_?eړ7 n캎g*B4 Pp2 8r7r#&ieR]=B_m5k\mGY0X acI̗Ӯ"T|N9#X7:0캓t#iŃ^HU)|ڛ^/`ǘUa9e%"Q_<ț"!kmto@Z.gpItf$JXt'dQ")MCiCӃgA53:p'2(YStneSSX^1pH %Cc[\Do]𛸋͐ N22VZp<<>-s{[}O5qU95k`:w):?LӷFl=`0 xL*x/53/RCQްާy\7Ӫ(~ ` 2|4MR8#'s?M>`ȜLCdVc%:н bMѪXSl5 uaS?aJT#K<9ŏ5dtwݔD[рYrօ]` s1cX)ZDMFPà:B GW0aXNLNOvfאFhNކa鳨(~f2B[Μ~Ն;~jAm}p!a2_Jyg3Da:գІi Ӿ:<ػсwRľX7jMXƊ-)&zґ+! Zm]wDs3n L6%s1Dnr.u,yG0y5І'ӭ>\^:ij<©}rYV`O7ȩi;-dTgcsQv?H=24UJԶNV5] (NPCA|YHf@^Z}J~؜@Ȼ`({fRwfL,qs> ),$2wNKȼhy2sz~ >>uYy9*ASGb1Gmd~,Ν kqJ3]G.+jVN&av+5>?x%iЄeyPNgg~K8_]2YR?"C4|N~u‹^*(򿹻hbOiVlM̘zWv%P{'sʔ7wwB˄IF |Bs䃃 >+{>0(&]RX]̋Iq7!&D^/O7OoL5rurMwNHx J''-::? /ǵ;aϫߦʹ[w؊p @|b:N%ħd㑐 ;Ѐ a &0λ| %@6q`xk~xUSSl讗66+Sw<]8T"_'-!hq3! 3&KP8v0dwt@C82{`d<0f¥*BLk_u`yn?^4 M3QLq.u )󥾡]:P2b?@Cx&R)FI.qFv똶;=gsiþgN,eռմgn\T{h:3@!2V)> Z2ݛ';vO9b_O$Ke3a wwѝ~h^"&;y9vm@͡gL7 ̩17(-SKA~e9iF%TնƄ'hуW4p_P8zQBq$vɤʻλYSv+v*^q$FLVG,i _M7WvGY }uaD0%m[!1M^ PԶ* +n0C8BH VNĢ/. @ya%kzKhiW#JnøU5Rru>g9d++y9yԘ,ݨI7WA]mju#dmA;Ydd^^G[Oى2=5mɮ)mnnaOc+Z; t+/MHT%;Ѡ,'5U|nz#ൟ>y! _qLlt\G:iXk/D:mlmJ^_U;iG1_l\6ÈQ *3Uo&вRԑȯØ'lS%L_lnpsm1^yZ'Ϡ&Da4F:[NTzG<1q' 4MӦnD!0b/&ZLJmA\ 8bErKm&Ot!5nyrNڷ[zH(H.E;?jG,*j%DIN`fW-\5Φd&砤n0!, PfV v&%rY\#D?Euq3Du5f4.)Wf<-{DdBs/d/"ml \E-/>C!P fQc̈diΩr} sK*t\r+>Mj_n/3YVa 4BBO3PX:+ 4ӵ m}N^ ~Kw.MRL]$C;&=Wȵ(NM{t02ZU7~\kSqp5bU3z>J]eiM`͗hʁE0sЃ/t)X^V뎤=ؼ<tRJ[9S0N9mNWY ;0>۩Nfg4&'' ӊic>zbyhN]"GTwJQ7yԵgbNz'?u)L3 qS2_S7r7@)1G3-(ôlsuG\ٯC<7Aͣw Kx,ЬMO!`_0J)"l~ZߙwdI70:0"SNK@s °GyP4b ф*Xy<@YLN^1b9B"+1|OCo !s맣Sut&@bhH*&O_"zQPQ\jHy)БsQ2Fj, fZSi߀ikm~CSmlMByfx,Q,m\X 5&#^q6&iz'#oHDMO̼~cR୞?qfd [FPM_AsNo@Ttߵj_.R ^{=ɞ|ubDF3 b_s*N+~HژN^$ Mڼ DOw*DBUN}xenKBd9.^kݨљ,q$\ .1>-6܇ `S! "\y,m(Hyx `s=3{}g8h8kVӓ2Ƌg >ZqczfD?at2ux4Į^\~< uɬ:jngWcH4";qH$2 ڏua@eV*KP΀LNoڿ+&z!*Oߧ׮ek]yw/K6W}";קXk:N;%}F'Į}]CJ2w]J\,U4'WOJ"xdI:ݨ_a3AjJ R)ٜ[=w0Qn18y2|>`z >F6iف`60l#2)T2eA$ĹI!9j8o% x2xАW{D`n)c.G@*Ex.m ڜ:y}ΰ sݜzpbJ g4 J*ghY/-~4>Gh^y C!Lۤ7v?I`Cqw/ׄdAGh}E`Sk3RoV/jțx{C gۚ/h6S0Z8@T֊,dacH<̏5:NhgVe{@j B%. 02,?4ᘓp¥Av)+ O0<W{.I˝RhLfP#0 pFxacZTkBgd U2QEN zxAh{۱5d޽z' dysGm"od!_ҨyW>M'F8d,_k?0T?;!U yLm.騖JEX~_BXxܕ? U^Ks.bTH3"[et:FZPn #$NuXʞ97]qcjP"vhHWNQDUu?m۾`uYOoܩ T,9uGD[OKԣ4aa`T cgbH UH)ȭwi?d"&ʖ >2_f#8Z}jݶ̲1^4Vᢽ0};`HA!@kש;2Ϙ vE>pXޚf@rkѪH8ⴙfN52OD#&-wEl,6@H*<Ϝ•AyV>xЩQO[4+L-P3̀!.w.9.ʼn?gәk}h:^zV|K6eS(I5o[T6Lϕ!$4|T|79~\w8 H0%CE\J~AX5/_:$*6-1i48`AP=xzu|0助ȝt/'^|&+InL+r ;-L%*"fwQ #esX"Km N.2"Qi4G}D ^ #dH*"#l|Lj(~#6ԥ.0vqmmLwN} 4i7%্|ϱy~БՂ+VZC]jȘoI=Ieq_ERz乵{  2,;΀'0DٍYIw?^넬1K\5zҙ&_R*}y8/J(rkh0C H.=mi=qi+EE@\Pm%,-ޘb"k6[Xl?xU?U6]mۀ TV[_fŮ J% =P\2spSA푤r?_kwt?][@E݇R{+MNNSW6%}qKf8nmi#M1h'ŪpGd$="N3čϔ\ny Bl+Ӛdf~s>T3G}Xq{.?eGٛ2)Zl3zYHʍ?,@MzB~=-;tV+Yh."v'?'_‡O-j,B|Y3~gi3 eҪGA3,1:8B]o rY ܱB6 -9 ~fj^|{,ıY9X"@ oaag~Tc`Yȃb2$r]hqm\ <[#i( )EVhǔlL; @|'ܠj.-U4fܡGeN+yvǍ/${R=جx$uU6Sb^N`.6Z ('(v 87{sɺ&BϮ/}22L>4!Ap4{:9l#R`}e=* FIAcW P\ov#@GNt|Du3B {MK: Ą?[ҠG >[YC~ :fUmW8{3vN5 ;^S~^.,BU`>kNr×-~Z &0ofK ۉM&i4I,c8GsrʼnWN8CSUj,dPcvXY3f݈1W1u~ݍL >fO}:aNl0+kfmLĸjĻYiUV2ϲw|vS"X;$[OJQft _jU,O<}=R\ɪĞ\Qjȅr$e*ZV)bku+;zٜW.b=l!ĵL~>PG2*8c'_9/H~ ]@sي7Is_g]f9R~N7cu7owBYyn`xW-]'nHN|8/$J36C jqy%QG?&qk˒TYl4:M&k;_!\OW0r4#''%lz*(3F?~1[J>=ƈH>|!϶z?Y:@=2|h^K:ܵ ^+΢W"I<=w^&:hB_{kB\OT @;S! p /gH[[ ̭2 V ?S>4\eK3SR mm d^׀ɔ;H-K@Gf}e˺;,P,#;l뻚߃/k-pfaΙ`=3ɥRT~sc|Hʹv.J|FaEl~@XTY%!sAy;ف!ˎk;׺c'QYMeܝ)q F28^L_w=SkyY;q6a4 j@4*i,k(.ׂ(3aA2DTES 5%i-o ^́ ےڶ3SOz+\ i Lꈏ@p*NJEYkq xNwsH_]8U(Od7eDvM#ODr 5Iz(2UBvf#APĬs Z@I>bZeθ⹖Qt .m t)HW˓Jc,YWNX]!oju䂃bF\HQix@[BEI4GZA@~tUbT^BBډ ^R"@vy|q -X9qG&Н kg |ls~k13rFkG86g"M&X7̛1NQ.&eR#b̀93MaUH;0}=^M!c"W/'!t4O23_9K-*U ;6~쯔 & " G5=x!Z)1mHoZ?+3}V Nx=S.([driG\YRI#`[i'* 6"maN*+κz T2wuêc %8rm0XP.>|4/SNb32 Vbsx|?nt!qXpHf%vA0C@sOkDʷG  ׁ)E"+UZTކy< *WG[i%cyi39c%tJ{z1+TA}0^pSOCIEL@ƭͳFMa> VzMtT:*"4qw5siE@xw^tXdBDS#^ 2;tG&{˦ɪi5NP5l4 ȗ swj&'`3wD!pOoK]Sm0G?E@;cz"INcT+<-KG+'m xCǖ;51 b$"N_~ :'kW ; Hr|/J2F% `2Fp:3ѰPHͥfMvZ!!e3fdNpdԈBrz놉?Pwt[v"9u^y&ߛ_\(Vhܜ:i:uA:)ЈHHd}zK]x_1'e¡ t҅zŒ$+ǁ+3T[,NhB3ah4Iļߜ?;6& mj@ydkrFϋslyRQhk0`9mT=%kͮdDq5xώ=\/^=^þh* H0Ǻ]Q򧂝f) AEDM5.v^>`?*m4>׏Aǖ  3,ze܆T:K1r.T h7FOM*3rx>]p~2O ߘ?73zہ4!,*ap_}_FʁϢI3FWxVY*om3JA\+%S~Qf;(YK5m QdڌL\Øp`˦IT[ 8EJX~D /l˦>~Nkj`1VdRe2\nR2!ɌdRwsupC|h>,LJL9eaq@M/~r$M+Πz9Ƞfҟ}"^"p1GtDDCF%,"3MC ޘ0MykTO/vf֢]v⛚b*}: ΆrԵ_ǭNتȻ͙%=Y3Uu&eֵy$awq*f"L`zzԗHеZâ gqrE_9ئmzۧf17jITpU;&xs2zN VEĸt3-t aYywy]LO7A#6beȣΫ:,{fi. JpB7U\5* gP{iLX||DcIW++Vߣ>H#!WB־Ԩgϝ #=N}weELdp[y}P}\QN/@૛'SCRRe?G"4bGǡMI Sb(EMk_3Q.O΄\[4?sa,0 MOI`^G˩%pwn{fXӣrsy[c)=&%r(}2A$0jyo}h?aeN%73Z9B)'8bێTƇd )G"8 &᥷ؑ 񿟇TqxGx8-}x}x2K5t01.$ؿm=IӶ$3C+q#1SMJ`~ܥSV pk@A>u z?(!Iƛ qc tɯxs5aͅƱSQ(B\$a4vDt"L[ZB"m['qʭP!&q'b&e4n*ƳB ';N-Ɗg\==T&ʷ}s_YlFnt621}!A:,\XZ&⟿LvoBVO (J0uLr %SQAUjpFl=[1qb{b< 1M{bx_ ݪGUHpyb#g;'`ɺggnLS69z})%tI Ayy,x7ʗ>4Qxr2Qt+D~W~Ĉ:e_E(\l36)"]j{z0t@j߁TgN VIݡPl}RHz5,s׉KGyoU'.Ԕ"…o ~XwjH_/hUWڴTXL GGDđ 0|>:dwAӼ E!P 2tu55^yA3 Yx7KE{tMy`{]%m^$-: [Qx +%pz*|U]\'~s/Z¶_8E9gݬ0^Ǎ$;ۅulie\!N5~:w C#ٖ:e@lvEԾ%G!d6Aw79MwtD#"56V'끌SKU}tTއy}T'65S$"@,>mgGpcE=%*F1Ob.Z'"g g[ yxw=uH`/`4f> Ʋ6^9ͯ3H;BIICgN3uf< 4oLr fpD+/rlsvr7'hgxk8yRc^Ba0*.+IoI1֝m S:@rSmݐ'K`%Q-[5^fl[jN,,">،PV8~ *Zg|ب"ޟiIU"(0W$`L.(#/!mHd0/DhhR8Z,Lf\IJIy~^ssǷT׹aU*ƙSMS,jBVl91ZgD^H, L)aw?y C1 9s_[-3YAO&i+2NBE3? Ð~}WM؊}DQ׹)aIpΨFRi7VY]]OӲ`cN@Y)v'a5#.l%,Sq+^ƲRCyڵO 7L_*%hOH.*bF::MZbƼi+b!<@ڼǣ!hrʤJ>-2Pj*d/LClRE#wp-! 5EZoKVXy$zcT!0H"p ˀh" @ɅZr*Dy䖬0k rXW*mJRNzg* c&^e'GoGrô_  ʑL(!=oޝ\b  uAX'K\Bz˼ /+IS610h aL{cqQ=G9~C۠Gq#ųR ^8k@eDן-_fz7a֞ߨZcd^A}O0|Jˣ2w=HScMqI`[ASArލHNI kRW:F]QLL~SSB;Q ,ss;pi0\zzwSEOU1=\SU߮kUnꞩaS8G_ }0hC-S"7گ8۳c<} Z|'/b.v½4w4$ۿABzSQp\6EB0CCIo,x9vfB;?AH&g (`,S@8Y 3D,ֶ%Gp?&Gmrz ePЌ',1..\Pe.\wH'r7Dnv\Óvsx1zu݌ؒ7MeS?Jyzp|bhwҨzvYD^ ypG"M}L!>#/Y/2 `kU?shI vF^0VM},+КN2f?`-=cz' h2QN@<܁bIi)yJa )^d$a7x,k1YDa],`:8Z:E4h.'; =E"GĢN6/#vϑoJM#w^~J[ְ%`S NG$c|`hRb^Ňz:'=LA7 0  C$p2Դ0 SD0b$34'uO/rZOPwLR:Y tQ[p3t:655CBExL)5 B25Ok-n `s3M +S=l'uԛxuS,( %;[]EFb/'9Փ=Wk ^-tk*Lݒh W\ [އLAKkwFUOQo&g=ݛkدrR߰Kf(-xk3hn|Z suP\52r\/1eq"tx;A4XYiRYO-v<e;G'xdcS? o vV8q ;Э*KvhOWF/1l8mz; R"[O<}I4捇gn"SӍ`zRV d!g+: e}wo-5T*$BQ+n29z=D?x!˪#Ǹ&>XڬUQ{f23wU@h ۟JbA3;5kj28ut*!VJ7XxE1/b$ӻ^||7]\Iӻ g>F{ri{.VŎr($F<)slavD~ɻ,6͊}ݬ 2'}0IYz7 +P.QeU&A]emUV0hflPSJ^OyqobN[^JH_ܪWX/&v]v5nUoq4xLF5 g;<;VyJZ<8AddE%HM$(G>͌ѣH,#faI[Bk9<6_|}$Gۛ%0}f/Jr>.$S_ry݅'j*,3*'2:6d,pUct: OYF2UR骖Lf.W $Y7J#y;$4y ,!BZ2rwc~qz俯9G@V!sDSlQ$&z)XA>ob7Xt'w0RCh x{ч>TytH+0} tQBdT 5(Cc\ӷ(7-]Ȱ$u$n јה{]ͱ #7mZ RZVpHaݨ ]H/ٳelo|~%#iS1($ INZ6o|3i/uT9^r`̉$1DK>97kZ1{'KvzNjO+9.p2Cg-h5 \4?#-f1-geP|D62-묝mހVEiu7^-: }eXsӯݼYz/w\ݏQߟ avĻMCNPR l?:;Sڲy)Y꟰~ze݋dX'Ed>+CnjAg8ie=,su1ΰ>c5 vm]ד\%2YVtGd:_r*hg<[j|;gF 4;}S^XVF?X& [>8h7˝-ՔFБM_ PL[bFc`1*+hm+Y 佘H}=sORb?tm PRz.4v.v I#F\Ĥ K?^pAxC~dh {`J7̵S OCb٫V:'^% KͪYb",~Gԣyt 5s[Ik)%4<7淦W|Wi'TTӹh,ZvV3^M+ʳftsb|,- ūC0@.@LUFL' >M M_^?SRv?| ]t ;PK>S(rXdf&T=dAZ+L'ֽc~2xk#0YI^Ńױ$IpxیYanڵ^aoND+j7`xSMh5aׁ)wr>NUFJS̶.N͊SקK;Z T'e6tF#[N<>Ejn_ 9;M14㙨wjI}G K_Ћ}Jxc_ФM䘓 Z{ZO¤A|eIW $֎Ԋ-ߺ9Du6[$ׇlgb siﻡt?-Z,uayLudgؕG~=-4Q%y&b5{9vC NBVrd 4G'.I3kO\yF4zGv]"ï3Xǟm?6PT5+չ*ɨY 2w,ˊ_Qמb ǢE$ޠQwϫj/0WJSSon9c${^4mTvfvw(pq2D[^\]#)\=+aLWV›69:Fgdji{F .Q6QL"?Jٛ&FoCL5IBr<̪~Ѵ-b/Ĕ/X1b9\˦INN$K6RHڴ S:Cxk(tq 2Ne/nQQw/@0IϚZDfBGBGؤC2ݾsܱ*ן"PQᒂ*Է8ES+!OLG*tKi.mG> X2lEJlzі:4= l(XT U}>Y _j15{Z]鬨Ļy cl8fGg+S޼4_u4Z78$(&^>5Tld'lD95-ID,2dΜ_´^{zMk9],>2Д2J8>3< 5PAv[SY?=67W%ذ@h_uu#Ec~@Q܃r׉@2K렣vς?#+uN{ef0V,UzxWL6Dӈg7g9Ў0y0e#($NKRKU&EWTQnD\Gĕ('D$uw)`aLTE`6J,mHͯؗ`\dߖ[[ *}{¼BDڞjEID:YJ쿝tyKpeD$q'QT"H`~@6tj?eP϶q{VC1P l=4,h򮿩$ ;|?DspjWK7'j#B c5n#`izSAbR{#<v{o9,vH`x7-*7c5װȝGC!=G#GHbi"'Yq:dJ]J%<WIMGХ` TN+5+-|'pjl2ſ9a8w0#;vÚlao\d3)omd}ة6Ɣh;\a^:)6YoM(V8eA#-CЭ|Z1$d)i#t9ui_[OFoRpXL/!fmLV_Po{IhRJQE,xxY4K "#<+{MlɤXIl߂U<0MŔ5t}.{{ _IAN}K{ncV߳{.nJ 4:$;.f}+bI~,Z af0">苊gE!6p 7y`IZ]28|mX~m78j f.jt-SfXeѿT!Lz[is֏fOg|iSoB{!"M8y?5b c=A G7UOEAJYQ=!MYon.CdpJpB1OT*8饕|U1Ȃnxz$^,˩w0=`Q* k)cX2 ݿgF9V w=0bmgM9M)p,ƀVsX𰘦S 9Areiؼybg1M ez. `°GW+R,SS͉i SSMu<_d`aj/xsٗ&JMwRkm7Hul"z}0tb\yNB.vˏ<7QԊgS 9^!-EAܘ%lp`C2.wDވYTh'G#HzOz%%pڱ*{>6:̕<8-/%v-u9좧;w ~#*Oh.}6[c,# O1*)7 XD2sp@QߛyJ-AԕZթ(ӦjJTL^Ы=FE/k4\Q20 hZ33Db7[hdNrqj2F[I1Da)[O9C\u6e%' Jvz {a2\~n$9LJ|a,闝rQFN[; <-Y\ B!I5L$ͯ&,y`g]P%m4.2f-p-ٺsq@#&pSEgw_eUwF&>ըȡ~Б,T$Hmbup-6V"ElWxyȒ%A8d4anݪMFZ;PuNBO9yw_h6&*4, {ˉH :% j].O*83NL2QdͺS΋ƭܔSsBcs9ZjE"12;I4? kOכ/֌DM[.Y*\P,Xvꊴr69ej_?_Zi[&KDҎs0@5v(Uvi7zUm|͖jAEtPaH*S 9WjnjkcK,aoǺLsc_Lkxpg(L99HSxr$R] SR\NXRWFbhPE{O;.vyelxnѷx\:abEGG3 DcG'/yFk̗G@aq,ӧ'@TψWJKpE"{1|,OE湞<̒yrBBC$گЬN$$6kt6[k~g^&Wp<@ {5uHp퐀zÉ<. "t?7] SũG>6[ނ Xc^CnGSy?$l.gm^6Fd:>-y'tJp@HaՀn5%!0ug~uկ=HIskIzd;Ɂ s}1wm.JQuwvY %ZFa˦CdX?=, [( |uYo0:c [@R?Y f}Œ>7`XpdG?oF;2-6Ouo@ DAQ4M{ "b(4>tyZ1b:-R]oVC?E eǚRq,2noH6FCrgsWDzْ?n,qZy }Tu}Ž%!F#g(8b'\v^CE_S/9묝`d3ZFȩBjd{d!˲zU9Rg p1AԍJ5Q7fHuYQ|^ɪwA G<- +v:rݬ_+ُP'AIjUA93x\a'exǤu ԩM!J{|LåOjPs#z&D/],Izc"?60uap5lfSAh唒z6d1q-۳!FdKn JKPpb煰PVek;- {ыj2@ R?ZV5,/J Gn?>EL+=/A]Hn$rO[OQK=hVgqgJTҪ?kA4 G;1p!^i)h&N-^{kKv޺@dytK3ۤϒ|$Q0^[^XM/&lJ͇l`Jǔ)H+>R^^ﴪbMZhOYbuEp f? Ԡ$Z_ۓ4"RF9m_2(VnK9߉K \>i4?g /۠\orO(⚈O%ane+8wB<0n*{Fx1+,X^_s"[;lAmHP!ndA@}é^I^A '1L= OkY< $^'M㍜D?)MSe͈1X5]*𙐩shNerfբs4u JϺ^3`\_ɟ(фDwϚ <rȖBrIdQA hd$bQk[ i^=1_lS%}*^V+0TACH9;S/ܦ[Xn!QHLEw,y\:שrd9fLikch?T<Sup9K:ڽY}~&k&jyhr!s6EI>cb둲'SyL\&%߽ۮُu [QIZ5r"TY 3SŖyRB߈J;|KM \g8 MG"kLC;~~WUu'5h5&ƶш{+6%lJܚ*j:zx}VL0X_5x0OQ*x "Ld%%4vj0ӱzVDyK7$ăh֔=>-¬ϖpNDҭv}j~v.L ݔhοŒx5G0e)u$ \Ƽ܀d ZLcV ݸ,&r%l-:yR/$)ygz''lSbRYiWθ |ۮ_>F)wʾx1\*-0&TMVt~`D|gh="h<_і)=@5sgbK-`s5xn=Bx;my.ql%Z8[rRNF br@&LtNu M1n,,5",%*X&/vX>X_AI0/釾U;n4vm0b͉ : G|" 4xWy'PfWl^(JĆ}m>TO[UWx1tIgdR}CZ[0ȷ7tPOɿD޲,XI;;DSҥuDDw\+D- G&T۞Yj#DyX쬈 \bVVc# PAˑU^0Mb͘L;*9SØ|ľ=XuY }6Ic+Ja;uQx<.t+EgtY+3甔u#9,t-ȅ[[ǐoX>0u}7*QGIb(:;D4HHi}RRj DZd hVJ Inw"c!+mcW-ޢ23F2wm[UsZ]hόyWd7}Z0{X@T\h߮'GfVc=אb 3 pL( bG+rxA&TH0F}tRhwxGFY5a& ิVg"jP9%சjZj`ן[Hf܉OU˯̈c:FyF2Pؔ#xQ!4m,{φ~{uS*OC-y=GT1I+|~.NtK#6c4d/_1󌄸y0@{RPѷђ2t3|q@$"Ӛ? bNg=EVbvⒹb8ʵ;zl \o9@ jyȻtB#fGˡFq9ْcRfK7T0I!xQJH jz_=3e¤>Iw$R%@2Uws U47uQFKFI(bS=\AB>[`rٹ1`KՒpv]Ǝ'oIZhA?Sa"Yڄ -ơq\kI4[YPb)xz@=Osv,S3œ#ҤjI$p=RgqLFKJRr25Vk[uI!ānoY@QH1.(n#SW]b!4;L1ˬn)XQ(J!Cb9z0]t_7~ V@/ f+lc#f=(br/ 3E΀?2kVv6Z> 2qK=* "1?.#}T r^:ڟD2֮FUBɹd6h\DJZI0vp% A\TiNʯKWo hv폝,r6L\/ћ~>`[$:07Rht iB [IوHEi3γo'\lRD{ p.}2lC ٦>x,b$qÞu;C|["+&8b+{3E S9pީX:A)tsKPn`tx.EগP,)3BXpo9< ZK"$WFay͂@e6x7 k]UĆBU*eVn< u#jONRh$PTuuGC\L>5> )AF qߓ.$wtd_vg"vHjA&a `nMr5}P5R)~;D!ț\ =RZ.æ-[mo$;G&:Aۂh}&khm*;S/W .H]]VY:KԌПȨ鈄xSLKTf9m62tĪyvP.꥝=-.B<$CKR*p>#Uc*$~ϾX}%R6/+񻰢̖6ljX̒)؄sixUc 7/K?rI_>#(W6\>5`XͱN)!rfH"Dˎ%Z1 :R@ȇ X]a ikc ^#Yh{&n:`|KVq,4Jk.:w/d0܅bs> |i+53ԭLTUN8#f%VD44WjTb#UDtG2HwA;@h 'S &FQ(ފ!4s7jD~?a;fM409+KkzVF71" <$ebWud"횸y<cwCTI`C]Lḥk0bҤOЏ 07C٫QSuh# if|lL~姸-%'ujOI4"u `8,ލJI!.0 oVNO Qlds%bO2֯CSn7!-E`s1 lg'BM3cVj$@nG})IW1>BjЬ@~}TaZ=9Tr, a.Y+U`t5ƤB˕-t5VE9!/81Guֻ0w\_ѱJݓ$}÷N3݈?{)4%YAy9.:17\Y9_;s;f4+94Rꉋ$zN^'nF,(5 1"Vxu$:?>o'U,PdOlv}Fcyt%Į85R ح?zCˡv<܍2[,A%F> :hyǎ`53i2\0p~Lpt/-ix@$+{P L G^ hZЦ4,*Ԍy=vକ/t쩁 =)ɬ0 `ے?N8Tѻȋ ~(ޏA$0Ȟ0b@ukݝeip1ig`99|٥s)2톊@MjJg%õQ0@NGAΓ* nHV_qXAVh/;i~_93![ME җ;0Tu֙UE$%4$ޢװߒva+#/{pF'_\L21#ܛE>dr i+qt*lo|j7x_00uUXS}V@?&Sb=\,p=hT^vaؔI4]B j`W pd{@E>]Q3@!͘~%S{ D?6OQ䰐2{[[fobZ^mY|jG&NR$$|e7꽕X_ VhHKRZ'm@0 q6ţ6zՊLD*7>!Y+zSPdԁjH: K(Eyc}daKߌ/|T+ݸZsNPzdĆVz:2Ɠ:})"I3j1NGv˾;ޚ#8`\7gr$lN?H84 UZ}=~Ilۮڏc\9I9S* z#|=A͑zׅ(#q A3P4}D7kA+U6a\ H#`m?.Zrj)RHqu㫉u J#kaPfw@ftIAHyτkV| +vydX&l֌H)m7 Ǽ[^&_Z>8 R6reAwurj2 f+Kh5jcvSA> 9L(RO~Q3Qe,ՕZsS|("U\'}Wښ"K#W3ڸP#8$vx A ZH+q]̱.T:]JK<4BH0uX}zo*M/;!d P)Po:% L;?':$J4 yl ˹E.sRU*疲F 4DE44ựCO}Ⱦbh,V0o<=:,Ok?6C68ͭ28~\ҪɲHxo@꥕9X#D"Y_R>&ugcxe}\V:=E؂ sp a0'(m 5gl1eKYU>TFk=1G8=|U XU&fUwWpnXH RfP/{@( s]c9(k(łېb1^ęM\y K接SиV8-@wZ('KY㓕f-c: YW*&xQׄ6( ^tü ?}\maoJ6#`"Fu䅧J.mx%C#45[(q4D 4_Za | xzV|?6+#4+UΫu=TjawL׿T6;ٷ P^:i'n硗sS?my~\[WrnO I@uSWa]vdwM؝+ ~.73-[KEOnM.ͶiSZǎacN Dd?(ҿ0i *B_K"S;ۃW0NmPNV3!1!-5)t~X.g%,Ͳe =NӻU6ܩʁ᧾|H%!|M>?j:K7K\dajԗbL` ;_fT;U*{$QMJߑ?/ǚcz̳Z= (QsFPquD.3 *f*VW>覬d5atwUgXN}^jƣL)IIXù_C ln%^XPGx7d\t/1q ~8 2F-7Az-B m%4ނI/ہbxΏd%>xb6§lV_UJ-kQ,!0`OP;;dE;˲3_{f ;g`ŷPY1}QP*KZ1]I=fu ;N7Wr[h?́\e@dQJ^ iqWHR~'a.fa ZdNO |4H*7@ϝݒ Z=A}tx0a3"~'6*2`LaMU-5aRZG*T~nߨJPoF "E&u}yl8(|FqD? hn2,Fi4\$ a; }nѪT9-5GN=͝ uje|…2ncE=fD!C - f||4br "µO7 7T'alaQkH"Hx)MÓDIŘ WGżgA~7ĺ u?FvaWvZy!l%P;>DSq-U#lӠ7wMj֭-H&= p-0,fQmp)80h20Ikz Dba2DPjmL/K^ZV%̾͢CA(dvSYFb@8'yEy*Ɵرd}hr-oLjW@7^/A*QM&n_`b;@V6+rLVa/b4X529`)khA6k8 0{^2P@pm6N2ut4SpNSnjB@ -B7;nS4 cBd9P(YtO3ǡ@5Ҳ-ߠQq1 QΈ6B8tȥ6|F7>>̋ὂ)it5)vz?rp)K̭I茲,^|ȝ^]tai6:E^^ *|RB#:VPRh ?Ԕwe(5wK sKO'AgB45vdudPJTOҎgF,48Nr읋-f|qh龍x~c#q0Nd3W\>+рj9jmTOc_ZNq{jac_DZ,]2j: OڒgriPb}1N^ U钧*}'WZ1##_߼.Tm}P ׈XBOۂ?n"d4c'勵M(-ۼث֐pr澌c6_@eALCe|*oHohyыxQQM^H +X`RSIW3c JW(i"iJa_ Ma VN9wUGlَ<0P7jBȌ4lQ<g<P/s(5F%`v6 >3N&(8G征yeDC*>X4@K3TDsJ̑4~1 < w [$=ReR6|u~*I ?P"5 [0 7ia] ˕936~'*GTb,טGѢ6R#{ BW/sϴaxM%q}V>q! -d"d>e$jtCU#S 7Õi۰`|\b}jg? (7\̢ugӛDKD0o{FVs-HH+b1,2xG$ Qoٚkn,Ft q EԦΰcʦI dv%?)'WXY0f}pZힹ(]??K%l:_9W3!B8ҧ*?Wa<~0=Y0L14d9ugeOI7Q ҵ ž@Y՚Jdy5|q;ywLٙp_Dn|!R+.vH+wW݃HOf5LV;qu?) nH<)ձN^-=w~L'bTieJDL,FkwM;QJ,ky"mDu`OeQW'ܹ˚'5|41M>bP,qC{0QҠ<t \\y [4W`c}u1]"ufjJ-).!`m~Oڶ6zc3Cr˧+-Z}j~T zj^wgw['hrgHRkMvNû_1"e>gDU19Uy.Rq rfܬ0L$b`>Kh^IE& =~mvVߧ$9/\8ݑbZ=3Ɲx YD̻ͿXy>gg{+^fk7Hi v(|[mWS2^oFWu[G0m_4rM*iM_aEnT 4јG[Pn_`B6- MϤQn~m,|Q~qz|3myPbp&&ȅI2n;0^RO+.Bkqewn+H]ZֶimE"E~BjUGu7)a+ģF46` ˜tt'ZcA>#/D5=35if$\΄Q͵`s$}Ylʧ>!6*]y#d,%SPQSuMqy&pqIEXc㏝%׎fG>9mn6'.nXe[5_~:G8CPP][LJx#@Z5>ȩT#}՝ӕDC*Q@lEa3V HPYcYv+{1BFun{trB'Rţ= 'R-t{Y2n9{Իn*6xHcݱ<h"U9lJ yϬCڪɻX4ٌ1X--p4 ƏTG).9=JIM@/|Ջ!JL_X3?ҸeңkSٙ垑Wb!jwT:)@-2y4lő8Ym$zz7OB2lz y^Q¼ʸw!d+-iaܱp"$p+_[*0껛I{A*bl䗀p|?1 )1ӿgxx<_S: APACOV^VSWE&k-Xe 6im2g3 41z8|I|$OjZ*k#b9KŎa}`ua+\i3*sv}(hG+yb*)E DO,- "g*t4(R{⸥hӲ~1k/E(HK QTYK5 7`@;+ܲg[pZ^}-THm%`Z^PmLjuj;tkl',2\;s\\Q?׼y"4}Sb̀1u!&JTo 2)KhZחRR(jpҧa_'sBb {רj63G Tr-h{+‘DnP=|é;BUx/ϒ6$i\.^0Eزl%:~LwO_n*Df[C#ȕPC0_DYKRi~`:kn=xD4; ,g|?jm,RœAfO\R{Z1Ա$Ʃ뻅y, 8\nƦ㊼=jx Y''Vf>jg Hu9MPuzMGlrNkߩ-.c <6@Բ~t(9Fe e[ljcJ³,zm!Б6|R;(,\b?<]CyqZ</nrV J"h_ w*r5EqLOUQ'  lvmgҤ!>zB4xֶ랉Gܒ. ,ǪTpۙ]A,Na.@bw*?7hu@fP ^rX ag1Pw6(-]64WFE@j[`oȇp}lz ƬUǁ]3Um6L0g[حH\ cbi?OUv\ K+\fazǚ^'O\vS䎊00 mhOaGo?@ `>J|*phgUqAgw/cKZSEI,8PH4/1ʣ0 ,b{"wYp&k0y!X VE]`yeȇWl #Rً_apuiOHR3 D W0]Q``YDM]Sg|F,Eh1Ko䭬aO~ ])2lT a LJgt F]``#YXp!G}qAڊ2ԓ M1$j^v> qy K,Z0mRP#Fgfbj3zqu$F}6_eIu>cqn Ql?Tz\^]۞z#}$(t.' H|'*PW@JA'5 5'ʠpoA\BaH捳%Nf` K ٥V(4vWWEba5Hc V<PR|pn0B%M *'oSVofK& f@E0K9Uw;g'6x0}%Fp7f$z0*P ~'el(OD#g G $7ԧa]CciAOn"W8+cM%j;)5\\c%NY3 [Rk7j! g]vN)?((J_ȿQ.91hw*wIw!e[!1+*cY^ RwdsKq1^?v㸫PߡE^&:I݂s}CA&sᨍ_'i= U@eeMwu];#McaS?əZyLڙUFE!X$ʦh-bojXlcF0jʃ{k=R/(1 Gd橡UgM?~_޽46ׄ J~u@5yS ?Wݫ˙kk>~ ō=+Fscj҂J9AJӑ` f_ҫ۔vGB NjAم&WZ _B+Ҳ/z&еc`'VVDBv2i]iP޿ @.ནaӆE{rfޙ XV^U!J I}"ӈnkm )4AUL7c<[)ԝMtyPO/FM~FzO9Ö ]>: +s+9C4~^O 3N(tdXҺ/{Ⱥ}\9Rj!LOf;q0x˸/u<տ`[|Jk=LXl2`VEpzHa0W꼍Iuev:7ڸ`MpHK%:ēa6 rEK]M29wl,߹NIǦՃOڎḭAX q׬27k"4Bm,7Ұ7dzvJO=fПx s=N!MQ|-zGu;.:SV:nDwd.'gߚ|SM'`,}cOz4q?9+E*]aҡ5KE'r+tVBxJ,nFuGq$6%1ޤZR\8P熩Th}බ3cRD] 9VIzUa M"Tڥx͘rd|o>V\j6ne%L^bBD|SjJԍr|6Ԯ ܰy ލFi o@eD_ W_*D|ulk8G4 ~ 1ضUI3zTî1&'JD ڎ汌*ZeEɊ -W4I^À́Bն/\[욀=FUq"}ST8Ͷ%ٲmGZ5o]cR²Si2Vb/yu Vd>m它̊'ME< ŧ v&9Z"dR&{OoEyt(&a%L);ccni5~ @'* Syo\ft iR~;a=?W)8"@Wc3S.'ɪ/zCGY0T싻cwp"v%'xԻ0S u<' *&/f$+Lw(Nŗy7%-w:gi?n^ܿ͒fsJGoUu[>5f X~L%T 5cXWS6btKԣf| :Dʮ 0J)lȟ3ŴvkR j\|2YE\c@dD\!1bsaՇԩ3Pѝx˖ bX]& oޙV /wx @"GK( UҬ;JfJ?J&Z@b ݓH꩖Zp8e 7yi!0:!Ӧ~eDقW{pN'.cT֘J$su !|fo():hmrIMWG &7}_R '®ဋ3ѴS+働2},)}0zġEUQ #.+K[J9$j crԯ`pA-Óp[Wa7ʖ~͛ g[ڜY[V|g"8; :?C&^ L T8Za,kAφ [)P6 HblYUX)'jq.j$A&v@$P(e U ]G3%9t %\߉TZ869?sw?C p(Hq!=L,y[p VdzRz,0eA2b{BҨI7\wEbXDFza>mӖyomԁby(炪ulϩQ<>- %y!Hd&ʔ׆^&NO`\ 3TsnK87=큌E  ]T^Ú/nw!lXl M%85)xv(&kqnݵLI-28ί4^q&#X;S3`nUBh}&lqn `3)#0B{T[+Duob:bY.GwFVt\W-z@XIĉ^[4g`k_P|e̛Ӱ'Pۉx3&MOJSưQXeLG7sJ僀Cûf+v(Z7ڍ pEG:6}{קּgb<jaJ(e@r H+uncIE9#u6{# 43fSr `|"Fptz2ۃF M\.**G~l[IC0'3c}l Y &(m7%dBr4J(Z3l!6K T4K W #2U!Vپz 1~W>Q}z }+I-ۤyOsrZuY릇ig4*YUw*n5fr~SR•AFm}LAM3g6\z>$5oLVZ iН}bA.6|Yb}|%%;_3aYk@J5p%vgeBԒ/ֻx(+@ }ۇ<ުB_Y{^Qb*$Y? Ic<.(J A^yY@aO\\}B0mB:֗ Qb̋>=?`fnD!_H;B>-Ծk@ʟ9hٮ"1yp- SLRAcDٍh 5RA!Qvoj\䲊/hN'>:Kyɾxȴ :\ވ,.n~gnՌE-rBI0̀YKhPn[ep?] .0r,ǃct!!\'Y&HoCN1ЮK^7iEd(N4h3=Έjj1sIZ&.{;mf(ل 팴7ar`ܗ;Eg~s1Ҍɤ09 Aޘ Z)>''zX /w~9551=rݖF[Կ/H!f8$$LVHr]#H*Y=IBBIӪ5Zq.a<#-r^g&P';,1gjXgFO%f*^LOmZ9bS3Ҡo?%16O?jZۮHXh„+f;N&L=ɖV+ x U#tIjp~X;Um\PO%wO-2}85jc=ڇ@J5D:vyuww˗!eaJ>d dHH WD403dsDV6;duVpr7lޚBv\L{fߔDgX9{ c%~ꥀ%h}Ͷ @ RƮ N4!YFX Eg>-W \t;1ɰsV $QܮlDQ ACJd*cU7$ǙeL]4J{G9%j#~DzuvA6f?͡زD&u@S>W( wDmDWNP~i)_Wy'5!鉧x_j 8HJ(HTk1$Aݜ+qߌ3=x@f16(piM BT}MqT<쨲\NZ@o#ﺊ9΋2&w)VcU9NO~80"su@qDj ;hoApաԷlY_pTmBsѡA[^¡fZ~3ڱ[HJ&5A [NP^qfs¡lC`1zQo;Y2pmБC r*M5BQte\̀]#@= ͝sgI}k_֫=vÎuIG͹M7 Ya\ ːoyZ!}k<2eumGΡ3:] b. n7*$neiEOnP^KcmR4Nv1\Ԙ%4炃) )'݉YI?+eH>̆4#4W7`#-=ruBHV~A@RYKVZJf_09u$?D-Os/Eب9$IS`8/b, q0 J*1Sr5.ܪAe=tCc5;d3X je| "zNnV)ބ=XK*TP 3?pY`/ڙOp=\JJQL|+T5p=#B4)S a&t'-iAy/#l~6sK"h#"`F`%;;|B8Xl1dv k"~{RبDt1W" >K MHތx%8bSaNJj-rLA}̽12~]E !~h8LKPdNه@I%/rYjma@Fh]:>WS0ݮa?bQQ.l &8^$ay~c(i~c6 \<6IS0{ߞd (BGzmB@z+Tbu5$,aZEy!oKdFQ}~V)4>\;l4 {KاJפTgr\gptc4Y耝8nuqCE^ŲFU'\9gWSyWבt!/"0(739 l*n/b =j56_ ՇCwstMڻT;ODN\;clqwC/,z pڂFO7I\2ˁWw~-i,̤߂-DFZL1ԩzB8qI汓+c|Q<īc/Yw.r8xoo/ylӕB,QWriVOҟJetڋP22z[2Ytn%[XkSԷh[ݺe7y%U-VB0P\HrUiG&2-?㊘g 8Dѵn`` KCx8Iב$MSҿt:9 oޯTR*+Ib'Q(z詫$g}HdCX;#wMraɊ͑>2} {sq/ߕ~c=1n'nM6Zv#"&ܫWRl⤶_6T2H Ā8$b!UKX =+DmHJ챚(wQZ~:&`B泧7jZ#(Um9`f%ʯP&Ppidzx!sV7bѰOEf(^<= X@?bKY^T^'i`{: 0N{) \U g coR1z ,htLV/5jҪ+%GZ4E+U$B-&u`BFvmg ɐ6t\9 Ql]uFחxe ߃\~&!1HaYGl: ({LuR%Xڃ؏!rV]ӑ>dWuIpʫnDƲyKgdm0&x;Jy{n (ܩ:;K:"4IB+SJ񖯔71KK&ĭ 2p6Ҩh"+3Bp :OM^[K0ɳvwMJH "Eq݇Z8m۸Nd騝 yaE񏚾v JMsj"&/0ka#JTt<ϗTl}1WrQ~$|I@drD >@CM5arZ6RQpYXebqJ۴bФ˲'PYOxtxTS|d@ya ;أ~Zrjh;TJO}5Դ꬐L6#o'n!9!iWh$~s-E _s?6KB^jM ;BaFPPF?Rm?5ͭ&)ߙO,o-IܷϐK#}g\wM!mfOG[=|YYMAX⮆\%tGj:s`<*K^(%,maPf_>@/U :5. CF˟5U)KPQ/dxsC7"M| aS 5>bʧd柊ȑ hr1_g;@] Wu]|jaB5590iO6|;L1}03k'["[pɅpE\AM ajN3!7|YijJYw/=M`taWV"bbϺXҁD! RbzцO$Bg .X@ݨjlCYA)q=8NaiK&ҔW("kAquќc  ȩeKnTDt9iqo Ķ8h4]I]W/T?WGu@ퟹ\\fUyVrmnS7=uE\`}`>~&g`Uಾ ﯼ~RP#)+ O.% ,&sX5:8&?>[.*0{{ذJhz `jޙ6ݎ +^IRD|'ӭIkS3vx5k '{:rsHѓ7[칯x@_:#` fuuf5Hwgؗd m F֝G;iqj)9SsGp"}|7RDcvwZS `gTEN_>bu=FfcHmU=ߖєH9nOQԮ#_Ac13:TocZ < [׷şg]dmhyI)/A  gA&AQ'.25EU[K?0{GDĴaKxVg";eչ[;cLGNsS "AՆ/Mh eTcCwEay: {E\suJC/te?e׋SW-`:#nR:S/juO[hRbklC`<2Ej3a +H˩SE5;\Uu5/fU#-1RtX~g{QzE*mKb^LK WY4z@6%Dq0 >յ5'Bo Q-*y%h apښYAߓثG\ʴdn42ݿgq$ڔUDSK}8,WA;XNXBNF@w}/guGyPP ]M0ߴI#Dn%|u)KM yJ5V̑{kpO }~cg d)x/' .Bu٥^n;_/z , 8EIKyf5p ]?$"~d^Ćйa~adp&;̍Q|tD;Ij)4x}CI1DFw4kRzMIrhiQ|U1zqܖ!I7sƹ: ;>ͤHqf#&# nn]3xܣGgnq]cңW5=D:j6@վOq!ѯ })ßfF,;UQRakn*zj0}sW'"#Ljg$Гi;dev۹US#BraTUTehQ@a3UB{#| jgҊ̮=53J.UV`W3T` weRU3['_AjGv2orヹe=+ umU׉-}ɔӃEMa?Hά ݁&C PE1CG_Bb$ɦ7MPvÒldqKC ҽnɺo҈Nh>*EqSYFi=Aܣd t"VGNh Zhe2K\C|^oT]a-04(7y!y_KU5}No@vE٫)7?Kq'֭{L'I1J =4GB)ZxzՓo̓c^m\.Y4k%%^Q K2$/w.Tvǫ1V 0_)mxm'2{5SVZ@Fv |wPqT>'gi7M*j4Sj-t\J$+T"25BfQSQU G6ww0^Fa ˧]{u<jY.Q?TԯP"|,+u_p s+,TYpyJO;؃9& oAO5RסPKۃĀɆWJlƪ-G3hI2š4ʃ#S `!g\S&v6.f @w,nET4̵$+ޱ|lLvfJ&Uʱn%䰏ZdQ TacfNjԶo"j́/aÀ9uM_wNCGt$=_VjM,qE@!1ǑQAy~7jN戌Lfo}e;`]M ВkOI jEb}#ֳs+h4iyw<$.E`%kHi,w:sh>~BhcCm6sjQt!3 ?F*ֆMzOQrXV~l'n#c"vF3%=cQ\/7n\%{ fK1WҵH[E-FuM'7u@D; S6uh7_X+)*Ol)Ρit2Uhٶ})ՠձWr9 ©H/='fU:|^ hO4Q/39|b ,Ň! ocrcK2GT, N) mGD?c p+o+]p&; C5- P}{S !E-]Y(P~Xc1g7*}}nLh^iv=9Q`4(&͇ղwqδ5a-9wt\ՌsoY"O5~~g:(ī%kY`i2$'sSxh4̘OG_A}n S ֌nny"C-no^$Pya/)*_D/Ν:*.G[m|3g=|׹ޏbI<)bn&SAE:2\ oChMR O\Dc'u0 !c uXiR(>!VK6?4-^fb}9gp<3ۡ m}g2v*-ņ,rNsWP.a䴾PFzThH6n ͇ <)9 s+'4HB&c(>tg#3вyj{E /WZk #uU6ᗻoDVeI^+DvN@MPI{B,a ٰ'щ:(FQq<7:CDs#Oyj30'n2WJƥYxޜhwkb`߄ vDX˨",v Ǜ︌x%w"AFa"&BlhFrg7K֚EQ\ wUA2,[[M˸9IPcEX =~Ֆ9\ʑ,ڹnHUM3* Aũ,R~GȾ< Gb#4-jfsI&3PT'߆N>~=Ug҅+kzgG"\=9A!2Vj{9J?G 6g,d%c-Kq]K^^T">0qEHx ͰUJ>),_~eYM1mc!ۤoYοC9`!dUV$kZ%M4AUD:~@E5 p=gS W+cjG:2-jbRH:.ϠI^Ⱦ Z {ؠkx>kQ(V Ұ/tSY4ɮ3x7_^{F**!ύWCdimk5W ĵN! 2ҍ |Y8᤿ @lT\4̽Ô~,8]3 7ibN3L F5vWdo{]Qi8@ ޕ3D`~y504hr-fgiJIz! bcN7V%ҽ ҁX et7rzbqgze7[{ =~r8BmнwTq=;/n&ҳ@TK3Z=\<]jL O.:pH$v)_fw?5oC}yH=\yׯ "#?b6Q\z[ ~X9Jűemq ST7RDIesH{8sJǮ շP#g| EP:K4p;p#f;7tO(禭L'G܀7ʞ|{7 pጝMS[~D;eaGg0RٞZ9'Emz f؛p9;V$Zz0Cz [Fr$+yNE`Xyj-/mO^^]dy;%٨}jctf_E.msoWR.0oICkz@<c@|m/ z [ٔSU$2 66ՋQempS+t LєXS\K%ߥJ3] 0@WG=_Am+, B]Ү˝Y$v?sSX\JȲ:SF{,!*$1ha=XdqPuItteў^C)b2ҐS\mVYo)E#6Kڇ (W|=^* Ћl[t*\Q&OU)يTDƪ9]32Aȼ5"2|=Es1u%/QA3fvr9fvÂyS5M} mR[g4 ƐFs#@g*eH[>Y4`Ch !o]3riR,f:JULms=0%֖,NH(|8~u˪%Mx+ENUk+@te b3 s.NmِHk-˫G1b#/ƂRbB0Y1I^&JU5yī 4D7fi[W_~b CЉ2&b%%G2aWI9jy*h+{ft]a)YZIމj\3ޠ}TȂd]!݅Qe6hďԹS󢍞QkdiZea*uRLRlg\ҤFɭ:uzN\bU.0 &2lķ؇ͽ8EJYAxHFqEh#~._SMҷ P&i͟Riwʁr@ Xݠ#;J˥4J-`ʔm^'B;{R .WTKz}xҦNOcl4cc U k/xFPgzy?ϗa=6bo|)>a"e7r#Q%aV$F8x_KJ>p߼{WNcǀ:3كr n!$X/1nMyq=nmK* pGDHf"Qz:?nfO#%`d5Ai+^cocߚԹ`r 1n ]B-U\o1>z,T^̬o(O=;+if*[o4*x浗XaU}'oHå 5:EpwW ϶}5t7Ó;(P,X:+|RjN|#3nR7P9P5k(+Eh_\* T\68Ma|$'W$a`8+\3bc* tK#}IjbaYi̪TȋmuqL;]᫏ bƨ7Ԍ2Dr]lzzrEDD^y'.W/W,DFS CM=?ӎF75a zmq2-$Xz ]JԮ2*\S{Hn-ĊN/p9^2Wgr&g^?|*g]K{Y>AZ;]glf5Zz,å5tBu[wX-ЪaHmt" 7-AI> '59r;ߔW!EUat)߹+>unknu yі5ܵ2a B\↪#ǹH|EKӍcRd -Ln9Mg|JoAfce4;7 {U-Mh3aүjЧ9΢GK|N)J{*Or ONi vG\ 4$276dΉOY)m1VUϯ 'Cp]xy+.-WvKzJpn~tnD\mEx([K0S݉EoI c, K<"* #&*Ō vj qta@ Ojoh ˙<*3ܛ$kTa9vZU D܎Q X#<-🹂J BNAhԏ*-K1i!7jqMy_9/jlaٗi"TKGԐ8.bNŗ=jhನdxG}}=}Oej?p 017l4 b,l^yp#ugAE7ߞvjXqzoCIh3xm^.5Ryd+ĹC-ItFUl6,K8γjR.::äObE@D\bz|\/-/#1ޅN!K91_[6'?q@O~4\?#!=Y@f4%Gcowz{ؑ -xTE|(Y`fY1͂8 ^X]~GK@dyg$>AcQ3H~Zh,A|_7 d6, Fct(jU3ms}=/Hi'(Bkuj؃ ]>ZѯB*R}1F`G>i9jf B kCͬq 5ר*Vw7P _?2"MpjLJwU;.3;F$| V j!\+(`4 $'ZapeϿj 9`ƳU6 86 "8Zv4~wYDkpuNi(ċEvJPEac(S!؊>; ]k`@O-/`5Ϸ"ρb={?{ xbLDݒ=> qS*_,j{]b]otҐ;-ZRñYnW?FBr*D6a"A3U0yk Zķ[ѯ gG+/+RxqD`hxڄB]V@_#U4 {dt-.('r{99^ {·"f-F8T,-ː7[f $v>y~N4'Wu8Oު5yB]{%@,m-{Df8܇ SNRXmbkˁȓB1\Ir<`=yCQBzc2ꜻCթX'ˆ&iF ~b+`Љ0O..qZ/^a 1,F1#  BEK6=RP0fk0Am- aT58z [bx`˚ 1Qo-l^!rf׻$!~o 2[;IUņ*`%%=c=TD\w7YcjόZxO@uXMA~]M2DZzt)λ#'Лm^L򎆐ӹ~dnŰG}2z6/{ 4DCjqg*Bo\Ԋ'W;r]؟j9ѱ()e Rz ߀f/ p6*i'mtD$ %4ڟ+ ѝA6QCQ/d V4&Ofy:?w㾞_^EЄf0uP4;0u&D,2qy$- {7|oq(5޴P$t7i:@T?#\Q6Ώ BkP>o$qS޹ HZ1έ]8:y^YѐG^%K H1骨"K 0# >Jm5ۙA% M.N+pnB>v,`YڿC?&ϊh VuZJM%0wt ގ'x.tO yɿH~s0Yag0`׋;P*UŽY-֠ZGƌ4o)dnEo_Fr3$뙧Z*-=r7b4T@9BVxAu#g'< ajV6u"!6u ngMoo燉ܻI- BwlqzsCv;@$4.5':Rm8b>$狼`>i^恙&ku9gx@k{ݵN'D&4xv ep`K *O8-4-E7Y4d[%IhXμ=6fuCCn>_ֹ ij 6 y5 b^Dx8.-Az0H_U2u|w1_MwAa)TxΌv%toeC Tfә#n1~(gƌq{WbA؛ꖙL8P5vsML]WC빈 `:Kl1et@N΄]kZ37k3| ?tf}FkoX.<$Ɇ!syާ 2tڰB/ K>q&u*#=IEЮHɝOl,TVB51@@00؊E87^eS(ĉ iPpEAn ,4bp 4F A7">0S夎R}qXaɃw{Kw))Kxlkc>써}Ad9@gΓGtA[i-vi%&QRǕj{Fc sْ /H=QWNwUid#Io|څ-X٫.ڹ/m#Nọj $7Oorobhk9rfjLcޢ;ΚXX~Zʭ2¨) *#^ KjQZ04Q$ /$~I&.yE`j0)>ZFs; k*-9i1E[C8)}z>KLӦGn|jARjkЌ.{ EvѺ:*a \a=>teOh)&:5}/ϐᓆ-tpl._KٚY`^R7msRfʅ'(!k|"aCEqѐ } \>?WӡKO, (j]b+; jȱb7a1]:pЕ}nvWI8] Nz^8$ey8ވ!غT:z-냰dxȥ"ںURGu-}7TþJ|K]'`׿d2(GMʇ z[O2C XYƕ"2*_{M5ɰE9MSkmx~K\(yRXsP\c8mwbwct(C#-i :=pZN{!E+KA7g:Yh* 23Le"xT׊ 8D1'8bkMsHrˬ\NwzZjmdAnMIL{!g{+(q9\q[XjXTAsBlz^4K't X:]_ REinCg#0E"ME1vti1Iӽb|Cel0#g5e{\W1 /ߢ=p *B9TkhnC[ud9CD[G.qKvuBvҞ7ex?~LϋC{67lLs#paY;keʮ1|'9sүOX1V`+z,bXN55tY'k"%CﱒTr ׄrR>SǷ8qcT("M86}FD+lT$,fǀuڴz:#&6s]ҷ?@˖VE&KQ'*ؔl\Z)`ʈݏE_܆pםK*h0]sSdQMێ=o։[*<4JNJ"I5 Qm {wm,NAZJQAń랤)~ۺe܄+x)0. s5 kρ`rko.T 噭Ѡe)/*vp&!$ze1#Ly8lfdq!coVH7pukG ۴`0QLY >y*ߕ| } ݹ+ov@yM WgHNn):O>x8ZW$''I:ʩ8z4N <խ#N1bZnو61C͟gg v䧾9iakWDPt\_w\4'n8,^Jv9bG^δhSЀ%\^sȫ%5k|e'SƗZ}@;w fyHB#b sWM ՖNK7^/wFkii+O:R*V|b"؀Z}S[-0= E2gjRJu|X[.<0}Rl;_} @}t$(3>XcK>U%|fC0 qճK>=OL^#cɦ16%&Dv1S~QNTjN7W[Xo1QÅ,Zn!AzR]rWq^א$܇Va0̕CL2ZJAo ZAɴ~]/Z4f58 RX<^`a5NLc5g `Q[ \?Fdl{pS%2h>c,U '#/'8Oιx,bs{2Ynpzx<72ӈHP?>9Vj v;͍ pa݁+2.݂C# LgqS5ElMak{"LjZ즢ޣARO(=~nݽOK(MI,Lը ÕzY*̼Dsڄ{_ $G k:l]>ثfٚy25me9.X'u"1"{*=}#5eFx "-Z2 w1 6 8ƾQj3u%jR>__9k'p_5CAY^:Oe#U4pq"uݡ.8~Cwe)ZzIbv+j9>kQ{]_>8RpJ%<12SI ]-y<ޙytFΖءzR)SpN)EO뽤x/Ӷ%ɘ>˘J7qḀmIMC̈"t ?5|^kG`T}~`Gb%Sg6 'Ù M } !(YaɎUNZ7mUKu0lFU& ni#9O02g'>gR*:7*>J۵2fvg_N#F'$tf#2feVZXn:C:1-ajbġF>ǖv~+}g=0K{  6 ߊuf7iNǸ+tـ-I}< LZMh+-*_Ⱥma@~kPVÓA"#-W'? 98m.9VoSi-VֆM!y4V'7 pT42YzAUsZƚY ە8פnMr-z7+J;Dk^|fgLOA.HjsM0nT m~@'dǑǬjЉP0jI.T2C;Ad;Xn[m:"#UdK MώV R58i`,ELL}'ÂK1"(V-Vў!t'c6L<[DshDU {/mOGj[)/6c0>.$k륃7K6^6ƸJq_ ê9yU7Ue#Ar_L2 L"lKa3ؖU]avi?>sm y#r\2a>dp']ún3y:d ` &Q3*(,dKϑŃC ު1yWR5Nn,t|s)=a~Tu(d|Q1ىa81+NLlH!QoNj&"bt+Ȅޚ-+v&8 /L>mtQcrl"+upLFo=M%Yw஭Q5>נw's{ rj'Z w ^TqR;}H׊bj,6KMjU%a KF2"ӏĥZok\dNkP/?d]G{ ,j &,oR5R?o`S$Q,xUZwȆrj~zӕ*L]k0A+_ D |h I\s)Q8$`ϣC5LS|2tTE(30Yі]ï3G@-(PN9C]㶈sýe7ݾ BfJ B0ĐmQiWf-nT- T  yYڠ&gMN\)] n4yht/D79ݜA B#MJjpol[:ܩ ȒJt|E=7'LiAn!< ˚??"ƢyBLUڽbte._7MڬfR=7Y;9idA<~}\,7?]+c|.k"ho LH8xFBJ qg;Ua{{{DR#1'4x/is׵ :"c$ro-Oꬨ)]}Bs\4Fk7BMC.8m&9&gpJ[rOJe@|n;*nĩ2 *;6λ~f aW/"t8x j&uSWc-![- >pϨI o6Z`3sG0$9^V&Rh<&L5H"7b^',Дi 2 2% W'Gggn} JġBP$^!1ܨL "= j BzP ׳h&f۫=D&Jǧ4l.3<Q?T~%$Ũ)MD}B0ˮU3sp嫍GY]ZPuض3*U쇁+?&@+TN?lK{, zvmiO VpWᙐU1HL9EJ2cS18-ƎDeQ~~]ԔIL s~TeX Njhwl}ꅥ}vab?lBWB1litsXu%\"e8gc:KCg[ І1b3Xj&Dzǡb@U} =yD- !2ܴW~b#QAs d 8Z- xE4yoyj_2FnClN!Y~:0Q̭U3C)r>T*PhPq&{fVjϱrޒLْfB.jQyӳ8~}Vڬxq@<$1iBm?VO B2Y{NEMݶoFF!hZ0;ژ$X^=FPZXe!IiC Ǣja#X1ìvZU\#/K&V[7\ <9/;kѐ}gNPU}2}e0j2/D]RC:"udJp"‚,V  ]f@%(\WEM+Ю'WT]wyUiY VPc0KyK=` #(j"z,SMP7'BOQ<mUEŁv7C)ɥCe^wh,~:Gc=-dKmrH"Xg]j|*Y݆3"-p0eW3|}i%@[[pi)/Ŭ0{niYWq&`q( ~A0qJyF:M phUި6+kTL2k)"WIׇ9zW2#M: (g؅@)ǾѺ3uF5*x# [/B'GQ=2w/Utبf_( P$3[!%p~>PO!Š{@[?vZfnRys'+K%xBܓen;U eRfV>jV^ o{x@) Yy;p-11yTz I{kb8t+@9;+[@s4YX_,dPQ( GP河 -&a*Q;RHn?w6iS 1.KEЏ]yf>GM RT4N 6tp7M=1{6 4@d߰" l^F !`.)"&V_iFC]iƿɴ­eYST'?f"T:VӻTPSJ+qY%`ү%8ҫ NF Hm@Ň]+ʐy wM\C(CшxIMTz&5ua۹@삚J;{fq#&C_)u0,ߢA/e&ЛOz#UyI8ydRk04. M6=Z"729hbV]?D&ﺞV۞U#@'MPl{xR+,ӻ bE1@+[ؽ؄ӊ@=JZ^^$?=G'kH}uc)'޺]2=dg/d}vpaAkw YeϨ4@9^b#>VrEzSj8ݴeb y5ncd(3ȥIsK7/6<Xg~0jQT&>;IT)7jzLDsmEmma)˻Ԣ"努Weƹ| ` 3FaRŀ\T"M|Խnp uށˈ;1V5:Za]/rCRyWn+fJned_B{l9FznB}z?Ȓ ?[AB.xĴ&2I$`ziZcnK7iC1p>k4)R[/ Lf@q6Ǣ9V+[vE:>R5<>.6 [GzCU2eNaj&殰rKzO1S9Ik "Mɔ%:̲'G3no% (WD$Lt$ݦƾqn99tr',fݸB;v,3%TB9o06DlY2HJЎFU9n&B~ֵ: l LxD|RMnV[.cpqVJ0d T7zJ-H *Z>[pKQOiʕcəw_$  gj}HYZ//r"udzLpr:d֡#c E$)9l^.W)D%[  1P]l0S#u' h1+p3LhK==]wMu}3uȡnS,/1nPbܼJ< ˾坼0;D5x#Ի'zNuQ+YK} `_6)] X)45wx~=޺3ػ.ZΊqn%t :xVcgbhv+VƷDž__aw1ՍqHs*=͑ba͋{ik@\ hF.^"3)FuGm<ė}3I@n&iRQ >j#4\vWuƞXOL($WSR*w0 ɧUE "~F-~3Nf{ Y>_ɗ~ 蜯(喳%43 |AD*I#B֭[;*e> X7+Rx>tMN*!e<+JYJ">DsOCqDOE"zYf7 yi"_G:`c}P6^!Z=fdBͱ j{3G ^aV2OvP,>aCBm)S߫m\d{b߶a,LVG<.Ed]j\'RTr7]iDnގ¾ol]lPz2r Pau ɄBBZ YsAESS|cYieMoÈE;02Y҄@!3OJ'x-ewMlINa5z2 ]ă-^K A`Pf6CÀa[t*"-݉\.>Y>WF`KƞA,۳U? ')P3z'6gn!$(!umAP6L.M bBr 1oο2B~)QR 9V'MpzcבG"~2hH%qfE78׍?p^ Mu2O*$K6ʶedQ2x[/`-na?7Eb'n]ei:7Kv*v|f>}Q@&Eql% cN^xþ,-v א@|=49AVɓP"Bx{v˗0ahk)-B*J~ڸyI;(EYbpɊ^~ǿ;}jn]tA"aS&P+bH7:b|@!Ѓ]ǵҦ4Q]*o-p `D9فB2|AKt!8p$`{u U: }yQ~6_|.5WJ;c:pH>WF\x/z4X2B!lX ,,yt,d !# UG>frnMa6%V7#^T!PK_:’0L: 2BgTvf뇞~OϰBhAɒ r)>;n_L ÙZ7_ЖM3zkCq&>rz7dm1Zlx[0E-WBt|y~Dݤ*7񧚻ݖidď9!Ӧg;k\+[']tU~]Oއ" 穳kMry9z̮rTv5HuŧydY~q ;aIܽ/EPU!>mM4MnjIH 'TqĩG4S] ?Z 6ȃ+ġ FbF,IVgijfnjAWFnz|\l|ϑpr]^'- Y:2P-I2'_=Mlj/RGk76O:--Š0wKO:l~a@-ML\~ WX $!0Z:3hL,77Ddy}q4$vѹo[:ާ'<6Ϥ >U'˂qk.CN &&XC\bބy%'~X^O|nLG&+Ce.XCM&@bM,kXM )ړV*Ûb -0E{>bTS ;px5qm[SJ+Lڢ^'*+QzM")p@@>%9@'GuHP֦@r:JNĻzۯh򛰼Jo<bCܟ^In0W:ylT]畽+QU0)z)]vV~yOzrH((qvB:^f/Y>vԐ;w2(6 <ͤ3tjm!Ч/;& "MxtpN*g~US9?yɬ<ފ ӮE ފLGb7[sΒ-+s+G/x~-q/\XRVUo +FxĊ'rUZ9Z:k`*KDeA _uʁjsszWЎ6. a(m,EZ)!]0}\ͺ+32aJ#EjF$%F}Z 䌮Q0xYMl<dDh J!\H2.4G]ֲ V\gvPw Q/r xjrPi<"ѹ2 gNj)9%{`'.[7EehHz3%W(l1~EaNC.?ވ]פx"8,#ZC{5~%1'S2i ,u; րE.+ؘ{7=/2n#f1ђ ) u|x8Tqv`"Z(ο4Yc~]K! S1 .̩{>X{I—Std.Sܹwbe3v ݕﶯɲi}JWt. R68p,ۖD f}V*)\\b=$UL$|BE}d4~herWVJB du,]8;(P^p}ս AV҂nd_1dohrAjY1 ʈâ$'1^%CTT(^C4uV94{qoM[4F.80'1:>KT躋u,z#݀+oۥǖnd6@ e]%!;^g߰Q%ת݅n-nO&T+u@яdoy>iJMb3RqMb#SJ'T13='TLTG3,}MESV{XJ,LK<!D: ^[ oO)Uqj"_U/*tNT'gx`5Mz@^xU2YXJ#3;Cz\tsaX5ΰzhEX1PW.Х5lE Nmt3 %̱TYjW{76~IܥȴwҢM}!:S} O:Xbo s aOV Z:1doZIx>v@_qƛ9??b5{")\Đz [pڅ$ x-ut@Sb>X!*"u|q; t A1'9EI;H/knc?WηY#,Z6p`Spk.>'x7MfWR{ J> J3?kڿw1'|,<|_f)ZW;}MSUJ̨/?G\VB(W9#j—GT.wһd&"g|rH4q+WHbQ\oۉeU8na49#cdTcېG4a hܡc׉_"\eq71{J7-FN cDMiD$K<$5 ,G&P \A 4/bЙ' =DQ#JH٭t;L(#-(vLU LgEG)zGWGa]6[a^Q 5(B:Լ6l7g:Ӷ$:ҶNwZ`II/?1Ǜ10lwv?h͞}PA '*4o˛F*=KU[B|$sh,Rlb86ZI:  &I ӳKաY Aq&BT?_E8QgS}̤'?FtƟCaY8 ^> MM.ITϼ}5D1PLWLkejͨ{}j[o.XOECZpXeehPS~I75zӬdͷǭ;$caI6&rFQ(G][qPf.9J9pànW1%%6W(u5sW»0˼žUs=J.GmK(,pns 3u<fr?z_k(&ԯ Jg;* S&Rg ȐyF6͎𤍧Az4w`RMd!I7)X.1G{Z ʖ-]_ݍz3AhŗOQ2VeqU|"Zm{87.ACYsrC'$Z*zTgX0wGʦa%ʴ#VwcBMC<L5P`Mp;.bN zONEyaȊH,,d0L+8X_$d7a4k(^[5 DQrzi c*F$1mUy. Iw+UQ|z 2y8Ҭ t$;8'A`LׇÀ}VgG}DH]09oȚ; o}VN_61kTsD0Hǰ}qdu /4qer̔"*]25Sr4˔4kϨTGL}S'Zij-01S/ ij|VKJ]{ I5Σ IN'.*|poTZ)Hklo?xM*vKT?dp`T8*@kŪ^0-sM5T-,/l.x|T?'iZc N9K e'5pT.MP}b\oguqɥ[|ہY#Ptj/ɱ= 86S?Ya.Pui7bh~ş2[vj Ѵ?Gt](0Ȇ`=Re3o0qNޢt}-f :fBף:9[YE))8Jsq*J({awc,jRQ;:hxlw{.T7 BLBΘ[jy:q߁hfߌ۬,X "T%UQ~"5ctBOl(>c7!scHa?q ȫ{E&UY3q'0ֆҊ '$D8uUn06Jѥ=C =°O( {i2ex&y+d4 d A醋 )0Z椚 lm.AV~psPHyʭc&B[)vhRTW'F~ \2 Կt{">+JKfh5iI3k:%:`\yqRߍJ^40~D@q[|mjwƩhirP^Vᴃh/~(r>M+lo+{2vsj ŁU>mM[ST /b.-I{\ҝo9^)Gޖ?i")\#i]uM;QjZՠmY45[Ds$%hX,FdzHL+D Yۦ>).MtH'6(ڐMxzTT pjV87HZw7]9vlTLY7]I4Q Zs/dH|c#a'> i\\q -T)& ~WUuX*D&v^ڔi6/5 (!%D-+$X!X15½9vp5QiQB pzۂIJjvDI%ۺX| D&!mn|x2{l *[:WXk| WY/m8<JmyIVT%nYQ~ 38p4iZbEI&, 6I4{ XBTW[Z _Rv0;Ppe9%E'Pu(͓Ʊ+r!ݑt^za% *BY jb91 ,lHN 7He74WM(mzװ ek2?٩+nƅ"V (/[mJf!bhmy00nv(H` X׈gGRR/iA8`1Pݱ],eE=q˃*]p!Ȯ`&CNsSsI_q҆OJ Q_\JYot*I6{oЙW&m! /_!4/͎Fvy*Ʒ `!µ@kl7a7i\;,;Jy7d|*eBy~۽7qhRX |̶U0{T QkDT yi֋އ腯-rc0B$woS33/_Wn 2on]7:3ކxl(_ ?rV('7|b|YljkRo oysUE?sp@Ӑ}}?5tHS8mfڔ -1TƵwcɑM4gGވKM\7Z!ZaB{ ,o A?\y NcQӲ _+oAhA~ī }_CY:)O+eZ;MWPI܍,?`mJ uёjW9Y{|jn9ǖ}=QTªraŅ d<)089a  Z |?_Nti%0S6(6A|zI e U$o !>ݐ7ujq{/w z| #l!?^Ӛʆ}L!7N2e$iu(dDw&{ԘZx1TXio{YPFbS, Q8{&Eֻ,$%JC,nԫdܫx<Eegp6L-о)VC'+a/VQj`@E瀃[!H]z[QZ0l5$B%YWkzL'cnZ<jԤ_`IB!F>8!w> QJ1Ya{miGƶ[A䝋ϛ}0Sʴ7rS?U,Sr]Hi,oX2؋̔[kg"dUSQTً5SZI9#H>EDhؖTK$f>퐫̙zgmkR!B>|_[$\NQךHbs}Bdj3 s&p?Cprvzv˕t. O.~0 ♒):7nvtm ruʐ :A- 0E9B.r[qgA 4fr [ZrE8X[ՌJӕFuFUJ ,nػn&|y > @hNfH|Ά f4qjjه()(=jF gIaC[6m<^+Gs3(]Q{2a +Z43LԌ ے -k ٬.V'r1;N>xj*$m%WQ>;$L)QxLYz?[$y .  Ju.aP(Zx4SwXG9P0P ` qѧTQD,6K4w',Y 8RdA/E5DUZ)FWJPkJ/^>Ŧ8Ò}csy&+hM܍gE?cE ΪovA0FlCl5b!rܙYcΌ7_Pr B36? e1 D.P39HU-a @m+%nsj_Cd=$Q&&nMܽަV;_JܪNcp&Y<\/YK&j8D,?c$#$J `412,8Xe%%P݄tS/ԍweЊLs7.FzvyW[CByE<)) d"#113Q[p>T J&buy: n%*y@p$훉r8Ee# 7}ÿ<MoFkDc]7IS+SI̮tז˨n#p.I&rŌ6AK[c?;=S<?0я>UxW,~wO~;Y!ey&|uthL zم t1@8s8kAcf-Xd'q$]֍/n r+ČyL36b_H ߈9) ~I[邺ݒP?X@n BAc7ܽí?.H^%5@v,[:0_ɈVsIvFm.49² 5>V!<{o)d 5Jb8]yxz$,âK·[R_LV 6k%VhHX[nٽ&#1m\N\7ɶ%7N o(cvxSU|N=5r~\̰^Ū&p1lʅX'}rRNnuoP}x)PXf,ȃE*,{Kʸ=grMJ~O}oy=>SjlĸmT~ 1: J9BmnCto4* t%-VSf# 8*?6dz iű)pCיYTPSs_n&D;!R|35T;ن`],QXQ'-hTXgKf<4SpPv#9c*̇*1$2(F,+^.*! oN ť U|Nz!Hz!XUDj򒿐[G7-bUOkN1I 9Laf+ɧjy3jxDYrM*P =cI w,_xtԌz槲Bu/SY1PF/p))0Jι6ɖp-_Z/JzφgOWF1r;ݮo/D̚_˦L%!P>5Uq_퐚gRJ"q-MzAu{_ֈM<%T} eV[ j "x oPS[p b}oR.:șu=ujrW_Y[sK؎= 9KJ w8tz3qu+:(duTܱ <e9S :X*S"^ӿi ƓEVmq<.ݴgfI  d'z >SƞP?bE+ƌgl䔊,f +:Uڂݨǻ;\˜bbvOBu~aZәq8QY 0wBq\!t#o)e<<؝/f-Bd$E9(CE@pR-8 P!5F̱Cɞ0"s̤̐Oe*j{(MHfQg (s ImP+ELĭ9wz\X"Ӛ֜{BZ}6J$?A.VXpկKP(KOhX N] ,^J&T15uΥU9|K@g$ 9:Mp -L L7fc=i/ v; B,ED(8&:> 6@) "5b`sPLM[SDܷ "8_}ҷg`MlڱZ)ZK2 26t"ĖVЏݖP?3߻4B;4W =G=s TUi4>2:/N! jtC K8QRES<ݘqϓ$SYo,c&GQm=b…4$G0:fe{ a;x r1'pR׌;6U]#R]>&bstӜ,UÉE.|L"e|&RﺽbNJRLBi־py_"Z_IZxsir aAŵ]QYq4+}@0!Tul1NEHyC ~Q]Ăb`CXGSoLp:o!+/zн7g>g\ӨvVjY>`\J˚uk{{B@? ROQ$`SepƁ[2W5^ZJfDWcTNjPE)L0ԑm h?/!>!\ګt.y(P ٿiŽjE;k5_*T8}?K7 \`ʘ%wF~kn˷mu8A\%T$2 ARB}_4p~~P`>`Ff*Nzt_s葋sȵnyz,F*9ԡO" c$KTt8e$F7 \M~B*OƮsZOq-bsRǍDd.~ݍ} 5, ǹ7cood˵RCxacn2:aLzL .f كrZ_BXd J}Opti$g8j~D{xr3o~7v^Ij䑖~yX(ݸ4XhFRZWb]y&Owh OaԲR9O j.cG6^u=n.Us+fޠ?GnI픴d(.'4[JTA~cWpTZ;+We%M!6{ 61k)F!'.}D]{5(䩯Ez; ^:aGp>[ѪVNľѤ7;tr.\q6CEzw{ D M0g#oJvJm KcۀqNܯWG#5Bs'@Do*z'S ~G[n@wJk@ڡa]?| uFݘU.D0GP4Ҳm!?H|a x>{.Wx?fת|d\X[y8.=Tb^6 yW-QCvBC^|\C>--V*7MCa++Pi3PoKVqPl1?ǎxK؀vJ|]3DN'N*b$*Oe-GRj$[82Gk2yo[Gr¶b3̨Gȼ@.ѐcS>(>itW.W:Ubq˧l5oRWԢ-%S ap˲9X0Iʧ~frT"fWm=-MZnmjb\: z%0RsXv݌VUa {]KC )w#>;whRŜMyubFE "Ka ebxUBS+ u7 PFYA.-\nO̘X9㣊bPnεN>.E*\XGzz]M\gCai8OqZ{3?ҧ 4}3=6vJjζf^.麪d(1%r+9߃2q'Dt +Ć76? >~}k¹9f|3z, zi\;6Zq]{cBy H"=mbh]vLܖ|̍DI~erow*2}cqqJDtmkO.0ܟƄ^erA|@w$UQr\k=W41-x9pP'a ˏ&q `v;"YEs՜X//ѬDTGJ!EY<}ypjne=X47 CI WqM(&><J${Ǻ `j}ħwwapǡ7Rgx| x_^LYx '׹ԐFvzX#(S_<pW;> ՞&GjXZBC2ID $$۾ق:iMA q7 k(8FYz[+8!{Hǿ ;=mܼˮ8)z}%wKJ̾ lZf>?h,C _x/;>y w͋OxV9E-$ ѨO2F$8bѾt%UOԑ.&T;9 aqnytÝM r\(^vȖ.)FDTP!b3h*{=j3GE̡ okUaO˚+' Jy*uiZ_4%**E$E bp1qyDuXz x~takInAA\eUL{/-Ԝ 9&p! d Ɍ/:a 1ai)~mk"Z`I3I FuT#N!^wƔn;NtȽq;vå@VD1 YF< O1U@FКdOc0R O/%O͢* ͒Z_։s'F|cſXϧ.lEDNԌݞjs.Se-%ky|.FtL=^@9N1O-BK3xT0:qujYZ#Y ~oq]QATݣ$}aHF%ָ#t(̌Waz.·%1dI×4͙O) "Bx&xDtKtpƺ>KYvt7R8ND yuk$#wxOcWZ8|7añ{}i7}!'b?`_W(b[<ٴtg6TZYtmxcͮiM|vZ HrctRnx{c Bp.JR̩VE9KCTcKsЊ A]W /qd GȘ`ttX6*GRHǞWj3nWP)e2Z NFR͎qD@S}mUW*%d"-8VV GKX&҂6DΉlHHaz*"sljpID%\,5'"9ZW\3ȉ)J TR0OM=%C[ŶvrboܴTu{M##Y ri9kii唒ڰy^(t"XBe@^+/_Q'7^P#_ʒN x;Z{0…2\+v7XƯKa2^3&ˀLHh7$jdnk*n~pFg~v%'(`D$<˕6h]!`.{(EBITm:e^ύ>%br^H[|A"E9QO?ܓBY}i˜K>HK}^ L1UtG%I.]C(>vz~6ƻΉN8Rqޛ(53F K6; GX%m5~Tpm˅]IHJ2qLjG$;[R ̣7=!: MB{CD166338oM~Fi#}z:6,ǑL a9pnLKUZHSfYdzr[6tR]؄E?GHc_Ɨ>JC߾5Li۰]}xW39 fyxucBV" SLXA=jb~"䬲]x]r3FLVyG>5J O ^W!ʴRv7whګDS07_y>`HR vQ3ě5l(,]]7ȌP֑?6 oZ C=\կ d5 ~}יoI9,?\s܀I7LEa˘a`P4;o jSU ibd(O4GZu"ɶ4sݣ 0{Moni.k3CfZÉ%TPS<ԙCe{;A=q1 1lWSV)B  I"W1_ˀhRgT^=nz [kFEgOt5ǢyL%V'iv-1@9n{XQ[rziԦ9hTLH$W?k&ck'KTi4OEкP3^"{Rg?x|ZG564|{/rݛn­qLQe 9tSO|89kQT,Hݱ&HY!uPvkPQQ:@8gc?)6g5B[֩FrGM$шf :{Tz[Ù%iI4v6<{48̶.*mԱ6 O>,GO4D odca4٥ܖE@woՠ"g)2|rz>4w2(b1J]ݪg&s:ft h1RLh-]ODw g@` G@ԃ~$j[mVo"^T[ZLo@}w!|W-x_l[4PTQ⧺AEdqgJ$x{VIgcQD'1ФTFckUD5wVN ezxa' ;aU E>$U$jهNV&[)H)F*.}=XWf #+c3&2'Sh< ZI>2D"i2tX8xLNbC'U5^q/;aMѩVRF'KWpm X/Jz] 1cզbdU(Mim">M¼Yk'sg2|03rfMO8cJDc1LhBa,Be$!ni"ӀsʎQ4SBMrvH '9-luR\AAPկ1hP4Y6yrsI2`&X34Qa^sϘ[f-CO6 gg.@eN~vu!@,!dsa!L5c: ',.)ّ |r^ܐjȒQpsW#"f7:J (L(Wr^;֐)<-R?<xd?i2Ap)Ӣ]^|nf{3*f('$Xf|Iy9 !YMtnkjTdqz#UX?t[$:pAɒ؜,6Kʗь-RHC)KaLKlbj:~ݺTWg9CX͗D]1&x*}?,ckԲa(DÁJ߯1Sc ~M.V o:?xj?)Ҫ/"hX(sK,HtzC=c7}h?"UKQ'_%dsOm$"),9"?8ÝG!}Kw܈}Trي+&IZc<ck6( a)r?B5$Ah[p )_iG+j2~{eޝGo¾ASQ23`*i‘2:aol@,7KAK~Uפ 'HoSt 8-=*P{#'_Υ` (yS7*+kSEjK\35dY_ֺh | [[wr=ul611ԙig9N]?TـY0)3& Gr^ah_Zm&]"^ 2 A$K=57eSɎd4EȮr *9KTD􊾝z  N{0A5Oo5k 򻡸rw% tlQD䅟:c0%ukv1eY9RfHC E?@4@5ҬzUe=A꽯] ,#jd ';AL +E ki_QpBYGJZmDr5b?c19a}Է$a 66WIJs˸?J iķ.'$; ͠{D=_CwMb;W- 7^?]AT.l3:{\oYGTN=l/GNؠǭT(M3/ +r֋"ݩ[Ɇvw@ʯ-䅘Q4ϥWA6)>n~nO%w4 ,݀ >d/r6tܳ"AthTE5=@9Ma8s~6]ҲUE2 %w onH!%Bn sO=5LaB܁t(׷_1D6*i\萈JͤLL#D EgKF=*4qySKvn|%S zsZZans%{l+q o&=EL$cp4xs9p'%,䮁,GenCɀideߢ8(']r7g54Y~G2 '~x8*X(5iÍme7`Z>猈N q9MN⫏ ep#$lmgV 4c%uIdZ=,"ja C''`pgtdj&YU4 ټmx>):u mase+th!\F|3 =L%'q"TzD!EqЛ]9<(!d=b£LXA43ۨXRLHnA-ekO7d{!0m(s7)#n;)㮄74>@ӭJ!%f% J9g 7,iVsJK`(r… "&RfZ<:qj;5:(L ;W4iYcdJcp׼6!U+7"M6ydu'~aήϹɭw2`)Ф(_62yk 5bQ\1>;jŏ~JW3Xstu6:>AN]͒|OQt;F6oۯ[T'JBJztVʼn&u3yT=zj1-H=V*j@pN5*햭ҭ_IP^%̧%o ^C\͠5 {EHwY@ $&O`d1(Nϫ(kjdpK_򏓣ؤjbøg:iWp0{B*M (J ?7hUփ!sn:Fl~XbBAy52"@\? lWhWiPYg3D$ŲܠIdMdXUUYTTVa8q#Ծq&NjBi4B?ys c-/~"-{ ܸ̅ OvΩ&3t<`GbQ WwZxo)ڀOt ?豕DV{xNauYtZ̗1;H9N[/1<fTngF3.ٻ0߼ F(3*hAdm\B:E0j/v#Z1 4̃RR&vPt27&'kh>wJ"llqv@-N̜!p z+IBWoDkeĚ 2V6pDǷم^LSć3':uV^LQw`E]V$}L(QwQmM eN u-#6̔ݼtGćCR\|>IVxϬ{PZ#E JI;;jYԢ VGZaj֡S/qώwƼT ƖsLx륺]Xz,r;ٶSЅ*u?X *he® (JceoTOƐ 2|.*mwTb/PUzO˃+3'IGAxh8o. c+.-/B;k5a_ѨP+73»;<5YZ*Z.Lɚx(pAk]!ŷ_{dN=4u駓 kJ^Y }l a> ^,FAj$ɜkE|FjlSҴ/t}l~:  ͥqٵd;]Y [4=z'ō~ w٨zW~X[?]+HԊ5tT|SDt}ܪ xҋ:F<'7>kpdS|a] NR@V{BMO=o,R(j$-*Ts|VK}F)f,’R a~3t^~T=e>]Q(LH7Nyؑ`H/rwǍb|Ib`l/o]~!^Q+k7k̦ W^rU|\]Ck\hX: JPkAl8lK{p}Y1H8 zPUs6ނSv5a7겲V0Fp7SüA`Q X?TV[+}=p̈́>/17-2aU7 YlkS6;BYj]56 k!Qnl hfB0_29{3kN? SɃQzd[ ZwwhXA*n3d.V[IӳpEV(_I )AB ,i ccq!Mo$C3fRc2 dBp8+AO׈aH=ܺfZBI^A!%y6']cz7$K WXJAٔ8wڝ'㴒ܨA!K6 G8}/]״+RPO):cscvIp{.#.H  VNQp"ؗ[4W=L2\Ӣ!"å"#\ KqchQ6ke>qHD25Vx s/N:͗[_yS1h%"hyO4N#dAf8O=AvH#HyxX{SR/F`7l lo3БϳpȂk96a3jiQtrBbv2DeqUKF}()*:҂ ̦%Lݤ$ۗfbs\Ҕ?x| O7W| YiDSGZ{W`@NaBF>n=0I4Fs@?\vA@f[g7$٩5zJ}8L Z?m7+F,ZLR@Jw!?5ʲd?M8Ͽq!- -<K ɝaAe@M]m\2+7q@Ya k5> _d;Ypq6kd>:9e Q"@+I;~'9t *;Qsx{Tb<+|ebF;\Q2_MFp] ;)ᦕ:Hvznr>'bGTgZUxbV ܼVaVYՌ:I1p휣?^`b(_6L1;^[ڈ^{6Vĵ6tAIdLep?hS"[`>r`C1CM̕ۥ2-Fbr(ugE9kTu"յ'>J^kY?R)=hs4 zR҅ם5<;6G,eJ6hgЗ 4Ccyeۭ?qǼ̟ow z< Pثm")k+ؽI)y1WG3hI(<#xi>3$tAѪD@O(xӂȝP~/Y1$bN> :a "GWuch`Dc|LC|ꛚz4?ʩf-G5D&a!±JOě1 _<:{k_/>']l} h;gdH k2ӹRe;Ç3cuaT/]ebNh~zq, ~D%':_ֿz#ӖKRJ5~ (j~m &*}tқQ1Lتv! IǶlY8n0!ryU (BآËe2z"D6Q/~bٔz9H J;7Ǩc{}7Z cV7ؐn1/$@jhb'S>8S;Z^1!jnv!G[33Sjy^|t8S>ыds7V:֓zߺ@E2osk7c?]s"ֻb(Fq 41'm'J!xU91t+ t LVpw- 1Z#.="%:&P \]Tl;m7FA=0M]H~G] ozC];m<ԍ;xs3@] x#e2nG̨IlYvRՖ7Q~~5젹M-[d8t/Ih`+{t 2Qto+pB}cǹ yJ^|_s} BB$ `Gs+(5J݁(p0rr~lŔb(Ѯ3\Uu}l/v f{DdIT #`MaTXVGު <-,ՅuQf@:2\,&$p]b/ xWt Gвh9㵤\gR6b8,gh~6F(9Oap"hذwPS?;OU?I}NaPa,JdY>K:n6p`3$7Q:tπV;:C o|d_i`(d7\E>ӎ1za7NB #|Q? ]Ϋ(>{g4`p^iJ+ƻH:n)G'tAl#;!> 䱻ȝ&`ȡsW~FfD4SV1YY Xz|gG' _xD4-RyMLf-\" 8~pha&/U7*h>ِ:wxF?978rֳd6;J5iJkjMB\l\ƨ#1N du?s`$_ÃHY{uhHn Z!<~,$mE(opc~ @k%9%25<DŽ/ %[4[7' -ѠW *!NzG͗>[3y7Igq}TlqT<\+i]Gaʦ6N_yҟ\؋hEr3_߲wރQDA5-.ʓ,84=4s-5;k:ƄoR_aTl@lu56ǵ mM^&=Y^Xxk/Q2z m5V +Ty|$7|{1 @yNc0yf}jJ`tA1AN\uJoeעTHKrwSnP- H%:W@.\mr"zո!h)&e+:L0˅T9'\횋271/*t pg#%ɓj=*m`^ATLY$* bcQw3ml87%s3X v98((-%y9\Qh%:yg̵g96V@: )XJ4ePuMarwK:0l)2oYI72*+9%(׍0dp|=2*SWN?esg,Ş2/{Tۋ v쿉 DLKz%GOju@ƎaQ EReb1U~l5e_h+i]4ZJ^Vוn{ĸԤԑD36hyꘀ~+!d >Gy@m焺 <r2+9ĀU$yuV? !Oo 徖+$ DǝTg/E ljo<} :##wu# Ghcey>k8 \GHFA8G6tzHŨe{-4{wq[F3 py6M)L(-Nu-Gx*`>9U߶cI4?C<Y}[:$\dI7{TbmC <)W4 dgjPu|@8\zuݵgMBšhFϊfb7uL4$O+{yLaܪkv0ja+`t2Jc0-npIzBcraBV.QwCςq>֜|5s!b#H8 FRO[Kcotc׏n*x5-ݍaWj$4p0y9w&ŲCRkrPL#R12 f?gzAJYMҿ`[}ԤV֛& 5´l2U.b>.D=@(aO\7߹!","*?ڒ fC8-4J`!j#jp'8j ͒oaULIk2!RZ81Hbzj!_ (?բ@9ƢÙF1kh 5"&Ww)zl5;Õ(v"C4q4C{vћ1i.yXSaan?UcCFGZj%!HpjL_z.su1H lۍemkc[%q8֩A:Q\p-݀8̎Hؓ[B&p*8T礊G Wy$!te_'UR f,syI7| 񤦖!|C)/:X^ `9,9[ϜcFoƪB,o {00AJ$`oeG|K|mA!RIz2U!Õgl9_Fi`ےX.黤 G"?Q@K=}3)9kGk…w [1g8),X-M91D1iPLgSSGX$g'4]U?a s"^_l/*qFWUc>ڣ[e~y[{rޙ@q_cȐkDQ#tE8ƉKXyծW9ݺ̟K#St r( < |6;LE*XK-CNkimMjtUܹ$bGh9+CSI,AQøx6bHsax?k8g6R՜exY& _.[1ULJ:-C%q\ ˬhfD mӈbуo`-*͑.҇(Z?s\Z5:?154$kaMoTB,jm[]D귈H%@ ȃbwR}HSc:Yswyu}>aY'O[B XQ=IjPXְ,BFA6YٴtjD =5ہrF 0Xao9I"H^w8o JHuh>|WRE%G Exo$aM`A])?0_d& #{?>ÁTfZŦYs.ʼn,?zw twh>M6CvVkTƪ!Zk?*MhzK嫟ڌ_1 ym]}6 xILBGm.dH7ˎ6Y@b!׀% Mkxn !t`8BҺ+ O婴pU:\J?Zl vGk 9Ȱ&/d_u<O.6Nի¾uw'55ثs*AduY)162<6ѫ:dV pX rCyo=WJq]& jB> u)=eYz'5bn|.ܼ*|IKC֣l:bSRwiI7hn/x 5dlIߐ3̧ŕ;"6"( "8^8}p\>stRlg Z$9mCm%gZZ!;^0<ڸZF aOgqOw8Y`,Ӌ!_h <C J7Z8i8l[::_YsyZjPwiQV؊ُ52=e.UbBMBxEim$g!T),IZهr2q+\;=,ᾚa6&TX^_498ev[P{Y41ƼHc#8c+TUcs'F^R~es%zvk+.ɌJӷ73IxC>\k9 $=It6q2*-ml`=o21fE^wn~@*"CwI{LLmоV;׿<$Lݣ; 9 3k;t PN*ȑiK@Ƀ"]W|2>P %KL#F7zU-?#sHǬ ( EDYߖ++X ufx0TzfxVA$Gر%Ր~Whxl;!xHEϛ44bR"uL/ۄzWo3wKYGfƒ%qKGD߆/(x!!}ɜy1uO`7Io vﵑ1&>TXHߖ?o6wc)Yi`-kD=SIs'7 ~$d7(+Ɯ]:ٽ.Ѫ( ks#t6"ޑm6EPy}Ka& ͪ >ȫBȂlEx,/u.z urs65?_0@Y"A ND>9c3E0O} k'{Bz^gT[y^&ߝT0ĔBls&(U 9\oHYEE>{z!j}Hbv#BQ=N(w8TuS'CRlf؆T}S/ <)d`۳khUAD< f! UU+t9u8jieJcH1^AnIuE&ޖГ,o x]7kw"ZMw|؊]6h0{g)v1ydoŮ(v郆#pcg M]\I%h3M (~3ȮI-I0: 4 N/1 "N̬\#*YkE_;*qWV<-FN]z!ha{.wno|ڛN?Y0xt1\C310#Vc9R':? 1:7`}T>wh-uˢAٴNR<mf8#o/X OEPLfZZJZH6ŽXpoiDQ4Q<Pk@ۿm\OҸeQZ;aĦneF|ى5p9J'%x~M&kUŢJg\́{M>L`bB <6YkeZ%wZ>N|<۝#@AHftYa6uJ%! LHB1Kk:'`Kh.!T$z +TT9ڿy&⣂Tr;xKy+s#mw N]| `3[R .~\5r5H %2Fk|2!Gإ+K[y0\r0/S|ABT5ӓcӢU($E']܍QR(1U2E̻#%xn"VEy?$˭e67㔂q8~XX(GΘ*4oY-h:L|2 l$kqxYoϴ,<'VtwhH=Zj*X~vEwgtzzwB+L^{ԏGnDUE 1f6J|7*]\.^mu '\fEBBt& ={Lg| FAHg#uSSGt`b֘^ ľ-mP"5+؁ a&v+Hx:v<zR=C'{.IǾ48L&(G֔Bל~pr Af(Nb@iQj`=.Q\Dv7|,B?} *)E<<ː:Wf:jjw^Xy /8D4:V}' ?܂F֋b.-'JRBC8^147I#I,3b/Bl/[!xk@Z{ QC!Xg %=D^V\Gz`K\ @0)@D3Z(>jU gKU36 _`1|)Zd5S ʷ견alNP\ӣRy(FRk|XT9V$¾! +l qūά5=`}ޙtVmG\<`MM.Wr6_^en;vKSdid,DYayL {inrŇ7hH$=}ȱ01g5$5^۝e|rU h*fUf+O{i yϓ:2 /hh254MڼL,pGvوzqǃmSB 22hߘj̟du 0&aB85H2V Xshwahh5 ƱݕhMY>c !(lֿbuuahbbFZt7a5BtR.~Ձq^^ɮ}$sF_ܠ{2iS|,8RFcȳfc62_T3JEl\: /5-~oZб(ωo1+eV5h'79]eKR~e8-_*O X'7륲{~XJp2 (1!"*uzQK"O#]X%R\*e,op2U qhP~_ '`3R?5x-Pqa{doCb{k Qg-a;5aN(-pnq-b i_&爷Bؒ&剧L%UM!Y2/EҲKm r<\"Jv{bdFIIlǐ+-Ά:sܭ3wU?IwHW$ G!U~Tmr1 ū;6ďxwS`ZE/aƵHb+Te71~:~hX7~v T~oWhr@߭ef|Cibݼ1i*hd'7>p[Mi\7i`i^={ợ{Y3th:t{e,};Nd ðT]["fv H{/1Ho>A{M~mְ^$b3g G#*-=3X!(|r"y!(mfqOR~'+A4lX-SzO0.lvRnOW20FW l1yzI&M%Mb'.ngBR 1 GU9b;0V/4ж]tF`4W8-s§x?p3a+a[M z9O$: IOy6}Ss~ScT<1bҡwA>z` O(L1.Y /9,-^sA(A s rgb5H@y2Q'na%?ox}}70ZmV>滖´0t2wp.skŪoE F@ěiW4iC߂|!Ht묻H p\YV Alol0A*3]i4Eo@%Tr2! :{aۀ5ҺPlVp h}b4C9W#·Ⱥ`S 헎Wmzlf^sv|*+|Bt:LPn|G&)M[/饠'm |q];TmN#vj罒fcX^xI @FFC t[\'E )E~|_~b&bgP !f:p1oe];^W`T6 +j$oX QqnKۗ[3AW\Y:YQkt.GL\[se,|lV򫟂zCGzHN].O:Ŝ/uXpDqDx5HW+ ?"E$#x k<>x WT̛!WgUŬl52*XAX h;ͨaP4#`:Mw=Y@!㔙҄~Fib xa7U,sSL )r^c #Ksרg5˪j*[ 7耳oa@j|@.R lHπ֕8iնBſsh:~s2Cz[S*qI>6b~Qe =b T kQM pkҫB9ЉFr6Uv?8dNG˻݀wP G1iN1VQ*ysCGyGRZ&Cn[-I!Vc?qKފl|doX'?C yGcxЁנ_3QiDK}ZN!8#VE939Q}q %&φ2YϢqgJk1"UQ̈́ JJծB1?227f$yn9UXܲKDgW7R0\?e-SHdfsɡ5t 9+EhqUlx_ L+e)e5L =N%U'])Cƙ8E.+9+ȷ`z` n8Mn;:]?]f A(eI=p:]˨:)bqO%un<ɸo+ hO*۲ƺG;^hMS~P+: + =e=Qn}҆ޖ=GiXz^eO׫^vmdaL<@Ipo|'j캔$O9ny)7cAE3]? PBw B@-H5A>(0 ={ [*s_Ke,UKv.hZohIФ$D+R#mPa)Pcv$:vWp&W?<ϓ3Y=Cdld _n{mAt[m[c>Jc!8)E&bNeӛ -4)ۧ`7zCneSڦ aWdAx]+}9΢$HmgJ_RvxY"q쨰 4"d҃ 1ҥi"!0i(U^q X!V"d XjE)F_;F{">78Inmm#O}x˔3:73=<]Zn Ҙ[U.Vt`#I?3~DeWG@l)2nz.i=JݏDGA~qGسq,vXn/.)J(m/hRw$Íg"}̅U!>6T*rfWzDVN~(g׃^ɯSv6U%`-\>}VShFҞTDCXq+F)UƎӹDF5a3e-H`@Us?ˮ._ؒهVۊq(Q  Rq~,)b`j-8'۩Zu Hs .nM 󜵩n H]?>Wg箵#H[Jw̶Q;)3-;|#/ƹ{/ ,}y0tj]Ii=TnoER%ɿbtFfҸ;aٰQ~Y/H6 8M")fv) %sI!l֋d&Ͻg<Όߩb1pU8Eo !{785W6KCE^COG(2ႚ1 Vhq*=9)fke2Z!S&OɔՈa3 ")Y bz*y-؋UM9*t{8B߾g?0 <&]eg2+{,-`6B@EXhmN 8"z13)3v <`˶r-; *h*{y8L&nC7~MT٬&6JP(oq tV v~KM%sj/^I_ hND*sZiDFzΰ=kIw_WxȖYI67js%:s9kI 2u1i&1ڕϊG "JE/Նkf־<>:'YtxS{n u/1= JΎĿVf&ԯuAle_z#1QLrvVdi[O&ϰMZey#9Ǒ)~)՘\16._W)NKN5??֮L0VI˙ΚnIl{(YMq8 z$mC (&_b> #Kʈ#IK7SBxfeT"3,SXLٜ *QQAnL_e&Y@ܛ2٠+s,x*ԣ*ϥhʝW\P B&NJ槵{ȺU]n8miE h0W- ߼^[݃E$3)Dag-_iUC)4T$)ZZl͓Hywľy>UǮ$}{ ,x7e&wg͌* E9ϳ%[B|T[{cMEr$+M,'ԾXmNRڃ.b 8q48'#qL zרk+F*a%c`?K0u]NYbH0b?dFԣcVF[d<)b ZT %3 "UyxGMG\Hx *k*2E+ |SH* Zf L bSt ZI}jC\sc|w놆.xx0:1w]y/k8C:ͮKeE@#.ѹi7WqXZ SJ@lI(|ѣ Mש\$_f߅ }=\G ;q@b!r kO2EJ}Ofru t&HgBss 8GL=("ȳ U&YxOW$x oǁ O 1^ h!B%iٴvm"60<2*j'CE;N(/X 2'Bo?"1pu)(oxnk75QM IWH6;b~j(,0xȐ*# )#28?;VۮR*6*UĨf$c(^Cl8DJˤ8^Z`}jF Y|]S?D*DdOQ*[-b2jCӖL(xZ&zK`Ug"0ʊ앓#9^;+,pe28w8vYB}LIZĥFb5̀ͳOv-46@ṕN\&πwD6K˓|NmQ2nY8i3&duT imZoW̽?ĽFkkW 捰[WqTU\W,ĥ7mx5ˑL>e,cYt&rȡq)eDWqkj?ıEÉ(!Qb +in#(}f0N߮7{A&Ŏѫ0^,9">qޅ`Qp rskx1CBR)36) zchOՍ@/%uwS<bR!kzXN]J6s>,xWߵ1,Q[/I3m=і[찹w-uTgϷ0JK*ڜoNW-! A($.W6 ʝ2w\-AZU]-B j؆_9pDŽZV@뤂#˨ m F1->esJkLgg;7'r;h.$ạBvA# I3H[ I]NZ + h*# 9a&\u w7Z'e նFssWZ}NL(&Ld]޿9oʫ sҬpqaS])Q0z!(Ҙ'@1YiMGETW63+q%Ժv^:O,;/jn(_[)x, ZJ.B]}GK9Ͳ,'/3OGm bdĔd/L9iD&i_ ](:qN켬z +4oLKYGmc _ζ6RR< ^\a )(|| I:Xfz|=Fa5D {E>ZP@MclTG]|x{=TCkq !?(P>wGp/4g0n30Y!_PLtׇ(n? >+w\;#KY?ưDUg\놖#$S7A5 < y),U^dW$ϧeuq-6rG81 ;4f^ _=9y쐧Gk-sa:$32la'b/ar,}b]_#'gvA!N*0=9f/7ҳ5G#f N}@&tpSq iUc"XOPGΣy%")O1L&` _LNߖ>9zEx-פrvљBH,a7dB%ߧ(QSL_w!F./!s}ߩbS?Q vFI@LK葬dδk,0nLrJWL+n@NJ>XLldXV#3F Cn1Up'źi%+z m}>qL˔͹8fmb&Yr"ح8aF5<ށ̴MXhhR֌SG&I6 Ni`q}# Mіq!Qaf` ?FZ鱬W:MB 2QF-sD"<߽*S>JpiWTd]w*?#ql2e5kc&Gu10(q[zsgxJwb3MVm)D23P|T=$q\q@~mԇ1y֏Ӱ^xagQ>$vͪ 0?m!:1ɒ; t [.#Ϭْvf'(EdBMp7ѷ xf05w _Q qb (Jczg'ٸ% JqZFr)n9"I#Ǚ*0"_ SܐN nYZdp9br98rDX_$ٵOFEl}OCTbw)u`M6li7'~@%oGk*0. ./`d$DVn]58MX{Rr)S` 햑w,:t%˪F<ȍ mA=bv;֣/I>{M&i:K"4spj'eР3s{eK9K'bQ"GC㼨"qUA= me0mo{K(B@* 7wDyQ:UY 5F CZS o IPs竵|DQe9Y;T[b h*}8ȺQF:׊te-Y%W֙QGgE>F&ޓۍd'eLGq-<3mci>ro;Ÿ$ųwJ{]|Qv{e%!`/"l]B#Ĺ - 1ށ2_IJX :^̈́1sZ)oaLn.+G1<N(i'r2yAwm4Uz nyMW,x侳 ǃ_GmHҒC8HB(;:C"Ly8ay>&wu%ZO,0A;3ޒA#O9q%/87)%~kx%q}! <M<M65u~!z# .|3B\I{k+ړƥU GW4ʨ 2&č`cÃlbs>,Hbt!G+=+N^[ ;mKp *1>p9aK~k0FFNFR)y )d{>{4V['uis2Ds=c0Gg0̑;щ\ZiwmNcEs"0m&$2{c঒(K3#{w=fHu:Άs$TH~ }UU* Յq,?L| . *o~WA;;@E&ʄ; qC,6r}o T @h 4*6~[h3V _LQ<a9pOF-=ϙ݊7QOvhP}m"Y~ crL?>Gu{fK%v&[5΃텻Jb"VDQ|mԔP+zK<3ӽpp{AA< eK FPAznp)g}x--86BJ4rW;t\ٵ xڇY9#]kr`l"mRaz4p,Qr=}zfCZjIx㻅plfU@9tD_xl} `t-h3~J`qe'En۱v *I̧m X{֟\rDSkXqjbKd :5X@D8ȳREstJb2KY-v቉t1¶%P 9X #M)SY+dk D+P_X^E.Mq<%wM_qBx=(wܩxk]Gc\u~&}yw6ˡjgFH2x{_'!dZ!Rw_"ض8#pvľO&8}dy2"R J5f[#^qFwg!K"1S>|I"Jb ty)c$iSlRL+b=[Yҙ=G^/R*tٹ *t>S1h~ӊza$iXLY:@RDD< &ngYb&f+? "i LD,(P26lYP5A1;fgdC)(^IJwv1oeBb6=t 0WMQ)S+@d1ecΠ~VuJ}pȭBK%VRS>|!J _Scʽu:^n"&1slGrjh:c?ߒzU\WQd Wr:k<R's[6Wj[]FWM=`@wR +#YWw#CZ;KW kaEd^Q̜fr=W 6E zo7`Zw||vi b&#kouUѮ|YBv%ސ@ yu< JFimΨHЁc ;U8_G-8ٳlu֘rD*y6 MŘF!Ax.G۱9Of?5n٧҂39NJ;H.>BӮ]bwD.-5uƗȷ W+?(8qPٯ|HBvGmQk*E /@#QP۹Ex ;:,Qv=71!зʮZ|KX RH$ /qlԕ> =2pj{mNFd+Ѧno-b>eƛ?hTx1z/lF?uSp^0`Uw[kRX,6TʱƓc4I=JY!Ɉ0S`ʆ&B.IXފs#-v7W&.ofM|@XENXyz4(6QמmK] ^ߺ VU@ee~T:tp~s;`:@^gCӆTݱ6Ռ Cm^NjA2$4A^Jgf?K9=vWߗ:v$|0c7d0u}]3E[䝭EBpӰc?G [ U$_ciЀmZ ܔ^k?ѵ+"PZQ2" U0z2Wuh:B9s5lnBuZq~TʑNVWLb"Dgfh˵Kvvq=2zxz= ZY:n*;5n]Wäv{BGێ{f$Ѕ !z"0oh͢ ;*" 5K k~+ެ_Esi`z}uU<~s @ނgڛT ?v6r\^QNEXk9W-9|` <έQ}+pD.PxK䟀Zh0?? v=Gmbx]ל?(4*+$vJޔqv/Srbi2YgiCR6x2_7*gS*xl~~ҔAÛ_ /)`ց9CU+ (:u À1[.D5 riv+ܿpRQ^cs!~G'OlGSB嶾$!yqQxˢp$K9>+c0d>O6Q=oF<^4$:FvZߔZ>'`Ef K!fb*xA-MuiP}e8h/Ky΢!ūcl~dP}WmWOόda``GV:EՃ8ECjYUbl 7ut^߽|0 rʫtCP؛;bߦ%OHWcRp椌xc8B})37V!Ik{[7VcXVpFg ת҉%5!#8-67guN䬿R_d}4]gM RI3LJyw0s?5wJ{ gga\ޒs'\k 51tQRJʣ[}5/]zU+z!JR=x}B\$paDҸɺd\X~GW0 [U>V֡j[ZwMCڱC3%ʳ:L0&8&@6RB]#h|<ӑgZO xـ_1P 5Q5td_ s]9/1B J֎%:~~5eI$yU}+= tS94Gh :c|ݐk3 6G PU.M< kK!LֵRK-DG! :T8X{4!f(N,O\I` ︧+Dw8^~U9NF -5nA 2c~p'tߨӼ9ߡ p !J3p􍏠?t{gZ+@d`reNvR[ FT^\/?@u¯Uڬ-͕-N}WڰI~f5v% m6vީ[ael߻3"{ҹ!*jC6^CDRr6s$NL̞dAJ}_?Ԅ xM&eiW%|B.؛}ð'GnaZ[ wW^])j2iWA:#ܾs\`#WZC'K'j%D{dYOU$,j&$2}˸]RGux!QEZPeG;eZ;=D>d} E!.$"#쩠-tvbO_0 pI ,VQ2G*YI 6 rɚ~u@I, b~bO[LKY:XVڞ2Q/ڿSzTn; YUC>Fb<ږ6Xt*!4ᴙytz6X"xbnpSZlf\`yvQʻ4pwEkwzPEzW(fɖʁ>[߿{ u{|g~ [e>;9\eVa *b+cPʉYKenfMXgrp+iMt}աrDR &8$_NQ(6}'F, >NYӼM'*ahrp pM{m>"rsvYHYٶb,bAk:4Wanoۀu$݀EPjɒB׈T MzP3U!|Эۡa6i'!k=dT1Gd_BAHp.636Tކ%Mmz @OOnJf0v'kf$u.Y@g;<2]߆X.~GV108ŲP,pE'B G Bجuwä4tͿ^1,m\Sk8.G |D4s=\ăL%Z^=XJ zM{pcޘLEUnɂq:*{g\K'T'M_n!wĝ^f=2/H ߒ{%`+2RpP@pz2 PXܔ7(kR[c R)^w8BK- 1ö7"wUmSL A5XLmgg@$'@U=okYh2b.;J^LU&؊p-9 40M!{eoL.56qN^ A& /X B6k4ʕwpX! 1N=v? ƺt75[ُܑ* &޸;&4/Vg&O q칢NIXFs${1y>IldNr%d7pPS'<!>漇˥=IBSGK§xx q0YWx{My"공s( =ه rq]b 4`/z9F[b[l-"[:;S9 *Ηne$O}QB,d|(5ԯR0aBO#_- J"x,Qb^eSHWIk6թ8iLVnf̂|OC)/VgH6.*yoږz.gi$%#]q=YR.Lnߋ d'̪P5*6@e~W__jʍ&E6Q oIlɫ.L䍨)"97*lb\Д]D6Nc ͑Wppv~:zrd6JC̀'S;G8?s8*hyjSAs\= ִ6b< '1#bJpT [_, 6Q kf~{ՄI%>:tlZaJĬۑVͻo@7>w N2SY+Z/ۑֵj8ҫm]naJtJȯ: ;@ U mۃ](#ʛie?JrBl{N2fnE\(@}QrWgG`檌u;j%c0}H@ gn#S&P h'3HZ.Z1jbi2E^֛M :BWGbʹjJGΙOI{%an]4f/O4 O=_|v)ʥ1=z7 |~,(qW< vѰZ'09 J.ᤵ!aZ呸VO)O Sk{9B1[?0 8E'E~%=rzcəW$ BaFJL2nj= _wVs}]tamoQ Fڀ=+Wlƻ zZWz*^51@!l#rn^Ϟz„-o"An1G@0JI|]\bpDsټxG^chy6q㰗r~)'BTG΅n8xc3t]u0PCrDlqYԤz.}q _] m`ECЗ\&4ĜwuZWW ,"6h9yln_x|4WDt&p9۩oP Iq[y.lx4o^Q:3b 諥o b5|و\AMF [ܞ W. [Y1/Jj%|[1x`1 !eCP0ϑlQ:fAɿEfc-0`qͭaM ^sxxJP b؏APm|Ho׏&3-Y;a/:CYS9'm S$@#; > ;?-sZU9LT1$ʬX^!ьڹnS%3zv pSD=ƎHJIC-&Đp,u뾩+8]ED0SEҠNFތa!ט [&lw0; O:)=ӊ1 PrFCWb1+۪N#G q@.[:v1{KQ 3X"yP45[t&΃ӪJ8aPj s o=Q.ɒ]D( ,R;^ډRF/r}u<.5`Қ6[#Ap|SWhrY(9U&o~o=7ݑpPlw.:5Q ,p 38:c"k.=u?10h %-`li{u{O]!Ӡ7ؖ1,Ϸ1\AIOp,#wZ?ԉ:$A%9M&ۇ !x- %k(< M[ջ:9%c#eNGw.my g"~41jta?s]@+BK:W4]d#)Y., }lI45^NdBr62XHzgsE 5~J#)iH.:#DU( -| XƧu*:Lc5zz51$Elxgyþ![AW܌0-/R]{#ޣUNoPJ>Ejɐv@1TMNȌ $vExjSA^[gjև JV o*enZ7 6|hO6zM8lHj&&AWGUgTwj-y67vt{8mY(qUNF j,jfbS`2郩DXMYQL$Pk6m&}2v2 KCNjo0s`i^lN^ۄZ @mUe!hj/׹ρih3Ȗ·Zwc-3XFE|啡UiJZR?"Ke{{ҏBf#">BlOwU3^K9c$kޗo8GVĜd$ @m׮Xc^}SkB("M`& GǰYqh 7޲,V'H\K" Bè;@FYw&7'],D:p GtDuMApgG{KpҘhּۤpt#ia1!Rwß6HfEC'E6ey_tD5$D߅=)M[=˗D{~\6ϵ'3C5j  b\g<'ߎ+!UwIe%8TpxTe97UQǹMp܊^jTF 7L]Q:4 Գ //t(鿏' k0:pp6mKjc""1$2& {ƌ[8&!;qnZZf w+2W']1(cEՐ@ۘ]PhGxBX' W\=mZntcc ?N@aLS,{w6|0y萙+djyRJeS^zzQ!6.*|[0B{@}BzBZ*GҾOC,T4ރ Ǽ%2nMr$e _SFצq+@1Sw>n P_ m^n]DCJY`SRf(xЂ:sqYi\O ~V4镭DFB6f6D#4RuU ;h1U}O/6)S2[wAI[;]]?cG{vB[9*^UδVr?="!@,aPg_I1_2cw0ӰǼU@B9pGO0FfOFt#J1c B& P+4~!vWx`?ΒaqIymŝ^(L o!Et -Ǡkx*3O" I,]" 3&YA-~s!VizO//="Gk\YϗDc=kBc'K1 `i_ZczaR Ȇg^la*^wzLF6l vd6{8 BQy5"tZkÜ{9]`Mm*sbи_DgRܿ/ћЗ; 2ss<.Rv!ISL 3L~EZ B[zqEѩcQ8-O Bc ^I*iC5тwc*6Abpc;w]_h-͐&+kYTтr&1DM!TB߄FQ +,Z ɖ$ZIu?ISV-)zRoEZtiOp&iU9J%\z/@Z˶*ҩKd܄=IN}ClbuF޶kr IWDiM޼˙b ذQ3ߙSږ b" tGqkO 3~#`ŀQվѸyk^,0Ą{x!;% 4,h&g9T[JB:B 똜[Vҽc7uuL݉3N6΄'*2PflKi|!sqw?_PhVpUxTdBSR' m1C"+'ΣnB [%Y1DDF6;$/UI$,Pٳ91/WCНu\nLGNYM|h ;L<3Gͅ1NԄ]|3/&[Gu,5| p?kr1[weq!Cj+\bŁH$mV\ lCx`=NH>^|xwH$' >;xIr돴ū턨}4M,J<Y/l Qy |y׊Rڬ{ge\A=^u"̏$4C7% J|W|]jV؄Iw,!⡟OߦHTTIw:r|T4&. 3R8P6dwA6Ǖ\T?\N7nL-"bu!dеOxdVᆵaSF8F)/xwO e|M?J$ ]7i>ry,F?wYb$yݠS>/̾0P_~. ; d/P!N!Bg]ErPDN{ Y);ҚaȩG3%+:pd.BPPgzFpMp@'{7 i(պ$A~4cDȴt_0޸B YsfW,nUغ"PT#*`-.U*%Ci<XoǕ Uh&]bx<|h=X W/A$Ҩđ[#ԥ;z64$| E䛢![*B5piJi9׶[{X?=d7(Ds:{˲o zPȢW ǞN_`>۶Dђl;nf%4*cw^ɣm7S;*aQH} hR W:|otm 5ԴkVd:i+kCi35.ȾO64::ÄCb)u(!s:z"Lܚ@m*nNVRﯖz9XSUƫ*E=[źgһm9| mC`&br/([i9զXBE2U\ %PlniR~>$22fZnl,QEelR{S\&ZD4i }rExՐ.V>'lݐ[Bcw "x#Ve¾E8_]_1c`KBT-ʻIuVà<91촅+o^{+ p< js>x6\xrg+ !$VxuLc;y wbWHy7p MtΧ N27}prHLҪ􁔦_۱" qܹM(?1$7 ܶ@],V\( Ȗ\ʁtL=;3\m̺=:r2)`9!T<87:|C͇oK84 fnGxHr *v jMM7ԛO64-x% jN4CQҬ O?`\jp滑}40N҄C} mؖn,NSl~\{̣X8}6kP抪`+W).Yvrnu_U%gӕ1`DT"(1X1X`U'FRI;znk> "#lfMl,eGR&zݘʞAfDW3mwn;!UuaDM9Bp!狟{Mҙm*69ܧ˘TDH6^z@uR e62eb0Vgӆhb1fWlCk %t%oN-A;,gL` ZB(:eͨSGQ-E/ePKwR/HT8R0A*8_XN,J!Xd\9eZXyD;Q4Q00e㗵:#{?)GvtNu4Z#_gw寧ZA&tiJg_tq*ϴkk>}/΃)~'U.?t'F%cLg^XC0YڲA>l'a@=g1B٧DiWKX-*~lob ,*QTlJewG Y"x={v2\ =>7X0faz$P)Xz7?8kFH ro24BMѶ ">qBSWn}jp~7IlrKUD$QVC1f]n9 7Ƈ[("jZOl~g' ˜rTc Ck;qu/*oS uYzAjbv/$^1~D0 bT, ?B=ld&Jd{ǕKĺQ`wS_MD|fxڳ9溉_^{cnұ!;y+FR! >9^IKCqblX&,*HE4EToCR^އ4R^ki&49wS.gqb<|0Re/a[$ܼ8$`y A}W-P&,~3FlmX1lssӆT>_K.|ǭBdp1oڿrL_W[!mr >> ۥ c܌/Vd:BL߯sb^BQF4Quw$=B(Wj8>Mx`8c{z^N9{S]J1?}#~+_=kUYהbd]$9}4"C%2TS¤%0ςzQLORpӕӎ;{?C "lP}'=i4kZl`5ji ^=(<6\e}؈L%IvEBzxRyIbX);p;)Ww0;wXF]ޘ/H-6>4P8E1cՉ=Gٍy;iB.ׯ r7n+P( ґqt8Ap\lK` «'RnȐw9Zw$Yҹa7oeTrb>zf8ey㑒x4ǧZ/B p8N&fA3AT^kOG>d Fm%'$E*5ݳ"Gڗ/Wgusb3NkאVca|k ~݌r:㇗=tOH־뷽z8hnooK>߸/&G S%ZZ8gw6C8 ta"I U@OP;}ޙT<1.ڝ}ctW^8R <lIO%!esQ=._L҆1".\*g# IGTGsϜ#S no*9sAl?Sx0+aCGGa7uOw3 \O{9bcOw䧻a܏WK -R&TCn)p-s-yNͼSZ0sjٗ䬶N=醞ޟdg9Poҩkl\lߐwwoq$QXfO^3H2qV;n36*4hWpVOdw_Nb4*7SDSdtK y0KĶiGa5JCχTs]j5Қw=˭' fGa3_ݜ8\;շrHJzz`z%$.,?zI+BVk ԻUQXƭk$W,.ڭ`{63 Q]Gp0cv ڭUncEtmgW.*_xf>_֚} Ui# Oqዴt&bA%Jt/-,:;ɧ vBF+jG٣Ro~?44DnHǥU:n#E^]gIAD-_8@πO?Y&Qe.Ǖ^CUu\pʭq5߽/e[.c}}۱k4Ÿ$ ۈZ s;~d<ʾKO,bvG!=£ҕ#=FmYI H5B0ɍ@xmn/_;Iggw~U-BS@`N7 8]%sb69aMol&Mi t53.VDSFq/com b~$f^BzmF,V?v WoEF9grJи=Y6eC)k@v,k3~`hf[%ߪ|[r?N9$i]JU#TRgRkTf&|irWۧpj V=0; R1Uko8$1H5ԓGxLgj< ~49iAL TmGGԢZfDӤVyCH;X`in9+Sei^g`5AIJ _GVdBf#ՑI9|tr !ZM?yz  ;EH&_};2w׃Z̊-qFlLu$'ޕwXiRK .avc|06U!JGYrI^-" U0xʋw'\ pmPY*SZut#ivWAQ=l΃jk8RSdqAc&8\jP2!j峈Ȩ3w^9H?e<Z|;wY/턤=Vh |'ޮI0xAj=/t"G5:S%ӣ#[^H"_y)\> #D 4v\Am- QBɎ_ poF\IMc@Ж"yAo7(9‚|Cn# _ƙ aeeQc98|sBJ8M4 ͇!iw΃9BDJSMmD T%ZnBD&^#{H@ 4qt,O&Ƞ1JZ{Z}3C=K8y}~ H0)uBIL, DF_Glj["4c+H8Q4ϧ6Q/q1A9} /ab4* D/(g퓉>=z|pg_8&>8iA 4b: ;TN[3enb7Cg+ zpi(6A!ݥ ЭkD:;tm0jn ΝLc%ųtr8ڧb_HuyK8^zha<6zL+7D%#(| yx?kKNk>H`d+MZҢߺfw֧hxH[1"#K9lHR-4B3d觇P9(* x[ciZy ]tSYIj(/w ,LiV6 . E#@A-kF$Nmdp\a.ry^IB&TN}VĈg*)C֒;K$؅ߵWY'LK_>ev%yK)VM} tˇegY ?$Asĺ^lWQz,mZD^"#QE8;7>؂t@t$"a:ٿiUj.#O,':!M\gFn :a,LչF$OlF=iIlqɐ(0V^-:p_)Ire=vQsI1uWk73^ ] w:!=TQc (Gdҡ'8cmΒ\ЙnR>Vgmd8[Tb}m D@!bEN3k9 9i<`%Ǫ)q6ÕZjKHux銩mrx)gtBv2M"fa |LqoLS|D?.U:E[YW+\B07W3FL9iF;:OȜ ۛfW{'R|KhQU5182A`s̯V"vlUi[bp)םv娴*/cV.8%NcAEM)^}"5 u-4&k2(R(cY7S7\>0K=ߞ[G|)#wj0vN :|!o73PRq4Iu2iw쁔Zϴ鿤o7֝Rl. H.>"]/Υr_pZ"{aWR~L"7g% 8҃@Y07,ILNId9my+%aBJ0pM0?aVZwz;&ģLi>^ssd^`,jAAtj>[b m|C{oƶ=F%jB4 ^: cߩ&Aɯ.\2uJmZZtozR̐2;c\. 0$c$oӳÅ1f`DŠ!Dt`<7`pͭX_CxG`)S">Tf"FwLe[Ne[{8:It +>-mALvցfV ,q\k@AWЃoAϳ&n/KDk V̼;<ߊz2d.mIO ~{ ؄եe^Zm5L^<\<*S"oЭL;-e-zg\[3|kY;l݁/Ob"#Uh'^kx{ռ ごݥ}s9Z䃭 , c;u==EDuq^E(74rS ĺCy;҅RM ݵMf%#rsaxsB l+GîŢ]$̸4Q*qP5G^)[lF{B ڋ'OP+s:}X!>‰Ƹ֐wV%Zvnidi+rZhT'Esg'N_]¦6ITY٢)x gW O%O>縩6z.`fFn7 7GxwA"XmN͛βD㵯ϧ5KYQ: K= {34 e+ҭM(u. "u4{4rN0>'­BcV,5Os$:Lw 7cV.R#!+(=<&K/0C#ݔGfkF7"lJu-p# M:_б tdZ'@tL\׃ 0  edtvOd^[JSuE;00C+TVy%]6CC/VgǰjxO*?\׻>t:ftԣU R?q?VdM  !ɺuF %ԇyzv%_Za@Ւ9 _kmmioh]c/ y/VHe XU`8'נVReֲtԲXioB>[ӅZbH$"@]*\BkU,lfӇ}J:T'anp{Wr;Xj/5~y 9҄-}(U墫  ޚYxa"0yVXLk9IqQl)P=ًDt5=$w?Va}A,a mX!F/b! /fiyA>)pAt{ahq`hY 1@A<_nAgQav1P+sq%i 7q7SE6c1~1PfOL 4e&:KR>L9 w"N!(Uc>㵽gAKd˙jK$villM@[mu gq 'p;#|Ɏ+S@ ϗJC՗{44Wht`4-Γhxmn w\H,hI]ĔN=,h>?Vto%B2PQKq P+ V3Ijs>Tլ @/JUoFs PAt9zy!]7 2H_l~/G` 'Tׇ#zfyi2>K r3.MI/?v:?ˉKγ*ķğiyY} $WrXq[ɥw8%1-6WeyQ8J.)Fz^YqRwX'L?7)EmM~1wy;N!o{! VȎD5>wVjqxdauTYs$rL^\YփV}]Ou8^у#鮊OzJVޭݑ {&9^[j$?pGo5wk(QF!8Ivqs#u&WJO U43@6D&a7MDuSɘ̝t)g;"Kk&Y׋2<_Zu|J~_i;`:u_즿صvM@l'JȦz1_N.H϶ }>i\](ũ"zJ| 0|Akͯa4y"f~62tc }:XLX -OqCl=A4h5˝đ.EG[.LP A )C2G=ޒ,dogv*/y(Fe#ZTs2Y.@.H9%s^r@)¬KAǛK˾! 7!.Y8 ^U^A-c̈K@f%u>v c%v~h;m `4.bFfyP:p犽FwSǨ9g`XcŽE\9uDiƍao*ZkL_W~6Pm^ro&Ojj8틄IJIgT(:b <`$Io$ENi^mF)Mº_mtHa&3!+n+"coAo^UA:`Lrⶒ/0, [lmU5neuFCq/_],6EBw1?!^r,5".(9t2h1 l9f--"NtsY%|\M"rlVDGeYnk qWt5$RAj$oZUPŸPag]lyWO U8#1X|E r]WʍaL5wrP<}_[(`zfk}^f`\]S P'ً!S˥Gx*%7>0pL8Xg;\`.ėū eN]fV`uf@[ҩs o T=?E!xS=Pp2+ 5x G9Jv6ezRHXJ.V|k}Ov_c𡁥 16UNa}`)E8XflG[ߵþr[w8ͮ\ZQQO40y;) 5]ʛ @kS(=#9v"w<--NTx~1Nj:؀*}gp:y̡@~Gא>Ϫ}؝Ʈ 듾ncXE7Ma>iu/!-`x< iL>NВRİm!>u=Z.]O-A\fZW#?Aڿޚ.b 8czaD^{m2$PWUMpDЪЪ@EQLc' /מ+FQ¬އ 2]"{$${fzOw䧝ZioCv[_ <0D($Pk2KdF)P?$xy asoIT 0[.lmܞB꫚#-?+)АL:<67dIUWzp9MqlCŇ Hp"S}w\#%G7$+HXmیnm2سSzS>㱉ݰѥ׈+fl3 YzXCtx2Kǡ{4~DŽ *+{rB-\Fq7!vŒF[սi%bY=!:}`uVЌ2A=10|g..c"~BL3_ςz9}Vx9wy5k"9P:p.ێ,l5&! fj 46F>HJ;u⨰zk,?!u[PT_t970!H2}sH+䰌tXƏ 1yHA7@>k(bMB`'ԜV; gηJ<|cS,-XtFʽKcϟNt*FjMA2F-ƉW>3;M<̲Θ0 .ޕܤkܧ\D-J&Ŭ΄y( î$:?[Tj+JXㆆhZB+i-8tW2HpЀp< pcc-y|Mbfܖ1 er #śƵLaB_,agDm7~a=C)2g-*c[wn#j2η' mOe|5 6 kyix#7#lfROV&>Rt ѵj;(4͌w~[+SIoLftIg0F6Z`V˱X`oPK *T'ۼ}.2 E!K^ AiuUPKEu#.QDB<\xlK@1J:>>|!DܯG7ӛaJ(䳁}XU52K UQXṐGɭ/E m$U7S쫊k+\dmq:l_VuJԒQ<-'b)ukO}Gm>pwzlx{nӘKulXk74d/X N e٘LZ-/YoYS2zgpk֔k`CGW zYEQtmLnyaPk/*SuoI]|Lr&q_Kph NbUk])۱GP2rB@|r!x H WZVdY\c^/u|y`Atjs඲M]ѺRj$SԂ:sO13%? ƒ -myMm"Aꁘ\Bޜ#\ƪ:Wf(%𺕝WvI u$n2ET fCoD]EavUaQm=L2(3LY櫆h0ZRUycv%)NYt<*AE\(5Kdn5 t^j'}o[[^X9}aI W N23V6B^F&Pmc)b k8%&23N(h2ݭ ޼0DRN*L~3E Z2Mt795sZBpvFZDJl -T3[ߏ%qb)?vM-B wm櫆2My^q(/csM\=O~ < 8}l3 {b#5[Йi= *f)2s,rV;#WƟy5l5@H 3 |yXONY˚[6Ԯ;5. SN$.l*E8ޚt23˯(Wq)ia.:|b9;<·EtqO`$2Pn~̤jcwW&֫]gɪ% < cW퀗ĞH^#O5nL?`ЖlHgA-, &4{;7#"Pڬccfg$Smqɣ.0X^-+!@{|$=ҕ|kH槌}PdKygx'ok:_j⪷kɫExL pUݧ.^ WPVOfڱx3Kz (xpI6 ! mYmZ9g*; L["x%;]835˷*|pQ;B=Q?̫"Iawooh'i7K!;5Zu/O)FG o%B.Crʘޕ(f旯)POWNP R<8i|C#8=2 W7xgLJ!@@vZhi[xGR* yǝ|sY5r5իy6.zI8\_iE>3fKpvZM "JXtw c{j 1YmDrnhQ qR* ]Jt Sz+uK^ޯLh1|ro9r %FtTE?3@wB>и-cPJ.⻕w{5V\R̥γzCh rILF~EIEH;gY>ڙcN7u\J DV\c}n;yX]5Հ^Y2/`FxhaڍjMxfWP-.Cp`hoSYIyG)]u$ !#$1vٹRs|dfMM~b# {MHqH{:SYkR}%)IT%OEB-`njZ*#ËZG'=>6T5|{J^-#Y ׄ$$v/xkI\õHjS% ryA^1,, qmO3Hhb5Ԡu=WDك  yE" \#GafUf[WJJ#Iʟv^.Odp`(uEG/&k**< 0aŗN-gѡss@DP}{Gپ_%flLk1iz{Sqn[X ɏbSON3f`-Uz?ư vv!HӲ`lMLP)%G%ezN:NB!ʞA i(?1C;J[@ZpL'pEH6BS?Lӗ-F{o]h"UxX ) 1n$[TQ%ng_9Nh0 5;#&Ol"6As"%eﻢwأZ,%i<>)#Yc p!94 >eFk )ܸr.j]ɴ!Q M9 f+/L,W^󆍸#Ŕ>fj `LYmuJШ؞kM8:z;=Ez>)y Uqeγ2A Q@p<"y "D/xI3AD$IHw/ROqiO+8)Ie,%Wzqa8Z.l8T{cO pMK,$[iEuy 1W-Mp+=]lJ1wqu3AwR$ҭ)]X$ND"1ȅ /tn' ߈X!I/E?/B+[l#E' `cSiH;5vϫܡ*DS~آwprbH76 Sia_ %u: /;*\$o%55U0H㎁"IuJc+Ѩ?! 38OHJ^:,P˔+/F %DBCoCk{'a#aA$Z,´jDAu16NOhMQ.SyMhUh և}Mq1cۺd()6as}7U^⬕H:ó`x9JkPq;oGk{:{eQOf#"k@q$ôo2z2xo?~:cYc?HK2ʫӠc[bJ +$`;4@!M7M>t6⺧͢#d[UTyQ}EZ.tT)uH7=PX^q$H ̣{tNaByK&yUy aT?y T&h[[ &ldeSņ0IlDg&)%aR#ap\>?黔\q="+{Cx < ;U[fYȻTjR>)jyHT/g@tF@A3̉r/EcW&gs ɂ7|f^i'MNJ3}y>&fҔ|=k3WH̍])|t俨')lm7dXlH,JG^no9s_Ƃِ^.`:AvȬx25Et99-WҜK 1| B"1b{tu/]b,mko ?ioܨLnxSNar\v/ԫWb5؝s?ҼZf?CE%Mй!ڬ/ 7{ͣ&N[h3sgyϧIi>9HxD_iQy)-OPS1Ҕ8,)*2en锬Hy[#.ICv m#ޞF}ǤxSfhr~@oRJBG^`bT[ I \MXcL=?~浸E3WۺҿпbHS[V`v -.KPn,M(8.JU?oU \{~I Me>YhX %wxP2߇dN8KnO;}vaB-D[Z8,Iջz:@9}]OA1eZiY=ɩ},:1+ޔ ?Lpd _eLX!W"kLqLqU:hAсXH,mTӋVīyyR);H^WB_bIo4IP?'iZME D"x.2r墂?esAd_?LKW6p0WWGW NYqd鈻c{`ޮ\A ر/;6A$̭Ճ& kd{IKW՚Kk8dIE<"C]hGHO7Al?Wf(\;n,"܊ZQ_C"Gs\PLz}%qmv }ui{Ot o)>6vG lz칎ryN7 |EV4AՀs' 5;ñ8߲e6S Aݜ8C*BJpQoQc,>~;Z݋#15}UNՃڦ2is=I?}ZVH+C2Cc{>T%>X1z KbPT餚lhuY*,ðQ=/%1y5<&d~g *mrҞs 6tE my7 %Ҡ3hf5z (]k3i+8rӰ$vYsGO|}8DP ثT|xPbĤRT}S`*YB9) 6ҥ6C m~,hG^%PtXM~~WXHWGq-FR)`oaB65B9~Վ.XO֬wIq@zÄ-+qB",$ ]X ] Jc-䵭^1YĄSt<.I{ogxbc^\] u:3M2R5U=c1e ˋS&` $<c)kwЎ䮆 ΤjNG}R` la5NLuy}~;]ǒ#SzJ`(?Ǭ#8ftxӷn"ze=̟rnBf;ՠ_5d7K? Łc{I+ v~˫&lJ†IOY}v^,)ܒ"̭)Nv~<ȝ4`ɑ?ˆժ1t3 Qa:)E-M8iyw=t_ڀ1rXZ1$9~Stk+f}\Bz% F wg#<qAᏰO , )k+Slh8+d#u?ş "$E<]& 'LT1~Ub+ap յiU!pKP@m' zQblWdiMdsX=F&پP/mSﮧͧ]R6 D.ڎ!nWlO!&U͘lsCIZS=U#b6q.ھOsKVx:!o<rd.h,L:nV8x<7RE!^ӦƤm^; ?)НȪEZډ>_ʻ=gwktsF"5di[i$Ym&ܮ'jIIaH9.l  NU.`ݒRXX~P-C)}չv- m֢_S#6 -eP^ڀŹX6ˇNpݷE9e򀉿>}=7J/nҳ!eװVPv]n!{s\{_K# !is.- 7bYz1j ̹׾$ZVfRs N?`@E8 Q<2ǀLY.+ JFqT=n|^HKG!Mh ͏M-)tRUϪL x{YQW|ؤ(PcR/ uu|Hp?fgTTni[oyHSdo#R#P5GRF$C_dBgHc5a-b .`m(DaulJ&}o~.S !DkeR|Z+~/. BڕqhV:ʉ/)r_M)k+0Sb 'ɑkwGIi OM픃Wm *h?\7Sa$հB.Z'9mg$o-Ed7bs&QH/1EMD9\b|L`+5ڼ9N?J>(z:`l)A:8ﮒŕ{U,|VfEPODmeDR2kJ(Wr$D&86? d-=FfbG`̂_ZD|!R_0 nMUϒKbֿca+ LZB]Ш= ~-HPª\!񊹹N";`I,-jҌX֔C5GLgk>z6MuMX{MM!ޗuCcr2-]z1)2[ͼ15u@}ic~~E{T2jAfVA[dHQY.,Qea0-yzD fZn=*"MNcI쥒Hѥn{ΟrxA*X4 #Ұ7?=kPHf!]+XXb_K[m'7e^, W Wz4|QX%RcsLԉC@-$C/ǡKuMQ+VǾ ^-*pթdzvAB,3/vC|' AR1_kuؓgV *3>UdǵaM_sdrc g$YB/}0Ei+j& $'#ejی"AY:<> $n)6Xg 6pSRw*rFŠ E<'(XXB~fҩet..5ms"o !_ ÿaGU֔A:wWt =}i_ǝfGގ; w:}l^C93KN[/p{`WdS#XVBgtNZ[X::hj11R=[[hR2?3B6\F. X&a2usҴW醗]٘Ow[Ƕ' o? QvOyYL eh|Vǩ S &k hT#F>f]&k}K._0z vŜ$[~ي@7D^CH G{9$Ҳܠ2ZH `Lcg5qdS +6R˵Ómε=@O}V39&[Ua&b$"5GK8oRwK`u\3 -^ؓŞE:BN|JtL"@lIR1KO˭U)\U 6,!>)!saGHiLTc-$s-U Lar^nS}+ ڈ>X[b"r 龦ҩݳrB Q+,ӲvIxeQ8Mْ|&>hh˯#sCjIGY\!QaNt7.a+PStOdz쏐D3/esO[j9U!F-Ԋߜ' yĹj-rf ZD$2v=~'BLθia4 ; 2r?1lG/gYWwf6_2Fw)_ ?%?GgM=X0X;āMxAng:yqДBޑfN? 4ÎSlE\AЫy(1C@W1[,}"\KJ˧'L.P ~րGsDpqYZ)5)eB&N}jU%O1!в:A %@=ZJD. Ž9-,'NF?Op/>Vky&{ (иB 3!]7v*k? ^/o v8PN@Dl(F.s %'~nPC0E禆79h,Qϯ`?ȉ%&^+(Y1/3+}:R0+NiQًIm:Inr"X嫣"bC(0y\Yckm-5A&YDQ_mglj]=UoKRvm#JԊ!ȧ]›),"A^̡5Nn\:I)9g-XD\&[-Z{DR oi\1%p4ySP5I)5N)T^q$ ۘހ?1t$%_Cv|QZzOLy{Ϩ8c1͚Aj:-6$]F%fdi q7"لb-B.EC:*sVtDׅZ?{M<j6vP}etj0(缐7IyL~nlϙMEhSi84{3+n0_fre`U9cӼz+)6e%=ڷXUlt)HRJ!aQ.tp⋣[%Jo+kr% c/ 9j}46*bi揋:Ṛk W+Q$q&_mٙE$Q*6n\jٰZtzÊ4Qϕ (DQ;:W0$*a3kbਧf-y̳2q7M;/H.YIK$FD>[fo@: )ᛗ{&9YI00UL< |PEzfEWHttM/=V.VN7s׭]s+'N4=ȂM `P|RJu)!R$g%)cd!p&`Ie™ F(me#STFp0 3\+-Q(Ԑǵ8'y1ϭhK_jK'M$Wp?EwÇBu> 0:}.񾺜@{Ax~Ű"3iJN3%sूW׮mK/:) 5QQi W ;lᶈ(:C B[s㮐.zf*Яd~u!7(A|z+3zqk]W`b.DS{lc%USgwbMYb륒>-~(:H%@rJcJø=8s.کr;qJgY%Wf/.㮥#>DSx/8InYNCFV@f : P&^cդ TY(j=aI0Go[rzSFتcX=8_h8.D?j[ʼ⪒T^1JF{['MZc]bx yy4i 8Aa L'ׇ׵ln^6`?&^v!:8 =ym׏:쇼 ӦU~x,w Y'M5~|I7hc P*RA^ K x_F}9uMw/+RcI!arMlѬe,\i:GQiH XM]J2X_ng9zŨ^ sĀ^_86X;e9{kQ~y.KoO6K5heg!C( G%IGJ(U:_}.=eSKQڠ-4)bX&":JN9aɬ"(Zx|A΍G0/̮xoSq[*Vp<$nT@AƸ :~~vRqnCbMȸp\E0DTJzץX:\%E*G9Ctv,ܽ^mGHv3x]hh@Sؙq`:S wUv jUwGˬ<rysm)*ծ@M9SYƏVxv..t{d~cvL/uhƩ7MzվLH' .YC^8s+!!\9 `.eoͱov1Xf< d-&Xxd 9z6N^\KMأUt*J|sŐb1Z"u2Pgò,b=aI 4T ?>w=R׾i+S0"ɢ9'OIcK4\hI s?|^&;b߮Z1WDD.@OˬWBGKiAyOQN}츇,{19l^z*/99e~`Z*?ˌ8b2".?oԅFjJGǹy/RR5Ȼ ,sdeݖe `&8h^>GXY"9T+Ә1MBO~6d@Ur1ɓFne"۟ߦ(4gS*P(7Θa BxO>TE>CǪt(Y Q8/?h(ҊJsG A MJ¬Ϋlԅz7 ko,w tz"YXM_T)?Q_NZ nmԦal k0.쮕KА{>fdd!MӫXa֌FѸN5 Waa3$6Ùr:5isv1^G4dPowBTp{e,[Vug#ѡx;X?LkSR_^.['/cPifq^*ZD: 4ᔙcmd =fKI6s]SN)koZξhz $|K5W(V~}֒0B~=Q׵"--)w8;Қ|k-Ȍ,Ҷx!V}  &֌&4ޮgjo7*b-)`Re9dN1OfYΰ\Dhmat!Ź'LĠvJXjcrZbSRBz~ֳoi0๪ΰYVMۅ>N Q>Vx98@bnɁ)(c- ꡯ?~lr n0 <ѓ?NP1L7K<4fׁLݟ4ei-M&PO%7-V>SHKr9ѸKk6 !֪S۷ZEзǒ2(w@2 vqPH 6|[Pkmg FϢDǗqYt{јÄԫH0 ~2B @~ n/w?7W'$5r086 ߦWGlĬWGg/Z;/.tNK wm$D:KBH\߇Xv=ѸGh; - z\Co{l kxiRG=]~b[<5vuTfV ??uy{FQ+) Sc'C´O/nbmcȠSDqG8b㡲_`m#`HORM8ez晍L8B)tBXyvBR3XQw݉<2WYAڡ5|'%XPD-;IADs"F5IbǙKS ? Qb,kG& 5A l R:r A; KJ{Ό oD_٦%,bA BIA=V\M%nb J4b!g+p駚Piz"_y/F3#UeEo'+t',_[r<|Qkg+OBkցZMW{QݞT 9l" wZȄ43x#g{*T^?z·scnQ YDrjX1VGݙAe7}gމ-m0Ly fց=9MgMqmM@1dh`ԪnE8T ?a TJuC-GÙ-fN͟ bu}*|jBҙ%'?Jַm= Ŀ/Z KmaS7=au@'S#_uksQ!d[^x\?kxU2S<)dj3m:r]}.T1Ӹq.>tuv.  EVP+& &Cc瓛o&˕OrWenhCƞĤ),% 7扊ax&3~/( &+h*98L%iۭb:[#_^iAϴ]qJ\1:n\:v;R"H,H6*֙ZP(;61&n  )"Z8ʌpl3`cOh wgwJCpj}TOaU8PC@t-L܄땭uӔp[h;jX }+`/BȓZ:Qr3i.KFÛT$j\m}>y!tcf 9-g^bCLwrkV:zŌn7 1j$[ 97yJd 7>mk3ۇ#a 'ۙq+,:a6lelحNaPs3@jNtYl,o|gM6ܭpOCЙzij%D N5k~p?_iOvlFe;|)/ p ý&ZY;^) )@xdm^{suCwd*uIZ9-gYfNkVfO!Dv#A?,̹|̈w隤v~mYJyf f~̠ ^ k3x6igo!^I9w<zX4O n'MuRAߨ_LAݴ.6l Dy/c빺znyd \qENJ/ٿ3G;ʁsgf~RTH 5[]"{"N4*Լ- +wc"O?zooIԎKz:0+p>P&'m :l@LýQв͓]VXn[,vhY7<(0nDO*uHX~FZlUy%y\˥lw[ #?BZ/uu;~S rHN-޼8azcaK Q/`]#nbb&A_47(C ^u'HV6' ;C9F3ҧcp֨5+omd!C:9gib6 X1yaviIf[MӝGEgMI&+q d-Kf(g(?0S-e%e9p y_~? gc>HDDʮj$ؠN5j]OГ.M~j#dnh7AxXXQw|IY}.)ƗmEE07q~uɡ䉸s4w0f^n[ycLD6E]N`,^XA1$*hh63 s65EfzbS*>@<z-if|Rȩo{t&ak$*њ%Oh(H\d>bbeyirem=V *5Gh glj?Ԋ9 {=B}u7٢&j/ǽ(dbd&TͬD􏱱zpf<LX@9O;$qg!'e5#SIstZ"ZRd$er5Is#R'JLX۪s_MT`KPl򼃀&8XtPooӏ=G}$;ٹd`+ Q~[E{o𦼦J1DF+hîl3WxQ|7rn WHw9u 4Bf2t9/ucHpmb82ӡ0G~(Bp$ڿ%i^+,A;*`;&svJ9X+TԦNM"n^Bšǯ-}11J+Z#5~I Y Lvf:*aըҗXdvh4Ik ECRrwj5aa-R_=x|7 f f†nKc!U !L gUD&Jor rCY 7eM ]J;.J?lɓ:ouQa/JcX|)E{r3GzBkK=fȟ_ػ [c7,vLnpKBi4\C+#u8U^:L-#˘@).Ą>(qwl,oe7fL;9-$A"Ln$jA?ɟHvhwB6A;Rx<2lpT}ƐZ  .,MU氜}mskv9~Q{5>6;Gq*EjDk?3a O=~1{UuK؏Z=w8#L9HIz6YOB6_}Z[;؈P'(!iOL lي;E"fEȈ :^Pye֭y06o?65I~Z6ZQK֦)SI,^CoDB AC0+(#>T0;ZK:[hCn|kE&lyCE0OJ0d3 (M/L30YuyѧpRNqCȭL}l|1G{)?-"R=/O5>7tYBu{1Kq2*t.ӽLy-Y> :Y7pf]J"b vE0nY0Ę\xŇ,2n(AH&Z-P[=>oMdݡsUACmgZ;hMO CTa"0(N]bGKòQU;r[&[wכX m0/`f[5ȘdLţ5DߔY#by'|Ӭ1u%qqfp(.G痽=w֚ 8@?QxO Z-%=*b`*ӷZ;VM#L2yuUSB-K`3B8wFD= 005̕Uo_w gf#̡Gi¸cҧ6uOwlWbJЊ齆i3y X JB㤐Ao$ޔ3- &F;"nmaTJexlEf$ZA%򻯊4ɐ/uUtd} "w$UO\*5y,2S*E ʯАgSU3fkA+[d_3=}0'4;݄FOl''m0- 9;%WJği詇͹҉kXk[A3l,6V 'oe8{ba&D K}/m_Lq)PÊipz"]0cƵzz{!! 8{uػZV W_bڄHnak'ۢ/U*dX$6 Dum w"Q\Y':D8ӝL) XSWuspHbPocGeGᚋٷ_wJ 5Fև%Wэ.N8%sK[b;#AaAvObWEpq)/X&Q_p,fбFwF#&cHE#:@oM(%ג*e f?܏yw]ΊMᔨ+6XPl!LmЏ_], **^DƴL+\ȜYSvCyHԖ8H ըBKHTȓJ-wtYJTthW8Z,bW/@ ϷL"%:c)˦7*= VąkoL+%"{ܴSu̇wĄKdа)νtnnQ,iYNi\l%hR6d+,&3L.SAq-/qMDG@y)$B*| z4<-T=4BW5(p_Nkp˟*v~U=OiF^Ȳl @n{hi:ۘ`S"};lw8詍/1W6h\#j滝̦21zq~Z1p6\s7Pkiaa{+@swb]+c5%5.wbP9 KZ hA@tup2GXx_uS[{Dяo0T縨_~'dmg1N'2i3[$ >M|;!!6Oӻ`?m-2M$񫦰yWj"M 6oC~Z=݀][l$]0ęϑ9((+ UǧM4S1ͩIɷ;BiOM>rjRƜb (G.WБlMM1;҂Zb4D#KZ ج}(RM?itƛ?xH(1q+|K8l+{4UG36ڹGJX{Z!'* #IFj)r)`Wb&Z'x1gT$kJOozy8Y][1IR'S'b!lpR$G9{ .F[YLs3X^+~䛊F&a Ư;!/ym^x!6MUfcViMeuZ\Wfzi3|s9 zEӼ,wuD\TV~f=u&M&3>?2\ekTb9fݵnr1;1Ǽ-^@ʢ6/uW>ƯP^í%47-|[q\RGK7 LL8wU6~ R6dpɐu0!(|jЋw>F ]+z䘛vnx߰LpJ,_rC:CO%_9:вMٳ_74"e]"8b0nyn;x> vC 5*BOSD0[AapdRATWS©0(DlrWF)mCoDؑ`GKIBUҸҿߵ6bսJP|SK\aKaB6%Y0ܖQQdžlOg @%40vY0~? Ø S ^=U,YҗίYwocغy,9s.;?L߸aO+]W.2(^ XwZ !1Tp\hqj~t,ʠ\v!bJ." 5f2f*'^tau{dJQvPUMGFJɋyCX·oQ36cZl(*͏]φv W켆G n=޶My^u%E:Kۅ'\r]\B{R`aSFŦu`&UJx0>Lw qrRizfn-7k FˆG75qډ_pJ^"Lg CɓB'LYXfKf`jXX#yMxBVo"ag/h!*GZe]Ԗƛ %#to>9϶jpᏊF"6IJfmWTX| C<UW2@_~?ȲS ,ƿC@enPۛHU.I -cZc\#pv#BH4. qy.@A|,ܲmw|n=g~;"?S-tGZ(0‚q;̸fk#T<:CX;Izu1^3r6MÑ}JuL:[a;Y.ϞHe1?v0\ ɑҏxgKu"»" )}k?uYa ӯCWȔ`fEb, ?r;TF&˓s\藠1$HR{d{$%fF.6 \@s }ŰCJL3!BUHqAe\!쌕38-Mw9|LA [v9 ]#\^g"EGC+Rj$ ;`l"u!dpHW LaԪN:Wn(]ɯ!z:$.3j[qߘR[Wd3$V8`si1[9}M/,P8a" t,HRy|7͵O+6' jt^I2ј."$͘Nќ"YcM,&f. ZaS \[/#_!{rus: d6_7;{:9SU1 n@5__eƣ@Q %k=+/K ;k*)`P ɶ2,b;9jaקg,`_Wwx}t .0:%mw0z-WHu_~1 +%ۤ%AViC}E-=˷=/7 ?@UxiRi< qQ{vmnkZevI|1W>6, MEi m5¶E4`0BoL@i6|Nӧ ilwQ"/M+InCO$rP;d7N/@.W[57FecvTa {N_'ɱ`cwY!BS 6ww3,Y Ӛl}փtaТr!$RJ[1ˋ]g*y' fZr"\$Q1׳5?>h{07 K9+a)N؍C~ t%!JU.<܅krdܹ (HQ_n1  TE ^%art7#4^Ev{RJ(c)Ix["n:iI'"EE_G%4J7XC.?iD;yIv% 3,,$H]DzτR9啻qi( ?zYSjp.Z˭j-F&(tpȱaصz`-KE?0G' 5Œk=I؋4Gۙa:٪p jp! 8Jl> ]ʖ{4dkƆY hL&^;u?R˛k\B*&I(*{gsxfV+V||qVrG-ޕZf ֿAȞͩ>ŵgnY C?j g"ƳD;1\b2VMQe!r4>>﷉|Xq NDZV.NuFy뚯2y9=ʎziJK3H%DC[*(q8tyښ &tpv'_CSeFF!K@hsEjnOZӦhFoo>V]s\]Qςi 3i39{ ).+34J/(n;jU.Zuo 0C'>I2;r9)gj݃oeĚHDTf;~'wOA5=yO1t2.8BS婥f_b9wt Q>t9HҖX򌕪(K]w)LrV[OK 0l1dNuk뫝xiU(r6 2|}Uy(e((Hfϑkp"a]4Uy1FT/w7'~E(ީ3UcFDI(PikVɠ؋F&W[7XdzeP cƋu*I-U5 09w,X_4yQ®yP>t|U ^m/4hv䮈B/`v_{bfԠk9f-+tسnF3ޑD0!ߔq89[V Bb9n}h#ڢz]r{GL\0(s 3M=;^0`Ox5ߞgD!;O7]ha YӶˁT:uhrET>Z06l`TIDu02)ǵ 0%ұ#;^UUn:J!p*{J`Qk*-1i`{ّΪ&|0Z~өeq  V֫vl#GwuQnnyIy7&i]ŷ줸sl*e 5uKn,0IH%Ñ!B,nHiacxQY1J2ɓU02%97&ۍoҦ(9Sl%qҼs9:ɦ՘A)lpE\Vu+: O}V">QISU-<š2:Ӹ7*QX&,)1U!C@4_;ZiPܱЖCA(}&< ׀oWPHkշ!1ZʼnюMҮW֠Jлb?Wy>o 0_zA֛9sKM)(t :c+KmIC_e)yprTqƖFF K 5r>~j4N4}tl54i4h%`lfneBT):M[S<k)S !h[5ԉqҙ٤7ɛ#< !:CMn{2TTAs#)ݷ54¼5(/U E֩h0qy7F^34jUl P9u霨7)6.w.Lt+x^#Mmp Mg|ƶPXrs^AIo Ht5L!kaM%h!_yrӧZlTd_8j2HG28 }o9X^{S"0w=X<0-N3|B`}ȾU G4$J&9Dnp1%G>{ i,SZ {õ$60hyВ ] uPdg1Ōʄe[5fHvTQGgt6aزr"5R,y%QuD.lqc{i?!`bJH)tOT~x LawXuP SGLT̉bwY/kJYMR߯ )}ufy%hҲz`c$TuD'$\Om96QVtUx7v K^RݷUr>m=qm ۧ+Jp֡:l/ YmAoI(Eޕf;.Ԇ.ejQ^`/K NEG||/(Jv+gdPdeysdt \Ud]l!#3tѐsA<:T6IShҼcdDVU:sQ'Ziy.\NTeE򶀣;TZ D5+ !jLfiSv M3 @&JsЇܜ*jPq%@AZ[c PYHY3%b(:1y=?&u0 xpg4A~Ba\S D`&fiA{HRHw/ [`CmgX?uBkv5MNPRak??tWr㧴u2 ιiRfyC7[ =0/0~p(QU'b-(H ߷7oLh\aid-<>U !e35jC\*(\Hp\ d$;Uu[MÍd߿6vX<. P{~/9D[*vbqԇ ({ޅD!K:CM;y'.NXQAEEq fsx.4%;f/}vs(4SÑҙ_i袏o1PS~[BS#Kb397bb-5+ IξzB&9X8vٸ,*4ܤ(S(AXf*{9}^;@Rv0C%եo:6 Qxv[Livh8gA|l1g r@2A3[-Z?woAxoQ".ƊپACD%bIԜ/UeF]9ڍ:iqm7}B\T%^:BvUpD{~%Ӷ7,$T|4M-p Rl&J%~[ r|F\ gn7" UsǚHmv%i7EG,]U ȑ蔝CaU,"Ԙ& Y: 7CcC}0 % wj֟[xOhX[gdG,*SR ԃ›$}x5(!r'11Q=110R. {{҅݇.m F ai1T^bߜԤs_q])tSe=VY{[8,cYMn_d4BQjBi"`ifϯ,:x4u)^`7A=DTDu ק#&&PySdai 1Y E5lAwO&b8mQ [>?;w@'GBNx$ ST^WEֲ/M)^{@8u}kϻh|9̰=/|2nOd{)/#-P`T/La_n,>ɓ#|w jr><FF?)IҝYIGóD >6%&*2>= t=N$E4S6zXB\YKJ7qv#ZI-n˘9y`J>gyP.JuHrجnKifkB8Ve{ήױBhO?x$$$12nvGj}6 ;3JDCA Nh|PI"o89jL:gѱ$0n L@E( G+F/iY"+r՚nu4،DH1qbf؇y{82l |%H\Im"c!+fs~G_W_ɺH DtN_PG[3^+mI:kbK;x;f !2g.$~qNu*ҵTVGzQʞs^B #I4NW}!tQ_l&jC&{]gȓ.u>N= Ϡa G65 _2'?-3@-my! 0| @s4H4$i8NO)YXD`܉Ip@2|?'?zgFʏ&-1}xog ~t\{B2Bb GŘB҂I"!"/@M/ŕl!<>ff& ZSv܈o+6YT J ۣM\RłOs % p)g}DJZk ;^!-Fv~u;yW3Pcn)RےbPwmL ޖoaQ"WsÝ ie{.{\mv`]}bm_ōΑ[10N qpwh}oZ\a}st6R/*zkS4ږ/ا`'*k;:gp+? =91iiv'$-#O'Q ly*ECbJB՝Iu@(*’G#(hq'h 0j4D1O*T'b0Ƶo/&lu! *hEmt7x }SE?S!T"Rʕ&ЇpPe ΌSlïH˵dfRW@AݳLe);KǿhwsBʊ;flWFjnPm޼~L":bғHw| ܓ5Ϛf\\z g6\piGa Cl#I;h\.8IIdVQ-Ԧ`7O Z#xud :ƛi>m,g1 *'9*3vA=i1b s8VKg&%7vNCTЁWV|S'|k^̾rTdsP5gJ 5 !G@DZJde!nZ UL;GyΡBBȎ{ /| 'ICp[´cI!hi"GmV*z %)d'WeQ;xҼk9 qAQcAA'(^ T6!\@7d)vYg"(:|OF8WMFff'|y[{T wY>.F56rԀЀ4SF..`uh x7Yr&: z*4Kj+j4jIגp.ѿ2 7V704)Lk1۩ ΋@5I?൙Py/KyƵg} 2$~0uH 0ԟ}TS%_sSxҢreLh2HH1f+w,w!ZrW^I(SP!0ʌ.z{_v 6u'xOI$/9{/Tv! mArDZ "]œ7oJ)ڋ1lvs5k^QpK.῀%EsVj81^,LȈg E{!PZ*NO^^NѤEiB> ȏq\ޘ5x,쁊h JI^1f_ȕ;RfJExZާNGI! t2UP.{Hq;zspdmYT14ڌKIAFd}=֬Ƅy 52;6ABs۲E)do,тxEd?͢bBo4q\$-<(cConh63 ȃ $/P&|Oqa{60b4Svg|;ֆ*?ĕ030;xW[]8t`s,T_ڶKM0/v$)G.EdJź kVPI $TTp+"ySN9 ",Sly  ns&~HRz|_lM,`*@[sfؗӇU@>2=s@S<(Cr̸!c /&Wsq҈_Ka zeDE.h ?$3ŠD_RNnu FڹR9C l2޼cu!,!q q 3dN .a+ ljUyߌ{i2 2=>;ѻ\D^PlXs5ŬO@"cAuV &G7Q]l޳K6 jw Bj8$˘vGٙ@l"狑_ǧ7bk5kcH`2X| += 5 cɿ@.Nl-zuxlWCuG^}YwÒ.d2(26o"ʘ'x Rq= ƽ}v"X05lV063UP7R P;uٝ@nO6?(x!*:(H#zkgJxԼyt+SAC`.H_[ 5=%p E.PzaEϡh!\^W3Eo^9}bZ"'uS3;B!/h,OehNEITTH"F$KE 3^g{򚼕0":F*YyI =SD\!a;i;vLe/ߐJ`j>vg{q$: E_YÇ5f[0YuVxACeھTm\0ݒ 7<7P#94AuicSApvF*Iԉ?2W/ hf&14fY&P.>~wχ3w7`ܩma({ i>Q1zBH^mB*<w5Ǹneґѷm1R 4s[ޮ<>ftS!잉t ؃A͐ FqL| KThUFhHYaurTs) c]4R2z <#" s b< qZ/Jb,-ٸ >dLۤ,;aͦBdf5Bouy`$ Mw'M x٥˭^?1!F^za^<G|8~CW,Iȑ!ֺvZ hw/ww'.#l/}AmgQAFHG]M7TĔCqa])ZCp)w\P#"rD+;]#Ks[1|.0xiz KpgZ|x;4"ǺP Nъ͡9 \r'~j6pMyh]媛K+DϺ7ciA946a:gCo2ۇ1A:+M^@uZ> '٧=%Z@!GԅaM*ĤXiy<*Y##+ JBižbi7 d&mԤ~ߢ>e.wڢᜟx!v-s9JM,d`<4ñg2!Qo#N؀C$׺@eƈ I;뿰{X9lũ?R騖]A X(Cd2:3!r/x3ܱTH%m9k}i8XlCg7eBͫ܈~_ .pLiKUQLަ,\26S #IedLU+b3/BJX-p3ɞ>q* ihɝe)sXf)|{F۷R=ڌۄO[)p;Ix N 2V9v#}Fs|hU~;E(B1V8$lo>+wl m*g{U\)Q,iZvzmq8JF8PM'X1>x(;jluΦ %xƶ>9"-ںk j@Jj#9^wgӷ.*c&&nۋ6$7&z5)҄w:!Kd|\-:.JZp**gЭxCkmR#MWCK%\?Eipa-ZA\2 z .=lurQE1E, Onմw Mܫz?;p]I&`]6d&fջO8 x}Z 6~.W_>p޸!=_P ]]99lj0pj[՚79\^sTsUPJFqߌ-Jh3rcs+_\%"F51${yb$?h, ? \|l+D޸Y.ߨYUP(c#JUj羈me' ZXM44;r=+Kd_F V4C /C`:%^(.O}w[տ) wR7i>7QLnJHP3ۆQ E/ۿiTl Ze!YYfj*&Aݑi7v^ qRdH-;fG“_pJ􄔟LI=O 0=0G:s^!$Ҡ C92$ۤu_ܯ[5szh ;8è}5+yRf=K 3 gojwy^S dʢy%)Aק%q*KҎ耏1}BX\vkdW$׿H}H+,tQU+|,9`u!ﱡݑ*Qb8Y[-3m--a`{J|7MGB?x jP)ؠbPڥeUAK3)I4/la 3])DSԗ>VQ}!/,(sNm6=, +nrqsyې%@Ǧ]!0`J*%RoKrްl:gz7$ifW ~,UПqNU߫\P-MfiS a[spp%`^ƦdnsKQ2,vz8xuj_~Pu>l&H0(haҞd,&BD͙]´)*`mM,>ii?܁9ao;v ~Fjk `bK"]1ɗ<@֯]{`.K@1! @od0@}eAOlZNV-aQ(Z0:8t9:])#Ԩw)#~ X"~G1T%z:9,u~isAU<$^(Jge?tw8m\ߗB\ɶ2=Mx/(7!$u#*z׺e})!_"x{n') YޔK\AҠl6<~4>!Dz Uˬ "PO*OA4/s0kX#;**Af="}#?kR" lSئZvH(C*iv M+- Yy3N> 9܂if{Aj ZPUlHwװ\ 8T-ꄤn w<,պ,1rät7w1@np]k6.eǟ(]h׮;0.<Z@t%o>@B?{!Ykg7'Lu *.c~yEXqim s:&5y_>b{{ tnR)p6/!pvi~O> I]3fDCU,iz,.в㳗i1ٵCg70 ||S]OC GXK@킲i8 k7aѧ*pKMXvI0ݥ4|$\+5R D%[|3,jtUT;hܜHkPc4qX]%n|B!xjYZЦ}q6   2.ȇŷ; Yҋ)^Cƫg6 @Fn1+mhoQQk. oզ*(Nܶ {Os7#Vx\{G$ x-nt<Ŭ=Ŷ ۊ[اs4_G&e] R'= 46t"9Ԕb5f;Ԣ戰h_"ֵ%N.AݾP@3u@$/N@ +H0~% /0gQ124 uqdbP"Jm׾NG^E#Lj*@@]z!yb.?Q̮:#f=^,cWy:(B$vu>tp4G9i+\&>>X[[_jK` ḃkm 6&b7~ %dQp@k2^TF@"9, hH}d1؏drUtЭNu&uSHL 7tg^'ǔN 0BS!ԹWiUS-@U]"r RlIń>vД;R4}i h) u'pz8\LRS djbZ^DBhj|}D 5Tzr|17nmڡΑm֪%̄\֒S^D=pAhkņ|9(S@ tݡJo; kw!Ȅv+J6ɾ:zrOoihDfE{[\0U_Ψ@(G|A% u<d􌆜j»Fi |ʬzcxn*)eώ+aHጎQ0 @-AL-kw\=\Pl)y -Popq L=1tLoSskMܤq6Y+钴[EKˏR~q18RQ+NVrh*yޮ{_ a>fA yki0 f#)]uOWePdFPAH$aZ^k\ %{ݪۆG:{[u-2o*j@o494Qd6GqSDߢ[m!4T) eW$aa@0IV_XT+Kϯ_ H{X@#9\󍃓ZYB9.# UB'hɱ.r+[0vLT (2Yq:?/xn\̷ bN`]5~ӧTQE5)4XO~(uH'%["FTVԏꎆ&TFF"|t;XX.%VPjP(*I|{XWi@ AVA[J, fk~aRoV=,y$[Sg*t"-E ˻Wj$_&Dk*JeV>*Vw|k[b CwJAͯN31awtK1D8KĪ[ol(U516WȆN`ǿx1[ma0j[ vi|Ir61lhThjyI[n ,C;?%k2~ 층|x@.К ѠB}R濊5XP1tb m zUCl6ėʐ n{6"ׅ y7P% @+Ryuҟtr貐E){tyj e6#4-7w)cS5&[ f ك'RS5DZhD)aW|p`ݚ˦md$'wA`!0ƣ{ؗZ I2|!@1< 'Y`#_^-!Tdsr@N8U8J:S4v0϶MN ̄.ϼ`鿫QE8LN}qG8tL\^b`d*T) 2Uie[H])[`bW۵hk] -SAȊ+ _dISZeDqv^6rB3r/t&شzxC~l ɲvH9pnx<EMUX i{fAFS7 H|fIh U۳Ou+4#l:Z_+pSr~ 9. GFC ˻+ I2n3/>#smOKo7Tc< HZǀJJOZxW(+ϑ 4]8D:,1QXd ;z/@`TOz%j8Q\ĺxET|I}ԖcKr<~pG++;R rfDwEu&__ NIB)|AV>:2 u b8*(vh^t|zr}@ 9ѸdS0d"\..L[FQmjjF tPgCMdjWfzVpKPtfi2/vKgZ28yn$i6lǔPz(Q:8I4;yȅi)E͕zy:bsA ~,OT5\ff&lA&jJ'"'o jѶZje6/ (g; AQnAWmZ~ǒ v,`c z^=7#įMJjd$05S[cēU}R+c`*6GIȓ?pHn0j~~u]҂5 (XRkI Ȭ'=Ɗ?m@Hle,ދin`?+ E)UQ;!Mt##k-ضjG"0*i@8T["cjS`K5izX5߅'<t:{~uK S*;q`RH&VR.|Et{S90epCD IS-" ɀ<(EQڲ:rl}DB 6b(]cYϥ6jmD1&]@լ= mV]铺뽙Mcm WG!Cq!R/N$~{1DMr+吘$vK\ύSK[>" M[}fI?I'²M}w#~ِ'‚$qg Dp,z{O[+Wg;Ռg벼T؎ jrki3I>#\~eaj9A$0e/!]vC)2`j%F~(ylAK޹)l[͓i"+ߙɈkp1ZD}0A )u͗PqJ5 p&nT i~nhϘH rdLJg!8֨ P|mSq"iQop64,iZG㉴AZ^dI Eep~I@^oMa2~"KՋBŒ#I`oXc|r Zw+YRGku-!s:TY*( >/p{| 20g>dV+wĿmX;X-;{g wb c#?"\pĆ)B(봞F 碤8c'#QED6@{su9ͱ`* s238e,X &TE#YտL}jxX,_p8<|SI7Oeq(D0Y6;)<:{#;(&j:kӎ-"g۱n;<1$ODɇow:$eqkiW2sW&]P[mxA/y!6dP[Qm^-{,ݫOcb0 f-Fg(tr~ԑx {L1&g@YrY1|akRX>yJ >NnI-hK-Df?oEHÿqA]YE*n0t۔LIKNI|=̿KD%?XvN,J|#;nb52xKQwG?QƘhGԩU]g+5Z՗AtRYy(Bִņ(za{_/[i9ȡC#mUO+b̾Zf馈eET8r$(pgE,Q=UYtق.kvPU|\Y̱AL9rsxq#8ck; CJ`@ QyR/8 Q| *K+9-wRǩA8MM{Pn+RZw"KD.iVI3{y& '*MT,.xEJx$BCuE>.ЈP;Q7 +B2[ـBPQ \4ⅼ@oy N"t{jGM?yaN@rG%R*E:,A:P@y@h5٪ηYˆ-hcF'ĒV^־ʝՈGTAg9~)Rj\M4fGnipƙLA'L `\%=H)ࡽ# B q2K"l2?hU!|9gB 7͆I"@F=bt!rB#;'Թ˫18a_L/|k .bAƂʑIv'|4jé:|JZ%7'rϝ+@Ayc:rz!+[0wєYjRFt8Ш<:L=6]Ϻ;Ȣ'Abُ5?mʛno*˻\UCNs=UE_hwR?e}AB*s[&Z<;`NIR)$cNsW[ClXoLy1ʮ>Pf95ҐѳK2vD&35w}}HmڶywA#Q„:Х[Lv nԘ4Wڻ-_`s㓥BW5a2>ou[MjRft14k&9A8/6 ?oף9.&y#PP5f496\\ ʐ0 gǠAPc(i2r{ҴM՗F8w7gK.=/A~jB`yzCd޻}I]\\N͜2nCt#==/ ֘{M誁K@%6W O0c 1j##WWƳ9:`dʯayMy"&u)c? Uܰps]F:ub28MgSF QB؛8_*.@!L&~wf`iϘCu2G?``{oogfd=Z)b\1?"QS^+_^ (^ha!UP__ 9~p{ĀyR/^J+#AS(#^4f&%ъBFpג$m5 NģAh@BTaƶOkW*FZ7ln͈Fn)j߰,PJ 7*ceh}oe8eQ:=oت^`]E\Dj8>EY~GShz ݬx^1V|GN`{Fyvq᪟iA7=iN)T\ j4 r5q@p8 =O!o yL?g@;wE!?rD"isQeWnjjq )Qğcn^A3dLw[)FofqG|f R}ݴdpɧLT=mfj6ub2\ZuRrFv_I=*{;qgO{B bLIVhyR(Ñ ?o( `cd{P 36(wL/N[%XֻQ:Vyf!}M$!*G8vUbiߴ_͝/Zmh?UHsG2LљSNd$@ Ͷ G򌏕`Y #xŭ^hA]&}Fɿ=Noh"6ZVM"U.2:?)>k%{Ŗ81r!xd br X*RC9a2E95>Jygo:}̂H^E\ o`ĝ8ynHf^&z E!GP~k>HGjHY507BkѠH0 9Xy#C7̑h_1'X"pHBf_qo6vk?/w}=9BzW\ثs/&pq,^awދvɪC%}m RN~_4=RGDgl *v-_#GaA[,:N~:>G^$6 ldS8o[́2WEx,X4jdMǂ(GEi@:׽p8U eRKֽtQ` z*Wɥ`4o 25;gI]UI~StvOTLaK\񕂅 *l阸QuNZ]8!5d!vZ*A_F#\8nq h6`9#Ħ[hB<4Ԡ~R50Z -2l:N2(?f>ؗ 玈Ǒ G˜/r S,ZʵL;DKƧ/(+G扽~4$ #rXEs :i60ю]>gM.J.)x9dŷ6Zud@}ޟmmi| C8oY b Bd([7XZwQ3UMB Q+ 4K5 agUm, jlԊT/Mۖ|X2|KTgLS<0ˢCҒ #T]_1c!6ؒ Д^ Z.Ӵ_z_5ƅ)yAÎ9>%g3R\xT ׺hM8̧rtAqӌS47'1Ѽ'W b0wh3[Wfr37QbWR̿sQ2L.)P\W -·Wy]?Ɯf&b Q2g=)nw[MD\bqOg5}8Pa`$<2g#mq+==!`Sc0%Kk)qN$H#b4Ή}iz*EROm `NzӸN 4s3cǷ OV z~D1CvvP3ҵ)';TMOǝX[o (\('5ylj9CpQ3zCP 5-Ob7@yȢPADGomfxWLD4޿#eeo$j=DwPǸoO/-OY:Y&h:+ZKgNOj֧0M Ngc`MoaTW$]:\ #w|= ݜĀ OPJ38 "s *~r6mb3K"hKkVHsV,Y`"1? *3ZE˷tTIr+S(".9 xJ ~ M2ymC7\5rd|T6oK:qx3Ȗ]3+Po8 l o[%|2ʠ&A֗^Kzƻ'NȮa< `M4AIA\ O<݄[9FPR1}&ff7U&p!>9y7O&>h<#0s Ty!LC$(Ȑs8٪ƀOzA"P0GB>[Cꛯ)Y,@ [;w|%ATi JX<:Io@eWcuM f |lŒVӠndI_3(p"Ca侠T:84L8zS&jn(痫=-1aԙӼk$^d<&"Sw)xCP7_!Gmc?-OG),W葑ܸZCURSDT$m_EM5:P :D(rµ3ݕ|#϶ ַ>r3"R%?\FrG /[]anY(SR(v_0jƽ.Ff&[!L½ ЌthIpZQ&˷@%1~ӊ'1s=t_s0g7Ch#*qD#crL ʼV2Z3߹ohk̪"Ļ`+3<gohdTХ$Z/XI\駾;<*'\gh6r] 7| Ȓ"§N@:m'SD9 +C> a/hZ eR?Uc;Z_ΖIkB\ViP`qB c?Jg8ݢ\>߳=ap<ㅽnҍWdYӛ`Q7;x=qNy𤾷J"l qZe܇Nhkjyնj&MS1%R>nh;Cl%}⎭!ƶ:hm t'Աr^5sU?ndJTs&.51iJuU[}aNV4))4ʧ#x4u)[н;`do/_ieU_>!od ( ݯUI'MN债G̭CQDg,'\ eXE6?$"ƋI06qv&י+b*n9o݄miTESZz$'ʳ*"gڣs_yr1qF7I (Պ'!ҺYmA0R +Vqlj2aiܦ7xMntY}9ok j$0p&b"A_ -~ᚬ"ՄWO곡czY7!рh )nfsbگܾS,U[} U}33ƴ5 toU$\ԈFq`>6Tє$=s3bn&-gIcR9sxqgHI8\v:nI;3zCZHk3 H<"Cy0;bwIOB-8u@o-Kkq<|!$gQhѲ5 ̏c~нo2FF,?`%`M F^8.Z=u N\T*.TюK!~de&Buc$EJ}i`c~een RnS *\/O]Re7nxqUU 3ˉk]l> >b&"Θ @f[rx'L? fd /̵1 pCu2EP'.+3w['U2܂J-e[Fl DZ--}1_k',\|iOWݥ;&ٌ8 \L$&OO7ױmP ܦM-t8xR(7 bŖZ$$LuE/6 9m+IT\6 v83yܻڇ} EU)$6*`."|:4['8 ivWS3c:RPn VmE6jTy RDc :όsSHHqrl1H^`Ki"*Az<hM1YLבSܞ(̇@PF}ZMwܗX$+lYHK] xF#&CdrknQu#_>_DzwR[Lƪ[`cENlE} lI@}8[ڄMo ʂV</dk}sMaoI1NYCj3(d0V npD]n3{B %31gOR_Rf93\1!\ 9-2v=9E~+G%JocFfr#] ]VzAhw^~ Sm_V& 6"b V J_#67uABp]Q\Jm",>$*cZ(ܤR 6nYZ'&fD+cO{-TlurFQY)7a4/&HBLtRIPisb/ D݋H%bD8$Veo]QUkS]h q!ؘPhXb ?M*Ъma2W`Z )vĹv ś[ ΥOr%ƀp=t?)3|pAt0lc(d|D2;g~K4?! ChbҬ7yQ_WV+|qgNw[]xb8'"9Nq@kL 5q~=5DiZmc12يaQ_\N-,1^"npyK ӂU,u&8rT] rz!  ;ڳ)#  y _DX9Bޏ?L1èPb[TQrozؾo)}7:i"Fb~V[4p7Nif "b, hKϛP32)0TTTdNhe0Mi)&ћP$2i*z2PH"9J@QF\cYF^TجW Cd0^b7t 9Mpn'V6^AʮtLKuߋn"wfFrJ__!bN9;3NXDv8kysU8v *U~c j;2J%zGk8_FHF{&!]UҌlg|еy&pwL*ͤd-PaZ'f):J#.&nYt9-8߻SAťY9g:A'8ezx3(3hUdNwf{Kۀo-3].'|8=0,̟ ݣKm>eӲ Wg|-jʬtd rEȦ֊gF/U-0 =Omf %Xش>#-8%;DT!xq{DGXT7V|pMqOIeZ$z@g@.JI Xay- l[}DV2O̢-5Or7HN侕>"LeY# /J${A7 LVے1 2]eټS]+7‰.F+.n$1Gg+䆓" V܂[3ago"Rku?I@)ehd.mJW mYzRt_DrNK_D~8ABuzK7ڳ[T샡8:Є/T 9 dsܕW!9YB-wS␗0B}q^q__YC (N1^#(oGJtӕ0̛1P.;).btewkJa(QWo&Vk{zL 7P{lɜs@NMfdNBX*\S S9x4&MoSQ Mc.׌=}1i݃uQZZ>EO:i2NKG8(EQ05EۂoN1jtϬopAfBlG<O4sn̟ Y'%ePLrK6 T_Ӿv&u 2yaT{ar)WS_S^(5*fx%uon'evSķoyIi! $kA`Wma0\إf#*bxPw1;~}t|#voEYu ֛ono]g@As#OTE/D};2?(}kp`:BRC 3C`T8Cީ,W[xlj& -wFp ͉ W[&,_'_yg`Dn囘j 7(.0wi&b`$B_lxHoF~lm ̦=H3]sD=L} ճ a6,@|{zt ^3}/K\آF;~X~َ!((G~ J8+0歖eڔ&ZX-<)dX4KzYŠAuABpQ mV2'=!,8&I$C9zTN(/&ikOjhTU<ÝeCs? * 'w3V-PNhpbnPF& ԕ2UJ?Qꇛ|YI ́=Z"-m)z=fղ,R(OWU5beeđyAq :чF(H)YXK :N9W[Ăfc[eEXKMA<@ ;X'VZ|,Jӽf^l|J 'nمd-GS!,Ձ nSMCqϛ·;Bw"Jŀ g ^0HÝ&fqSP&&y[̹J-ٯpG0^PeJZ?f6ݾWXޤK ko1[.30c1BF!sI ),I_gQZϊ0̦WX%OÀݛzv gaFJ&gg \tHo61?<F]9H Z'Ïf IDDo ׬g.ģ E:oSLS b.kyթ*',EgAp]I%n8-<Xbqo`UϵsbDB]-ZE $0qR<Z /d]sڣyrXr#h%(٦/?Ӳcp7'dصqO?kl_Ht~0j2کr8\v ?9.娧k1~_!|wԨsf]GhIԲ(& v5c1y`1;[hB*-ٔWwsJu.$Ae.f7|r#w4c xlfxfRh >p1 %7حl=TutV8J$7w[.AE\P#<%zFZIM-@%; $%5 peǨqFGc*7!|{TV39oP尟8R=ERJJ0j\Ĥv-rj@]&9s ܱSמ3&ذ">(vr'7@I_t K0F>i CAnˏ9:| `]0((5=IXуLP+J˰[5MGHe ʒ8$(rSqةk@)>~7&5 F&Ќ`(xusgu;D=eto1r\}ӐP" |3{Won{VeZ/KwoɆUO 0nEep0ecMxE%Em3l9ta  (8Y1M1Dh7=}\}02]rA';Fp24^=SUf[߿hS='*İRZة{ɽ OfI I"ǖq?ǎ{8 Y8(72PYXyi47vnb)ϔs#@$*o0N*[o3/P1;@l]RE{rwb~Nf֮fg)/Rdݗς;&)rPs::ψ?*.q@#r`lNk|w`W^"wȅ+6  (LY![4]n#*n86;~r[_y\gΝS@KT[Їo̒' >ScU>a8ˠaI4WyrW~p;V^$LVSڭgwK#`_ qI5Mד/Ū#<Dw:u# L4ɢ&,2p7m`}\rH5ϘЩ}n|P5Tkbal4 { M(քgD1 $ "j'd'E!\@apG~uW/Q!O*VC%u2q3‹@uKɻ $$uK>+2t 7$at6XŦwjZ :e:C CX4hPo'Q0zQ bMPJES*FxЙu{NJp4|k7zƣ;_j_ۨ71ɼ wVC8l y nPMAONt_B99,|V5Uͩ],ᱽbo!\[FœpF*į+޷DaAqPu=3YH tYP7:g*8X~ӗV#+O =moWQ't;H `}]ƚ ~J? l3/tm?cKXFx^کYі:5@  ?Nl)EO*4)iRq^,k5 1$U-ݽqpo{ˑKaB4=x.L-qmodZ`#ǛMnW-053-HXrsx"!}wٴi96&Q.y&!`3E>GY%fH6[SQ'u񆀷qkxׂ*璆R#ڤY~EM5m[#eə( PfP4J*i*`4=-% i S$6yڿFBД.o}GBE M܏@=AHQZtKF jI邥?;D3 ཷ +"QGΈ5.ҋtԕZ|2xLO}ƓoQ[mdޚ71 C3?7#qyYQ4&=.PiF04}p`Q0Rjv]oP%ٻciuw Ydm3y˴o3KKu=\c t-:Qh/TCAT!T̐ǰ!K`ؖ85=K^>bv2 TlNH%aq/UD',"L0 }],H޳1BY %8bj6yKuE6xZ>$s DNOv-_L+mJ6n~n\biM҂%Quo=b[7ݢ+tXjjN9( -<Gi,_$5KpcXZ"hٹq؊f,tv2U҂Xi{-"%XU+C <*Y=(YD.9 NxΎ?3\p%/۵x4a~2i;Ҥi(?u \ٳS^ tr'nUGβ &͕xvfۢlxgI!Xy&V_o;U>nBzaпo2_P(vUI& Pn/&0a^ɠNk'KTsL &R?u6|;RT rPG3B4lphh~'TjC $0gL rB 8.+?Ǵݿ2pB밢xUPr4)S.`zdfu?-$ILzG*{rV9ޚܞ) FR cpݦSg tmg~C#K%Ogl&C b=ھDm'-; =kƅнh;;5" ¸DŽΗʼʭKJ6uت9ؘ;VMaF9W W3NnbH0^P5N4Bu7M|H&!Qr!ԝ4h;ECrzBebB\7#\ w~@O%! (qI(Kg/°|j$H (R^6_kI"=ׅ>t@s`cF }Q#*~5|~WZ1abZTOU`OR\ʜ|)75{@2? H`Cs?Xڜ!F=Wr Xxp ?Hgoί ޕf:g\gT+yE;EAdeUBD0Ls 0$֕, z_~_u_BI ,^f ܩ"@ ̲[KSȉ71R(IBH#A,Ml8)NZ,r;ǦU\ ڹ9~oߴ\*g2k*Â1Gp;^HK>޾6+ݛ D`Nm#+PL' y/웬3>@9=R慇J-u-jѷm&^1ߝa'6_=: 6މU *VQC`d-+02 :@d>hy{${q x 5-?rR;DL#U]Ϯxo?"ZÉtX>>5>Ì!LXfx-pC|9lN@W:MQ:QɮiI7joxLSta:8; gJ@e3F` 3!$bzp; 򇦹\N"'A獠ډ;av/5u1`Coq -C2⻰Î(G"KѯAm'H=:o៛*8gԕ߮{=#۔?C? [- oSM#(LQk-{3]/>2+Cߠ_BJFօն<tF`s8WmP`JK\du3F)y$?)3vUWO3Ԇ`hL28Ji[RlڢHObjMҁtbTke`UxQyru'١rܻu>-j4}י[D]b c"jh}:ZD8TjӼ7u[^&ó]L^_ $}'y((MAo<m)@ tp%=0UGWے* RN#X̒S]~;JxW3,S0_K!㍪H u(Pb K;U.Xa%p_w-K/T5u]EOLfNfyZ>8 %:;ύXQiJ%W=fl%87¥!q]P׋pLrGumHHOt=6(cmt-#*~%/H'yr4' D/.4ᆯLN8${qN?l{;Z60ey +a `cޮ}sp"!Gj: !$&k뾻s6KgF~u{YgF?xK:!gYDu]0N} PƂ)K8*J˵I.]t\@T.k}^>[ꈳ.86Ԗt<6e혛gRձs,Q_RB 6a <,@:+C9=Tg}SZp؋S<mLDːַI^άddYy ّ>,x[K;.9#ؿhCŎ-K;K81@'c:LKÕX HbVވx\0h$sFC0Ga A]R{yZ^$7tQJCA[!OB]1Ó=SU[R2©x}nI)(ݔ,+ا OZ=w'hLYJ hy'~CBM7ШvfJ=W rb1b7z q7qgJi}6&e3*=;Ws9z81 m>LnD_^\JMC7}kyF"-8 jQVD@vxهtE a5>NZdLF<ap O0SW{dԚAy A9t'!?:hFڛ ;*G\{O5P@+cڅaqSPPnK&G9@DV?R>jc=":ׯ%§Zՙ4ڶ='-Mnr|xF)\ )],pH?-?: ( Ed 4Q'&yQ!Yކ۰g4Ab.8<^/7kP,žDO?;wC{@ _VQqDl%ɢ^ia|N[v}xTƷBhss"}G3Ffv5 esѫ#jLi?\d[!`AZ,1d5LƊyqYS*BVڻ Sa_^,pԷ 9sr(}5&&nL_6AM {hp^"o h:[/s (V;`id,~˿!+'g?U>IbEqTk\m&*wk%VTK)u(b31C-عrE8l2ԣP2geLOn!/p= (yL4nl8ЌE%bdL-sޯ;YY"w<ׯ>!2.YDu#[66-PIwH#= CK3BteWA2RIeKRuZ8SB5J0qU3>,N)} Ci :Ln9e]vFO41`@Q-ޠ$r\0n/8qb8{B^6NpS2ǭ &8~s;: ̱b%ח4|O3|џ)+B$푬 , ݿc习Q?", QFEGFƺ2 "x8֙bMr:vHsq۫07=Ilgi-P.8,-c er1,>;x+j$ ̧rG$) yl0o|WAqizl_ g:90 RVN^71%Lc bGON?^a΋o o_$..U%N`5X0xB,}Zڌl_U"WV Yr:W :"4mն|f!ClN ޑ~&cRٴcvm ݁eN$Oz|>/~N*#|8 ̋Vǻ&s/d<,0y{kA5 c.`9E9lB- va_H%۹3>tOwj鵺~ ]N2>w\8.6ɸb7{-ip EY:TLU Q@k8X]GyILj #ԍ'Ȇx[C:nq?݆nņ"0 "zd o@[Ꞝ\gNK'[ʰOP `1WHϣ_IwP7Xx"2^*% Y`*{ୃfR9>XN2I_%Tj+"ũ mTnctWaNMFS@)̔ϣmfګϡ=VwR>_zk 6xmQj#I' xB\vL^Z8im<͎i["qT:";۳Hro^`m Q{? rT~.X%LBiFīSf'p>';I;0?n&y_"k&H~{Ï .#K ^G%umK32# 0]]'o(ۢ_wĉl;_d8%y_![|+m0^a!WQ ]ɐzpf-cY浓W?TyAާ{H|}ׯۜ'<2eY"_d恃?b/ݠ”/˒8ɕ#IHz~4&.`m0uzD T)0o wM u 4Q{ýTU!e"& F;EVD3fb!;(<, o|ܔZجakvwuFޥģcK,nc}*s҇̅%3;.zx _F\/u #Kf T*dk$d9s588 c"ap<&//=|03}w7 [/!ud;3l/ig,wxܓ8~3net,a(P<`\ښ ^sFUJ@YMCU͎邩;l]!uKVtW;8{+K  ߿!bU01c\JIÆ8(;Zz~IW+?s\ҼC^qoCBk7 NႷFx+G,b_/a+jHiA'ͣc{Yoo=lZ]( Gg$(r˕fLJ^>svDIY 氾KQBפL { {wL@7Z.ZLAYad9& ueq'xsۣv@eϥrkę 7 [qG/&!p>`;iN/<(.݋SS|Ĉ-#/P݇5Zw$O(Sllwi2aB__ϭ4# 3a]`/}S]ZdmzPSGTV$ҕvS3Hn=՚0Gb1k5T8OxwщHMswO裛@?zxd}ƦNWof_a%bӌ^i:@WޤwK3btZ^r>YOw *1b"«u|nH߬n&{ܫXʈ6%G&@_.~neR aMjHiƍSC'mT ܻL/vOaSM,d vA!t['|S԰NU~`}m Q2(>]dT)ȴx2Ƨ)Qfl2~[+T5Q|eG,,ݣf?5404eX`)qo;,S{-]Ra0E=r4/#ݚJQVy/RU$K/W܆@8,LNVfO26$mӌ_wNo# >I>;!cRZ[V2s+R ~}vZou,ʹT ]637൜8n #$tUsݠ"IrxUa\Ο֭%̷fCϰùKgx7S$ ԉR-\D se~ӘY̖So !f[i1b Xv=ȦMߛbS&1e&tAV/F.CsEn{̩3w.)Hl,>8hěq&* K`=-b:TrѤ:_R'*c&څ|1"SSkGH wIZDknwi d;??N 8cklfP$ 1U)E@bo)*E+6x&1{Ep3W)& {#opvƌ~fʐ &zï@5kInꬃxaә_mzӪMgjm@>xXFFE~<>F]iK6pMtR=v$HC:* >y/L?8u(5?arUfnfKWAR+TYBXk~X('}7u509Ih( ãFmApi0R竬ʝ4xe8M/4jc`b' hC\g.ƻ:ykF *I#?& m&:!Ք0TzmB"(p,1F+[{}zuM ::&fg~srjMbc+;G fd29$W9ncU]TBOƯ:,*.5u߾2QRKȓV]GxMDLoIrlx+W1΅DtqL1q >si̞S( "[[4OT{yV|ye ' J:wq6P"yq.z]r S x,K,Nk2SZQN*KbEm=`PowyαԨ- Q9xe:>ỘFn 5$]:bU.4fG2>nyps;AV7r$P& \z8Oi-ϬcjHedCf`GMKI஬]v_rZ|pS,}ҿ"q(1.ʁ\GILyLRvv&}$}*sQ6!,n7^jJETČBL[q)(dxpR_/lArbZ̭Ѓ ;PN橶Fu/iUJ^!a}+A#=S[@Sx EY޵<#_#j?D"P!Jd 3: #͔mjᯔQԻ+[Z8Gn[~KH;b0 y+"HyZv"I$e^Ew68jQufW]s률E7ԡ_~'+UP=\|Ou)<=+ 1Z!"(pP`@!Kje|j@j2xʙi=ὁ:POY?~?j^ozT-,.׷|n[H#3k=KHb#o;`#5j?mtd> c^^T~i̠Ľϲs ԏYX##SS R|,C<ЏגT¼ zm6[t d?]`$ N%ڵĂ.$AGX?=Y6^GgU@E}rQ4}`!>Ti'7cPHeSUMiJWƵvUfJ9{@ ;R g|޶!HUӹ `Od6b([ZhjV?V84~cܳgG5&1kڔ~1u 0W?S]=4}B+ UfRzGWqU՗Al-$,AkhؽV22^z_e)"XాONmc,m!R7@mi{U{k֯IZJ8 }_{p#l8>}k$M̛VÂ, J;BM) e6#' :ۃ(Yu+!^]fp'Sw0} Td2Ln"Va,Rr#<@f0T){VmɲZjYO{޺sD| BnJBv>kB\^4XS>=rM5- J5NVL]\+w'r Z¯&ZŌ֌X9*>5(eZ4Tap$<Sq53'<9!5z0B &# &aw&*ڌ *73=5&*@z,8J8,"UZ,r۬ PqM Iv1 O<},,jK"E 6p\aeԻ7ޘ'mƈ埦UC3ĄJX$V`SվiS;ij`*_m)g/ŋGj^=ocۘYҳ^Ņ[uɏ0 yqp*z)7 v ] LYt7PKLd%N`c˻D]d7輇;9EJ歴sշCBS=#"Ա0Uׯ-+,(]5ۆ=ؑC>&@K>2[͐6[PG˰x((k_bP!SD&ٗVr^ƩiurȽ,PƵXe~F'xI_Q\ǧ=Bc,A M>_.VLݏ\(<#jȉJFk ԵzP\рa {FHv<fO dњ0`)(I{x؞18~[RU폴\  +Ld)%_D@nh;oMn.1YG'-5&Y_"?A@ u&SԼCSm2Վ JFH^N'8b}!Q@Jt? F|i`VT jccŨsX"_vKi}Q=6JV-O80Ez(ji`!,im4aA?.L} cFBi1T4Ct 5C A<jWHՉD62_LP_qcQd0 )*8,U 0'i,M|~¨4h-)k tEl'100~pʪ /S*j0DۨP0=Q]*в2A)t*dVa#ܱ5;TZ..G{0GK*h7ү,ri|Ha1O T\1ηDrPZfBѢO#{pc/kڶOV9S$4mIm _+asҥv@(Ar?Z_ ]OK2*T! mm{u5e(%N]ߝm.} $!9tFW"lq)j?M(=itmM2e\w<҅&2s&G`jCv/[k6eAI>SIiK8nG {\Q s3(*7YwAԿF _2Ře1nI%&ꕶst8-ML]'>5O_[D,kSD*Q'Ipل] C%ŅxW52ͻBbе&$%!qT0YGMmߍs۵ʄyd (ot۔i!d"y~, q> "z=._۷CzK{`d!zoĨ'Ƿ" JvJoLytFư>l ^T|*zW rel; 6m\#aìG,AR:%QHeC3n! YX^l*:\ U >)ϒst!3:>5ȉZ|H\Ə!QR%CЃ2R:bns)DK{d/Xv{L$2q4m3:sH`2r/)})\odD?J/n WK5bAHPO^b\5PjrsJ +J$EҖ^WQa.@7XxB?e;)+8U`S=ۤq1l%'V:qOJ >i”ЙګoԱqck)$v!/eJb&]2+Lhqxvܤ3nA,>> -. l]8oCP}SVQ3XQмrOsb{\pW]6]. ^/,PFe(2%2:vPB*+M6勉=So!c|sg )f:I_NHX,5Ȍ+CUO gJ_Z6 V}QQOT llܒ 3?-0qNu⻪.LNIBB/G[pBTAYͳ9=_\Dh Uz_HLXWz"$8X8vk0#U'Ìy5A4oA GD;ArRUlBU3C.$r%b{E8h `5*HH,Ӛ`L5)G\ㄓ-z|j0&tZǗ[Y E"{ߗ,j .:w )5&7yI'V rRpbJ~w nU3WUwq1VF{mOX'G Rzr4P nا~%2%z~FbP?{R-.0Fg0 A=<_0cw,%ayRN 4JlFR-Wfϳ}w~N!sN]AmǼW%JhΟi&uz+5هPI Q2ZWX?Fں:P0.Eta+ņkf)V|ep˄3.`Ni7m9O6wH+r^{$"Y002c3*~n Ek}HCNJh/ٞ{ rQ>4rd#%txULG=]O _Ay KM 3"} ⧒ 5vw WOޤKG l6,pA'_!w-V1F#Wwi\^S3r}|tװCm z0MioF A%hrZ<9EtYPdHH7f;[:͗XV) Pӷ;iځ>xJX@ה)^&&g9uWj!<[`j*˹+$HGm jI:%(yD+'/XGZu\X#س^XQ#aպM{Saz2)N4xmɖ)GS1؉/ ]ўFT>HXTj{nSʧ8NMKyR-Kծƥ#V!~&‡prִi )l9B 9CЂ-c|"Y9 پUN谞ܑ;2?<=춄*; ;$0Ѳb.vЈ*0#̡Ͽ7w 3sA2*06CX*ڒ߸ xhI@`sZҒ%`^xgzr?ِfIPPd |3gU>I"pb 1bv%Xlf/ztt5ɎuvXWZBC L[ZŬ؂mw(w!̧oy$utoYʿȏ'L4rg &"7'eЬtAD',dD(M!nazء sK" {0 YZgstat/data/meuse.alt.rda0000644000176200001440000001556614750415431014713 0ustar liggesusersBZh91AY&SY&hHr O%wE\k"AVf"F$ 0ML0)鑩适z2O IM5<i#FL O& 6M4Sa M$ڛC% e5=I 4Iz4ɀi4 Ldix2DU4P4SUR@&OSSh444y1jShʞSSڛT? '<<=y5]aU=NYoHS',H y̝^գl4 ONd``_`]!v۷nݻtTJGګj`YeYel5)JR29P*%@TJ R)JRX[uKaU^뮺^[ۯL.Rx,,,,,,P*%@TJ P*Z߿~11-kZְkZֵl,;aʀ P*$VkZP*%@xT뮺뮕-Rvֵlfut S9rS9iI$I$!$JlI;"I$ Xm x1 ְ.JDD[>L I{s]uz -a9w""""""""vGehtଓx*srU 褁Id g !I*kTMUP\=  fijy+mEsogy_+5^}U]rBat 뵛COCW0Yz5Sbx(DU *?cs.   K >HPdd䐔ͭ,d k[.;j2WXI[{.Gڤȥxl ݥ((n;n3{O>vG5^3Xg36T9JwΧ"Po[\ FV@y 79a{6C谽o_Uu7{gOUa^=k0?Gr_yV]Vp+c)<[n36)0h |Z'A'ou^M&s}ɏ;4<~*h_m3U/hjgN?c,便CdJvmOxVCY;-5qguR4 nOid49 IPM"<= 爇k]̾2;:2E]:qeKpNdQ wvD&$cg#=g6ԶZԿq1b/bO;kwѺko5_Ph|zb)9a! 䀄!q)V 'YpYLUeD ē;.QR ` "JP8Y .T8Ix@pq =\uø8,s|q{ߩB];L+ < wE}=y=\ږus@@ B7ݢ Aܳ*JJLOڄÃ{ Zhg{k*Q2Ў`$X%m7~Y y=zX 4HhK=7θ׃ͦW=En~2Q}ױӏ)RS hgqvGuvMy?ysP%U,&fҙ [[w" U- 7}"݈lX H%ݥVD1=U3 1^ +CHY }C5'2S;_t>R>/Acm,y}1[MLo]-kއWm;>2sD˓i4Ƥob8LWg +]C*=acY?8sȵENI)[0nGN*S$o?8'фv BwG-CT/y=&5/W" Xg:FtîZ(lħ]>kba[;s @HC5P,Xa)q& d%Rz'B}{;"3Q"FPC$ؑmoڈJ ꆭW!-"kTSN3E,hRserTvS`]-WJ+"Q#b>%~o Wf[F"0uFp{8b-H^>mY\,l:9qrGi{B$)'klɥGV(w!I H/ %$eyS2hG.S;*h-,q ݻ#Y:dvR[N)Q5:a)ykɎIƙ%bUwehaO=xn>1 d N=e벢BPNcY ?g3ٴaFz.Lh3d^;R}Zݫnը"ۼL]*},kǕuFZm }ݯ3Gq&z<?(M˟yG$ akS(_-,UÆV*cO֭BinuIqC" 6_NA(53}erQg))T-TMR(-J2ePb-0f*:#ޚLF*Ƞ"QTU#"(e.s/Դ¹󁓳OOIyʌ^i*020Z!*vP@Z p 4\#MD;=\yS9ttŦjZtˎFeUꐥ2 HmZ1}x1X3*3{Ҧ+`l2&UJoهf+ىsn;cz6AغVe>OXa,9[N"WEg?w2V?˲ofQT5I iC\n:"찷7~<եsp'{n0UlcHҝ75zԕ:sx-/9Ƨ';3-6oLb@ѧFt(1m6D ,`Z@^uaxknkPyI:?{ؔ$bХbG9~ڹMi}΢;}`h{lM3`?'o[g$'K$  mzMn?¿kx :p "x$=7S>_D/9@!3bt:͡{d12(HHax7Z1AK Sa8šNg{6TϽwO`zHm0zSL漺 >je$ʸ]BCא gstat/data/coalash.rda0000644000176200001440000000161014750415430014410 0ustar liggesusersW;LTA}.>~1}o~oY !-lf? hTllhlhl0 +,l0Ɔ ,,ov΁u5+ė̝;{݉0LeL6A|:MϖonAD:u]mU\,SDzh[kX7[UǺ`=Uv<8:kz1` >8yWs#O\!GZ8w(ZcMΣMY(o?uqvڷ_Z^eͥñm\nMwlre3}>䥛F~7kV+//\[kէq^{JAynG1aFƋ_q5<.Nz5MLZQXu! nʷmj_|>~?KF}SI*/grjBGL kV<g_x?z+|1~C?Úǡc ɂ'C4 <n+nz ؄xh,a=Cĕş(~z u>_s<"<;i}R䭀 "y uĽ~xD_D ^D8G'#H!'_ }7'}xtQ`>3oS b!?<կEbx|<23q>6kRuOV gstat/data/sic2004.rda0000644000176200001440000003611014750415431014066 0ustar liggesusers7zXZi"6!XW< ])TW"nRʟVD`FXjIbӭnj\kɱ :`Ұp 7&qJ5#ɼdP^A"ϣbFEQrDl^P#[RVˠP w|8ˡ~ P@ +V0`8hVk^aSG@ː D#qbL@lU@[:v7b]mi28PJ+E2LԞQv^&MTH5O۾ (3Z7H~\#Gue_qnBvLނ)YnHӢ.sZ9 lS~؁Ii+oYI6&xbyf!#zR{30ٱp.CRMX8D8^;r>jSmv״2F!-AplXģ -}LW@ޙˉT2k.~}ɵsOKlp6߰FFuWubOȐkҬm%?BqTК+84XDG1fK_P0IQD+F%*<`'Wod8He ޿l+e?"fM%ɘ-=xk.3+9T\%R[1KzD耼 -(ں:å m6uxE!A5`_f[U w,xs&>|35,W ((ZrC'g툦5,lr*qm\R^i= $F̼3_2l-:`4-Q HVyc҃sqNHu? 8ҋ 69:՗D[+,>YM~15t2"I0g[oBNDBrhb9A 8/eÐXKZqf3yf=;㦒ޙET`Zn4ڎ;g;1~]eQhNٕ|_'jXص{|:{σ{p`NopC놥c 9zzGo (뇁VUk%. 힤!D, CO^/_l7wIׇrF5OKwi 30:q1wWX@2W`NV0I~d 2DGΟQ2wW}v 4Ώ}9\zҲcΩmd-WOi[c7iȃcpayz*X6eO-|ٮ}ΆϊȺऴ}:eNPW}׉mGy08YZ[)?osja˕// ö# `U^Q1"لR1a;,d`Q&"j{9dhA-#}~Gm*]+ IŎcl~SM?j#j`Ḽ7^A^fW{, [4CGoJ5iw2t M#XJ ^t6Z^ 7Y37T\Za7C@QF.X^WkCfޓJsrph>!X)HJ.ڢ-N58;~\:Όl^SV;K#μ0b|"Iຖ qb?oTFt8)4o|qWrLD?03JJ![į{9E`rBǥp RpJs~i>f¬/D U ū9}av!p&MqCSeޥs9Xz[t^p+p3*.8Y}FTё2՚Zܕ` rW}e3oCiW0_ a&A+^nZK\ԍ(B 2J`ZGGrXd"UM7|"\02b7訟fDS"w7U#%H[NW<.oQ; #Tv]Ar'8kq/svH3B*}Lm#΍l~/vq=6:R%Wz%BJStQ*v/Ҩgwz~ڇ^ٌ:%q,IDUAcYNw#"ŏFxD:bщ(\ 1+GI{aD%iWЃxgd7.I$Ww0:ڃ2TE2zк'PCP{Z{zi-8KlDw$,1I%._Ɍ]Lް%N݄p\5{c6l<;n 4^:H3Le( $Ntj1E,,&!uջi 8&k6we͑4vJz^G+[2W3R(qziݥTD]b"@fuH\}a%RmqѸ({`EoKP1+t`dGt3[*4pՒNx4_2ryIh2u=sIUrⰐe\p sH=/bR>|/ In L V T4,qAìJ/ Ta}ڐZ cAWH0F=$LW+c 8ߐHԠZZqzoMdF.D^^Zc=R U[0M 8xoIgx7iZǻmFܤ9`Lus,Gkr1mu>,p+.$ƨQ酺*o` V29iVӋJ=RU S`5zOthT$EOYaxЍ4UjZj ")X0+9Eq@̗ $  oOVߤJTmq> Eo ,ggJW/o=}-F4?SVUcXxǽAVi AOxl](xBމbyJNMs&+pM揦'Y1I,0A+G|21j2m倅N)NekɃD 쇐'p!n5kVЅlmhcuga 9PG]iuyu@QhN :|$Y5<( 篤n9jwMKn<<)Rh0aO_/* f2 kg[㭞F%֟[<?Hrmv3Zvyc\ vFnAg-|GuN(WIeU1KxN'@HVt@/Tiڔ:UԾ1x6tOp̧0(~_J W"cKWO;8G5)(z4i>"rZ' Fe[fU/):8H`搕Mlސ#GUQBB.Bh&k]z0lжick>HoFC3$X#iv)K˴PP>Ѫ.x2 9;M ;pf.J$qTkg鱂يx ;87u߬FR{SOfce v_ b̨ޏo.Oo2(se-cq7p('p9-\,]o G dA.YmmȦ`,I5BѵZhdX 1R(Ų6Ǚ^C*+$t%b,`mQOŪY k>ANl uZ14(pt3rYjyQ=KEBQCo`fO+ ÙK6U%2T ?Z˂k <׊e+ FAOvNR`8ۿ9].Xp"YI9^4 v2D,M?Ӡ0_OI^&˹fu|-"#pkKܽ$0%YWvg1LtauZ5>BQ .} Iݜd幙D ]B}F>--R:-!wfK%V5֬㝭j 'AA=>5# 4aq+g1mnRdÉO0*XwA 'ٍn߭JXːaІ̝oʻ,u$zbȻ7_j.q^zPX?SV[!fRdCpuf]KD u%/́Zdmf '@cG&4InGFꥎ:=HZW"܈dR7Rrk*mf,ۄV5,U4>?i1;<@P̔rk M@Af]M$$;zp_pEЕ'2~j_ l YPbIl~JdExu.Bi}7I ۥ*>aO;_~+0Z8qd<&rcO#_т}̈́SY}WeA)0S(POH,r9<enӻt.![A!#*v"_D@H"Ijʣn7 -_+J1?ˁsnYU hMS;[O h;nU]jyt^>w@` )ro kXlbM m Cuy(l2|S4g=Fut|pc>Hb ԯCɰmU'iNkAtc~y/0F_\SAg:!qcEv S+Z֛'0H w  "5\ںpkGpkWGhy_^V g89??lNlEh H m;;#f5hob=$_Թ8^ܞ-WluL][{ɹMQǭ߹ŧ켴+j1j2pnv;}"b{2Q*(CX,.C(XqUYp"ŋ"KK9FYP͂QhƇF=MDd:IvejyI7@E$«3v`QI:O0:nw#h[d*?顓N]4sJ`H2~DyU4_tz0Lš'̮O0#6D^3@81] `+CPqH0Ԑ;ҼL_  6lt'U6V``HG^IW B5% N8OVTad~|eپSo`CY Y blaPQ7%n,ZPut/)"~;59ޖ_L'˓юhAc)t\$) _f{cnz ̜U}`~N<{o%pL_&7_+f*#!Xā@Vg lf5yv٩eBЩY⣿ p(]+ Cd }Xܳr ?DP/f8=W+iʛI566R::Ptz+U"{_\nOlHo|g+*PG"Af*&Z\0_k^bL &Zawn8!y%tYgQCwa&R!ߨK$}cC˔[fL9Gk;xA|hw]T"}+̑]}; >m2 S1qԌ ,grUfK+q #yT}\_W:^OM,([/MØnt==o>J8]ǐZ%6qQyNIJ8$Z C9)g~F%e&LĩD:6TS 斂p~q!5T\̱5_X0}.F2KrAPT4_B9&\qXbSK>ƺzb^HsIJ`{PA)0?w(V}^0 󆡇]Gڨ)?^l9U)ҠX_ޟ5:M ڳ4wdėKv᝔;GIW@ 6 OIJHĻӡQ F tnlR*5;$:l t4xmDgEs e{;vpMPz HwEB zc ސ.޷gy6?,y&LI"C"zt}9@:%󶁒P>= 5,9%pPӁh 99!k\Eͥk+;rmd_;2rɛ[yWbRN#;! (_I0Gl \(w -.7O ~k%[}E8ZZթjWa+i8]CV6 !H_ ,b UxJVew󕓩ʚ`ZX:}b˳kD $d2o|11c).v2 lU=<|ZpO9RL2^7JٟlR% #4>oRc<fwIgB$4No8U@>֠I+S%Q/jc 2u\bf?P1t9ΰLeGu/N]i0|HHɂQx+`a :" `T_G޿bGMJOJ`C+`?X9vjYwy~HTe2C"唻R- 'câ%QɴBgFZ ~HFX4$ =m"Q; .,G# ФͺC/fp[PH>"7p"S?{Eޱ@SB^x-f= MY9>NOrb+m³Y=@d,8M*ǎWZApM{) i8 ֍/|]kڌՖN'pMULmԤ#Bͮ 2ۛiߨaϙ_:MrB Pb5W!W43OgDv܉ޥYFCrqu͚AY^I"Ucd3Y#w'6}QTť5w 7.R ':s)X+(Q/Se5K$k`i-*C0Ounyr0!2&TwJr1LS5TrwK eٓd(p? j߱ѬĪ'2 5̄wK"VvR*V*۶\ cU5} vWt-  VȬn}Bϔ)I]{"LMB]0\3 ejOv68\ <ƨ2ՊKk"?G[5զ/=1 d&ҪXGʟ4+٨F~ >hc>eYǠqLn1m?eL6M6 Va\;"#W3<$ `)ݢc/2@2@y's{tWQNMz5*%v}O)yy#eɣ`u3I/fA8)ʉ&;ڏVcc(k3a1 av)욇̍*<7SCR"\.\iyN¯aW6͛N\] b%Hp+cm{:}{=$0^9C<+>}ּ*3'rDq[|BMw =l$׭Qa^\楴U9~H ϿFaTlΞM ҡ>>='l7/aJQŸBqjh%˚'sC0ъ'?ZWJ-n4[k=ճ:zm|&QMv~< +ABqXӸcvWg",$A`[EkDnke7Ѩ.)*Vʲp d[B2Nj@T٧Qߺ_頩[7j2GE<rݶ@Wn}Z;[qsVTgiӉĐBjUa:J=>d4hTƁ 7? D (y<5FW~㑷CUR&䮒48Tb x#.tJ=c1ufT0%$5.1r~1zc70;[p.>3ԅlVƃiI*H2Zg'3}<$Y6_1Is+"AnB+ᘳP켑.c(hM< Jb=5ߝ[s$@!Rg݋{LDa#70jw) Rjbrl$cHρ|ʐ+_ʎaq6 m%@muzL3 <Q^E%I2#qa8 g mױ.b|4PhՒ)t=Hp?c^Tk-ӏ1js4$c T6[[JD*&O %|؏vC*rtv& \H '0sf"oA/m8>Cg ^J6D 't,$쟗1쨶T;ʉȬ˔S%>E֩tduj`sjEC އ^ Pb]dx-՞n/1Uu_خ͟M B[.ׁ/`TUEw<v3}m5ΡZbZƚ}ܤFtXUE%&ۆҠV^iύjy>6zx$Ve&M"\kX;yog():PתHZ?ͤBShwGܗ/ޏ|p%:P'- ' b ç!ZtPg6icݍnwZF0s_5$8DeͷmVBp v>Vj_"Ǫ58l} hp8Ι_u8B\d3i|lB8 d_gF+".]vuFcK㨿uǍ RndO]>PuGkV;Ń#`DQPpi /SmgOj?X0 2Ȼmm8/;WpXaE,"}6c׳&2ɝ" Tb)} q(K\B8vԟ b$HRdÁ#ؚ%m[ʌRTv(u?/Yv ͦv:_ ^fQh7 x,`N4i}NOsSfIl;DbZ 钱ÚbSqѿ[qj3w$+mZBKp`P\kv}xI.8Zٷvso( b%>S$ʈ{V'dZMxi4%45fω¦\K{7Qj}qo4ʼnqg4 1rf@}UJOy sldU2gm~[ *Hj{?U0[hIۻvtb;>'%hOW.gޗgn.}$vo]ȞrEٻ؋W9R<[ d~,MV\@:N=Pnxfo`Qn{-ť`a@H˚+c DB#~2۟7J- 5n&i! MAn77⡢K#ɠ׈&$ssSLҘm_kb垊E/B%5RבswR^+ϡOmt\kݸ) ".I9>6A{fVM5q62#>,e7 >YHKEfdPUETkے4"e 7h$~XP`16U< %vV fEBঢ$;)sQv6{yϠMj, C:zU\CV`xx5^DΠ^xvye0U suJFʣn;ϱu'\1\c$9׀kk7 WqwVw= ?త샟j\TIiz<۵CoPʍ 6]Z`="uҿJz+ ,~=R)l=0aMtQR5Fg5P@T&Wt례 V`YTRo - {FZ?H>;Nxjl}V#-( z9v{HWh?xvj%\Ū;SZJ'{_1z 3TIRh%dD (-hJo}ә?V'aznЂJcrl"XaiX~KbjGyoRqgIj-2o&>췎xUT#P(f]s30'u'J?~ 7mGSxY2i^ԡ-"Qϥ:DEuR&%՝~ gtǝ%G_g&6#f9;wϦ41GKI}f[`ϫ>rt%4. 28?#1=a`2ΖsmZ*>rQ`+SP kZ|+j;/\Z/JS3\7Ak AO(Fpl-gۼcE>>x*EuxJ~p[(yA!>< Ebڢcl ˭u< y ԛMxŭ(@TSpxpIH5qLDLJ,ٶ!Ypj  ]`WreR^RӜEu֍Dp۵ *bg;#`.HY |{6\Z9*h$`vU3tVHUyn%G1VT5ˆ w&+8bE2(k<}f66*2VLpQ76cL Vҳ4.86fYgb:Ipr4oDi#`4 ?) IX=?G#xa,=:8(g*YM6sbah\Tk^g镑_[&1oUP0\sؾ^ӁeL?wddx0Hv{.tK%tĺ{5 u81tt1U%!7xk$kYk'j9\#1Ǔ\) L^%Dn2򙪯؞ Y HƝ ZJJ b׬h7udyXGxdF"!ez^t*!\vl;$ r*2@&"z$ j{:oGr(i禣i!]R\BT*?xpi,Av&[?t !WޢA}=]~0 /*Kqa'tnc]+qKVk0u}W>0R'!'sHgG5\Y,g#@a @Üڏ c0~@3@ V]$*46.;%>]!,E2Tgwf84+ 5̬"-fulȃ^kҝNۢӟ]ELhIi]*FNQY,^%#90 YZgstat/data/tull.rda0000644000176200001440000001153314750415431013764 0ustar liggesusersBZh91AY&SYI{s 'N̽;zWv}ޅ`Md>Q! Ꙩb4M5SLixFOP54̍#OSbFSMChi26OQA)4&j4d 43AS2&##$lA6m yOI'SzAy =@4dz<@hjcSMzj=@M @hPiQ0&&LL2dѣ&0!4Ѧh& 42Ri(1H=G4 0 42hC@ hhiCA@ɐ$Q&1541ɁhɚLzL 44z!CiAѓɦGh!###hSO !aojZ"$ECQ<ar3qwnkBH@*aCN^C\ -n.Ǯ4sq,)Gs(".=McZհlcƱu @b4 BqfFθ+&RvjrYM*{ @CcmvX0]g}`@P *'}^!KĴqwIˆaĪ RQF&EUVA%]@CUZ҅Qֵ85B"%Uxֆ*E UbKX&&ITUC+P2fϖ0 !D^#if9|yl岘@2dD@DI-lmFch̠!!2"C!C!͑&V̍ (HtbD7w =c~z 2I/$(YmFVaR­*V6V J)Ve6QRխ l-Z%#*m,VUQ$ǂ+Iph+UA 54E>Ͼ d:%m]14Q R/=u+LVU vw (dO##mxWj֯-D0SQ4ƶ7sHI ^p^#)ְgkUn0Ge}Q5ֽ3,` X~&Yg~}x4Sa`Rv[LEbi@He]5 NtZjH[+9NG}v2oiCQ]inX*ِgQ,5y(c2[k Gy9}JCxưĻHFeC! yf88iŇeΏ TCGH d̑~N, B+!hr@72e,  "y)r%NZ LqBԁnzplӴbpZ'8Hd<^Mp >9PĸZ .p;j a G-dI`ٰ!q1@x `@-,bjf?x`lB*vڮ~fIEw`}=|JP!!$xޭa8Xq}HQD'6Q&cQG/N5.ktێS`@""l@7̉\|B. d a~Mhn-7u6LvoS/q4fB䀱`X/D!k= 3yMJR4}u MuXD6x!v=`Ggkh/Xi{zQG) o1S/8 Iקg8di\S :9S 0uZjt7`އ0-uNUH1dU""(2 `""UI z(,=VvN*i_0 ) |[>|]U(DU8FU˲ClWnK2z&$KQfwx,iPnҙ'6u}W@"w[}ynA"lK uoenst*EwmްoH1[];%uaYQQB!|:0y?#+[Ƞl\( & [^G'.VV/ܿRaU6RB9^b%!; "XF˕63rO8EJ,TD@@_ !ÿ1p%ڕus;/\|d`rZ 1Pq & #t9qiQk{ 6O)ñ,Z$>eIr2%@ͲrEYǃY7~y6!0B」 D`z 融hhK<&@ e+d~P{O1`"XcP%dM@9n>,P1 g(BK9;7- |^^{MU͓H6ߓDTg3v [WU'p7q1/ika`u7j7csoní>"D"*E"(AXSt8۶h򇣎eqCE0!qsUu61" ZU%{VMu}vN"h@zilj0D']rA=S2<*3z y/[@BP%πfbiAF" yi2,0ng3)<`ݲvD^~ (i 6vH:qyFF9u[PaiG-)-e\ @n&.N'MFBoj(g7ۻ wpo  qSCUmo}6,.RƫI³BbsSLYk8[pơN[jk$ւOqr$ nj<)y|T/G[Yc`.M{tĒ]@~ 㯤kDaG]BC$;;lgstat/src/0000755000176200001440000000000014750415430012166 5ustar liggesusersgstat/src/select.c0000644000176200001440000001636614646417261013635 0ustar liggesusers/* * select.c: neighborhood selection for local prediction */ #include #include /* qsort() */ #include /* memcpy() */ #include /* sqrt(), fabs() */ #include "defs.h" void Rprintf(const char *,...); #include "userio.h" #include "data.h" #include "utils.h" #include "debug.h" #include "vario.h" #include "defaults.h" #include "glvars.h" #include "nsearch.h" #include "select.h" static int octant_select(DATA *d, DPOINT *where); static int which_octant(DPOINT *where, DPOINT *p, int mode); int CDECL dist_cmp(const DPOINT **ap, const DPOINT **bp); static void print_selection(DATA *d, DPOINT *where); /* beware-of-side-effect macro: don't call with ++/--'s */ #define DPSWAP(a,b) { if (a != b) { tmp = a; a = b; b = tmp; }} static int select_qtree(DATA *d, DPOINT *where) { if (d->n_list <= 0 || d->id < 0 || d->sel_max == 0) return (d->n_sel = 0); /* * global neighbourhood? */ if (IS_GLOBAL(d) || where == NULL) { d->sel = d->list; d->n_sel = d->n_sel_max = d->n_list; if (DEBUG_SEL) { print_selection(d, where); } return d->n_sel; } /* set up or resize selection list, d->sel */ if (d->sel == NULL || d->sel == d->list) { /* first time or after forced global selection: */ d->sel = (DPOINT **) emalloc(d->n_list * sizeof(DPOINT *)); d->n_sel_max = d->n_list; } else if (d->n_list > d->n_sel_max) { /* no, something has changed... */ d->n_sel_max += MAX(MAX_DATA, d->n_list - d->n_sel_max); d->sel = (DPOINT **) erealloc(d->sel, d->n_sel_max * sizeof(DPOINT *)); } if (d->id > 0) { /* 2nd, 3d,..., n_vars-th variable */ if (gl_coincide == DEF_coincide) gl_coincide = decide_on_coincide(); /* establish first ... */ if (gl_coincide) { int i; DATA **data = get_gstat_data(); d->n_sel = data[0]->n_sel; for (i = 0; i < d->n_sel; i++) /* copy previous selection: */ d->sel[i] = d->list[GET_INDEX(data[0]->sel[i])]; if (DEBUG_SEL) print_selection(d, where); return d->n_sel; /* and we're done!! */ } } /* * So far, no selection has been done. * Let's see if today's job is easily done: */ memcpy(d->sel, d->list, d->n_list * sizeof(DPOINT *)); if (d->sel_rad >= DBL_MAX && d->sel_max >= d->n_list && d->oct_max == 0) { d->n_sel = d->n_list; if (DEBUG_SEL) print_selection(d, where); return d->n_sel; } /* * now we're sure that (a) sel_rad is set, or (b) sel_max < n_list, * or (c) oct_max is set, so let's do the smart thing: */ qtree_select(where, d); return -1; /* more work to do */ } int select_at(DATA *d, DPOINT *where) { /* * fill the array d->sel appropriatly given x,y,z,d->sel_min,d->sel_max * and d->sel_rad: possibly by corresponding semivariance value * first select all points within a distance d->sel_rad from where * then select at max the d->sel_max nearest and return no selection * if there are less then d->sel_min * if "FORCE", then select ALWAYS the d->sel_min nearest points. * * corrected variogram distance feb. 16th 1993 * changed search to normalizing to (0,0,0) first, aug 1993 */ if (d->what_is_u == U_UNKNOWN) d->what_is_u = U_ISDIST; /* we're going to fill this right now */ else if (d->what_is_u != U_ISDIST) ErrMsg(ER_IMPOSVAL, "select_at() needs distances"); if (select_qtree(d,where) != -1) return d->n_sel; /* * so, now we're at the stage where one of the following conditions holds: * (a) we selected all points within d->sel_rad * (b) we selected (at least) the nearest d->sel_max * (c) we selected (forced) at least d->sel_min, possibly beyond d->sel_rad * Now, should we select further, sorting on distance? * */ if (d->vdist) { /* use variogram distance as sort criterium */ int i; for (i = 0; i < d->n_sel; i++) d->sel[i]->u.dist2 = get_semivariance(get_vgm(LTI(d->id,d->id)), where->x - d->sel[i]->x, where->y - d->sel[i]->y, where->z - d->sel[i]->z); } if (d->oct_max) { /* do octant selection */ d->oct_filled = octant_select(d, where); /* sorts, adjusts n_sel and destroys distance order, so only */ if (get_method() == SPREAD) /* then we've got to re-order them */ qsort(d->sel, (size_t) d->n_sel, sizeof(DPOINT *), (int CDECL (*)(const void *,const void *)) dist_cmp); } if (d->vdist) { qsort(d->sel, (size_t) d->n_sel, sizeof(DPOINT *), (int CDECL (*)(const void *, const void *)) dist_cmp); /* pick d->sel_[max|min] nearest: */ if (d->sel_min && d->n_sel == d->sel_min && d->sel[d->n_sel]->u.dist2 > d->sel_rad) /* we forced: */ d->n_sel = d->sel_min; if (d->n_sel > d->sel_max) d->n_sel = d->sel_max; } if (DEBUG_SEL) print_selection(d, where); return d->n_sel; } static int octant_select(DATA *d, DPOINT *where) { /* * selects the d->oct_max nearest points per octant/quadrant/secant, * using euclidian or variogram distance */ int i, j, noct = 1, n, start = 0, end = 0, n_notempty = 0; DPOINT **sel, *tmp; if (d->mode & Z_BIT_SET) noct = 8; else if (d->mode & Y_BIT_SET) noct = 4; else noct = 2; sel = d->sel; for (i = 0; i < noct; i++) { /* for each octant: */ /* start == end: */ for (j = start; j < d->n_sel; j++) { /* for the remaining of sel: */ if (which_octant(where, sel[j], d->mode) == i) { DPSWAP(sel[end], sel[j]); end++; /* j >= end */ } } n = end - start; /* # of pts in octant i */ if (n > 0) n_notempty++; /* Yahoo, another non-empty octant! */ if (n > d->oct_max) { /* to get the closest n: sort sel from start to end: */ qsort(sel + start, (size_t) n, sizeof(DPOINT *), (int CDECL (*)(const void *, const void *)) dist_cmp); /* swap the remaining ones to the end of sel and forget about'm: */ for (j = start + d->oct_max; j < end; j++) { d->n_sel--; DPSWAP(sel[j], sel[d->n_sel]); } /* accept the first d->oct_max: */ start += d->oct_max; /* proceed with the next octant: */ end = start; } else /* accept all n: */ start = end; } if (end != d->n_sel) { Rprintf("end: %d, n_sel: %d\n", end, d->n_sel); ErrMsg(ER_IMPOSVAL, "octant_select(): remaining points"); } return n_notempty; /* # non-empty octants */ } static int which_octant(DPOINT *where, DPOINT *p, int mode) { /* * it's pretty hard to get this right for perfectly alligned 3D data: * in case of omax=1 and only one point at exactly equal distances * in each of the 6 directions, not all 6 are taken. * For 2D (omax=1, 4 points) this works, however. */ double dx, dy, dz; int x = 0, y = 0, z = 0; dx = p->x - where->x; /* < 0 : p in west half */ dy = p->y - where->y; /* < 0 : p in south half */ dz = p->z - where->z; /* < 0 : p in lower half */ if (mode & Z_BIT_SET) z = (dz < 0); if (mode & Y_BIT_SET) { x = (dy < 0 ? dx > 0 : dx >= 0); y = (dx < 0 ? dy >= 0 : dy > 0); } else x = (where->x < p->x); return (x | (y << 1) | (z << 2)); } int CDECL dist_cmp(const DPOINT **pa, const DPOINT **pb) { /* ANSI qsort() conformant dist_cmp */ if ( (*pa)->u.dist2 < (*pb)->u.dist2 ) return -1; if ( (*pa)->u.dist2 > (*pb)->u.dist2 ) return 1; return 0; } static void print_selection(DATA *d, DPOINT *where) { /* Add this statement to filter out * empty selections if (!d->n_sel) return; */ if (where) { printlog("selection at "); logprint_point(where, d); } else printlog("(NULL selection location)"); print_data_selection(d); } gstat/src/mapio.c0000644000176200001440000000622514646417261013454 0ustar liggesusers/* * former mapio io functions, now only skeleton things doing row/col <--> x/y */ #include /* floor() */ #include /* FLT_MAX */ #include "defs.h" #include "glvars.h" #include "utils.h" #include "debug.h" #include "userio.h" #include "mapio.h" static GRIDMAP *write_error(GRIDMAP * m); #define SWAP_N(a,n) swap_floats((unsigned char *)a,n) #define SWAP_M_N(a,m,n) swap_multiformat((unsigned char *)a,m,n) #define CHECK_ROWS 1 #define CHECK_COLS 2 #define CHECK_CELLSIZE 4 #define CHECK_X_UL 8 #define CHECK_Y_UL 16 #define CHECK_SUM 31 /* sum of all checks */ #define BINARY_NATIVE 1 #define BINARY_NON_NATIVE 2 #define DEFAULT_MISVAL -9999.0 #define SURFER_MISVAL 1.70141E+38 /* * create a new GRIDMAP structure * allocates memory and initializes all fields for a GRIDMAP structure * returns: pointer to GRIDMAP structure */ GRIDMAP *new_map(MAP_READ_STATUS status) { GRIDMAP *map; map = (GRIDMAP *) emalloc(sizeof(GRIDMAP)); map->status = status; map->type = MT_UNKNOWN; map->history = NULL; map->description = NULL; map->filename = NULL; map->rows = 0; map->cols = 0; map->base_size = 0; map->grid = NULL; map->base = NULL; map->first_time_row = NULL; map->is_binary = 0; map->celltype = CT_UNKNOWN; map->misval = DEFAULT_MISVAL; /* only for arcgrid */ map->cellmin = map->cellmax = FLT_MAX; map->CSF_MAP = NULL; map->write = write_error; map->read_row = map->write_row = NULL; map->current_row = 0; return map; } static GRIDMAP *write_error(GRIDMAP * m) { pr_warning("%s: writing this map format is not supported", m->filename); assert(0); return NULL; } /* * give x,y coordinate of cell center for cell [row, col] * libcsf has it's own function; other formats assume increasing x * for increasing cols and decreasing y for increasing rows * returns: non-zero if row or col are outside map limits */ int map_rowcol2xy(GRIDMAP * m, /* pointer to gridmap */ unsigned int row, /* current row number */ unsigned int col, /* current column number */ double *x, /* return value: pointer to x-coordinate */ double *y /* return value: pointer to y-coordinate */ ) { assert(m); assert(x); assert(y); if (row >= m->rows || col >= m->cols) return 1; *x = m->x_ul + (col + 0.5) * m->cellsizex; *y = m->y_ul - (row + 0.5) * m->cellsizey; return 0; } /* * converts x and y coordinate to (row,col) pair. * * see comment for map_rowcol2xy() * * returns: non-zero if x or y are outside map limits */ int map_xy2rowcol(GRIDMAP * m /* pointer to map */ , double x, /* x-coordinate */ double y, /* y-coordinate */ unsigned int *row, /* output value: pointer to row number */ unsigned int *col /* output value: pointer to column number */ ) { assert(m); assert(row); assert(col); if (x < m->x_ul || x > m->x_ul + m->cols * m->cellsizex || y > m->y_ul || y < m->y_ul - m->rows * m->cellsizey) return 1; *row = (unsigned int) floor((m->y_ul - y) / m->cellsizey); *col = (unsigned int) floor((x - m->x_ul) / m->cellsizex); if (*row == m->rows) /* on the bottom edge */ *row = *row - 1; if (*col == m->cols) /* on the right edge */ *col = *col - 1; return 0; } gstat/src/vario_io.c0000644000176200001440000001011114646417261014143 0ustar liggesusers/* * vario_io.c: functions for point-point, point-block (co/semi)variances */ #include #include #include #include "userio.h" #include "debug.h" #include "data.h" #include "vario.h" #include "block.h" #include "glvars.h" /* get_block_p(), gl_zero, gl_longlat */ #include "vario_io.h" static double sem_cov_blocks(VARIOGRAM *v, DATA *a, DATA *b, int sem); double sem_cov_ab(VARIOGRAM *v, DPOINT *a, DPOINT *b, int sem) /* * return Cov(a,b) or Sem(a,b), * taking care of IS_BLOCK(a) and IS_BLOCK(b): */ { static DATA *Discr_a = NULL, *Discr_b = NULL; static DPOINT *block_p = NULL; DPOINT *tmp; if (block_p == NULL) block_p = get_block_p(); if (a == b) { if (IS_POINT(a)) return sem_cov_blocks(v, NULL, NULL, sem); Discr_a = block_discr(Discr_a, block_p, a); return sem_cov_blocks(v, Discr_a, Discr_a, sem); } /* * if one of them IS_BLOCK, make sure it's a: * (because block_discr() will otherwise store block * discretisations in both Discr_a and Discr_b) */ if (IS_POINT(a) && IS_BLOCK(b)) { tmp = a; a = b; b = tmp; /* swap a and b */ } Discr_a = block_discr(Discr_a, block_p, a); Discr_b = block_discr(Discr_b, block_p, b); return sem_cov_blocks(v, Discr_a, Discr_b, sem); } static double sem_cov_blocks(VARIOGRAM *v, DATA *a, DATA *b, int sem) { /* * Purpose : calculates (once) and returns Cov(a,b); * if a==b && a denotes a block discretisation, the value * is put in a->block_variance and a->block_xxx_set gets 1 * Created by : Edzer J. Pebesma * Date : 25 jan 1992, 3 june 1993 * Prerequisites : none * Returns : sem == 1 ? Sem(a,b) : Cov(a,b) * Side effects : none */ int i, j; double block_value, dx, dy = 0.0, dz = 0.0, dist, ret, weight, dzero2; DPOINT *dpa, *dpb; /* if (a->what_is_u != U_ISWEIGHT || b->what_is_u != U_ISWEIGHT) ErrMsg(ER_IMPOSVAL, "weights needed in SevCov_Blocks()"); */ if (a == NULL) return sem ? get_semivariance(v, 0.0, 0.0, 0.0) : get_covariance(v, 0.0, 0.0, 0.0); if (a->n_list == 1 && b->n_list == 1) { /* point--point */ if (gl_longlat) { if (! v->isotropic) ErrMsg(ER_IMPOSVAL, "for long/lat data, anisotropy cannot be defined"); dist = pp_norm_gc(a->list[0], b->list[0]); ret = sem ? get_semivariance(v, dist, 0.0, 0.0): get_covariance(v, dist, 0.0, 0.0); /* printf("ll dist: %g, ret.val %g\n", dist, ret); */ return ret; } else { return sem ? get_semivariance(v, a->list[0]->x - b->list[0]->x, a->list[0]->y - b->list[0]->y, a->list[0]->z - b->list[0]->z): get_covariance(v, a->list[0]->x - b->list[0]->x, a->list[0]->y - b->list[0]->y, a->list[0]->z - b->list[0]->z); } } /* now a->n_list > 1 or b->n_list > 1: block--block or point--block */ if (gl_longlat) ErrMsg(ER_IMPOSVAL, "block kriging for long-lat data undefined"); if (a == b) { /* block--block for a single block */ if (sem && v->block_semivariance_set) return v->block_semivariance; if (!sem && v->block_covariance_set) return v->block_covariance; } /* else: continue */ dzero2 = gl_zero * gl_zero; block_value = 0.0; for (i = 0; i < a->n_list; i++) { for (j = 0; j < b->n_list; j++) { /* compare all points with all p */ dpa = a->list[i]; dpb = b->list[j]; weight = dpa->u.weight * dpb->u.weight; /* avoid the "zero-effect" if a or b is block: */ dx = dpa->x - dpb->x; dy = dpa->y - dpb->y; dz = dpa->z - dpb->z; /* avoid ``zero-effect'': */ if (a->pp_norm2(dpa, dpb) < dzero2) { dx = (dx >= 0 ? gl_zero : -gl_zero); if (a->mode & Y_BIT_SET) dy = (dy >= 0 ? gl_zero : -gl_zero); if (a->mode & Z_BIT_SET) dz = (dz >= 0 ? gl_zero : -gl_zero); } if (sem) block_value += weight * get_semivariance(v, dx, dy, dz); else block_value += weight * get_covariance(v, dx, dy, dz); } /* for j */ } /* for i */ if (a == b) { /* remember within block cov./sem.: */ if (sem) { v->block_semivariance = block_value; v->block_semivariance_set = 1; } else { v->block_covariance = block_value; v->block_covariance_set = 1; } } return block_value; } gstat/src/sem.c0000644000176200001440000005542414646417261013140 0ustar liggesusers/* * sem.c: calculate sample (cross, co-) variogram from data * K.M. refers to changes by Konstantin Malakhanov, see also mapio.c */ #include #include #include "defs.h" #include "mapio.h" #include "userio.h" #include "data.h" #include "utils.h" #include "debug.h" #include "vario.h" #include "glvars.h" #include "select.h" #include "gls.h" #include "mtrx.h" #include "lm.h" #include "defaults.h" #include "direct.h" #include "sem.h" #define SEM_INCREMENT 1000 static double valid_distance(DPOINT *a, DPOINT *b, double max, int symmetric, DATA *d1, DATA *d2, GRIDMAP *m); static void divide(SAMPLE_VGM *ev); static SAMPLE_VGM *alloc_exp_variogram(DATA *a, DATA *b, SAMPLE_VGM *ev); /* variograms: */ static SAMPLE_VGM *semivariogram(DATA *a, SAMPLE_VGM *ev); static SAMPLE_VGM *cross_variogram(DATA *a, DATA *b, SAMPLE_VGM *ev); /* covariograms: */ static SAMPLE_VGM *covariogram(DATA *a, SAMPLE_VGM *ev); static SAMPLE_VGM *cross_covariogram(DATA *a, DATA *b, SAMPLE_VGM *ev); static int get_index(double dist, SAMPLE_VGM *ev); static SAMPLE_VGM *semivariogram_list(DATA *d, SAMPLE_VGM *ev); static SAMPLE_VGM *semivariogram_grid(DATA *d, SAMPLE_VGM *ev); static void push_to_cloud(SAMPLE_VGM *ev, double gamma, double dist, unsigned long index); static void resize_ev(SAMPLE_VGM *ev, unsigned int size); static void *register_pairs(void *p, unsigned long nh, DPOINT *a, DPOINT *b); /* * gl_cressie: use Cressie's sqrt(absdiff) estimator; * ev->zero: * case ZERO_INCLUDE: use zero distances in first interval (omit); * case ZERO_AVOID: avoid zero distances; * case ZERO_SPECIAL: make special estimate for distance zero; */ /* * calculate sample variogram from data * calculates variogram, crossvariogram, covariogram or crosscovariogram * from sample data. Data are obtained from the central data base (glvars) * using get_gstat_data(), and the variogram requested is that of data id * v->id1 and v->id2 -- a direct (co) variogram when id1 == id2, a cross * (co) variogram when id1 != id2. * * if [[v->fname is set and]] (one of) id1 or id2 is a dummy data, the * actual sample variogram is not calculated but rather read from the * file v->fname. This is done to enable separate sample variogram * calculation (in batch or on a fast remote computer) and model fitting * (e.g. on the desk top). * * returns: non-zero if writing sample variogram to file failed. */ int calc_variogram(VARIOGRAM *v /* pointer to VARIOGRAM structure */, const char *fname /* pointer to output file name, or NULL if no output has to be written to file */ ) { DATA **d = NULL, *d1 = NULL, *d2 = NULL; assert(v); d = get_gstat_data(); d1 = d[v->id1]; d2 = d[v->id2]; if (d1->sel == NULL) select_at(d1, NULL); /* global selection (sel = list) */ if (d2->sel == NULL) select_at(d2, NULL); if (v->ev->evt == CROSSVARIOGRAM && (v->ev->pseudo == -1 || v->ev->is_asym == -1)) { if (v->ev->pseudo == -1) { /* v's first time, need to find out pseudo */ if (coordinates_are_equal(d[v->id1], d[v->id2])) v->ev->pseudo = 0; else v->ev->pseudo = 1; } if (gl_sym_ev == 0) v->ev->is_asym = v->ev->pseudo; /* pseudo: always, else: only if set */ else v->ev->is_asym = 0; } else v->ev->is_asym = v->ev->pseudo = 0; if (gl_zero_est == ZERO_DEFAULT) { /* choose a suitable default */ if (is_covariogram(v)) v->ev->zero = ZERO_SPECIAL; else { /* v is variogram */ if (v->ev->pseudo) v->ev->zero = ZERO_SPECIAL; else v->ev->zero = ZERO_INCLUDE; } } else v->ev->zero = zero_int2enum(gl_zero_est); assert(v->ev->zero != ZERO_DEFAULT); fill_cutoff_width(d1, v); if (v->ev->map && v->ev->S_grid == NULL) return -1; v->ev->cloud = (v->ev->iwidth <= 0.0); if (v->ev->cloud && (d[v->id1]->n_sel >= MAX_NH || d[v->id2]->n_sel >= MAX_NH)) pr_warning("observation numbers in cloud will be wrong"); set_direction_values(gl_alpha, gl_beta, gl_tol_hor, gl_tol_ver); v->ev->is_directional = is_directional(v); if (v->ev->recalc) { switch (v->ev->evt) { case PRSEMIVARIOGRAM: case SEMIVARIOGRAM: semivariogram(d[v->id1], v->ev); break; case CROSSVARIOGRAM: cross_variogram(d[v->id1], d[v->id2], v->ev); break; case COVARIOGRAM: v->ev->is_asym = gl_sym_ev; covariogram(d[v->id1], v->ev); break; case CROSSCOVARIOGRAM: cross_covariogram(d[v->id1], d[v->id2], v->ev); break; case NOTSPECIFIED: default: assert(0); /* aborts */ break; } } return 0; } static SAMPLE_VGM *semivariogram(DATA *d, SAMPLE_VGM *ev) { /* * calculate sample variogram of 0.5 E[(Z(x)-Z(x+h))2] */ if (ev->evt == PRSEMIVARIOGRAM) d->calc_residuals = 0; ev = alloc_exp_variogram(d, NULL, ev); if (d->grid != NULL && d->prob > 0.5 && d->every == 1) ev = semivariogram_grid(d, ev); else ev = semivariogram_list(d, ev); divide(ev); ev->recalc = 0; return ev; } /* semivariogram() */ static SAMPLE_VGM *semivariogram_list(DATA *d, SAMPLE_VGM *ev) { unsigned long uli, ulj; int i, j, index = 0, divide_by = 1; unsigned int total_steps; double gamma, ddist, head, tail, gam; while (d->n_sel / divide_by > 0.5 * sqrt(INT_MAX)) divide_by <<= 1; /* prevent overflow on calculating total_steps */ total_steps = (d->n_sel / divide_by) * (d->n_sel - 1) / 2; print_progress(0, total_steps); if (DEBUG_DUMP) printlog("Calculating semivariogram from %d points...\n", d->n_sel); for (i = 0; i < d->n_sel; i++) { print_progress((i / divide_by) * (i - 1) / 2, total_steps); R_CheckUserInterrupt(); /* printlog("step: %u of %u\n", (i /divide_by) * (i - 1) / 2, total_steps); */ for (j = 0; j < (ev->map != NULL ? d->n_sel : i); j++) { ddist = valid_distance(d->sel[i], d->sel[j], ev->cutoff, 1, d, d, (GRIDMAP *) ev->map); if (ddist >= 0.0 && i != j) { head = d->sel[i]->attr; tail = d->sel[j]->attr; if (! ev->cloud) { index = get_index(ddist, ev); if (gl_cressie) /* sqrt abs diff */ ev->gamma[index] += sqrt(fabs(head - tail)); else if (ev->evt == PRSEMIVARIOGRAM) { gam = 2.0 * (head - tail)/(head + tail); ev->gamma[index] += SQR(gam); } else { /* SEMIVARIOGRAM: */ ev->gamma[index] += SQR(head - tail); #ifdef ADJUST_VARIANCE if (d->colnvariance) ev->gamma[index] -= d->sel[i]->variance + d->sel[j]->variance; #endif } ev->dist[index] += ddist; ev->pairs[index] = register_pairs(ev->pairs[index], ev->nh[index], d->sel[i], d->sel[j]); ev->nh[index]++; } else { /* cloud: */ if (! (ev->zero == ZERO_AVOID && ddist == 0.0)) { if (gl_cressie) gamma = sqrt(fabs(head - tail)); else if (ev->evt == PRSEMIVARIOGRAM) { gam = 2.0 * (head - tail)/(head + tail); gamma = gam * gam; } else { gamma = SQR(head - tail); #ifdef ADJUST_VARIANCE if (d->colnvariance) gamma -= d->sel[i]->variance + d->sel[j]->variance; #endif } uli = i; ulj = j; push_to_cloud(ev, gamma / 2.0, ddist, TO_NH(uli,ulj)); } } }/* if ddist >= 0 */ } /* for j */ } /* for i */ print_progress(total_steps, total_steps); if (DEBUG_DUMP) printlog("ready\n"); return ev; } static SAMPLE_VGM *semivariogram_grid(DATA *d, SAMPLE_VGM *ev) { typedef struct { int row, col, ev_index; double dist; } grid_index; struct { int n; grid_index *gi; } grid_ev; int row, col, irow, icol, i, max_index, index; unsigned long ula, ulb; double gamma, ddist, head, tail, gam; DPOINT a, b, *dpa = NULL, *dpb = NULL; max_index = (int) floor(ev->cutoff / SQUARECELLSIZE(d->grid)); grid_ev.gi = (grid_index *) emalloc(2 * (max_index + 1) * (max_index + 1) * sizeof(grid_index)); grid_ev.n = 0; a.x = a.y = a.z = b.z = 0.0; /* setup the grid: */ for (row = 0; row <= max_index; row++) { for (col = (row == 0 ? 1 : -max_index); col <= max_index; col++) { b.x = col * SQUARECELLSIZE(d->grid); b.y = - row * SQUARECELLSIZE(d->grid); ddist = valid_distance(&a, &b, ev->cutoff, 1, d, d, (GRIDMAP *) ev->map); if (ddist > 0.0) { grid_ev.gi[grid_ev.n].row = row; grid_ev.gi[grid_ev.n].col = col; grid_ev.gi[grid_ev.n].dist = ddist; if (! ev->cloud) grid_ev.gi[grid_ev.n].ev_index = get_index(ddist, ev); if (DEBUG_DUMP) printlog("row %d col %d index %d\n", row, col, grid_ev.gi[grid_ev.n].ev_index); grid_ev.n++; } } } print_progress(0, d->grid->rows); for (row = 0; row < d->grid->rows; row++) { for (col = 0; col < d->grid->cols; col++) { if ((dpa = d->grid->dpt[row][col]) != NULL) { for (i = 0; i < grid_ev.n; i++) { irow = row + grid_ev.gi[i].row; icol = col + grid_ev.gi[i].col; if (irow >= 0 && icol >= 0 && irow < d->grid->rows && icol < d->grid->cols && ((dpb = d->grid->dpt[irow][icol]) != NULL)) { ddist = grid_ev.gi[i].dist; head = dpa->attr; tail = dpb->attr; if (! ev->cloud) { index = grid_ev.gi[i].ev_index; if (gl_cressie) /* sqrt abs diff */ ev->gamma[index] += sqrt(fabs(head - tail)); else { if (ev->evt == PRSEMIVARIOGRAM) { gam = 2.0 * (head - tail)/(head + tail); ev->gamma[index] += gam * gam; } else ev->gamma[index] += SQR(head - tail); #ifdef ADJUST_VARIANCE if (d->colnvariance) ev->gamma[index] -= dpa->variance + dpb->variance; #endif } ev->dist[index] += ddist; ev->pairs[index] = register_pairs(ev->pairs[index], ev->nh[index], dpa, dpb); ev->nh[index]++; } else { /* cloud: */ if (gl_cressie) gamma = sqrt(fabs(head - tail)); else if (ev->evt == PRSEMIVARIOGRAM) { gam = 2.0 * (head - tail)/(head + tail); gamma = gam * gam; } else { gamma = SQR(head - tail); #ifdef ADJUST_VARIANCE if (d->colnvariance) gamma -= dpa->variance + dpb->variance; #endif } ula = GET_INDEX(dpa); ulb = GET_INDEX(dpb); push_to_cloud(ev, gamma / 2.0, ddist, TO_NH(ula,ulb)); } /* else !cloud */ } /* if we have two non-NULL points */ } /* for all possibly relevant pairs */ } /* if this grid cell is non-NULL */ } /* for all cols */ print_progress(row + 1, d->grid->rows); R_CheckUserInterrupt(); } /* for all rows */ efree(grid_ev.gi); return ev; } /* covariograms: */ static SAMPLE_VGM *covariogram(DATA *d, SAMPLE_VGM *ev) { int i, j, index = 0; unsigned long uli, ulj; double gamma, ddist; ev->evt = COVARIOGRAM; ev = alloc_exp_variogram(d, NULL, ev); for (i = 0; i < d->n_sel; i++) { print_progress(i, d->n_sel); R_CheckUserInterrupt(); for (j = 0; j <= (ev->map != NULL ? d->n_sel-1 : i); j++) { ddist = valid_distance(d->sel[i], d->sel[j], ev->cutoff, 1, d, d, (GRIDMAP *) ev->map); if (ddist >= 0.0) { if (! ev->cloud) { index = get_index(ddist, ev); ev->gamma[index] += d->sel[i]->attr * d->sel[j]->attr; #ifdef ADJUST_VARIANCE if (d->colnvariance && i == j) ev->gamma[index] -= d->sel[i]->variance; #endif ev->dist[index] += ddist; ev->pairs[index] = register_pairs(ev->pairs[index], ev->nh[index], d->sel[i], d->sel[j]); ev->nh[index]++; } else { if (! (ev->zero == ZERO_AVOID && ddist == 0.0)) { gamma = d->sel[i]->attr * d->sel[j]->attr; #ifdef ADJUST_VARIANCE if (d->colnvariance && i == j) gamma -= d->sel[i]->variance; #endif uli = i; ulj = j; push_to_cloud(ev, gamma, ddist, TO_NH(uli,ulj)); } } }/* if ddist >= 0 */ } /* for j */ } /* for i */ print_progress(d->n_sel, d->n_sel); divide(ev); ev->recalc = 0; return ev; } /* covariogram() */ static SAMPLE_VGM *cross_variogram(DATA *a, DATA *b, SAMPLE_VGM *ev) { int i, j, index = 0; unsigned long uli, ulj; double gamma, ddist; ev->evt = CROSSVARIOGRAM; ev = alloc_exp_variogram(a, b, ev); for (i = 0; i < a->n_sel; i++) { print_progress(i, a->n_sel); R_CheckUserInterrupt(); for (j = 0; j < b->n_sel; j++) { ddist = valid_distance(a->sel[i], b->sel[j], ev->cutoff, gl_sym_ev || !ev->pseudo, a, b, (GRIDMAP *) ev->map); if (ddist >= 0.0) { if (!ev->pseudo && i != j) { if (! ev->cloud) { index = get_index(ddist, ev); ev->gamma[index] += (a->sel[i]->attr - a->sel[j]->attr) * (b->sel[i]->attr - b->sel[j]->attr); ev->dist[index] += ddist; ev->pairs[index] = register_pairs(ev->pairs[index], ev->nh[index], a->sel[i], a->sel[j]); ev->nh[index]++; } else if (!(ddist == 0.0 && ev->zero == ZERO_AVOID)) { gamma = (a->sel[i]->attr - a->sel[j]->attr) * (b->sel[i]->attr - b->sel[j]->attr); uli = i; ulj = j; push_to_cloud(ev, gamma / 2.0, ddist, TO_NH(uli,ulj)); } } else if (ev->pseudo) { if (! ev->cloud) { index = get_index(ddist, ev); ev->gamma[index] += SQR(a->sel[i]->attr - b->sel[j]->attr); #ifdef ADJUST_VARIANCE if (a->colnvariance || b->colnvariance) ev->gamma[index] -= a->sel[i]->variance + b->sel[j]->variance; #endif ev->dist[index] += ddist; ev->pairs[index] = register_pairs(ev->pairs[index], ev->nh[index], a->sel[i], b->sel[j]); ev->nh[index]++; } else if (! (ev->zero == ZERO_AVOID && ddist == 0.0)) { gamma = SQR(a->sel[i]->attr - b->sel[j]->attr); #ifdef ADJUST_VARIANCE if (a->colnvariance || b->colnvariance) gamma -= a->sel[i]->variance + b->sel[j]->variance; #endif uli = i; ulj = j; push_to_cloud(ev, gamma / 2.0, ddist, TO_NH(uli,ulj)); } } }/* if ddist >= 0 */ } /* for j */ } /* for i */ print_progress(a->n_sel, a->n_sel); divide(ev); ev->recalc = 0; return ev; } /* cross_variogram */ static SAMPLE_VGM *cross_covariogram(DATA *a, DATA *b, SAMPLE_VGM *ev) { int i, j, index = 0; unsigned long uli, ulj; double gamma, ddist; ev->evt = CROSSCOVARIOGRAM; ev = alloc_exp_variogram(a, b, ev); for (i = 0; i < a->n_sel; i++) { /* i -> a */ R_CheckUserInterrupt(); print_progress(i, a->n_sel); for (j = 0; j < b->n_sel; j++) { /* j -> b */ ddist = valid_distance(a->sel[i], b->sel[j], ev->cutoff, gl_sym_ev, a, b, (GRIDMAP *) ev->map); if (ddist >= 0.0) { if (! ev->cloud) { index = get_index(ddist, ev); ev->gamma[index] += a->sel[i]->attr * b->sel[j]->attr; ev->dist[index] += ddist; ev->pairs[index] = register_pairs(ev->pairs[index], ev->nh[index], a->sel[i], b->sel[j]); ev->nh[index]++; } else if (! (ev->zero == ZERO_AVOID && ddist == 0.0)) { gamma = a->sel[i]->attr * b->sel[j]->attr; uli = i; ulj = j; push_to_cloud(ev, gamma, ddist, TO_NH(uli,ulj)); } }/* if ddist >= 0 */ } /* for j */ } /* for i */ print_progress(a->n_sel, a->n_sel); divide(ev); ev->recalc = 0; return ev; } /* cross_covariogram() */ static double valid_distance(DPOINT *a, DPOINT *b, double max, int symmetric, DATA *d1, DATA *d2, GRIDMAP *map) { double ddist, dX, dX2, inprod; DPOINT p; int /* mode = 0, */ i; unsigned int row, col; assert(a != NULL); assert(b != NULL); assert(d1 != NULL); assert(d2 != NULL); /* mode = d1->mode & d2->mode; */ /* * even if modes don't correspond, valid_direction() will * calculate valid distances */ p.x = a->x - b->x; p.y = a->y - b->y; p.z = a->z - b->z; if (map && !gl_longlat) { /* transform here p to allow directional 2d cuts in a 3d world */ if (map_xy2rowcol(map, p.x, p.y, &row, &col)) return -1.0; else ddist = (1.0 * row) * map->cols + col + 0.5; } else { if (!gl_longlat && (p.x > max || p.y > max || p.z > max)) return -1.0; /* Changed K.M. Fri Feb 27 15:56:57 1998 */ /* if ddist < 0.0 then we don't need to check for dX! */ if ((ddist = valid_direction(a, b, symmetric, d1)) > max || ddist < 0.0) return -1.0; } dX = MIN(d1->dX, d2->dX); if (dX < DBL_MAX) { dX2 = dX * dX; /* allow only points for which 2-norm ||x_i-x_j|| < dX */ if (d1->n_X != d2->n_X) ErrMsg(ER_IMPOSVAL, "valid_distance(): d1->n_X != d2->n_X"); for (i = 0, inprod = 0.0; i < d1->n_X; i++) { inprod += SQR(a->X[i] - b->X[i]); /* printf("a->X[%d]: %g, b->X[%d]: %g", i, a->X[i], i, b->X[i]); */ } if (inprod > dX2) ddist = -1.0; /* printf("dX2: %g, inprod: %g ddist: %g\n", dX2, inprod, ddist); */ } return ddist; } int is_directional(VARIOGRAM *v) { switch(v->ev->evt) { case CROSSCOVARIOGRAM: if (gl_sym_ev == 0) /* asymmetric cross(co)variances: */ return (gl_tol_hor < 180.0 || gl_tol_ver < 180.0); else return (gl_tol_hor < 90.0 || gl_tol_ver < 90.0); case CROSSVARIOGRAM: if (v->ev->is_asym && gl_sym_ev == 0) /* asymm. cross(co)variances: */ return (gl_tol_hor < 180.0 || gl_tol_ver < 180.0); else return (gl_tol_hor < 90.0 || gl_tol_ver < 90.0); default: /* symmetric (co)variances */ return (gl_tol_hor < 90.0 || gl_tol_ver < 90.0); } } /* * this function should be changed--the mask map stack is misused as * to define the topology of variogram maps. * * use min/max coordinates for block diagonal as maximum cutoff * Returns: about 1/3 the max. dist between any two points in data. */ void fill_cutoff_width(DATA *data /* pointer to DATA structure to derive the values from */, VARIOGRAM *v /* pointer to VARIOGRAM structure */) { double d = 0.0; int i; GRIDMAP *m; DATA_GRIDMAP *dg; SAMPLE_VGM *ev; assert(data); assert(v); ev = v->ev; if (ev->S_grid != NULL) { m = new_map(READ_ONLY); /* process S_grid to m */ dg = (DATA_GRIDMAP *) ev->S_grid; m->x_ul = dg->x_ul; m->y_ul = dg->y_ul; m->cellsizex = dg->cellsizex; m->cellsizey = dg->cellsizey; m->rows = dg->rows; m->cols = dg->cols; ev->iwidth = 1.0; ev->cutoff = m->rows * m->cols; /* not a real cutoff, but rather the size of the container array */ ev->map = m; } else if (gl_bounds != NULL) { i = 0; while (gl_bounds[i] >= 0.0) /* count length */ i++; ev->cutoff = gl_bounds[i-1]; ev->iwidth = ev->cutoff / i; } else { if (is_mv_double(&(ev->cutoff))) { if (gl_cutoff < 0.0) { d = data_block_diagonal(data); if (d == 0.0) ev->cutoff = 1.0; /* ha ha ha */ else ev->cutoff = d * gl_fraction; } else ev->cutoff = gl_cutoff; } if (is_mv_double(&(ev->iwidth))) { if (gl_iwidth < 0.0) ev->iwidth = ev->cutoff / gl_n_intervals; else ev->iwidth = gl_iwidth; } } } static SAMPLE_VGM *alloc_exp_variogram(DATA *a, DATA *b, SAMPLE_VGM *ev) { int i; double nd; assert(a != NULL); assert(ev != NULL); if (gl_zero_est != ZERO_DEFAULT && ev->zero != gl_zero_est) ev->zero = zero_int2enum(gl_zero_est); if (gl_gls_residuals) { if (a->calc_residuals) make_gls(a, 1); if (b != NULL && b->calc_residuals) make_gls(b, 1); } else { if (a->calc_residuals) make_residuals_lm(a); if (b != NULL && b->calc_residuals) make_residuals_lm(b); } if (ev->cloud) { ev->n_est = 0; return ev; } if (gl_bounds != NULL) { for (i = ev->n_est = 0; gl_bounds[i] >= 0.0; i++) ev->n_est++; } else { /* check for overflow: */ nd = floor(ev->cutoff / ev->iwidth) + 1; if (nd > INT_MAX) { pr_warning("choose a larger width or a smaller cutoff value"); ErrMsg(ER_MEMORY, "(experimental variogram too large)"); } ev->n_est = (int) nd; } /* * zero est go to ev->gamma[ev->n_est - 1], ev->nh[ev->n_est - 1] */ if (ev->zero) ev->n_est++; resize_ev(ev, ev->n_est); /* initialize: */ for (i = 0; i < ev->n_est; i++) { ev->gamma[i] = 0.0; ev->dist[i] = 0.0; ev->nh[i] = 0; ev->pairs[i] = (DPOINT **) NULL; } return ev; } static void resize_ev(SAMPLE_VGM *ev, unsigned int size) { if (size > ev->n_max) { ev->n_max = size; ev->gamma = (double *) erealloc (ev->gamma, ev->n_max * sizeof(double)); ev->dist = (double *) erealloc (ev->dist, ev->n_max * sizeof(double)); ev->nh = (unsigned long *) erealloc (ev->nh, ev->n_max * sizeof(long)); ev->pairs = (DPOINT ***) erealloc(ev->pairs, ev->n_max * sizeof(DPOINT **)); } } static void *register_pairs(void *pairs, unsigned long nh, DPOINT *a, DPOINT *b) { /* * while I'm here -- there may be a problem when ->list != ->sel on * the DATA used, but I don't know why. Probably will never be used. */ /* resize pairs; add a and b to it */ if (gl_register_pairs == 0) return NULL; if (nh % SEM_INCREMENT == 0) pairs = erealloc(pairs, 2 * (nh + SEM_INCREMENT + 1) * sizeof(DPOINT **)); ((DPOINT **) pairs)[2 * nh] = a; ((DPOINT **) pairs)[2 * nh + 1] = b; return pairs; } static void push_to_cloud(SAMPLE_VGM *ev, double gamma, double dist, unsigned long index) { if (ev->n_est == ev->n_max) resize_ev(ev, ev->n_max + SEM_INCREMENT); ev->gamma[ev->n_est] = gamma; ev->dist[ev->n_est] = dist; ev->nh[ev->n_est] = index; ev->pairs[ev->n_est] = NULL; ev->n_est++; } static int get_index(double dist, SAMPLE_VGM *ev) { double frac; int i = 0; if (dist == 0.0 && ev->zero != ZERO_INCLUDE) return ev->n_est - 1; if (gl_bounds != DEF_bounds) { for (i = 0; gl_bounds[i] >= 0.0; i++) if (dist <= gl_bounds[i]) return i; assert(0); } if (ev->iwidth <= 0.0) { pr_warning("iwidth: %g", ev->iwidth); ErrMsg(ER_IMPOSVAL, "ev->iwidth <= 0.0"); } frac = dist / ev->iwidth; if (dist > 0.0 && frac == floor(frac)) return (int) (floor(frac)) - 1; else return (int) floor(frac); } static void divide(SAMPLE_VGM *ev) { int i; if (ev->cloud) return; /* has been done in the first round */ for (i = 0; i < ev->n_est; i++) { if (ev->nh[i]) { ev->dist[i] /= ev->nh[i]; switch (ev->evt) { case SEMIVARIOGRAM: if (gl_cressie) ev->gamma[i] = 0.5 * pow(ev->gamma[i]/ev->nh[i], 4.0) /(0.457 + 0.494 / ev->nh[i]); else ev->gamma[i] /= (2.0 * ev->nh[i]); break; case CROSSVARIOGRAM: ev->gamma[i] /= (2.0 * ev->nh[i]); break; case COVARIOGRAM: /* BREAKTHROUGH */ case CROSSCOVARIOGRAM: ev->gamma[i] /= (1.0 * ev->nh[i]); break; case PRSEMIVARIOGRAM: ev->gamma[i] /= (2.0 * ev->nh[i]); break; case NOTSPECIFIED: /* BREAKTHROUGH */ default: assert(0); break; } } } } void fprint_sample_vgm(const SAMPLE_VGM *ev) { #define EVFMT "%8g %8g %8lu %8g %8g\n" int i, n; double from, to; if (! ev->cloud) { /* start writing: distance 0 */ if (ev->zero == ZERO_SPECIAL && ev->nh[ev->n_est-1]) Rprintf(EVFMT, 0.0, 0.0, ev->nh[ev->n_est-1], ev->dist[ev->n_est-1], ev->gamma[ev->n_est-1]); /* continue writing: */ if (ev->zero == ZERO_SPECIAL || ev->zero == ZERO_AVOID) n = ev->n_est - 1; else n = ev->n_est; for (i = 0; i < n; i++) { if (ev->nh[i] > 0) { if (gl_bounds == NULL) { from = i*ev->iwidth; to = (i+1)*ev->iwidth; } else { if (i == 0) from = 0.0; else from = gl_bounds[i-1]; to = gl_bounds[i]; } to = MIN(ev->cutoff, to); Rprintf(EVFMT, from, to, ev->nh[i], ev->dist[i], ev->gamma[i]); } } } else { for (i = 0; i < ev->n_est; i++) Rprintf("%ld %ld %g %g\n", HIGH_NH(ev->nh[i]) + 1, LOW_NH(ev->nh[i]) + 1, ev->dist[i], ev->gamma[i]); } return; } /* fprint_sample_vgm */ gstat/src/pqueue.c0000644000176200001440000001110514646417261013644 0ustar liggesusers/* * priority queue, Jan-Apr 1998 * * I did a net search one day, and found so many implementations of * priority queues that I decided to write my own. For the fun of it. * * This one has no limits and needs a generic (qsort-like) comparison * function for element comparison at initialisation. To enqueue an * unordered array of elements, elements are sorted with qsort(), before * they are merged into the ordered queue. Only pointers to the next * element are stored (so it's basically an ordered single linked list). */ #include #include #include #include "defs.h" #include "userio.h" #include "data.h" #include "utils.h" #include "nsearch.h" #include "pqueue.h" static void enlarge_queue(QUEUE *q); static void enlarge_queue(QUEUE *q) { /* * don't use realloc() on `empty': all pointers to the * first element would have to be moved along with itself. */ int i; Q_ELEMENT *block; block = (Q_ELEMENT *) emalloc(Q_BUFFER_SIZE * sizeof(Q_ELEMENT)); for (i = 0; i < Q_BUFFER_SIZE - 1; i++) block[i].next = &(block[i+1]); block[Q_BUFFER_SIZE - 1].next = NULL; if (q->empty == NULL) q->empty = block; else q->empty->next = block; q->max_length += Q_BUFFER_SIZE; /* register block to free later on... */ q->blocks += 1; q->block = (Q_ELEMENT **) erealloc(q->block, q->blocks * sizeof(Q_ELEMENT *)); q->block[q->blocks - 1] = block; } QUEUE *init_queue(QUEUE *q, int (CDECL *cmp)(const QUEUE_NODE *a, const QUEUE_NODE *b)) { int i, j; if (q == NULL) { q = (QUEUE *) emalloc(sizeof(QUEUE)); q->max_length = q->blocks = 0; q->empty = NULL; q->block = NULL; q->cmp = cmp; enlarge_queue(q); } else { q->empty = q->block[0]; for (i = 0; i < q->blocks; i++) { for (j = 0; j < Q_BUFFER_SIZE - 1; j++) /* connect elements: */ q->block[i][j].next = &(q->block[i][j+1]); if (i < q->blocks - 1) /* connect elements between blocks: */ q->block[i][Q_BUFFER_SIZE - 1].next = &(q->block[i+1][0]); } q->block[q->blocks - 1][Q_BUFFER_SIZE - 1].next = NULL; } q->length = 0; q->head = NULL; return q; } void free_queue(QUEUE *q) { int i; if (q != NULL) { for (i = 0; i < q->blocks; i++) efree(q->block[i]); /* queue buffers */ if (q->block != NULL) efree(q->block); efree(q); } } static Q_ELEMENT *get_free(QUEUE *q) { Q_ELEMENT *e; if (q->empty->next == NULL) enlarge_queue(q); e = q->empty; q->empty = q->empty->next; return e; } void enqueue(QUEUE *q, QUEUE_NODE *el, int n) { /* * insert n elements in array el into the priority queue q */ Q_ELEMENT *e, *where, *next; int i = 0, p; if (q == NULL || el == NULL || n <= 0) ErrMsg(ER_NULL, "enqueue"); /* * first sort array el */ qsort(el, (size_t) n, sizeof(QUEUE_NODE), (int CDECL (*)(const void *,const void *)) q->cmp); /* * and then merge them with the priority queue q */ /* * find p, the number of elements in el[] that are smaller than * the first element in the queue, if any. * (Yes, we expect at least some of them to be closer than q->head) */ for (p = n; q->head != NULL && p > 0; p--) if (q->cmp(&(el[p-1]), &(q->head->el)) <= 0) break; /* out of this for loop */ /* * put these p elements in order at the queue head: */ for (i = p; i > 0; i--) { e = get_free(q); e->el = el[i-1]; e->next = q->head; q->head = e; } q->length += p; n -= p; /* * We might be done by now (n zero). * Process the remaining elements: */ where = q->head; /* starting point for insertion: */ next = where->next; /* the next element */ el += p; /* start of the remaining elements */ for (i = 0; i < n; i++) { e = get_free(q); /* get a free queue element */ e->el = el[i]; /* copy contents: */ /* * unless where is the last element, shift a position in the queue * when the element is larger than the insertion element e: */ while (next != NULL && q->cmp(&(e->el), &(next->el)) > 0) { where = next; next = where->next; } /* * now next points either to NULL or to the first element smaller * than or equal to e. So, insert e after where and before next: */ e->next = next; where->next = e; /* * the next element in el[] will should follow after e, * so shift where one position to start looking after e: */ where = e; } q->length += n; return; } QUEUE_NODE dequeue(QUEUE *q) { Q_ELEMENT *e; if (q->length == 0) ErrMsg(ER_NULL, "cannot dequeue empty queue"); e = q->head; /* get first queue element */ q->head = q->head->next; /* reset first to next */ e->next = q->empty; /* put the dequeued element in the empty queue */ q->empty = e; q->length--; return e->el; } gstat/src/utils.c0000644000176200001440000000472114646417261013506 0ustar liggesusers/* * utils.c: error checking functions for file, memory and string handling */ #include /* free(), malloc() etc */ #include /* tolower(), isspace() */ #include /* strlen(), memcmp() */ #include "defs.h" #include "userio.h" #include "utils.h" #include "glvars.h" #include "debug.h" void efree(void *p) { if (p == NULL) pr_warning("efree(): NULL pointer as argument"); else /* there's little point in calling free(NULL) */ free(p); } void *emalloc(size_t size) { void *p = NULL; if (size == 0) { pr_warning("emalloc(): size 0 requested"); return NULL; } p = (void *) malloc(size); if (p == NULL) { if (DEBUG_DUMP) message("malloc(%u) returned NULL", size); ErrMsg(ER_MEMORY, ""); } return p; } void *ecalloc(size_t nobj, size_t size) { void *p = NULL; if (size == 0) { pr_warning("ecalloc(): size 0 requested"); return NULL; } p = (void *) calloc(nobj, size); if (p == NULL) { if (DEBUG_DUMP) message("calloc(%u,%u) returned NULL", nobj, size); ErrMsg(ER_MEMORY, ""); } return p; } void *erealloc(void *p, size_t size) { if (size == 0) { pr_warning("erealloc(): size 0 requested"); return NULL; } if (p == NULL) p = (void *) malloc(size); else p = (void *) realloc(p, size); if (p == NULL) { if (DEBUG_DUMP) message("realloc(%u) returned NULL\n", size); ErrMsg(ER_MEMORY, ""); } return p; } void set_mv_float(float *f) { memset(f, 0xFF, sizeof(float)); } void set_mv_double(double *d) { memset(d, 0xFF, sizeof(double)); } int is_mv_float(const float *f) { const unsigned char u[sizeof(float)] = { 0xFF, 0xFF, 0xFF, 0xFF }; /* will choke if sizeof(float) != 4 */ return (memcmp(f, u, sizeof(float)) == 0); } int is_mv_double(const double *d) { const unsigned char u[sizeof(double)] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; /* will choke if sizeof(double) != 8 */ return (memcmp(d, &u, sizeof(double)) == 0); } /* * almost_equals() compares string value of token tok with str[], and * returns TRUE if they are identical up to the first $ in str[]. */ int almost_equals(const char *tok, const char *str) { int i, after = 0, start = 0, len; if (tok == NULL) return 0; /* must be a value--can't be equal */ len = strlen(tok); for (i = 0; i < len + after; i++) { if (str[i] != tok[start + i]) { if (str[i] != '$') return 0; else { after = 1; start--; } } } /* i now beyond end of token string */ return(after || str[i] == '$' || str[i] == '\0'); } gstat/src/getest.h0000644000176200001440000000010614646417261013637 0ustar liggesusersvoid get_est(DATA **data, METHOD method, DPOINT *where, double *est); gstat/src/mapio.h0000644000176200001440000001133114646417261013453 0ustar liggesusers#ifndef MAPIO_H /* avoid multiple inclusion */ #define MAPIO_H #ifdef HAVE_LIBGDAL # include "gdal.h" #endif /*! \file mapio.h \brief functions for reading and writing grid map in several formats */ /*! type of grid map format */ typedef enum { MT_UNKNOWN = 0, MT_CSF, /*!< PCRaster format (binary), API in csf directory */ MT_GDAL, /*!< GDAL format */ MT_ARCGRID, /*!< ArcInfo gridfile, gridascii (ascii) or gridfloat (binary) */ MT_IDRISI, /*!< Idrisi 32image file, ascii or binary */ MT_GNUPLOT, /*!< binary gnuplot 2d matrix format (cannot handle MV's) */ MT_T2, /*!< MIKE SHE ``T2'' 2d grid map format (www.dhi.dk) */ MT_ERMAPPER, /*!< ER-Mapper V5.0+ dataset with a single image channel */ MT_GRASS, /*!< Grass raster format, uses grass' gis library */ MT_GMT, /*!< GMT Grid format, uses NetCDF library */ MT_SURFER, /*!< Surfer DSAA (ascii grid) format */ MT_GSLIB /*!< GSLIB grid format (only a 2D subset) */ } MAPTYPE; /*! ER-Mapper celltypes used for read/write_binary */ typedef enum { CT_NONE = 0, CT_UNKNOWN = 1, CT_UINT8 = 2, CT_UINT16 = 3, CT_UINT32 = 4, CT_INT8 = 5, CT_INT16 = 6, CT_INT32 = 7, CT_IEEE4 = 8, CT_IEEE8 = 9 } CellType; #define UINT8 unsigned char #define UINT16 unsigned short int #define UINT32 unsigned long int #define INT8 char #define INT16 short int #define INT32 long int #define IEEE4 float #define IEEE8 double typedef enum { READ_ONLY = 0, WRITE_ONLY = 1 } MAP_READ_STATUS; /*! structure to hold grid map information */ typedef struct gridmap { MAPTYPE type; /*!< type of grid map */ MAP_READ_STATUS status; /*! READ_ONLY or WRITE_ONLY */ const char *filename; /*!< name (or base name) of grid map */ char *history, /*!< only used for CSF maps */ *description; /*!< only used for some maps */ unsigned int rows, /*!< number of rows in map */ cols, /*!< number of colums in map */ base_size, /*!< size of malloced area (cells), in case of blocked allocation */ current_row, /*!< current row, if reading/writing is row-wise */ *first_time_row; /*!< have we been at this row before? */ CellType celltype; /*!< cell type */ int is_binary, /*!< is this a binary map format */ swap_buf; /*!< swap contents of base buffer? */ double x_ul, /*!< x-coordinate upper left corner of map area */ y_ul, /*!< y-coordinate of upper left corner of map area */ cellsizex, /*!< size of grid cells in x-direction */ cellsizey; /*!< size of grid cells in y-direction */ float cellmin, /*!< minimum value of grid map */ cellmax, /*!< maximum value of grid map */ misval; /*!< missing value flag (if present) */ float **grid, /*!< 2d matrix holding the values (pointer array) */ *base; /*!< base pointer to malloc'ed or mmap'ed area */ void *CSF_MAP; /*!< cast to MAP * */ #ifdef HAVE_LIBGDAL GDALDatasetH hDataset; GDALDriverH hDriver; double *GeoTransform; #endif struct gridmap * (*write)(struct gridmap *m); /*!< write & close a map */ void (*read_row)(struct gridmap *m, float *buf, unsigned int row); void (*write_row)(struct gridmap *m, float *buf, unsigned int row); /* see mapio.c remark around #define CSF_ROWWISE for the last two */ } GRIDMAP; #define SQUARECELLSIZE(map) ((map->cellsizex != map->cellsizey ? \ ErrMsg(ER_IMPOSVAL, "cannot deal with non-square cells"), 0.0 : \ map->cellsizex)) GRIDMAP *map_read(GRIDMAP *m); int map_cell_is_mv(GRIDMAP *m, unsigned int row, unsigned int col); float map_get_cell(GRIDMAP *m, unsigned int row, unsigned int col); int map_put_cell(GRIDMAP *m, unsigned int row, unsigned int col, float value); int map_xy2rowcol(GRIDMAP *m, double x, double y, unsigned int *row, unsigned int *col); int map_rowcol2xy(GRIDMAP *m, unsigned int row, unsigned int col, double *x, double *y); GRIDMAP *map_dup(const char *fname, GRIDMAP *m); GRIDMAP *new_map(MAP_READ_STATUS status); void map_free(GRIDMAP *m); GRIDMAP *map_switch_type(GRIDMAP *in, MAPTYPE type); void map_name_nr(GRIDMAP *mask, const char *base, char *name, int nr, int max); int map_equal(GRIDMAP *a, GRIDMAP *b); #endif gstat/src/pqueue.h0000644000176200001440000000166314646417261013661 0ustar liggesusers#define Q_BUFFER_SIZE 100 /* something more practical */ typedef struct { union { QTREE_NODE *n; DPOINT *p; } u; int is_node; /* is u the QTREE_NODE (1) or rather the DPOINT (0) ? */ double dist2; /* squared distance to target location */ } QUEUE_NODE; typedef struct q_element { struct q_element *next; QUEUE_NODE el; } Q_ELEMENT; typedef struct { int length, max_length; Q_ELEMENT *head, /* pointer to first element in queue, NULL if empty */ *empty; /* pointer to empty elements (a stack), NULL if none left */ int blocks; /* size of memory block */ Q_ELEMENT **block; /* pointers to malloc'ed memory blocks */ int (CDECL *cmp)(const QUEUE_NODE *a, const QUEUE_NODE *b); /* qsort-able element comparison function */ } QUEUE; QUEUE *init_queue(QUEUE *q, int (CDECL *cmp)(const QUEUE_NODE *a, const QUEUE_NODE *b)); QUEUE_NODE dequeue(QUEUE *q); void enqueue(QUEUE *q, QUEUE_NODE *qpt, int n); void free_queue(QUEUE *q); gstat/src/s.c0000644000176200001440000007457514662102255012616 0ustar liggesusers/* * all functions exposed to R */ #include #include /* #include */ #include "defs.h" #include "data.h" #include "select.h" #include "utils.h" #include "userio.h" #include "vario.h" #include "fit.h" #include "sem.h" #include "glvars.h" #include "debug.h" #include "mapio.h" #include "msim.h" #include "getest.h" #include "s.h" static DATA_GRIDMAP *gstat_S_fillgrid(SEXP gridparams); static void gstat_set_block(long i, SEXP block, SEXP block_cols, DPOINT *current); int do_print_progress = 0; #define NAME_SIZE 20 /* buffer size for name */ extern unsigned int n_pred_locs; /* msim.c */ SEXP gstat_init(SEXP s_debug_level) { do_print_progress = 0; remove_all(); init_global_variables(); init_data_minmax(); GetRNGstate(); debug_level = INTEGER(s_debug_level)[0]; if (debug_level < 0) { debug_level = -debug_level; do_print_progress = 1; } return(s_debug_level); } SEXP gstat_exit(SEXP x) { PutRNGstate(); /* write seed back to R/S engine */ remove_all(); return(x); } SEXP gstat_new_data(SEXP sy, SEXP slocs, SEXP sX, SEXP has_intercept, SEXP beta, SEXP nmax, SEXP nmin, SEXP maxdist, SEXP force, SEXP vfn, SEXP sw, SEXP grid, SEXP degree, SEXP is_projected, SEXP vdist, SEXP lambda, SEXP omax) { double *y, *locs, *X, *w = NULL; long i, j, id, n, dim, n_X, has_int; DPOINT current; DATA **d; char name[NAME_SIZE]; PROTECT(sy = Rf_coerceVector(sy, REALSXP)); n = LENGTH(sy); y = REAL(sy); if (n == 0) ErrMsg(ER_IMPOSVAL, "no data read"); if (LENGTH(slocs) % n != 0) Rf_error("dimensions do not match: locations %d and data %ld", (int) LENGTH(slocs), n); dim = LENGTH(slocs) / n; if (dim <= 0) Rf_error("too few spatial dimensions: %ld", dim); if (dim > 3) Rf_error("too many spatial dimensions: %ld", dim); locs = REAL(slocs); if (LENGTH(sw) == n) w = REAL(sw); if (LENGTH(sX) % n != 0) Rf_error("dimensions do not match: X %d and data %ld: missing values in data?", (int) LENGTH(sX), n); n_X = LENGTH(sX) / n; X = REAL(sX); assert(n_X > 0); current.z = 0.0; current.bitfield = 0; id = get_n_vars(); snprintf(name, NAME_SIZE, "var%ld", id); which_identifier(name); d = get_gstat_data(); d[id]->id = id; d[id]->n_list = d[id]->n_max = 0; d[id]->colnx = d[id]->colny = d[id]->colnvalue = d[id]->colnz = 0; d[id]->x_coord = "x"; d[id]->y_coord = "y"; d[id]->z_coord = "z"; d[id]->variable = "R data"; d[id]->fname = "R data"; d[id]->lambda = REAL(lambda)[0]; has_int = INTEGER(has_intercept)[0]; /* increase d[id]->n_X and set d[id]->colX[i]: */ for (i = d[id]->n_X = 0; i < n_X; i++) data_add_X(d[id], i + (has_int ? 0 : 1)); assert(d[id]->n_X == n_X); for (i = 0; i < LENGTH(beta); i++) /* do nothing if beta is numeric(0) */ d[id]->beta = push_d_vector(REAL(beta)[i], d[id]->beta); if (INTEGER(nmax)[0] > 0) /* leave default (large) if < 0 */ d[id]->sel_max = INTEGER(nmax)[0]; if (INTEGER(omax)[0] > 0) /* leave default (0) if <= 0 */ d[id]->oct_max = INTEGER(omax)[0]; if (INTEGER(nmin)[0] > 0) /* leave default (0) if <= 0 */ d[id]->sel_min = INTEGER(nmin)[0]; if (REAL(maxdist)[0] > 0.0) d[id]->sel_rad = REAL(maxdist)[0]; if (INTEGER(force)[0] > 0) d[id]->force = INTEGER(force)[0]; switch(INTEGER(vfn)[0]) { case 1: /* d[id]->variance_fn = v_identity; == leave NULL */ break; case 2: d[id]->variance_fn = v_mu; break; case 3: d[id]->variance_fn = v_bin; break; case 4: d[id]->variance_fn = v_mu2; break; case 5: d[id]->variance_fn = v_mu3; break; default: Rf_error("unknown variance function %d", INTEGER(vfn)[0]); } gl_longlat = (INTEGER(is_projected)[0] == 0); d[id]->mode = X_BIT_SET | V_BIT_SET; if (dim > 1) d[id]->mode = d[id]->mode | Y_BIT_SET; if (dim > 2) d[id]->mode = d[id]->mode | Z_BIT_SET; set_norm_fns(d[id]); /* so gstat can calculate distances */ if (w != NULL) d[id]->colnvariance = 1; /* it is set */ switch(LENGTH(grid)) { case 0: case 1: break; /* empty, i.e., numeric(0) */ case 6: d[id]->grid = gstat_S_fillgrid(grid); break; default: Rf_error("length of grid topology %d unrecognized", (int) LENGTH(grid)); } d[id]->polynomial_degree = INTEGER(degree)[0]; if (d[id]->polynomial_degree < 0 || d[id]->polynomial_degree > 3) { Rf_error("polynomial degree should be 0, 1, 2 or 3"); } if (d[id]->polynomial_degree > 0) { /* we're doing polynomials through degree: */ if (id > 0) { Rf_error("polynomial degree will only work for a single variable"); } if (n_X > 1) { Rf_error("polynomial degree only works when no other predictors are given"); } setup_polynomial_X(d[id]); /* standardized coordinate polynomials */ } d[id]->vdist = INTEGER(vdist)[0]; assert(n_X <= d[id]->n_X); current.X = (double *) emalloc(d[id]->n_X * sizeof(double)); SET_POINT(¤t); current.u.stratum = 0; current.attr = current.x = current.y = current.z = 0.0; for (i = 0; i < n; i++) { /* loop over points */ current.attr = y[i]; current.x = locs[i]; if (dim >= 2) current.y = locs[n + i]; if (dim >= 3) current.z = locs[2 * n + i]; /* track min/max coordinates, also for z, for the qtree bbox */ if (i == 0) { d[id]->maxX = d[id]->minX = current.x; d[id]->maxY = d[id]->minY = current.y; d[id]->maxZ = d[id]->minZ = current.z; } else { d[id]->minX = MIN(d[id]->minX, current.x); d[id]->maxX = MAX(d[id]->maxX, current.x); d[id]->minY = MIN(d[id]->minY, current.y); d[id]->maxY = MAX(d[id]->maxY, current.y); d[id]->minZ = MIN(d[id]->minZ, current.z); d[id]->minZ = MIN(d[id]->minZ, current.z); } for (j = 0; j < n_X; j++) current.X[j] = X[j * n + i]; if (w != NULL) current.variance = 1.0/(w[i]); push_point(d[id], ¤t); } check_global_variables(); d[id]->n_original = d[id]->n_list; efree(current.X); UNPROTECT(1); /* sy */ return(sy); } SEXP gstat_new_dummy_data(SEXP loc_dim, SEXP has_intercept, SEXP beta, SEXP nmax, SEXP nmin, SEXP maxdist, SEXP vfn, SEXP is_projected, SEXP vdist) { int i, id, dim, has_int; char name[NAME_SIZE]; DATA **d = NULL; dim = INTEGER(loc_dim)[0]; if (dim <= 0) Rf_error("dimension value impossible: %d", dim); if (dim > 3) Rf_error("too many dimensions: %d", dim); assert(LENGTH(beta) > 0); id = get_n_vars(); snprintf(name, NAME_SIZE, "var%d", id); which_identifier(name); d = get_gstat_data(); d[id]->id = id; d[id]->n_list = d[id]->n_max = 0; d[id]->colnx = d[id]->colny = d[id]->colnvalue = d[id]->colnz = 0; d[id]->x_coord = "x"; d[id]->y_coord = "y"; d[id]->z_coord = "z"; d[id]->variable = "R data"; d[id]->fname = "R data"; has_int = INTEGER(has_intercept)[0]; for (i = d[id]->n_X = 0; i < LENGTH(beta); i++) data_add_X(d[id], i + (has_int ? 0 : 1)); assert(d[id]->n_X == LENGTH(beta)); d[id]->dummy = 1; for (i = 0; i < LENGTH(beta); i++) d[id]->beta = push_d_vector(REAL(beta)[i], d[id]->beta); if (INTEGER(nmax)[0] > 0) /* leave default (large) if < 0 */ d[id]->sel_max = INTEGER(nmax)[0]; /* I doubt whether using nmin for dummy data _ever_ can have a * meaning, but hey, let's add it anyway. */ if (INTEGER(nmin)[0] > 0) /* leave default (0) if <= 0 */ d[id]->sel_min = INTEGER(nmin)[0]; if (REAL(maxdist)[0] > 0.0) d[id]->sel_rad = REAL(maxdist)[0]; switch(INTEGER(vfn)[0]) { case 1: /* d[id]->variance_fn = v_identity; -> leave NULL */ break; case 2: d[id]->variance_fn = v_mu; break; case 3: d[id]->variance_fn = v_bin; break; case 4: d[id]->variance_fn = v_mu2; break; case 5: d[id]->variance_fn = v_mu3; break; default: Rf_error("unknown variance function %d", INTEGER(vfn)[0]); } gl_longlat = (INTEGER(is_projected)[0] == 0); d[id]->vdist = INTEGER(vdist)[0]; d[id]->mode = X_BIT_SET | V_BIT_SET; if (dim > 1) d[id]->mode = d[id]->mode | Y_BIT_SET; if (dim > 2) d[id]->mode = d[id]->mode | Z_BIT_SET; set_norm_fns(d[id]); /* so gstat can calculate distances */ check_global_variables(); d[id]->n_original = d[id]->n_list; return(loc_dim); } SEXP gstat_predict(SEXP sn, SEXP slocs, SEXP sX, SEXP block_cols, SEXP block, SEXP weights, SEXP nsim, SEXP blue) { double *locs, **est_all, *X; long i, j, k, n, nvars, nest, dim, n_X, ncols_block, nrows_block, pos; DPOINT current, *bp = NULL; DATA **d = NULL, *vd = NULL, *area = NULL; SEXP ret; SEXP retvector; SEXP retvector_dim; extern unsigned int n_pred_locs; /* predict.c, used in msim.c */ float ***msim = NULL; nvars = get_n_vars(); nest = nvars + (nvars * (nvars + 1))/2; n = INTEGER(sn)[0]; if (n <= 0 || LENGTH(slocs) == 0 || LENGTH(sX) == 0) ErrMsg(ER_IMPOSVAL, "newdata empty or only NA's"); if (LENGTH(slocs) % n != 0) Rf_error("dimensions do not match: locations %d, nrows in X %ld", (int) LENGTH(slocs), n); dim = LENGTH(slocs) / n; if (dim > 3) Rf_error("too many spatial dimensions: %ld", dim); if (dim <= 0) Rf_error("too few spatial dimensions: %ld", dim); locs = REAL(slocs); if (LENGTH(sX) % n != 0) Rf_error("dimensions do not match: X %d and data %ld", (int) LENGTH(sX), n); n_X = LENGTH(sX) / n; current.attr = current.x = current.y = current.z = 0.0; current.bitfield = 0; /* assuming points ... */ SET_POINT(¤t); /* and then do the block thing: */ if (LENGTH(block_cols) == 0) { bp = get_block_p(); bp->x = bp->y = bp->z = 0.0; /* obsolete, I'd guess */ if (LENGTH(block) >= 1) { bp->x = REAL(block)[0]; SET_BLOCK(¤t); } if (LENGTH(block) >= 2) bp->y = REAL(block)[1]; if (LENGTH(block) >= 3) bp->z = REAL(block)[2]; if (LENGTH(block) > 3) pr_warning("block dimension can only be 3; using the first 3"); } else if (LENGTH(block_cols) == 1) { /* if > 1, block contains multiple 2D blocks */ ncols_block = INTEGER(block_cols)[0]; if (ncols_block < 1 || ncols_block > 3) ErrMsg(ER_IMPOSVAL, "block dimensions should be in [1..3]"); nrows_block = LENGTH(block) / ncols_block; /* nr of rows */ if (nrows_block > 0) { area = create_data_area(); area->colnvariance = 0; area->n_list = area->n_max = 0; area->id = ID_OF_AREA; area->mode = X_BIT_SET; if (ncols_block > 1) area->mode = area->mode & Y_BIT_SET; if (ncols_block > 2) area->mode = area->mode & Z_BIT_SET; for (i = 0; i < nrows_block; i++) { current.x = REAL(block)[i]; if (ncols_block > 1) current.y = REAL(block)[nrows_block + i]; if (ncols_block > 2) current.z = REAL(block)[2 * nrows_block + i]; if (LENGTH(weights) > 0) { area->colnvariance = 1; current.variance = REAL(weights)[i]; } push_point(area, ¤t); } SET_BLOCK(¤t); } if (DEBUG_FORCE) print_data_list(area); } X = REAL(sX); assert(n_X > 0); current.X = (double *) emalloc(n_X * sizeof(double)); current.u.stratum = 0; d = get_gstat_data(); est_all = (double **) emalloc(n * sizeof(double *)); for (i = 0; i < n; i++) est_all[i] = (double *) emalloc(nest * sizeof(double)); /* * the following is to fake gstat's default method handling: * we got to suggest that we'll go through a list of prediction * locations, a la the gstat ``data(): ... ;'' command. */ vd = get_dataval(); vd->id = ID_OF_VALDATA; vd->mode = d[0]->mode; /* set min/max[XYZ] */ vd->minY = vd->maxY = vd->minZ = vd->maxZ = 0.0; vd->minX = vd->maxX = locs[0]; for (i = 1; i < n; i++) { vd->minX = MIN(vd->minX, locs[i]); vd->maxX = MAX(vd->maxX, locs[i]); } if (dim >= 2) { vd->minY = vd->maxY = locs[n]; for (i = 1; i < n; i++) { vd->minY = MIN(vd->minY, locs[n + i]); vd->maxY = MAX(vd->maxY, locs[n + i]); } } if (dim >= 3) { vd->minZ = vd->maxZ = locs[2 * n]; for (i = 1; i < n; i++) { vd->minZ = MIN(vd->minZ, locs[2 * n + i]); vd->maxZ = MAX(vd->maxZ, locs[2 * n + i]); } } /* fill, and standardize coordinate predictors from degree = x */ for (i = 0; i < nvars; i++) setup_data_minmax(d[i]); setup_data_minmax(vd); for (i = 0; i < nvars; i++) calc_polynomials(d[i]); /* calc_polynomials(vd); */ /* still no data in fake vd */ vd->polynomial_degree = d[0]->polynomial_degree; if (vd->polynomial_degree > 0) { setup_polynomial_X(vd); /* standardized coordinate polynomials */ current.X = (double *) erealloc(current.X, vd->n_X * sizeof(double)); } /* so far for the faking; now let's see what gstat makes out of this: */ if (INTEGER(nsim)[0] == 0) { if (INTEGER(blue)[0] == 0) { /* FALSE */ if (get_method() == NSP) /* choose default */ set_method(get_default_method()); } else set_method(LSLM); } else { if (INTEGER(nsim)[0] < 0) { gl_nsim = -(INTEGER(nsim)[0]); set_method(ISI); } else { gl_nsim = INTEGER(nsim)[0]; set_method(GSI); } n_pred_locs = n; if (gl_nsim > 1) init_simulations(d); if (get_n_beta_set() != get_n_vars()) setup_beta(d, get_n_vars(), gl_nsim); } set_mode(); /* simple, stratified, multivariable? */ check_global_variables(); /* it's there, better do it now */ if (debug_level) Rprintf("[%s]\n", method_string(get_method())); #ifdef WIN32 R_FlushConsole(); R_ProcessEvents(); #endif for (i = 0; i < n; i++) { print_progress(i, n); if (LENGTH(block_cols) > 1) gstat_set_block(i, block, block_cols, ¤t); current.x = locs[i]; if (dim >= 2) current.y = locs[n + i]; if (dim >= 3) current.z = locs[2 * n + i]; for (j = 0; j < n_X; j++) current.X[j] = X[j * n + i]; /* transform standardized coordinate polynomial here */ if (vd->polynomial_degree) calc_polynomial_point(vd, ¤t); for (j = 0; j < get_n_vars(); j++) select_at(d[j], ¤t); get_est(d, get_method(), ¤t, est_all[i]); #ifdef WIN32 R_ProcessEvents(); /* avoid terminal freeze in R/Win */ #endif R_CheckUserInterrupt(); } print_progress(100, 100); PROTECT(ret = Rf_allocVector(VECSXP, 1)); PROTECT(retvector_dim = Rf_allocVector(REALSXP, 2)); REAL(retvector_dim)[0] = n; /* nrows */ if (gl_nsim > 1) { PROTECT(retvector = Rf_allocVector(REALSXP, gl_nsim * nvars * n)); msim = get_msim(); for (i = pos = 0; i < nvars; i++) for (j = 0; j < gl_nsim; j++) for (k = 0; k < n; k++) { if (is_mv_float(&(msim[i][k][j]))) REAL(retvector)[pos++] = NA_REAL; else REAL(retvector)[pos++] = msim[i][k][j]; } REAL(retvector_dim)[1] = nvars * gl_nsim; /* ncols */ } else { PROTECT(retvector = Rf_allocVector(REALSXP, n * nest)); for (j = pos = 0; j < nest; j++) { for (i = 0; i < n; i++) { if (is_mv_double(&(est_all[i][j]))) REAL(retvector)[pos] = NA_REAL; else REAL(retvector)[pos] = est_all[i][j]; pos++; } } REAL(retvector_dim)[1] = nest; /* ncols */ } if (gl_nsim > 0) free_simulations(); /* SET_DIM(retvector, retvector_dim); */ Rf_setAttrib(retvector, R_DimSymbol, retvector_dim); SET_VECTOR_ELT(ret, 0, retvector); for (i = 0; i < n; i++) efree(est_all[i]); efree(est_all); efree(current.X); UNPROTECT(3); return(ret); } static void gstat_set_block(long i, SEXP block, SEXP block_cols, DPOINT *current) { DATA *area; VARIOGRAM *v; long nrows_block, start, end, j; if (i >= LENGTH(block_cols) || i < 0) ErrMsg(ER_IMPOSVAL, "block_cols length less than nr of prediction locations"); nrows_block = LENGTH(block) / 2; /* nr of rows */ start = INTEGER(block_cols)[i]; if (i == LENGTH(block_cols) - 1) end = nrows_block; else end = INTEGER(block_cols)[i+1] - 1; area = get_data_area(); if (area != NULL) free_data(area); area = create_data_area(); area->n_list = area->n_max = 0; area->id = ID_OF_AREA; area->mode = X_BIT_SET & Y_BIT_SET; for (j = start - 1; j < end; j++) { current->x = REAL(block)[j]; current->y = REAL(block)[nrows_block + j]; push_point(area, current); } SET_BLOCK(current); if (DEBUG_FORCE) print_data_list(area); for (j = 0; j < get_n_vgms(); j++) { v = get_vgm(j); if (v != NULL) v->block_semivariance_set = v->block_covariance_set = 0; /* don't store under these circumstances! */ } return; } SEXP gstat_variogram(SEXP s_ids, SEXP cutoff, SEXP width, SEXP direction, SEXP cressie, SEXP dX, SEXP boundaries, SEXP grid, SEXP cov, SEXP pseudo) { SEXP ret; SEXP np; SEXP dist; SEXP gamma; SEXP sx; SEXP sy; SEXP ev_parameters; /* SEXP y; */ long i, id1, id2, nest; VARIOGRAM *vgm; DATA **d; GRIDMAP *m; unsigned int row, col, n; id1 = INTEGER(s_ids)[0]; if (LENGTH(s_ids) > 1) id2 = INTEGER(s_ids)[1]; else id2 = id1; vgm = get_vgm(LTI(id1,id2)); vgm->id = LTI(id1,id2); vgm->id1 = id1; vgm->id2 = id2; if (INTEGER(cov)[0] == 0) vgm->ev->evt = (id1 == id2 ? SEMIVARIOGRAM : CROSSVARIOGRAM); else if (INTEGER(cov)[0] == 1) vgm->ev->evt = (id1 == id2 ? COVARIOGRAM : CROSSCOVARIOGRAM); else { if (id1 != id2) ErrMsg(ER_IMPOSVAL, "cannot compute pairwise relative cross semivariogram"); if (INTEGER(cov)[0] == 2) vgm->ev->evt = PRSEMIVARIOGRAM; } /* vgm->ev->is_asym = INTEGER(asym)[0]; */ vgm->ev->pseudo = INTEGER(pseudo)[0]; vgm->ev->recalc = 1; if (LENGTH(cutoff) > 0) gl_cutoff = REAL(cutoff)[0]; if (LENGTH(width) > 0) gl_iwidth = REAL(width)[0]; gl_alpha = REAL(direction)[0]; gl_beta = REAL(direction)[1]; gl_tol_hor = REAL(direction)[2]; gl_tol_ver = REAL(direction)[3]; gl_cressie = INTEGER(cressie)[0]; if (LENGTH(dX) > 0) { d = get_gstat_data(); d[id1]->dX = REAL(dX)[0]; d[id2]->dX = REAL(dX)[0]; } for (i = 0; i < LENGTH(boundaries); i++) /* does nothing if LENGTH is 0 */ push_bound(REAL(boundaries)[i]); switch (LENGTH(grid)) { case 0: case 1: break; case 6: vgm->ev->S_grid = gstat_S_fillgrid(grid); break; default: Rf_error("unrecognized grid length in gstat_variogram"); break; } calc_variogram(vgm, NULL); if (vgm->ev->S_grid != NULL) { PROTECT(ret = Rf_allocVector(VECSXP, 4)); m = vgm->ev->map; n = m->rows * m->cols; PROTECT(np = Rf_allocVector(REALSXP, n)); PROTECT(gamma = Rf_allocVector(REALSXP, n)); PROTECT(sx = Rf_allocVector(REALSXP, n)); PROTECT(sy = Rf_allocVector(REALSXP, n)); for (row = i = 0; row < m->rows; row++) { for (col = 0; col < m->cols; col++) { map_rowcol2xy(m, row, col, &(REAL(sx)[i]), &(REAL(sy)[i])); REAL(np)[i] = vgm->ev->nh[i]; if (vgm->ev->nh[i] > 0) REAL(gamma)[i] = vgm->ev->gamma[i]; else REAL(gamma)[i] = NA_REAL; i++; } } SET_VECTOR_ELT(ret, 0, sx); SET_VECTOR_ELT(ret, 1, sy); SET_VECTOR_ELT(ret, 2, np); SET_VECTOR_ELT(ret, 3, gamma); free_data_gridmap(vgm->ev->S_grid); UNPROTECT(5); } else { if (vgm->ev->cloud) nest = vgm->ev->n_est; else { if (vgm->ev->zero == ZERO_SPECIAL) nest = vgm->ev->n_est; else nest = vgm->ev->n_est - 1; } PROTECT(ret = Rf_allocVector(VECSXP, 4)); if (nest <= 0) { UNPROTECT(1); return(ret); } PROTECT(np = Rf_allocVector(REALSXP, nest)); PROTECT(dist = Rf_allocVector(REALSXP, nest)); PROTECT(gamma = Rf_allocVector(REALSXP, nest)); PROTECT(ev_parameters = Rf_allocVector(REALSXP, 4)); REAL(ev_parameters)[0] = vgm->ev->cutoff; REAL(ev_parameters)[1] = vgm->ev->iwidth; REAL(ev_parameters)[2] = vgm->ev->pseudo; REAL(ev_parameters)[3] = vgm->ev->is_asym; for (i = 0; i < nest; i++) { REAL(np)[i] = vgm->ev->nh[i]; REAL(dist)[i] = vgm->ev->dist[i]; REAL(gamma)[i] = vgm->ev->gamma[i]; } SET_VECTOR_ELT(ret, 0, np); SET_VECTOR_ELT(ret, 1, dist); SET_VECTOR_ELT(ret, 2, gamma); SET_VECTOR_ELT(ret, 3, ev_parameters); UNPROTECT(5); } return(ret); } SEXP gstat_load_variogram(SEXP s_ids, SEXP s_model, SEXP s_sills, SEXP s_ranges, SEXP s_kappas, SEXP s_anis_all, SEXP s_table, SEXP s_max_val) { VARIOGRAM *vgm; long i, n, id1, id2, max_id; double anis[5] = {0.0, 0.0, 0.0, 1.0, 1.0}, rpars[2], *sills, *ranges, *kappas, *anis_all; const char *model; sills = REAL(s_sills); ranges = REAL(s_ranges); kappas = REAL(s_kappas); anis_all = REAL(s_anis_all); id1 = INTEGER(s_ids)[0]; id2 = INTEGER(s_ids)[1]; max_id = MAX(id1, id2); if (get_n_vars() == 0) which_identifier("xx"); /* at least "load" one dummy var */ if (max_id >= get_n_vars()) ErrMsg(ER_IMPOSVAL, "gstat_load_variogram has been called with max_id >= n_vars"); vgm = get_vgm(LTI(id1,id2)); assert(vgm != NULL); vgm->id = LTI(id1,id2); vgm->id1 = id1; vgm->id2 = id2; vgm->n_models = vgm->n_fit = 0; n = LENGTH(s_sills); for (i = 0; i < n; i++) { /* loop over sub models */ model = CHAR(STRING_ELT(s_model, i)); anis[0] = anis_all[0 * n + i]; anis[1] = anis_all[1 * n + i]; anis[2] = anis_all[2 * n + i]; anis[3] = anis_all[3 * n + i]; anis[4] = anis_all[4 * n + i]; rpars[0] = ranges[i]; rpars[1] = kappas[i]; if (LENGTH(s_table) > 0) push_to_v_table(vgm, rpars[0], LENGTH(s_table), REAL(s_table), (anis[3] == 1.0 && anis[4] == 1.0) ? NULL : anis); else push_to_v(vgm, model, sills[i], rpars, 2, (anis[3] == 1.0 && anis[4] == 1.0) ? NULL : anis, 1, 1); } update_variogram(vgm); if (REAL(s_max_val)[0] > 0.0 || REAL(s_max_val)[1] > 0.0 || REAL(s_max_val)[2] > 0.0) vgm->max_val = get_semivariance(vgm, REAL(s_max_val)[0], REAL(s_max_val)[1], REAL(s_max_val)[2]); if (DEBUG_DUMP) logprint_variogram(vgm, 1); return(s_model); } SEXP gstat_variogram_values(SEXP ids, SEXP pars, SEXP covariance, SEXP dist_values) { double from, to, n, d, x = 1.0, y = 0.0, z = 0.0; int i, id1, id2, cov = 0, ndist = 0; VARIOGRAM *vgm; SEXP dist; SEXP gamma; SEXP ret; if (LENGTH(pars) != 3 && LENGTH(pars) != 6) Rf_error("supply three or six distance parameters"); from = REAL(pars)[0]; to = REAL(pars)[1]; n = REAL(pars)[2]; ndist = LENGTH(dist_values); cov = INTEGER(covariance)[0]; if (LENGTH(pars) == 6) { x = REAL(pars)[3]; y = REAL(pars)[4]; z = REAL(pars)[5]; } id1 = INTEGER(ids)[0]; id2 = INTEGER(ids)[1]; vgm = get_vgm(LTI(id1,id2)); if (ndist > 0) { PROTECT(dist = Rf_allocVector(REALSXP, ndist)); PROTECT(gamma = Rf_allocVector(REALSXP, ndist)); for (i = 0; i < ndist; i++) { d = REAL(dist_values)[i]; REAL(dist)[i] = d; REAL(gamma)[i] = (cov ? get_covariance(vgm, d * x, d * y, d * z) : get_semivariance(vgm, d * x, d * y, d * z)); } } else { PROTECT(dist = Rf_allocVector(REALSXP, n)); PROTECT(gamma = Rf_allocVector(REALSXP, n)); for (i = 0; i < n; i++) { d = from; if (i > 0) /* implies n > 1 */ d += (i/(n-1))*(to-from); REAL(dist)[i] = d; REAL(gamma)[i] = (cov ? get_covariance(vgm, d * x, d * y, d * z) : get_semivariance(vgm, d * x, d * y, d * z)); } } PROTECT(ret = Rf_allocVector(VECSXP, 2)); SET_VECTOR_ELT(ret, 0, dist); SET_VECTOR_ELT(ret, 1, gamma); UNPROTECT(3); return(ret); } // Added by Paul Hiemstra, 30-06-2008 SEXP get_covariance_list(SEXP ids, SEXP covariance, SEXP dist_list) { double d, x = 1.0, y = 0.0, z = 0.0; int i, id1, id2, cov = 0; VARIOGRAM *vgm; SEXP dist; SEXP gamma; SEXP ret; int length_list = LENGTH(dist_list); cov = INTEGER(covariance)[0]; id1 = INTEGER(ids)[0]; id2 = INTEGER(ids)[1]; vgm = get_vgm(LTI(id1,id2)); PROTECT(dist = Rf_allocVector(REALSXP, length_list)); PROTECT(gamma = Rf_allocVector(REALSXP, length_list)); for (i = 0; i < length_list; i++) { d = REAL(dist_list)[i]; REAL(dist)[i] = d; REAL(gamma)[i] = (cov ? get_covariance(vgm, d * x, d * y, d * z) : get_semivariance(vgm, d * x, d * y, d * z)); } PROTECT(ret = Rf_allocVector(VECSXP, 2)); SET_VECTOR_ELT(ret, 0, dist); SET_VECTOR_ELT(ret, 1, gamma); UNPROTECT(3); return(ret); } SEXP gstat_get_variogram_models(SEXP dolong) { SEXP ret; int i, n = 0, do_long; for (i = 1; v_models[i].model != NOT_SP; i++) n++; do_long = INTEGER(dolong)[0]; PROTECT(ret = Rf_allocVector(STRSXP, n)); for (i = 1; v_models[i].model != NOT_SP; i++) SET_STRING_ELT(ret, i-1, Rf_mkChar(do_long ? v_models[i].name_long : v_models[i].name)); UNPROTECT(1); return(ret); } SEXP gstat_load_ev(SEXP np, SEXP dist, SEXP gamma) { int i, cloud = 1; VARIOGRAM *vgm; which_identifier("xx"); /* * vgm = get_vgm(LTI(INTEGER(id)[0], INTEGER(id)[1])); * */ vgm = get_vgm(LTI(0, 0)); if (vgm->ev == NULL) vgm->ev = init_ev(); vgm->ev->evt = SEMIVARIOGRAM; vgm->ev->n_est = LENGTH(np); vgm->ev->n_max = LENGTH(np); vgm->ev->gamma = (double *) emalloc (sizeof(double) * vgm->ev->n_max); vgm->ev->dist = (double *) emalloc (sizeof(double) * vgm->ev->n_max); vgm->ev->nh = (unsigned long *) emalloc (sizeof(long) * vgm->ev->n_max); for (i = 0; i < vgm->ev->n_est; i++) { vgm->ev->nh[i] = REAL(np)[i]; vgm->ev->dist[i] = REAL(dist)[i]; vgm->ev->gamma[i] = REAL(gamma)[i]; if (cloud && vgm->ev->nh[i] > 1) cloud = 0; } vgm->ev->cloud = cloud; if (DEBUG_VGMFIT) fprint_sample_vgm(vgm->ev); return(np); } SEXP gstat_fit_variogram(SEXP fit, SEXP fit_sill, SEXP fit_range) { int i; VARIOGRAM *vgm; SEXP ret; SEXP sills; SEXP ranges; SEXP SSErr; SEXP fit_is_singular; vgm = get_vgm(LTI(0, 0)); vgm->ev->fit = INTEGER(fit)[0]; for (i = 0; i < vgm->n_models; i++) { vgm->part[i].fit_sill = INTEGER(fit_sill)[i]; vgm->part[i].fit_range = INTEGER(fit_range)[i]; } update_variogram(vgm); if (DEBUG_VGMFIT) logprint_variogram(vgm, 1); fit_variogram(vgm); if (DEBUG_VGMFIT) logprint_variogram(vgm, 1); PROTECT(sills = Rf_allocVector(REALSXP, vgm->n_models)); PROTECT(ranges = Rf_allocVector(REALSXP, vgm->n_models)); for (i = 0; i < vgm->n_models; i++) { REAL(sills)[i] = vgm->part[i].sill; REAL(ranges)[i] = vgm->part[i].range[0]; } PROTECT(ret = Rf_allocVector(VECSXP, 4)); SET_VECTOR_ELT(ret, 0, sills); SET_VECTOR_ELT(ret, 1, ranges); PROTECT(fit_is_singular = Rf_allocVector(REALSXP, 1)); REAL(fit_is_singular)[0] = vgm->fit_is_singular; SET_VECTOR_ELT(ret, 2, fit_is_singular); PROTECT(SSErr = Rf_allocVector(REALSXP, 1)); REAL(SSErr)[0] = vgm->SSErr; SET_VECTOR_ELT(ret, 3, SSErr); UNPROTECT(5); return(ret); } SEXP gstat_debug_level(SEXP level) { debug_level = INTEGER(level)[0]; return(level); } SEXP gstat_set_method(SEXP to) { const char *what; what = CHAR(STRING_ELT(to, 0)); for (int id = 1; methods[id].name != NULL; id++) { if (almost_equals(what, methods[id].name)) { set_method(methods[id].m); break; /* id-loop */ } } return(to); } SEXP gstat_set_set(SEXP arg, SEXP val) { const char *name; int i; typedef struct { const char *name; void *ptr; enum { UNKNOWN, IS_INT, IS_UINT, IS_REAL, IS_STRING, IS_D_VECTOR, NO_ARG } what; enum { NOLIMIT, GEZERO, GTZERO } limit; } GSTAT_EXPR; const GSTAT_EXPR set_options[] = { { "alpha", &gl_alpha, IS_REAL, GEZERO }, { "beta", &gl_beta, IS_REAL, GEZERO }, { "blas", &gl_blas, IS_INT, GEZERO }, { "choleski", &gl_choleski, IS_INT, GEZERO }, { "co$incide", &gl_coincide, IS_INT, GEZERO }, { "Cr$essie", &gl_cressie, IS_INT, GEZERO }, { "cutoff", &gl_cutoff, IS_REAL, GTZERO }, { "de$bug", &debug_level, IS_INT, GEZERO }, { "fit", &gl_fit, IS_INT, GEZERO }, { "fit_l$imit", &gl_fit_limit, IS_REAL, GTZERO }, { "fr$action", &gl_fraction, IS_REAL, GTZERO }, /* { "display", &gl_display, IS_STRING, NOLIMIT }, */ { "gls$_residuals", &gl_gls_residuals, IS_INT, GEZERO }, { "id$p", &gl_idp, IS_REAL, GEZERO }, { "in$tervals", &gl_n_intervals, IS_INT, GTZERO }, { "it$er", &gl_iter, IS_INT, GEZERO }, { "lhs", &gl_lhs, IS_INT, GEZERO }, { "longlat", &gl_longlat, IS_INT, GEZERO }, { "sim_beta", &gl_sim_beta, IS_INT, GEZERO }, { "n_uk", &gl_n_uk, IS_INT, GEZERO }, { "numbers", &gl_numbers, IS_INT, GEZERO }, { "nb$lockdiscr", &gl_nblockdiscr, IS_INT, GTZERO }, { "no$check", &gl_nocheck, IS_INT, GEZERO }, { "ns$im", &gl_nsim, IS_INT, GTZERO }, { "or$der", &gl_order, IS_INT, GEZERO }, { "q$uantile", &gl_quantile, IS_REAL, GEZERO }, { "rowwise", &gl_rowwise, IS_INT, GEZERO }, { "rp", &gl_rp, IS_INT, GEZERO }, { "see$d", &gl_seed, IS_INT, GTZERO }, { "useed", &gl_seed, IS_UINT, GEZERO }, { "spa$rse", &gl_sparse, IS_INT, GEZERO }, { "spi$ral", &gl_spiral, IS_INT, GEZERO }, { "spl$it", &gl_split, IS_INT, GTZERO }, { "sy$mmetric", &gl_sym_ev, IS_INT, GEZERO }, { "tol_h$or", &gl_tol_hor, IS_REAL, GEZERO }, { "tol_v$er", &gl_tol_ver, IS_REAL, GEZERO }, { "v$erbose", &debug_level, IS_INT, GEZERO }, { "w$idth", &gl_iwidth, IS_REAL, GEZERO }, { "x$valid", &gl_xvalid, IS_INT, GEZERO }, { "zero_di$st", &gl_zero_est, IS_INT, GEZERO }, { "zero", &gl_zero, IS_REAL, GEZERO }, { "zm$ap", &gl_zmap, IS_REAL, NOLIMIT }, { NULL, NULL, 0, 0 } }; name = CHAR(STRING_ELT(arg, 0)); for (i = 0; set_options[i].name; i++) if (almost_equals(name, set_options[i].name)) break; /* break out i-loop */ if (set_options[i].name == NULL) ErrMsg(ER_SYNTAX, name); if (almost_equals((const char *)name, "nb$lockdiscr")) gl_gauss = 0; /* side effect */ switch (set_options[i].what) { case IS_INT: *((int *) set_options[i].ptr) = Rf_asInteger(val); /* Rprintf("int arg: %s val %d\n", name, Rf_asInteger(val)); */ break; case IS_UINT: *((unsigned int *) set_options[i].ptr) = (unsigned int) Rf_asInteger(val); /* Rprintf("uint arg: %s val %d\n", name, Rf_asInteger(val)); */ break; case IS_REAL: *((double *) set_options[i].ptr) = Rf_asReal(val); /* Rprintf("real arg: %s val %d\n", name, asReal(val)); */ break; case IS_STRING: *((const char **) set_options[i].ptr) = CHAR(STRING_ELT(val, 0)); break; default: ErrMsg(ER_SYNTAX, name); break; } return val; } SEXP gstat_set_merge(SEXP a, SEXP b, SEXP c, SEXP d) { /* merge a(b) with c(d); */ DATA **dpp; int id, id1, id2, col1, col2; id1 = Rf_asInteger(a); id2 = Rf_asInteger(c); if (id1 >= get_n_vars() || id2 >= get_n_vars() || id1 < 0 || id2 < 0) ErrMsg(ER_IMPOSVAL, "id values out of range"); col1 = Rf_asInteger(b); col2 = Rf_asInteger(d); if (id1 < id2) { /* swap id and col */ id = id1; id1 = id2; id2 = id; id = col1; col1 = col2; col2 = id; } dpp = get_gstat_data(); if (push_to_merge_table(dpp[id1], id2, col1, col2)) ErrMsg(ER_IMPOSVAL, "attempt to merge failed"); return(a); } double r_uniform(void) { return(unif_rand()); } double r_normal(void) { return(norm_rand()); } static DATA_GRIDMAP *gstat_S_fillgrid(SEXP gridparams) { double x_ul, y_ul, cellsizex, cellsizey; unsigned int rows, cols; cellsizex = REAL(gridparams)[2]; cellsizey = REAL(gridparams)[3]; rows = (unsigned int) REAL(gridparams)[5]; cols = (unsigned int) REAL(gridparams)[4]; x_ul = REAL(gridparams)[0] - 0.5 * cellsizex; y_ul = REAL(gridparams)[1] + (rows - 0.5) * cellsizey; return gsetup_gridmap(x_ul, y_ul, cellsizex, cellsizey, rows, cols); } gstat/src/msim.c0000644000176200001440000002321314646417261013310 0ustar liggesusers/* * msim.c: multiple simulation database + output * Written during my Post Doc at UvA, end of 1996. * Rewrite started on Sat Apr 10 20:54:05 WET DST 1999 */ #include #include /* qsort() */ #include /* memmove() */ #include /* sqrt(), ... */ #include "defs.h" #include #include "debug.h" #include "data.h" #include "utils.h" #include "vario.h" #include "glvars.h" /* gl_nsim, gl_format */ #include "userio.h" #include "mapio.h" #include "mtrx.h" #include "lm.h" #include "gls.h" #include "sim.h" #include "msim.h" static DPOINT *which_point(DATA *d, DPOINT *where); static unsigned int *get_n_sim_locs_table(unsigned int *size); /* global variables formerly in predict.c; set in s.c */ unsigned int n_pred_locs = 0; #ifdef SIM_DOUBLE typedef double Float; /* doubles the memory requirement -> may be pretty much */ #else typedef float Float; #endif static Float ***msim = NULL, /* * The msim table entry for variable i, for simulation node j, * replicate k is msim[i][j][k] */ **msim_base = NULL; /* base structure for blocked allocation */ static double ***beta = NULL; /* * the beta realisation for variable i, draw j is in * beta[i][j] -- and has dimension data[i]->beta->size */ static unsigned int *n_sim_locs = NULL, /* n simulation locations per data variable */ table_size = 0, /* offset strata table size */ **s2d = NULL, /* * s2d: -- find (POINT *) from msim: * msim[i][j][...] -->> data[i]->list[s2d[i][j]] */ **d2s = NULL; /* * d2s: find msim entry from (POINT *): * data[i]->list[j] -->> msim[i][d2s[i][j]][...] * ((the latter two are necessary because simple counting fails * when point simulation locations coincide with data locations. In * this case, a data DPOINT is not added to the data list, and so we * need to keep track _where_ simulated values were located in order * to write them back to output (file/maps) at the end)) */ void print_sim(void) { /* print complete contents of sim_values -- for debug purposes only */ int i, j, k; for (i = 0; i < get_n_vars(); i++) { printlog("variable %d:\n", i); for (j = 0; j < n_sim_locs[i]; j++) { for (k = 0; k < gl_nsim; k++) printlog(" %g", msim[i][j][k]); printlog("\n"); } } } void init_simulations(DATA **d) { int i, j, size; assert(n_pred_locs > 0); /* should be set by now... */ if (msim != NULL) free_simulations(); n_sim_locs = get_n_sim_locs_table(&table_size); if (DEBUG_DUMP) { printlog("n_sim_locs_table: "); for (i = 0; i < table_size; i++) printlog("[%d] ", n_sim_locs[i]); printlog("\n"); } msim = (Float ***) emalloc(get_n_vars() * sizeof(Float **)); msim_base = (Float **) emalloc(get_n_vars() * sizeof(Float *)); s2d = (unsigned int **) emalloc(get_n_vars() * sizeof(unsigned int *)); d2s = (unsigned int **) emalloc(get_n_vars() * sizeof(unsigned int *)); for (i = 0; i < get_n_vars(); i++) { /* msim stuff: */ size = n_sim_locs[i] * gl_nsim; msim_base[i] = (Float *) emalloc(size * sizeof(Float)); memset(msim_base[i], 0xFF, size * sizeof(Float)); msim[i] = (Float **) emalloc(n_sim_locs[i] * sizeof(Float *)); for (j = 0; j < n_sim_locs[i]; j++) msim[i][j] = &(msim_base[i][j * gl_nsim]); /* index stuff: */ s2d[i] = (unsigned int *) emalloc(n_sim_locs[i] * sizeof(unsigned int)); d2s[i] = (unsigned int *) emalloc(n_sim_locs[i] * sizeof(unsigned int)); /* now let's trigger some Seg Faults if on error: */ memset(s2d[i], 0xFF, n_sim_locs[i] * sizeof(unsigned int)); memset(d2s[i], 0xFF, n_sim_locs[i] * sizeof(unsigned int)); } } void save_sim(DATA **data, DPOINT *where, int sim, int n_vars, const double *value, int *is_pt) { /* * save the last simulated value(s) in msim; * data[0]->n_list and data[0]->n_original (mode != STRATIFY) or * else n_vars (..) denote where it should go. */ int i, row; DPOINT *which = NULL; if (gl_nsim <= 1) return; for (i = 0; i < n_vars; i++) { /* store current simulation */ row = data[i]->n_list - data[i]->n_original + data[i]->nsim_at_data; if (sim == 0) { /* fill d2s and s2d entries: */ assert(row >= 0 && row < n_sim_locs[i]); if (is_pt[i]) { which = which_point(data[i], where); s2d[i][row] = GET_INDEX(which); /* d2s remains MV */ } else { /* newly simulated */ s2d[i][row] = data[i]->n_list; d2s[i][data[i]->n_list - data[i]->n_original] = row; /* please go and check it -- this last line took me 4 hours to get right */ } } msim[i][row][sim] = value[i]; } } void save_sim_strat(DATA *d, DPOINT *where, int sim, double value, int is_pt) { /* the same, but for stratified mode */ int row; DPOINT *which = NULL; if (gl_nsim <= 1) return; row = d->n_list - d->n_original + d->nsim_at_data; if (sim == 0) { /* fill d2s and s2d entries: */ assert(row >= 0 && row < n_sim_locs[d->id]); if (is_pt) { which = which_point(d, where); s2d[d->id][row] = GET_INDEX(which); /* the entry for d2s does not exist */ } else { /* not an original point, but a simulated one: */ s2d[d->id][row] = d->n_list; /* newly simulated */ d2s[d->id][d->n_list - d->n_original] = row; } } msim[d->id][row][sim] = value; } static DPOINT *which_point(DATA *d, DPOINT *where) { int i; double dzero2; #define WPWARNING "if you are simulating with a Gaussian variogram model without nugget\n\ then try to add a small nugget variance to avoid the following error message" dzero2 = gl_zero * gl_zero; for (i = 0; i < d->n_sel; i++) if (fabs(d->pp_norm2(d->sel[i], where)) <= dzero2) return d->sel[i]; pr_warning(WPWARNING); ErrMsg(ER_NULL, "which_point(): point not found"); return where; /* never reached */ } void restore_data_sel(DATA **data, int sim, int n_vars) { unsigned int i, j; int id, idx; DATA *d0 = NULL; if (gl_nsim <= 1) return; if (n_vars == 0) { assert(get_mode() == STRATIFY); d0 = data[0]; for (j = 0; j < d0->n_sel; j++) { id = d0->id; idx = GET_INDEX(d0->sel[j]) - d0->n_original; /* current sim: */ if (idx >= 0 && d2s[id][idx] != 0xFFFFFFFF) d0->sel[j]->attr = msim[id][d2s[id][idx]][sim]; } } else { for (i = 0; i < n_vars; i++) { for (j = 0; j < data[i]->n_sel; j++) { idx = GET_INDEX(data[i]->sel[j]) - data[i]->n_original; /* idx < 0 -->> original data, don't restore */ if (idx >= 0 && d2s[i][idx] != 0xFFFFFFFF) data[i]->sel[j]->attr = msim[i][d2s[i][idx]][sim]; /* data[i]->list[j] -->> msim[i][d2s[i][j]][...] */ } } } } void free_simulations(void) { int i, j; if (msim != NULL) { for (i = 0; i < get_n_vars(); i++) { efree(msim[i]); efree(msim_base[i]); efree(s2d[i]); efree(d2s[i]); } efree(msim); msim = NULL; efree(msim_base); msim_base = NULL; } if (s2d != NULL) { efree(s2d); s2d = NULL; } if (d2s != NULL) { efree(d2s); d2s = NULL; } if (beta != NULL) { for (i = 0; i < get_n_vars(); i++) { for (j = 0; j < gl_nsim; j++) efree(beta[i][j]); efree(beta[i]); } efree(beta); beta = NULL; } if (n_sim_locs != NULL) free(n_sim_locs); n_sim_locs = NULL; } void setup_beta(DATA **d, int n_vars, int n_sim) { double *est; const double *sim = NULL; int i, j, k, sum_n_X = 0, offset, *is_pt = NULL; assert(beta == NULL); /* entered only once */ /* allocate beta */ beta = (double ***) emalloc(n_vars * sizeof(double **)); for (i = 0; i < n_vars; i++) { assert(d[i]->n_list > 0); beta[i] = (double **) emalloc(n_sim * sizeof(double *)); for (j = 0; j < n_sim; j++) beta[i][j] = (double *) emalloc(d[i]->n_X * sizeof(double)); } for (i = 0; i < n_vars; i++) { if (d[i]->beta == NULL) /* push bogus values */ for (j = 0; j < d[i]->n_X; j++) d[i]->beta = push_d_vector(-9999.9, d[i]->beta); sum_n_X += d[i]->n_X; } printlog("drawing %d %s%s realisation%s of beta...\n", n_sim, n_vars > 1 ? (gl_sim_beta == 0 ? "multivariate " : "univariate ") : "", gl_sim_beta == 2 ? "OLS" : "GLS", n_sim > 1 ? "s" : ""); is_pt = (int *) emalloc(sum_n_X * sizeof(int)); if (gl_sim_beta == 0) { est = make_gls_mv(d, n_vars); for (j = 0; j < n_sim; j++) { sim = cond_sim(est, sum_n_X, GSI, is_pt, 0); /* length sum_n_X */ for (i = offset = 0; i < n_vars; i++) { for (k = 0; k < d[i]->n_X; k++) beta[i][j][k] = sim[offset + k]; offset += d[i]->n_X; if (DEBUG_DUMP || DEBUG_COV) { printlog("var=%d, sim=%d, beta=[ ", i, j); for (k = 0; k < d[i]->n_X; k++) printlog("%g ", beta[i][j][k]); printlog("]\n"); } } } efree(est); } else { for (i = 0; i < n_vars; i++) { if (gl_sim_beta == 1) est = make_gls(d[i], 0); else /* gl_sim_beta == 2 */ est = make_ols(d[i]); for (j = 0; j < n_sim; j++) { sim = cond_sim(est, d[i]->n_X, GSI, is_pt, 0); for (k = 0; k < d[i]->n_X; k++) beta[i][j][k] = sim[k]; if (DEBUG_DUMP || DEBUG_COV) { printlog("var=%d, sim=%d, beta=[ ", i, j); for (k = 0; k < d[i]->n_X; k++) printlog("%g ", beta[i][j][k]); printlog("]\n"); } } efree(est); } } efree(is_pt); return; } void set_beta(DATA **d, int sim, int n_vars, METHOD method) { /* n_vars == 0 --> stratified mode, check d[0]->id to find out which * data we've got here */ int i; assert(d[0]->beta); if (beta == NULL) /* use the values entered by the user */ return; if (get_mode() != STRATIFY) { for (i = 0; i < n_vars; i++) d[i]->beta->val = beta[i][sim]; } else d[0]->beta->val = beta[d[0]->id][sim]; return; } float ***get_msim(void) { return msim; } static unsigned int *get_n_sim_locs_table(unsigned int *size) { unsigned int i, *table; *size = (int) get_n_vars(); table = (unsigned int *) emalloc(*size * sizeof(int)); for (i = 0; i < *size; i++) table[i] = n_pred_locs; return table; } gstat/src/gcdist.c0000644000176200001440000000256614646417261013630 0ustar liggesusers#include /* sin() etc */ #include #include #include #define POWDI(x,i) R_pow_di(x,i) #include "gcdist.h" double gstat_gcdist(double lon1, double lon2, double lat1, double lat2) { /* http://home.att.net/~srschmitt/script_greatcircle.html */ /* taken from R package sp source; Copyright by Roger Bivand (C) 2005 */ double F, G, L, sinG2, cosG2, sinF2, cosF2, sinL2, cosL2, S, C; double w, R, a, f, D, H1, H2; double lat1R, lat2R, lon1R, lon2R, DE2RA; if (lon1 == lon2 && lat1 == lat2) return 0.0; DE2RA = M_PI/180; a = 6378.137; /* WGS-84 equatorial radius in km */ f = 1.0/298.257223563; /* WGS-84 ellipsoid flattening factor */ lat1R = lat1 * DE2RA; lat2R = lat2 * DE2RA; lon1R = lon1 * DE2RA; lon2R = lon2 * DE2RA; F = (lat1R + lat2R) / 2.0; G = (lat1R - lat2R) / 2.0; L = (lon1R - lon2R) / 2.0; sinG2 = POWDI(sin(G), 2); cosG2 = POWDI(cos(G), 2); sinF2 = POWDI(sin(F), 2); cosF2 = POWDI(cos(F), 2); sinL2 = POWDI(sin(L), 2); cosL2 = POWDI(cos(L), 2); S = sinG2 * cosL2 + cosF2 * sinL2; C = cosG2 * cosL2 + sinF2 * sinL2; w = atan(sqrt(S / C)); R = sqrt(S * C) / w; D = 2 * w * a; H1 = (3 * R - 1)/(2 * C); H2 = (3 * R + 1)/(2 * S); return D * (1 + f * H1 * sinF2 * cosG2 - f * H2 * cosF2 * sinG2); } gstat/src/userio.c0000644000176200001440000000622114662102041013632 0ustar liggesusers/* * userio.c: i/o routines for error, warning, log and progress messages */ #include #include "R.h" #include "defs.h" #include "debug.h" #include "utils.h" #include "s.h" #include "userio.h" static const char *error_messages[MAX_ERRNO+1] = { /* 0 */ "%s", /* 1 */ "bug in function `%s'", /* 2 */ "variable not set: %s", /* 3 */ "variable outside valid range: %s", /* 4 */ "value not allowed for: %s", /* 5 */ "no filename set %s", /* 6 */ "write failed on file `%s'", /* 7 */ "read failed on file `%s'", /* 9 */ "cannot read real value from `%s'", /* 9 */ "cannot read integer from `%s'", /* 10 */ "syntax error: %s", /* 11 */ "illegal option or missing argument on `%s'", /* 12 */ "domain (math) error on `%s'", /* 13 */ "out of dynamic memory (try local kriging?)", /* 14 */ "i/o error: %s", /* 15 */ "no command file%s", /* 16 */ "%s user interface not compiled in this version", /* 17 */ "writing to pipe `%s' failed", /* 18 */ "reading from pipe `%s' failed", /* 19 */ "function call prevented by secure mode%s" }; /* * error handling function -- print message and error to string, and * call error message handler. */ void gstat_error(char *fname, int line, enum Gstat_errno err_nr, const char *msg) { assert(err_nr <= MAX_ERRNO); if (DEBUG_DUMP || err_nr == ER_NULL) /* print file&line */ Rprintf("(%s, line %d)", fname, line); if (err_nr == ER_NULL) Rf_error("NULL error: this indicates a bug, please consider reporting this\n"); if (msg == NULL) Rf_error(" message: indicating a software bug, please report\n"); else Rf_error(error_messages[err_nr], msg); return; } /* message() calls for messages preceding a call to ErrMsg() */ void message(char *fmt, ...) { va_list args; /* char *buf = NULL; */ char w[ERROR_BUFFER_SIZE]; w[0] = '\0'; va_start(args, fmt); vsnprintf(w, ERROR_BUFFER_SIZE, fmt, args); va_end(args); Rprintf("%s", w); } /* print a warning message to string, and call warning message handler */ void pr_warning(char *fmt, ...) { va_list args; char w[ERROR_BUFFER_SIZE]; if (DEBUG_SILENT) return; w[0] = '\0'; va_start(args, fmt); vsnprintf(w, ERROR_BUFFER_SIZE, fmt, args); va_end(args); Rf_warning("%s\n", w); } void printlog(const char *fmt, ...) { va_list args; char w[ERROR_BUFFER_SIZE]; if (DEBUG_SILENT) return; w[0] = '\0'; va_start(args, fmt); vsnprintf(w, ERROR_BUFFER_SIZE, fmt, args); va_end(args); Rprintf("%s", w); } void print_progress(unsigned int current, unsigned int total) { static int perc_last = -1, sec_last = -1; int perc, sec; static time_t start; R_CheckUserInterrupt(); /* allow for user interrupt */ if (total <= 0 || DEBUG_SILENT || ! do_print_progress) return; if (sec_last == -1) { start = time(NULL); sec_last = 0; } perc = floor(100.0 * current / total); if (perc != perc_last) { /* another percentage -> calculate time: */ if (current == total) { /* 100% done, reset: */ Rprintf("\r%3d%% done\n", 100); perc_last = sec_last = -1; } else { sec = difftime(time(NULL), start); if (sec != sec_last) { /* another second -- don't print too often */ Rprintf("\r%3d%% done", perc); perc_last = perc; sec_last = sec; } } } } gstat/src/gls.h0000644000176200001440000000074214646417261013137 0ustar liggesusersenum GLS_WHAT { GLS_BLUE /* generalized least squares best linear unbiased estimate */, GLS_BLUP /* gls best linear unbiased predictor */, GLS_BLP /* gls best linear predictor */, UPDATE /* update estimate: use previously calculated weights */, GLS_INIT /* initial value */ }; void gls(DATA **d, int n_vars, enum GLS_WHAT pred, DPOINT *where, double *est); double *make_gls(DATA *d, int calc_residuals); double *make_gls_mv(DATA **d, int n_vars); void free_glm(void *v_glm); gstat/src/data.h0000644000176200001440000002677114646417261013275 0ustar liggesusers#ifndef DATA_H # define DATA_H /* avoid multiple inclusion */ #include /* INT_MAX */ #include /* FLT_MAX */ #define ID_OF_VALDATA INT_MAX #define ID_OF_AREA (INT_MAX-1) #define IS_GLOBAL(d) (d->sel_rad >= DBL_MAX && d->sel_max >= INT_MAX) #define DELIMITERS " \t,\n\r" #define N_POLY 18 #define POLY_MIN (-19) /* lowest index */ #define POLY_X (-19) #define POLY_Y (-18) #define POLY_Z (-17) #define POLY_X2 (-16) #define POLY_Y2 (-15) #define POLY_Z2 (-14) #define POLY_XY (-13) #define POLY_XZ (-12) #define POLY_YZ (-11) #define POLY_X3 (-10) #define POLY_Y3 (-9) #define POLY_Z3 (-8) #define POLY_X2Y (-7) #define POLY_XY2 (-6) #define POLY_X2Z (-5) #define POLY_XZ2 (-4) #define POLY_Y2Z (-3) #define POLY_YZ2 (-2) /* -1 is reserved for "no intercept" */ typedef struct { int poly_nr; char *name; int degree, mode; } POLY_NM; typedef struct { /* structure to hold one point value: */ double x, y, z, /* x, y and z coordinate */ variance, /* the attribute's variance */ attr; /* attribut value (data value) */ union { float dist2; /* squared distance to estimate point */ float weight; /* weight in block discretization */ int stratum; /* stratum of current point in data() list */ } u; double *X; /* row entry in X matrix for this DPOINT */ unsigned int bitfield; /* most right bit: IS_POINT (0) or IS_BLOCK (1), remaining left bits: index of this point in d->list */ } DPOINT; /* qtree_search structs (nsearch.c): */ typedef struct { /* defining a rectangular bounding box */ double x, y, z, size; int mode; } BBOX; typedef struct qnode { /* the struct used to define nodes in the search tree */ int n_node; /* >= 0: number of data points in this node */ /* negative (-1) if u is a node list */ union { struct qnode **node;/* pointers to 4 or 8 other nodes */ DPOINT **list; /* or pointers to data points within this leaf */ } u; BBOX bb; } QTREE_NODE; typedef struct { double x_ul, y_ul, cellsizex, cellsizey; unsigned int rows, cols; DPOINT ***dpt, /* 2d array to (DPOINT *) entries in list */ **grid_base; /* base of blocked memory allocation */ } DATA_GRIDMAP; /* the management summary */ /* polygon structs: */ typedef struct { double x, y; } PLOT_POINT; typedef struct { PLOT_POINT min, max; } MBR; typedef struct polygon { MBR mbr; int lines; PLOT_POINT *p; int close; /* 1 - is closed polygon */ } POLYGON; typedef enum { DATA_UNKNOWN = 0, DATA_ASCII_TABLE, /* ascii table */ DATA_EAS, /* simplified GeoEAS format */ DATA_IDRISI_VEC, /* idrisi .vec */ DATA_IDRISI32_VEC, /* idrisi .vct */ DATA_IDRISI_BIN, /* Idrisi .img binary */ DATA_IDRISI_ASCII, /* Idrisi .img ascii */ DATA_IDRISI32_BIN, /* Idrisi32 .rst binary */ DATA_IDRISI32_ASCII,/* Idrisi32 .rst ascii */ DATA_GRIDASCII, /* ArcInfo */ DATA_GRIDFLOAT, /* ArcInfo */ DATA_CSF, /* PCRaster */ DATA_T2, /* Mike-SHE grid format */ DATA_ERMAPPER, /* ER-Mapper raster dataset */ DATA_GNUPLOT, /* gnuplot binary grid */ DATA_GMT, /* GMT netCDF format */ DATA_SURFER_DSAA, /* Surfer DSAA ascii grid */ DATA_GSLIB, /* GSLIB ascii grid */ DATA_GRASS, /* GRASS site list */ DATA_GRASS_GRID, /* GRASS raster */ DATA_GDAL, /* GDAL raster */ DATA_EXT_DBASE /* CW external database */ } DATA_TYPE_; typedef struct { DATA_TYPE_ type; const char *name; } DATA_TYPE; extern const DATA_TYPE data_types[]; typedef struct { int to_var, /* merge from current data to this variable */ col_this_X, /* merge this column number */ col_other_X; /* to this column number in the other variable */ } MERGE_TABLE; typedef struct { int size, max_size; double *val; } D_VECTOR; D_VECTOR *push_d_vector(double d, D_VECTOR *v); void free_d_vector(D_VECTOR *v); /* CW added, FTTB copies of DATA members * SEARCH_CRITERIA should become part of DATA * Dit zijn degene die ik begrijp */ typedef struct { /* DATA::prob sample later */ int force, /* force neighbourhood selection */ sel_min, sel_max, /* min and max number for neighbourhood selection */ oct_max, /* max # pts for each octant; 0: use no octant search */ oct_filled, /* RETURN VALUE? number of non-empty octants in selection */ square; /* use square search neighbourhood, default circular */ double sel_rad; /* radius for neighbourhhood selection */ }SEARCH_CRITERIA; typedef struct { /* structure that holds data info and lists */ char *variable, /* attr name, log(..) */ *x_coord, /* name of x coordinate */ *y_coord, /* name of y coordinate */ *z_coord, /* name of z coordinate */ *s_coord, /* name of stratum variable */ *V_coord, /* name of variance */ *Category, /* category value, for indicator transform */ *id_name, /* name of ID column*/ *fname, /* file name */ **point_ids, /* IDs of points */ *var_fn_str, /* VarFunction string */ *nscore_table; /* normal score table output file name */ DATA_TYPE type; /* what is this file? */ int id, /* id of data, number in command file */ n_list, /* # points in list */ n_original, /* # real data (read from file, not simulated) */ n_sel, /* # of points in selection: sel */ n_max, /* maximum # in list */ nsim_at_data, /* nr. of pts at simulation locations */ init_max, /* user-specified maximum n (to save memory) */ n_sel_max, /* maximum number in sel */ n_X, *colX, /* number and columns in X matrix */ log, /* is attr.value log-transformed ? */ force, /* force neighbourhood selection */ vdist, /* use variogram value as distance crit. */ n_averaged, /* number of averaged data so far */ colnx, colny, colnz, /* column-numbers */ colnvariance, /* column that holds variance */ colnvalue, /* column that holds attribute values */ colns, /* column that holds u (if strata) */ coln_id, /* column with ID */ sel_min, sel_max, /* min and max number for neighbourhood selection */ oct_max, /* max # pts for each octant; 0: use no octant search */ oct_filled, /* number of non-empty octants in selection */ mode, /* mode: 1(x),2(y),3(xy),4(z),5(xz).. */ dummy, /* is this variable a dummy variable? */ standard, /* if standard: data are standardized by dividing all values by data->std */ calc_residuals, /* 1: do calculate OLS residuals for vgm est */ is_residual, /* attr values are residuals lm X */ polynomial_degree, /* degree of coordinate polynomial */ togrid, /* shift data values to grid centres */ square, /* use square search neighbourhood */ centre, /* centre area + points() at area centre? */ region, /* select data in region? */ average, /* average measurements at identical location? */ every, /* sample only every x-th observation */ offset, skip, /* starting at offset */ datatype, /*KS added what idrisi data type 0=integer,1=real 1/18/99*/ filetype; /*KS added what idrisi file type 0=ascii,1=binary 1/18/99*/ enum { U_UNKNOWN, U_ISDIST, U_ISWEIGHT, U_ISSTRATUM } what_is_u; double sel_rad, /* radius for neighbourhhood selection */ Icutoff, /* cutoff value for indicator variable: */ /* colnvalue = ("real value" <= Icutoff) */ minX, maxX, minY, maxY, minZ, maxZ, /* min/max of coordinates */ minvariance, maxvariance, /* min/max variance */ mv, /* missing value */ dX, /* max. vector norm X-space distance */ prob, /* inclusion probability (to sample data file) */ lambda; /* lambda value for box-cox transform */ int minstratum, maxstratum; /* min/max stratum */ double mean, std; /* sample mean and st.dev. of attribute */ /* CW members to hold data in this struct (DATA_TYPE!= DATA_EXT_DBASE) */ DPOINT **list; /* list of data points, of length n_list */ DPOINT *P_base; /* base for pointer array, if allocated blockwise */ DPOINT **sel; /* list of selection indices, of length n_sel */ double (*point_norm)(const DPOINT *); /* eucl. vector length */ double (*pp_norm2)(const DPOINT *, const DPOINT *); /* point-point squared distance */ double (*pb_norm2)(const DPOINT *, BBOX); /* point-BBOX distance: nsearch.c */ double (*variance_fn)(double mu); /* variance function */ double *X_base; /* base pointer for X arrays, when allocated blockwise */ void *lm, /* cast to LM *, see lm.h */ *glm; /* remember: several matrices/vecs needed in gls.c */ /* next 2 entries are for merging regressors across variables */ /* to avoid double references, each entry var should be less than ->id */ int n_merge; /* merge_table size */ MERGE_TABLE *mtbl; /* entries in merge table */ QTREE_NODE *qtree_root; /* a tree-based structure with pointers to list[] for fast neighbourhood search */ /* POLYGON *poly; */ /* where the polygons go */ #ifdef WITH_SPIRAL SPIRAL *spiral; /* spiral search index structure */ #endif DATA_GRIDMAP *grid; /* grid map topology if data was read from a map */ D_VECTOR *beta; } DATA; #define X_BIT_SET 1 /* also used in nsearch.c */ #define Y_BIT_SET 2 #define Z_BIT_SET 4 #define V_BIT_SET 8 #define S_BIT_SET 16 #define D_HAS_WEIGHT(d) (d->what_is_u == U_ISWEIGHT) #define D_HAS_DIST(d) (d->what_is_u == U_ISDIST) #define D_HAS_STRATA(d) (d->colnu && d->what_is_u == U_ISSTRATA) /* following routines do not depend on sizeof(int) (K&R II, p. 48, 49) */ #define left_bits(x) ((x) >> 1) /* shift one, zero most left bit */ /* #define right_bit(x) ((x) & ~(~0 << 1)) */ /* zero all except right bit */ #define right_bit(x) ((x) & ~((unsigned long)~0 << 1)) #define set_right_bit_on(x) (x = (x) | 1) #define set_right_bit_off(x) (x = (x) & ((unsigned long)~0 << 1)) #define set_left_bits(x,val) (x = ((unsigned long)val << 1) | right_bit(x)) #define GET_INDEX(p) (left_bits((p)->bitfield)) #define SET_INDEX(p,val) (set_left_bits((p)->bitfield,val)) #define IS_BLOCK(p) (right_bit((p)->bitfield)) #define IS_POINT(p) (!right_bit((p)->bitfield)) #define SET_BLOCK(p) (set_right_bit_on((p)->bitfield)) #define SET_POINT(p) (set_right_bit_off((p)->bitfield)) #if defined(__cplusplus) extern "C" { #endif DATA *read_gstat_data(DATA *d); DATA *get_area_centre(DATA *area, DATA *valdata); void centre_area(DATA *area); void push_point(DATA *d, const DPOINT *p); void pop_point(DATA *d, int list_nr); void free_data(DATA *tmp); #define print_data_list(d) print_data(d, 1) #define print_data_selection(d) print_data(d, 0) void print_data(const DATA *d, int list); void logprint_point(const DPOINT *p, const DATA *d); DATA *init_one_data(DATA *data); int coordinates_are_equal(const DATA *a, const DATA *b); void init_data_minmax(void); void setup_data_minmax(DATA *d); void calc_polynomials(DATA *d); double calc_polynomial(DPOINT *p, int colX); char *print_data_line(const DATA *d, char **to); extern const POLY_NM polynomial[N_POLY]; #define POLY_NAME(i) polynomial[i - POLY_MIN].name #define POLY_DEGREE(i) polynomial[i - POLY_MIN].degree void data_add_X(DATA *d, int i); int push_to_merge_table(DATA *d, int to_var, int col_this_X, int col_other_X); DATA_GRIDMAP *gsetup_gridmap(double x_ul, double y_ul, double cellsizex, double cellsizey, unsigned int rows, unsigned int cols); void datagrid_rebuild(DATA *d, int adjust_to_gridcentres); void set_norm_fns(DATA *d); double data_block_diagonal(DATA *data); int intercept_only(const DATA *d); double v_mu(double mu); double v_mu2(double mu); double v_mu3(double mu); double v_bin(double mu); double v_identity(double mu); void setup_polynomial_X(DATA *d); void calc_polynomial_point(DATA *d, DPOINT *pt); double pp_norm_gc(const DPOINT *a, const DPOINT *b); void free_data_gridmap(DATA_GRIDMAP *t); #if defined(__cplusplus) } #endif #endif /* DATA_H */ gstat/src/vario_fn.h0000644000176200001440000000305714646417261014157 0ustar liggesusers/* unit basic variogram models */ double fn_nugget(double h, double *r); double fn_linear(double h, double *r); double fn_circular(double h, double *r); double fn_spherical(double h, double *r); double fn_bessel(double h, double *r); double fn_gaussian(double h, double *r); double fn_exclass(double h, double *r); double fn_matern(double h, double *r); double fn_matern2(double h, double *r); double fn_exponential(double h, double *r); double fn_pentaspherical(double h, double *r); double fn_periodic(double h, double *r); double fn_wave(double h, double *r); double fn_hole(double h, double *r); double fn_logarithmic(double h, double *r); double fn_power(double h, double *r); double fn_spline(double h, double *r); double fn_legendre(double h, double *r); double fn_intercept(double h, double *r); /* the following functions are not all defined */ double da_is_zero(double h, double *r); /* NUG, INT */ double da_fn_linear(double h, double *r); double da_fn_circular(double h, double *r); double da_fn_spherical(double h, double *r); double da_fn_bessel(double h, double *r); double da_fn_gaussian(double h, double *r); double da_fn_exponential(double h, double *r); double da_fn_pentaspherical(double h, double *r); double da_fn_periodic(double h, double *r); double da_fn_wave(double h, double *r); double da_fn_hole(double h, double *r); double da_fn_logarithmic(double h, double *r); double da_fn_power(double h, double *r); /* unit derivative-to-range of basic variogram models */ double da_fn_exponential(double h, double *r); double da_fn_nugget(double h, double *r); gstat/src/fit.c0000644000176200001440000002125414646417261013130 0ustar liggesusers/* * fit.c: fit variogram model to experimental variograms; gnuplot fit driver */ #include #include /* getenv() */ #include /* strstr() */ #include /* fabs(), sqrt() */ #include /* Rprintf() */ #include "mtrx.h" #include "defs.h" #include "defaults.h" #include "userio.h" #include "data.h" #include "utils.h" #include "debug.h" #include "vario.h" #include "sem.h" #include "glvars.h" #include "reml.h" #include "lm.h" #include "fit.h" #define NEARLY_ZERO 1.0e-30 static void wls_fit(VARIOGRAM *vp); static double getSSErr(const VARIOGRAM *vp, PERM *p, LM *lm); static int fill_weights(const VARIOGRAM *vp, PERM *p, LM *lm); static int fit_GaussNewton(VARIOGRAM *vp, PERM *p, LM *lm, int iter, int *bounded); int fit_variogram(VARIOGRAM *v) { DATA **d = NULL; int i = 0; long n = 0; if (v->ev->refit == 0) return 0; if (v->ev->fit != NO_FIT && v->ev->fit != MIVQUE_FIT) { if (! v->ev->cloud) { while (n == 0 && i < v->ev->n_est) n += v->ev->nh[i++]; /* check if estimates exist */ if (n == 0) /* bad luck */ return 1; } else if (v->ev->n_est == 0) return 1; } if (v->ev->fit != NO_FIT) { if (v->ev->map) ErrMsg(ER_IMPOSVAL, "cannot fit model to variogram map"); for (i = 0; i < v->n_models; i++) if (v->part[i].sill == 0.0 && v->part[i].fit_sill != 0) v->part[i].sill = 1.0; /* avoid lot'o trouble */ } if (v->ev->fit == WLS_FIT_MOD && !is_variogram(v)) pr_warning("this fit method is not recommended for covariograms"); v->ev->direction.x = sin(gl_alpha * PI / 180.0) * cos(gl_beta * PI / 180.0); v->ev->direction.y = cos(gl_alpha * PI / 180.0) * cos(gl_beta * PI / 180.0); v->ev->direction.z = sin(gl_beta * PI / 180.0); switch (v->ev->fit) { case NO_FIT: break; case OLS_FIT: /* BREAKTHROUGH: */ case WLS_FIT: /* BREAKTHROUGH: */ case WLS_FIT_MOD: case WLS_NHH: wls_fit(v); break; case MIVQUE_FIT: if (v->id1 != v->id2) return 1; d = get_gstat_data(); reml_sills(d[v->id1], v); break; default: Rprintf("%d\n", v->ev->fit); ErrMsg(ER_IMPOSVAL, "fit_vgm(): value for fit not recognized or not implemented"); /* no default: force compile warning on missing option! */ } return 0; } static void wls_fit(VARIOGRAM *vp) { /* * non-linear iterative reweighted least squares fitting of variogram model to * sample variogram (..covariogram model to sample covariogram, cross, etc.) * all information necessary is contained in *vp. * * uses Marquardt-Levenberg algorithm; * the implementation follows gnuplot's fit.c */ static PERM *p = PNULL; int i, j, n_iter = 0, bounded = 0, timetostop; double SSErr, oldSSErr = DBL_MAX, step; LM *lm; p = px_resize(p, vp->ev->n_est); if (! vp->ev->cloud) { for (i = j = 0; i < (vp->ev->zero == ZERO_AVOID ? vp->ev->n_est-1 : vp->ev->n_est); i++) { if (vp->ev->nh[i] > 0) p->pe[j++] = i; } p->size = j; } lm = init_lm(NULL); /* oldSSErr = getSSErr(vp, p, lm); */ do { print_progress(n_iter, gl_iter); /* if (DEBUG_VGMFIT) printlog("%s: ", vp->descr); */ if ((vp->fit_is_singular = fit_GaussNewton(vp, p, lm, n_iter, &bounded))) { pr_warning("singular model in variogram fit"); print_progress(gl_iter, gl_iter); vp->SSErr = getSSErr(vp, p, lm); return; } update_variogram(vp); SSErr = getSSErr(vp, p, lm); /* we can't use lm->SSErr here since that's only in the X-filled-with-derivatives, not the true residuals */ step = oldSSErr - SSErr; if (SSErr > gl_zero) step /= SSErr; n_iter++; if (DEBUG_VGMFIT) printlog("after it. %d: SSErr %g->%g, step=%g (fit_limit %g%s)\n", n_iter, oldSSErr, SSErr, step, gl_fit_limit, bounded ? "; bounded" : ""); oldSSErr = SSErr; timetostop = (step < gl_fit_limit && step >= 0.0 && bounded == 0) || n_iter == gl_iter; } while (! timetostop); print_progress(gl_iter, gl_iter); if (n_iter == gl_iter) pr_warning("No convergence after %d iterations: try different initial values?", n_iter); if (DEBUG_VGMFIT) { printlog("# iterations: %d, SSErr %g, last step %g", n_iter, SSErr, step); if (step < 0.0) printlog(", last step was in the wrong direction.\n"); else printlog("\n"); } free_lm(lm); vp->SSErr = SSErr; return; } /* wls_fit */ static double getSSErr(const VARIOGRAM *vp, PERM *p, LM *lm) { int i; double x, y, z, dz, SSErr; /* if (fill_weights(vp, p, lm)) return 0.0; */ for (i = 0, SSErr = 0.0; i < p->size; i++) { x = vp->ev->direction.x * vp->ev->dist[p->pe[i]]; y = vp->ev->direction.y * vp->ev->dist[p->pe[i]]; z = vp->ev->direction.z * vp->ev->dist[p->pe[i]]; /* fill y with current residuals: */ dz = vp->ev->gamma[p->pe[i]] - (is_variogram(vp) ? get_semivariance(vp, x, y, z) : get_covariance(vp, x, y, z)); if (lm->weights != NULL) SSErr += dz * dz * lm->weights->ve[i]; else SSErr += dz * dz; } return SSErr; } static int fit_GaussNewton(VARIOGRAM *vp, PERM *p, LM *lm, int iter, int *bounded) { double s = 0.0, x, y, z; int i, j, n_fit, model, fit_ranges = 0; IVEC *fit = NULL; VEC *start = NULL; if (p->size == 0) return 1; fit = iv_resize(fit, 2 * vp->n_models); /* index fit parameters: parameter fit->ive[j] corresponds to model i */ for (i = n_fit = 0; i < vp->n_models; i++) { if (vp->part[i].fit_sill) fit->ive[n_fit++] = i; if (vp->part[i].fit_range) { fit->ive[n_fit++] = i + vp->n_models; /* large -->> ranges */ fit_ranges = 1; } } if (n_fit == 0) { iv_free(fit); return 0; } fit = iv_resize(fit, n_fit); /* shrink to fit */ lm->X = m_resize(lm->X, p->size, n_fit); lm->y = v_resize(lm->y, p->size); start = v_resize(start, n_fit); for (i = 0; i < n_fit; i++) { if (fit->ive[i] < vp->n_models) { model = fit->ive[i]; start->ve[i] = vp->part[model].sill; } else { model = fit->ive[i] - vp->n_models; start->ve[i] = vp->part[model].range[0]; } } for (i = 0; i < p->size; i++) { x = vp->ev->direction.x * vp->ev->dist[p->pe[i]]; y = vp->ev->direction.y * vp->ev->dist[p->pe[i]]; z = vp->ev->direction.z * vp->ev->dist[p->pe[i]]; /* fill y with current residuals: */ if (is_variogram(vp)) s = get_semivariance(vp, x, y, z); else s = get_covariance(vp, x, y, z); lm->y->ve[i] = vp->ev->gamma[p->pe[i]] - s; /* fill X: */ for (j = 0; j < n_fit; j++) { /* cols */ if (fit->ive[j] < vp->n_models) { model = fit->ive[j]; ME(lm->X, i, j) = (is_variogram(vp) ? UnitSemivariance(vp->part[model],x,y,z) : UnitCovariance(vp->part[model],x,y,z)); } else { model = fit->ive[j] - vp->n_models; ME(lm->X, i, j) = (is_variogram(vp) ? da_Semivariance(vp->part[model],x,y,z) : -da_Semivariance(vp->part[model],x,y,z)); } } } if (iter == 0 && fill_weights(vp, p, lm)) { iv_free(fit); v_free(start); return 1; } lm->has_intercept = 1; /* does not affect the fit */ lm = calc_lm(lm); /* solve WLS eqs. for beta */ if (DEBUG_FIT) { Rprintf("beta: "); v_logoutput(lm->beta); } if (lm->is_singular) { iv_free(fit); v_free(start); return 1; } if (fit_ranges) { s = v_norm2(lm->beta) / v_norm2(start); if (s > 0.2) { /* don't allow steps > 20% ---- */ sv_mlt(0.2 / s, lm->beta, lm->beta); *bounded = 1; } else *bounded = 0; /* a `free', voluntary step */ } else /* we're basically doing linear regression here: */ *bounded = 0; for (i = 0; i < n_fit; i++) { if (fit->ive[i] < vp->n_models) { model = fit->ive[i]; vp->part[model].sill = start->ve[i] + lm->beta->ve[i]; } else { model = fit->ive[i] - vp->n_models;; vp->part[model].range[0] = start->ve[i] + lm->beta->ve[i]; } } iv_free(fit); v_free(start); return 0; } static int fill_weights(const VARIOGRAM *vp, PERM *p, LM *lm) { double x, y, z, s; int i, retval = 0; if (vp->ev->fit == OLS_FIT || (vp->ev->cloud && vp->ev->fit == WLS_FIT)) { if (lm->weights != NULL) v_free(lm->weights); lm->weights = NULL; return 0; } lm->weights = v_resize(lm->weights, p->size); for (i = 0; i < p->size; i++) { if (vp->ev->fit == WLS_NHH) s = vp->ev->dist[p->pe[i]]; else { x = vp->ev->direction.x * vp->ev->dist[p->pe[i]]; y = vp->ev->direction.y * vp->ev->dist[p->pe[i]]; z = vp->ev->direction.z * vp->ev->dist[p->pe[i]]; s = get_semivariance(vp, x, y, z); } if (vp->ev->cloud) { lm->weights->ve[i] = 1.0; if (fabs(s) > NEARLY_ZERO) lm->weights->ve[i] /= s * s; else { pr_warning("infinite weight during fit"); retval = 1; break; } } else { /* no cloud: */ lm->weights->ve[i] = vp->ev->nh[p->pe[i]]; if (vp->ev->fit != WLS_FIT) { if (fabs(s) > NEARLY_ZERO) lm->weights->ve[i] /= (s * s); else { pr_warning("infinite weight during fit"); retval = 1; break; } } } /* else cloud */ } /* for i */ return retval; } gstat/src/mtrx.h0000644000176200001440000000377014646417261013350 0ustar liggesusers#ifndef MTRXH # define MTRXH /* interface copied from meschach; implementation rewritten from scratch */ typedef struct { size_t m, n, /* #rows, #cols */ max; /* max size, memory allocated */ double *v; } MAT; /* dense matrix */ #define ME(X,i,j) X->v[j * X->m + i] /* row i, column j, column-major access */ typedef struct { size_t dim, max; double *ve; } VEC; /* vector: row or column, whatever matches */ typedef struct { size_t size, max; int *pe; } PERM; typedef struct { size_t size, max; int *ive; } IVEC; #define PNULL (PERM *) NULL #define MNULL (MAT *) NULL #define VNULL (VEC *) NULL #define IVNULL (IVEC *) NULL #define M_FREE(x) { if (x != NULL) m_free(x); x = MNULL; } #define V_FREE(x) { if (x != NULL) v_free(x); x = VNULL; } #define P_FREE(x) { if (x != NULL) px_free(x); x = PNULL; } void m_free(MAT *m); void v_free(VEC *v); void iv_free(IVEC *v); void px_free(PERM *p); #define m_get(i,j) m_resize(MNULL, i, j) #define v_get(i) v_resize(VNULL, i) MAT *m_resize(MAT *mat, size_t m, size_t n); VEC *v_resize(VEC *v, size_t n); PERM *px_resize(PERM *p, size_t n); IVEC *iv_resize(IVEC *v, size_t n); MAT *m_zero(MAT *m); VEC *v_zero(VEC *v); MAT *m_inverse(MAT *in, int *info); VEC *vm_mlt(MAT *m, VEC *v, VEC *out); VEC *mv_mlt(MAT *m, VEC *v, VEC *out); MAT *m_mlt(MAT *m1, MAT *m2, MAT *out); MAT *mtrm_mlt(MAT *m1, MAT *m2, MAT *out); VEC *v_sub(VEC *v1, VEC *v2, VEC *out); MAT *m_sub(MAT *m1, MAT *m2, MAT *out); VEC *v_add(VEC *v1, VEC *v2, VEC *out); VEC *sv_mlt(double s, VEC *v1, VEC *v2); MAT *m_add(MAT *m1, MAT *m2, MAT *out); MAT *m_copy(MAT *in, MAT *out); VEC *v_copy(VEC *in, VEC *out); double v_norm2(VEC *v); MAT *CHsolve(MAT *A, MAT *b, MAT *out, PERM *piv); VEC *CHsolve1(MAT *A, VEC *b, VEC *out, PERM *piv); MAT *CHfactor(MAT *A, PERM *piv, int *info); double in_prod(VEC *a, VEC *b); MAT *sm_mlt(double s, MAT *m1, MAT *out); MAT *ms_mltadd(MAT *m1, MAT *m2, double s, MAT *out); MAT *mmtr_mlt(MAT *m1, MAT *m2, MAT *out); void m_logoutput(MAT *a); void v_logoutput(VEC *x); #endif gstat/src/getest.c0000644000176200001440000004127114646417261013642 0ustar liggesusers/* * getest.c: choose the predicion function at one prediction location */ #include #include #include #include #include #include "defs.h" #include "data.h" #include "utils.h" #include "mapio.h" #include "userio.h" #include "debug.h" #include "vario.h" #include "sem.h" #include "fit.h" #include "glvars.h" #include "mtrx.h" #include "lm.h" #include "gls.h" #include "sim.h" #include "msim.h" #include "block.h" #include "getest.h" static void est_quantile_div(DATA *data, double *est, int div); static void est_skew_kurt(DATA *data, double *est); static double inverse_dist(DATA *data, DPOINT *where, double idPow); static void save_variogram_parameters(VARIOGRAM *v); static void reset_variogram_parameters(VARIOGRAM *v); static double sample_mean(double *list, int n); static double sample_var(double *list, double mean, int n); static double sample_std(double *list, double mean, int n); static double est_quant(double *list, double p, int n); static int CDECL d_cmp(const double *a, const double *b); static double *vgm_pars = NULL; void get_est(DATA **data, METHOD method, DPOINT *where, double *est) { /* * given all data[i]->sel, get_est returns one or more values to *est, * according to the method of calculation set in *method * sel must be not NULL, where contains the location of the estimate * PRE: data, where, est; * USES: several estimation routines. */ DPOINT *block = NULL; VARIOGRAM *v; int i, j, n_vars, n_sel, *is_pt; double *X_ori = NULL, *local_sim; enum GLS_WHAT gls_mode = GLS_BLUP; const double *sim = NULL; /* return value of cond_sim() */ for (i = 0; i < get_n_outputs(); i++) set_mv_double(&est[i]); block = get_block_p(); if (get_mode() == MODE_NSP) ErrMsg(ER_IMPOSVAL, "Getest(): mode not specified"); if (block->x > 0.0 || block->y > 0.0 || block->z > 0.0 || get_data_area()) SET_BLOCK(where); else SET_POINT(where); n_vars = get_n_vars(); if (get_mode() == STRATIFY && (where->u.stratum < 0 || where->u.stratum >= n_vars)) return; local_sim = (double *) emalloc(n_vars * sizeof(double)); is_pt = (int *) emalloc(n_vars * sizeof(int)); for (i = 0; i < n_vars; i++) { set_mv_double(&(local_sim[i])); is_pt[i] = 0; } if (DEBUG_COV) { printlog("we're at location X: %g Y: %g Z: %g\n", where->x, where->y, where->z); if (IS_BLOCK(where)) { if (get_data_area()) printlog("block set in area()\n"); else printlog("block size: dx: %g dy: %g dz: %g\n", block->x, block->y, block->z); } else printlog("zero block size\n"); if (get_mode() == STRATIFY) printlog("stratum: %d\n", where->u.stratum); } switch (method) { case DIV: /* BREAKTHROUGH */ case MED: if (get_mode() == STRATIFY) est_quantile_div(data[where->u.stratum], est, method == DIV); else for (i = 0; i < n_vars; i++) est_quantile_div(data[i], &(est[2*i]), method == DIV); break; case SKEW: if (get_mode() == STRATIFY) est_skew_kurt(data[where->u.stratum], est); else for (i = 0; i < n_vars; i++) est_skew_kurt(data[i], &(est[2*i])); break; case IDW: if (gl_idp < 0.0) ErrMsg(ER_RANGE, "idp must be non-negative"); if (get_mode() == STRATIFY) { if (data[where->u.stratum]->n_sel > 0) est[0] = inverse_dist(data[where->u.stratum], where, gl_idp); } else { for (i = 0; i < n_vars; i++) if (data[i]->n_sel > 0) est[2 * i] = inverse_dist(data[i], where, gl_idp); } break; case LSLM: if (n_variograms_set()) { switch(get_mode()) { case SIMPLE: X_ori = where->X; /* remember... */ for (i = 0; i < n_vars; i++) { if (data[i]->n_sel > 0) gls(&data[i], 1, GLS_BLUE, where, &(est[2 * i])); where->X += data[i]->n_X; } where->X = X_ori; /* and put back */ break; case STRATIFY: X_ori = where->X; /* remember... */ for (i = 0; i < where->u.stratum; i++) where->X += data[i]->n_X; if (data[where->u.stratum]->n_sel > 0) { where->X += where->u.stratum; /* strictly unnecessary */ gls(&data[where->u.stratum], 1, GLS_BLUE, where, est); } where->X = X_ori; /* and put back */ break; case MULTIVARIABLE: gls(data, n_vars, GLS_BLUE, where, est); break; default: ErrMsg(ER_IMPOSVAL, "Getest(): wrong mode"); break; } } else { switch(get_mode()) { case STRATIFY: X_ori = where->X; /* remember... */ for (i = 0; i < where->u.stratum; i++) where->X += data[i]->n_X; if (data[where->u.stratum]->n_sel > 0) pred_lm(&data[where->u.stratum], 1, where, est); where->X = X_ori; /* and put back */ break; case MULTIVARIABLE: pred_lm(data, n_vars, where, est); break; case SIMPLE: X_ori = where->X; /* remember... */ for (i = 0; i < n_vars; i++) { if (data[i]->n_sel > 0) { pred_lm(&data[i], 1, where, &(est[2*i])); where->X += data[i]->n_X; } } where->X = X_ori; /* and put back */ break; default: ErrMsg(ER_IMPOSVAL, "Getest(): wrong mode"); break; } } /* else */ break; case SKR: /* BREAK THROUGH (SK handled in gls()) */ case OKR: /* BREAK THROUGH: (OK is special case of UK) */ case UKR: if (method == SKR) gls_mode = GLS_BLP; else gls_mode = GLS_BLUP; switch (get_mode()) { case SIMPLE: X_ori = where->X; /* remember... */ for (i = 0; i < n_vars; i++) { gls(&data[i], 1, gls_mode, where, &(est[2 * i])); where->X += data[i]->n_X; } where->X = X_ori; /* and put back */ break; case STRATIFY: X_ori = where->X; /* remember... */ for (i = 0; i < where->u.stratum; i++) where->X += data[i]->n_X; gls(&data[where->u.stratum], 1, gls_mode, where, est); where->X = X_ori; /* and put back */ break; case MULTIVARIABLE: gls(data, n_vars, gls_mode, where, est); break; default: ErrMsg(ER_IMPOSVAL, "Getest(): wrong mode"); break; } if (gl_order) /* order relation violations: */ correct_orv(est, n_vars, gl_order); break; case GSI: /* BREAK TRHOUGH: */ case ISI: switch (get_mode()) { case SIMPLE: /* estimates go to est[0+1],est[2+3],... */ X_ori = where->X; /* remember... */ for (i = 0; i < gl_nsim; i++) { restore_data_sel(data, i, n_vars); set_beta(data, i, n_vars, method); for (j = 0; j < n_vars; j++) { /* estimate or update: */ if (i == 0) /* estimate */ gls(&data[j], 1, data[j]->n_sel < gl_n_uk ? GLS_BLP : GLS_BLUP, where, &(est[2*j])); else /* update */ gls(&data[j], 1, UPDATE, where, &(est[2*j])); /* new simulation: */ if (gl_order <= 1) { sim = cond_sim(&(est[2*j]), 1, method, &(is_pt[j]), gl_order); /* put data from simulation i; */ local_sim[j] = sim[0]; } where->X += data[j]->n_X; } where->X = X_ori; /* reset */ if (gl_order > 1) { /* 2,3 if pdf, 4 if cdf: */ sim = cond_sim(est, n_vars, method, is_pt, gl_order); for (j = 0; j < n_vars; j++) local_sim[j] = sim[j]; } save_sim(data, where, i, n_vars, local_sim, is_pt); } X_ori = where->X; /* remember... */ for (i = 0; i < n_vars; i++) { if (! is_pt[i]) { where->attr = est[2 * i] = local_sim[i]; /* last simulation */ push_point(data[i], where); } else data[i]->nsim_at_data++; where->X += data[i]->n_X; } where->X = X_ori; /* reset */ break; case STRATIFY: /* estimate goes to est[0] and est[1] */ X_ori = where->X; /* remember... */ for (i = 0; i < where->u.stratum; i++) where->X += data[i]->n_X; for (i = 0; i < gl_nsim; i++) { /* load data from simulation i; */ restore_data_sel(&data[where->u.stratum], i, 0); set_beta(&data[where->u.stratum], i, 0, method); if (i == 0) /* estimate: */ gls(&data[where->u.stratum], 1, data[where->u.stratum]->n_sel < gl_n_uk ? GLS_BLP : GLS_BLUP, where, est); else /* update */ gls(&data[where->u.stratum], 1, UPDATE, where, est); sim = cond_sim(est, 1, method, is_pt, gl_order); /* save data from simulation i; */ save_sim_strat(data[where->u.stratum], where, i, sim[0], is_pt[0]); } /* store & push */ if (! is_pt[0]) { where->attr = est[0] = sim[0]; /* last simulation */ push_point(data[where->u.stratum], where); } else data[where->u.stratum]->nsim_at_data++; where->X = X_ori; /* and put back */ break; case MULTIVARIABLE: for (i = 0, n_sel = 0; i < n_vars; i++) n_sel += data[i]->n_sel; if (n_sel < gl_n_uk) gls_mode = GLS_BLP; else gls_mode = GLS_BLUP; for (i = 0; i < gl_nsim; i++) { /* load data from simulation i; */ restore_data_sel(data, i, n_vars); set_beta(data, i, n_vars, method); /* estimate or update: */ if (i == 0) gls(data, n_vars, gls_mode, where, est); else gls(data, n_vars, UPDATE, where, est); /* new simulation: */ sim = cond_sim(est, n_vars, method, is_pt, gl_order); /* put data from simulation i; */ save_sim(data, where, i, n_vars, sim, is_pt); } X_ori = where->X; /* remember... */ for (i = 0; i < n_vars; i++) { if (! is_pt[i]) { est[2 * i] = where->attr = sim[i]; /* last simulation */ push_point(data[i], where); } else data[i]->nsim_at_data++; where->X += data[i]->n_X; } where->X = X_ori; /* and put back */ break; default: ErrMsg(ER_IMPOSVAL, "Getest(): wrong mode"); break; } /* switch (get_mode()) */ for (i = 0; i < n_vars; i++) set_mv_double(&(est[2 * i + 1])); for (i = 2 * n_vars; i < get_n_outputs(); i++) set_mv_double(&(est[i])); /* print_sim(); */ break; case NRS: if (get_mode() != STRATIFY) { for (i = 0; i < n_vars; i++) { est[2 * i] = (double) data[i]->n_sel; est[2 * i + 1] = (double) data[i]->oct_filled; } } else { est[0] = (double) data[where->u.stratum]->n_sel; est[1] = (double) data[where->u.stratum]->oct_filled; } break; case SPREAD: if (get_mode() == STRATIFY) { if (data[where->u.stratum]->n_sel > 0) { if (data[where->u.stratum]->what_is_u != U_ISDIST) ErrMsg(ER_IMPOSVAL, "getest() needs distances"); n_sel = data[where->u.stratum]->n_sel; est[0] = sqrt(data[where->u.stratum]->sel[0]->u.dist2); est[1] = sqrt(data[where->u.stratum]->sel[n_sel - 1]->u.dist2); } } else { for (i = 0; i < n_vars; i++) { if (data[i]->n_sel > 0) { if (data[i]->what_is_u != U_ISDIST) ErrMsg(ER_IMPOSVAL, "getest() needs distances"); n_sel = data[i]->n_sel; est[2 * i] = sqrt(data[i]->sel[0]->u.dist2); est[2 * i + 1] = sqrt(data[i]->sel[n_sel - 1]->u.dist2); } } } break; case LSEM: v = get_vgm(LTI(0,0)); assert(v); v->id1 = v->id2 = v->id = 0; v->ev->evt = SEMIVARIOGRAM; if (data[0]->is_residual == 0) data[0]->is_residual = 1; /* !! */ v->ev->recalc = 1; calc_variogram(v, NULL); if (gl_fit) { v->ev->refit = 1; v->ev->fit = gl_fit; save_variogram_parameters(v); fit_variogram(v); /* write back locally fitted variogram model parameters: */ for (i = j = 0; i < MIN(get_n_vars(), v->n_models); i++) { est[2 * i + 0] = v->part[i].sill; est[2 * i + 1] = v->part[i].range[0]; j += 2; } if (j < get_n_vars()) est[j] = 1.0 * v->fit_is_singular; reset_variogram_parameters(v); update_variogram(v); /* not sure if this is needed */ } else { /* write back locally estimated sample variogram values: */ for (i = 0; i < MIN(get_n_vars(), v->ev->n_est); i++) { est[2 * i + 0] = v->ev->gamma[i]; est[2 * i + 1] = 1.0 * v->ev->nh[i]; } } break; case NSP: /* FALLTHROUGH: */ default: ErrMsg(ER_IMPOSVAL, "getest(): method not specified"); } /* switch */ efree(local_sim); efree(is_pt); return; } static void est_quantile_div(DATA *data, double *est, int div) { static double *list = NULL; static int i, size = 0; double mod = -9999.0; int n, run, longest_run = 0; if (data->n_sel > size) list = (double *) erealloc(list, (size = data->n_sel) * sizeof(double)); for (i = 0; i < data->n_sel; i++) list[i] = data->sel[i]->attr; qsort(list, (size_t) data->n_sel, sizeof(double), (int CDECL (*)(const void *, const void *)) d_cmp); if (div) { /* get diversity and modus in sel: */ n = data->n_sel; for (i = 0; i < data->n_sel - 2; i += run) { run = 1; while (i + run < data->n_sel && list[i] == list[i + run]) { run++; n--; } if (run > longest_run) { longest_run = run; mod = list[i]; } } est[0] = 1.0 * n; est[1] = mod; } else { if (data->n_sel < 2) return; if (gl_quantile == 0.5) est[0] = est[1] = est_quant(list, gl_quantile, data->n_sel); else { est[0] = est_quant(list, gl_quantile, data->n_sel); est[1] = est_quant(list, 1.0 - gl_quantile, data->n_sel); } } return; } static void est_skew_kurt(DATA *data, double *est) { static double *list = NULL; double mean, std, skewness = 0.0, kurtosis = 0.0, d; static int i, size = 0; if (data->n_sel <= 1) /* need at least 2 for variance */ return; if (data->n_sel > size) list = (double *) erealloc(list, (size = data->n_sel) * sizeof(double)); for (i = 0; i < data->n_sel; i++) list[i] = data->sel[i]->attr; mean = sample_mean(list, data->n_sel); std = sample_std(list, mean, data->n_sel); for (i = 0; i < data->n_sel; i++) { d = (data->sel[i]->attr - mean)/std; skewness += pow(d, 3.0); kurtosis += pow(d, 4.0); } est[0] = skewness/data->n_sel; est[1] = kurtosis/data->n_sel; } static double inverse_dist(DATA *data, DPOINT *where, double idPow) { int i, j; double sumweights, sumvals, value, weight, dist2; static DATA *blockd = NULL; if (data->n_sel <= 0) ErrMsg(ER_IMPOSVAL, "zero neighbourhood in inverse_dist()"); if (data->n_sel == 1) return data->sel[0]->attr; blockd = block_discr(blockd, get_block_p(), where); for (i = 0, value = 0.0; i < blockd->n_list; i++) { for (j = 0, sumweights = sumvals = 0.0; j < data->n_sel; j++) { dist2 = data->pp_norm2(data->sel[j], blockd->list[i]); if (dist2 == 0.0) { sumvals = data->sel[j]->attr; sumweights = 1.0; j = data->n_sel; /* break j loop */ } else { if (idPow == 2.0) weight = 1.0 / dist2; else weight = pow(dist2, -0.5 * idPow); sumweights += weight; sumvals += weight * data->sel[j]->attr; } } value += blockd->list[i]->u.weight * sumvals/sumweights; } return value; } void save_variogram_parameters(VARIOGRAM *v) { int i; if (vgm_pars == NULL) vgm_pars = (double *) emalloc(3 * v->n_models * sizeof(double)); for (i = 0; i < v->n_models; i++) { vgm_pars[3 * i + 0] = v->part[i].sill; vgm_pars[3 * i + 1] = v->part[i].range[0]; vgm_pars[3 * i + 2] = v->part[i].range[1]; } } void reset_variogram_parameters(VARIOGRAM *v) { int i; for (i = 0; i < v->n_models; i++) { v->part[i].sill = vgm_pars[3 * i + 0]; v->part[i].range[0] = vgm_pars[3 * i + 1]; v->part[i].range[1] = vgm_pars[3 * i + 2]; } v->fit_is_singular = 0; } static double sample_mean(double *list, int n) { int i; double mn = 0.0; if (list == NULL) ErrMsg(ER_NULL, "sample_mean()"); if (n == 0) ErrMsg(ER_RANGE, "sample_mean(): no values"); for (i = 0; i < n; i++) mn += list[i]; return mn/(1.0 * n); } static double sample_var(double *list, double mean, int n) { int i; double var = 0.0; if (list == NULL) ErrMsg(ER_NULL, "sample_var()"); if (n <= 1 || list == NULL) ErrMsg(ER_RANGE, "sample_var(): <= 1 values"); for (i = 0; i < n; i++) var += SQR(list[i] - mean); return (var / (n - 1.0)); } static double sample_std(double *list, double mean, int n) { return sqrt(sample_var(list, mean, n)); } static double est_quant(double *list, double p, int n) { /* * function returns the value of the p-th quantile * of the ordered list *list, row exists from list[0]..list[length-1], * p is in [0..1]; * a missing value is generated when the quantile lies not within * the valid data range, and is undetermined therefore */ double order, where; int below, above; if (n < 2) ErrMsg(ER_RANGE, "est_quant(): < 2 obs."); if (p < 0.0 || p > 1.0) ErrMsg(ER_RANGE, "can't calculate quantile outside [0,1]"); order = p * (n - 1); /* order = n * (p * n)/(n + 1); */ below = (int) floor(order); /* the index below order */ if (below < 0) return list[0]; above = below + 1; /* the index above order */ if (above >= n) return list[n - 1]; where = order - below; return (1 - where) * list[below] + where * list[above]; } int CDECL d_cmp(const double *a, const double *b) { if (*a < *b) return -1; if (*a > *b) return 1; return 0; } gstat/src/glvars.c0000644000176200001440000006025714646417261013652 0ustar liggesusers/* * glvars.c: has global variables, choose defaults, check setting integrity */ #include #include #include #include #include "defs.h" #include "userio.h" #include "debug.h" #include "data.h" #include "utils.h" #include "vario.h" #include "defaults.h" /* default values for gl_* variables */ #include "glvars.h" #include "gls.h" #include "block.h" /* * this module contains all global variables, along with some * routines for initialisation (of structures), resizing during runtime, * checks after reading command file and before starting real calculations, * obtaining some "local" global structures, printing all that's held, * and so on. get_n_vars() etc. are for clarity that these variables are not * changed outside the area where they're set. */ static void init_gstat_data(int n); static void clean_up(void); /* * global variables (glvars.h, defautls.h): */ int debug_level; /* debug level */ int gl_blas; int gl_choleski; /* do choleski instead of LDL? */ int gl_coincide; /* do the variable locations coincide? */ int gl_cressie; /* use cressie's estimator ? */ int gl_fit; /* do not fit a variogram */ int gl_gauss; /* gaussian quadr. block covariances ? */ int gl_iter; /* max. n. iter for mivque estimates */ int gl_jgraph; /* do jgraph plot in batch mode ? */ int gl_lhs; /* apply Latin hypercube sampling to Gaussian simulations */ int gl_longlat; /* indicates whether coordinates are longitude/latitude, or Euclidian */ int gl_nblockdiscr; /* block discrimination in each dimension */ int gl_n_intervals; /* n variogram intervals */ int gl_n_marginals; /* the n marginal distributions */ int gl_nsim; /* number of simultanious simulations */ int gl_n_uk; /* min. # of cs points to use ok */ int gl_numbers; /* plot numbers on variogram plot? */ int gl_nocheck; /* do not check LMC/IC ? */ int gl_order; /* do order relation correction */ int gl_plotweights; /* plot kriging weights? */ int gl_register_pairs; /* register sample variogram pairs? */ int gl_rowwise; /* deal with raster maps row-wise, or as complete blocks? */ int gl_rp; /* follow random path for gs/is? */ int gl_seed; /* seed is set? */ int gl_sim_beta; /* simulation mode for beta: 0 multiv GLS, 1 univ GLS, 2 OLS */ int gl_spiral; /* do spiral search if possible? */ int gl_split; /* see nsearch.c: was Q_SPLIT_AT */ int gl_sym_ev; /* default symmetric ps.cr.v./cr.cv. ? */ int gl_gls_residuals; /* calc. gls residuals? */ int gl_sparse; /* use sparse covariance matrices? */ int gl_xvalid; /* do cross validation on first variable */ int gl_zero_est; /* est. variogram at h 0 seperately? */ double *gl_bounds; /* boundaries semivariogram intervals */ double gl_cutoff; /* variogram cutoff */ double gl_fit_limit; /* convergence criterion on fit */ double gl_fraction; /* fraction of max dist for cutoff */ double gl_idp; /* default inverse distance power */ double gl_iwidth; /* variogram class width */ double gl_quantile; /* sample quantile */ double gl_zmap; /* height of the map */ double gl_alpha; /* alpha, beta, tol_[hor|ver]: anisotropy parameters */ double gl_beta; double gl_tol_hor; double gl_tol_ver; double gl_zero; /* zero tolerance; 2-squared */ const METHODS methods[] = { /* methods and codes */ { NSP, 0, "nsp" }, /* do nothing */ { UIF, 0, "ui" }, /* variogram modelling user interface */ { OKR, 0, "ok" }, /* ordinary kriging */ { UKR, 0, "uk" }, /* universal kriging */ { SKR, 0, "sk" }, /* simple kriging */ { IDW, 0, "id" }, /* inverse distance interpolation */ { MED, 0, "med" }, /* (local) sample median or quantiles */ { NRS, 0, "n$r" }, /* neighbourhood size */ { LSLM, 0, "tr$end" }, /* uncorrelated (or weighted) linear model */ { GSI, 1, "gs" }, /* gaussian (conditional) simulation */ { ISI, 1, "is" }, /* indicator (conditional) simulation */ { SEM, 0, "se$mivariogram" }, /* sample (cross) semivariance */ { COV, 0, "co$variogram" }, /* sample (cross) covariance */ { SPREAD, 0, "di$stance" }, /* distance to nearest sample */ { DIV, 0, "div" }, /* diversity and modus */ { SKEW, 0, "skew" }, /* skewness and kurtosis */ { LSEM, 0, "lsem" }, /* locally estimated/fitted variogram parameters */ { TEST, 0, "test" }, /* do-nothing? */ { NSP, 0, NULL } /* terminating field */ }; /* * "local" database, accesible through get_* functions */ static VARIOGRAM **vgm = NULL; static DATA **data = NULL; static char **outfile_names = NULL, **ids = NULL; static DATA *valdata = NULL; static DATA *data_area = NULL; /* area that discretises block */ static DPOINT block; static METHOD method = NSP; static int n_vars = 0; static int n_last = 0, n_v_last = 0, n_o_last = 0; static MODE mode = MODE_NSP; /* MODE_NSP, SIMPLE, STRATIFY or MULTIVARIABLE */ int init_global_variables(void) { /* * global variables init. (glvars.h; defautls.h): */ method = NSP; mode = MODE_NSP; debug_level = DB_NORMAL; gl_blas = DEF_blas; gl_choleski = DEF_choleski; gl_coincide = DEF_coincide; gl_cressie = DEF_cressie; gl_fit = DEF_fit; gl_gauss = DEF_gauss; gl_iter = DEF_iter; gl_jgraph = DEF_jgraph; gl_lhs = DEF_lhs; gl_longlat = DEF_longlat; gl_nblockdiscr = DEF_nblockdiscr; gl_n_intervals = DEF_intervals; gl_n_marginals = DEF_n_marginals; gl_nsim = DEF_nsim; gl_n_uk = DEF_n_uk; gl_numbers = DEF_numbers; gl_nocheck = DEF_nocheck; gl_order = DEF_order; gl_register_pairs = DEF_pairs; gl_rowwise = DEF_rowwise; gl_rp = DEF_rp; gl_seed = DEF_seed; gl_sim_beta = DEF_sim_beta; gl_spiral = DEF_spiral; gl_split = DEF_split; gl_sym_ev = DEF_sym_ev; gl_gls_residuals = DEF_gls_residuals; gl_sparse = DEF_sparse; gl_xvalid = DEF_xvalid; gl_zero_est = DEF_zero_est; gl_bounds = DEF_bounds; gl_cutoff = DEF_cutoff; gl_fit_limit = DEF_fit_limit; gl_fraction = DEF_fraction; gl_idp = DEF_idp; gl_iwidth = DEF_iwidth; gl_quantile = DEF_quantile; gl_zmap = DEF_zmap; gl_alpha = DEF_alpha; gl_beta = DEF_beta; gl_tol_hor = DEF_tol_hor; gl_tol_ver = DEF_tol_ver; gl_zero = DEF_zero; init_gstat_data(0); /* EJPXX * if (valdata == NULL) * */ valdata = init_one_data(valdata); block.x = block.y = block.z = 0.0; set_mv_double(&gl_zmap); get_covariance(NULL, 0, 0, 0); return 0; } void push_bound(double value) { static int n_bound; if (gl_bounds == NULL) { n_bound = 0; gl_bounds = (double *) emalloc((n_bound+2) * sizeof(double)); } else gl_bounds = (double *) erealloc(gl_bounds,(n_bound+2) * sizeof(double)); gl_bounds[n_bound] = value; gl_bounds[n_bound + 1] = -1.0; if (n_bound > 0 && gl_bounds[n_bound] <= gl_bounds[n_bound-1]) ErrMsg(ER_IMPOSVAL, "bounds must be strictly increasing"); n_bound++; } int n_variograms_set(void) { int i, n; for (i = 0, n = 0; i < get_n_vgms(); i++) if (vgm[i] != NULL && vgm[i]->id >= 0) n++; return n; } static void init_gstat_data(int n) { int i, n_vgms, n_outfl; n_vgms = (n * (n + 1))/2; n_outfl = n + n_vgms; if (n <= n_last) return; data = (DATA **) erealloc(data, n * sizeof(DATA *)); for (i = n_last; i < n; i++) data[i] = init_one_data(NULL); vgm = (VARIOGRAM **) erealloc(vgm, n_vgms * sizeof(VARIOGRAM *)); for (i = n_v_last; i < n_vgms; i++) vgm[i] = NULL; outfile_names = (char **) erealloc (outfile_names, n_outfl * sizeof(char *)); for (i = n_o_last; i < n_outfl; i++) outfile_names[i] = NULL; n_last = n; n_o_last = n_outfl; n_v_last = n_vgms; n_vars = n; return; } int which_identifier(const char *id) { assert(id); for (int i = 0; i < n_vars; i++) { if (ids[i] == NULL) ErrMsg(ER_IMPOSVAL, "which_identifier(): ids[i] == NULL"); if (strcmp(ids[i], id) == 0) return i; } /* else: extend data space */ n_vars++; ids = (char **) erealloc(ids, n_vars * sizeof(char *)); int Length = strlen(id) + 1; ids[n_vars - 1] = (char *) emalloc(Length * sizeof(char)); snprintf(ids[n_vars - 1], Length, "%s", id); init_gstat_data(n_vars); return n_vars - 1; } const char *name_identifier(int i) { static const char *cp_val = "data()", *cp_area = "area"; switch (i) { case ID_OF_VALDATA: return cp_val; case ID_OF_AREA: return cp_area; default: if (i >= get_n_vars() || i < 0) { pr_warning("i = %d", i); ErrMsg(ER_RANGE, "name_identifier(i): i outside range"); } return ids[i]; } } const char *method_string(METHOD i) { #define MSTR_SIZE 100 static char mstr[MSTR_SIZE]; char *str, *co, *un, *gsum = ""; if ((i == ISI || i == GSI) && gl_n_uk == DEF_n_uk && get_n_beta_set() != get_n_vars()) gsum = " with unknown means"; str = (get_mode() == STRATIFY ? "stratified " : ""); un = (get_n_vars() > 0 && data[0]->dummy ? "un" : ""); co = (get_mode() == MULTIVARIABLE ? "co" : ""); switch (i) { case NSP: snprintf(mstr, MSTR_SIZE, "exit"); break; case TEST: snprintf(mstr, MSTR_SIZE, "Test Option"); break; case UIF: snprintf(mstr, MSTR_SIZE, "starting interactive mode"); break; case SEM: snprintf(mstr, MSTR_SIZE, "calculating sample variogram"); break; case COV: snprintf(mstr, MSTR_SIZE, "calculating sample covariogram"); break; case SPREAD: snprintf(mstr, MSTR_SIZE, "spread value (distance to nearest observation) on output"); break; case IDW: snprintf(mstr, MSTR_SIZE, "%sinverse distance weighted interpolation", str); break; case MED: if (gl_quantile == 0.5) snprintf(mstr, MSTR_SIZE, "%smedian estimation", str); else snprintf(mstr, MSTR_SIZE, "%s%g-quantile estimation", str, gl_quantile); break; case NRS: snprintf(mstr, MSTR_SIZE, "(%s:) neighbourhood size on first output variable", str); break; case LSLM: if (n_variograms_set()) snprintf(mstr, MSTR_SIZE, "%sgeneralized least squares trend estimation", str); else snprintf(mstr, MSTR_SIZE, "%sordinary or weighted least squares prediction", str); break; case OKR: snprintf(mstr, MSTR_SIZE, "using %sordinary %skriging", str, co); break; case SKR: snprintf(mstr, MSTR_SIZE, "using %ssimple %skriging", str, co); break; case UKR: snprintf(mstr, MSTR_SIZE, "using %suniversal %skriging", str, co); break; case GSI: snprintf(mstr, MSTR_SIZE, "using %s%sconditional Gaussian %ssimulation%s", str, un, co, gsum); break; case ISI: snprintf(mstr, MSTR_SIZE, "using %s%sconditional indicator %ssimulation", str, un, co); break; case DIV: snprintf(mstr, MSTR_SIZE, "within-neighbourhood diversity and modus"); break; case SKEW: snprintf(mstr, MSTR_SIZE, "skewness and kurtosis"); break; case LSEM: snprintf(mstr, MSTR_SIZE, "local semivariance or locally fitted semivariogram parameters"); break; } return mstr; } int get_n_vars(void) { return n_vars; } int get_n_beta_set(void) { int i, nbeta; for (i = nbeta = 0; i < get_n_vars(); i++) if (data[i]->beta != NULL) nbeta++; return nbeta; } MODE get_mode(void) { return mode; } int get_n_vgms(void) { int n; n = get_n_vars(); return (n * (n + 1))/2; } int get_n_outputs(void) { return get_n_vars() + get_n_vgms(); } const char **get_outfile_name(void) { return (const char **) outfile_names; } VARIOGRAM *get_vgm(int i) { assert(i < get_n_vgms()); assert(i >= 0); if (vgm[i] == NULL) vgm[i] = init_variogram(NULL); return vgm[i]; } DATA **get_gstat_data(void) { return data; } DATA *get_dataval(void) { return valdata; } DATA *get_data_area(void) { return data_area; } DATA *create_data_area(void) { data_area = init_one_data(NULL); return data_area; } DPOINT *get_block_p(void) { return █ } METHOD get_method(void) { return method; } void set_method(METHOD m) { method = m; return; } int is_simulation(METHOD m) { assert(methods[m].m == m); return methods[m].is_simulation; } double max_block_dimension(int reset) { static double dim = -1.0; if (reset) dim = -1.0; if (dim < 0.0) { if (data_area != NULL) dim = data_block_diagonal(data_area); else dim = sqrt(SQR(block.x)+SQR(block.y)+SQR(block.z)); } return dim; } void setup_valdata_X(DATA *d) { /* * fills '0'-X columns (intercept) at the right place * e.g. data(a): .. X=1&2;data(b): .. X=3&4; data(): .. X=1&2&3&4; * this leads to "0 1 2 3 4" for colX, but should be "0 1 2 0 3 4"; */ int i = 0, j = 0, n_d, n_all; /* * # positive X's in all variables should equal # positive X's in this */ for (i = 0, n_all = 0; i < get_n_vars(); i++) for (j = 0; j < data[i]->n_X; j++) if (data[i]->colX[j] > 0) n_all++; for (i = 0, n_d = 0; i < d->n_X; i++) if (d->colX[i] > 0) n_d++; if (n_all != n_d) { pr_warning( "nr of X's in data: (%d) should match X's in other data(...) (%d)", n_d, n_all); ErrMsg(ER_IMPOSVAL, "X column definition mismatch"); } /* * now correct for 0's */ for (i = 0, n_all = 0; i < get_n_vars(); i++) n_all += data[i]->n_X; if (n_all == d->n_X) return; /* we're done */ n_d = d->n_X; d->n_X = n_all; d->colX = (int *) realloc(d->colX, d->n_X * sizeof(int)); /* fill backwards */ for (i = get_n_vars() - 1; i >= 0; i--) { for (j = data[i]->n_X - 1; j >= 0; j--) { n_all--; /* position of current X in d */ if (data[i]->colX[j] <= 0) /* intercept, x, xy, x2, etc. */ d->colX[n_all] = data[i]->colX[j]; else { n_d--; if (n_d < 0) ErrMsg(ER_IMPOSVAL, "setup_X(): n_d < 0"); if (d->colX[n_d] == 0) ErrMsg(ER_IMPOSVAL, "setup_X(): zero error"); d->colX[n_all] = d->colX[n_d]; } if (n_all < 0) ErrMsg(ER_IMPOSVAL, "setup_X(): n_all < 0"); } } return; } METHOD get_default_method(void) { int i, Xset, Vgm_set; /* * no no prediction locations or no data: */ if (get_n_vars() == 0) return NSP; if (valdata->id < 0 && gl_xvalid == 0 && data_area == NULL) { return UIF; } /* * check on X variables */ for (i = Xset = 0; i < get_n_vars(); i++) if (!(data[i]->n_X == 1 && data[i]->colX[0] == 0)) Xset++; /* * check on variograms */ for (i = 0, Vgm_set = 0; i < get_n_vars(); i++) if (vgm[LTI(i,i)] != NULL && (vgm[LTI(i,i)]->n_models > 0 || vgm[LTI(i,i)]->table != NULL)) /* was: ->id >= 0*/ Vgm_set++; if (!(Vgm_set == 0 || Vgm_set == get_n_vars())) ErrMsg(ER_SYNTAX, "set either all or no variograms"); if (Vgm_set > 0) { if (get_n_beta_set() > 0) return SKR; else return (Xset > 0 ? UKR : OKR); } else return (Xset > 0 ? LSLM : IDW); } void set_mode(void) { int i, j, check_failed = 0; if (method == NSP) return; /* * simple, univariate: */ if (get_n_vars() <= 1) { mode = SIMPLE; return; } /* * (get_n_vars() > 1): * multivariable prediction if all cross variograms set parameters merge */ for (i = check_failed = 0; i < get_n_vars(); i++) for (j = 0; j < i; j++) if (vgm[LTI(i,j)] == NULL || vgm[LTI(i,j)]->id < 0) check_failed = 1; if (check_failed == 0) { mode = MULTIVARIABLE; return; } if (n_variograms_set() == 0) { for (i = 0; i < get_n_vars(); i++) if (data[i]->n_merge > 0) { mode = MULTIVARIABLE; return; } } /* * stratify? ONLY if: * 0. get_n_vars() > 1; no cross variograms set ==>> has been checked. * 1. no pred(): or var(): except for first variable; * 2. No masks and valdata->what_is_u == U_ISSTRATUM * 3. mask is a valid strata map, n categories > 1 */ mode = (valdata->what_is_u == U_ISSTRATUM) ? STRATIFY : SIMPLE; return; } int decide_on_coincide(void) { int i, j; if (get_n_vars() <= 1) return 0; if (get_mode() == STRATIFY) return 0; /* data may coincide, but prediction locations won't */ for (i = 1; i < get_n_vars(); i++) { if (data[i]->n_list != data[0]->n_list || data[i]->colnx != data[0]->colnx || data[i]->colny != data[0]->colny || data[i]->colnz != data[0]->colnz || data[i]->sel_min != data[0]->sel_min || data[i]->sel_max != data[0]->sel_max || data[i]->force != data[0]->force || data[i]->sel_rad != data[0]->sel_rad) return 0; /* don't check filename: 'file.dat' and './file.dat' */ /* * Consider the data file * 1 2 NA 3 * 2 3 4 NA * with x=1, y=2, v=3 (for var 1), v=4 (for var 2). * This is only distinguishable by doing it the ``hard way'': */ for (j = 0; j < data[0]->n_list; j++) { if (data[0]->list[j]->x != data[i]->list[j]->x || data[0]->list[j]->y != data[i]->list[j]->y || data[0]->list[j]->z != data[i]->list[j]->z) return 0; } } if (DEBUG_DUMP) printlog("(identical search conditions found for all variables)\n"); return 1; } void check_global_variables(void) { /* * Purpose : check internal variable consistency, add some parameters * Created by : Edzer J. Pebesma * Date : april 13, 1992 * Prerequisites : none * Returns : - * Side effects : none * also check Cauchy-Schwartz unequality on cross/variograms. */ int i, j, n_merge = 0; METHOD m; VARIOGRAM *v_tmp; /* UK: check if n_masks equals total nr of unbiasedness cond. */ if (gl_nblockdiscr < 2) ErrMsg(ER_RANGE, "nblockdiscr must be >= 2"); if (method == SPREAD) { for (i = 0; i < get_n_vars(); i++) if (data[i]->sel_rad == DBL_MAX) data[i]->sel_rad *= 0.99; /* force distance calculation */ } if (get_n_beta_set() != 0 && get_n_beta_set() != get_n_vars()) ErrMsg(ER_SYNTAX, "set sk_mean or beta either for all or for no variables"); if (!(method == ISI || method == GSI)) { if (gl_nsim > 1) ErrMsg(ER_IMPOSVAL, "nsim only allowed for simulation"); } if (method == ISI && max_block_dimension(0) > 0.0) ErrMsg(ER_IMPOSVAL, "indicator simulation only for points"); /* * check if both block and area are set */ if (data_area != NULL && (block.x > 0.0 || block.y > 0.0 || block.z > 0.0)) ErrMsg(ER_IMPOSVAL, "both block and area set: choose one"); /* * check for equality of coordinate dimensions: */ for (i = 1; i < get_n_vars(); i++) { if ((data[i]->mode & V_BIT_SET) != (data[0]->mode & V_BIT_SET)) { message("data(%s) and data(%s):\n", name_identifier(0), name_identifier(i)); ErrMsg(ER_IMPOSVAL, "data have different coordinate dimensions"); } } if (valdata->id > 0 && data[0]->dummy == 0 && ((data[0]->mode | (V_BIT_SET | S_BIT_SET)) != (valdata->mode | (V_BIT_SET | S_BIT_SET)))) { message("data() and data(%s):\n", name_identifier(0)); ErrMsg(ER_IMPOSVAL, "data have different coordinate dimensions"); for (i = 0; i < get_n_vars(); i++) { if (data[i]->dummy) { data[i]->mode = (valdata->mode | V_BIT_SET); data[i]->minX = valdata->minX; data[i]->minY = valdata->minY; data[i]->minZ = valdata->minZ; data[i]->maxX = valdata->maxX; data[i]->maxY = valdata->maxY; data[i]->maxZ = valdata->maxZ; set_norm_fns(data[i]); } } } for (i = 0; i < get_n_vars(); i++) { if (data[i]->fname == NULL && !data[i]->dummy) { message("file name for data(%s) not set\n", name_identifier(i)); ErrMsg(ER_NULL, " "); } if (data[i]->id < 0) { message("data(%s) not set\n", name_identifier(i)); ErrMsg(ER_NULL, " "); } if (data[i]->beta && data[i]->beta->size != data[i]->n_X) { pr_warning("beta dimension (%d) should equal n_X (%d)", data[i]->beta->size, data[i]->n_X); ErrMsg(ER_IMPOSVAL, "sizes of beta and X don't match"); } if (data[i]->sel_rad == DBL_MAX && data[i]->oct_max > 0) ErrMsg(ER_IMPOSVAL, "define maximum search radius (rad) for octant search"); if (data[i]->vdist && data[i]->sel_rad == DBL_MAX) ErrMsg(ER_IMPOSVAL, "when using vdist, radius should be set"); if (! data[i]->dummy && ! (data[i]->mode & V_BIT_SET)) { message("no v attribute set for data(%s)\n", name_identifier(data[i]->id)); ErrMsg(ER_NULL, " "); } if (method != SEM && method != COV) { /* check neighbourhood settings */ if (data[i]->sel_rad < 0.0 || data[i]->sel_min < 0 || data[i]->sel_max < 0 || (data[i]->sel_min > data[i]->sel_max)) { message( "invalid neighbourhood selection: radius %g max %d min %d\n", data[i]->sel_rad, data[i]->sel_max, data[i]->sel_min); ErrMsg(ER_IMPOSVAL, " "); } } if (data[i]->id > -1 && (method == OKR || method == SKR || is_simulation(method) || method == UKR)) { if (vgm[LTI(i,i)] == NULL || vgm[LTI(i,i)]->id < 0) { message("variogram(%s) not set\n", name_identifier(i)); ErrMsg(ER_VARNOTSET, "variogram()"); } } n_merge += data[i]->n_merge; } if (n_merge && get_mode() != MULTIVARIABLE) ErrMsg(ER_IMPOSVAL, "merge only works in multivariable mode"); if (mode == SIMPLE && get_method() != UIF) { /* check if it's clean: */ for (i = 0; i < get_n_vars(); i++) for (j = 0; j < i; j++) if (vgm[LTI(i,j)] != NULL && vgm[LTI(i,j)]->id > 0) { message("variogram(%s, %s) %s\n", name_identifier(i), name_identifier(j), "can only be set for ck, cs, uk, sk, ok, sem or cov"); ErrMsg(ER_IMPOSVAL, "variogram()"); } } if ((m = get_default_method()) != get_method()) { if (m == UKR && (get_method() == OKR || get_method() == SKR)) ErrMsg(ER_IMPOSVAL, "\nremove X=... settings for ordinary or simple kriging"); if (m == OKR && get_method() == SKR) ErrMsg(ER_IMPOSVAL, "method: something's terribly wrong!"); if (m == OKR && get_method() == UKR) { message("I would recommend:\n"); message("Do not specify uk if ok is all you'll get\n"); } } if (mode == MULTIVARIABLE && get_method() != UIF && get_method() != SEM && get_method() != COV && n_variograms_set() > 0) check_variography((const VARIOGRAM **) vgm, get_n_vars()); v_tmp = init_variogram(NULL); free_variogram(v_tmp); } void remove_all(void) { while (n_vars) remove_id(0); /* hard way */ /* for (i = n_vars-1; i >= 0; i--) remove_id(i); */ /* remove_id(n_vars - 1); */ /* the hard way; remove_id(n_vars-1) would be the ``easy'' alternative */ gls(NULL, 0, GLS_INIT, NULL, NULL); /* cleans up static arrays */ reset_block_discr(); /* resets block settings */ max_block_dimension(1); /* reset */ if (gl_bounds != NULL) { efree(gl_bounds); gl_bounds = NULL; } if (valdata != NULL) free_data(valdata); valdata = NULL; } int remove_id(const int id) { /* * remove id id, and reset data, vgm, ids, outfile_names */ int i, j, id_new, id_old; VARIOGRAM *vp; assert(id >= 0 && id < n_vars); /* reset data */ free_data(data[id]); data[id] = NULL; for (i = id; i < n_vars - 1; i++) { data[i] = data[i+1]; data[i]->id = i; } for (i = 0; i < n_vars; i++) { j = LTI(i,id); if (vgm[j]) { free_variogram(vgm[j]); vgm[j] = NULL; } } /* copy variograms: */ for (i = id; i < n_vars - 1; i++) { for (j = id; j <= i; j++) { id_new = LTI(i,j); id_old = LTI(i+1,j+1); vp = vgm[id_new] = vgm[id_old]; if ((vp != NULL) && (vp->id1 >= 0 || vp->id2 >= 0)) { vp->id1 = i; vp->id2 = j; vp->id = id_new; } } } /* reset identifiers: */ efree(ids[id]); for (i = id; i < n_vars - 1; i++) ids[i] = ids[i+1]; /* free outfilenames */ if (outfile_names[2 * id]) { efree(outfile_names[2 * id]); outfile_names[2 * id] = NULL; } if (outfile_names[2 * id + 1]) { efree(outfile_names[2 * id + 1]); outfile_names[2 * id + 1] = NULL; } /* shift pred(xx)/variances(xx) names: */ for (i = id; i < n_vars - 1; i++) { outfile_names[2 * i] = outfile_names[2 * (i + 1)]; outfile_names[2 * i + 1] = outfile_names[2 * (i + 1) + 1]; } /* shift covariances(xx): */ for (i = id; i < n_vars - 1; i++) { id_old = 2 * n_vars + LTI2(i,id); if (outfile_names[id_old]) { efree(outfile_names[id_old]); outfile_names[id_old] = NULL; } for (j = id; j < i; j++) { id_new = 2 * (n_vars - 1) + LTI2(i,j); id_old = 2 * n_vars + LTI2(i+1,j+1); outfile_names[id_new] = outfile_names[id_old]; } } n_vars -= 1; if (n_vars == 0) clean_up(); init_gstat_data(n_vars); /* reset sizes */ return n_vars; } static void clean_up(void) { /* free variograms */ if (vgm) { efree(vgm); vgm = NULL; } /* free data */ if (data) { efree(data); data = NULL; } /* free valdata */ if (valdata) { free_data(valdata); valdata = NULL; } /* free data_area */ if (data_area) { free_data(data_area); data_area = NULL; } /* free outfile names */ if (outfile_names) { efree(outfile_names); outfile_names = NULL; } /* free identifiers */ if (ids) { efree(ids); ids = NULL; } n_vars = 0; n_last = 0; n_v_last = 0; n_o_last = 0; mode = MODE_NSP; } gstat/src/utils.h0000644000176200001440000000272614646417261013516 0ustar liggesusers#ifndef UTILS_H #define UTILS_H # include /* size_t */ /* some famous beware-of-side-effects macro's ! */ #ifndef MAX # define MAX(a,b) (((a) > (b)) ? (a) : (b)) #endif #ifndef MIN # define MIN(a,b) (((a) < (b)) ? (a) : (b)) #endif #ifndef ABS #define ABS(a) (((a) >= 0) ? (a) : (-(a))) #endif #ifndef SQR # define SQR(a) ((a)*(a)) #endif #ifndef PI # define PI 3.14159265359 #endif #define NULS(a) (a==NULL ? "" : a) /* LTI: lower triangular matrix index, stored in an array: col | 0 1 2 3 ----+------- 0 | 0 r 1 | 1 2 o 2 | 3 4 5 w 3 | 6 7 8 9 row and col may be interchanged: LTI(a,b)==LTI(b,a) LTI2(a,b) is the index of an off-diagonal lower triangular matrix: col | 0 1 2 3 ----+------- 0 | x r 1 | 0 x o 2 | 1 2 x w 3 | 3 4 5 x */ #define LTI(r,c) ((r) >= (c) ? (((r)*(r+1))>>1)+(c) : (((c)*(c+1))>>1)+(r)) #define LTI2(r,c) ((r) >= (c) ? (((r)*(r-1))>>1)+(c) : (((c)*(c-1))>>1)+(r)) /* Note: `>>1' replaced `/2' to circumvent an hp 10.20 optimizer bug */ #if defined(__cplusplus) extern "C" { #endif typedef struct { char *str; unsigned int max_length; } STRING_BUFFER; void set_mv_float(float *f); void set_mv_double(double *d); int is_mv_float(const float *f); int is_mv_double(const double *d); int almost_equals(const char *tok, const char *str); void *emalloc(size_t size); void *ecalloc(size_t nobj, size_t size); void *erealloc(void *p, size_t size); void efree(void *p); #if defined(__cplusplus) } #endif #endif /* UTILS_H */ gstat/src/vario.c0000644000176200001440000005617114646417261013474 0ustar liggesusers/* * vario.c: basic variogram model functions (init, print, update, etc.) */ #include #include /* getenv() */ #include /* toupper() */ #include /* DBL_MIN */ #include #include #include "R.h" /* Rprintf() */ #include "defs.h" #include "mtrx.h" #include "userio.h" #include "data.h" #include "utils.h" #include "debug.h" #include "vario.h" #include "vario_fn.h" #include "glvars.h" #include "lm.h" static int is_valid_cs(const VARIOGRAM *aa, const VARIOGRAM *bb, const VARIOGRAM *ab); static int is_posdef(MAT *m); static ANIS_TM *get_tm(double anis[5]); static void init_variogram_part(VGM_MODEL *v); const V_MODEL v_models[] = { /* the variogram model catalogue: */ /* first one needs to be NOT_SP: */ { NOT_SP, "Nsp", "Nsp (not specified)", NULL, NULL }, { NUGGET, "Nug", "Nug (nugget)", fn_nugget, da_is_zero }, { EXPONENTIAL, "Exp", "Exp (exponential)", fn_exponential, da_fn_exponential }, { SPHERICAL, "Sph", "Sph (spherical)", fn_spherical, da_fn_spherical }, { GAUSSIAN, "Gau", "Gau (gaussian)", fn_gaussian, da_fn_gaussian }, { EXCLASS, "Exc", "Exclass (Exponential class/stable)", fn_exclass, NULL }, { MATERN, "Mat", "Mat (Matern)", fn_matern, NULL }, { STEIN, "Ste", "Mat (Matern, M. Stein's parameterization)", fn_matern2, NULL }, { CIRCULAR, "Cir", "Cir (circular)", fn_circular, NULL }, { LINEAR, "Lin", "Lin (linear)", fn_linear, da_fn_linear }, /* one-parameter (a = 0), or two-parameter with sill */ { BESSEL, "Bes", "Bes (bessel)", fn_bessel, NULL }, { PENTASPHERICAL, "Pen", "Pen (pentaspherical)", fn_pentaspherical, da_fn_pentaspherical }, { PERIODIC, "Per", "Per (periodic)", fn_periodic, da_fn_periodic }, { WAVE, "Wav", "Wav (wave)", fn_wave, da_fn_wave }, { HOLE, "Hol", "Hol (hole)", fn_hole, da_fn_hole }, { LOGARITHMIC, "Log", "Log (logarithmic)", fn_logarithmic, da_fn_logarithmic }, { POWER, "Pow", "Pow (power)", fn_power, da_fn_power }, /* Wackernagel 2nd ed., p. 225 -- not working yet */ { SPLINE, "Spl", "Spl (spline)", fn_spline, NULL }, { LEGENDRE, "Leg", "Leg (Legendre)", fn_legendre, NULL }, { MERROR, "Err", "Err (Measurement error)", fn_nugget, da_is_zero }, /* the folowing two should always be the last ``valid'' one: */ { INTERCEPT, "Int", "Int (Intercept)", fn_intercept, da_is_zero }, { NOT_SP, NULL, NULL, NULL, NULL } /* THIS SHOULD BE LAST */ }; const char *vgm_type_str[] = { "not specified", "semivariogram", "cross variogram", "covariogram", "cross covariogram" }; VARIOGRAM *init_variogram(VARIOGRAM *v) { /* * initializes one variogram structure * if v is NULL, memory is allocated for the structure */ int i; if (v == NULL) v = (VARIOGRAM *) emalloc(sizeof(VARIOGRAM)); v->id = v->id1 = v->id2 = -1; v->n_models = 0; v->is_valid_covariance = 1; v->isotropic = 1; v->n_fit = 0; v->fit_is_singular = 0; v->max_range = (double) DBL_MIN; v->sum_sills = 0.0; v->measurement_error = 0.0; v->max_val = 0.0; v->min_val = 0.0; vgm_init_block_values(v); v->part = (VGM_MODEL *) emalloc(INIT_N_VGMM * sizeof(VGM_MODEL)); v->table = NULL; for (i = 0; i < INIT_N_VGMM; i++) init_variogram_part(&(v->part[i])); v->max_n_models = INIT_N_VGMM; v->SSErr = 0.0; v->ev = init_ev(); return v; } void vgm_init_block_values(VARIOGRAM *v) { v->block_semivariance_set = 0; v->block_covariance_set = 0; v->block_covariance = -999999.0; v->block_semivariance = -999999.0; } static void init_variogram_part(VGM_MODEL *p) { int i; p->sill = 0.0; for (i = 0; i < NRANGEPARS; i++) { p->range[i] = 0.0; /* quiets valgrind? */ set_mv_double(&(p->range[i])); /* trigger errors if misused */ } p->model = NOT_SP; p->fit_sill = p->fit_range = 1; p->fnct = p->da_fnct = NULL; p->tm_range = NULL; p->id = -1; } SAMPLE_VGM *init_ev(void) { SAMPLE_VGM *ev = NULL; ev = (SAMPLE_VGM *) emalloc(sizeof(SAMPLE_VGM)); set_mv_double(&(ev->cutoff)); set_mv_double(&(ev->iwidth)); ev->gamma = NULL; ev->dist = NULL; ev->nh = NULL; ev->pairs = NULL; ev->n_max = 0; ev->n_est = 0; ev->zero = ZERO_DEFAULT; ev->plot_numbers = 1; ev->is_directional = 0; ev->evt = NOTSPECIFIED; ev->fit = NO_FIT; ev->recalc = 1; ev->refit = 1; ev->pseudo = 0; ev->is_asym = -1; ev->map = NULL; ev->S_grid = NULL; ev->direction.x = 1.0; ev->direction.y = ev->direction.z = 0.0; return ev; } void free_variogram(VARIOGRAM *v) { int i; assert(v != NULL); if (v->ev) { if (v->ev->n_max > 0) { efree(v->ev->gamma); efree(v->ev->dist); efree(v->ev->nh); if (v->ev->pairs) efree(v->ev->pairs); } if (v->ev->map) efree(v->ev->map); efree(v->ev); } for (i = 0; i < v->max_n_models; i++) if (v->part[i].tm_range != NULL) efree(v->part[i].tm_range); efree(v->part); if (v->table) { efree(v->table->values); efree(v->table); } efree(v); } void logprint_variogram(const VARIOGRAM *v, int verbose) { /* prints contents of VARIOGRAM v to R console */ if (v->id1 < 0 && v->id2 < 0) return; /* never set */ if (v->id1 == v->id2) Rprintf("variogram(%s):\n", name_identifier(v->id1)); else Rprintf("variogram(%s,%s):\n", name_identifier(v->id1), name_identifier(v->id2)); for (int i = 0; i < v->n_models; i++) { Rprintf("# model: %d type: %s sill: %g range: %g\n", i, v_models[v->part[i].model].name_long, v->part[i].sill, v->part[i].range[0]); if (v->part[i].tm_range != NULL) { Rprintf("# range anisotropy, rotation matrix:\n"); for (int j = 0; j < 3; j++) { for (int k = 0; k < 3; k++) Rprintf("%s%8.4f", k == 0 ? "# " : " ", v->part[i].tm_range->tm[j][k]); Rprintf("\n"); } } } Rprintf( "# sum sills %g, max %g, min %g, flat at distance %g\n", v->sum_sills, v->max_val, v->min_val, v->max_range); return; } void update_variogram(VARIOGRAM *vp) { /* * update min/max, n_fit, descr * assumes that models are not changed: they can only be changed through * read_variogram(); */ VGM_MODEL *p; vp->sum_sills = vp->min_val = vp->max_val = 0.0; vp->measurement_error = 0.0; vp->n_fit = 0; vp->max_range = DBL_MIN; for (int i = 0; i < vp->n_models; i++) { p = &(vp->part[i]); vp->sum_sills += p->sill; if (p->sill < 0.0) vp->min_val += p->sill; /* else */ /* up to gstat_1.1-1 else was there; see https://stat.ethz.ch/pipermail/r-sig-geo/2015-December/023814.html */ vp->max_val += p->sill; vp->max_range = MAX(p->range[0], vp->max_range); if (p->model == BESSEL || p->model == GAUSSIAN || p->model == EXPONENTIAL || p->model == LOGARITHMIC || p->model == POWER || p->model == PERIODIC || p->model == EXCLASS || p->model == LEGENDRE || p->model == HOLE || p->model == WAVE || /* more??? */ p->model == MATERN || p->model == STEIN || (p->model == LINEAR && p->range[0] == 0)) /* sill is reached asymptotically or oscillates */ vp->max_range = DBL_MAX; else /* transitive model: */ vp->max_range = MAX(p->range[0], vp->max_range); if ((p->model == LINEAR && p->range[0] == 0.0) || p->model == NUGGET || p->model == INTERCEPT) p->fit_range = 0; /* 1 would lead to singularity */ if (p->model == LOGARITHMIC || p->model == POWER || p->model == INTERCEPT || (p->model == LINEAR && p->range[0] == 0)) vp->is_valid_covariance = 0; if (p->fit_sill) vp->n_fit++; if (p->fit_range) vp->n_fit++; if (p->model == MERROR) vp->measurement_error += p->sill; } if (vp->table != NULL) { vp->sum_sills = vp->table->values[0]; vp->max_val = vp->table->values[0]; vp->min_val = vp->table->values[0]; for (int i = 1; i < vp->table->n; i++) { vp->max_val = MAX(vp->max_val, vp->table->values[i]); vp->min_val = MIN(vp->min_val, vp->table->values[i]); } } return; } /* double get_max_sill(int n) { int i, j; VARIOGRAM *vp; static double max_sill; vp = get_vgm(0); max_sill = vp->max_val; for (i = 0; i < n; i++) { for (j = 0; j <= i; j++) { vp = get_vgm(LTI(i,j)); max_sill = MAX(max_sill, vp->max_val); } } return max_sill; } */ double get_semivariance(const VARIOGRAM *vp, double dx, double dy, double dz) { /* returns gamma(dx,dy,dz) for variogram v: gamma(h) = cov(0) - cov(h) */ int i; double sv = 0.0, dist = 0.0; if (vp->table != NULL) return(SEM_TABLE_VALUE(vp->table, transform_norm(vp->table->tm_range, dx, dy, dz))); if (! vp->isotropic) { for (i = 0; i < vp->n_models; i++) sv += vp->part[i].sill * vp->part[i].fnct( transform_norm(vp->part[i].tm_range, dx, dy, dz), vp->part[i].range); } else { dist = transform_norm(NULL, dx, dy, dz); if (dist > vp->max_range) return vp->sum_sills; for (i = 0; i < vp->n_models; i++) sv += vp->part[i].sill * vp->part[i].fnct(dist, vp->part[i].range); } return sv; } double get_covariance(const VARIOGRAM *vp, double dx, double dy, double dz) { /* returns cov(dx,dy,dz) for variogram v */ int i; static int warning = 0; double ctmp = 0.0, dist; if (vp == NULL) { warning = 0; return 0.0; } if (! vp->is_valid_covariance && !warning) { pr_warning("non-transitive variogram model not allowed as covariance function"); warning = 1; } if (!vp->is_valid_covariance && !DEBUG_FORCE) ErrMsg(ER_IMPOSVAL, "covariance from non-transitive variogram not allowed "); if (vp->table != NULL) return(COV_TABLE_VALUE(vp->table, transform_norm(vp->table->tm_range, dx, dy, dz))); if (! vp->isotropic) { for (i = 0; i < vp->n_models; i++) ctmp += vp->part[i].sill * (1.0 - vp->part[i].fnct( transform_norm(vp->part[i].tm_range, dx, dy, dz), vp->part[i].range)); } else { dist = transform_norm(NULL, dx, dy, dz); for (i = 0; i < vp->n_models; i++) ctmp += vp->part[i].sill * (1.0 - vp->part[i].fnct(dist, vp->part[i].range)); } return ctmp; } static int is_valid_cs(const VARIOGRAM *aa, const VARIOGRAM *bb, const VARIOGRAM *ab) /* * Purpose : Check Cauchy-Schwartz inequality on cross/variograms * Created by : Edzer J. Pebesma * Date : may 6th 1992 * Prerequisites : * Returns : return nonzero if |g_ab(h)| > sqrt(g_aa(h)g_bb(h)) * Side effects : none */ { int i, check_failed = 0; double maxrange = 0, dist, dx, dy, dz; for (i = 0; i < aa->n_models; i++) if (aa->part[i].range[0] > maxrange) maxrange = aa->part[i].range[0]; for (i = 0; i < ab->n_models; i++) if (ab->part[i].range[0] > maxrange) maxrange = ab->part[i].range[0]; for (i = 0; i < bb->n_models; i++) if (bb->part[i].range[0] > maxrange) maxrange = bb->part[i].range[0]; for (i = 0; i < 101 && !check_failed; i++) { dist = (i * maxrange)/100; dx = dy = dz = 0.0; if (i % 3 == 0) dx = dist; if (i % 3 == 1) dy = dist; if (i % 3 == 2) dz = dist; if (fabs(get_semivariance(ab, dx, dy, dz)) > sqrt(get_semivariance(aa, dx, dy, dz) * get_semivariance(bb, dx, dy, dz))) { check_failed = 1; /* yes, the check failed */ pr_warning("%s %d %s %d %s %d\n%s %g %g %g\n", "Cauchy-Schwartz violation: variogram", aa->id,",",bb->id, "and cross variogram", ab->id, "first failure on dx, dy and dz:", dx, dy, dz); } } /* for */ if (check_failed) return 0; else return 1; } void check_variography(const VARIOGRAM **v, int n_vars) /* * check for intrinsic correlation, linear model of coregionalisation * or else (with warning) Cauchy Swartz */ { int i, j, k, ic = 0, lmc, posdef = 1; MAT **a = NULL; double b; char *reason = NULL; if (n_vars <= 1) return; /* * find out if lmc (linear model of coregionalization) hold: * all models must have equal base models (sequence and range) */ for (i = 1, lmc = 1; lmc && i < get_n_vgms(); i++) { if (v[0]->n_models != v[i]->n_models) { reason = "number of models differ"; lmc = 0; } for (k = 0; lmc && k < v[0]->n_models; k++) { if (v[0]->part[k].model != v[i]->part[k].model) { reason = "model types differ"; lmc = 0; } if (v[0]->part[k].range[0] != v[i]->part[k].range[0]) { reason = "ranges differ"; lmc = 0; } } for (k = 0; lmc && k < v[0]->n_models; k++) if (v[0]->part[k].tm_range != NULL) { if (v[i]->part[k].tm_range == NULL) { reason = "anisotropy for part of models"; lmc = 0; } else if ( v[0]->part[k].tm_range->ratio[0] != v[i]->part[k].tm_range->ratio[0] || v[0]->part[k].tm_range->ratio[1] != v[i]->part[k].tm_range->ratio[1] || v[0]->part[k].tm_range->angle[0] != v[i]->part[k].tm_range->angle[0] || v[0]->part[k].tm_range->angle[1] != v[i]->part[k].tm_range->angle[1] || v[0]->part[k].tm_range->angle[2] != v[i]->part[k].tm_range->angle[2] ) { reason = "anisotropy parameters are not equal"; lmc = 0; } } else if (v[i]->part[k].tm_range != NULL) { reason = "anisotropy for part of models"; lmc = 0; } } if (lmc) { /* * check for ic: */ a = (MAT **) emalloc(v[0]->n_models * sizeof(MAT *)); for (k = 0; k < v[0]->n_models; k++) a[k] = m_get(n_vars, n_vars); for (i = 0; i < n_vars; i++) { for (j = 0; j < n_vars; j++) { /* for all variogram triplets: */ for (k = 0; k < v[0]->n_models; k++) ME(a[k], i, j) = v[LTI(i,j)]->part[k].sill; } } /* for ic: a's must be scaled versions of each other: */ ic = 1; for (k = 1, ic = 1; ic && k < v[0]->n_models; k++) { b = ME(a[0], 0, 0)/ME(a[k], 0, 0); for (i = 0; ic && i < n_vars; i++) for (j = 0; ic && j < n_vars; j++) if (fabs(ME(a[0], i, j) / ME(a[k], i, j) - b) > EPSILON) ic = 0; } /* check posdef matrices */ for (i = 0, lmc = 1, posdef = 1; i < v[0]->n_models; i++) { posdef = is_posdef(a[i]); if (posdef == 0) { reason = "coefficient matrix not positive definite"; if (DEBUG_COV) { printlog("non-positive definite coefficient matrix %d:\n", i); m_logoutput(a[i]); } ic = lmc = 0; } if (! posdef) printlog( "non-positive definite coefficient matrix in structure %d", i+1); } for (k = 0; k < v[0]->n_models; k++) m_free(a[k]); efree(a); if (ic) { printlog("Intrinsic Correlation found. Good.\n"); return; } else if (lmc) { printlog("Linear Model of Coregionalization found. Good.\n"); return; } } /* * lmc does not hold: check on Cauchy Swartz */ pr_warning("No Intrinsic Correlation or Linear Model of Coregionalization found\nReason: %s", reason ? reason : "unknown"); if (gl_nocheck == 0) { pr_warning("[add `set = list(nocheck = 1)' to the gstat() or krige() to ignore the following error]\n"); ErrMsg(ER_IMPOSVAL, "variograms do not satisfy a legal model"); } printlog("Now checking for Cauchy-Schwartz inequalities:\n"); for (i = 0; i < n_vars; i++) for (j = 0; j < i; j++) if (is_valid_cs(v[LTI(i,i)], v[LTI(j,j)], v[LTI(i,j)])) { printlog("variogram(%s,%s) passed Cauchy-Schwartz\n", name_identifier(j), name_identifier(i)); } else pr_warning("Cauchy-Schwartz inequality found for variogram(%s,%s)", name_identifier(j), name_identifier(i) ); return; } static int is_posdef(MAT *A) { MAT *b = m_copy(A, MNULL); int info; CHfactor(b, PNULL, &info); m_free(b); return (info == 0); } double transform_norm(const ANIS_TM *tm, double dx, double dy, double dz) { /* returns variogram distance given dx, dy, dz and VARIOGRAM v */ double dist = 0.0, tmp; int i; if (dx == 0.0 && dy == 0.0 && dz == 0.0) return 0.0; if (tm != NULL) { for (i = 0, tmp = 0.0; i < 3; i++) { tmp = tm->tm[i][0] * dx + tm->tm[i][1] * dy + tm->tm[i][2] * dz; dist += tmp * tmp; } return sqrt(dist); } return sqrt((dx * dx) + (dy * dy) + (dz * dz)); } double da_general(VGM_MODEL *part, double h) { /* numerical approximation of derivative: */ int i; double low, high, range, r[NRANGEPARS]; for (i = 0; i < NRANGEPARS; i++) { if (is_mv_double(&(part->range[i]))) set_mv_double(&(r[i])); else r[i] = part->range[i]; } range = MAX(1e-20, part->range[0]); r[0] = range * (1.0 + DA_DELTA); low = part->fnct(h, r); r[0] = range * (1.0 - DA_DELTA); high = part->fnct(h, r); return part->sill * (low - high) / (2.0 * range * DA_DELTA); } int push_variogram_model(VARIOGRAM *v, VGM_MODEL part) { int i, max_id, where = -1; /* * add the part submodel to v (if part.id < 0) or else * modify the appropriate part of v, having the id of part.id. * do a lot of checks, and set .fn and .da_fn functions. */ if (v->n_models == v->max_n_models) { v->part = (VGM_MODEL *) erealloc(v->part, (v->max_n_models + INIT_N_VGMM) * sizeof(VGM_MODEL)); for (i = v->max_n_models; i < v->max_n_models + INIT_N_VGMM; i++) init_variogram_part(&(v->part[i])); v->max_n_models += INIT_N_VGMM; } /* * check some things: */ if (part.model == NOT_SP) ErrMsg(ER_IMPOSVAL, "model NSP not allowed in variogram structure"); if (part.range[0] < 0.0) ErrMsg(ER_RANGE, "variogram range cannot be negative"); if (part.model == LINEAR) { if (part.range[0] == 0.0) part.fit_range = 0; } else if (part.model == NUGGET || part.model == INTERCEPT || part.model == MERROR) { part.fit_range = 0; if (part.range[0] > 0.0) ErrMsg(ER_RANGE, "range must be zero"); } else if (part.range[0] == 0.0) ErrMsg(ER_RANGE, "range must be positive"); if (part.model == POWER && part.range[0] > 2.0) ErrMsg(ER_RANGE, "power model range (parameter) cannot exceed 2.0"); if (part.model == EXCLASS && part.range[1] > 2.0) ErrMsg(ER_RANGE, "exponentical class model shape parameter cannot exceed 2.0"); if (part.id < 0) { where = v->n_models; v->n_models++; for (i = max_id = 0; i < v->n_models; i++) max_id = MAX(v->part[i].id, max_id); part.id = max_id + 1; } else { /* search in list: */ for (i = 0; where < 0 && i < v->n_models; i++) if (v->part[i].id == part.id) where = i; assert(where >= 0); /* i.e., it should really be in the list */ } if (v->isotropic) v->isotropic = (part.tm_range == NULL); /* * check that the .fn and .da_fn functions in v_models * will indeed be the correct ones: */ assert(part.model == v_models[part.model].model); v->part[where] = part; v->part[where].fnct = v_models[part.model].fn; v->part[where].da_fnct = v_models[part.model].da_fn; return part.id; } VGM_MODEL_TYPE which_variogram_model(const char *m) { char s[4]; strncpy(s, m, 3); s[0] = toupper(s[0]); s[1] = tolower(s[1]); s[2] = tolower(s[2]); s[3] = '\0'; for (int i = 1; v_models[i].name != NULL; i++) if (strcmp(s, v_models[i].name) == 0) return v_models[i].model; return NOT_SP; } double relative_nugget(VARIOGRAM *v) { int i; double nug = 0.0, sill = 0.0; assert(v->n_models != 0); if (v->n_models == 1) return (v->part[0].model == NUGGET ? 1.0 : 0.0); for (i = 0; i < v->n_models; i++) { if (v->part[i].model == NUGGET) nug += v->part[i].sill; else sill += v->part[i].sill; } assert(nug + sill > 0.0); return (nug/(nug+sill)); } DO_AT_ZERO zero_int2enum(int zero) { switch(zero) { case 0: return ZERO_DEFAULT; case 1: return ZERO_INCLUDE; case 2: return ZERO_AVOID; case 3: return ZERO_SPECIAL; } ErrMsg(ER_IMPOSVAL, "invalid value for zero"); return ZERO_DEFAULT; /* never reached */ } void push_to_v(VARIOGRAM *v, const char *mod, double sill, double *range, int nrangepars, double *d, int fit_sill, int fit_range) { VGM_MODEL vm; int i; init_variogram_part(&vm); vm.model = which_variogram_model(mod); if (nrangepars > NRANGEPARS) ErrMsg(ER_IMPOSVAL, "too many range parameters"); for (i = 0; i < nrangepars; i++) vm.range[i] = range[i]; vm.sill = sill; vm.fit_sill = fit_sill; vm.fit_range = fit_range; if (d != NULL && d[0] != -9999.0) vm.tm_range = get_tm(d); if (vm.model == STEIN && range[1] > 100.0) { vm.model = GAUSSIAN; vm.range[1] = 0.0; pr_warning("kappa values over 100 overflow gammafn: taking Gaussian approximation"); } push_variogram_model(v, vm); } void push_to_v_table(VARIOGRAM *v, double maxdist, int length, double *values, double *anis) { int i; v->table = (COV_TABLE *) emalloc(sizeof(COV_TABLE)); v->table->n = length; v->table->maxdist = maxdist; v->table->values = (double *) emalloc(length * sizeof(double)); for (i = 0; i < length; i++) v->table->values[i] = values[i]; if (anis != NULL) v->table->tm_range = get_tm(anis); else v->table->tm_range = NULL; } static ANIS_TM *get_tm(double anis[5]) { /* Part of this routine was inspired by FORTRAN code in GSLIB, first edition: C%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% C % C Copyright (C) 1992 Stanford Center for Reservoir Forecasting. All % C rights reserved. Distributed with: C.V. Deutsch and A.G. Journel. % C ``GSLIB: Geostatistical Software Library and User's Guide,'' Oxford % C University Press, New York, 1992. % C % C The programs in GSLIB are distributed in the hope that they will be % C useful, but WITHOUT ANY WARRANTY. No author or distributor accepts % C responsibility to anyone for the consequences of using them or for % C whether they serve any particular purpose or work at all, unless he % C says so in writing. Everyone is granted permission to copy, modify % C and redistribute the programs in GSLIB, but only under the condition % C that this notice and the above copyright notice remain intact. % C % C%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */ int i; double alpha, beta, theta, sina, sinb, sint, cosa, cosb, cost, afac1, afac2; ANIS_TM *t = NULL; /* About naming convention: gstat GSLIB =============== anis[0] ang1 (first anis. par. for 2D) anis[1] ang2 anis[2] ang3 anis[3] anis1 (second anis. par. for 2D) anis[4] anis2 */ #define ANIS_ERR(x) message("parsing anis. pars. %g,%g,%g,%g,%g -- error on %g\n", \ anis[0],anis[1],anis[2],anis[3],anis[4],x) #define DEG2RAD (PI/180.0) for (i = 0; i < 3; i++) { if (anis[i] < 0 || anis[i] >= 360) { ANIS_ERR(anis[i]); ErrMsg(ER_RANGE, "this value should be in [0..360>"); } } for (i = 3; i < 5; i++) { if (anis[i] <= 0.0 || anis[i] > 1.0) { ANIS_ERR(anis[i]); ErrMsg(ER_RANGE, "this value should be in <0..1]"); } } /* from GSLIB: */ if (anis[0] >= 0.0 && anis[0] < 270) alpha = (double) (90.0 - anis[0]) * DEG2RAD; else alpha = (double) (450.0 - anis[0]) * DEG2RAD; beta = -1.0 * (double) anis[1] * DEG2RAD; theta = (double) anis[2] * DEG2RAD; sina = sin(alpha); sinb = sin(beta); sint = sin(theta); cosa = cos(alpha); cosb = cos(beta); cost = cos(theta); afac1 = 1.0 / MAX((double) anis[3], (double) EPSILON); afac2 = 1.0 / MAX((double) anis[4], (double) EPSILON); t = emalloc(sizeof(ANIS_TM)); t->angle[0] = anis[0]; t->angle[1] = anis[1]; t->angle[2] = anis[2]; t->ratio[0] = anis[3]; t->ratio[1] = anis[4]; t->tm[0][0] = (cosb * cosa); t->tm[0][1] = (cosb * sina); t->tm[0][2] = (-sinb); t->tm[1][0] = afac1*(-cost*sina + sint*sinb*cosa); t->tm[1][1] = afac1*(cost*cosa + sint*sinb*sina); t->tm[1][2] = afac1*( sint * cosb); t->tm[2][0] = afac2*(sint*sina + cost*sinb*cosa); t->tm[2][1] = afac2*(-sint*cosa + cost*sinb*sina); t->tm[2][2] = afac2*(cost * cosb); return t; } gstat/src/nsearch.h0000644000176200001440000000137014646417261013773 0ustar liggesusers#ifndef SEARCH_H # define SEARCH_H /* avoid multiple inclusion */ void qtree_free(QTREE_NODE *node); void qtree_pop_point(DPOINT *p, DATA *d); void qtree_push_point(DATA *d, DPOINT *p); void qtree_rebuild(DATA *d); int qtree_select(DPOINT *where, DATA *d); /* 2-norm distances from point to block: */ double pb_norm_3D(const DPOINT *where, BBOX bbox); double pb_norm_2D(const DPOINT *where, BBOX bbox); double pb_norm_1D(const DPOINT *where, BBOX bbox); /* define the maximum depth of the quadtree; * Fri Jul 4 12:05:47 CEST 2003 * if this is not defined, more than gl_split points at * a single spatial location cause infinite recursion * 10 seems a reasonable value: 1/2048 of the bbox dim * */ #define MAX_RECURSION_DEPTH 11 #endif /* SEARCH_H */ gstat/src/gls.c0000644000176200001440000005136614646417261013142 0ustar liggesusers/* gls.c: module for multivariable generalized least squares prediction given a linear model Y = X Beta + e, gls() calculates from the selection d[0]->sel,...,d[n_vars-1]->sel, the multivariable BLUE estimation of x0 beta (and Cov(x0[i] Beta, x0[j] Beta)), or BLUP of Y(x0) (multivariable universal kriging) (and MSPE Y(x0)) BLP of Y(x0) (multivariable simple kriging) (and MSPE Y(x0)) (BLUE: Generalized Least Squares (GLS) best linear unbiased estimate; BLUP: GLS best linear unbiased prediction; BLP: GLS best linear prediction) UPDATE: only update y, beta (BLUP); References: a. Christensen, Ronald, 1991. Linear Models for Multivariate, Time Series, and Spatial Data. Springer Verlag, New York. (Ch. VI.2, VI.3) b. Ver Hoef, Jay M., Noel Cressie, 1993. Multivariable Spatial Prediction. Mathematical Geology, 25 (2), pp. 219--240. [[[Note: eq. (18) should have a `+' between SIGMA_0 and C'SIGMA-1 C ]]] Notation (variables and comment): v' the transpose of (matrix or vector) v C-1 the inverse of matrix v (`Cinv' in a variable name) n total number of observations in data selections (rows_C) m total number of variables [n_vars] p sum of number of X columns (for non-empty data selections) [cols of X] y data vector (y[0]',...,y[n_vars-1]')', y[i] is the i-th variable [n x 1] C (generalized) covariance matrix, C[i][j] = Cov(element(y,i),element(y,j)) (element(y,i) is the i-th element in y, not the i-th variable) [n x n] X design matrix [n x p]; beta parameter vector [p x 1]: E(y) = X beta C0 (generalized) covariance matrix with y(x0): C0[i][j] = Cov(element(y,i),y[j](x0)) [n x m] X0 the value that X would have at location "where" [p x m] (Note: Christensen's x0 is Ver Hoefs X0'; I use x0: e.g. x0'beta). */ #include /* size_t */ #include /* sqrt() */ #include "defs.h" #include "data.h" #include "utils.h" #include "select.h" #include "mtrx.h" #include "lm.h" #include "vario.h" #include "vario_io.h" #include "glvars.h" #include "userio.h" #include "debug.h" #include "gls.h" static void fill_est(DATA **d, VEC *blup, MAT *MSPE, int n_vars, double *est); static void debug_result(VEC *blup, MAT *MSPE, enum GLS_WHAT pred); static VEC *get_mu(VEC *mu, const VEC *y, DATA **d, int nvars); static MAT *get_corr_mat(MAT *C, MAT *R); #define M_DEBUG(a,b) { if (DEBUG_COV){printlog("\n# %s:\n", b); \ m_logoutput(a);}} #define V_DEBUG(a,b) {if (DEBUG_COV){printlog("\n# %s:\n", b); \ v_logoutput(a);}} #define UPDATE_BLP (pred == UPDATE && last_pred == GLS_BLP) #define UPDATE_BLUP (pred == UPDATE && last_pred == GLS_BLUP) /* static MAT *convert_vmuC(MAT *C, DATA *d); static MAT *convert_vmuC0(MAT *C0, DATA *d, double v); static MAT *convert_vmuC00(MAT *MSPE, double v); */ static void convert_C(MAT *C, VEC *mu, double (*fn)(double)); static void convert_C0(MAT *C0, VEC *mu, VEC *mu0, double (*fn)(double)); static void convert_MSPE(MAT *MSPE, VEC *mu0, double (*fn)(double)); typedef struct { MAT *C, /* (Generalized) Covariance matrix */ *X, /* design matrix, y = X beta + e */ *CinvX, /* C-1 X */ *XCinvX; /* X' C-1 X */ VEC *y, /* measurement vector */ *mu, /* mu vector, E(y) */ *mu0, /* mu at loc x0 */ *beta; /* parameter vector */ } GLM; /* structure is locally defined, will be held in void *glm in DATA */ static GLM *new_glm(void); /* * n_vars is the number of variables to be considered, * d is the data array of variables d[0],...,d[n_vars-1], * pred determines which estimate is required: BLUE, BLUP, or BLP */ void gls(DATA **d /* pointer to DATA array */, int n_vars, /* length of DATA array (to consider) */ enum GLS_WHAT pred, /* what type of prediction is requested */ DPOINT *where, /* prediction location */ double *est /* output: array that holds the predicted values and variances */) { GLM *glm = NULL; /* to be copied to/from d */ static MAT *X0 = MNULL, *C0 = MNULL, *MSPE = MNULL, *CinvC0 = MNULL, *Tmp1 = MNULL, *Tmp2 = MNULL, *Tmp3 = MNULL, *R = MNULL; static VEC *blup = VNULL, *tmpa = VNULL, *tmpb = VNULL; PERM *piv = PNULL; volatile unsigned int i, rows_C; unsigned int j, k, l = 0, row, col, start_i, start_j, start_X, global, one_nbh_empty; VARIOGRAM *v = NULL; static enum GLS_WHAT last_pred = GLS_INIT; /* the initial value */ double c_value, *X_ori; int info; if (d == NULL) { /* clean up */ if (X0 != MNULL) M_FREE(X0); if (C0 != MNULL) M_FREE(C0); if (MSPE != MNULL) M_FREE(MSPE); if (CinvC0 != MNULL) M_FREE(CinvC0); if (Tmp1 != MNULL) M_FREE(Tmp1); if (Tmp2 != MNULL) M_FREE(Tmp2); if (Tmp3 != MNULL) M_FREE(Tmp3); if (R != MNULL) M_FREE(R); if (blup != VNULL) V_FREE(blup); if (tmpa != VNULL) V_FREE(tmpa); if (tmpb != VNULL) V_FREE(tmpb); last_pred = GLS_INIT; return; } if (DEBUG_COV) { printlog("we're at %s X: %g Y: %g Z: %g\n", IS_BLOCK(where) ? "block" : "point", where->x, where->y, where->z); } if (pred != UPDATE) /* it right away: */ last_pred = pred; assert(last_pred != GLS_INIT); if (d[0]->glm == NULL) { /* allocate and initialize: */ glm = new_glm(); d[0]->glm = (void *) glm; } else glm = (GLM *) d[0]->glm; glm->mu0 = v_resize(glm->mu0, n_vars); MSPE = m_resize(MSPE, n_vars, n_vars); if (pred == GLS_BLP || UPDATE_BLP) { X_ori = where->X; for (i = 0; i < n_vars; i++) { /* mu(0) */ glm->mu0->ve[i] = calc_mu(d[i], where); blup = v_copy(glm->mu0, v_resize(blup, glm->mu0->dim)); where->X += d[i]->n_X; /* shift to next x0 entry */ } where->X = X_ori; /* ... and set back */ for (i = 0; i < n_vars; i++) { /* Cij(0,0): */ for (j = 0; j <= i; j++) { v = get_vgm(LTI(d[i]->id,d[j]->id)); ME(MSPE, i, j) = ME(MSPE, j, i) = COVARIANCE0(v, where, where, d[j]->pp_norm2); } } fill_est(NULL, blup, MSPE, n_vars, est); /* in case of empty neighbourhood */ } /* logprint_variogram(v, 1); */ /* * selection dependent problem dimensions: */ for (i = rows_C = 0, one_nbh_empty = 0; i < n_vars; i++) { rows_C += d[i]->n_sel; if (d[i]->n_sel == 0) one_nbh_empty = 1; } if (rows_C == 0 /* all selection lists empty */ || one_nbh_empty == 1) { /* one selection list empty */ if (pred == GLS_BLP || UPDATE_BLP) debug_result(blup, MSPE, pred); return; } for (i = 0, global = 1; i < n_vars && global; i++) global = (d[i]->sel == d[i]->list && d[i]->n_list == d[i]->n_original && d[i]->n_list == d[i]->n_sel); /* * global things: enter whenever (a) first time, (b) local selections or * (c) the size of the problem grew since the last call (e.g. simulation) */ if (glm->C == NULL || !global || rows_C > glm->C->m) { /* * fill y: */ glm->y = get_y(d, glm->y, n_vars); if (pred != UPDATE) { glm->C = m_resize(glm->C, rows_C, rows_C); if (gl_choleski == 0) /* use LDL' decomposition, allocate piv: */ piv = px_resize(piv, rows_C); m_zero(glm->C); glm->X = get_X(d, glm->X, n_vars); M_DEBUG(glm->X, "X"); glm->CinvX = m_resize(glm->CinvX, rows_C, glm->X->n); glm->XCinvX = m_resize(glm->XCinvX, glm->X->n, glm->X->n); glm->beta = v_resize(glm->beta, glm->X->n); for (i = start_X = start_i = 0; i < n_vars; i++) { /* row var */ /* fill C, mu: */ for (j = start_j = 0; j <= i; j++) { /* col var */ v = get_vgm(LTI(d[i]->id,d[j]->id)); for (k = 0; k < d[i]->n_sel; k++) { /* rows */ row = start_i + k; for (l = 0, col = start_j; col <= row && l < d[j]->n_sel; l++, col++) { if (pred == GLS_BLUP) c_value = GCV(v, d[i]->sel[k], d[j]->sel[l]); else c_value = COVARIANCE(v, d[i]->sel[k], d[j]->sel[l]); /* on the diagonal, if necessary, add measurement error variance */ if (d[i]->colnvariance && i == j && k == l) c_value += d[i]->sel[k]->variance; ME(glm->C, col, row) = c_value; /* fill upper */ if (col != row) ME(glm->C, row, col) = c_value; /* fill all */ } /* for l */ } /* for k */ start_j += d[j]->n_sel; } /* for j */ start_i += d[i]->n_sel; if (d[i]->n_sel > 0) start_X += d[i]->n_X - d[i]->n_merge; } /* for i */ /* if (d[0]->colnvmu) glm->C = convert_vmuC(glm->C, d[0]); */ if (d[0]->variance_fn) { glm->mu = get_mu(glm->mu, glm->y, d, n_vars); convert_C(glm->C, glm->mu, d[0]->variance_fn); } if (DEBUG_COV && pred == GLS_BLUP) printlog("[using generalized covariances: max_val - semivariance()]"); M_DEBUG(glm->C, "Covariances (x_i, x_j) matrix C (upper triangle)"); /* * factorize C: */ CHfactor(glm->C, piv, &info); if (info != 0) { /* singular: */ pr_warning("Covariance matrix singular at location [%g,%g,%g]: skipping...", where->x, where->y, where->z); m_free(glm->C); glm->C = MNULL; /* assure re-entrance if global */ P_FREE(piv); set_mv_double(&est[0]); return; } if (piv == NULL) M_DEBUG(glm->C, "glm->C, Choleski decomposed:") else M_DEBUG(glm->C, "glm->C, LDL' decomposed:") } /* if (pred != UPDATE) */ if (pred != GLS_BLP && !UPDATE_BLP) { /* C-1 X and X'C-1 X, beta */ /* * calculate CinvX: */ glm->CinvX = CHsolve(glm->C, glm->X, glm->CinvX, piv); /* M_DEBUG(glm->CinvX, "C-1 X"); */ /* * calculate X'C-1 X: */ glm->XCinvX = mtrm_mlt(glm->X, glm->CinvX, glm->XCinvX); /* X'C-1 X */ M_DEBUG(glm->XCinvX, "X'C-1 X"); m_inverse(glm->XCinvX, &info); if (info != 0) { /* singular: */ pr_warning("X'C-1 X matrix singular at location [%g,%g,%g]: skipping...", where->x, where->y, where->z); m_free(glm->C); glm->C = MNULL; /* assure re-entrance if global */ P_FREE(piv); set_mv_double(&est[0]); return; } /* * calculate beta: */ tmpa = v_resize(tmpa, rows_C); tmpa = vm_mlt(glm->CinvX, glm->y, tmpa); /* X'C-1 y */ glm->beta = vm_mlt(glm->XCinvX, tmpa, glm->beta); /* (X'C-1 X)-1 X'C-1 y */ V_DEBUG(glm->beta, "beta"); M_DEBUG(glm->XCinvX, "Cov(beta), (X'C-1 X)-1"); M_DEBUG(R = get_corr_mat(glm->XCinvX, R), "Corr(beta)"); } /* if pred != GLS_BLP */ } /* if redo the heavy part */ if (pred != GLS_BLP && !UPDATE_BLP) { /* but BLUE or BLUP */ X0 = get_X0(d, X0, where, n_vars); M_DEBUG(X0, "X0 (X values at prediction location x0)"); blup = vm_mlt(X0, glm->beta, blup); /* X0' beta = beta'X0 -> vm_ */ if (pred == GLS_BLUP) V_DEBUG(blup, "BLUE(mu), E(y(x0)) = X0'beta"); } if (pred == GLS_BLUE) { /* we did the blue, it's in blup */ /* * BLUE = X0 beta; Cov(X0 beta)= X0'(X'C-1X)-1 X0 */ Tmp1 = mtrm_mlt(X0, glm->XCinvX, Tmp1); m_mlt(Tmp1, X0, MSPE); /* X0'(X'C-1X)-1 X0 */ fill_est(d, blup, MSPE, n_vars, est); debug_result(blup, MSPE, pred); P_FREE(piv); return; /* Quit function */ } /* * now the part that's got to be done every time, for x0 and where change: * resize matrices (BLP, BLUP): */ C0 = m_resize(C0, rows_C, n_vars); CinvC0 = m_resize(CinvC0, rows_C, n_vars); /* * fill C0: */ for (i = 0; i < n_vars; i++) { /* cols */ for (j = 0, start_j = 0; j < n_vars; j++) { /* rows */ v = get_vgm(LTI(d[i]->id, d[j]->id)); for (k = 0; k < d[j]->n_sel; k++) { if (pred == GLS_BLUP) ME(C0, start_j+k, i) = GCV0(v, d[j]->sel[k], where, d[j]->pp_norm2); else ME(C0, start_j+k, i) = COVARIANCE0(v, d[j]->sel[k], where, d[j]->pp_norm2); } start_j += d[j]->n_sel; } } /* if (d[0]->colnvmu) { X0 = get_X0(d, X0, where, n_vars); C0 = convert_vmuC0(C0, d[0], X0->me[0][0]); } */ if (d[0]->variance_fn) convert_C0(C0, glm->mu, glm->mu0, d[0]->variance_fn); M_DEBUG(C0, "Covariances (x_i, x_0), C0"); /* https://github.com/r-spatial/gstat/issues/80 : */ if (glm->C == NULL) { /* ErrMsg(ER_IMPOSVAL, "covariance matrix NULL;\nsee: https://github.com/r-spatial/gstat/issues/80"); */ pr_warning("C or X'C-1 X matrix singular at location [%g,%g,%g]: skipping...", where->x, where->y, where->z); set_mv_double(&est[0]); return; /* xxx: return NA's? */ } /* * calculate CinvC0: */ CinvC0 = CHsolve(glm->C, C0, CinvC0, piv); M_DEBUG(CinvC0, "C-1 C0"); if (pred == GLS_BLP || UPDATE_BLP) { /* * BLP = mu_0 + C0'C-1 (y-mu_i) */ V_DEBUG(glm->y, "data values y"); if (DEBUG_COV) { printlog("beta is:\n"); for (i = 0; i < n_vars; i++) for (j = 0; j < d[i]->beta->size; j++) printlog("%g%s", d[i]->beta->val[j], j == d[i]->beta->size - 1 ? "\n" : " "); } glm->mu = get_mu(glm->mu, glm->y, d, n_vars); V_DEBUG(glm->mu, "mean values (mu_i)"); /* y - mu_i: */ tmpa = v_resize(tmpa, rows_C); v_sub(glm->y, glm->mu, tmpa); V_DEBUG(tmpa, "Residual vector (y - mu_i)"); tmpb = vm_mlt(CinvC0, tmpa, tmpb); /* C0'C-1 (y-mu_i) */ V_DEBUG(tmpb, "Weighted res. vector, C0'C-1 (y-mu_i)"); v_add(blup, tmpb, blup); /* mu_0 + C0'C-1 (y-mu_i) */ /* * MSPE = C(0,0) - C0'C-1 C0 */ Tmp2 = mtrm_mlt(CinvC0, C0, Tmp2); /* C0'C-1 C0 */ /* if (d[0]->colnvmu) MSPE = convert_vmuC00(MSPE, X0->me[0][0]); */ if (d[0]->variance_fn) convert_MSPE(MSPE, glm->mu0, d[0]->variance_fn); m_sub(MSPE, Tmp2, MSPE); /* C(0,0) - C0'C-1 C0 */ fill_est(d, blup, MSPE, n_vars, est); debug_result(blup, MSPE, pred); P_FREE(piv); return; /* Quit function */ } /* * GLS_BLUP, universal kriging estimate remains: */ tmpa = mv_mlt(glm->X, glm->beta, tmpa); /* X beta */ tmpb = v_sub(glm->y, tmpa, tmpb); /* y - X beta */ tmpa = vm_mlt(CinvC0, tmpb, tmpa); /* c0'C-1 (Y - X beta) */ blup = v_add(blup, tmpa, blup); /* x0 beta + c0'C-1 (Y - X beta) */ /* * universal kriging MSPE: * (a) Cov_ij(0,0): */ for (i = 0; i < n_vars; i++) { for (j = 0; j <= i; j++) { v = get_vgm(LTI(d[i]->id, d[j]->id)); ME(MSPE, i, j) = ME(MSPE, j, i) = GCV0(v, where, where, d[j]->pp_norm2); } } M_DEBUG(MSPE, "[a] Cov_ij(B,B) or Cov_ij(0,0)"); /* * (c) (x0-X'C-1 c0)'(X'C-1X)-1 (x0-X'C-1 c0): */ Tmp1 = mtrm_mlt(glm->CinvX, C0, Tmp1); /* X'C-1 c0 */ Tmp1 = m_sub(X0, Tmp1, Tmp1); /* (x0 - X'C-1 c0) */ Tmp2 = m_copy(Tmp1, m_resize(Tmp2, Tmp1->m, Tmp1->n)); Tmp3 = m_mlt(glm->XCinvX, Tmp1, Tmp3); /* (X'C-1 X)-1 (x0 - X'C-1 c0) */ Tmp1 = mtrm_mlt(Tmp2, Tmp3, Tmp1); M_DEBUG(Tmp1, "[c] (x0-X'C-1 c0)'(X'C-1 X)-1(x0-X'C-1 c0)"); /* * (b) c0'C-1 c0: */ Tmp2 = mtrm_mlt(C0, CinvC0, Tmp2); M_DEBUG(Tmp2, "[b] c0'C-1 c0"); /* * (a - b + c) = * Cov_ij(0,0) - c0'C-1 c0 + (x0-X'C-1 c0)'(X'C-1 X)-1 (x0-X'C-1 c0): */ m_sub(MSPE, Tmp2, MSPE); /* a-b */ m_add(MSPE, Tmp1, MSPE); /* +c */ /* * done: */ fill_est(d, blup, MSPE, n_vars, est); debug_result(blup, MSPE, pred); if (DEBUG_COV) { /* calculate kriging weights explicitly: */ /* Tmp3' * glm->CinvX' + CinvC0 */ Tmp1 = m_mlt(glm->CinvX, Tmp3, Tmp1); Tmp2 = m_add(Tmp1, CinvC0, Tmp2); M_DEBUG(Tmp2, "kriging weights"); if (DEBUG_COV) printlog("\n\n"); } P_FREE(piv); return; } static void fill_est(DATA **d, VEC *blup, MAT *MSPE, int n_vars, double *est) { int i, j, n_filled; static IVEC *v = IVNULL; if (n_vars == 1) { est[0] = blup->ve[0]; est[1] = ME(MSPE, 0, 0); return; } v = iv_resize(v, n_vars); if (d == NULL) { /* GLS_BLP, initializing */ for (i = 0; i < n_vars; i++) v->ive[i] = i; n_filled = n_vars; } else { /* n_vars > 1: avoid possibly empty variables -> NA */ for (i = j = 0; i < n_vars; i++) { if (d[i]->n_sel > 0) { v->ive[j] = i; j++; } } n_filled = j; } for (i = 0; i < n_filled; i++) { /* only adress non-empty variables */ est[2 * v->ive[i]] = blup->ve[v->ive[i]]; est[2 * v->ive[i] + 1] = ME(MSPE, v->ive[i], v->ive[i]); for (j = 0; j < i; j++) est[2 * n_vars + LTI2(v->ive[i], v->ive[j])] = ME(MSPE, v->ive[i], v->ive[j]); } return; } static void debug_result(VEC *blup, MAT *MSPE, enum GLS_WHAT pred) { if (! DEBUG_COV) return; switch (pred) { case GLS_BLP: V_DEBUG(blup, "Best Linear Predictor"); M_DEBUG(MSPE, "Prediction Covariances"); break; case GLS_BLUE: V_DEBUG(blup, "Best Linear Unbiased Estimate (X0'beta)"); M_DEBUG(MSPE, "Estimation Covariances, Cov(X0'beta)"); break; case GLS_BLUP: V_DEBUG(blup, "Best Linear Unbiased Predictor"); M_DEBUG(MSPE, "MSPE ([a]-[b]+[c])"); break; case UPDATE: V_DEBUG(blup, "Updated predictor"); M_DEBUG(MSPE, "MSPE (updated)"); break; case GLS_INIT: ErrMsg(ER_IMPOSVAL, "invalid value for pred"); break; } } double *make_gls(DATA *d, int calc_residuals) { /* * if calc_residuals == 0, return value is allocated, but not freed */ int i, j, size; double *est = NULL; DATA **data; GLM *glm; glm = (GLM *) d->glm; if (glm == NULL) { data = get_gstat_data(); glm = (GLM *) data[0]->glm; } if (glm && glm->C) { /* renew: variogram may have changed */ m_free((MAT *) glm->C); glm->C = MNULL; } select_at(d, NULL); /* where == NULL --> global selection */ if (calc_residuals) { est = (double *) emalloc(get_n_outputs() * sizeof(double)); for (i = 0; i < d->n_list; i++) { gls(&d, 1, GLS_BLUE, d->list[i], est); glm = (GLM *) d->glm; d->list[i]->attr = glm->y->ve[i] - est[0]; } efree(est); est = NULL; } else { /* no residuals -- return beta & Cov(beta) */ size = d->n_X * (1 + d->n_X); est = (double *) emalloc(size * sizeof(double)); /* fill the GLM stuff: */ gls(&d, 1, GLS_BLUE, d->list[0], est); glm = (GLM *) d->glm; for (i = 0; i < glm->beta->dim; i++) { est[2 * i] = glm->beta->ve[i]; est[2 * i + 1] = ME(glm->XCinvX, i, i); for (j = 0; j < i; j++) est[2 * glm->beta->dim + LTI2(i,j)] = ME(glm->XCinvX, i, j); } } gls(NULL, 0, GLS_INIT, NULL, NULL); return est; /* possibly NULL */ } double *make_gls_mv(DATA **d, int n_vars) { /* * allocates memory for est (return value) but does not free it */ int i, j, sum_X, index, size = 0; double *est = NULL; GLM *glm; DPOINT where; for (i = sum_X = 0; i < n_vars; i++) { select_at(d[i], NULL); /* where == NULL --> global selection */ sum_X += d[i]->n_X; } where = *d[0]->list[0]; where.X = (double *) emalloc(sum_X * sizeof(double)); /* replace */ for (i = 0; i < sum_X; i++) /* fill with nonsense values: */ where.X[i] = 0.0; size = sum_X + (sum_X * (sum_X + 1))/2; est = (double *) emalloc(size * sizeof(double)); /* fill the GLM stuff: */ gls(d, n_vars, GLS_BLUE, &where, est); glm = (GLM *) d[0]->glm; assert(glm != NULL); for (i = 0; i < glm->beta->dim; i++) { assert((2 * i + 1) < size); est[2 * i] = glm->beta->ve[i]; est[2 * i + 1] = ME(glm->XCinvX, i, i); for (j = 0; j < i; j++) { index = 2 * glm->beta->dim + LTI2(i,j); assert(index < size); est[index] = ME(glm->XCinvX, i, j); } } gls(NULL, 0, GLS_INIT, NULL, NULL); efree(where.X); return est; } static GLM *new_glm(void) { GLM *glm; glm = (GLM *) emalloc(sizeof(GLM)); glm->X = glm->C = glm->CinvX = glm->XCinvX = MNULL; glm->y = glm->mu = glm->mu0 = glm->beta = VNULL; return glm; } void free_glm(void *v_glm) { GLM *glm; if (v_glm == NULL) return; glm = (GLM *) v_glm; if (glm->X) m_free(glm->X); if (glm->C) m_free(glm->C); if (glm->CinvX) m_free(glm->CinvX); if (glm->XCinvX) m_free(glm->XCinvX); if (glm->y) v_free(glm->y); if (glm->beta) v_free(glm->beta); if (glm->mu0) v_free(glm->mu0); if (glm->mu) v_free(glm->mu); efree(glm); } static void convert_C(MAT *C, VEC *mu, double (*fn)(double)) { int i, j; double sqrtfni; assert(C && mu); assert(C->m == mu->dim); for (i = 0; i < mu->dim; i++) { /* assert(mu->ve[i] >= 0.0); */ /* be more friendly: */ if (mu->ve[i] < 0.0) ErrMsg(ER_IMPOSVAL, "can not take square root of negative mean values!"); ME(C, i, i) *= fn(mu->ve[i]); sqrtfni = sqrt(fn(mu->ve[i])); for (j = 0; j < i; j++) ME(C, i, j) *= sqrtfni * sqrt(fn(mu->ve[j])); } } static void convert_C0(MAT *C0, VEC *mu, VEC *mu0, double (*fn)(double)) { int i, j; double sqrtfni; assert(C0 && mu && mu0); assert(C0->m == mu->dim); assert(C0->n == mu0->dim); for (i = 0; i < mu->dim; i++) { assert(mu->ve[i] >= 0.0); sqrtfni = sqrt(fn(mu->ve[i])); for (j = 0; j < mu0->dim; j++) ME(C0, i, j) *= sqrtfni * sqrt(fn(mu0->ve[j])); } } static void convert_MSPE(MAT *MSPE, VEC *mu0, double (*fn)(double)) { int i, j; double sqrtfni; assert(MSPE && mu0); assert(MSPE->m == mu0->dim); for (i = 0; i < mu0->dim; i++) { assert(mu0->ve[i] >= 0.0); ME(MSPE, i, i) *= fn(mu0->ve[i]); sqrtfni = sqrt(fn(mu0->ve[i])); for (j = 0; j < i; j++) { ME(MSPE, i, j) *= sqrtfni * sqrt(fn(mu0->ve[j])); ME(MSPE, j, i) = ME(MSPE, i, j); } } } static VEC *get_mu(VEC *mu, const VEC *y, DATA **d, int n_vars) { int i, start_j, j; mu = v_resize(mu, y->dim); for (i = start_j = 0; i < n_vars; i++) { for (j = 0; j < d[i]->n_sel; j++) mu->ve[start_j + j] = calc_mu(d[i], d[i]->sel[j]); start_j += d[i]->n_sel; } return mu; } static MAT *get_corr_mat(MAT *C, MAT *R) { int i, j; assert(C); assert(C->m == C->n); R = m_copy(C, m_resize(R, C->m, C->n)); for (i = R->m - 1; i >= 0; i--) { assert(ME(R, i, i) > 0.0); for (j = 0; j < i; j++) ME(R, i, j) /= sqrt(ME(R, i, i) * ME(R, j, j)); for (j = i + 1; j < R->m; j++) ME(R, i, j) = ME(R, j, i); } for (i = 0; i < R->m; i++) ME(R, i, i) = 1.0; return(R); } gstat/src/init.c0000644000176200001440000000435014646417261013307 0ustar liggesusers#include #include #include // for NULL #include extern SEXP gstat_init(SEXP s_debug_level); extern SEXP gstat_load_ev(SEXP np, SEXP dist, SEXP gamma); extern SEXP gstat_fit_variogram(SEXP fit, SEXP fit_sill, SEXP fit_range); extern SEXP gstat_exit(SEXP x); extern SEXP gstat_new_data(SEXP sy, SEXP slocs, SEXP sX, SEXP has_intercept, SEXP beta, SEXP nmax, SEXP nmin, SEXP maxdist, SEXP force, SEXP vfn, SEXP sw, SEXP grid, SEXP degree, SEXP is_projected, SEXP vdist, SEXP lambda, SEXP omax); extern SEXP gstat_new_dummy_data(SEXP loc_dim, SEXP has_intercept, SEXP beta, SEXP nmax, SEXP nmin, SEXP maxdist, SEXP vfn, SEXP is_projected, SEXP vdist); extern SEXP gstat_debug_level(SEXP level); extern SEXP gstat_load_variogram(SEXP s_ids, SEXP s_model, SEXP s_sills, SEXP s_ranges, SEXP s_kappas, SEXP s_anis_all, SEXP s_table, SEXP s_max_val); extern SEXP gstat_predict(SEXP sn, SEXP slocs, SEXP sX, SEXP block_cols, SEXP block, SEXP weights, SEXP nsim, SEXP blue); extern SEXP gstat_set_method(SEXP to); extern SEXP gstat_set_set(SEXP arg, SEXP val); extern SEXP gstat_set_merge(SEXP a, SEXP b, SEXP c, SEXP d); extern SEXP gstat_variogram(SEXP s_ids, SEXP cutoff, SEXP width, SEXP direction, SEXP cressie, SEXP dX, SEXP boundaries, SEXP grid, SEXP cov, SEXP pseudo); extern SEXP gstat_variogram_values(SEXP ids, SEXP pars, SEXP covariance, SEXP dist_values); extern SEXP gstat_get_variogram_models(SEXP dolong); #define CALLDEF(name, n) {#name, (DL_FUNC) &name, n} const static R_CallMethodDef R_CallDef[] = { CALLDEF(gstat_init, 1), CALLDEF(gstat_load_ev, 3), CALLDEF(gstat_fit_variogram, 3), CALLDEF(gstat_exit, 1), CALLDEF(gstat_new_data, 17), CALLDEF(gstat_new_dummy_data, 9), CALLDEF(gstat_debug_level, 1), CALLDEF(gstat_load_variogram, 8), CALLDEF(gstat_predict, 8), CALLDEF(gstat_set_method, 1), CALLDEF(gstat_set_set, 2), CALLDEF(gstat_set_merge, 4), CALLDEF(gstat_variogram, 10), CALLDEF(gstat_variogram_values, 4), CALLDEF(gstat_get_variogram_models, 1), {NULL, NULL, 0} }; void // attribute_visible // optional R_init_gstat(DllInfo *dll) { R_registerRoutines(dll, NULL, R_CallDef, NULL, NULL); R_useDynamicSymbols(dll, FALSE); R_forceSymbols(dll, TRUE); } gstat/src/lm.c0000644000176200001440000003175314646417261012763 0ustar liggesusers/* * lm.c: contains routines for linear model y=Xb+e, e independent. */ #include #include /* size_t for DJGPP */ #include /* DBL_MAX */ #include /* sqrt() */ #include "mtrx.h" #include "defs.h" #include "userio.h" #include "data.h" #include "utils.h" #include "debug.h" #include "select.h" #include "glvars.h" #include "lm.h" static void predict_lm(LM *lms, MAT *X0, double *est); static void create_lm(DATA **d, int nvars); static VEC *get_weights(DATA **d, VEC *weights, int nvars); static int get_colX_nr(DATA **d, int var, int x); static int zero_weights_count(LM *lm); void pred_lm(DATA **data, int n_vars, DPOINT *where, double *est) { int i = 0, global = 1; LM *lm; static MAT *X0 = MNULL; global = 1; while (global && i < n_vars) { if (data[i]->sel != data[i]->list) /* local selection */ global = 0; /* and jump out of this loop */ i++; } if (data[0]->lm == NULL || !global) { create_lm(data, n_vars); if (DEBUG_FIT) { printlog("at location [%g,%g,%g]:\n", where->x, where->y, where->z); logprint_lm(data[0], data[0]->lm); } } lm = (LM *) data[0]->lm; if (lm == NULL || lm->y->dim == 0 || lm->is_singular) { for (i = 0; i < n_vars; i++) { set_mv_double(&(est[2 * i])); set_mv_double(&(est[2 * i + 1])); } if (lm && lm->is_singular) pr_warning("singular X matrix at x[%g], y[%g], z[%g]:", where->x, where->y, where->z); } else { X0 = get_X0(data, X0, where, n_vars); if (DEBUG_COV) { printlog("#X0 is "); m_logoutput(X0); } predict_lm(lm, X0, est); } return; } double *make_ols(DATA *d) { /* return value is allocated, but not freed */ int i, j, size; double *est = NULL; DATA **data; LM *lm; lm = (LM *) d->lm; if (lm == NULL) { data = get_gstat_data(); lm = (LM *) data[0]->lm; } select_at(d, NULL); /* where == NULL --> global selection */ /* return beta & Cov(beta) */ size = d->n_X * (1 + d->n_X); est = (double *) emalloc(size * sizeof(double)); for (i = 0; i < size; i++) set_mv_double(&(est[i])); /* fill the LM stuff: */ create_lm(&d, 1); if (DEBUG_FIT) logprint_lm(d, d->lm); lm = (LM *) d->lm; if (lm->is_singular) return est; /* all NA's */ for (i = 0; i < lm->beta->dim; i++) { est[2 * i] = lm->beta->ve[i]; est[2 * i + 1] = ME(lm->Cov, i, i); for (j = 0; j < i; j++) est[2 * lm->beta->dim + LTI2(i,j)] = ME(lm->Cov, i, j); } free_lm(d->lm); d->lm = NULL; return est; } LM *init_lm(LM *lm) { if (lm == NULL) lm = (LM *) emalloc(sizeof(LM)); lm->y = VNULL; lm->weights = VNULL; lm->beta = VNULL; lm->Xty = VNULL; lm->X = MNULL; lm->Cov = MNULL; lm->Chol = MNULL; lm->SSReg = lm->MSReg = DBL_MAX; lm->SSErr = lm->MSErr = DBL_MAX; lm->is_singular = 0; return lm; } void free_lm(LM *lm) { if (lm->y) v_free(lm->y); if (lm->weights) v_free(lm->weights); if (lm->beta) v_free(lm->beta); if (lm->Xty) v_free(lm->Xty); if (lm->X) m_free(lm->X); if (lm->Chol) m_free(lm->Chol); if (lm->Cov) m_free(lm->Cov); efree(lm); } static void create_lm(DATA **data, int nvars) { /* * obtain base necessities (y, X, weights), and calculate the rest */ LM *lm; int i; lm = (LM *) data[0]->lm; if (lm == NULL) /* create */ data[0]->lm = lm = init_lm(NULL); lm->X = get_X(data, lm->X, nvars); lm->y = get_y(data, lm->y, nvars); lm->weights = get_weights(data, lm->weights, nvars); /* * check for intercept: */ if (nvars == 1) { lm->has_intercept = (data[0]->colX[0] == 0); for (i = 1; i < data[0]->n_X && ! lm->has_intercept; i++) lm->has_intercept = (data[0]->colX[i] == 0); } /* * calculate: */ data[0]->lm = (void *) calc_lm(lm); return; } void make_residuals_lm(DATA *d) { /* * make (local or global) residuals */ int i; double est[2]; static MAT *X0 = MNULL; if (d->is_residual) return; if (d->beta) { /* pr_warning("calculating residuals with respect to pre-defined mean"); */ for (i = 0; i < d->n_list; i++) d->list[i]->attr -= calc_mu(d, d->list[i]); } else { select_at(d, NULL); create_lm(&d, 1); if (DEBUG_FIT) logprint_lm(d, d->lm); for (i = 0; i < d->n_list; i++) { X0 = get_X0(&d, X0, d->list[i], 1); predict_lm((LM *) d->lm, X0, est); d->list[i]->attr -= est[0]; /* y = Xb + e, so e^ = y - Xb^ */ } } d->is_residual = 1; return; } static void predict_lm(LM *lm, MAT *X0, double *est) { /* * make a prediction for x0, store pred. and variance in est[0] and est[1] */ VEC *blup = VNULL; MAT *tmp = MNULL, *ans = MNULL; if (lm->beta == NULL) ErrMsg(ER_IMPOSVAL, "lm->beta NULL: sample too small?"); blup = vm_mlt(X0, lm->beta, blup); /* X0' beta = beta'X0 -> vm_ */ /* * Cov(y0^ - y0) = x0'X'X-1 x0 MSErr, or x0'(X'WX)-1 x0 MSErr * for this, solve X'X b = x0 for b, then b = X'X-1 x0; ans = x0'b * MSErr added when prediction is pointwise */ tmp = CHsolve(lm->Chol, X0, tmp, PNULL); ans = mtrm_mlt(X0, tmp, ans); ans = sm_mlt(lm->MSErr, ans, ans); for (int i = 0; i < ans->m; i++) { est[2 * i] = blup->ve[i]; est[2 * i + 1] = ME(ans, i, i); if (max_block_dimension(1) == 0.0) /* pointwise prediction */ est[2 * i + 1] += lm->MSErr; for (int j = 0; j < i; j++) est[2 * ans->m + LTI2(i,j)] = ME(ans, i, j); } v_free(blup); m_free(tmp); m_free(ans); return; } MAT *get_X(DATA **d, MAT *X, int nvars) { int i, j, k, rows, cols, colX; for (i = rows = cols = 0; i < nvars; i++) { rows += d[i]->n_sel; if (d[i]->n_sel > 0) cols += d[i]->n_X - d[i]->n_merge; } /* if (rows <= 0 || cols <= 0) ErrMsg(ER_IMPOSVAL, "get_X: size <= 0"); */ X = m_resize(X, rows, cols); m_zero(X); for (i = rows = 0; i < nvars; i++) { /* i: var block index */ for (j = 0; d[i]->n_sel && j < d[i]->n_X; j++) { /* j: column index */ colX = get_colX_nr(d, i, j); for (k = 0; k < d[i]->n_sel; k++) /* k: row index */ ME(X, rows + k, colX) = d[i]->sel[k]->X[j]; } rows += d[i]->n_sel; } return X; } MAT *get_X0(DATA **d, MAT *X0, DPOINT *where, int nvars) { int i, j, start_i, cols, colX; for (i = cols = 0; i < nvars; i++) { if (d[i]->n_sel > 0) cols += d[i]->n_X - d[i]->n_merge; } X0 = m_resize(X0, cols, nvars); m_zero(X0); /* initialize; now fill non-zero entries: */ for (i = start_i = 0; i < nvars; i++) { for (j = 0; d[i]->n_sel && j < d[i]->n_X; j++) { /* for X-column k+.. */ colX = get_colX_nr(d, i, j); ME(X0, colX, i) = where->X[start_i+j]; /* colX is row index: X0' */ } start_i += d[i]->n_X; } return X0; } VEC *get_y(DATA **d, VEC *y, int nvars) { int i, j, offset, size; for (i = size = 0; i < nvars; i++) size += d[i]->n_sel; /* if (size <= 0) ErrMsg(ER_IMPOSVAL, "get_X: size <= 0"); */ y = v_resize(y, size); for (j = offset = 0; j < nvars; j++) { for (i = 0; i < d[j]->n_sel; i++) y->ve[offset + i] = d[j]->sel[i]->attr; offset += d[j]->n_sel; } return y; } static int get_colX_nr(DATA **d, int var, int this_x) { int offset_x = 0, colX, i, j; for (i = 0; i < var; i++) if (d[i]->n_sel) offset_x += d[i]->n_X - d[i]->n_merge; if (d[var]->n_merge == 0) return offset_x + this_x; for (i = 0; i < d[var]->n_merge; i++) { if (d[var]->mtbl[i].col_this_X == this_x) { /* hit: merge this one! */ colX = d[var]->mtbl[i].col_other_X; if (d[var]->mtbl[i].to_var > 0) for (j = 0; j < d[var]->mtbl[i].to_var - 1; j++) colX += d[j]->n_X - d[j]->n_merge; return colX; } } /* so, we're at least at offset_x, but how much should we add? */ colX = offset_x + this_x; /* i.e. the maximum... */ for (i = 0; i < d[var]->n_merge; i++) for (j = 0; j < this_x; j++) if (d[var]->mtbl[i].col_this_X == j) colX--; /* ...minus all previously merged entries */ return colX; } static VEC *get_weights(DATA **d, VEC *weights, int nvars) { int i, j, size; for (i = size = 0; i < nvars; i++) { if (d[i]->colnvariance <= 0) /* no weights */ return VNULL; if (d[i]->n_sel > 0) size += d[i]->n_sel; } if (size <= 0) return VNULL; weights = v_resize(weights, size); for (i = size = 0; i < nvars; i++) { for (j = 0; j < d[i]->n_sel; j++) weights->ve[size + j] = 1.0 / d[i]->sel[j]->variance; /* ->variance > 0 is assured in data.c */ size += d[i]->n_sel; } return weights; } void logprint_lm(DATA *d, LM *lm) { double SSTot; char line[] = "-----------------------------------------------------------"; int i, coords = 0; if (lm->dfReg <= 0) return; SSTot = lm->SSReg + lm->SSErr; if (d != NULL) { printlog("\nmodel: %s = ", d->variable); for (i = 0; i < d->n_X; i++) { if (i > 0) { printlog(" + "); if ((i + 2) % 5 == 0) printlog("\n"); } printlog("%g", lm->beta->ve[i]); if (d->colX[i] > 0) printlog(" [col %d]", d->colX[i]); if (d->colX[i] < 0) { printlog(" %s", POLY_NAME(d->colX[i])); coords = 0; } } printlog(" + e\n"); if (coords) printlog( "(Note: coordinate coefficients apply to normalized coordinates)\n\n"); } printlog("Summary statistics (model %s intercept):\n", lm->has_intercept ? "with" : "without"); printlog("Source df SS MS F\n"); printlog("%s\n", line); printlog("Regression %3d %12.6g %12.6g", lm->dfReg, lm->SSReg, lm->MSReg); if (lm->MSErr <= 0.0) printlog(" Inf\n"); else printlog(" %12.6g\n", lm->MSReg/lm->MSErr); printlog("Error %3d %12.6g %12.6g\n", lm->dfE, lm->SSErr, lm->MSErr); printlog("%s\nTotal, %s %3d %12.6g\n%s\n\n", line, lm->has_intercept ? "corrected" : "uncorr. ", lm->dfReg + lm->dfE, SSTot, line); /* if (SSTot > 0.0) printlog("R2: %g\n", lm->SSReg / SSTot); */ return; } LM *calc_lm(LM *lm) { /* * calculate Chol,Xty,beta,SSErr,SSReg,MSErr^... * ASSUMES lm->X, lm->y and optionally lm->weights to be filled! */ double y_mean = 0, w; int i, j; /* static MAT *QR = MNULL; */ static VEC *tmp = VNULL; if (lm->X == MNULL || lm->y == VNULL) ErrMsg(ER_NULL, "calc_lm(): y or X"); if (lm->X->m != lm->y->dim) { message("size: %d %d %d\n", lm->X->m, lm->y->dim, lm->X->n); ErrMsg(ER_IMPOSVAL, "calc_lm: matrices wrong size"); } if (lm->X->m < lm->X->n) { lm->is_singular = 1; return lm; } /* * allocate structures: */ lm->is_singular = 0; lm->beta = v_resize(lm->beta, lm->X->n); lm->Xty = v_resize(lm->Xty, lm->X->n); tmp = v_resize(tmp, lm->X->n); if (lm->X->n == 0 || lm->y->dim == 0) return lm; if (DEBUG_COV) { printlog("#y is "); v_logoutput(lm->y); printlog("#X is "); m_logoutput(lm->X); if (lm->weights) { printlog("#w is "); v_logoutput(lm->weights); } } /* * create, in case of weights, V^{-1/2}X and V^{-1/2}y: */ if (lm->weights != VNULL) { for (i = 0; i < lm->X->m; i++) { /* rows */ w = sqrt(lm->weights->ve[i]); for (j = 0; j < lm->X->n; j++) /* cols */ ME(lm->X, i, j) *= w; lm->y->ve[i] *= w; } } /* * create Chol = X'X (or X'WX) and XtY = (y'X)' = X'y (X'Wy) */ lm->Xty = vm_mlt(lm->X, lm->y, lm->Xty); if (DEBUG_COV) { printlog("#X'y is "); v_logoutput(lm->Xty); } lm->Chol = mtrm_mlt(lm->X, lm->X, lm->Chol); if (DEBUG_COV) { printlog("#X'X is "); m_logoutput(lm->Chol); } lm->Cov = m_copy(lm->Chol, lm->Cov); /* save copy of X'X */ int info; lm->Chol = CHfactor(lm->Chol, PNULL, &info); if (info != 0) { lm->is_singular = 1; return lm; } lm->beta = CHsolve1(lm->Chol, lm->Xty, lm->beta, PNULL); if (DEBUG_COV) { printlog("#beta is "); v_logoutput(lm->beta); } /* * estimate error variance: */ tmp = mv_mlt(lm->X, lm->beta, tmp); /* X b */ tmp = v_sub(lm->y, tmp, tmp); /* e = y - X b */ if (lm->weights) { for (i = 0, lm->SSErr = 0.0; i < lm->X->m; i++) lm->SSErr += lm->weights->ve[i] * SQR(tmp->ve[i]); } else lm->SSErr = in_prod(tmp, tmp); /* e'e */ if (DEBUG_COV) printlog("#SSErr is %g\n", lm->SSErr); /* * estimate SSReg (Draper & Smith, p. 81, Section 2.2) * (unweighted, corrected): beta' X'X beta - n * y_mean^2 * (weighted, corrected): sum weight_i * (x_i beta - beta_0)^2 * (unweighted): beta' X'X beta * (weighted): see below */ tmp = v_resize(tmp, lm->X->n); tmp = vm_mlt(lm->Cov, lm->beta, tmp); lm->SSReg = in_prod(lm->beta, tmp); if (lm->has_intercept) { for (i = 0, y_mean = 0.0; i < lm->y->dim; i++) y_mean += lm->y->ve[i]; y_mean /= lm->y->dim; lm->SSReg -= SQR(y_mean) * lm->y->dim; } lm->dfReg = lm->X->n; if (lm->has_intercept) lm->dfReg -= 1; if (lm->dfReg > 0) lm->MSReg = lm->SSReg/lm->dfReg; else lm->MSReg = DBL_MAX; lm->dfE = lm->X->m - zero_weights_count(lm) - lm->X->n; if (lm->dfE == 0) lm->MSErr = DBL_MAX; else lm->MSErr = lm->SSErr/lm->dfE; lm->Cov = m_inverse(lm->Cov, &info); /* (X'X)-1 */ if (info != 0) pr_warning("linear model has singular covariance matrix"); /* next, multiply with sigma^2 */ sm_mlt(lm->MSErr, lm->Cov, lm->Cov); /* in situ mlt */ return lm; } static int zero_weights_count(LM *lm) { int i, n_zero = 0; if (lm->weights == VNULL) return 0; for (i = 0; i < lm->weights->dim; i++) if (lm->weights->ve[i] < gl_zero) n_zero++; return n_zero; } double calc_mu(const DATA *d, const DPOINT *where) { int i; double mu, *from; assert(d->beta); mu = 0.0; from = where->X; for (i = 0; i < d->beta->size; i++) mu += from[i] * d->beta->val[i]; return mu; } gstat/src/glvars.h0000644000176200001440000000516314646417261013652 0ustar liggesusers#ifndef GLVARS_H # define GLVARS_H /* avoid multiple inclusion */ typedef enum { NSP = 0, /* initial value */ UIF, /* variogram modelling user interface */ OKR, UKR, SKR, /* ordinary, universal or simple kriging */ IDW, /* inverse distance interpolation */ MED, /* (local) sample median or quantile */ NRS, /* neighbourhood size */ LSLM, /* uncorrelated (or weighted) linear model */ GSI, ISI, /* Gaussian/indicator (conditional) simulation */ SEM, COV, /* sample (cross) semivariance or covariance */ SPREAD, /* distance to nearest sample */ DIV, /* diversity, range */ SKEW, /* skewness, kurtosis */ LSEM, /* locally fitted semivariogram parameters */ TEST /* does nothing really */ } METHOD; typedef struct { METHOD m; int is_simulation; const char *name; } METHODS; extern const METHODS methods[]; typedef enum { MODE_NSP = 0, SIMPLE, STRATIFY, MULTIVARIABLE } MODE; #if defined(__cplusplus) extern "C" { #endif int init_global_variables(void); const char *get_outfile_namei(int i); const char **get_outfile_name(void); int dump_all(void); void check_global_variables(void); const char *method_string(METHOD i); int get_n_vars(void); int get_n_vgms(void); int get_n_outputs(void); int get_n_beta_set(void); int which_identifier(const char *id); const char *name_identifier(int i); void push_bound(double value); void set_method(METHOD); int is_simulation(METHOD m); METHOD get_default_method(void); METHOD get_method(void); void set_mode(void); MODE get_mode(void); double max_block_dimension(int reset); int n_variograms_set(void); int decide_on_coincide(void); int remove_id(const int id); void remove_all(void); #ifdef VARIO_H /* vario.h was included before this point: */ VARIOGRAM *get_vgm(int i); #endif #ifdef DATA_H /* data.h was included before this point: */ DATA **get_gstat_data(void); DATA *get_dataval(void); DATA *get_data_area(void); DATA *create_data_area(void); DPOINT *get_block_p(void); void setup_valdata_X(DATA *d); #endif #if defined(__cplusplus) } #endif extern int gl_nblockdiscr, gl_seed, gl_n_uk, gl_cressie, gl_zero_est, gl_fit, gl_iter, gl_xvalid, gl_gauss, gl_sym_ev, gl_jgraph, gl_blas, gl_order, gl_n_intervals, gl_gls_residuals, gl_asym_vgm, gl_numbers, gl_nsim, gl_lhs, gl_longlat, gl_n_marginals, gl_sparse, gl_rp, gl_coincide, gl_nocheck, gl_spiral, gl_secure, gl_split, gl_register_pairs, gl_sim_beta, gl_rowwise, gl_choleski; extern double gl_rho, gl_idp, gl_cutoff, gl_iwidth, gl_zmap, gl_quantile, gl_fit_limit, gl_fraction, gl_alpha, gl_beta, gl_tol_hor, gl_tol_ver, *gl_bounds, *gl_marginal_values, gl_zero, gl_zero2; extern const char *method_code[]; #endif /* GLVARS_H */ gstat/src/select.h0000644000176200001440000000004714646417261013627 0ustar liggesusersint select_at(DATA *d, DPOINT *where); gstat/src/Makevars0000644000176200001440000000011414662101734013657 0ustar liggesusersPKG_LIBS = $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) PKG_CPPFLAGS = -DR_NO_REMAP gstat/src/direct.h0000644000176200001440000000022314646417261013616 0ustar liggesusersdouble valid_direction(DPOINT *a, DPOINT *b, int symmetric, const DATA *d); void set_direction_values(double a, double b, double t_h, double t_v); gstat/src/vario.h0000644000176200001440000001470114646417261013472 0ustar liggesusers#ifndef VARIO_H # define VARIO_H /* avoid multiple inclusion */ typedef enum { NOTSPECIFIED = 0, SEMIVARIOGRAM, CROSSVARIOGRAM, COVARIOGRAM, CROSSCOVARIOGRAM, PRSEMIVARIOGRAM /* pairwise relative semivariogram */ } SAMPLE_VGM_TYPE; extern const char *vgm_type_str[]; #define LENGTH_OF_MODEL 100 /* max string length for one variogram model */ typedef enum { ZERO_DEFAULT = 0, ZERO_INCLUDE, ZERO_AVOID, ZERO_SPECIAL } DO_AT_ZERO; typedef struct { double tm[3][3]; /* 3D-transformation matrix */ double angle[3]; /* angle in , ccl from pos x; angle up; rot. angle */ double ratio[2]; /* ratio axis2:axis1, ratio axis axis3:axis1 */ } ANIS_TM; typedef enum { NO_FIT = 0, WLS_FIT = 1, WLS_FIT_MOD = 2, /* 3, 4: gnuplot fits not supported */ MIVQUE_FIT = 5, OLS_FIT = 6, WLS_NHH = 7 } FIT_TYPE; typedef struct { int n_est, n_max, cloud, plot_numbers, is_asym; int recalc, refit, pseudo, is_directional; double *gamma, *dist; unsigned long *nh; double cutoff, iwidth; SAMPLE_VGM_TYPE evt; FIT_TYPE fit; DO_AT_ZERO zero; void *map, /* variogram map structure, i/o using files */ *S_grid /* variogram map structure, passed from S interface*/ ; struct { double x, y, z; } direction; DPOINT ***pairs; /* optionally, the point pair list -- for j in [ 0, nh[i] > ((DPOINT ***)pairs)[i][j*2] and its successor are two pointers to a pair of data points that were used to calculate gamma[i]. The length of pairs is (at least) nh[i] * 2. See register_pairs() */ } SAMPLE_VGM; /* a sample variogram */ typedef enum { NOT_SP = 0, NUGGET, EXPONENTIAL, SPHERICAL, GAUSSIAN, EXCLASS, MATERN, STEIN, CIRCULAR, LINEAR, BESSEL, PENTASPHERICAL, PERIODIC, WAVE, HOLE, LOGARITHMIC, POWER, SPLINE, LEGENDRE, MERROR, INTERCEPT } VGM_MODEL_TYPE; typedef struct { VGM_MODEL_TYPE model; const char *name, *name_long; double (*fn)(double h, double *r), /* variogram value at h of basic model */ (*da_fn)(double h, double *r); /* it's derivative to the range parm. */ } V_MODEL; extern const V_MODEL v_models[]; #define NRANGEPARS 2 /* max number of range parameters in variogram models */ typedef struct { VGM_MODEL_TYPE model; int fit_sill, fit_range, id; double range[NRANGEPARS], sill, (*fnct)(double h, double *r), /* (partial) unit variogram function */ (*da_fnct)(double h, double *r); /* (partial) derivative to range of unit variogram */ ANIS_TM *tm_range; } VGM_MODEL; typedef struct { long n; /* length */ double maxdist, *values; ANIS_TM *tm_range; } COV_TABLE; #define COV_TABLE_VALUE(tablep, dist) \ (dist >= tablep->maxdist ? tablep->values[tablep->n - 1] : \ tablep->values[(int) (tablep->n * (dist / tablep->maxdist))]) #define SEM_TABLE_VALUE(tablep, dist) \ (tablep->values[0] - COV_TABLE_VALUE(tablep, dist)) typedef struct { int n_models, max_n_models, n_fit, id, id1, id2, block_semivariance_set, block_covariance_set, isotropic, is_valid_covariance, fit_is_singular; VGM_MODEL *part; /* the basic models */ COV_TABLE *table; /* covariance value table */ double block_semivariance, /* average within-block semivariance */ block_covariance, /* average within-block covariance */ max_range, /* maximum range: where sill is reached */ sum_sills, /* sum of partial sill's */ measurement_error, /* measurement error value--def. zero */ max_val, /* maximum value that is ever reached */ min_val, /* minimum value that is ever reached */ SSErr; /* fit result */ SAMPLE_VGM *ev; } VARIOGRAM; #define dist2(x,y,z) (x*x+y*y+z*z) #define TM_IS3D(tm) \ (tm->angle[1] != 0.0 || tm->angle[2] != 0.0 || tm->ratio[1] < 1.0) #define relative_norm(v,x,y,z) ((v == NULL || dist2(x,y,z) == 0.0) ? 1.0 : \ (transform_norm(NULL,x,y,z)/transform_norm(v,x,y,z))) #define UnitCovariance(part,x,y,z) \ (part.model == INTERCEPT ? (1.0) :\ (1.0 - part.fnct(transform_norm(part.tm_range,x,y,z), part.range))) #define UnitSemivariance(part,x,y,z) \ (part.fnct(transform_norm(part.tm_range,x,y,z), part.range)) #define Covariance(part,x,y,z) (part.sill * UnitCovariance(part,x,y,z)) #define Semivariance(part,x,y,z) (part.sill * UnitSemivariance(part,x,y,z)) #define DA_DELTA 0.001 #define da_Semivariance(part,x,y,z) \ (part.da_fnct != NULL ? \ (part.sill * part.da_fnct(transform_norm(part.tm_range,x,y,z), part.range)) : \ da_general(&(part), transform_norm(part.tm_range, x,y,z))) /* (part.sill * \ (part.fnct(transform_norm(part.tm_range,x,y,z), part.range * (1.0 + DA_DELTA)) - \ part.fnct(transform_norm(part.tm_range,x,y,z), part.range * (1.0 - DA_DELTA))) \ / (2 * part.range * DA_DELTA))) */ #define EPSILON 1.0e-30 /* for small, non-zero anisotropy ratios */ #define is_covariogram(v) \ ((v->ev->evt==COVARIOGRAM||v->ev->evt==CROSSCOVARIOGRAM)) #define is_variogram(v) \ ((v->ev->evt==SEMIVARIOGRAM||v->ev->evt==CROSSVARIOGRAM)) #define is_direct(v) \ ((v->ev->evt==COVARIOGRAM||v->ev->evt==SEMIVARIOGRAM)) #define is_cross(v) \ ((v->ev->evt==CROSSCOVARIOGRAM||v->ev->evt==CROSSVARIOGRAM)) #define MODELHASNORANGE(m) (m == NUGGET || m == INTERCEPT) #define PARTHASNORANGE(m) (m->model == NUGGET || m->model == INTERCEPT || \ (m->model == LINEAR && m->range == 0.0)) #if defined(__cplusplus) extern "C" { #endif extern const char *v_model_gnuplot[]; extern const char *v_model_names[]; extern const char *c_model_gnuplot[]; VARIOGRAM *init_variogram(VARIOGRAM *v); SAMPLE_VGM *init_ev(void); void vgm_init_block_values(VARIOGRAM *v); void free_variogram(VARIOGRAM *v); void logprint_variogram(const VARIOGRAM *v, int verbose); void fprint_variogram(FILE *f, const VARIOGRAM *v, int verbose); const char *sprint_variogram(const VARIOGRAM *v, int verbose); double get_semivariance(const VARIOGRAM *v, double dx, double dy, double dz); double get_covariance (const VARIOGRAM *v, double dx, double dy, double dz); double transform_norm(const ANIS_TM *tm, double dx, double dy, double dz); void check_variography(const VARIOGRAM **v, int n); void update_variogram(VARIOGRAM *vp); double get_max_sills(int n); double da_general(VGM_MODEL *p, double h); int push_variogram_model(VARIOGRAM *v, VGM_MODEL part); VGM_MODEL_TYPE which_variogram_model(const char *m); double relative_nugget(VARIOGRAM *v); int vario(int argc, char **argv); DO_AT_ZERO zero_int2enum(int zero); void push_to_v(VARIOGRAM *v, const char *mod, double sill, double *range, int nrangepars, double *d, int fit_sill, int fit_range); void push_to_v_table(VARIOGRAM *v, double maxdist, int length, double *values, double *anis); #if defined(__cplusplus) } #endif #endif /* VARIO_H */ gstat/src/direct.c0000644000176200001440000000727014646417261013622 0ustar liggesusers/* * direction.c: evaluation of directions for variogram pair inclusion * Optimized by Konstantin Malakhanov (K.M.), march 1998 */ #include /* cos() */ #include "defs.h" #include "userio.h" #include "data.h" #include "utils.h" #include "debug.h" #include "defaults.h" #include "glvars.h" #include "direct.h" #define MAX_ANG (PI/2.0) /* * direct's little private data base: */ static double alpha = 0.0, beta = 0.0, tol_hor = PI, tol_ver = PI, cos_tol_hor = -1.0, cos_tol_ver = -1.0, /* Changed K.M. Fri Feb 27 11:13:47 1998 */ dir_v[2] = { 1.0, 0.0 } , dir_h[2] = { 0.0, 1.0 }; static int all_directions = -1; void set_direction_values(double a, double b, double t_h, double t_v) { /* do some checks: */ if (a < 0.0 || a > 360.0) pr_warning( "alpha must be in [0..360]"); if (b < 0.0 || b > 360.0) pr_warning( "beta must be in [0..360]"); if (t_h < 0.0 || t_h > DEF_tol_hor) pr_warning( "horizontal tolerance must be in <0..180>"); if (t_v < 0.0 || t_v > DEF_tol_ver) pr_warning( "vertical tolerance must be in <0..180>"); if (t_h == DEF_tol_hor && t_v == DEF_tol_ver) { all_directions = 1; return; } else all_directions = 0; alpha = a * PI / 180.0; beta = b * PI / 180.0; tol_hor = t_h * PI / 180.0; tol_ver = t_v * PI / 180.0; cos_tol_hor = cos(tol_hor); /* Changed K.M. Fri Feb 27 11:14:15 1998 */ cos_tol_ver = cos(tol_ver); /* Changed K.M. Fri Feb 27 11:14:15 1998 */ dir_h[0] = sin(alpha); /* */ dir_h[1] = cos(alpha); /* */ dir_v[0] = cos(beta); /* */ dir_v[1] = sin(beta); /* */ return; } double valid_direction(DPOINT *a, DPOINT *b, int symmetric, const DATA *d) { /* * return distance when vector is within the tolerance section; * return -1.0 when vector is outside tolerance section. */ double norm, inprod, dist, px, py, pz; /* Changed K.M. Fri Feb 27 11:06:07 1998 */ /* dist = d->point_norm(p); */ dist = sqrt(d->pp_norm2(a, b)); if (all_directions == 1) return dist; px = a->x - b->x; py = a->y - b->y; pz = a->z - b->z; if (tol_hor >= MAX_ANG && tol_ver >= MAX_ANG) return dist; if (tol_hor >= MAX_ANG && pz == 0.0) return dist; if (tol_ver >= MAX_ANG && px == 0.0 && py == 0.0) return dist; if (tol_hor < MAX_ANG && (px != 0.0 || py != 0.0)) { /* * check in plane: */ norm = sqrt(px * px + py * py); inprod = (px * dir_h[0] + py * dir_h[1])/norm; if (symmetric) { /* the most often case */ if ( fabs(inprod) < cos_tol_hor) /* if cos(alpha) < cos(tol) then alpha > tol! */ return -1.0; } else if (inprod < cos_tol_hor) return -1.0; /* Changed K.M. Fri Feb 27 11:18:24 1998: I have eliminated most of checks for the following reasons: if (because of numerical reasons) we get fabs(inprod)>1.0, then it really means that inprod is either +1.0 or -1.0, i.e. the angle between point vector and variogram direction is either 0 or pi. In case of SYMMETRIC it doesn't matter - fabs(inprod) is then bigger then cos_tol_hor, so we accept this point pair as it should be. In the case of not SYMMETRIC - if inprod>1 then inprod is bigger then cos_tol_hor and we accept this pair, if inprod < -1.0 then it is smaller then cos_tol_hor and we reject this pair. This way we also do not need to calculate acos and to check for domain errors afterwards. */ } if (tol_ver < MAX_ANG && (px != 0.0 || py != 0.0 || pz != 0.0)) { /* * inproduct in */ /* Changed K.M. Fri Feb 27 15:47:13 1998 */ inprod = (sqrt(px * px + py * py) * dir_v[0] + pz * dir_v[1])/dist; if (symmetric) { /* the most often case */ if ( fabs(inprod) < cos_tol_ver) /* if cos(alpha) < cos(tol) then alpha > tol! */ return -1.0; } else if (inprod < cos_tol_ver) return -1.0; } return dist; } gstat/src/sim.c0000644000176200001440000001631014646417261013133 0ustar liggesusers/* * sim.c: functions, special to (un)conditional simulation */ #include #include #include "mtrx.h" #include "defs.h" #include "debug.h" #include "glvars.h" /* gl_nsim */ #include "userio.h" #include "data.h" #include "gls.h" #include "utils.h" #include "lm.h" #include "s.h" /* r_uniform(), r_normal() */ #include "sim.h" static void simulate_mvn(const double *est, VEC *result, const int *is_datum); static void simulate_uniform(double *est, VEC *result, int orc); static unsigned int n_orvc = 0, n_total = 0; const double *cond_sim(double *est, int dim, METHOD m, int *is_datum, int orc) { /* * distributions come as { est1, var1, est2, var2,..., cov1-1,.. } * and return as { sim-1, sim-2, sim-3, ..., sim-dim } */ int i; static VEC *result = VNULL; static double *sim = NULL; static int max_dim = -1; assert(dim > 0); assert(est != NULL); assert(dim >= 1); assert(is_simulation(m)); assert(est != NULL); assert(is_datum != NULL); if (dim > max_dim) { sim = (double *) erealloc(sim, dim * sizeof(double)); max_dim = dim; } result = v_resize(result, dim); for (i = 0; i < dim; i++) is_datum[i] = (fabs(est[2 * i + 1]) < gl_zero); /* `zero' variance */ if (m == GSI) /* generate zero mean correlated noise: */ simulate_mvn(est, result, is_datum); else { /* m == IS */ correct_orv(est, dim, orc); /* affects est */ simulate_uniform(est, result, orc); } for (i = 0; i < dim; i++) sim[i] = result->ve[i]; return sim; } static void simulate_mvn(const double *est, VEC *result, const int *is_datum) { static MAT *M = MNULL; static VEC *ind = VNULL, *sim = VNULL; static PERM *p = PNULL; int i, j, info; volatile int dim; p = px_resize(p, result->dim); for (i = dim = 0; i < result->dim; i++) { if (is_datum[i] == 0) /* non-``zero'' variance -- do simulate */ p->pe[dim++] = i; /* index of simulation point */ } p->size = dim; /* * now dim is the number of pos. variances, * p points their position */ if (dim > 0) { /* there is something to be simulated */ M = m_resize(M, dim, dim); for (i = 0; i < dim; i++) { ME(M, i, i) = est[2 * p->pe[i] + 1]; /* variances on diagonal */ for (j = 0; j < i; j++) /* off-diagonal: covariances */ ME(M, j, i) = ME(M, i, j) = est[2 * result->dim + LTI2(p->pe[j],p->pe[i])]; } if (DEBUG_COV) { printlog("# simulation covariance matrix:\n"); m_logoutput(M); } /* decompose M: */ M = CHfactor(M, PNULL, &info); /* LT is zero */ if (info != 0) pr_warning("singular simulation covariance matrix"); if (DEBUG_COV) { printlog("# decomposed error covariance matrix, with zero LT:\n"); m_logoutput(M); } /* make ind a iid N(0,1) vector */ ind = v_resize(ind, dim); for (i = 0; i < dim; i++) ind->ve[i] = r_normal(); /* generate N(0,1) independent samples */ /* make MVN */ sim = v_resize(sim, dim); sim = vm_mlt(M, ind, sim); /* create zero mean correlated noise */ if (DEBUG_COV) { printlog("# correlated noise vector:\n"); v_logoutput(sim); } } /* fill result vector: */ for (i = j = 0; i < result->dim; i++) { if (j < dim && i == p->pe[j]) { /* simulated */ result->ve[i] = est[2 * i] + sim->ve[j]; j++; } else result->ve[i] = est[2 * i]; } if (DEBUG_COV) { printlog("\n# simulated values:\n"); if (is_datum != NULL) { for (i = 0; i < result->dim; i++) { printlog("%g # (%s)\n", result->ve[i], is_datum[i] ? "datum point" : "simulated"); } } else { for (i = 0; i < result->dim; i++) printlog(" %g", result->ve[i]); printlog("\n"); } } } static void simulate_uniform(double *est, VEC *result, int orc) { /* * depending on gl_is_pdf, assume indicative (1) or cumulative (0) * densitiy function in est; * sum of all estimates should equal about 1, which is not * the case when cumulative, when last estimate should be * close to 1. */ int i, hit; double cdf, rn; static double *pdf = NULL; if (result->dim == 1) { result->ve[0] = 1.0 * (r_uniform() < est[0]); if (DEBUG_ORDER && (est[0] < 0.0 || est[0] > 1.0)) pr_warning("order relation violation: P %g not in [0,1]\n", est[0]); return; } if (pdf == NULL) pdf = (double *) emalloc(result->dim * sizeof(double)); for (i = 0; i < result->dim; i++) pdf[i] = est[2 * i]; /* local copy */ if (orc == 4) /* cumulative indicators: make raw pdf */ for (i = 1; i < result->dim; i++) pdf[i] -= pdf[i-1]; /* make pdf from cdf */ rn = r_uniform(); hit = 0; cdf = pdf[0]; while (rn > cdf) { hit++; if (hit < result->dim) cdf += pdf[hit]; else break; /* fix hit at this interval */ } /* hit now denotes the class in [ 0 ... dim ] in which rn falls */ for (i = 0; i < result->dim; i++) if (orc <= 3) result->ve[i] = (hit == i ? 1.0 : 0.0); else result->ve[i] = (hit <= i ? 1.0 : 0.0); } void correct_orv(double *est, int n_vars, int orc) { /* * does ``order relation violations corrections'' (acc. to GSLIB pages 77-81); * if IS_PDF: correct < 0, > 1, sum <= 1; * if not IS_PDF: average upward/downward correction as in GSLIB's ik3d. */ int i; static int violation = -1, size = -1; static double *down = NULL, *up = NULL, *ori = NULL; double sum = 0.0; if (down == NULL || size < n_vars) { down = (double *) erealloc(down, n_vars * sizeof(double)); up = (double *) erealloc(up, n_vars * sizeof(double)); ori = (double *) erealloc(ori, n_vars * sizeof(double)); size = n_vars; } /* save original */ for (i = 0; i < n_vars; i++) ori[i] = est[2 * i]; if (orc <= 3) { for (i = 0; i < n_vars; i++) { est[2 * i] = MAX(est[2 * i], 0.0); est[2 * i] = MIN(est[2 * i], 1.0); sum += est[2 * i]; } if (orc == 3 && sum != 1.0) { if (DEBUG_ORDER) printlog("sum!=1: "); for (i = 0; i < n_vars; i++) est[2 * i] /= sum; } else if (orc == 2 && sum > 1.0) { if (DEBUG_ORDER) printlog("sum>1: "); for (i = 0; i < n_vars; i++) est[2 * i] /= sum; } } else { /* orc == 4: cdf; do the GSLIB upward/downward averaging: */ /* upward correction: */ up[0] = MAX(0.0, MIN(1.0, est[0])); for (i = 1; i < n_vars; i++) /* don't go down && stay < 1 */ up[i] = MAX(up[i-1], MIN(1.0, est[2 * i])); /* downward correction: */ down[n_vars-1] = MAX(0.0, MIN(1.0, est[2 * (n_vars-1)])); for (i = n_vars - 2; i >= 0; i--) /* don't go up && stay > 0 */ down[i] = MIN(down[i+1], MAX(0.0, est[2 * i])); /* average upward/downward: */ for (i = 0; i < n_vars; i++) est[2 * i] = 0.5 * (down[i] + up[i]); } if (n_total == 0) { /* first time */ if (DEBUG_ORDER) printlog("order relation violation:\n(before correction) --> (after correction)\n"); } n_total++; for (i = violation = 0; !violation && i < n_vars; i++) if (ori[i] != est[2 * i]) violation = 1; n_orvc += violation; if (DEBUG_ORDER) { if (violation) { /* print the order correction */ for (i = 0; i < n_vars; i++) printlog("%g ", ori[i]); printlog("--> "); for (i = 0; i < n_vars; i++) printlog("%g ", est[2 * i]); printlog("\n"); } } } void print_orvc(void) { if (n_total > 0) { if (n_orvc > 0) printlog( "number of corrected order relation violations: %u of %u (%.1f%%)\n", n_orvc, n_total, (100.0 * n_orvc)/n_total); else printlog("no order relation violations\n"); n_orvc = 0; n_total = 0; } } gstat/src/lm.h0000644000176200001440000000216614646417261012764 0ustar liggesusers#ifndef LM_H # define LM_H void pred_lm(DATA **data, int n_vars, DPOINT *where, double *est); void make_residuals_lm(DATA *d); double *make_ols(DATA *d); MAT *get_X(DATA **d, MAT *X, int nvars); MAT *get_X0(DATA **d, MAT *X0, DPOINT *where, int nvars); double calc_mu(const DATA *d, const DPOINT *pt); VEC *get_y(DATA **d, VEC *y, int nvars); int is_singular(MAT *X, double epsilon); typedef struct { VEC *beta, /* parameter vector */ *y, /* data vector */ *Xty, /* X'y */ *weights; /* weights in a WLS model: V-1, 1/sigma^2_i */ MAT *X, /* design matrix */ *Cov, /* covariance matrix of beta */ *Chol; /* Choleski decomposition of X'X or X'V-1X */ double MSErr, /* Mean Square Error */ MSReg, /* Mean Square due to regression */ SSErr, /* Sum of Squares error */ SSReg; /* Sum of Squares regression */ int dfE, /* degrees of freedom error */ dfReg, /* degrees of freedom regression */ is_singular, /* flag if X'X is singular */ has_intercept; /* model has intercept, J is part of X */ } LM ; LM *calc_lm(LM *lm); void logprint_lm(DATA *d, LM *lm); LM *init_lm(LM *lm); void free_lm(LM *lm); #endif /* LM_H */ gstat/src/userio.h0000644000176200001440000000302414646417261013654 0ustar liggesusers#ifndef USERIO_H #define USERIO_H enum Gstat_errno { ER_NOERROR = 0 /* no error */, ER_NULL = 1 /* internal error: should not occur */, ER_VARNOTSET = 2 /* a required variable was not set by the user */, ER_RANGE = 3 /* range error (outside permitted values) */, ER_IMPOSVAL = 4 /* a variable was set to an illegal value */, ER_WRITE = 6 /* write error on file */, ER_READ = 7 /* read error on file */, ER_RDFLT = 8 /* error while converting a string to a float */, ER_RDINT = 9 /* error while converting a string to an int */, ER_SYNTAX = 10 /* syntax error */, ER_ARGOPT = 11 /* error in command line option arguments */, ER_DOMAIN = 12 /* math error */, ER_MEMORY = 13 /* memory exhausted */, ER_IO = 14 /* i/o conflict (e.g. redirection not permitted) */, ER_NOCMD = 15 /* no command file specified */, ER_NOCURSES = 16 /* no curses user interface compiled in */, ER_PWRITE = 17 /* error while writing to a pipe */, ER_PREAD = 18 /* error while reading from a pipe */, ER_SECURE = 19 /* secure mode: operation not allowed */ }; #define MAX_ERRNO 19 void message(char *fmt, ...); /* message() calls always preceed ErrMsg() */ #define ErrMsg(a,b) gstat_error(__FILE__,__LINE__,a,b) void gstat_error(char *fname, int line, enum Gstat_errno err_nr, const char *msg); void pr_warning(char *fmt, ...); void printlog(const char *fmt, ...); void print_progress(unsigned int current, unsigned int total); #endif /* USERIO_H */ gstat/src/reml.c0000644000176200001440000002604414646417261013307 0ustar liggesusers/* * iterated mivque (reml) estimate of covariance components, following * Christensen's 1994 derivations Math.Geol. 25 (5), 541-558, and * Kitanidis' 1985 derivation (for estimate covariances) Math.Geol. 17 (2). * * Pre: data pointer (later: extend to 2 or more, crossvariograms?) * initial variogram for *data * Post: returns pointer to the updated variogram * if output != NULL, all iteration steps are printed to log device, * with final variogram model parameter covariances * Aug 1994; * Mod. (I-Aw) Nov 1998 */ #include #include /* fabs() */ #include "mtrx.h" #include "defs.h" #include "userio.h" #include "debug.h" #include "data.h" #include "utils.h" #include "vario.h" #include "glvars.h" #include "select.h" #include "mtrx.h" #include "lm.h" /* get_X, get_y */ #include "reml.h" static int reml(VEC *Y, MAT *X, MAT **Vk, int n_k, int max_iter, double fit_limit, VEC *teta); static double trace_matrix(MAT *m); static MAT *calc_VinvIminAw(MAT *Vw, MAT *X, MAT *VinvIminAw, int calc_Aw); static void calc_rhs_Tr_m(int n_models, MAT **Vk,MAT *VinvIminAw, VEC *Y, VEC *rhs, MAT *Tr_m); static double calc_ll(MAT *Vw, MAT *X, VEC *y, int n); static MAT *XVXt_mlt(MAT *X, MAT *V, MAT *out); static MAT *IminAw = MNULL; VARIOGRAM *reml_sills(DATA *data, VARIOGRAM *vp) { int i, j, k; MAT **Vk = NULL, *X = MNULL; VEC *Y = VNULL, *init = VNULL; DPOINT *dpa, *dpb; double dx, dy = 0.0, dz = 0.0, dzero2; if (data == NULL || vp == NULL) ErrMsg(ER_NULL, "reml()"); select_at(data, (DPOINT *) NULL); if (vp->n_models <= 0) ErrMsg(ER_VARNOTSET, "reml: please define initial variogram model"); /* * create Y, X, Vk's only once: */ Y = get_y(&data, Y, 1); X = get_X(&data, X, 1); Vk = (MAT **) emalloc(vp->n_models * sizeof(MAT *)); init = v_resize(init, vp->n_models); for (i = 0; i < vp->n_models; i++) { init->ve[i] = vp->part[i].sill; /* remember init. values for updating */ vp->part[i].sill = 1; Vk[i] = m_resize(MNULL, X->m, X->m); } dzero2 = gl_zero * gl_zero; for (i = 0; i < data->n_list; i++) { for (j = 0; j < vp->n_models; j++) /* fill diagonals */ ME(Vk[j], i, i) = Covariance(vp->part[j], 0.0, 0.0, 0.0); for (j = 0; j < i; j++) { /* off-diagonal elements: */ dpa = data->list[i]; dpb = data->list[j]; /* * if different points coincide on a locations, shift them, * or the covariance matrix will become singular */ dx = dpa->x - dpb->x; dy = dpa->y - dpb->y; dz = dpa->z - dpb->z; if (data->pp_norm2(dpa, dpb) < dzero2) { if (data->mode & X_BIT_SET) dx = (dx >= 0 ? gl_zero : -gl_zero); if (data->mode & Y_BIT_SET) dy = (dy >= 0 ? gl_zero : -gl_zero); if (data->mode & Z_BIT_SET) dz = (dz >= 0 ? gl_zero : -gl_zero); } for (k = 0; k < vp->n_models; k++) ME(Vk[k], i, j) = ME(Vk[k], j, i) = Covariance(vp->part[k], dx, dy, dz); } } if (reml(Y, X, Vk, vp->n_models, gl_iter, gl_fit_limit, init)) vp->ev->refit = 0; else /* on convergence */ pr_warning("no convergence while fitting variogram"); for (i = 0; i < vp->n_models; i++) vp->part[i].sill = init->ve[i]; update_variogram(vp); if (DEBUG_VGMFIT) logprint_variogram(vp, 1); for (i = 0; i < vp->n_models; i++) m_free(Vk[i]); efree(Vk); m_free(X); v_free(Y); v_free(init); return vp; } static int reml(VEC *Y, MAT *X, MAT **Vk, int n_k, int max_iter, double fit_limit, VEC *teta) { volatile int n_iter = 0; int i, info; volatile double rel_step = DBL_MAX; VEC *rhs = VNULL; VEC *dteta = VNULL; MAT *Vw = MNULL, *Tr_m = MNULL, *VinvIminAw = MNULL; Vw = m_resize(Vw, X->m, X->m); VinvIminAw = m_resize(VinvIminAw, X->m, X->m); rhs = v_resize(rhs, n_k); Tr_m = m_resize(Tr_m, n_k, n_k); dteta = v_resize(dteta, n_k); while (n_iter < max_iter && rel_step > fit_limit) { print_progress(n_iter, max_iter); n_iter++; dteta = v_copy(teta, dteta); /* fill Vw, calc VinvIminAw, rhs; */ for (i = 0, m_zero(Vw); i < n_k; i++) ms_mltadd(Vw, Vk[i], teta->ve[i], Vw); /* Vw = Sum_i teta[i]*V[i] */ VinvIminAw = calc_VinvIminAw(Vw, X, VinvIminAw, n_iter == 1); calc_rhs_Tr_m(n_k, Vk, VinvIminAw, Y, rhs, Tr_m); /* Tr_m * teta = Rhs; symmetric, solve for teta: */ CHfactor(Tr_m, PNULL, &info); if (info != 0) { pr_warning("singular matrix in reml"); return(0); } CHsolve1(Tr_m, rhs, teta, PNULL); if (DEBUG_VGMFIT) { printlog("teta_%d [", n_iter); for (i = 0; i < teta->dim; i++) printlog(" %g", teta->ve[i]); printlog("] -(log.likelyhood): %g\n", calc_ll(Vw, X, Y, n_k)); } v_sub(teta, dteta, dteta); /* dteta = teta_prev - teta_curr */ if (v_norm2(teta) == 0.0) rel_step = 0.0; else rel_step = v_norm2(dteta) / v_norm2(teta); } /* while (n_iter < gl_iter && rel_step > fit_limit) */ print_progress(max_iter, max_iter); if (n_iter == gl_iter) pr_warning("No convergence after %d iterations", n_iter); if (DEBUG_VGMFIT) { /* calculate and report covariance matrix */ /* first, update to current est */ for (i = 0, m_zero(Vw); i < n_k; i++) ms_mltadd(Vw, Vk[i], teta->ve[i], Vw); /* Vw = Sum_i teta[i]*V[i] */ VinvIminAw = calc_VinvIminAw(Vw, X, VinvIminAw, 0); calc_rhs_Tr_m(n_k, Vk, VinvIminAw, Y, rhs, Tr_m); m_inverse(Tr_m, &info); sm_mlt(2.0, Tr_m, Tr_m); /* Var(YAY)=2tr(AVAV) */ printlog("Lower bound of parameter covariance matrix:\n"); m_logoutput(Tr_m); printlog("# Negative log-likelyhood: %g\n", calc_ll(Vw, X, Y, n_k)); } m_free(Vw); m_free(VinvIminAw); m_free(Tr_m); v_free(rhs); v_free(dteta); return (n_iter < max_iter && rel_step < fit_limit); /* converged? */ } static MAT *calc_VinvIminAw(MAT *Vw, MAT *X, MAT *VinvIminAw, int calc_Aw) { /* * calculate V_w^-1(I-A_w) (==VinvIminAw), * A = X(X'X)^-1 X' (AY = XBeta; Beta = (X'X)^-1 X'Y) * * on second thought (Nov 1998 -- more than 4 years later :-)) * calc (I-Aw) only once and keep this constant during iteration. */ MAT *tmp = MNULL, *V = MNULL; /* VEC *b = VNULL, *rhs = VNULL; */ int i, j, info; if (X->m != Vw->n || VinvIminAw->m != X->m) ErrMsg(ER_IMPOSVAL, "calc_VinvIminAw: sizes don't match"); if (calc_Aw) { IminAw = m_resize(IminAw, X->m, X->m); tmp = m_resize(tmp, X->n, X->n); tmp = mtrm_mlt(X, X, tmp); /* X'X */ m_inverse(tmp, &info); /* (X'X)-1 */ if (info != 0) pr_warning("singular matrix in calc_VinvIminAw"); /* X(X'X)-1 -> X(X'X)-1 X') */ IminAw = XVXt_mlt(X, tmp, IminAw); for (i = 0; i < IminAw->m; i++) /* I - Aw */ for (j = 0; j <= i; j++) if (i == j) ME(IminAw, i, j) = 1.0 - ME(IminAw, i, j); else ME(IminAw, i, j) = ME(IminAw, j, i) = -(ME(IminAw, i, j)); } V = m_copy(Vw, V); CHfactor(V, PNULL, &info); if (info != 0) pr_warning("singular V matrix in calc_VinvIminAw"); CHsolve(V, IminAw, VinvIminAw, PNULL); m_free(V); if (tmp) m_free(tmp); return VinvIminAw; } static void calc_rhs_Tr_m(int n_models, MAT **Vk,MAT *VinvIminAw, VEC *y, VEC *rhs, MAT *Tr_m) { int j, k; MAT **Pr = NULL, *Tmp = MNULL; VEC *v_tmp = VNULL, *v_tmp2; Pr = (MAT **) emalloc(n_models * sizeof(MAT *)); v_tmp2 = vm_mlt(VinvIminAw, y, VNULL); /* Vw-(I-Aw)Y == Y'(I-Aw)'Vw- */ for (j = 0; j < n_models; j++) { Pr[j] = m_mlt(Vk[j], VinvIminAw, MNULL); Tmp = m_mlt(Pr[j], Pr[j], Tmp); ME(Tr_m, j, j) = trace_matrix(Tmp); /* diagonal */ /* using Tr(A B) == Tr(B A) */ for (k = 0; k < j; k++) { /* we did Pr[k] and Pr[j], so */ Tmp = m_mlt(Pr[j], Pr[k], Tmp); /* off-diagonal */ ME(Tr_m, j, k) = ME(Tr_m, k, j) = trace_matrix(Tmp); } v_tmp = vm_mlt(Vk[j], v_tmp2, v_tmp); /* Vw-1(I-Aw)Y */ rhs->ve[j] = in_prod(v_tmp2, v_tmp); } for (j = 0; j < n_models; j++) m_free(Pr[j]); efree(Pr); m_free(Tmp); v_free(v_tmp); v_free(v_tmp2); return; } static double calc_ll(MAT *Vw, MAT *X, VEC *y, int n) { /* * calculate negative log-likelyhood */ static MAT *M1 = MNULL; static VEC *res = VNULL, *tmp = VNULL; double zQz; volatile double ldet; int i, info; IminAw->m -= n; /* |B'(I-A)Vw(I-A)'B|, pretty inefficiently, can 4 x as fast: */ /* M1 = m_mlt(IminAw, Vw, M1); M2 = mmtr_mlt(M1, IminAw, M2); */ M1 = XVXt_mlt(IminAw, Vw, M1); CHfactor(M1, PNULL, &info); for (i = 0, ldet = 0.0; i < M1->m; i++) { assert(ME(M1, i, i) > 0.0); ldet += log(ME(M1, i, i)); } /* y'B'A'(B'A'Vw A B)-1 A B y */ res = mv_mlt(IminAw, y, res); /* the m-n residuals B(I-A)'Y */ tmp = CHsolve1(M1, res, tmp, PNULL); /* M1 tmp = res -> tmp = M1-1 res */ zQz = in_prod(res, tmp); /* res' M1inv res */ IminAw->m += n; return 0.5 * ((Vw->m - n)*log(2*PI) + ldet + zQz); } static double trace_matrix(MAT *m) { /* returns trace of a square matrix */ int i; double trace; if (m == NULL) ErrMsg(ER_NULL, "trace_matrix: NULL argument"); if (m->m != m->n) ErrMsg(ER_IMPOSVAL, "trace_matrix: non-square matrix"); for (i = 0, trace = 0.0; i < m->m; i++) trace += ME(m, i, i); return trace; } MAT *XtVX_mlt(MAT *X, MAT *V, MAT *out) { /* for a symmetric matrix V, return X' V X */ static MAT *VX = MNULL; int i, j, k; if (X==(MAT *)NULL || V==(MAT *)NULL ) ErrMsg(ER_IMPOSVAL, "XtVX_mlt"); if (X->m != V->m) ErrMsg(ER_IMPOSVAL, "XtVX_mlt"); if (V->m != V->n) ErrMsg(ER_IMPOSVAL, "XtVX_mlt"); out = m_resize(out, X->n, X->n); VX = m_resize(VX, V->m, X->n); m_zero(out); VX = m_mlt(V, X, VX); for (i = 0; i < X->n; i++) { for (j = i; j < X->n; j++) for (k = 0; k < X->m; k++) ME(out, i, j) += ME(X, k, i) * ME(VX, k, j); for (j = 0; j <= i; j++) /* symmetry */ ME(out, i, j) = ME(out, j, i); } return out; } static MAT *XVXt_mlt(MAT *X, MAT *V, MAT *out) { /* for a symmetric matrix V, return X V X' */ static MAT *VXt = MNULL; int i, j, k; if (X==(MAT *)NULL || V==(MAT *)NULL ) ErrMsg(ER_IMPOSVAL, "XtVX_mlt"); if (X->n != V->m) ErrMsg(ER_IMPOSVAL, "XtVX_mlt"); if (V->m != V->n) ErrMsg(ER_IMPOSVAL, "XtVX_mlt"); out = m_resize(out, X->m, X->m); VXt = m_resize(VXt, V->m, X->n); m_zero(out); VXt = mmtr_mlt(V, X, VXt); for (i = 0; i < X->m; i++) { for (j = i; j < X->m; j++) for (k = 0; k < X->n; k++) ME(out, i, j) += ME(X, i, k) * ME(VXt, k, j); for (j = 0; j <= i; j++) /* symmetry */ ME(out, i, j) = ME(out, j, i); } return out; } MAT *XdXt_mlt(MAT *X, VEC *d, MAT *out) { /* for a diagonal matrix in d, return X d X' */ int i, j, k; if (X==(MAT *)NULL || d==(VEC *)NULL ) ErrMsg(ER_IMPOSVAL, "XVXt_mlt"); if (X->n != d->dim) ErrMsg(ER_IMPOSVAL, "XVXt_mlt"); out = m_resize(out, X->n, X->n); m_zero(out); for (i = 0; i < X->m; i++) { for (j = i; j < X->m; j++) for (k = 0; k < X->n; k++) ME(out, i, j) += ME(X, i, k) * ME(X, j, k) * d->ve[k]; for (j = 0; j <= i; j++) /* symmetry */ ME(out, i, j) = ME(out, j, i); } return out; } MAT *XtdX_mlt(MAT *X, VEC *d, MAT *out) { /* for a diagonal matrix in d, return X' d X */ int i, j, k; if (X==(MAT *)NULL || d==(VEC *)NULL ) ErrMsg(ER_IMPOSVAL, "XtVX_mlt"); if (X->m != d->dim) ErrMsg(ER_IMPOSVAL, "XtVX_mlt"); out = m_resize(out, X->n, X->n); m_zero(out); for (i = 0; i < X->n; i++) { for (j = i; j < X->n; j++) for (k = 0; k < X->m; k++) ME(out, i, j) += ME(X, k, i) * ME(X, k, j) * d->ve[k]; for (j = 0; j <= i; j++) /* symmetry */ ME(out, i, j) = ME(out, j, i); } return out; } gstat/src/sim.h0000644000176200001440000000023214646417261013134 0ustar liggesusersconst double *cond_sim(double *est, int n_sim, METHOD m, int *is_pt, int orc); void correct_orv(double *est, int n_vars, int orc); void print_orvc(void); gstat/src/msim.h0000644000176200001440000000112514646417261013313 0ustar liggesusersvoid save_sim(DATA **data, DPOINT *where, int sim, int n_vars, const double *value, int *is_pt); void save_sim_strat(DATA *d, DPOINT *where, int sim, double value, int is_pt); void restore_data_sel(DATA **data, int sim, int n_vars); void save_simulations_to_ascii(const char *fname); void save_simulations_to_maps(GRIDMAP *mask); void lhs(DATA **d, int n_vars, int stratify); void init_simulations(DATA **d); void set_beta(DATA **d, int sim, int n_vars, METHOD method); void setup_beta(DATA **d, int n_vars, int n_sim); void print_sim(void); void free_simulations(void); float ***get_msim(void); gstat/src/block.c0000644000176200001440000001662014646417261013441 0ustar liggesusers/* * block.c: calculate block discretization at a prediction location */ #include "defs.h" #include "userio.h" #include "debug.h" #include "data.h" #include "utils.h" #include "glvars.h" #include "block.h" /* Gaussian quadrature adapted from Carr & Palmer, MG 25(5), p. 514: gauss[4]: -0.8611363116, -0.3399810436, 0.3399810436, 0.8611363116 gauss_w[4]: 0.3478548452, 0.6521451548, 0.6521451548, 0.3478548452 both divided by 2 */ static double gauss[4] = { -0.4305681558, -0.1699905218, 0.1699905218, 0.4305681558 }; double gauss_w[4] = { 0.1739274226, 0.3260725774, 0.3260725774, 0.1739274226 }; int reset_anyway = 0; void reset_block_discr(void) { reset_anyway = 1; } DATA *block_discr(DATA *d, const DPOINT *block, const DPOINT *where) { /* * Purpose : get locations that discretize the estimation area * Created by : Edzer J. Pebesma * Date : april 6th, 1992 * Modified : jan 13, 1993, june 3, 1993, june 23 1993 * Prerequisites : where; * the contents of block (if not NULL) may not change * during the run of the program: only once the full * discretisation is calculated. * Returns : DATA list with 1 point (x,y,z) or a list; * Side effects : dynamic memory (re)allocation for d; * uses IS_BLOCK(where) to determine whether point or block is needed; * discretisations is rectangular using dimensions of *block; * * only the x, y and z field are used for locations, * weights are put in the weight union. */ int i, k, l, m, ndim; int ndiscr = 0, restart = 0; /* * if restart != 0, block descretizations are re-calculated. */ /* * ndim: number of dimensions (x, y, z, ..?) in data * ndiscr: total number of points discretizing the block in this run * lastndiscr: number of discretizing points in last call * gl_nblockdiscr: number of points in each dimension in discretizing grid */ static double *dx = NULL, *dy = NULL, *dz = NULL; static double *weight = NULL; static int max = 0; DATA *area = NULL, **data; /* * d has the points of the discretization of the estimation area; * dx, dy, dz and weight are remembered in case blockdiscretization has not * changed */ if (IS_POINT(where) && d != NULL) { /* point shortcut */ d->list[0]->x = where->x; d->list[0]->y = where->y; d->list[0]->z = where->z; d->list[0]->u.weight = 1.0; /* weight */ d->n_list = 1; if (DEBUG_BLOCK) { printlog("block discretization (dist is weight):\n"); d->mode = X_BIT_SET | Y_BIT_SET | Z_BIT_SET; print_data_list(d); } return d; } /* * calculate the neccesary number of block discrimination points: */ ndim = 0; ndiscr = 1; if (IS_BLOCK(where)) { if ((area = get_data_area()) == NULL) { if (block->x > 0.0) ndim++; if (block->y > 0.0) ndim++; if (block->z > 0.0) ndim++; for (i = 0; i < ndim; i++) ndiscr *= gl_nblockdiscr; } else ndiscr = area->n_list; } if (area == NULL && ndiscr > max) { dx = (double *) erealloc(dx, ndiscr * sizeof(double)); dy = (double *) erealloc(dy, ndiscr * sizeof(double)); dz = (double *) erealloc(dz, ndiscr * sizeof(double)); weight = (double *) erealloc(weight, ndiscr * sizeof(double)); max = ndiscr; } /* * (re)allocate the memory neccesary: */ if (d == NULL) { /* allocate ndiscr: */ d = (DATA *) emalloc (sizeof(DATA)); init_one_data(d); assert(get_n_vars() > 0); data = get_gstat_data(); d->pp_norm2 = data[0]->pp_norm2; /* assign distance function */ d->what_is_u = U_ISWEIGHT; d->n_X = 0; d->colnx = d->colny = d->colnz = 1; d->list = (DPOINT **) emalloc(ndiscr * sizeof(DPOINT *)); for (i = 0; i < ndiscr; i++) d->list[i] = (DPOINT *) emalloc (sizeof(DPOINT)); d->n_max = d->n_list = ndiscr; restart = 1; } else if (ndiscr > d->n_max) { /* resize if n_max < ndiscr: */ d->list = (DPOINT **) erealloc(d->list, ndiscr * sizeof(DPOINT *)); for (i = d->n_max; i < ndiscr; i++) d->list[i] = (DPOINT *) emalloc (sizeof(DPOINT)); d->n_max = d->n_list = ndiscr; restart = 1; } else if (reset_anyway) { reset_anyway = 0; restart = 1; } if (restart && ndim > 0 && area == NULL) { /* set up block regular or Gaussian block discretisation */ i = 0; switch (ndim) { case 1: if (block->y > 0 || block->z > 0) ErrMsg(ER_IMPOSVAL, "block_discr(): block y and z dimensions must be 0"); if (gl_gauss) { for (k = 0; k < 4; k++) { dx[i] = block->x * gauss[k]; dy[i] = dz[i] = 0.0; weight[i] = gauss_w[k]; i++; } } else { for (k = 0; k < gl_nblockdiscr; k++) { dx[i] = block->x * (-0.5 + (1.0/gl_nblockdiscr) * (0.5 + k)); dy[i] = dz[i] = 0.0; weight[i] = 1.0 / (1.0 * ndiscr); i++; } } break; case 2: if (block->z > 0) ErrMsg(ER_IMPOSVAL, "block_discr(): 2D block->z must be zero"); if (gl_gauss) { for (k = 0; k < 4; k++) { for (l = 0; l < 4; l++) { dx[i] = block->x * gauss[k]; dy[i] = block->y * gauss[l]; weight[i] = gauss_w[k] * gauss_w[l]; dz[i] = 0.0; i++; } /* for l */ } /* for k */ } else { for (k = 0; k < gl_nblockdiscr; k++) { for (l = 0; l < gl_nblockdiscr; l++) { dx[i] = block->x * (-0.5 + (1.0/gl_nblockdiscr) * (0.5 + k)); dy[i] = block->y * (-0.5 + (1.0/gl_nblockdiscr) * (0.5 + l)); dz[i] = 0.0; weight[i] = 1.0 / (1.0 * ndiscr); i++; } /* for l */ } /* for k */ } break; case 3: if (gl_gauss) { for (k = 0; k < 4; k++) { for (l = 0; l < 4; l++) { for (m = 0; m < 4; m++) { dx[i] = block->x * gauss[k]; dy[i] = block->y * gauss[l]; dz[i] = block->z * gauss[m]; weight[i] = gauss_w[k] * gauss_w[l] * gauss_w[m]; i++; } /* for m */ } /* for l */ } /* for k */ } else { for (k = 0; k < gl_nblockdiscr; k++) { for (l = 0; l < gl_nblockdiscr; l++) { for (m = 0; m < gl_nblockdiscr; m++) { dx[i] = block->x * (-0.5+(1.0/gl_nblockdiscr) * (0.5 + k)); dy[i] = block->y * (-0.5+(1.0/gl_nblockdiscr) * (0.5 + l)); dz[i] = block->z * (-0.5+(1.0/gl_nblockdiscr) * (0.5 + m)); weight[i] = 1.0 / (1.0 * ndiscr); i++; } /* for m */ } /* for l */ } /* for k */ } break; default: ErrMsg(ER_IMPOSVAL, "block_discr()"); } /* switch */ if (i != ndiscr) /* silly check ! */ ErrMsg(ER_IMPOSVAL, "block_discr()"); } /* end if restart */ if (IS_BLOCK(where)) { if (area != NULL) { for (i = 0; i < ndiscr; i++) { d->list[i]->x = area->list[i]->x + where->x; d->list[i]->y = area->list[i]->y + where->y; d->list[i]->z = area->list[i]->z + where->z; if (area->colnvariance) d->list[i]->u.weight = area->list[i]->variance; else d->list[i]->u.weight = 1.0 / ndiscr; } } else { for (i = 0; i < ndiscr; i++) { d->list[i]->x = where->x - dx[i]; d->list[i]->y = where->y - dy[i]; d->list[i]->z = where->z - dz[i]; d->list[i]->u.weight = weight[i]; } } } else { /* where is point */ d->list[0]->x = where->x; d->list[0]->y = where->y; d->list[0]->z = where->z; d->list[0]->u.weight = 1.0; /* weight */ } d->n_list = ndiscr; if (DEBUG_BLOCK) { printlog("block discretization (dist is weight):\n"); d->mode = X_BIT_SET | Y_BIT_SET | Z_BIT_SET; print_data_list(d); } return d; } gstat/src/nsearch.c0000644000176200001440000005246414646417261014000 0ustar liggesusers/* This software module is copyright 1997 (c): Steve Joyce mailto:steve.joyce@resgeom.slu.se Remote Sensing Laboratory http://www-umea.slu.se/~fjasj/ Dept. of Forest Resource Mgmt. & Geomatics Tel: +46 90 16 69 57 Swedish University of Agricultural Sciences Fax: +46 90 14 19 15 S-901 83 Umea, Sweden Distributed freely under the terms of the GNU General Public License as a component of: Gstat, a program for geostatistical modelling, prediction and simulation Copyright 1992-2009 (C) Edzer J. Pebesma Edzer J. Pebesma (E.Pebesma@geo.uu.nl) Landscape and environmental research group Faculty of geographical sciences University of Amsterdam Nieuwe Prinsengracht 130 1018 VZ Amsterdam -- The Netherlands */ /* * qtree.c: quick neighbourhood selection routines for gstat */ /* * Edzer's CHANGE LOG from Steve's original contribution: * converted most float to double; * bbox size initialization -1.0 * added some ErrMsg() error message checks * changed qtree_quick_select() call (DPOINTX disappeared) * made is_leaf(node) a macro; removed max_ppnode -> Q_SPLIT_AT * added flexible 1/2/3d tree support: detect from data->mode; * added bbox.mode field; * modified routines like in_bbox, sub_bbox to detect tree dimension * qtree_free(): node->n_node should be N_NODES(node) * init_qtree is now called from qtree_quick_select() * added bbox_from_* routines * added get_index macro: searching is not required * added qtree_print() functions * might have missed some. * (after 2.0:) * Q_SPLIT_AT -> gl_split * implemented the priority queue mechanism, see PR bucket quad trees * demonstrated at http://www.cs.umd.edu/~brabec/quadtree/index.html. * (this enables efficient search when only max is defined, i.e. without * a radius -- especially in case of simulation this seems really * efficient) * removed min_bbox -->> this became obsolete with the priority queue * * I guess many of my modifications assume you have sufficient memory, * and that you want to use it to speed things up. */ #include #include /* qsort() */ #include /* sqrt() */ #include /* DBL_MAX */ #include /* INT_MAX */ #include "defs.h" #include "userio.h" #include "debug.h" #include "data.h" #include "utils.h" #include "glvars.h" /* get_method(), name_identifier() */ #include "mapio.h" #include "nsearch.h" #include "pqueue.h" /* include _after_ search.h! */ #define N_NODES(x) (x==NULL?0:(-((x)->n_node))) /* a negative n_node means it's not a leaf */ /* * this is a 'tuning' parameter defining the number of points in * a quad before it is split into 4 * #define Q_SPLIT_AT 4 */ /* * another tuning parameter defining the minimum quad size allowed. * (multiplied by d->sel_rad) #define Q_STOP_AT 0.5 (now obsolete) */ #define is_leaf(node) (((node) == NULL) || (((node)->n_node) >= 0)) #define is_qtree_search(d) (d->qtree_root != NULL) #define get_index(pt, bb) \ ((pt->x >= bb.x + 0.5 * bb.size) | \ (((bb.mode & Y_BIT_SET) && (pt->y >= bb.y + 0.5 * bb.size)) << 1) | \ (((bb.mode & Z_BIT_SET) && (pt->z >= bb.z + 0.5 * bb.size)) << 2)) static void init_qtree(DATA *d); static void init_qnode(QTREE_NODE **p_node, int is_leaf, BBOX bb); static void qtree_push(DPOINT *p, QTREE_NODE **p_node, int recursion_depth); static BBOX sub_bbox(const BBOX bb, int i); static int in_bbox(const DPOINT *p, BBOX bb); static void qtree_split_node(QTREE_NODE *node, BBOX bb, int rec_level); static QTREE_NODE *qtree_expand(const DPOINT *p, QTREE_NODE *root); static QTREE_NODE **qtree_find_node(const DPOINT *p, QTREE_NODE **p_node, BBOX *bbox); void qtree_print(DATA *d); static void logprint_qtree(QTREE_NODE *node, int depth); static BBOX bbox_from_grid(const GRIDMAP *gt, const DATA_GRIDMAP *dg); static BBOX bbox_from_data(DATA *d); static void qtree_zero_all_leaves(QTREE_NODE *node); static int CDECL node_cmp(const QUEUE_NODE *a, const QUEUE_NODE *b); void logprint_queue(QUEUE *queue); static void init_qtree(DATA *d) { /* * Initialize the root of the search tree: * Since this is called from qtree_quick_select(), we know allready * quite a lot. This helps choosing sensible values for the * top level bbox origin and size. */ const GRIDMAP *gt = NULL; DATA *simlocs = NULL; int i, mode; BBOX bbox; if (is_simulation(get_method())) { /* * sequential simulation: the simulation path (through DATA or GRIDMAP) * will make up for (most of) the search locations: */ gt = (const GRIDMAP *) NULL; simlocs = get_dataval(); /* in case of simulation one of them will be non-NULL */ } /* get initial estimate for top level bbox: */ if (gt != NULL) bbox = bbox_from_grid(gt, NULL); else if (simlocs != NULL) { bbox = bbox_from_data(simlocs); if (bbox.size <= 0.0) bbox = bbox_from_data(d); } else bbox = bbox_from_data(d); if (bbox.size <= 0.0) bbox = bbox_from_data(get_dataval()); if (bbox.size <= 0.0) ErrMsg(ER_IMPOSVAL, "bbox with zero size: remove neighbourhood settings?"); init_qnode(&(d->qtree_root), d->n_list < gl_split, bbox); /* ML1 */ mode = bbox.mode; for (i = 0; i < d->n_list; i++) qtree_push_point(d, d->list[i]); /* now they won't be rejected */ /* ML2 */ if (DEBUG_DUMP) { printlog("top level search tree statistics for data(%s):\n", name_identifier(d->id)); printlog("bounding box origin ["); if (mode & X_BIT_SET) printlog("%g", d->qtree_root->bb.x); if (mode & Y_BIT_SET) printlog(",%g", d->qtree_root->bb.y); if (mode & Z_BIT_SET) printlog(",%g", d->qtree_root->bb.z); printlog("]; dimension %g\n", d->qtree_root->bb.size); } /* qtree_print(d); */ return; } static void init_qnode(QTREE_NODE **p_node, int isleaf, BBOX bb) { /* * initialize a node in the search tree. * bb.mode tells the dimension of the tree (1D/2D/3D) */ int i; if (*p_node == NULL) { *p_node = (QTREE_NODE *) emalloc(sizeof(QTREE_NODE)); /* ML1 */ (*p_node)->bb = bb; } if (isleaf) (*p_node)->n_node = 0; else { if (bb.mode & Z_BIT_SET) /* 3D: oct-tree */ (*p_node)->n_node = -8; else if (bb.mode & Y_BIT_SET) /* 2D: quad-tree */ (*p_node)->n_node = -4; else if (bb.mode & X_BIT_SET) /* 1D: binary tree */ (*p_node)->n_node = -2; else /* no x/y/z bit set...??? */ ErrMsg(ER_IMPOSVAL, "init_qnode: invalid mode"); (*p_node)->u.node = (QTREE_NODE **) emalloc(N_NODES(*p_node) * sizeof(QTREE_NODE *)); for (i = 0; i < N_NODES(*p_node); i++) (*p_node)->u.node[i] = NULL; } return; } void qtree_push_point(DATA *d, DPOINT *where) { /* add a single point to the search tree structure in d->qtree_root */ /* * do not do this while reading the data: suppose we'll never need * a neighbourhood selection after all! */ if (! is_qtree_search(d)) return; /* min_bbox = d->sel_rad * Q_STOP_AT; */ /* * if this point is outside the current search tree, * we need to add another level to the top and try again: */ while (! in_bbox(where, d->qtree_root->bb)) d->qtree_root = qtree_expand(where, d->qtree_root); /* * finally push the point onto the tree: */ qtree_push(where, &(d->qtree_root), 0); return; } static void qtree_push(DPOINT *where, QTREE_NODE **p_node, int recursion_depth) { /* add a data point to the quad tree starting at the node specified. */ QTREE_NODE **p_leaf, *node; BBOX bb; bb = (*p_node)->bb; recursion_depth += 1; /* printf("recursion_depth: %d, max %d\n", recursion_depth, MAX_RECURSION_DEPTH); */ /* find the leaf node where this point belongs */ p_leaf = qtree_find_node(where, p_node, &bb); if (*p_leaf == NULL) init_qnode(p_leaf, 1, bb); /* leaf == 1: sets ->n_node to 0 */ node = *p_leaf; /* If it is already full, split it into another level and try again: */ if (node->n_node == gl_split && recursion_depth < MAX_RECURSION_DEPTH) { qtree_split_node(node, (*p_node)->bb, recursion_depth); qtree_push(where, &node, recursion_depth); return; } /* XXX */ if (node->n_node == 0) node->u.list = (DPOINT **) emalloc(sizeof(DPOINT *)); else node->u.list = (DPOINT **) erealloc(node->u.list, (node->n_node + 1) * sizeof(DPOINT *)); /* ML2 */ node->u.list[node->n_node] = where; node->n_node++; return; } void qtree_pop_point(DPOINT *where, DATA *d) { int i; QTREE_NODE *node, **p_node; /* delete a point from the search tree */ if (! is_qtree_search(d)) /* don't bother */ return; p_node = qtree_find_node(where, &(d->qtree_root), NULL); if (*p_node == NULL) ErrMsg(ER_IMPOSVAL, "qtree_pop_point(): could not find node"); node = *p_node; for (i = 0; i < node->n_node; i++) { if (where == node->u.list[i]) { /* don't preserve order: copy last to this one: */ node->u.list[i] = node->u.list[node->n_node - 1]; break; /* from for loop */ } } node->n_node--; /* free memory if empty list: */ if (node->n_node == 0) { efree(node->u.list); efree(node); *p_node = NULL; } return; } void qtree_free(QTREE_NODE *node) { /* * If a push or search fails, you might want to consider getting rid of * whole tree and default to exhaustive search. (SJ) * [If you ever get so far, exhaustive search will take * a nearly infinite amount of time. Instead, tweek gl_split. --EJP] */ int i; if (node == NULL) return; if (!is_leaf(node)) { for (i = 0; i < N_NODES(node); i++) qtree_free(node->u.node[i]); efree(node->u.node); } else efree(node->u.list); efree(node); return; } static void qtree_split_node(QTREE_NODE *node, BBOX bbox, int rec_level) { /* * split the quadtree at 'node' and redistribute its points */ DPOINT **list; int i, n; /* first copy the points to a temporary location and free the pointers */ n = node->n_node; list = node->u.list; /* save temporary copy */ /* make a node from this leaf, overwrite u: */ init_qnode(&node, 0, bbox); /* redistribute the points into the child nodes where they belong */ for (i = 0; i < n; i++) qtree_push(list[i], &node, rec_level); efree(list); return; } static QTREE_NODE *qtree_expand(const DPOINT *where, QTREE_NODE *root) { /* * expand the top level of the search tree */ QTREE_NODE *new_top = NULL; DPOINT old_centre; BBOX old_bb, new_bb; int i; old_bb = root->bb; old_centre.x = old_centre.y = old_centre.z = 0.0; if (old_bb.mode & X_BIT_SET) old_centre.x = old_bb.x + old_bb.size / 2.0; if (old_bb.mode & Y_BIT_SET) old_centre.y = old_bb.y + old_bb.size / 2.0; if (old_bb.mode & Z_BIT_SET) old_centre.z = old_bb.z + old_bb.size / 2.0; new_bb = old_bb; /* * set the new bounding box: Steve, could you check this? * (I didn't grasp your original bbox setting here:) * * set the root bbox to the new_top bbox: */ if ((old_bb.mode & X_BIT_SET) && (where->x < old_bb.x)) new_bb.x -= old_bb.size; if ((old_bb.mode & Y_BIT_SET) && (where->y < old_bb.y)) new_bb.y -= old_bb.size; if ((old_bb.mode & Z_BIT_SET) && (where->z < old_bb.z)) new_bb.z -= old_bb.size; new_bb.size *= 2.0; /* link the old root node to the proper spot in new_top: */ init_qnode(&new_top, 0, old_bb); i = get_index((&old_centre), new_bb); new_top->u.node[i] = root; new_top->bb = new_bb; /* make this one the new root */ return new_top; } static QTREE_NODE **qtree_find_node(const DPOINT *where, QTREE_NODE **p_node, BBOX *bb) { /* * find the deepest leaf (end node) in the tree that bounds this point's * coordinates. * It's bounding box is saved in the location pointed to by p_bbox */ int i; if (is_leaf(*p_node)) return p_node; /* find in which node we are: */ i = get_index(where, (*p_node)->bb); if (bb != NULL) *bb = sub_bbox(*bb, i); /* recurse into this node: */ return qtree_find_node(where, &((*p_node)->u.node[i]), bb); } static BBOX sub_bbox(const BBOX bbox, int index) { /* * return the bounding box of a quad-tree child node based on the index * layout of octree index: * * | dz <= 0 dz > 0 * --------|-------------------- * dy > 0 | 2 3 6 7 * dy <= 0 | 0 1 4 5 * | * dx ? 0 | <= > <= > */ double size; BBOX b; b = bbox; b.size = size = bbox.size / 2.0; if (index & X_BIT_SET) /* 1, 3, 5, 7 */ b.x += size; if (index & Y_BIT_SET) /* 2, 3, 6, 7 */ b.y += size; if (index & Z_BIT_SET) /* 4, 5, 6, 7 */ b.z += size; return b; } static int in_bbox(const DPOINT *where, BBOX bbox) { /* * check if where is inside the bounding box: * _on_ the left/lower/downside boundary or is inside the box */ if ((bbox.mode & X_BIT_SET) && ((where->x < bbox.x) || (where->x >= bbox.x + bbox.size))) return 0; if ((bbox.mode & Y_BIT_SET) && ((where->y < bbox.y) || (where->y >= bbox.y + bbox.size))) return 0; if ((bbox.mode & Z_BIT_SET) && ((where->z < bbox.z) || (where->z >= bbox.z + bbox.size))) return 0; /* so, where apparently in ... */ return 1; } /* * pb_norm2_?D() functions: * calculate shortest (squared) euclidian distance from a point to a BBOX, * for ? being 1, 2 or 3 dimensions */ double pb_norm_1D(const DPOINT *where, BBOX bbox) { double x, dx; x = where->x; if (x < bbox.x) { dx = bbox.x - x; return dx * dx; } bbox.x += bbox.size; if (x > bbox.x) { dx = x - bbox.x; return dx * dx; } return 0.0; /* inside box */ } double pb_norm_2D(const DPOINT *where, BBOX bbox) { double x, y, dx = 0.0, dy = 0.0; x = where->x; y = where->y; if (x < bbox.x) dx = bbox.x - x; else { bbox.x += bbox.size; if (x > bbox.x) dx = x - bbox.x; } if (y < bbox.y) dy = bbox.y - y; else { bbox.y += bbox.size; if (y > bbox.y) dy = y - bbox.y; } return dx * dx + dy * dy; } double pb_norm_3D(const DPOINT *where, BBOX bbox) { double x, y, z, dx = 0.0, dy = 0.0, dz = 0; x = where->x; y = where->y; z = where->z; if (x < bbox.x) dx = bbox.x - x; else { bbox.x += bbox.size; if (x > bbox.x) dx = x - bbox.x; } if (y < bbox.y) dy = bbox.y - y; else { bbox.y += bbox.size; if (y > bbox.y) dy = y - bbox.y; } if (z < bbox.z) dz = bbox.z - z; else { bbox.z += bbox.size; if (z > bbox.z) dz = z - bbox.z; } return dx * dx + dy * dy + dz * dz; } void qtree_print(DATA *d) { /* * plot the full tree (2D), in a format that can be read by jgraph, found * at netlib or at http://kenner.cs.utk.edu/~plank/plank/jgraph/jgraph.html */ printlog("newgraph\nxaxis size 3\nyaxis size 3\n"); printlog("title : %s [n = %d]\n", name_identifier(d->id), d->n_list); logprint_qtree(d->qtree_root, 0); return; } static void logprint_qtree(QTREE_NODE *node, int depth) { BBOX b; int i; if (node == NULL) return; b = node->bb; if (!is_leaf(node)) { printlog("newline linethickness 0.3 pts %g %g %g %g %g %g %g %g %g %g\n", b.x, b.y, b.x+b.size, b.y, b.x+b.size, b.y+b.size, b.x, b.y+b.size, b.x, b.y); for (i = 0; i < N_NODES(node); i++) logprint_qtree(node->u.node[i], depth+1); } else { printlog("newline pts %g %g %g %g %g %g %g %g %g %g\n", b.x, b.y, b.x+b.size, b.y, b.x+b.size, b.y+b.size, b.x, b.y+b.size, b.x, b.y); /* if (node == NULL) printlog("newcurve marktype circle fill 1 pts %g %g\n", b.x+0.5*b.size, b.y+0.5*b.size); */ if (node->n_node > 0) { printlog("newcurve marktype cross pts"); for (i = 0; i < node->n_node; i++) printlog(" %g %g", node->u.list[i]->x, node->u.list[i]->y); printlog("\n"); } } } static BBOX bbox_from_grid(const GRIDMAP *gt, const DATA_GRIDMAP *dg) { /* derive a sensible top level bounding box from grid map topology */ double sizex, sizey; BBOX bbox; if (gt) { sizex = gt->cols * gt->cellsizex; sizey = gt->rows * gt->cellsizey; bbox.x = gt->x_ul; bbox.y = gt->y_ul - sizey; /* * bbox.size should be set to such a value that the smallest * leaf fits exactly over 4 grid map cells */ bbox.size = MIN(gt->cellsizex, gt->cellsizey); } else { sizex = dg->cols * dg->cellsizex; sizey = dg->rows * dg->cellsizey; bbox.x = dg->x_ul; bbox.y = dg->y_ul - sizey; bbox.size = MIN(dg->cellsizex, dg->cellsizey); } bbox.z = DBL_MAX; while (bbox.size < MAX(sizex, sizey)) bbox.size *= 2; bbox.mode = (X_BIT_SET | Y_BIT_SET); /* i.e. 3 */ return bbox; } static BBOX bbox_from_data(DATA *d) { /* derive a sensible top level bounding box from a data var */ double maxspan, dy, dz; BBOX bbox; if (d->grid) return bbox_from_grid(NULL, d->grid); bbox.x = d->minX; bbox.y = d->minY; bbox.z = d->minZ; bbox.mode = d->mode; /* ??? */ /* bbox.mode = d->mode & (X_BIT_SET|Y_BIT_SET|Z_BIT_SET); maxspan = MAX((d->maxX-d->minX), MAX((d->maxY-d->minY),(d->maxZ-d->minZ))); */ maxspan = fabs(d->maxX - d->minX); dy = fabs(d->maxY - d->minY); if (dy > maxspan) maxspan = dy; dz = fabs(d->maxZ - d->minZ); if (dz > maxspan) maxspan = dz; /* with d->grid_size entered by user: if (d->grid_size > 0.0) { bbox.x -= 0.5 * d->grid_size; bbox.y -= 0.5 * d->grid_size; bbox.z -= 0.5 * d->grid_size; bbox.size = d->grid_size; do { bbox.size *= 2; } while (bbox.size < (maxspan + d->grid_size)); } */ bbox.size = maxspan * 1.01; return bbox; } static void qtree_zero_all_leaves(QTREE_NODE *node) { int i; if (!is_leaf(node)) { for (i = 0; i < N_NODES(node); i++) qtree_zero_all_leaves(node->u.node[i]); } else if (node != NULL) node->n_node = 0; return; } void qtree_rebuild(DATA *d) { /* rebuild tree */ int i; QTREE_NODE **p_leaf, *leaf; if (d->n_list <= 0 || d->qtree_root == NULL) return; qtree_zero_all_leaves(d->qtree_root); for (i = 0; i < d->n_list; i++) { p_leaf = qtree_find_node(d->list[i], &(d->qtree_root), NULL); leaf = *p_leaf; leaf->u.list[leaf->n_node] = d->list[i]; leaf->n_node++; } return; } static DPOINT *get_nearest_point(QUEUE *q, DPOINT *where, DATA *d) { /* * returns the first (closest) DPOINT in the priority queue q, after all * unwinding necessary (which is effectively recursion into the tree). * * this and the following functions: Copyright (GPL) 1998 Edzer J. Pebesma */ QUEUE_NODE head, *el = NULL /* temporary storage */ ; QTREE_NODE *node; int i, n; while (q->length > 0) { /* try: */ /* logprint_queue(q); */ head = dequeue(q); if (! head.is_node) { /* nearest element is a point: */ if (el != NULL) efree(el); return head.u.p; } node = head.u.n; if (is_leaf(node)) { /* ah, the node dequeued is a leaf: */ /* printf("node->n_node: %d\n", node->n_node); */ if (node->n_node > 0) el = (QUEUE_NODE *) erealloc(el, node->n_node * sizeof(QUEUE_NODE)); for (i = 0; i < node->n_node; i++) { /* enqueue it's DPOINT's: */ el[i].is_node = 0; el[i].u.p = node->u.list[i]; el[i].dist2 = node->u.list[i]->u.dist2 = d->pp_norm2(where, node->u.list[i]); } n = node->n_node; } else { /* nope, but enqueue its sub-nodes: */ if (N_NODES(node) > 0) el = (QUEUE_NODE *) erealloc(el, N_NODES(node) * sizeof(QUEUE_NODE)); for (i = n = 0; i < N_NODES(node); i++) { if (node->u.node[i] != NULL) { el[n].is_node = 1; el[n].u.n = node->u.node[i]; el[n].dist2 = d->pb_norm2(where, node->u.node[i]->bb); n++; } } } if (n > 0) enqueue(q, el, n); } /* the while-loop terminates when the queue is empty */ if (el != NULL) efree(el); return NULL; } void logprint_queue(QUEUE *queue) { Q_ELEMENT *q; QUEUE_NODE *e; printlog("current priority queue size: %d\n", queue->length); for (q = queue->head; q != NULL; q = q->next) { e = &(q->el); printlog("%s %12.6g", e->is_node ? "Node at " : "Point at", sqrt(e->dist2)); if (e->is_node) printlog(" [xll=%g,yll=%g,size=%g] (with %d %s)\n", e->u.n->bb.x, e->u.n->bb.y, e->u.n->bb.size, ABS(e->u.n->n_node), e->u.n->n_node < 0 ? "nodes" : "points"); else printlog(" [index %d, value %g]\n", GET_INDEX(e->u.p), e->u.p->attr); } } static int CDECL node_cmp(const QUEUE_NODE *a, const QUEUE_NODE *b) { /* ANSI qsort() conformant comparison function */ if (a->dist2 < b->dist2) return -1; if (a->dist2 > b->dist2) return 1; /* equal distances: prefer DPOINT over a node to speed up things */ if (a->is_node != b->is_node) return (a->is_node ? 1 : -1); return 0; } int qtree_select(DPOINT *where, DATA *d) { DPOINT *p = NULL; static QUEUE *q = NULL; static QUEUE_NODE root; int sel_max; double rad2; /* if this is the first time calling with this d: */ if (d->qtree_root == NULL) init_qtree(d); root.is_node = 1; root.u.n = d->qtree_root; root.dist2 = 0.0; q = init_queue(q, node_cmp); enqueue(q, &root, 1); if (d->sel_rad >= DBL_MAX) { /* * simply get the d->sel_max nearest: */ for (d->n_sel = 0; d->n_sel < d->sel_max; d->n_sel++) d->sel[d->n_sel] = get_nearest_point(q, where, d); } else { /* * also consider a maximum distance to where */ if (d->vdist) /* select everything within sel_rad; cut later on */ sel_max = INT_MAX; else sel_max = d->sel_max; rad2 = d->sel_rad * d->sel_rad; d->n_sel = 0; while (d->n_sel < sel_max) { p = get_nearest_point(q, where, d); if (p != NULL && p->u.dist2 <= rad2) { /* accept this point */ d->sel[d->n_sel] = p; d->n_sel++; } else break; /* reject, and break while loop */ } if (d->n_sel < d->sel_min) { /* * d->sel_min was set: consider points beyond radius */ if (d->force) /* proceed beyond d->sel_rad */ while (d->n_sel < d->sel_min) { if (p != NULL) { d->sel[d->n_sel] = p; p = get_nearest_point(q, where, d); d->n_sel++; } else { /* a zero d->n_sel will result in a missing value */ d->n_sel = 0; break; } } else /* stop: a zero d->n_sel will result in a missing value */ d->n_sel = 0; } } return d->n_sel; } gstat/src/mtrx.c0000644000176200001440000003022414662102216013322 0ustar liggesusers/* interface roughly follows meschach; implementation rewritten from scratch */ #include /* memcpy, memset */ #include /* fabs */ #define USE_FC_LEN_T #include #ifndef FCONE # define FCONE #endif #include #include "defs.h" /* CDECL */ #include "utils.h" /* efree, emalloc */ #include "userio.h" /* ErrMsg */ #include "glvars.h" /* gl_blas */ #include "debug.h" #include "mtrx.h" /* get rid of -0.000000 output: */ #define _zero_(x) (fabs(x) < 1.e-7 ? 0.0 : x) /* 0. book keeping: initialisation, memory allocation, zero, copy, print */ void m_free(MAT *m) { efree(m->v); efree(m); } void v_free(VEC *v) { efree(v->ve); efree(v); } void iv_free(IVEC *iv) { efree(iv->ive); efree(iv); } void px_free(PERM *p) { efree(p->pe); efree(p); } MAT *m_init(void) { MAT *mat = emalloc(sizeof(MAT)); mat->n = mat->m = mat->max = 0; mat->v = (double *) NULL; return(mat); } MAT *m_resize(MAT *mat, size_t m, size_t n) { if (mat == MNULL) mat = m_init(); if (m * n > mat->max) { mat->max = m * n; mat->v = (double *) erealloc(mat->v, mat->max * sizeof(double)); /* takes care of NULL m */ } mat->m = m; mat->n = n; return(mat); } VEC *v_init(void) { VEC *v = emalloc(sizeof(VEC)); v->dim = v->max = 0; v->ve = NULL; return(v); } VEC *v_resize(VEC *v, size_t n) { if (v == NULL) v = v_init(); if (n > v->max) { v->ve = erealloc(v->ve, n * sizeof(double)); v->max = n; } v->dim = n; return(v); } PERM *p_init(void) { PERM *p = emalloc(sizeof(PERM)); p->size = p->max = 0; p->pe = (int *) NULL; return(p); } PERM *px_resize(PERM *p, size_t n) { if (p == PNULL) p = p_init(); if (n > p->max) { p->pe = erealloc(p->pe, n * sizeof(size_t)); p->max = n; } p->size = n; return(p); } IVEC *iv_init(void) { IVEC *iv = emalloc(sizeof(IVEC)); iv->size = iv->max = 0; iv->ive = (int *) NULL; return(iv); } IVEC *iv_resize(IVEC *iv, size_t n) { if (iv == IVNULL) iv = iv_init(); if (n > iv->max) { iv->ive = erealloc(iv->ive, n * sizeof(int)); iv->max = n; } iv->size = n; return(iv); } MAT *m_zero(MAT *m) { if (m != MNULL) memset(m->v, 0x00, m->m * m->n * sizeof(double)); return(m); } VEC *v_zero(VEC *v) { if (v != VNULL) memset(v->ve, 0x00, v->dim * sizeof(double)); return(v); } MAT *m_copy(MAT *in, MAT *out) { if (in == out) return(out); out = m_resize(out, in->m, in->n); memcpy(out->v, in->v, in->m * in->n * sizeof(double)); return(out); } VEC *v_copy(VEC *in, VEC *out) { if (in == out) return(out); out = v_resize(out, in->dim); memcpy(out->ve, in->ve, in->dim * sizeof(double)); return(out); } void m_logoutput(MAT * a) { unsigned int i, j, tmp; if (a == (MAT *) NULL) { printlog("#Matrix: NULL\n"); return; } printlog("#Matrix: %d by %d\n", a->m, a->n); if (a->v == NULL) { printlog("NULL\n"); return; } printlog("rbind(\n"); for (i = 0; i < a->m; i++) { /* for each row... */ printlog("c("); for (j = 0, tmp = 2; j < a->n; j++, tmp++) { /* for each col in row: */ printlog("%9f", _zero_(ME(a, i, j))); if (j + 1 < a->n) printlog(", "); else printlog(")"); } if (i + 1 < a->m) printlog(", "); else printlog(" "); printlog("# row %u\n", i + 1); } printlog(")\n"); } void v_logoutput(VEC * x) { unsigned int i, tmp; if (x == (VEC *) NULL) { printlog("#Vector: NULL\n"); return; } printlog("#Vector: dim: %d\n", x->dim); if (x->ve == NULL) { printlog("NULL\n"); return; } printlog("c("); for (i = 0, tmp = 0; i < x->dim; i++, tmp++) { printlog("%9f", _zero_(x->ve[i])); if (i + 1 < x->dim) printlog(", "); } printlog(")"); } /* 1: vector-scalar, vector-vector (BLAS-1) */ VEC *sv_mlt(double s, VEC *v, VEC *out) { /* out <- s * v */ out = v_resize(out, v->dim); for (int i = 0; i < v->dim; i++) out->ve[i] = s * v->ve[i]; return(out); } double v_norm2(VEC *v) { /* 2-norm */ return(in_prod(v, v)); } VEC *v_add(VEC *v1, VEC *v2, VEC *out) { /* out = v1 + v2 */ if (v1->dim != v2->dim) ErrMsg(ER_IMPOSVAL, "v_sub size mismatch"); out = v_resize(out, v1->dim); for (int i = 0; i < out->dim; i++) out->ve[i] = v1->ve[i] + v2->ve[i]; return(out); } VEC *v_sub(VEC *v1, VEC *v2, VEC *out) { /* out = v1 - v2 = -1 * v2 + v1 */ if (v1->dim != v2->dim) ErrMsg(ER_IMPOSVAL, "v_sub size mismatch"); out = v_resize(out, v1->dim); for (int i = 0; i < out->dim; i++) out->ve[i] = v1->ve[i] - v2->ve[i]; return(out); } double in_prod(VEC *a, VEC *b) { /* a'b */ if (a->dim != b->dim) ErrMsg(ER_IMPOSVAL, "in_prod: dimensions don't match"); if (! gl_blas) { double d = 0.0; for (int i = 0; i < a->dim; i++) d += a->ve[i] * b->ve[i]; return(d); } else { int one = 1; return(F77_CALL(ddot)((int *) &(a->dim), a->ve, &one, b->ve, &one)); } } /* 2: vector-matrix (BLAS-2) */ VEC *vm_mlt(MAT *m, VEC *v, VEC *out) { /* out <- v m */ if (m->m != v->dim) ErrMsg(ER_IMPOSVAL, "vm_mlt: dimensions"); out = v_zero(v_resize(out, m->n)); if (! gl_blas) { for (size_t i = 0; i < m->n; i++) for (size_t j = 0; j < v->dim; j++) out->ve[i] += v->ve[j] * ME(m, j, i); } else { double alpha = 1.0, beta = 0.0; int one = 1; F77_CALL(dgemv)("T", (int *) &(m->m), (int *) &(m->n), &alpha, m->v, (int *) &(m->m), v->ve, &one, &beta, out->ve, &one FCONE); } return(out); } VEC *mv_mlt(MAT *m, VEC *v, VEC *out) { /* out <- m v */ if (v == out) ErrMsg(ER_IMPOSVAL, "mv_mlt in situ"); if (m->n != v->dim) ErrMsg(ER_IMPOSVAL, "mv_mlt non-matching sizes"); out = v_zero(v_resize(out, m->m)); if (! gl_blas) { for (int j = 0; j < m->m; j++) for (int i = 0; i < m->n; i++) out->ve[j] += ME(m, j, i) * v->ve[i]; } else { double alpha = 1.0, beta = 0.0; int one = 1; F77_CALL(dgemv)("N", (int *) &(m->m), (int *) &(m->n), &alpha, m->v, (int *) &(m->m), v->ve, &one, &beta, out->ve, &one FCONE); } return(out); } /* 3: matrix-matrix (BLAS-3) */ MAT *m_mlt(MAT *m1, MAT *m2, MAT *out) { /* out <- m1 %*% m2 */ if (m1->n != m2->m) ErrMsg(ER_IMPOSVAL, "mv_mlt non-matching sizes"); if (! gl_blas) { out = m_zero(m_resize(out, m1->m, m2->n)); for (int i = 0; i < m1->m; i++) for (int j = 0; j < m2->n; j++) for (int k = 0; k < m1->n; k++) ME(out, i, j) += ME(m1, i, k) * ME(m2, k, j); } else { double alpha = 1.0, beta = 0.0; out = m_resize(out, m1->m, m2->n); F77_CALL(dgemm)("N", "N", (int *) &(m1->m), (int *) &(m2->n), (int *) &(m1->n), &alpha, m1->v, (int *)&(m1->m), m2->v, (int *)&(m2->m), &beta, out->v, (int *) &(m1->m) FCONE FCONE); } return(out); } MAT *mtrm_mlt(MAT *m1, MAT *m2, MAT *out) { /* out <- t(m1) %*% m2 */ if (m1->m != m2->m) ErrMsg(ER_IMPOSVAL, "mtrm_mlt non-matching m arrays"); out = m_zero(m_resize(out, m1->n, m2->n)); if (! gl_blas) { for (int i = 0; i < m1->n; i++) for (int j = 0; j < m2->n; j++) for (int k = 0; k < m1->m; k++) ME(out, i, j) += ME(m1, k, i) * ME(m2, k, j); } else { double alpha = 1.0, beta = 0.0; F77_CALL(dgemm)("T", "N", (int *) &(m1->n), (int *) &(m2->n), (int *) &(m1->m), &alpha, m1->v, (int *)&(m1->m), m2->v, (int *)&(m2->m), &beta, out->v, (int *) &(m1->n) FCONE FCONE); } return(out); } MAT *mmtr_mlt(MAT *m1, MAT *m2, MAT *out) { /* out <- m1 m2' */ if (m1->n != m2->n) ErrMsg(ER_IMPOSVAL, "mmtr_mlt non-matching m arrays"); out = m_zero(m_resize(out, m1->m, m2->m)); if (! gl_blas) { for (int i = 0; i < m1->m; i++) for (int j = 0; j < m2->m; j++) for (int k = 0; k < m1->n; k++) ME(out, i, j) += ME(m1, i, k) * ME(m2, j, k); } else { double alpha = 1.0, beta = 0.0; F77_CALL(dgemm)("N", "T", (int *) &(m1->m), (int *) &(m2->m), (int *) &(m1->n), &alpha, m1->v, (int *)&(m1->m), m2->v, (int *)&(m2->m), &beta, out->v, (int *) &(m1->m) FCONE FCONE); } return(out); } MAT *ms_mltadd(MAT *m1, MAT *m2, double s, MAT *out) { /* out <- m1 + s * m2 */ /* return m1 + s * m2 */ if (m1->m != m2->m || m1->n != m2->n) ErrMsg(ER_IMPOSVAL, "ms_mltadd: dimension mismatch"); out = m_resize(out, m1->m, m1->n); for (int j = 0; j < m1->n; j++) for (int i = 0; i < m1->m; i++) ME(out, i, j) = ME(m1, i, j) + s * ME(m2, i, j); return(out); } MAT *sm_mlt(double s, MAT *m1, MAT *out) { /* out <- s * m1 */ out = m_resize(out, m1->m, m1->n); for (int j = 0; j < m1->n; j++) for (int i = 0; i < m1->m; i++) ME(out, i, j) = s * ME(m1, i, j); return(out); } MAT *m_add(MAT *m1, MAT *m2, MAT *out) { /* out <- m1 + m2 */ if (m1->m != m2->m || m1->n != m2->n) ErrMsg(ER_IMPOSVAL, "m_add size mismatch"); out = m_resize(out, m1->m, m1->n); for (int j = 0; j < m1->n; j++) for (int i = 0; i < m1->m; i++) ME(out, i, j) = ME(m1, i, j) + ME(m2, i, j); return(out); } MAT *m_sub(MAT *m1, MAT *m2, MAT *out) { /* out <- m1 - m2 */ if (m1->m != m2->m || m1->n != m2->n) ErrMsg(ER_IMPOSVAL, "m_sub size mismatch"); out = m_resize(out, m1->m, m1->n); for (int j = 0; j < m1->n; j++) for (int i = 0; i < m1->m; i++) ME(out, i, j) = ME(m1, i, j) - ME(m2, i, j); return(out); } /* 4: matrix factorisation, solving systems of equations */ MAT *CHfactor(MAT *m, PERM *piv, int *info) { if (m->m != m->n) Rf_error("CHfactor: 'm' must be a square matrix"); for (int i = 1; i < m->m; i++) for (int j = 0; j < i; j++) ME(m, i, j) = 0.0; /* zero lower triangle of Fortran order */ if (piv == PNULL) { /* Choleski: */ F77_CALL(dpotrf)("Upper", (int *)&(m->n), m->v, (int *)&(m->n), info, (FC_LEN_T) 5); if (*info != 0) { if (*info > 0 && DEBUG_COV) Rf_warning("the leading minor of order %d is not positive definite", *info); if (*info < 0) Rf_error("argument %d of Lapack routine %s had invalid value", -(*info), "dpotrf"); } } else { /* LDL': */ if (piv->size != m->n) Rf_error("CHfactor: 'piv' must have dimension equal to m->n"); double w, *work; /* first query for size of work, then allocate work, then factorize m: */ int lwork = -1; F77_CALL(dsytrf)("Upper", (int *)&(m->n), m->v, (int *)&(m->n), (int *) piv->pe, &w, &lwork, info, (FC_LEN_T) 5); lwork = (int) w; work = emalloc(lwork * sizeof(double)); F77_CALL(dsytrf)("Upper", (int *)&(m->n), m->v, (int *)&(m->n), (int *) piv->pe, work, &lwork, info, (FC_LEN_T) 5); efree(work); if (*info != 0) { if (*info > 0 && DEBUG_COV) Rf_warning("D[%d,%d] is exactly zero, meaning that D is singular", *info, *info); if (*info < 0) Rf_error("argument %d of Lapack routine %s had invalid value", -(*info), "dsytrf"); } } return(m); } MAT *CHsolve(MAT *m, MAT *b, MAT *out, PERM *piv) { /* solve A X = B after factorizing A */ int info; if (m->m != m->n) Rf_error("CHsolve: 'm' must be a square matrix"); if (m->m != b->m) Rf_error("CHsolve: b does not match m"); out = m_copy(b, out); /* column-major */ if (piv == PNULL) /* Choleski */ F77_CALL(dpotrs)("Upper", (int *) &(m->m), (int *) &(b->n), m->v, (int *) &(m->m), out->v, (int *) &(m->m), &info, (FC_LEN_T) 5); else /* LDL' */ F77_CALL(dsytrs)("Upper", (int *) &(m->m), (int *) &(b->n), m->v, (int *) &(m->m), piv->pe, out->v, (int *) &(m->m), &info, (FC_LEN_T) 5); if (info < 0) Rf_error("CHsolve: argument %d of Lapack routine %s had invalid value", -info, piv == NULL ? "dpotrs" : "dsytrs"); return(out); } VEC *CHsolve1(MAT *m, VEC *b, VEC *out, PERM *piv) { /* solve A x = b after factorizing A */ int one = 1, info; if (m->m != m->n) Rf_error("CHsolve1: 'm' must be a square matrix"); if (m->m != b->dim) Rf_error("CHsolve1: vector b does not match m"); out = v_copy(b, out); if (piv == PNULL) F77_CALL(dpotrs)("U", (int *) &(m->m), (int *) &one, m->v, (int *) &(m->m), out->ve, (int *) &(m->m), &info FCONE); else F77_CALL(dsytrs)("L", (int *) &(m->m), (int *) &one, m->v, (int *) &(m->m), piv->pe, out->ve, (int *) &(m->m), &info FCONE); if (info < 0) Rf_error("CHsolve1: argument %d of Lapack routine %s had invalid value", -info, piv == NULL ? "dpotrs" : "dsytrs"); return(out); } MAT *m_inverse(MAT *in, int *info) { /* out <- in^{-1} */ PERM *piv = px_resize(PNULL, in->m); in = CHfactor(in, piv, info); if (*info != 0) { /* singular */ px_free(piv); return(in); } MAT *rhs = m_zero(m_resize(MNULL, in->m, in->m)); for (int i = 0; i < rhs->m; i++) ME(rhs, i, i) = 1.0; rhs = CHsolve(in, rhs, rhs, piv); in = m_copy(rhs, in); m_free(rhs); px_free(piv); return(in); } gstat/src/s.h0000644000176200001440000000024614646417261012613 0ustar liggesusersvoid s_gstat_error(const char *mess, int level); void s_gstat_warning(const char *mess); double r_normal(void); double r_uniform(void); extern int do_print_progress; gstat/src/sem.h0000644000176200001440000000125614646417261013137 0ustar liggesusers/* sem.c */ #ifndef SEM_H # define SEM_H /* avoid multiple inclusion */ #if defined(__cplusplus) extern "C" { #endif int calc_variogram(VARIOGRAM *v, const char *fname); void fill_cutoff_width(DATA *data, VARIOGRAM *v); int is_directional(VARIOGRAM *v); void fprint_header_vgm(FILE *f, const DATA *d1, const DATA *d2, const SAMPLE_VGM *ev); void fprint_sample_vgm(const SAMPLE_VGM *ev); #if defined(__cplusplus) } #endif #define LONGSIZE (sizeof(unsigned long)) #define MAX_NH (1UL << (4 * LONGSIZE)) #define TO_NH(x,y) (x + ((unsigned long)y << (4 * LONGSIZE))) #define HIGH_NH(x) (x / (1UL << (4 * LONGSIZE))) #define LOW_NH(x) (x % (1UL << (4 * LONGSIZE))) #endif /* SEM_H */ gstat/src/gcdist.h0000644000176200001440000000011114646417261013615 0ustar liggesusersdouble gstat_gcdist(double lon1, double lon2, double lat1, double lat2); gstat/src/data.c0000644000176200001440000006131214646417261013256 0ustar liggesusers/* * data.c: basic i/o routines on DATA structure */ #include /* sqrt */ #include /* memcpy */ #include "defs.h" #include "data.h" #include "mapio.h" #include "userio.h" #include "utils.h" #include "block.h" #include "debug.h" #include "glvars.h" #include "defaults.h" #include "mtrx.h" #include "lm.h" /* free_lm() */ #include "gls.h" /* free_glm() */ #include "nsearch.h" #include "gcdist.h" const DATA_TYPE data_types[] = { { DATA_UNKNOWN, "Unknown file type"}, { DATA_ASCII_TABLE, "Ascii table file"}, { DATA_EAS, "GeoEAS file"}, { DATA_IDRISI_VEC, "Idrisi ascii .vec"}, { DATA_IDRISI32_VEC, "Idrisi binary .vct"}, { DATA_IDRISI_BIN, "Idrisi binary .img"}, { DATA_IDRISI_ASCII, "Idrisi ascii .img"}, { DATA_IDRISI32_BIN, "Idrisi binary .rst"}, { DATA_IDRISI32_ASCII, "Idrisi ascii .rst"}, { DATA_GRIDASCII, "ArcInfo gridascii"}, { DATA_GRIDFLOAT, "ArcInfo gridfloat"}, { DATA_CSF, "PCRaster map"}, { DATA_T2, "T2 map"}, { DATA_ERMAPPER, "ER-Mapper file"}, { DATA_GNUPLOT, "Gnuplot binary"}, { DATA_GMT, "GMT netCDF format" }, { DATA_SURFER_DSAA, "Surfer DSAA ascii grid" }, { DATA_GSLIB, "GSLIB grid" }, { DATA_GRASS, "GRASS site list" }, { DATA_GRASS_GRID, "GRASS raster" }, { DATA_GDAL, "GDAL raster map" } }; static void calc_data_mean_std(DATA *d); static void grid_push_point(DATA *d, DPOINT *p, int adjust_to_gridcentrs); static double point_norm_1D(const DPOINT *p); static double point_norm_2D(const DPOINT *p); static double point_norm_3D(const DPOINT *p); static double pp_norm_1D(const DPOINT *a, const DPOINT *b); static double pp_norm_2D(const DPOINT *a, const DPOINT *b); static double pp_norm_3D(const DPOINT *a, const DPOINT *b); /* great circle distances: */ static double point_norm_gc(const DPOINT *p); static double pp_norm_gc2(const DPOINT *a, const DPOINT *b); static double pb_norm_gc2(const DPOINT *where, BBOX bbox); static void logprint_data_header(const DATA *d); static DPOINT min, max; static int fix_minmax = 0; const POLY_NM polynomial[N_POLY] = {{ POLY_X, "x", 1, X_BIT_SET}, { POLY_Y, "y", 1, Y_BIT_SET}, { POLY_Z, "z", 1, Z_BIT_SET}, { POLY_X2, "x2", 2, X_BIT_SET}, { POLY_Y2, "y2", 2, Y_BIT_SET}, { POLY_Z2, "z2", 2, Z_BIT_SET}, { POLY_XY, "xy", 2, Y_BIT_SET}, { POLY_XZ, "xz", 2, Z_BIT_SET}, { POLY_YZ, "yz", 2, Z_BIT_SET}, { POLY_X3, "x3", 3, X_BIT_SET}, { POLY_Y3, "y3", 3, Y_BIT_SET}, { POLY_Z3, "z3", 3, Z_BIT_SET}, { POLY_X2Y, "x2y", 3, Y_BIT_SET}, { POLY_XY2, "xy2", 3, Y_BIT_SET}, { POLY_X2Z, "x2z", 3, Z_BIT_SET}, { POLY_XZ2, "xz2", 3, Z_BIT_SET}, { POLY_Y2Z, "y2z", 3, Z_BIT_SET}, { POLY_YZ2, "yz2", 3, Z_BIT_SET}}; void set_norm_fns(DATA *d) { if (d->mode & Z_BIT_SET) { d->point_norm = point_norm_3D; d->pp_norm2 = pp_norm_3D; d->pb_norm2 = pb_norm_3D; } else if (d->mode & Y_BIT_SET) { if (gl_longlat) { d->point_norm = point_norm_gc; d->pp_norm2 = pp_norm_gc2; d->pb_norm2 = pb_norm_gc2; /* if (gl_split != DEF_split) pr_warning("longlat data cannot do quadtree, setting split to %d", INT_MAX); */ gl_split = INT_MAX; } else { d->point_norm = point_norm_2D; d->pp_norm2 = pp_norm_2D; d->pb_norm2 = pb_norm_2D; } } else { d->point_norm = point_norm_1D; d->pp_norm2 = pp_norm_1D; d->pb_norm2 = pb_norm_1D; } } void init_data_minmax(void) { fix_minmax = 0; set_mv_double(&(min.x)); set_mv_double(&(min.y)); set_mv_double(&(min.z)); set_mv_double(&(max.x)); set_mv_double(&(max.y)); set_mv_double(&(max.z)); } void setup_data_minmax(DATA *d) { if (fix_minmax) ErrMsg(ER_NULL, "min and max should be fixed"); if (d->id == 0) { min.x = d->minX; min.y = d->minY; min.z = d->minZ; max.x = d->maxX; max.y = d->maxY; max.z = d->maxZ; } else { min.x = MIN(min.x, d->minX); min.y = MIN(min.y, d->minY); min.z = MIN(min.z, d->minZ); max.x = MAX(max.x, d->maxX); max.y = MAX(max.y, d->maxY); max.z = MAX(max.z, d->maxZ); } } DATA *get_area_centre(DATA *area, DATA *d) { int i, j; DPOINT p; d->n_list = d->n_max = 0; d->variable = area->variable; d->x_coord = area->x_coord; d->y_coord = area->y_coord; d->z_coord = area->z_coord; d->type = data_types[area->type.type]; d->fname = ""; p.x = p.y = p.z = 0.0; p.u.stratum = 0; d->n_X = area->n_X; if (area->n_X > 0) { p.X = (double *) emalloc(area->n_X * sizeof(double)); d->colX = (int *) emalloc(area->n_X * sizeof(int)); for (j = 0; j < area->n_X; j++) { p.X[j] = 0.0; d->colX[j] = area->colX[j]; } } else { p.X = NULL; d->colX = NULL; } for (i = 0; i < area->n_list; i++) { p.x += area->list[i]->x; p.y += area->list[i]->y; p.z += area->list[i]->z; for (j = 0; j < area->n_X; j++) p.X[j] += area->list[i]->X[j]; } p.x /= area->n_list; p.y /= area->n_list; p.z /= area->n_list; for (j = 0; j < area->n_X; j++) p.X[j] /= area->n_list; p.attr = 0.0; printlog("prediction centre at x=%g, y=%g, z=%g",p.x,p.y,p.z); if (d->n_X) { printlog(" where x0 averages ["); for (j = 0; j < area->n_X; j++) printlog("%g%s", p.X[j], jn_X-1?",":""); printlog("]\n"); } else printlog("\n"); push_point(d, &p); d->minX = d->maxX = p.x; d->minY = d->maxY = p.y; d->minZ = d->maxZ = p.z; d->mode = area->mode; d->n_X = area->n_X; calc_data_mean_std(d); return d; } void centre_area(DATA *area) { int i; DPOINT p; p.x = p.y = p.z = 0.0; for (i = 0; i < area->n_list; i++) { p.x += area->list[i]->x; p.y += area->list[i]->y; p.z += area->list[i]->z; } p.x /= area->n_list; p.y /= area->n_list; p.z /= area->n_list; for (i = 0; i < area->n_list; i++) { area->list[i]->x -= p.x; area->list[i]->y -= p.y; area->list[i]->z -= p.z; } area->minX -= p.x; area->maxX -= p.x; area->minY -= p.y; area->maxY -= p.y; area->minZ -= p.z; area->maxZ -= p.z; } static void calc_data_mean_std(DATA *d) { /* * Calculates fields mean and std of d with mean and standard dev. (/(n-1)) */ int i; if (d->standard == 2) { /* we did this already.. */ for (i = 0; i < d->n_list; i++) d->list[i]->attr *= d->std; } d->mean = 0.0; d->std = 0.0; if (d->n_list <= 0) { pr_warning("calc_data_mean_std: n_list <= 0: %d", d->n_list); return; } for (i = 0; i < d->n_list; i++) d->mean += d->list[i]->attr; d->mean /= d->n_list; if (d->n_list == 1) return; for (i = 0; i < d->n_list; i++) d->std += SQR(d->list[i]->attr - d->mean); d->std = sqrt((d->std)/(d->n_list - 1)); if (d->standard > 0) { for (i = 0; i < d->n_list; i++) d->list[i]->attr /= d->std; d->standard = 2; } return; } void setup_polynomial_X(DATA *d) { int i, j, degree; degree = d->polynomial_degree; if (degree < 0 || degree > 3) ErrMsg(ER_SYNTAX, "polynomial degree n, `d=n', should be in [0..3]"); for (i = 1; i <= degree; i++) for (j = 0; j < N_POLY; j++) if (polynomial[j].degree == i && (d->mode & polynomial[j].mode)) data_add_X(d, polynomial[j].poly_nr); } void data_add_X(DATA *d, int col) { int i; for (i = 0; d->id != ID_OF_VALDATA && i < d->n_X; i++) if (d->colX[i] == col) ErrMsg(ER_IMPOSVAL, "X-variable: column appears twice"); d->n_X++; d->colX = (int *) erealloc(d->colX, d->n_X * sizeof(int)); d->colX[d->n_X - 1] = col; } void calc_polynomials(DATA *d) { int i, j, do_block; #define CHECK_BITX if(!(d->mode & X_BIT_SET)) ErrMsg(ER_VARNOTSET,"x coordinate not set") #define CHECK_BITY if(!(d->mode & Y_BIT_SET)) ErrMsg(ER_VARNOTSET,"y coordinate not set") #define CHECK_BITZ if(!(d->mode & Z_BIT_SET)) ErrMsg(ER_VARNOTSET,"z coordinate not set") for (j = 0; j < d->n_X; j++) { if (d->colX[j] < -1) { switch(d->colX[j]) { case POLY_X: case POLY_X2: case POLY_X3: CHECK_BITX; break; case POLY_Y: case POLY_Y2: case POLY_Y3: CHECK_BITY; break; case POLY_Z: case POLY_Z2: case POLY_Z3: CHECK_BITZ; break; case POLY_XY: CHECK_BITX; CHECK_BITY; break; case POLY_XZ: CHECK_BITX; CHECK_BITZ; break; case POLY_YZ: CHECK_BITY; CHECK_BITZ; break; case POLY_X2Y: CHECK_BITX; CHECK_BITY; break; case POLY_XY2: CHECK_BITX; CHECK_BITY; break; case POLY_X2Z: CHECK_BITX; CHECK_BITZ; break; case POLY_XZ2: CHECK_BITX; CHECK_BITZ; break; case POLY_Y2Z: CHECK_BITY; CHECK_BITZ; break; case POLY_YZ2: CHECK_BITY; CHECK_BITZ; break; default: ErrMsg(ER_IMPOSVAL, "unknown polynomial number"); break; } } } for (j = do_block = 0; !do_block && j < d->n_X; j++) do_block = (d->colX[j] < -1); for (i = 0; do_block && i < d->n_list; i++) /* bl is a single point-list if IS_POINT(d->list[i]) */ calc_polynomial_point(d, d->list[i]); } void calc_polynomial_point(DATA *d, DPOINT *pt) { static DATA *bl = NULL; int j, k; bl = block_discr(bl, get_block_p(), pt); for (j = 0; j < d->n_X; j++) { if (d->colX[j] < -1) /* do eventual block averaging here: */ for (k = 0, pt->X[j] = 0.0; k < bl->n_list; k++) pt->X[j] += bl->list[k]->u.weight * calc_polynomial(bl->list[k], d->colX[j]); } } double calc_polynomial(DPOINT *p, int colX) { /* * fills polynomial field (x, y, z, x2, y2, z2, xy, xz, yz) * with standardized values * * Counting on the following behaviour: * first, all data + valdata are passed through setup_data_minmax(), in * order to get the right values into min and max; * then, the routines calc_polynomial* are called. * changing min or max inbetween would result in rubbish. */ double x, y, z; if (fix_minmax == 0) fix_minmax = 1; /* stop touching it */ x = ((min.x==max.x) ? p->x : (p->x - min.x)/(max.x - min.x)); y = ((min.y==max.y) ? p->y : (p->y - min.y)/(max.y - min.y)); z = ((min.z==max.z) ? p->z : (p->z - min.z)/(max.z - min.z)); switch(colX) { case POLY_X: return (x); case POLY_X2: return (x * x); case POLY_X3: return (x * x * x); case POLY_Y: return (y); case POLY_Y2: return (y * y); case POLY_Y3: return (y * y * y); case POLY_Z: return (z); case POLY_Z2: return (z * z); case POLY_Z3: return (z * z * z); case POLY_XY: return (x * y); case POLY_XZ: return (x * z); case POLY_YZ: return (y * z); case POLY_X2Y: return (x * x * y); case POLY_XY2: return (x * y * y); case POLY_X2Z: return (x * x * z); case POLY_XZ2: return (x * z * z); case POLY_Y2Z: return (y * y * z); case POLY_YZ2: return (y * z * z); default: ErrMsg(ER_IMPOSVAL, "unknown polynomial number"); break; } return 1.0; /* will never happen */ } void free_data(DATA *d) { int i; assert(d); if (DEBUG_FORCE) /* let atexit(qtree_print) do it's job... */ return; if (d->P_base) { /* segmented: */ efree(d->P_base); if (d->n_X && d->X_base) efree(d->X_base); } else { /* non-segmented */ if (d->list) /* CW at all MV on output both P_base and d_list are 0 */ for (i = d->n_list - 1; i >= 0; i--) pop_point(d, i); } if (d->sel != NULL && d->sel != d->list) efree(d->sel); if (d->list) efree(d->list); if (d->colX) efree(d->colX); if (d->qtree_root != NULL) qtree_free(d->qtree_root); if (d->lm) free_lm(d->lm); if (d->glm) free_glm(d->glm); if (d->grid) free_data_gridmap(d->grid); if (d->point_ids != NULL) { for (i = d->n_list - 1; i >= 0; i--) efree(d->point_ids[i]); } if (d->beta != NULL) efree(d->beta); efree(d); return; } DATA *init_one_data(DATA *data) { if (data == NULL) data = (DATA *) emalloc(sizeof(DATA)); data->colnvalue = 0; data->colnx = 0; data->colny = 0; data->colnz = 0; data->colns = 0; data->coln_id = 0; data->colnvariance = 0; data->n_list = -1; data->n_max = -1; data->nsim_at_data = 0; data->init_max = 0; data->n_sel = -1; data->n_sel_max = 0; data->id = -1; data->log = 0; data->standard = 0; data->what_is_u = U_UNKNOWN; data->centre = 0; data->region = 0; data->mode = 0; data->dummy = 0; data->force = 0; data->vdist = 0; data->square = 0; data->average = 0; data->every = 1; data->offset = 0; data->prob = 1.0; data->skip = 0; data->lambda = 1.0; data->calc_residuals = 1; data->is_residual = 0; data->polynomial_degree = 0; data->n_averaged = 0; data->fname = NULL; data->type = data_types[DATA_UNKNOWN]; data->variable = NULL; data->x_coord = NULL; data->y_coord = NULL; data->z_coord = NULL; data->s_coord = NULL; data->V_coord = NULL; data->point_ids = NULL; data->id_name = NULL; data->mean = 0.0; data->std = 0.0; data->sel_rad = DBL_MAX; data->dX = DBL_MAX; data->sel_max = INT_MAX; data->sel_min = 0; data->oct_max = 0; /* default: don't use octant search */ data->oct_filled = 1; /* in case of no octants */ data->list = NULL; data->sel = NULL; data->P_base = NULL; data->X_base = NULL; data->lm = NULL; data->glm = NULL; data->n_merge = 0; data->mtbl = NULL; data->n_X = 0; data->colX = NULL; data_add_X(data, 0); /* add intercept -->> UK, defaulting to ordinary kriging */ data->qtree_root = NULL; data->grid = NULL; data->togrid = 0; data->point_norm = NULL; data->pp_norm2 = NULL; data->pb_norm2 = NULL; data->beta = NULL; data->Category = NULL; data->var_fn_str = NULL; data->nscore_table = NULL; data->variance_fn = NULL; set_mv_double(&(data->Icutoff)); set_mv_double(&(data->mv)); return data; } void print_data(const DATA *d, int list) { int i; printlog("\ndata id: %d\n", d->id); if (! is_mv_double(&(d->Icutoff))) printlog("ind. cutoff: %g\n", d->Icutoff); if (d->Category) printlog("category: %s\n", d->Category); if (! is_mv_double(&(d->mv))) printlog("missing value: %g\n", d->mv); if (d->beta) { printlog("beta: ["); for (i = 0; i < d->beta->size; i++) printlog(" %g", d->beta->val[i]); printlog("]\n"); } printlog("sel_radius %g sel_max %d sel_min %d\n", d->sel_rad, d->sel_max, d->sel_min); if (d->n_X > 0) { for (i = 0; i < d->n_X; i++) { printlog("X[%d]: ", i); if (d->colX[i] == 0) printlog("intercept "); if (d->colX[i] < 0) printlog("%s ", POLY_NAME(d->colX[i])); if (d->colX[i] > 0) printlog("%d ", d->colX[i]); } printlog("\n"); } printlog("n_list %d n_max %d n_sel %d\n", d->n_list, d->n_max, d->n_sel); if (list) { printlog("current list:\n"); logprint_data_header(d); if (d->n_list) { for (i = 0; i < d->n_list; i++) logprint_point(d->list[i], d); } else printlog("\n"); } else { printlog("current selection:\n"); logprint_data_header(d); if (d->n_sel) { for (i = 0; i < d->n_sel; i++) logprint_point(d->sel[i], d); } else printlog("\n"); } } static void logprint_data_header(const DATA *d) { printlog("\nidx x:%s;", d->x_coord); printlog("y:%s;", d->y_coord); printlog("z:%s;", d->z_coord); printlog("v:%s;\n", d->variable); } void logprint_point(const DPOINT *p, const DATA *d) { /* * print contents of p (non zero: use d) to log device */ int j; printlog("%3d ", GET_INDEX(p)); if (d->mode & X_BIT_SET) printlog("x: %4g ", p->x); if (d->mode & Y_BIT_SET) printlog("y: %4g ", p->y); if (d->mode & Z_BIT_SET) printlog("z: %4g ", p->z); if (d->mode & V_BIT_SET) printlog("v: %4g ", p->attr); switch (d->what_is_u) { case U_UNKNOWN: break; case U_ISDIST: printlog("dist: %4g ", sqrt(p->u.dist2)); break; case U_ISWEIGHT: printlog("weight: %4g ", p->u.weight); break; case U_ISSTRATUM: printlog("stratum: %d ", p->u.stratum); break; } for (j = 0; j < d->n_X; j++) printlog("X[%d]: %6g ", j, p->X[j]); if (d->point_ids) { printlog("ID: %s ", d->point_ids[GET_INDEX(p)]); } printlog("\n"); } void push_point(DATA *d, const DPOINT *p) { int i; /* * add one point p to the data structure d * [counts on the fact that erealloc(NULL,size) calls malloc(size)] */ if (d->prob < 1.0) { ErrMsg(ER_IMPOSVAL, "sample in R, not in gstat"); } else if (d->every > 1) { /* EJP: WAS if ((d->n_list + d->offset) % d->every != 0) */ if ((d->n_list + d->skip + 1 - d->offset) % d->every != 0) { d->skip++; return; } } if (d->n_list < 0) { message("push_point: n_list < 0: %d (%s)\n", d->n_list, d->fname); ErrMsg(ER_NULL, "push_point(): n_list < 0"); } if (d->n_max < 0) { message("push_point: n_max < 0: %d (%s)\n", d->n_max, d->fname); ErrMsg(ER_NULL, "push_point(): n_max < 0"); } /* * use rather large blocks of memory for points: */ if (d->n_list == d->n_max) { /* increase memory: */ /* resize d->n_max: */ if (d->list == NULL) { if (d->init_max > 0) d->n_max = d->init_max; else d->n_max = MAX_DATA; } else { d->n_max += MAX_DATA; /* or else: d->n_max *= 2; */ if (d->init_max > 0 && DEBUG_DUMP) pr_warning("exceeding nmax, now %d", d->n_max); } /* resize blocked memory bases P_base and X_base, and list: */ d->P_base = (DPOINT *) erealloc(d->P_base, d->n_max * sizeof(DPOINT)); if (d->n_X > 0) { if (intercept_only(d)) { /* create a single instance of the X row: */ if (d->X_base == NULL) { /* first time */ d->X_base = (double *) emalloc(sizeof(double)); d->X_base[0] = 1.0; } } else /* each point needs it's own X row: */ d->X_base = (double *) erealloc(d->X_base, d->n_max * d->n_X * sizeof(double)); } d->list = (DPOINT **) erealloc(d->list, d->n_max * sizeof(DPOINT *)); /* * realloc'ing may have moved P_base or X_base, so reset all pointers: */ for (i = 0; i < d->n_list; i++) { d->list[i] = &(d->P_base[i]); if (d->n_X) { if (intercept_only(d)) /* d->P_base[i].X = d->X_base; */ d->list[i]->X = d->X_base; else /* d->P_base[i].X = &(d->X_base[d->n_X * i]); */ d->list[i]->X = &(d->X_base[d->n_X * i]); } else /* d->P_base[i].X = NULL; */ d->list[i]->X = NULL; } for (i = d->n_list; i < d->n_max; i++) d->list[i] = NULL; /* for savety */ /* rebuild qtree_root: this is avoided by setting nmax */ qtree_rebuild(d); datagrid_rebuild(d, 0); } /* * copy information on current point into P_base and X_base arrays: */ #ifdef SLOW d->P_base[d->n_list] = *p; #else memcpy(&(d->P_base[d->n_list]), p, sizeof(DPOINT)); #endif if (d->n_X > 0 && !intercept_only(d)) { #define SLOW 1 #ifdef SLOW /* slow... copy X row */ for (i = 0; i < d->n_X; i++) d->X_base[d->n_X * d->n_list + i] = p->X[i]; #else memcpy(&(d->X_base[d->n_X * d->n_list]), p->X, d->n_X * sizeof(double)); #endif } /* * adjust list and X pointer to this copy: */ d->list[d->n_list] = &(d->P_base[d->n_list]); if (intercept_only(d)) d->list[d->n_list]->X = d->X_base; else d->list[d->n_list]->X = &(d->X_base[d->n_X * d->n_list]); SET_INDEX(d->list[d->n_list], d->n_list); qtree_push_point(d, d->list[d->n_list]); grid_push_point(d, d->list[d->n_list], 0); /* * this will be ignored during read_gstat_data(), the tree structure will * be filled only during the first call to qtree_quick_select(). * Later on, it does have effect if simulated points are pushed. */ d->n_list++; return; } void pop_point(DATA *d, int list_nr) /* * removes DPOINT list_nr, and makes it point to the last DPOINT * also changes d->n_list */ { if (list_nr >= d->n_list) { message("pop_point: list_nr >= n_list: %d %d\n", list_nr, d->n_list); ErrMsg(ER_NULL, "pop_point():"); } qtree_pop_point(d->list[list_nr], d); if (d->P_base == NULL) { /* * free this one: */ if (d->n_X > 0 && !(intercept_only(d))) efree(d->list[list_nr]->X); efree(d->list[list_nr]); } /* * change the last pointer to this: */ if (list_nr != d->n_list - 1) /* we didn't pop the last: */ d->list[list_nr] = d->list[d->n_list - 1]; d->list[d->n_list - 1] = NULL; d->n_list--; } static double point_norm_1D(const DPOINT *p) { /* calculate norm of vector (p->x) */ return fabs(p->x); } static double point_norm_2D(const DPOINT *p) { /* calculate norm of vector (p->x, p->y, p->z) */ return sqrt(p->x * p->x + p->y * p->y); } static double point_norm_3D(const DPOINT *p) { /* calculate norm of vector (p->x, p->y, p->z) */ return sqrt(p->x * p->x + p->y * p->y + p->z * p->z); } static double pp_norm_1D(const DPOINT *a, const DPOINT *b) { /* calculate 2-norm of vector (p->x) */ double dx; dx = a->x - b->x; return dx * dx; } static double pp_norm_2D(const DPOINT *a, const DPOINT *b) { /* calculate 2-norm of vector (p->x, p->y) */ double dx, dy; dx = a->x - b->x; dy = a->y - b->y; return dx * dx + dy * dy; } static double pp_norm_3D(const DPOINT *a, const DPOINT *b) { /* calculate 2-norm of vector (p->x, p->y, p->z) */ double dx, dy, dz; dx = a->x - b->x; dy = a->y - b->y; dz = a->z - b->z; return dx * dx + dy * dy + dz * dz; } static double point_norm_gc(const DPOINT *p) { /* calculate norm of vector (p->x, p->y, p->z) */ ErrMsg(ER_IMPOSVAL, "long/lat: this function should never be called?"); return gstat_gcdist(p->x, 0.0, p->y, 0.0); } double pp_norm_gc(const DPOINT *a, const DPOINT *b) { return gstat_gcdist(a->x, b->x, a->y, b->y); /* dist */ } static double pp_norm_gc2(const DPOINT *a, const DPOINT *b) { return pow(gstat_gcdist(a->x, b->x, a->y, b->y), 2.0); /* squared dist */ } static double pb_norm_gc2(const DPOINT *where, BBOX bbox) { /* ErrMsg(ER_IMPOSVAL, "great circle distances cannot be combined with quadtree"); */ return 0.0; /* always inside, no quadtree */ } int coordinates_are_equal(const DATA *a, const DATA *b) { int i, equal = 1 /* try to disprove equality */; if (a->n_list != b->n_list) return 0; i = 0; while (equal && i < a->n_list) { equal = ((a->list[i]->x == b->list[i]->x) && (a->list[i]->y == b->list[i]->y) && (a->list[i]->z == b->list[i]->z)); i++; } return equal; } int push_to_merge_table(DATA *d, int to_var, int col_this_X, int col_other_X) { int i; DATA **data; data = get_gstat_data(); if (to_var >= d->id) { /* should not occur by construction */ pr_warning("use push_to_merge_table only backwards (%d >= %d)", to_var, d->id); return 1; } if (col_this_X >= d->n_X || col_other_X >= data[to_var]->n_X) { pr_warning("merge error: variable out of range"); return 1; } if (d->beta || data[to_var]->beta) { pr_warning("cannot merge to or from fixed (known) parameters"); return 1; } for (i = 0; i < d->n_merge; i++) { if (col_this_X == d->mtbl[i].col_this_X) { pr_warning("merge error: cannot merge column twice"); return 1; } } d->n_merge++; d->mtbl = (MERGE_TABLE *) erealloc(d->mtbl, d->n_merge * sizeof (MERGE_TABLE)); d->mtbl[d->n_merge - 1].to_var = to_var; d->mtbl[d->n_merge - 1].col_this_X = col_this_X; d->mtbl[d->n_merge - 1].col_other_X = col_other_X; return 0; } DATA_GRIDMAP *gsetup_gridmap(double x_ul, double y_ul, double cellsizex, double cellsizey, unsigned int rows, unsigned int cols) { DATA_GRIDMAP *t; int i, j; t = (DATA_GRIDMAP *) emalloc(sizeof(DATA_GRIDMAP)); t->x_ul = x_ul; t->y_ul = y_ul; t->cellsizex = cellsizex; t->cellsizey = cellsizey; t->rows = rows; t->cols = cols; t->dpt = (DPOINT ***) emalloc(t->rows * sizeof(DPOINT **)); t->grid_base = (DPOINT **) emalloc(t->rows * t->cols * sizeof(DPOINT *)); for (i = 0; i < t->rows; i++) t->dpt[i] = &(t->grid_base[i * t->cols]); for (i = 0; i < t->rows; i++) for (j = 0; j < t->cols; j++) t->dpt[i][j] = NULL; return t; } void free_data_gridmap(DATA_GRIDMAP *t) { efree(t->grid_base); efree(t->dpt); efree(t); } static void grid_push_point(DATA *d, DPOINT *p, int adjust_to_gridcentres) { int row, col; if (d->grid) { row = floor((d->grid->y_ul - p->y)/d->grid->cellsizey); col = floor((p->x - d->grid->x_ul)/d->grid->cellsizex); row = MAX(0, row); row = MIN(row, d->grid->rows - 1); col = MAX(0, col); col = MIN(col, d->grid->cols - 1); d->grid->dpt[row][col] = p; if (adjust_to_gridcentres) { p->x = d->grid->x_ul + (col + 0.5) * d->grid->cellsizex; p->y = d->grid->y_ul - (row + 0.5) * d->grid->cellsizey; } } return; } void datagrid_rebuild(DATA *d, int adjust_to_gridcentres) { int i; if (d->grid) for (i = 0; i < d->n_list; i++) grid_push_point(d, d->list[i], adjust_to_gridcentres); return; } double data_block_diagonal(DATA *data) { DPOINT a, b; a.x = data->maxX; b.x = data->minX; if (data->mode & Y_BIT_SET) { a.y = data->maxY; b.y = data->minY; } else { a.y = 0.0; b.y = 0.0; } if (data->mode & Z_BIT_SET) { a.z = data->maxZ; b.z = data->minZ; } else { a.z = 0.0; b.z = 0.0; } return sqrt(data->pp_norm2(&a, &b)); } D_VECTOR *push_d_vector(double d, D_VECTOR *v) { if (v == NULL) { v = (D_VECTOR *) emalloc(sizeof(D_VECTOR)); v->size = v->max_size = 0; v->val = NULL; } v->size++; if (v->size > v->max_size) { /* (re)allocate v->val */ if (v->val == NULL) v->val = (double *) emalloc(v->size * sizeof(double)); else v->val = (double *) erealloc(v->val, v->size * sizeof(double)); v->max_size = v->size; } v->val[v->size - 1] = d; return v; } void free_d_vector(D_VECTOR *v) { if (v != NULL) { if (v->size > 0) efree(v->val); efree(v); } } int intercept_only(const DATA *d) { assert(d != NULL); return (d->n_X == 1 && d->colX[0] == 0); } double v_mu(double mu) { return mu; } double v_mu2(double mu) { return mu * mu; } double v_mu3(double mu) { return mu * mu * mu; } double v_bin(double mu) { return (mu * (1.0 - mu)); } double v_identity(double mu) { return 1.0; } gstat/src/vario_io.h0000644000176200001440000000156514646417261014165 0ustar liggesusersdouble sem_cov_ab(VARIOGRAM *v, DPOINT *a, DPOINT *b, int sem); /* covariance: */ #define COVARIANCE(v,a,b) ((IS_POINT(a) && IS_POINT(b) && !gl_longlat) ? \ (get_covariance(v,a->x - b->x,a->y - b->y, a->z - b->z)) : \ sem_cov_ab(v,a,b,0)) /* generalized covariance: */ #define GCV(v,a,b) ((IS_POINT(a) && IS_POINT(b) && !gl_longlat) ? \ (v->max_val - get_semivariance(v,a->x - b->x,a->y - b->y, a->z - b->z)) : \ (v->max_val - sem_cov_ab(v,a,b,1))) /* * CME is the measurement error-adjustment to GCV or COVARIANCE: * see Cressie, Statistics for Spatial Data, revised ed. 1993, * eq. 3.2.25-3.2.27, and page 379 */ #define CME(v,a,b,dist) ((IS_POINT(a) && IS_POINT(b) && \ (a == b || dist(a, b) == 0.0)) ? v->measurement_error : 0.0) #define GCV0(v,a,b,dist) (GCV(v,a,b) - CME(v,a,b,dist)) #define COVARIANCE0(v,a,b,dist) (COVARIANCE(v,a,b) - CME(v,a,b,dist)) gstat/src/defaults.h0000644000176200001440000000366014646417261014163 0ustar liggesusers#ifndef DEFAULTS_H #include /* INT_MAX */ #include /* DBL_EPSILON */ # define DEFAULTS_H /* avoid multiple inclusion */ #define DEF_alpha 0.0 #define DEF_beta 0.0 #define DEF_blas 1 #define DEF_bounds NULL #define DEF_coincide -1 #define DEF_choleski 1 #define DEF_cressie 0 #define DEF_cutoff -1.0 #define DEF_dots 500 #define DEF_fit 0 #define DEF_fit_limit 1.0E-5 #define DEF_fraction 0.33333 /* fraction of max_dist for def. cutoff */ #define DEF_gauss 1 #define DEF_gpterm NULL #define DEF_idp 2.0 #define DEF_intervals 15 /* default number of intervals */ #define DEF_is_pdf 0 /* default to cdf indicator simulation */ #define DEF_iter 200 #define DEF_iwidth -1.0 #define DEF_jgraph 0 #define DEF_lhs 0 #define DEF_longlat 0 #define DEF_n_marginals 0 #define DEF_nocheck 0 /* do check */ #define DEF_marginal_names NULL #define DEF_marginal_values NULL #define DEF_nblockdiscr 4 #define DEF_n_uk INT_MAX #define DEF_numbers 1 #define DEF_nsim 1 #define DEF_ofilename NULL #define DEF_order 0 #define DEF_plotweights 0 #define DEF_pairs 0 #define DEF_quantile 0.5 #define DEF_rowwise 1 #define DEF_rp 1 #define DEF_seed 0 #define DEF_sim_beta 0 #define DEF_sparse 0 #define DEF_spiral 0 #define DEF_split 4 #define DEF_sym_ev 0 #define DEF_table_size 0 #define DEF_tol_hor 180.0 #define DEF_tol_ver 180.0 #define DEF_gls_residuals 0 #define DEF_xvalid 0 #define DEF_zero (DBL_EPSILON * 10.0) #define DEF_zero_est 0 /* ZERO_DEFAULT */ #define DEF_zmap 0.0 #endif /* DEFAULTS_H */ gstat/src/debug.h0000644000176200001440000000412314646417261013435 0ustar liggesusers#ifndef DEBUG_H # define DEBUG_H /* avoid multiple inclusion */ extern int debug_level; /* * DEBUG macro's: */ #define DB_HELP (-1) /* print debug help */ #define DB_SILENT (0) #define DB_NORMAL (1UL << 0) #define DB_DUMP (1UL << 1) /* dump global variabels */ #define DB_FIT (1UL << 2) /* fit diagnostics */ #define DB_DATA (1UL << 3) /* drop data */ #define DB_SEL (1UL << 4) /* drop selection */ #define DB_COV (1UL << 5) /* drop covariances */ #define DB_ORDER (1UL << 6) /* order relation violation */ #define DB_FORCE (1UL << 7) /* print warning if neighbourhood selection */ #define DB_TRACE (1UL << 8) /* print numbers */ #define DB_BLOCK (1UL << 9) /* block discretization diagnostics (data) */ extern void printlog(const char *fmt, ...); #define DUMP(a); {if(debug_level & DB_DUMP) { printlog("%s", a); }} #define DEBUG_HELP (debug_level & DB_HELP) #define DEBUG_SILENT (debug_level == DB_SILENT) #define DEBUG_NORMAL (debug_level & DB_NORMAL) #define DEBUG_DUMP (debug_level & DB_DUMP) #define DEBUG_FIT (debug_level & DB_FIT) #define DEBUG_DATA (debug_level & DB_DATA) #define DEBUG_SEL (debug_level & DB_SEL) #define DEBUG_COV (debug_level & DB_COV) #define DEBUG_ORDER (debug_level & DB_ORDER) #define DEBUG_VGMFIT (debug_level & DB_ORDER) #define DEBUG_FORCE (debug_level & DB_FORCE) #define DEBUG_TRACE (debug_level & DB_TRACE) #define DEBUG_BLOCK (debug_level & DB_BLOCK) #define DEBUG_OPTIONS "\ # gstat debug option values:\n\ 0: no output, be silent (same as -s)\n\ 1: normal output (default value)\n\ 2: print all global variables and extended error messages\n\ 4: print OLS and WLS fit diagnostics\n\ 8: print all data\n\ 16: print every neighbourhood selection\n\ 32: print all covariance matrices, solutions, design matrices etc.\n\ 64: print variogram fit diagnostics and order relation violations\n\ 128: print warning on forced neighbourhoods\n\ 256: print current row,column or record number\n\ 512: print block discretization points (data)\n\ to combine options, sum their values -- 1023 invokes them all\n" #endif /* DEBUG_H */ gstat/src/defs.h0000644000176200001440000000072314646417261013272 0ustar liggesusers/* * provides some definitions */ #ifndef DEFS_H #define DEFS_H /* avoid multiple inclusion */ #include /* but assertions are off, by default */ #define CDECL /* empty */ /* * several buffer sizes */ #define MAX_DATA 1250 /* not a maximum, but an increment step size */ #define INIT_N_VGMM 2 /* * (for glvars.c:) something, not bigger than 127 * because of user interface (crazy though) */ #define ERROR_BUFFER_SIZE 1280 #endif /* DEFS_H */ gstat/src/reml.h0000644000176200001440000000035214646417261013306 0ustar liggesusersVARIOGRAM *reml_sills(DATA *d, VARIOGRAM *vp); #ifdef MATRIXH MAT *XVXt_mlt(MAT *X, MAT *V, MAT *out); MAT *XtVX_mlt(MAT *X, MAT *V, MAT *out); MAT *XdXt_mlt(MAT *X, VEC *d, MAT *out); MAT *XtdX_mlt(MAT *X, VEC *d, MAT *out); #endif gstat/src/vario_fn.c0000644000176200001440000001300614646417261014145 0ustar liggesusers/* * vario_fn.c: contains elementary variogram model functions */ #include /* req'd by userio.h */ #include #include #include "defs.h" /* #define MATHLIB_STANDALONE */ #include #include "userio.h" #include "utils.h" #include "vario_fn.h" /* * Copyright (C) 1994, Edzer J. Pebesma * * basic variogram functions */ #define MIN_BESS 1.0e-3 #ifndef PI # define PI 3.14159265359 #endif double fn_nugget(double h, double *r) { return (h == 0.0 ? 0.0 : 1.0); } double fn_linear(double h, double *r) { if (h == 0) return 0.0; if (*r == 0) return h; /* 1lin() or 1 lin(0): slope 1 (and no range) */ return (h >= *r ? 1.0 : h/(*r)); } double da_fn_linear(double h, double *r) { if (*r == 0) return 0.0; /* 1lin() or 1 lin(0): slope 1 (and no range) */ if (h > *r) return 0.0; return -h/((*r) * (*r)); } double fn_circular(double h, double *r) { double hr; if (h == 0.0) return 0.0; if (h >= *r) return 1.0; hr = h/(*r); /* * return 1.0 + (2.0/PI) * (hr * sqrt(1.0 - hr * hr) - acos(hr)); * probably equivalent to: */ return (2.0/PI) * (hr * sqrt(1.0 - hr * hr) + asin(hr)); } double fn_spherical(double h, double *r) { double hr; if (h == 0) return 0.0; if (h >= *r) return 1.0; hr = h/(*r); return hr * (1.5 - 0.5 * hr * hr); } double da_fn_spherical(double h, double *r) { double hr2; if (h > *r) return 0.0; hr2 = h / ((*r) * (*r)); return 1.5 * hr2 * (-1.0 + h * hr2); } double fn_bessel(double h, double *r) { double hr; hr = h/(*r); if (hr < MIN_BESS) return 0.0; /* return 1.0 - hr * bessk1(hr); */ return 1.0 - hr * bessel_k(hr, 1.0, 1.0); } double fn_gaussian(double h, double *r) { double hr; if (h == 0.0) return 0.0; hr = h/(*r); return 1.0 - exp(-(hr*hr)); } double da_fn_gaussian(double h, double *r) { double hr; hr = h / (*r); return (-hr /(*r)) * exp(-(hr * hr)); } double fn_exponential(double h, double *r) { if (h == 0.0) return 0.0; return 1.0 - exp(-h/(*r)); } double fn_exclass(double h, double *r) { if (h == 0.0) return 0.0; return 1.0 - exp(-pow(h/r[0],r[1])); } double da_fn_exponential(double h, double *r) { double hr; hr = -h/(*r); return (hr / (*r)) * exp(hr); } double fn_pentaspherical(double h, double *r) { double hr, h2r2; if (h == 0.0) return 0.0; if (h >= *r) return 1.0; hr = h/(*r); h2r2 = hr * hr; return hr * ((15.0/8.0) + h2r2 * ((-5.0/4.0) + h2r2 * (3.0/8.0))); } double da_fn_pentaspherical(double h, double *r) { double hr2; if (h >= *r) return 0.0; hr2 = h / ((*r) * (*r)); return hr2*((-15.0/8.0) + hr2*((15.0/4.0)*h - (15.0/8.0)*h*h*hr2)); } double fn_periodic(double h, double *r) { if (h == 0.0) return 0.0; return 1.0 - cos(2.0 * PI * h/(*r)); } double da_fn_periodic(double h, double *r) { return (2.0 * PI * h/((*r) * (*r))) * sin(2.0 * PI * h/(*r)); } double fn_wave(double h, double *r) { if (h == 0.0) return 0.0; return 1.0 - (*r) * sin(PI * h/(*r)) / (PI * h); } double da_fn_wave(double h, double *r) { return cos(PI * h / (*r)) / (*r) - sin(PI * h / (*r)) / PI * h; } double fn_hole(double h, double *r) { if (h == 0.0) return 0.0; return 1.0 - sin(h/(*r))/(h/(*r)); } double da_fn_hole(double h, double *r) { double hr, hr2; hr = h/(*r); hr2 = h/((*r)*(*r)); return hr2 * sin(hr) + hr * hr2 * cos(hr); } double fn_logarithmic(double h, double *r) { if (h == 0.0) return 0.0; return log(h + *r); } double da_fn_logarithmic(double h, double *r) { return 1/(*r); } double fn_power(double h, double *r) { if (h == 0.0) return 0.0; return pow(h, *r); } double da_fn_power(double h, double *r) { return log(h) * pow(h, *r); } double fn_spline(double h, double *r) { if (h == 0.0) return 0.0; return h * h * log(h); } double fn_legendre(double h, double *r) { /* *r is range; h is angular lag */ double r2, ang; if (h == 0.0) return 0.0; r2 = r[0] * r[0]; ang = h / (PI * 6378.137); /* printf("dist: %g, ang: %g\n", h, ang); */ return 2.0 - (1.0 - r2)/(1 - 2.0 * r[0] * cos(ang) + r2); } double fn_intercept(double h, double *r) { return 1.0; } double da_is_zero(double h, double *r) { return 0.0; } double fn_matern(double h, double *p) { double hr, ans, phi, kappa; phi = p[0]; kappa = p[1]; if (h == 0.0) return(0.0); if (h > 600 * phi) return(1.0); hr = h/phi; ans = (pow(2.0, -(kappa - 1.0))/gammafn(kappa)) * pow(hr, kappa) * bessel_k(hr, kappa, 1.0); /* ans was for correlation; */ return 1.0 - ans; } /* * Ste: M. Stein's representation of the Matern model * * According to Hannes Kazianka, in R this would be h=distance matrix delta=c(RANGE,KAPPA) maternmodel<-function(h,delta){ matern<-besselK(2*delta[2]^(1/2)*h/delta[1],delta[2]) ifelse(matern==0,0,ifelse(!is.finite(matern),1, 1/(2^(delta[2] - 1)*gamma(delta[2]))*(2*delta[2]^(1/2)*h/delta[1])^delta[2]*matern)) } delta<-c(RANGE,KAPPA) h=Distance Matrix maternmodel<-function(h,delta){ matern<-besselK(2*delta[2]^(1/2)*h/delta[1],delta[2]) multipl<-1/(2^(delta[2] - 1)*gamma(delta[2]))*(2*delta[2]^(1/2)*h/delta[1])^delta[2] ifelse(matern==0 | !is.finite(multipl),0,ifelse(!is.finite(matern),1, multipl*matern)) } Now 0*Inf is impossible. Hannes */ double fn_matern2(double h, double *p) { double *delta, bes, mult; if (h == 0.0) return 0.0; delta = p; h = h / delta[0]; bes = bessel_k(2.0 * sqrt(delta[1]) * h, delta[1], 1.0); if (!isfinite(bes)) return 0.0; if (bes == 0.0) return 1.0; mult = pow(2.0, 1.0 - delta[1]) / gammafn(delta[1]) * pow((2.0 * sqrt(delta[1]) * h), delta[1]); if (!isfinite(mult)) return 1.0; return 1.0 - bes * mult; } gstat/src/block.h0000644000176200001440000000014414646417261013440 0ustar liggesusersDATA *block_discr(DATA *d, const DPOINT *block, const DPOINT *where); void reset_block_discr(void); gstat/src/fit.h0000644000176200001440000000023014646417261013124 0ustar liggesusers#ifndef FIT_H # define FIT_H #if defined(__cplusplus) extern "C" { #endif int fit_variogram(VARIOGRAM *v); #if defined(__cplusplus) } #endif #endif gstat/NAMESPACE0000644000176200001440000000362414646417261012633 0ustar liggesusersuseDynLib(gstat, gstat_debug_level, gstat_exit, gstat_fit_variogram, gstat_get_variogram_models, gstat_init, gstat_load_ev, gstat_load_variogram, gstat_new_data, gstat_new_dummy_data, gstat_predict, gstat_set_merge, gstat_set_method, gstat_set_set, gstat_variogram, gstat_variogram_values ) importFrom(utils, setTxtProgressBar, stack, txtProgressBar, head, tail) importFrom(stats, as.formula, cor, cov2cor, delete.response, .getXlevels, lm, median, model.extract, model.frame, model.matrix, na.exclude, na.fail, na.omit, na.pass, optim, optimise, optimize, predict, residuals, terms, rnorm, fft, numericDeriv, runif, setNames) importFrom(graphics, image.default, lines, locator, text) importFrom(zoo, is.regular) import(methods) import(lattice) importFrom(zoo, zoo, is.regular) import(sp) import(spacetime) import(FNN) export(as.vgm.variomodel, cross.name, fit.lmc, fit.variogram, fit.variogram.reml, fit.variogram.gls, fit.StVariogram, estiStAni, get.contr, get_gstat_progress, gstat, gstat.cv, "[.gstat", hscat, idw0, krigeTg, krige0, krigeST, krigeSTTg, krigeSimCE, krigeSTSimTB, vgmAreaST, map.to.lev, ossfim, show.vgms, spplot.vcov, variogram, variogramST, extractPar, extractParNames, variogramLine, variogramSurface, vgm, vgmArea, vgmST, vgm.panel.xyplot, panel.pointPairs, set_gstat_progress, xyz2img) exportMethods(krige, idw, krige.cv) S3method("[", gstat) S3method(as.data.frame, variogramCloud) S3method(image, data.frame) S3method(plot, pointPairs) S3method(plot, gstatVariogram) S3method(plot, variogramMap) S3method(plot, variogramCloud) S3method(plot, variogramModel) S3method(plot, StVariogram) S3method(predict, gstat) S3method(print, gstat) S3method(print, gstatVariogram) S3method(print, variogramCloud) S3method(print, variogramModel) S3method(print, StVariogramModel) S3method(variogram, default) S3method(variogram, formula) S3method(variogram, gstat) gstat/NEWS.md0000644000176200001440000000706014646417261012510 0ustar liggesusers# version 2.1-2 * `variogram()` supports `stars` (raster) objects, benefiting from them being gridded # version 2.1-1 # version 2.1-0 * import `sftime`; modify `krigeST()` variogram functions to accept `sftime` objects for `data` (as alternative to `STI` or `STIDF`), and `stars` or `sftime` objects for `newdata`; #108 with great help from @henningte * fix Gaussian cosimulation, probably introduced in 2016, #106 # version 2.0-7 * return `NA` as estimate when prediction/simulation fails; #80 # version 2.0-6 * fixes `object 'ret' not found` bug introduced by #63; #65 #66 #70 # version 2.0-5 * use multiple cores in `variogramST`, using pkg future; #63 by @sigmafelix * fix bug with conditional simulation using `stars` target grid and nsim=1, #58 # version 2.0-4 * fix CRAN warning issue # version 2.0-3 * fix bug in support for `sf` objects; #46 * fix `krigeTg` for the case when data or newdata are of class `sf` or `sfc`; #51 # version 2.0-1 * try to fix CRS issue found on OSX * check for temporal unit in krigeST opposed to covariance function and assign the temporal unit found in krigeST to the spatio-temporal variogram for consistency in case none has been provided by the model; add warning when ST variogram doesn't have a `temporal unit` attribute; #42 # version 2.0-0 * add plot.variogramModel; #40 * support `sf` and `stars` objects, for vector and raster data, respectively; #39 # version 1.1-6 * address warnings from Tomas Kalibera's static code checking # version 1.1-5 * fix auto-choosing of variogram parameters if only variogram model type is given, https://github.com/edzer/gstat/issues/17 # version 1.1-4 * Fix #17 * Fix #14 * Fix #12 * Fix great circle distance bug; see https://stat.ethz.ch/pipermail/r-sig-geo/2016-December/025251.html # version 1.1-3 * Merge pull request #4 from BenGraeler/master r-journal ms merge updates vignette "spatio-temporal-kriging" to revised paper * Merge pull request #3 from BenGraeler/master update st paper demos * demo/stkrige.R: - remove empty station * demo/00Index, demo/stkrige-crossvalidation.R, demo/stkrige-prediction.R, demo/stkrige.R, man/krigeST.Rd: - adds R scripts from vignette spatio-temporal kriging as demos * Merge pull request #2 from BenGraeler/master additions for space-time paper * NAMESPACE, R/krige0.R, man/krigeST.Rd: - adds trans Gaussian kriging for space and time # version 1.1-2 * fixed `memcpy` for overlapping regions error, found in valgrind checks by Brian Ripley * fixed a few more (small) memory leaks # version 1.1-1 * Further cleaned up C source code, got rid of lex and yacc files * Improve `fit.variogram` to choose initial values for range, sill and nugget before fitting, and fit over a range of model types * allow `NA` values in `vgm` * Fixed #1 # version 1.1-0 * remove meschach matrix library, rewrote interface, link to R's lapack * improve notification in case of singular matrices * remove all C code that was not used by R package gstat * add `Makevars`, remove `configure` * remove links to `ai-geostats.org` * wrap `fit.StVariogram` example in `dontrun` # version 1.0-26 * use ordered spatial index when selecting nearest strongest correlated neighbours in local kriging to avoid warning of spacetime * update spatio-temporal geostatitics vignettes; add R Journal draft as vignette (Spatio-Temporal Geostatistics using gstat) * add spatio-temporal PM10 interpolation [movie](http://gstat.r-forge.r-project.org/STpred.html) # version before 1.0-26 * see [ChangeLog](https://github.com/r-spatial/gstat/blob/master/inst/ChangeLog) gstat/inst/0000755000176200001440000000000014750415430012354 5ustar liggesusersgstat/inst/CITATION0000644000176200001440000000157314646417261013527 0ustar liggesuserscitHeader("To cite package gstat in publications use:") bibentry(bibtype="Article", title = "Multivariable geostatistics in {S}: the gstat package", author = "Edzer J. Pebesma", journal = "Computers & Geosciences", year = 2004, volume = 30, pages = "683-691", textVersion = paste("Pebesma, E.J., 2004. Multivariable geostatistics in S: the gstat package.", "Computers & Geosciences, 30: 683-691.") ) bibentry(bibtype="Article", title = "Spatio-Temporal Interpolation using gstat", author = "Benedikt Gräler and Edzer Pebesma and Gerard Heuvelink", year = 2016, journal = "The R Journal", volume = 8, issue = 1, pages = "204-218", url = "https://journal.r-project.org/archive/2016/RJ-2016-014/index.html", textVersion = paste("Benedikt Gräler, Edzer Pebesma and Gerard Heuvelink, 2016.", "Spatio-Temporal Interpolation using gstat. The R Journal 8(1), 204-218") ) gstat/inst/doc/0000755000176200001440000000000014750415427013127 5ustar liggesusersgstat/inst/doc/st.R0000644000176200001440000001667314750415427013715 0ustar liggesusers### R code from vignette source 'st.Rnw' ################################################### ### code chunk number 1: st.Rnw:89-93 ################################################### library(spacetime) rm(list = ls()) data(air) ls() ################################################### ### code chunk number 2: st.Rnw:102-108 ################################################### if (!exists("rural")) rural = STFDF(stations, dates, data.frame(PM10 = as.vector(air))) rr = rural[,"2005::2010"] unsel = which(apply(as(rr, "xts"), 2, function(x) all(is.na(x)))) r5to10 = rr[-unsel,] summary(r5to10) ################################################### ### code chunk number 3: st.Rnw:112-114 ################################################### rn = row.names(r5to10@sp)[4:7] rn ################################################### ### code chunk number 4: st.Rnw:119-124 (eval = FALSE) ################################################### ## par(mfrow=c(2,2)) ## # select 4, 5, 6, 7 ## for(i in rn) ## acf(na.omit(r5to10[i,]), main = i) ## par(mfrow=c(1,1)) ################################################### ### code chunk number 5: st.Rnw:129-134 ################################################### par(mfrow=c(2,2)) # select 4, 5, 6, 7 rn = row.names(r5to10@sp)[4:7] for(i in rn) acf(na.omit(r5to10[i,]), main = i) ################################################### ### code chunk number 6: st.Rnw:143-144 (eval = FALSE) ################################################### ## acf(na.omit(as(r5to10[rn,], "xts"))) ################################################### ### code chunk number 7: st.Rnw:149-150 ################################################### acf(na.omit(as(r5to10[rn,], "xts"))) ################################################### ### code chunk number 8: st.Rnw:174-175 (eval = FALSE) ################################################### ## acf(na.omit(as(r5to10[4:10,], "xts"))) ################################################### ### code chunk number 9: st.Rnw:180-182 ################################################### library(sp) print(spDists(r5to10[4:10,]@sp), digits=3) ################################################### ### code chunk number 10: st.Rnw:189-190 ################################################### rs = sample(dim(r5to10)[2], 100) ################################################### ### code chunk number 11: st.Rnw:195-197 ################################################### lst = lapply(rs, function(i) { x = r5to10[,i]; x$ti = i; rownames(x@coords) = NULL; x} ) pts = do.call(rbind, lst) ################################################### ### code chunk number 12: st.Rnw:200-202 ################################################### library(gstat) v = variogram(PM10~ti, pts[!is.na(pts$PM10),], dX=0) ################################################### ### code chunk number 13: st.Rnw:205-208 (eval = FALSE) ################################################### ## # plot(v, fit.variogram(v, vgm(1, "Exp", 200, 1))) ## vmod = fit.variogram(v, vgm(100, "Exp", 200)) ## plot(v, vmod) ################################################### ### code chunk number 14: st.Rnw:212-215 ################################################### # plot(v, fit.variogram(v, vgm(1, "Exp", 200, 1))) vmod = fit.variogram(v, vgm(100, "Exp", 200)) print(plot(v, vmod)) ################################################### ### code chunk number 15: st.Rnw:223-224 ################################################### vmod ################################################### ### code chunk number 16: st.Rnw:229-230 ################################################### dim(r5to10) ################################################### ### code chunk number 17: st.Rnw:235-236 (eval = FALSE) ################################################### ## vv = variogram(PM10~1, r5to10, width=20, cutoff = 200, tlags=0:5) ################################################### ### code chunk number 18: st.Rnw:241-242 (eval = FALSE) ################################################### ## vv = variogram(PM10~1, r5to10, width=20, cutoff = 200, tlags=0:5) ################################################### ### code chunk number 19: st.Rnw:248-249 ################################################### data(vv) ################################################### ### code chunk number 20: st.Rnw:252-253 ################################################### vv <- vv[c("np", "dist", "gamma", "id", "timelag", "spacelag")] ################################################### ### code chunk number 21: st.Rnw:258-260 (eval = FALSE) ################################################### ## plot(vv) ## plot(vv, map = FALSE) ################################################### ### code chunk number 22: st.Rnw:264-266 ################################################### print(plot(vv), split = c(1,1,1,2), more = TRUE) print(plot(vv, map = FALSE), split = c(1,2,1,2)) ################################################### ### code chunk number 23: st.Rnw:278-283 ################################################### metricVgm <- vgmST("metric", joint=vgm(50,"Exp",100,0), stAni=50) metricVgm <- fit.StVariogram(vv, metricVgm) ################################################### ### code chunk number 24: st.Rnw:288-289 ################################################### attr(metricVgm, "optim")$value ################################################### ### code chunk number 25: st.Rnw:294-295 (eval = FALSE) ################################################### ## plot(vv, metricVgm) ################################################### ### code chunk number 26: st.Rnw:300-301 ################################################### print(plot(vv, metricVgm)) ################################################### ### code chunk number 27: st.Rnw:311-319 ################################################### sepVgm <- vgmST("separable", space=vgm(0.9,"Exp", 123, 0.1), time =vgm(0.9,"Exp", 2.9, 0.1), sill=100) sepVgm <- fit.StVariogram(vv, sepVgm, method = "L-BFGS-B", lower = c(10,0,0.01,0,1), upper = c(500,1,20,1,200)) ################################################### ### code chunk number 28: st.Rnw:325-327 ################################################### attr(sepVgm, "optim")$value plot(vv, list(sepVgm, metricVgm)) ################################################### ### code chunk number 29: st.Rnw:332-333 ################################################### print(plot(vv, list(sepVgm, metricVgm))) ################################################### ### code chunk number 30: st.Rnw:341-347 (eval = FALSE) ################################################### ## library(lattice) ## plot(vv, list(sepVgm, metricVgm), all=T, wireframe=T, zlim=c(0,120), ## zlab=NULL, ## xlab=list("distance (km)", rot=30), ## ylab=list("time lag (days)", rot=-35), ## scales=list(arrows=F, z = list(distance = 5))) ################################################### ### code chunk number 31: st.Rnw:358-364 ################################################### library(lattice) print(plot(vv, list(sepVgm, metricVgm), all=T, wireframe=T, zlim=c(0,120), zlab=NULL, xlab=list("distance (km)", rot=30), ylab=list("time lag (days)", rot=-35), scales=list(arrows=F, z = list(distance = 5)))) ################################################### ### code chunk number 32: st.Rnw:385-386 (eval = FALSE) ################################################### ## demo(gstat3D) gstat/inst/doc/spatio-temporal-kriging.pdf0000644000176200001440000105463214750415430020377 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 5070 /Filter /FlateDecode /N 87 /First 736 >> stream x\s۶ ~tL[ҤIn"6YrE9K;)Qdˊ#I(3LL L;Lp2 m2a-< Idw24^ i-l7QVHfKYB&ѪR:2FLFtyi2 ܂G= ʤϼU#FnF^Uٽ?={xPN3펪r~A9g Cl^ tWb*$]eqBA4_Y$uE(T_Llӵ'!piT 0?Kerbji!A3ڄі=Ϣ3V4 ůEyz\L4b?]G {1wx`'GгSV!;g#6fQ.؄U*>#VٔM&E}r!" v$a"(^ya bo尀]bQ_+9cl!SBmmȘBgg&W+]㣁>x2:SMOG:rMEKf^[ܳ "z;zNQ'P=ޥ{<"OES#Jx9U\.R &t_s:q{=ۇz_͐J|߉1:tt>CpEG8! F7Q>AOK/!R]bm3b1bQY vLCa"xxJ?%>|0k7_LKn$ߐm<JЭ;?Vl;:2o.I,b="e"DS)@Bb;UC5~KGbAL& G %U,a+suWw˦~bsqdtM;=lh nRsՔ58롴u->7VռɱBGW! K{Sj`G=L,;O&x/I IO r}E,96=5%qa+sqYxٷ .6ej=8Xrߣᐪ )Cקy.A >wo[}hyN%ådKȸI:_,{>O8@>.rQbTє݀cS""Mş뗟&>Սq̦e]n& w^2T6O)@1ۦ0 e{K/.~M~)_mݳ*LoEWYwǘ^8j{WEMp,VLqfVAO_G飅3+X{ȍSjݛ)IdS#s/y$ s)ђ0jnIT(½"x9}Li/bNFCG ~ jYʿ6KfuVͭĵ\qsK>1^ٜyåˤo 79q& ҽK5c]bWIQnƆ&ɵ{Gnް8y9=Nˋᗚ f1)lR 廪(ycVraq"lʅnƅ^:x {;3 WEgdYLИ Yܶ >l@G 38<?厮uaTxo4<5HjylmkT_KؚYVvN]Mܵ,lܚ^WG௎^Z8k':xOOmZIMU yoW^z,\whzY'Y^P5 * :Kfϭ讧}y~ʬ@tê]! 6W&_i5🯸5X_aQT&|vŮ\/4{eg]5|>Db9,j.wV +4ԫIծIWH%L@vJEáC,8]-$%T%-97\w[p7&MP7m7每2ѬBop6^T?3֟Fd6ǓSp`Cқ9i*Bt7, й b q4-r r>]}ʫ~YŠ9dZ(K96xLιn9B wkY&>1; PU5|G+.v$j 8GeyHM+\Xvn # bo!iH#*rq8[!9B6Bud6 CM+1B1qe 8+AO|4k#)(a۫^Uh6[ w 2w:. ~|9h: 6(=2ć99p B2d<|ӁpBR 쓼MdRݟ gGTc.kG7wEiwķ mN@[z\чsLR߲pwΊpzvZO'_ELh&~v"Bٵl"m1.CDL>ޓմ7'Mh9+FA}" ǭd dN,mvl{fA^/!Z ?޹>#(#4sc2I^m [@iJ }̃cDW;FRev^+[Zay+X3( 'GX1;wTN났$<Z}ΥU0\J, m iۧ@m( 78ՔޱӖq D% j71*$Wfoyx^m5.B.[z,}=-IoN'=hM)=-f,M1` A&I ŭ q;Nv2銅MʓbBO$K<5~V<ҚTXZmB'|gpi-ul i+P{S}6\Mn =4?BfZh;9QR͵G*odG`n @Әǯdlq5jFendstream endobj 89 0 obj << /Subtype /XML /Type /Metadata /Length 1388 >> stream GPL Ghostscript 10.02.1 2025-02-04T14:50:15+01:00 2025-02-04T14:50:15+01:00 LaTeX with hyperref endstream endobj 90 0 obj << /Type /ObjStm /Length 3831 /Filter /FlateDecode /N 87 /First 798 >> stream x[[s6~_fuNflN(%WsDI+'x .(xdaBT!/.E0 d l\/Bh I(w2RR]H 2NIdl:PZ3 e=P2] AQhPGBmQ= @)c ,3!|aàj LҠgC+)1W~*HutA)VT8*qsGzdEB zJTx o'S@T q]DP'hHd,}RxhsrF"ĀB{"T4Q>uꁘ Okp@8IқD􃘃6Ԏp#WEtv=]('Œt'ECU,ʟi\DOa:78$QIbxS?KTe53dyq<\miȣR-!GvGjr20z *Xfrr߮@`bl;MuykkDNnZBte)|۬&uXGyY~fNj*OftaSsjr1h6@;eb$Y3efKevAxf^#kH{0G0md$!r˰a#kǂ?#؝4+DN}ܐ4;yT2TnUo:jp rA0-rMSO6?]~l5\Qܟܟܟܟܟk{Cv"^fR=@b,l<-Ks&} Τ~" BӞI+Xˮ{' y!JywN}'“޲;mƭ08\Vs2[\V!wgi 9/K'"& -_?qz|zLgEdx ==XƴVr6OaJR%\2i8ԽI<'JJ nK*']&G>B_艑F\#=ʶ.j@ʧճ89;^A2{/嫲*cyV:rR^崜W\$# //EdK'-N_MxrUArX]?_V /&؛8Q.iǮ_$5b:yǟ_a'B#Q@2ra$|z늛m. S7[!ߍZ0 g2z߷ґp]n -ILClhM ZeSzNv*hjIV&h <>(=j\{ӟNkm[g6mkǓYzR58ɢ*I[6~o:}һ *NiGoT'iѧ]1!4ʋP pOS߇m 阝u{%R.Km bO*Z-|"S;|;)vbC'{l_Ɠ<{]i= bB|7 B |G,*BpE-;rre+QTDJ.g&sȖVOӋh_vcV69({~πº:i` %.O{Bhp <К9x6km N*l|Z|Y|_ fC2q9_vtKci+{HEs^+shB:(`!,fA MK\CgbY-oue-I u1VcV / 81>j.'Yܞ "mhL=9ܯM2Ԏ)؀~:6ѽlyOt:똁DƬe |;U&l^]GȢPL`&$aXC(b6?_j|~)1]xYK8|uJRӈ>]iGT貺ZGp(UG_#fY~8Z$cIt+fex[F#QfC9 157M8q4bD#PZ!lmhix8ZKF7VɺiF4VCW͈xqS+[(UU5݌$f,4T4J`+>8uP xd앫F:v}0HG%!Z1,( GH+c0VJ- Hj*Jƭ!Qxi~4'Q "PFc5R/P3;)й'Z +4N%6m5?*d;w*lh̀%2ށbmzO7n]u\|B6Nۻ;f~&]î{[iX m6)p? ]ٽ%6Jҕ %5]R`qؔ}9D3Q+a b<;GŴ)4{l}WyG?zJ*Fݯlt.Sl:lM|tCa#19fOV=Ż>4/lJ*&]87`Dbn9.pɡ9I($L&?F_vdN ƟZ>.9y MH æ!}CMnca HGreCYiB"Xk0E2bDC܎MqkhRxdJypHj@CP~ACph}( `Zaw/ z{h{X )m8G8X> jr}9Sv6E}=]^bٽ9~{> stream x\[s~ϯǤ\r\EҢcSH˒ܖܘY%>_3s%gEvU-b.ݍF!n}菇?4"12Θ ^2I5&Bpޠ5h|"8Uy ^{K_xHze"Q4J'K| pmlV%J{(E"Ke7@r d2jܨDK VDkfqcm06.SO #Ɯ'F*Ђ(LKS Y"&BgnA0N]b mOҀ%n,H܄*x :;Cu]t4B9Wsы {jib!!+-C8@0+ja`[GA 0TNѝ;;Gw:Pj-F`9 ڃ0Ph0$B =B+a8\܁DI`+4[Nܢ_$b\%Ē > +$;Y.Deu5Ϗ=^O1||2_D|ވ-jY^kt4ɾ?×__5uuUq4$;"+l$v F=~0>\ tlЌ{Of:3}{D]޾~><8gŸ=[jJ7n}q:_ݭOU9+WrzۼiI]/:[T"7j}Md57D+\X'}^ϯGNs\zU/IFWCf7,qyr5ts;Ԙl"W :Gm(r]!댶Cf|G,V[vK!Eg!3 ^sp5#C;ޭן_h:Fj2šفaM3~s(ժd7˫yC{J# j$s@P* b$|IJ!~ V&J<C>Y_qS]?΄tp+Uϯ[2Z7E6išb=mb4onXBd{i[׋I6r2z4>lo(CK_>굘} ]-#rEфo/^%f;HZ@B|DxUdb&L`&H=458; QG-< R2ȕJmyX6UTZiuvyMj[g=#<Э{z8[T":/닯+/柨9ZPi %Ki%Յ7%%ץԚj)LC2|ԞZǬs*H= ꣁԃ AהX˲f3Ϩc{zat>#eIPg"_1Yߪ/jϨ,KTxYUPBUAQ-;G}R9}o6pmgTRZSHeY-חϟ S :*8Pr,+Ka<2(o L&y!/xc*eQO8d*R֎UaUl. &좚;TC+5RYs}>W>dt]򾗾[QjVɒJmUvAV ,*.g.y6}:biBoU[r3°j ϾZϢe6SSM(+*!3TTQ- "\}nU٘uA9*u耏ѡܡu)v$#Hp'SAJф0RFD(sg$0oC4)ZTZ"Jk6 3ޱb["MyUi%!GfLBkxq)R SE*!Y9Te7Kq8EbP[ .}ij'3`3lf5@I9*s\ q>3 erW-m4ʙ#^IY$s~KP-=ƈ* )o05R(g _J"dt+*F+ c 1"3](kNCo3۬dh<"L74]|"k"=jjVm=ꪪ}JUL]2z ~]-Bp)R$D?ʭgi6-8Ln#~zvz >uѾ35,vٴv2lp 3zy6q|ٺIYs6ʐA7.(oO1eɋW?|`gլ:|,.! 2zj*2G ݣ<)QMI1 ),8:0-oIBDyD35Wߝe'9'S/Xu!׫~&iTL rvXj-Kz4 ɦg߄d˞^4NmVNAkڬ:>nhE֫ړ(9j/>ʁb"JW/_-6= 0R Qv܍'^B|xbc~\̎ɱ͊N~4A%h!F7bd l^Y(?&,ةUgQSn0q,"x'aQ.AI\Яr#,1 2,4Dgˍa`ۄmX"cpp5E?*Yn//j+xr2{úu+)ʪoU)CX)*x7]傖\qnoЗu ExR#X bk3F +'/jkwk riU@nlpC'˥lZ +65IC)S-ҧtL)ScIiJ ꫔H-v} 6&~ 橀T!Pu5ˮ:]}>[Gk5)TJv1=\>q*{2xxYwΆӭJևs"b$Y)bm$ uz=z`˸q5_ ( YfI)g@4r׾iwt^a!Vs"-bo4*ֵ-b;cQƖz1j1:8􌱽/Pӯmx[Ee jU2 o#d}HG4վ,B'<ڔi6 n8av6;;2SߝQ :M#$:BMG׻*W6}W>I&HN J=L,izvd~Į>&BzrBkX꜃5(׀>uZ?v(I}0 t/*'p ~Tqs.7Iyn,q'.tQH g7'i@{h?IwZ4M(x?\nϊ>q J''~d|endstream endobj 266 0 obj << /Filter /FlateDecode /Length 5886 >> stream x\[sFv~_XoS&}Н*u"]oҩ/\Ӛ:mLv-'\äLu^}BjZЩ9PvqOc7kU\dp:F;yyһ.>y}♭MX/|RG^F7?ں_lJ'=[.hB%p**Z}ǯ}}3So=nzmNQlgJ)!Y"a:3@ *>pM3sC\a *W3uV8Q0v\$*\k2ERbN4n3yf.6c}DE0}JW&F5͖<>9cd ɮnp{jI/m 'vYuI'Yɶzz *m17*)1%SkkV%Ɲ%v Fep.sICJ;=9cli< u3wiKx"yP,}7utRunzxhQip_+R"Pon\΋7K]{UD~  n\{'H𡖎pKWX6oPjxGng9L>; !%j nuƪר},q[_p, 6s'YF 齫:FMk0"~!eZ1jLq iL(P@ eYƷi `a[N?e@2 q`ہrybم3QF :?3C ig!`x@S-s:Vr!qš;5|~[O@\I/K dH2}Z3e@8>۞Uq`j1$ԴNJ "'I>dLht[k߇^9Iw<$,1//Ʊ b & ,@r,=qWtNqB`7oq dՇxUX>LB7۹g c-ӁRgEIcvR`®,f1:KAeYX[IZ/RST{%*,c \Ŭm;醆a<4S[a|? @И(9H7p@j4 ;if[,UX&^n 4xQH(-+ڶ]n K@]Fi]gj"ұ2cDj72ˮ ϠE$][~H0րk[bTjA_1T a!1>w{ٝG΁pp_@!/Miiw:326/Q]rDz1I " s[$8 \jsF /F辫ţQ˄}?ËF$tVjX5`t^mԵݞ89Rvq<30~=gkTPR,"e5t6'z!dS&OgNU44aQQ$3A)XiCz g>Yl6jzޚ`Y#RZboB@;h'cĜv !4s Ȋxh,;bphi3`iL'4]~Z| yg:i{ gp. ')خLF2䊵(bqgjFE4{;}w'nG.>_9:POzsª(#XL$B6p"D]n !-tPiG#SkT֬r20f"|ij BO׌(P<ώ:!z!X @JxjB]{ś܇gӇ!Ec #*xe~RЄr'%KP<#aV: #|jM 9Q/h U3t# O0_e BaIX[P~?GM']S1ƀ|$Ѿ?}̂aV^R'Y:Og {`'Cu Na8>plJܙMüP)VYǨ@ȵFuϿ}g]#!&_nCKih5;qs(S ,JVD1atDy'>=gHz84O~RE!wL:K  'H`qH+3h9͟|< Sخ!"]/S`JNZ8ʘVʜ؊kKؚcF2Z}lNI;HxEbrI31 r)S/)pT=:%N4`&vF&K`-q9@S90,i @IYqs*\ʧAd^겹A֘SN0$aǵPIw#USI:+mT>HXx򑑭/^c39:*e\]9ıxQ 64{,lpG8Ug$D&Pb uGuTAuRm>Wѡ补47]P]NwE"kQ2~FIž^qxcGhԸսڦeV, 6 J 0QN:G N_~#u%em(aK@'G'W^TM O83ž [PR$_wFMtq(}t`ز\"ɛaՔJZO5PC[GI#cφR .E/>~#|ϩ4ݡ> A Um숱_f3k@򱸴-)0G"8%0}iT82wFbtGM*iBRd*<8 Fw >N۳;Ÿ&+3" 8V.u# 31iXOI )ӗ} I%Wяk, Q|n6> stream x=Msu{LU|,DDJ 9qbTEv$}op\nlTJqQUuqꏯ_]?(w`y=E2\8kK'շp.dpe8]^R_p4U鴂ׯP.O)Mi\[}[׫KJ(Y4f|Q68o(>ueX x*c:[jgmBө,U|knCCx*/ލu2hSt.zW/(,S fݮ~Ui0 #?4#Anz-.B.hY4A-Bt KS!J}uwθLo{\$W${<#tv*@n5N9 \e| ~I@kzslvs8E!B0E3ihi'3Fȅgboy}mM rnC&kb0$|XGFlV½Ezuo~a{&(Hž8&Zm-mǾo] L->4[BG@h㨓[fϛM:NLH#6%0a Y /}Sۂ ?KB z^\)Dk(ĩ^]VNFJ5n`+Eh".Dioy#JO?Hsr2ayyEzxoWfp dbV'8`-2G.Ń)m&6G"d؂,@B 0|d]ZaS* 뱭*#LdxsGT UI1Y/\B.Φ週cN/MJ-AZ>= K| ҋ /QǬ.M9:,!=q=ٝ悔On :0'm PSsNPszǥNJ/ Qu. Y!y ʆ(fTٿM4 HDҁA(, PwC̑43jnu *n;8i4UlX bn^$uN03L )|gXɏ< n+X,`Nhçِ>^9~` 9?%3X P%oɂ OD6@6X%(êq i(r`I 񱅫`J'6bSvUy0=O6 lgs\m=Z9]d XklیVMfmzw˚3r?`;MN'VI0RVbKPg3v:qsw؏L\ߡO 4p_d,a?I&c[عrnJ]B,~<-L[g̗djܬhUB$ ~(7B-f}H*p= n"(Dd߳@2h5]lqNXa3xb YѺ >Hh. Zo@KƐ aLu-x꼅59r}$Xe"oדՏCوȠL5=~2 0he< .b&}ݪA؇}r]9riJ'? xAI Jz It:JmWմ}3 nUM '- huyhrnLu0ʢwޭA\w@]jلAJT.DrIiq^$R6AHЄXX\HY]K08H2ĝ(D` =&.nF! p_nݏ3ͦ4@ $c_[J)q:zjAeL+i\h9J(@tvLLv7|Z)n7YF'r`8kĚcǂ7GA]LLΦ ߱] W鎿B@o@@sP 1pԸ,GO9${&HPe;qrN1jpf;/K J/K,@C@Ps1=L`p̷QEâRKssN8/03j*gt3: :2Dr$ ^0a} v[ĩ2FC!qGYZ `%3_N=9%`@ERuqw@[rף;H |rgc3ejN0g92,|r "#\ P/i[SZB@SS0Ged眝,?;'˝/1^;sÛRX' *8;1fD'}1*x =zlJH"o(ͫxȚ8!&)7NZ"d9{kvŝ:}7C| ]^޳Afen>vӘx?w?6y~f@ 6l(J!0( +n~ ,rn%O@. ơ)O d{2Ū=R8z/oѴ3vl9{)|B#IޠXx!BzZ#*Ɓ T-(_o.bL7ݫ* ńۭiʧdl D2%:C&Lė~3 yL`ӮcP{3Coѿc]%aJg`hDCײH4 g7ͤ@'YqxsO)*+wۼvuI oGKXtP޴zxleRga;iv7Jg%8:3љz=2˖Ǘ"Eof=C4mZ_qE J8F'eh }rV3_m GX FA<OK;9xȆ}RNQywY2$MK`x۟5]0m!܍'ۼ2-.ҡV1Q俱T thG=/\xJ>h^ yB0څӎ[PEI?]j^@b1B=s)8sǏa*-ȇd\٧&XQ+ff5j0c v6 (a)>4]&@Qp%AXLͦY1 ]IA$ Ha%17${PJ,MU 搡eu,`u]pUO+QhZEPҰN9:xPM#GfS[{'0y^$fQ+R,PGԻ=fq4VC.xI ,i'96gK +)m@\ĕ2Hf,-G)tW6i/V->=$5%T'CI̲M{۵}-2n@L{1eO_}:X+ߥYP n+ВOI9׿K^P,:] n} -Wl@og☆ /r(̌CiLpcP>$5ɛ mH64#H@b4/*9أG*TsIӤm,C$\%{3$%L%֋jYIRvPbbmeR}zsjE hx*vI1?b~4. ?|\ HM#3Ie)c|%,:P+pTiNYXYr=;vWp8qAJ5 Fb,Z]XM4׉f͍ Cd8fVD?9R!7d%ꛔtP3utiyGF ȶna8X<h@,KX5; b*o pd㌻/5y^pR0k2kQ9+zu$q iWt!OM{ :CH"akCjѕ0 nD#G1Am 7'bJuQ3Hl!ęeY,y^jŢWz!3*V*:]ThRyӔAbq25) MNPq0puw{U>}2WnX2wpHO K> 8s:KmpGG-=zaחWu])P/C5,vۥ1|>5Ÿ(ns4:A*FZ hy̶V脿×vphPβܗ|gJ׻X]8!C U'o>ZqQ٘%Cn:L AUz K]VA57| b@I{ ¾V"9pm(Fa_\Lڏzb?*51pZỶjaIϜS?.EGŷ%ZVdѬ2ѡD8]U{0MD.ka|LaV)srO#pgXΓ=-;X']IeO5Tۏ'u(SFu^7Ap {n,boX7Pחˇr~geNן{\L!6+RpmfsR^OS;/TQ-r\g8ݵuL Nw-.iOENT& Toӻ-]xyK48,*F驒ꌳs򚢏_=Ȯtٟf o&#_ e"wpJW:[@QhG(*HQFQb+""3i}hssOb֬ND˔6^v]wk7zaT7kP\ާf>`-E-➼`5;okb$Y5W֕ݶ__fhuqV&6lHa8kGyҘZH$|_dSKceэXRD?ws]-tK0v/UQ#'c"Y p8,'vs~SCK"Zun\<$gx;3XJri0,* ]+A3]ƿdI7FXW (n/tbbq'I= 6^JE*9{?t{yҟ_9{h؊KχP/N bxc}w#3aa;Qic*>S1А&Ɂ3F̒+-'`l`z¦3똷=#` ē7׿_#P+Fova":(RzHrińkKwC nm 9L/Nx#X$xW :v!IU}uП@^k5_T\y$Bw1mt^4ۯ8"!wM޽WjӬ*޷ٽW }459$b)MNۃ R 15+Q㍗ݬz#DtyٜbW$g Mt'n }JUÚ ϦBrDnHڿSH3endstream endobj 268 0 obj << /Filter /FlateDecode /Length 5474 >> stream x[rr:מ+V*<^xW솺!v7ZZ_v#̬dlrb&BhPq"yvM=ƸNQ_YӤ^CɨmE'1&d{_>$ +Ȱ>ry&Z[XsMuQh,QOXMy#͠bs)?Cs71 UC*6&^׻=oUykluz3m².AӃ jqbi5K;k>&9/p;VQzOx?4l} lnO_-T:/d"7K4wM!KIG6ƒr#l ˜T4VoeN%j#HCnϪu7ِL6g,i/hj65Ud՟+h0f؎C[ht/!Cbϕ'Ock2&9!ѯ>:G LL~uۧ fƔHC:Klzu~05Ȟz *tw 'l(L|$&H {-墽gh׋r 6mY= -Yy@û&hH(h#$qZ1F66hϮNGvj$шW) )݆~('19 <܀\[ʐ܇Z,/Y o#8h(3y+ρP7[a4V底Y,h:C&?nW5ك0k0j=(lKf^|&]Q|ld9B< 2 *0~r^q 0ɔC?mvuS W>bQ3q,= P֚2np܏ F%,!qx!D"W.aęH9oI5#h6}Q rޑժT>8^Y8F74ŵeM &3gYPi`2Y.DWrH / ucoVuϿDFð7;|!X.NvZnEFF l@ J6il8R^mU!l: q0ORpCqӰsf)aN[}&1DVtߓA9&pYѾB49'Lx׀S裘`{*hgUazm^5`1Ҙj*UuLb=)`Ͳ9Q#ƭ.6[fl Tǜ=+Y(.*8+"˦Z0@V2/]q@c[Lܤ[V˗p0oF$|}1jvyPf(cNR,r2XbdŧX~So0Oj31@*hE=JZ]ߋl%rḨFU? j5=L}DbҞ=q𦉋u[}Pdwʟ‚ԫڇY(eA3 ;|R-:n :eCЈV8?ukZ)*ٮm?0=@CcΑ+Q:|P?F?i!n'F|@!"ewcM-Xl۹p-IRJ!z4We1 j,.j@1+3W/_>Y7b AUSrCn{u*Ǡ#]6y낮vMsLSSl+]q8,AG~呉^k.haoh,^?A3$eE54%Mi"Fh},gؙMSzΙ]u;Xd%[;,E^sa;/z(.} G9`uTQ:ǁ`DA>֠+ c= \g#!х$lA0\$`F>D.ӲMMKcxnh&7X"|WQ$9X>iIxiB2h͜c:g$(9F mմ)%Ȇry!s 'hہIG\! 𘷰]s,eH҈R ^,q.E[.tZavX=c枑_H/f"~A83n ~qp%kECbcmu&dqU"<!!]Mk$~y'ɝ.W6󦼢mczDdj|$iɌNwjKysR~m2i{3.W10kQi(a9C"ˏUpͽT퉪MUt0vO[M蟌#J2JMsP59i8vUmKNA~sn;5F6U8͈9kv( a81CQ{a5AٰoqQڞOQ˜1#]hV5~ڕs- [ "v6u Ӓ 3ia/U*Iae\n'BĈ"=GW7Z|?)SR5e\=~#li0|b! h n1⡮l%}[5%|⤙ {¬F7(@rR u(SJ&cJž#b[ wwT RJ ݔA [%[r߈CnwhK6Q'pT θRH?p_84^/䥟hMxqg0-el_{;U}iJSnrtx"G 34*:޳iic<_xۜaTC`nI?gs*B!'yuŠb}|0q'qzkE:ض~ޱ޺]% U1bC'˥ljĎl_wq~4\933]o6†V$@@RbuQk})1:Pl~e kK-dFy9J ԺOw'R%IpM$OXi~6~j ZߢکXb";,LspNjNٺyQPSr p9ZRݧE@,8Q|)GX P=VDQpwo-bHr'3 RFŪ!H:8\FS.z6'c@3$ԝ-H^Vm9!m>29N:dp<8 !v͡F} Ļ Grx.Gfݬ81eżEN|Q4sl1ݘV1w;4A*Si9.r\^7UqY9rwo0F/T4o'kO̐RV.WxZ?t7ВERVFN#:Mtvr*:q?A֩M!u ;WSjnH.8vכcJFfyvOhJ`I'YԷ ay 2< ]*?{ LcE"i"dPH> Ss!j3_4(lP_&1$M҆KR#$zP^(b0Si*<,*uUuK.|1N}!e?B&d=m؛mӝg6 Ą}7bv bįij1{sYv.D^'Z_Sbmw56Mߤ\HEH`]qI< eDڱ>PE󉋥CdWM !11VОRJv5S@|$|lS cϼD([ۨՎVL!׉^|/gIrOSs*{ BL&6tˆ1m-6jV:[p/kԈie}a:պGa&+KQH}%n,H:V_@Qɥ*SiJ4h9c!/+Zd~̚[E/z[(CUhcwtMㅽY^x_4djxyẐIi~'vN)$wtZܡ#Eb1.˶"}۸"QqE1 JGҟXig,׷M4."9ۀF )kXPz|·I6^ZwJ# b #0)ҕ8 AG;>_TZendstream endobj 269 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3948 >> stream xuW TTW}sV^JPDM4qQ@̠ sͧ QfI@ġqn5j2IkNL4iӧdkuU֭u߾gϾvn  W-\hdv?) 0OSթ_O^3ׇow{k@[Ȯа˖x}% 3dܙ9.f7yld0̛[k&f ,ca\)3qbƑY1,f?>aCïe]Y-kWc/|O'dL|b.N~n#SJ~əI9-8b=`7 ss%anF' fڪ% e)B!yYl(bVkɻ 5aiLQ8[qiLma 0י8qpuT^ Mu0 w7˱ W7*uP7fpp\ۑzzg^p@4^p,=NSf,eW%2; >(#KȭnπqlaUn ﭬMKK9k'?njܓx]=EfՃIW1S@^︐@]d5~&FRMjom5ڡdT} f6])]FҾi^nnf#ix W' v_\U>e2^D`[xQ;\9|8>}1i>e-1N~$ۂ:JR1N7(k4'g=z) ['/yeGj\vsN3{E}խ2 x\AJyˇ?%ܛJP$JU>3;qsIa~EPIaZ/ETHA b쐧Cg7 *1ߦ$Qi{QAK{y-+OqTA6,DBdZtbAm ''pbCM`A/?fIʭCT|$/eG K@k>>٥5n5Dr}U[UG׳:Ҡ其#mN=< mm 4p?MNǞRy^" 59w\ʘ ib&rx"/>67EhS(t ze{#1S~ ~I, lz+׺=|`^"+pB^AwnTe*3};Om rU1rcyɇpFQ dzq2y˖PE4hɈ;~5bwE2?rlr`Χ}.}.[9 XDņd g;1;q#|:_ZgʩYh@љd"?~#5DC>=6ˤ;-,MIٸCh1dWgT\^^&*VL.n>Y]^&dt!e6Qx8ά#ZPC A0ږv0z#ժ0ٓ,e烄0|T5`9xt=!_6|Oq8&" [m 㟴[hk3ңC6dmq  w [$bkrP4o O&ZXl}ː}=mcrNBguT>UCݶ}KN,]eLLHKUDzo(A\UQQ-Bd{)8$*&hBO'AEh_ޮ/k$d~ L8PUئ u:UyTlsjUhĥmUa,HU$Ci:5a !ȬdYNo[#u:|ca)9$6l,Ejw? =:V>;LVZ~_GmG2m=y84Vh=uˢde"2MҟHOs7'J< Tz%ObhYtJ2#B 49꘮[Eٶ;ʶc/r;g5s{9'Pگ)`Q.D /60Z_+[+9)$"D"OhbiT L2 ȗYrUstP,ZH;ުM=Y=yRcDQNF:J[c(.1n??o^)M;y_؂7?l t䔧A,3S¼&9xVEHhӞ.뎏kY8:~3~'![{NW* W*:Mu$] R2YOhYfRCXag7hLZl7ڷUVhJ0j["BsD% jZU, wydᲠXYP J*uJԨS#yB)r ?yKD{v522[!XWW}?Vi37tt]Q4E(+/d#,`+"'ȿ;0؀,wz+QTH3+֠Xƞ5XNy,(PqH\ @co2j |AWƖ9k|,K`њ~jOh (N-6!ba|Ņd N O LjMr.J~0~M~bk.hnaKeb۶7~K8 _:D/=Iȭ{-d{-6-ˣ3憸cA2wm%4ѸSWm]l~Lfڲ'_&j4A'ֳ\}a3`DWb՗G +gntibZCzNORd%5{\6² p˖yvGN/hkűN6\(3'9XXױex1ĴDJ"H%'8TYFE ȍqXBMy-:+|+04փmDI-N?]yCC]++"x8Am{s7 #¯E*cf5qq uBURWR)4H6VON,C:G|aȫº?Sw<]8,'stǟ:.5 7 o?PYt^hn轻s#YM^"$aiɼ o}7n'Te'ͿKWyLOKqM?@/. B%CV,K cQ'Eʣ'NsF>^% &T~hmFֳ!Aa_ cL[̦b/EP/9){xzyMeeEUW_w_g_Q|-~OK: aں[s+\dZߕzc 6yn6wDЩE~פ5r%S'zδp`b$/ȭZlG\h> stream xz\TWCgW&#&o4ޣ1U]wEfӘ~a节X&nL11uM61M^;no7Dw9=s z z[vקN|23' }{ZQ _py # g.?aϮ=)AM2?1lAB)KR CE^gEFUQ].v}M3^k/ƛ|>vN/lĞ픩^aze0 ^$V#KMbM#뉱bOl"&yDb 1D Vb!1XDL%ӈ%Rb:J ˉ Ub%&!BCaIYћ#;y-/q' l?' "`׈}ةE 8czE={MzLQ>נ^zgY?GnAo ɺRI9q 0PГŸJ] k/Ng䁗r_B"GF{D]7V0㷍N3!wg͉ډ' 'h)SNNl{F9= y}ᢀZ6:g d|s9[^pPNuD{biH׃D|*$$y|u9nX7/r8\=:Y^^foǟao1>o|H2o+jigTWEjwn3JQx)dąK[m_|w¹e$Tt6"t/L#\(@ΓU-hߔVSq>8wJ #?W^ηc@>5jg.|봧 ?15\l*,;Ӈ7vwUl2l4d!p ssgcD.L&Js'TUnn,-;ckfM./"3O?+~Qml眜qSq* (h-iRb щ7޲ߦ+Bjr]o~03R5Ah,&eɳ1W&B)Tٕp'kE2JE %Iހ|Jwol~M&ZJh&z mfPh&µ\hY&jdh fz~E]p sw+ >DA( ֦`s~[C/H\tc \7`!#5~P5n#;3,#>zJl{Ȇt=.,9"{HVm@o =ʅQ _Kv̷ml%P$#^(6ICTsWy|ɽ[6mƏF& \ĴئgXfEo"`iԅ漽5|ێڕɇpO𕛐my Η$ LҩaT Q%vp/~{VcH\W> p™pT h Q$*JIѥ' d4pp'X@LVX>):λl= NU&hB'0ޡe\e,w~O6읾#ƠןP d}Ep;@6U4JRQ-oJi t3ֻuЋrp;sjvsUSXX w:sq+ vm߶u`25`lU5 B}HnX̗S`]4z!ԒerGYhS9v|IoJ2-g3 ?ey XMz+ QV]% %Ei:Lɀ^0!eh+Z65p)JL{Nf\g9)9hAkY,bZ,fnbbboL7.*/󒚢 m07ϢEwE78O"=9:9PpT/Rz͞hė;>Ğ]ݸssO.;ܸ睙 4 m@+Kh ^م\oK+DM8=/(Vvz6kv6 @>0ѽ88וtgr oolb97 Mn (ofQЈywhK@1(sq:uvXeu>([[U?N/< 7Ґm!MXyJ/cV[&6=0,6g2]vs窵R(,vw'+tez 5R(X_BZ!W/qr9Z ltU=Ӯ;p/m| VGup &)Y g zUڨ;T #0茀x)x(ꕯoWQ_ѷ0Ui&[kǸB&6MhZڀ9לW}SQr\h+4:i=i̴eIv= l%f)`76<ǒv=Eo*7ā$^YBU{:U16:T6*M9Xi) W49X6onYw_U݈ˍ~p)q8jW4oZi| _qt:uhS )޹Cc]c'm-_ɋնyZ+&'ŰFƥwV P-,H10a^FCaȥ(,K1Vc͸ȼIY9eN멓O;|1pQ , 3R9W&drEiBD*e4L2U^;Q^_Oo@I; ŠҤ2AiRvIeS%2Wo[y1\4nRdV:@!(**tWUb0UE6+m9@9b̓{i^nin՘܁.p>sCmYa4aV*%#DZ^WE*"B΃ {Né'8/Ù~{Ν\x GZ:\+!:1nOnv4biLZ;h2VǾG{twx4 @!S. r]_1ȗ fus(Ĕm渗xslRlH)9iykaِiέ422$>Q, ;O=(>XzWy !IIZ&N̗?!p|g2aK@"\*+:ӵҀUQIy#sW.4]us  5&y܄8tۍ[jZbʪ|Ǟ8{p;`sPĽPreQK(wxmkm;v`}.FDϠQmb=Y7e70V[n)?gwWfo*\JeGNehȮ&YUSeJC]wNpJkRv2`|ĈWC_]>SP졥p_CH[E, }-.0ɘ$*K~R(^#DPW N51ܑl:2 /$ h9 ]T#E~ ޝȍޱ*gU W e\QTpS!:J$>-oKpZ;pD} L%cL5η >|iDY)G_A_Su GTJgd;Eu EIX)<@ѨU*H ZeY҄FקU&EO72V,1=& \+ed&DH`5A琛ޑeʲesж(8<p!8Njvz'Awkv+*Q i~&;A/:&][q՝( R}f* Z0&G*V#=zȡw%v2JSߟj3ٚ`XR?/^\?,G~䭿0juz>BB ZGZVYas+IO@~Z٤hju%)Oi,Zza-Ѥ-4z fґ_$?) A}&$E3Zj;P{u[0{3$c-ׇZج;Ij?42U2=ɕk9p"B s]$vfH/}oh~7ՑlN,/$YM)+!ǮQ1SP|7<ʦR$Qʔr4v7ǎL14a)U=v3kǟ#2Q9&=?םgc,ݜo0z@(m:.Q@OVs&Le81R4i 2k.|җOL?݅4}03~u7آafK} vIWv=({':-z(j3hƻFB~Dum5'imW\d|*0 v[a^A ;>"g b0 _bA5:H\]q4j2-rNG eXi $Df,^ _&оǓ n 7#݊ɘ/H-  W |R EԈz6Cy9˔\c|Sx^x\1ڍvI$7Ϣep6gxlcb6Xa.l:.gl(HDqbƌdtE*@#}s9`!VN B溂>N;_gǢH\ ,㡢Bٮ1W!O?=7hWaLd]_+L3+dxcՍnN:)1|;dzU㰣=loZ*FKL;0 H^}~u!uׅSXXqU0*;a] =/H*׺ōX4LG9?3"6XlZ'Ue.l,cZ #Aم>A|Er u ̹V46C'n*s \w\߃k=p{C ovf>A{nK(.%^CP(z 2,W{= pנؖ_\ |MȖ07.-rr1X\MPZ aS?ݜS':Ϟ" ^gA0OZܤYI?&2x]@ %U- ͥ ?wdmQF,:(7/_ & c.'ppl?WXzXB4;99Ee._^T?xC¿f:lUzD-?YmQ[pyj7/Lũ: tl 8bvp>Vhu@e oj@ iv93""\<+RUZVFOJ @[.[DKeThuOָ`+~g7|pb6tqJ,iԞVQJFW@KHPƣIކ"KF0@^՘gڪ4ɘүrS'8gɌ3< B o+~RFJ-Ңc5Uyc ~[(3ʘ2p4$[1'3^D `#TΣAֽQ4ZOvK%jV%ĎǎސpG0 Qp i f}/(6UWW{c'up:# Syuro4M_4a%,Z{g-u?&J6&\ ur5߲T̿qQ^ ৢ_+l>srƆ{=s:nٸ}>em\7EWr=-Wpc.H,M0K~n<ޥ O[iD\;.QpS6Ԇ3 bR[TנaerqQ{- W^ht? cb[~5P]7 bP$c~ _9\be%Wҽzd*1 >B%Ahl֝^W 4 KݮjH]Sz,P'amGɝ?M,; ٱgGϘ,:7oR1ÔnHk#Ʌͨ?$_T)ger H2!quRxx5'Bg ԿfG\q.  X}qXSs'PHO[tO`fѢ?|\D¿f`RXKT+3ݝԪ*,f\| FK> 'a_xl6 3a]vNa{[ [u톨)+pKk*ͺ_[2ò*òԣ l ؁ ͦxa]YSa7a-` 6!G=fE, :#9sЦ:D?!tCt+G6:GGԶH:&?OWojޣq$C.a%o|b1oػjw/|K񳹲/ ]~k`U1-(7\'JN0 _"A>{鋧ϝt%m`IGVx+*u(IsVq$ @2PVA~s t")+Cph]WVT"2#`_ k]q3l"Ȑ(7;siŎ S;ZcMHsWWݩ| Vpܾퟜ#tp*Xq9 ׂ~.~xO-dOG b7A\M=G}p;=~U!鴠DTUU\:|̤XFذ h$ˁ [.5nD:SmpaP*ҌL)_=HIj4 24qkwIKZ(i]KovmSYInUq}{ͪUQhZg$'Q^wLL'AQF;*xO u @+JI@b*Ơ3sE2endstream endobj 271 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2608 >> stream xV{TW t*Zw౾RVdw(JEP<+&b1@, )R@V{t[=X][8R~/͙3sfǕP(Dzk71>zΝ R0O|X3{j|О}Ĥv(bfN}Ű[gϙKQ:ʟ@PMj5ZNVQ5GeQ^M-Ej,%&((/IU4tcPLEO71qxQ^WkFw>3]ܲ I{T^ɪK4 i$fE:FA7p;==Iק: `:zlc߁xNA?vh#\ JWʒ]Ðy GUO3>=.cq6\OtLɖI-IUP~#@dp ס6AY~fۗf1:|.MT %o O*cTEa]R{oH/Oy{K]שF胖]UPHx;a[֭SNIߠvHA1\z 0d# $p瓹@"ddB^%3w?0<+q1y7d%L0X4|GxQef$]%Ż|vZ YVVD~ƔW%[jQ=g^_dq"]a0'ҩS\[pJL;0ߖHw}e*7-)>XU7H > EХ`k?Y\{+$?] 5R"Nhݼhi&&5ew\_\Z?a-RIeuvjW_d0@3'hXѵ-y'#謪=S2zI/1w3!YU)LpJ*#Bm!`vR aDEfTeRSX 8Uv57' -āBgU=PM&&ajړ0^{>u%;|q0~5EF+ʟ@`sTtsLlo l30ތXL=Vum3xK-0]}GbMy~NqzKkn{w[O>řϣ p%N 8kRwc:ϡ~:RZ)~(B F|@I/: 6W$ dIyrQ gs+t0,PT H~HMQR}(2]@z=A2 ra!0Y ,֊6XDnA0Y|a7 kۯیEAih{2f<';2| Ȩp牿L#Á]u`CR{OKq .civ`tθRDI(&W 9Қܹ'\W*Ōe By6.®(д.Y{%ja$C 8,%v.ܳ9 GY 0`R d{ }u/ bOn>4ʭ/ 8NְX -VmJP9^f^(4ucʄ={uu%5eu*b,+d"*Zk{ʨ{q c|&K1Z k` QdQZF+q,CLW'F^JZfN.32kU"U5p:Nݧ,j'2:{7[TSwjvOYaKDƬ3;eSVF~MwO]K^,ul*m,KOĤ (Gd;[f[e dCeɐh>9޽$BEq8Ӭ,'AJrȺ#~G 68SK2Va@ G+$I6a1 /:#N((0ĘyYs$ 3l!^2 nI10fSy_o@K5B/0DGӿ,_, wgbeks5jƜy"4OHy^9pԌƐ[T|Jz;?z]$b1wIiq_nTHԽ₧@OYV$HH3i3D+(>DďK9lj;QQ:)S,J%'n`xX܈|7߆ƾmc0͵W/pۺ*CS6KS3 |Q[#璭m VüuID {"QENb[unʗ@ CQfdbFע[49)>>wp:%]1[ddui9KEcR>Hϸ*腳gov-ƺ$Bc= 6X(0lOV-*\ÍWEQ*Zendstream endobj 272 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1546 >> stream xmPTU{oK)MeILɷ 5RLZQWaW!}Rpea|[PEeU$K⡩}hP3tp3yy~My{Q4M+-_8` ),;3kThjxJJ7OΟ13`EQ+ש *z VPS5K=FF7A]#^E^?2K߽ {;.lpIJqg?#E7;oVDԚ$L߮e/f%|Vc!-^} A"Kb#".f뇦,$49<Ԏ#'%Œ Βa!J ]{ ݵFX!I7V_ Bq{f2 fbZo[m5GfjE[dDz̀e\6ZS] HFi@ZZ&TV}rS]?6SĘ Š~hj^<8_fZw Rg\TNw$i"A.)-\.qi/qĸEEeǀikexWU}A搧O2Y_HU5esrE FA= Pbp [8kA}hrA4ߵoܔ߰V_qUI!u)k龬[":Rjtɉ {+uFk3Sw {j-$!iUW~m/3Hd~ ;|DTaM5$ SYn)+TΞ ջc-(UO}=}Wlomw=zp<*9.''ҹT3EMȓ$9|u!Sp8\wА۵F@xVo_ɡ/$oNy;%Jhs|:61} psnÐ6Afo+fӁQmҨJ/.'i|I|2V)367PДcAwxV2 h#fbb ^C4˂|r} g<Ѝ+pS+^*e&AJ(uT dpo,T emrqwpCyld X{U8%ϫ΀} .2RXt)e9s@$L6TUgo7%N^23>S|"PQpN͟xm+"1dì1둾w,dlƯORekugEמ6}eN3^9u3GF؅k.>C7^g۪Ku=BsM(Kgrmy,-`ҋᠠ]E ~!endstream endobj 273 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3849 >> stream xmW tڞ4B :\XD(*HKYdoKK)P-钦Y4ڍKҔ)K)KAQT"bA+"WV~?{?sNΙɜoy}>X 4tbwf \ o gz~O'DŽ&&πԀ''-t^v(ca1^;0(27&P'nog-hh!?ŋ$pKRG=.ܯ^m.BYHUR5 G.Vਪ U&*G:!v! ]38Kfߞ=cA "I%ӥNk hXRx~$r~M$^ rkŎ#QxVl/7@ 0w;xN 4,8PѪUgR?*;a LC!O- }xp΅.m5E"TLQ(N9#)/#,%MΜ^tHu*;bp wO V"G~ZBѫ Ss(9`@i,r*Z[.SԔ ֣Eh#(\0}77a\#mEl ,j8Y‹N4w BƠ KC7%ѩI?hc{+ٗGO ' +s#dFbH2%ݹUFĝ4)߆RjBdWNNwr8^wkޝ;^rOӃ-f7<3rTB /:z;z'bl b6ob %'8ľBOP2t>Hx^ȕuTv7'gǴXj SЧ??H~B&D bhz U%$cQQST_+E1L(\|X^~u.f5ݝ*GU.W8Bj)*}dfLFh^NpYﱤx?H8 KƟ%әtJUI{cMP IiluVA xDRtz*@#[Q [5}_=8}{55Ng"rPgqXkrDND_51<0i|>}<5 G<$ SMFZ[ѵ!?mܫ/B]Ŵtpm'&ZGJMRc-'ܱ(՗tz< 0םC4_P-ȥ5h5j068t{q|UAe"S0|{$fiǦqA,8awˉбWagn>="Ca9O ^3mZ:2f0mxqf:@akb`7uk<.Uj+;;]]MōbᢹԻ[e&OaW&|Ӽ%X^n(=2 Ȋjjx \ȑ)UJO-Jd PX2 3ϞLAJm)9mʐʤ0ݬ5!T[ÝVSS߮oCޚnP.U-LVwWܼ@{VP!ՖɾKkMhc䘝+J3w3_v\p2zъ̴E^STŜ$+ ۆ_U+nSX׌E~-wWqTWIR$W|sgOb%ŘNg]@#h`? aCɴ\8YV?NRMJ8ZURq5孮J+.+@T]ZEkWRA*ɇP sdC-(iNqTbv&wkNFW[GPY)39b ە;\<=6_t0l;nsLs2n YN‹)d⡙ze1#y?f”VT(^;rm<\C?o~b GƁ.+A_+8Q~nEJCI2gWNF4&ҫm@_|aJT@#ZJ`3ֱnD_~Pjq]u=:UFtAsY{6gVWFj(h @ZO lJK6%OʖI-b!V~s#y(bYH]SsWS[9)EۡJg1 N`@&<$yE6^gC`xg*Wt N>71ʪHSf2Kpɑ8Rj)7j v?ȑնpD/WEޥN/սm5I= ߙ-ɋ@^-=>(, #^cLȬ3#Zx]%GH]뙇hD‹i99{qӃt_vo"*s|zRtjǕϸBv njy8q!ͼ18nUBIgj%05r.HAϹ2kU9Q%:1q\],gbME#VUn~Pq]EEE1Ǩ{AT\*`;1xH,>,KQ+%Ӎ>>kn&5'+,O%vIfuUW d.P҂@XtO,^'m*BjZCKJӞD9Sabb,Ȣp\lUf|!☑!XY(ߒ?aa^W^}n/y9{3t=g(Ҽ F ߽Ӷq_Kk~gWQ | '"'.@6Rί󐼰| x:O?sQ*Y$*Q•p}gQ_=m'jIM.LK-}`/xXx?m+Kɠa!գVxevU7:p#.N6M5j1(%R`;uT Z9 kihfln6&ֈK)SR6mc_=<8 |_ 5Xߊ~ʩ]Vr GUGa&?}ήZ8uu uM n8p,$|i癣7[wTDMi?'rS;~mYL>yELaU ZaAñ|_<(+ :3z=+Ēb⒣MSSr-݌Bw p}͍-VjFFo,"Rxt-Z[k(A5.#qLX#D aG/ ypxPS"N._?mqxi[ލڼ)2v\QJ3A Tmٍy( o#C#t槏 x3^TDG^@w +yu8l{tL/ALyC:ݟ۷uo婶ZP.j*񏬸> stream xY tTU~!佇g$޸( ((BA!WKjMU%Ԓ+UI !CEf hmr.gngzg$UuNNw_A/,[634ˋ9`p6<9z\Nd~&=[9 _Ku_*ڰqS[ Jm}tqcȄ5N"{%xXF%^&+#yb.1O[0G\xۂ ;#ydޖ #tC2"lq}d΋5*ħmt25~1W=oҝ1<m:(P$2yz95f:*Ul/o=r?Kp@?~'&NzrF4[<'S\<4>qaԟ{ge`*Rp\ ޢS7o J =yN$ 1Z>-pYz>@A?΂4b^(A Z"~兙1 <=C{ͣS jWXr/B/2P!IubUe80dy}fo>p΂y\ǣ!9Cb$*Aĝs&-Y$`ݣ RpE"f/B)xAXY W@*djTnr,X;O(8)uHyEU+Gp| %њpϟ`?b-,b4Z JnoEQ}+@`'3Dh)ꅼ_ć ,Vd27aˇA2dATDz`q$ ÖGD4<лi~AɪU7wE)>//[:OΛB&h: `!',q)u3Q̕V7_s!T)8ˆ!z#|OOSyL"xM_8:Wܜ8gܝG],&qu(wj%jQcdK뭛=x (nZ5+E31%R$r)WxBu7ªJSpw*kO/]N-5pϺXݘx * /$o<,Y |~.N,pwr>**-ᛦC 44ZIrij qd28.=[)T|&}xrks~qקJhuæ % U,wNVǘi, ٢pR~[1T֗J2%@Un6?T&zvm2.d,J` L&4mS\R]SF,h-Z](zy;, SqcJJU"Q*i`TBi_;H 9ӆ>CTSc^|'i kXZ z1 :G"jCBaQHiym[783z} sCǰ7 Ԟrn D L#2#BlkEyF5f@{N~z'M]ʨwr4Xǐ1dZ+әDa@`!E 1~6_Cu5p1GWW%Sǹ#d![z]&l}HSTU{w2ErP/T(Gb N LNF:6-`?h'A}6fP/{N8;M –5s84I~z˟䂥M IkNiSLH\N/gv?[@'.[h҆5yh`&5j==_8ֺV[+ k)gkQTEnFxs: Yijaj`ӷ:~\LIySbHFx5>>iѻTGT =EVd89j*}>4q{{s$tqeOxnmiGDB؉[[hIH а5Ls v{W"5Gn2|AdEhÛ}>G4gjЄ1vsxہ]89^e{hؕHʜnmE2E4  G_" AxqD_ \J ,:2{.=5''tl8.nr;yn4{F!SmszWh+US8yl,Rm%_I+/Ж#gդu%Jdb\Y =g 5ie}ȩFK_0pN",.2f2o*LlTYcEKsSlg(Y2?jͦ~Iem]wG??5{MVi CbuIG&"vmbM 卬©V֕yJ~9XpBȵ_njNĴezⵋO|akVѣpb۶;)!.o:+>R?Kp erElt8VQ΋_P6F[0R+ϢiBb0a1$/aQ=F~MT@f|l #JYhLH4nfRjlOJRn:%v+}{Y`0ߕTp чәMW#-?K^>s9JWh%#txt|4j8>#7Z 4N{즟O2< R?8df9f~9"2COk4*tbœ!Q9` ;ތcw3$Zye%` XDs: F3Bloa،gt+3}qI[=U̢)BlچX{txke]]mCOоA ,I8qF<ߙغѨڇ,JK8@nCwQeQ t- "HM ]Gmw =#P[5QG~ m ߇C3#h.*M$+-ibQucR~lm% hLpQG=__eYY"1BX?'^rJ.ذ&c%mP1 JB :: )8%'0r) W_BlviF#~%؞5>MGYh2h3 ؎7*b<)*l:΅mdNqwc/͞f>qL(k }RWO_!h(94ŀf=~I6O$h冿;pCdS o!2-vK)$`a8v(]}<\gŸyY8ޤ%*&[%5uhfgaa H}Ϛ5pI"h-:ۺ7V*":i݌o^}N3{RG~ԯӳb-$c?P&Et={ZYc,s>57d_Ӎ\f;}3PFډa0EW: Ph#Ul/li.x}[R+jv%hlAOl/v|TK*k)k js G;_<5t'Ţ*M]Q]5GVbømJz~Z*@/Rk܋phpSړJ«H8,`@ rF5 R^__|k᳗c~Y PתZ2yt@cJʉbC1x >@`w+1C; `YotHSL|K}uo);QT@d~}ga hRw> stream xYs~׻sNbǮ#i;q })Tnooo=23>/_lONO'b;y~qrz.e5: _O1~r=XZә4>ްW\<9gf9 ii7M_]OeE[2VeE_u}ҨUul>8֞=Kea$ +Sa eǩ6_X*/^x_,a_7ݾ/[ ݲKtrUY/ZL5Ye=^|8I2 1qXa^?3N>1?a~vrk!36}tC .gƫ L2Ai1L/_fh9"O1[䏠*))7v2r@\ Tx| qy ;9]G4HSa@SgzGcβ}6 I$E6DIijuY]We&@kD@ҲRG)O@7X)Efs `bjUї8-<k:rs:*+z7:@p(e"‘K|@x"@q5ª2n3~,Rsw7`'Y .K\O8{G[!⴬3+c;ϜЦJqmo2}^o -"4٦XP LMU7Jn~~ R A 37X0J?[&zo*DOǰy6a$涫B f] h47TX*0eEEtC v16J׊mC`-Iɣq$2a)Qm7r4TnT4&4 G9 AZN.3{Q 5Hc0 )2Xb4WM+4@yT )kFE "C'Be)R^ :A~777$]DfW=*wI=J7V-lH:ֱŒ9xTa bkFQj<6 :L<@NI@IцiΆi(G! :(:%!`\J:4T 'D!aĪI}BTDPuV9jB9`}qc@L$b8$-?HhE=PBAW1Q NK"BK=că7 Fx츈rK11AFeTdJk25@/]CG1PCj\>J =yP~ } l^; pC&ck%@ξ͞go Ծ+סfA~LȲI" lw ulW:if"8R3/5&fODצG]fCLGFA5VlS:;< >*н(;B &De hef܀qHS98g[Cfr1B78\C\ -$&!>5jQEi!1l7r8%Om%6cg\s:J`F=)̥d18m9sк "d:Ц4%4YZ[,'#aoZbV<h_)Ht H;v~^ҌYaBx.;H=-?@.Sh#[I} {D6D_rr cCAa*:#׹ɳ*5z@1PjZ{'ږp^)=#`0< =ψMQRlVuAEP: Xf0%,gН qކj4XPz"=R˅n4R>rf P/3> stream xWyxSն?4( -=qD**2L eBJ4$&͜4stn4iZXP@e E\D;uΗ^PQq_ ߌL%QEp`עв~P*7G1/sA(G,nݖ=e]vNSޘa\҄/2P+Yj%ex귨vn^2a#˗rgS ) f n0.,mqNXVi$A¢[ʪNZF!5 9PT"/S4hl"ziXQέB)I4x<}!YviH$GUFǥC1( hۅhޝ<47l0nfH|I0YZY\j)[n^䅟ffY(㞂IJ$.*]A&19ܤ}IFiT ܈@>*44#o~h8x'р3:Q7E4LJ.QO[CZ$0cU49$3!9 "t] ܵuϺk+x*ހנxzD ͚tޮ̵n/O8.nعtmx_ ~N~ P%~ҍ)BWEv`7:3zxm8/pk@S>Y:!.cMhNp4#4 ?fhN4@UX>&VIk[vhT4nZ1jy4&y2Z46z&_2HkԒl %UHn F42+9u0 J%M, |6}LbʄtUgV%Akȅ^ =u: 䞀]m]Sumf q#:{/9U r(tZpr8Y?Yha@QSQPk}xv&[5#U -IZB(t.  tC7jT [>{V2&ǠJ#2n> ?\ L}cili8?U* M rj0HI1)\hc|z?t&_HS-b3Z6rzeT)F9kmTK/Zu>%b|_\C7iJEa.,g-՝5r[@l.Z TM^oQX.M+ @1Ph΀iʬ-2r$bd5rNN9zZ`8GNP ڠS]*ʨUM6_] oP5e 1tvhZM&|߅#nEu~4Yz*@CO}VH޲h>0oѬ 8f(ڶwh+;dj Ҵm~M˄1e3a]nCm̩dn<o~|ڲz{=]H^Vd,E,`V.ھExrXa(,p7#3{Rђph_FFEt/d](bzNg$⬁*L~Qg;Gx}Ml;6ZH.֠+ ʷ5h#Eht<\~vW9shAIMY򢣨ܟomiofeyYbD΢ ajV@I UtJ.)o5:r'hl]mDcH(6IzP냈=u@p7ؚY"'3d}&X*u=`w) yA< Ugm1 9GǷk-5|Nӎ0+>"rJ.?H0~,=\ѰawEgy[Cc.M`WfI5-(Y"s3V!)ם3G}lf0;zQ?+8N"}ۇ$D\_m.2kNG.;?J,gWjr:YJ(R1"mml\-ļg,Iik5uڏ>*γPFN7兗:2FetvZU@]vT活,p#\@-oˣq{73xuޥhG5mzP|AnQJ˴~{/bh 8F<ߠV xD҇@d/xl٤(*F A{Hu4o5،6H75rj2srӞ>>48<Y pSޮT^W3e LcFf{ 0Zu-Üvlj6T.~k w$eVu&=6o :*aV]s}F?F<o/mc7qkƱd wdGNʛ|9UYМ( ŢBMd=Tf32G` 1v1"'{ϨPų/ϼV8,U~cV?y\5l/=*o243ׄfKe,{"BQકi>U;%.;,q:%dy'w\$SGg#<$o ShܯpwϦRd'DяD+s`6]+ uAW 1NO/I=14+d6銞I|6_p,4#[-xX|vwywmZoH^VaF't@'XZ<-{p_d7it GѺS5 %y9?ѽ5`{f{~ AG H] 8vEa~JlU%42] u6s?D GZ\9)~֪E˗\T4ăCмl*yI2Wh$S;&&}D4wG0wt+/mS #@ djGSwf℺{8 o-L]$es4 vKIm7: QRX͛6ŵf0dD鬁OP*,"endstream endobj 277 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2594 >> stream x{pTϲI<k]U{F{ED@$$Iddwwϻso.dC.R ^vj uz ALߙ3~yMx<^ɒOO=ݭe] b1B%3J\ū~ӟ~yk3Ef|Y|zL8u=]Cѽ JlzP5b/=IYVB6v&NoJ~_\xX0ڷ A#Qo׼ Vؘӓ񏒃{ ;[ f$WYu52S3k}mpdyxiA*-</D  8;(?iٌ&b VJaf[ΪX+cSh&[ɉ~qܸHJbIvy?0w=x  ǩ/Gz "28 /MC@IL.+E2n7/vNb9s>S2wŔf!Aוd琤  8"}$i(D5;{˳2%y=r Hz=22?CPeփ Wxxp1{WWk㊐H(=|mЊK,sGTj^)?S 52ԚEҮvF璻m*Y0Twj~GFv[8f% ;Q}~o% BzP/هG!NcN԰?TԁJbr6kl?vuOAljѰdX BK4:Ѩ]~ }$;{ rMAg",lƼu[ͫ/3##HMaGְCn"9IWJmUEj،K}"mX_,ϩ:uEi%϶lJf㞄_4̢ݟFWwj)ENS01qxŞ߱?g vw~m,E5UgEc@[3 <$T̞<:2t*䣮1qh! IU=(@hlT?W4.Ґ1@uWmT(׽e5cnC==p8SҴ,eLitg2&]$YFnfZAzT&xB _CN^(_gH@unp Q=(h2V┣DIr!sF=9ZلV-f(pB * I{pObAaU:Tp2'A5P~rT anC73{ 'vH 8x V[T;grk3;a[H <2W?GB{ [/!VeNow7ӌk.aCpC=SJQr#ol\fΤ3M8i;M]&uMR!e?Ep.v9*Ee{o8_] ?]jD˗}]ƢI n07:ϙ>G8 -];)6M`-[_i% !%fG-7"MBfF}Ԡ> stream xkLUm_:b0K2%.q0f$FeHLdl8UV D,۟PJ)^WpYaa$h\5F}w?$?sr~9RxDEVh9 ]^~'q.$yr^&ݔJ6iboo8,.Z2f=:bxXvi1X:҃NhwNW x&bWgh4:+v'ZJaؙ,U8ikhl~aUN̈Ziv͝$2<nJ˜hM<+c2u#Wweb LeɩhP;^w?xK C &p=VHIOJÜ\$]E1kb7X3kbFlsR y"Q Rkjt cXHd${/֥^sr5uSVp+& .jq/ #CyKd;:2慅Lv^P&X0u^Q3^7 ɾ^م*`M!۷+~ -p]{w0<2z36Yη.νZŗ@slcݑP||TMo,eS`6:Z>k}4GyTW"Ç.Jo3 9t,I[S&!]ܯ' BaU<;EI,geU = va H+sҴRSxH#jgyvSX"EvB1 3thZ+Gmendstream endobj 279 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 245 >> stream xCMBX9$  uz1[XOa {y ~G~saX$xP4㋼n>R wwZÜ#Z #% 7 U^ endstream endobj 280 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1278 >> stream x}]LSgOmaGVv:/J,.[4Ώmfsa ~rӞ T84sa,n(,3ĘݼGvs0WqEőת7E P{HK/5תTmljz-v;}UaGrLhlSa(&ny?ob㜽$4gsgye>COD;u*qS :}}0~̤,&T:[SjX V+jŢ&7OvDH_8i +U-Y*X<>by>]m!^1TݒpG β!m4S{Ê50F`Z\əJ0o^ފ:fʃ2Ɂ0y⒒|׿A=\7ZTMm(3;ˡ+I 1|Ql+ܖp QYScPTP;iZ;;NkIt> stream xzwtSw6I(q^ ^ -nwٲzwɖmcl1@ Z!2)3dBvOeϼ5={cAS_ NwòYN}iT4q]k/[&po=pk7̦YͳesZR(KV,ڸjekVԮ[/>ȕɩOO,'X,_DA2C傇+V <&(.X-xC`M3O f f <#xK9| / Ă)@pP  Q nL3G_ו^~~"" /knw_n~Sf--~}kmOvvG&wb)M钬/;3:@'oxyѹ=x􉻞=i~ <}&9V+&gV)҉Eۖǖ.6nH\V)R %23ہ3P5 -#Ywz#zE+cRP`s܂{%u¦Km:%i["+ ! Á@cFiГ$U za⻏hb>kll^n|ԝvl.7@jv4vHzԩ@f͚&p. F7'޶wQѯ?!u^ͣRU;?wBT527==Q؜ :ɏ_WO{vp)'o$F߁]H;¬wiuiw+'2viZ\HpLFhOi|u!M9V m:1G^r?:Q gz+zvbog߱MG]ǀDmÛ`0stҮ%L7eCs([(=mowLC*B;czt%9Zl}E]7{L^r]tT=;d+F_ C})wq׺ɸK~]|;7~WZuVU#=VuVlj ueQQDϐw$wNzs*T)Q^"ažT'a%=BgӖ-nh[֋VsSD;Ɲ wp}kG3V Vh :2n4{%J` C ƈab"}-PbDpլ ɝ UqR{s:\kQYDX3`@ 'Dw%N{  csMmKa _Ypv-`ё>4(&F_q>/ɴvyI$q}R[34p\ힸoowP,XFJv^)#Dv^hZLk%Zn(МJ4X 7 26ӏO b|h졎CP'x-ԶjZy麚ʅE8@a3 ]|K ;*ZLrP=D,zl 0°gV2*nP>}7|Pf`]{H-He\Kd խY^[l Gդ&Ȟ0mVf#X oK~0ע;v=뚀aS&nLP{"$ql2m| =>C'5>Gv`+6b]]njAjBRK zlЙHA7DgBE#,MmCS%lܗq>ҭ9)ՂqF|tvIL;jT oeȟ#|tm,<C۪. .kIf,*j^e:4iU9VnY3Va/3cݏrL~ykyƘ`d$/tu/&1AAc1Y 롘]j5aDlUX*Uue a%U1vCH&ٟǃU5rd揇a7O}y6wBQsSЋGNn5>O"E*/֚kffВol8B} VEgjV 6>lx"?|M=KCk] UWYlTwⲘ PĈb6@Rb?3;Σhp4[mk%KS5&a49t|l|,&^OӋVc0y*@(TL36$̕I;Mn?-2^LqRJ=F0i6[ _tC, j-L0F=`81dݗَ^" #BؽVf 9@=Ա:mZi/SaUؕqeD4Tl|JnuY{aه8Ռ6J% 90{Bl H>x8OݱW5 /'e #:(SzF To?CAV*(zsFZzj,mٴ0˖`k+UM|l , g|ܝyƄv9QhrkTfMIs7_i-U;ˡ006!=]@Yw+y-DK#žaiTMl z`sD#4N7CYpHc(s7@)*-X--ѓKtc#OO24c#+^*eYG,ٸhоynRbd*r?R!*Evz;r~7&u{ޮތ:R)Ѫǃt ɦ?ÞؔF͏&֭qkqe**؊B !oZI;!w>\ esۦrM򬆻$D uGx/|>9Et:1Oe8|?v̛fpzl;+ef7)d8 Kbk!4Sz I#.WLfʹiS@*ו/.rf/?MD{Lhxwݖ37>NGsN;H?t4ZZq,&=QqfgGf<c6lOщ>!hP]ܚ t&(500hIɇ6ktiuIƙ0睬c2SK]@BL $k,hOv!]+uqY5)OMFt,;YT^1#l2!#LCBڸffxtoK h;- 8qc?[opPmEui/&M:2%.@Q®QbVFYӚ.rϊdeiIF j[9-ol nzSpgut۞=@j-MXsVsbr͋s@Z!G|d[O'Ϥ$ޓx,dšb5~)ZҡMbG6 y/|d@ty: =عRcVi g^)bw wWlm2 Yh'2׌56tE/R:7-Vc2@(ONQ,HZ.FU;eN„cm9Kl##Ĉpԓ 11M?_V,-n׮ cMI板8I5/XdP r͍s:5K@ B4 GB Қh Y[-5dI-w[wk wɾHab=ǴFvv Mf+un\δbh:gRn$>1X* 0s>ՇW[MVHBʕ,$q 9C> baҸ z 4X>|n\b(5Vk6H+eS~"iv wiHAE QƋ)0fG]{Ƣ][!&&5w$nD?MͯxE9mf Rl"n^ƃ)< O@0 2ޠ7T*y(Vv '[#kϏ]Fk'~j?>3azIz;lI=rw݄nhc[]kͳaC:QոAخkJ,daAnXL)4f`$._5{UUVWep+Pb`t0ir2y;VNykZux]~UEF˅bZۆsaiaFN ˆ ?XX>b٭8C!aü"} NI_ʛDy9o~!|{j˓ < F1%A! Oٽvfwn9Y9_ &]'1KܗkOӶ4 Ѥv= ]G aclF]o8~?>z?ר؅jh"DE)KB} #?n?bl7H%f2[ VaͼY@.myoxH=GТ WQK~=-w>z+Kx@oV>i%'y兘>'fvbUBr7Adh%rFt*$ (WQ& +uC˸縛lxCw{"9譝cب3f|X5,# rJMsA:)KM:Uxym_~)u10f b|WS 3VO-z2n?1i [6d:m[^qE=ed. y6ktkn\v]Zpy ޥwN w wT8DL-L2lh10tz{4`m{pT&?.>L~0~HK1n/osˤ/Utꐛ'G%\!?>.p4oM X&QܑdڐQ n!8 GD|*a>+dZR b=JrS^nGn08BTSQ\?4҉;ǒɎdUA/ٕ{*d>}2s>z.qT RbA9]u.[C Vȍ9M[MXv? b[~ALbTkd񶺑scMPaA"w7j씾y'i'4X/3'r\zEȳ~/Oι/~HkG2}Gr#H? %!WxeRe/R{ΏMtf£H;0\'aB,~F& ob..hX, tvZbk6,ٹ»$_|oTez|кrLuέwa?Vk# ^6N+&T'ͯs'DZ*UO׈oY6]91Ɛ;DwGT¯LMZRRܤkt5᪡1*H|E|ύ[JM/.v\g ']N:;=ޝ! mJno]N}rB-2mhD[ %%r 0P>ݓ#(:<#1{Ë:z[mnG~ot 6Yǃ (=]h}6m:j޷8 w-$Nݼ"pu%w>cS_`+d(VZ=Pu0 _h 8|P wNLɡSl^_췅ҞdKES y&UܭW F͋P #L`r;p D[[ !_4jd9V%q{|\$.Ѐ04mv@BCȐ#hl~c"X"owkUkP4n _+5gtu$J1,;!dA40e-㽰/mHD-Ҋr4 MX3Z^]{Uu|\따k.=\Bڡ;"qYͤ:aom P)*C'Lr+iDkKcqZ\z:wT 7鳹HzOG?k=MF;zoV\n]ITC5[X[EljW k:EnWJZ T̨>uꦿC\l9x0('a&l&s&,hyz}ܝiҭUd%>Ծ(vbm'V~7`NX78lJ4?VRI"ͭ3z,")=#{#)JT]jJ V11UӬr3r4&&XgFfM-.Ȭ{Il{2]rW\Wv9n3|qh󅢳3EN<9JoHљw)Lz!Eε/GwGϒwN%/.!D4pE6iXn[5+WJ'`B lPR4):gFmGwnз "& T-Գu8fqh c%)3WjҬ6n ƠD4jEbCIBk`'gKYʨ&BtN0xH-!ug Ns蜑_s9~"-q+pNl %@/MxMtq"G܏0aŦJFsR:"nNlwn$` ڈ#D&fviv:ؙ;}wب?q2kkMv#zΥ/x;U*uB24yH; _,_ܖrU.G~-Qhh1ldd*2/hgZ0ڡv>yO#); }4Et%/&{#}X2 RwH%uX;8^yū)ro9>4 q kv@;ꯦWk)QjHT^!vVY̛rrMwNt݇G:z}@*[(꠯>-s;=o,ڟK6q>ݳ{æT$;vD]s~bjF H kS8 հ|$WJjx;$5t\aReU[h 1uamϻ㶙& ټǢh ki~iNv9+tAy&[f%?XwuO޽qw)M> @)w N||n7n4 Kp`ag`hyewwTPe9i~LY8 -V{PUWe\/GS萸bYhDŽ^dV聨=bkXI hM]@ӡ~ɟ@BK^D Vcžo8 oKF&)36k\#BO/ؗ>s/.}rP_ rtg.(OEblꡖ7 Q.UZEv}$u4W4ݘ^=8,6 >C,:E\W'hA֖sr}gup[M&id*֯^PPL#7vUfzmRz -?T5u^l٢EH_GG we~FTBNIoEЍXQSmxhVWѵ]@ѰZ5c{NiJT̈́Y$w'o>>Nq~e+ǰ'vW5VbTՖڷuK{ָAA_8r*tLڟ]6uvZoVr8k tp~cdst|>$Chf c%M[|?u[8\.L`j5;< o*-nRi%..)x2XpkπF$xB~ԉ#s|E.6 9ye#]EU ^>}r]2 {(F'6Һᙂc%o9F9pe.4)q fM%O>7Zgc۵}-_>v- aYu|(P ]-)%خj8.] n&&6.':>HBW4>C\}ފ򦪍ۜ1C bHw O #yA.n4 m>"z"lH_S\ t~Q( `H<9njj("gt=翰&r~=' 򩏸Ėo~u*tcS%@8hp$4v1siHW#ttl 9z0o\nΝf+ US Ljݰ9ē콯9@c# $uH</o^7:*+*0HZ #V5C蜳E(EX鼴B"G>h۽>n: }vo4ݏssU| ]+cv >k>[Dt*G"Lw@)8o׬n).^|f ?wqn5)ګn.^j?}\d(̫[TsmނEouc~d7Oendstream endobj 282 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7630 >> stream xzxe 5uc N&L909,MYMMM3 d awϘW6fow4PwUW:sn+ k0wRaaNAz=<?q+&LĝWVM[=}͌Z~ΆE%K 2^kW_[wi7[ ^faXoel. Vcc >{8l!6M&bIdM]MaS4l:6q.XW,ecݱX> S6 {{==b[M@`v5gwʶޛ ;%n+vԴn>}ゎ;3g'<şߚ;<Ys].vuy޷^Bf$ݏ6ҷٌգo%=@_Ce/e_:4[*\j8z5ɗy|**v=?Dj{DFc?92Dƕ˅ U!(c4n7'|X\hSMF}Sܟ JֲockZ) @QvuMoe9rp68+#©#LBz$.kUf[ԏ|L j 'XH3 8bk6$6m  n j K+\D\~?ǜ| ~N|# $z fԸ(w+ŧ6*;cWۀ4&f7vFvwbm!@ȷIR5'>>vq; KR^u% 2 xvզi[oi6k@ YKh JP>bvA.dⲄ!<e.(I^26k[p+w{R+S >e|#h0ջ&&'bnJo:rKn4Q=>V@Ay©kyE"LR uI1r]g_PMKf #mДa+FA 6渮bM: =lʊ8j+yؕ/h~蜌ƍ]2`e:ɬWS}Sm kCͤg̎f{0'ToU3YWd-l)~4 X8H~V3Z 35" +BI< ;Bu>AlYDt!:eHܿF/T[ ;6 >RWKg `grLw_=1y9H8>:0 84rTLڛ z}CP"A@}vJw06zap(d`p";aWBAD-;f{쿌S$\4 sjW-@9)b'J |MQ9&G~b#&ɺeDl}&bb,x +a\㤩;w%pj{BC$UR6K |:!tIbo l}oLfmzzՇÎuP]"!v"BsJȧ0E%Vvsj>ƹڢ8* utQ* @p4v`1Lݺd "=`w|pi>+̅#AxB!1;QG~ȶ]h%E"B yYL IDR~Q`o&S(jllMf?qXeAnÚ}`7\oyUnGnkp\¯)eq#v9L~ẵ4 m d("O$B4g30dJZ1U3Ez>Ja{OO4O6k52 #>ya[ Rx_Fjڢ. -- .8"/N|+p;;"g"gg![<ghXT+&G;43&<5*p8L|.JWjԉC^Sx3ݾBҲ GKNQEeoU}r廝߻"G^.SSۋLExe>z'wuReVmbG^4K!S4`QlwkC}CI?y"9"!ǘbv/.ݭMӤ+@@AW\\Y;D7Qyc"]um1]pLDLs.0,NϽ/s551ke­U. &/k -" 伷 c_C#eqF3:rnbk< *nAJJ c$JL-3&O!VpqL ;tQ/ y%sd8EVj$i'pjit'h*F@Bkp=aZKXNw>Gl -x,%DN1fM86/UyqڋCyNx²zCΩ Wx!~Wt*>Ϝٙ\W3EL_b' 聸VbRAʆ}w2-zfCJxd;W"mÒHq/ ; (et=QkzAŹKHTƴ6lxc `;=dq+iÙFZgq:2*v/Yjm>MLSٺ9A!lU!i h}+%)/T"䓼v>ٜ˔ _fX,ZnJVE^dJÔ`A7'U>GcDxpcEA5+ɓh&)Gp#^rP/+LN6jT@(h KHͥrTOI [.C3:_a mG5 D7{O7/"73*ʫΔ%d\8UXG^s.,".a" lIcË@!P@&5PS;bgSTWjV<~DnF4:>o69.O*t nlG^u<oBLʲHsxX`TPm~"mT73KЍJp=rՁV`*^ْwrvzޤJ4/]ŽɬTgٰ ÁFϹw٧dI6>5v8Ir9ڈ(RI%׃`1Ui:%N+#>"YXЖ$^CS)4:GH(aaNc0%jk ~ͺ GFM°Zv6좩ݱ;7bÁUHt^7 hڲ*r.Œ/'{*b8m}M6Ix%$?wX"e` (dYY8Gá&m:S/-gRwTpVK$^o~ _򇛮# v Gՠ\ HNVq :s4Z̀?aFMBڂuPybX$V`ft82@-J{ͭW>Rm#Шe!]*>>e9^-ݏ?@6;R;|BŠ;:⣽{ܹz /_hͮD:uhzz? t 8U P'soqa ib Wi%.m}_J5G%cӱ-4`5* \9 ڝu¸XLRƚ.~Ϲ4;";%A1!ݲ$kQI$& }$wa)5M[_kB}P*R,T+W:f0RNDGFNyx$/\޴9؈0.j,? !G`˅lfΑC8&vv鏷9sp (md-b qߏ9z_P k%Mk} `Lm?RM'y?v$.6}HMKW7z@"?CwG|hXTQ@er^ObP ',& /UĘ h$a07BfG j#TQ9p0"6|v{i&(b<VxlԇO Q/{ JT4hDB2]gBX;ͭ!x .Cdr$x<lx'EBԥQ>*U@DWN+QP du4!y Y]vIY"fRT~Mj Re\gh&Ioo.ᦴL _?'~ɳlAKلאa_7%鸵 ӌ`7;]Eiy+z {Uu#yv.kTLPF%!jz=*^!Xf‡<3OgҟiiEZ\$P U3ۊoZԯHzEF= I<k#qcVh ,CQ?J)k JDp{(E2Q#zA/ΆHN)DR!o{g !eApx"kb|=K$+ 7dRBZLqzK9ģHΈQE@/KGF1n ҇Vs:I70lxOnl ,nXݕ=hU@X |sv9|'XN%YMӔCYnl ~QTzA4dUTP 7]Iqӣz]ZdswSd?9VZW#&_=|۱;zʏOi &vq#w24+Y23ހ}ti30 Nz 'v`7W1 i%z#%vrb˂H8H/H< zf'+6qԐus1y߄ .u<ٜ='%B)P/ڮ7jq䩻.+#H^m9r,Y2Ik-h9P~ڰ޹w.tkEZRHyZQI r Sd' l=j>j=j#ȁh𛏆>eiee_*K3<ؐ4jr^?C,&83N/H5.Zc9K&~B$(vw  [^اz^k:8ڽT*T'MX9m_Nv/9eFp9mVJ֘K>I8 \ /U xJ0"Ol$""8X%]/F|mm6ۛ`__HsŌðO [*WzfY'Nq>JR,mͨB RC_O&Y>ڽ> e40 | .VY57}ˬ!ߢJhI/sX| L6 PW2x(ub [(kM5JnX`$7ч*NN>tODe1OwGց9` 䔔 V{Yp Ezkڷq_#yOԋ V]Dɠ< qeZY7hAHZ\Q|~+ί<.ϥwi=F҆`Li;lun{υ7B?IAZ]KLh(KlfoPEV#ZHV}92H) *L=%j 6=Ӗqw zSY dCʈrҧ |Dw\8uOdǸf4hsdۣjr 2ƣ؄,`s'WtHI}`(qh$| ߅cb2OO}Zk0>Ð4ө-ͼ+͇#)o)BI70p|aDXpj} 6/<0ɖײaX/殑k$Հ$^iH^8#VWnXXn7l8yfqOq3AH 68* 93B1K3sw"T꼙HNVCLD#5he@Nfz#a85F1iCǴ@1\ɺ J1B (kj !eHx i/? tB^Nb_F?y˅V %^YU۸s~ ~ qWwxA hP X[UROmpk1 -w9lolv"`ܳ'{\Ol9T!J ˧UY%G1LZꜦ|>:^يkPmFlt:Pe'i'l6-z ˽\8AWy\=_E֭Rs+̠4XVKcqRJD~r#_EZRl l֛lVaⰰ!i\Mo;/ |ZDWTW.\'SԀO a~G-" źPA27Rϯ[FNKdc' .\dYKкM"&pӋZHRGtҊRl-4 HU6u=`n @ _'.Ό0fzO|ǻbo j몝b"1 ⬬#)8 5wV< "A(>6mbs8ERcBҀLf ]Seɧ [[ T{td/endstream endobj 283 0 obj << /Filter /FlateDecode /Length 6534 >> stream x\Yq?ph7clD,Y G8H>`1Т%GyRL6P/onO7oyc|/pMDz7&o+o|٘E4,31h&xcwГ[ʾݥ]HMѥh|fbop2Yz8 p;-~l3g=wRE [ qhȪe֓=H أn͹tmAMj,kjxY5,/XXtk+8$bۀx |:GWܔ;K΂_3X>qlD$bZT,(|E6V=-h~3Pp VfJvDٲ[IKpig'k|ASƸ=`\Y}bnp}[]ǃ断h?1UaY_^_N+$T i` b2m[mn )yG5@o+lrkQ1kBnL ߉sZGb3@df\R aXp!E9~ƀ[>/Iu <]POkzC܅LN!' Vf{PC%!V-wunʻ4k-hŴپSZ͠jnJ=lt#L\ wKGaCğdfmXdO4 ʬ>'Ն6Ɗ}հDƮ%sT O"ZYXxK;{M$P\B{Z)>t؄4GZmߪ7vX3< X8u7NK5i<> e7~}U-1;4ә#2 ѯ+>"pTs o4Cأ.s =T2!)xGΈrK4U74O"LM{r LJtgqaO lkDžF1\6/11Ipg]6ڪ Tz8o oq 6$Qe#?,Uu7-åx?9l!xFI41v:LM$?7y-($vBL/kߺi8Lo @ hoKePJ]QƩ.5 Lۄ֘a` @gE^`W06.h-]1U|"JS07j:o M;sDoF %8(TD  *(W+3:^`*%Khl97n0řl1! d4hDpGJ D9|C٣ЍyXFco+͜^=l2{0xJ0/3=͛,J8軅(#.7+^PzEsƯCB#gw[# ^^N?ۜAKRƔƼftH;HYNUGO:(Yvt,, :*Sq@_xV*.A3M&{{r啸Uۈ^GS]g 儼p%R8<̔ <Ԑs8Nv,(vUÜ^O`*Zc__Pe"Em:Aϸ>/\P&Tׄ lÏVI9![c ]UKGe `rW:o'a)N ?y[$8̝YRG@'AΦZB#4(.-x!+h^w+g dac'Bphb8q<'PWsfJ'Y a3L0+tx#YMlb8=}; 6XDeZXٿm;vCs#okB!a`ɺc)Pдu6)ɻsxL)l-7Q]O,U_qJ"9@P>:q'mL BUn3 "Oѓ$ k)``&lDm;s9]aqyNYӓqp8Me.L  YVN"Wu2(2Zȭ53 Hk2S"$ؗWd ;u3]A/2XqSU ˵JAL~ h@hIm~uR(T0la*q,:W^:ݬIP(=ܶ8Cƣ}F ZvH/@*KQ V @0#Jo5Zq oXw͸)D>PPT/MU^:N8=jL vضk|i `RQvs\C$ΑȽK.cf3Dq ~˸ʧhWUB*Oz/>c[>ZI}285QUs}wH#&DAbQpT^jz8p>lb4,8 i%@ZBTr%}GW^eᤪ(ɒa2 lKʬ1 3cV.&wE[`: mdoC$&& BaiҵX+C "Y|7c mVzJ(Gn n&!4D08ȧ""؆5^Usa"s1Jom3\?,\7w R %0ܙ{kybe-|8]8_e?U!ځZwZnb^HNOHGsX g7 W c c[ZKDQH(ܕ[O$/L}F2FE(e`VbdvخPjŶiI?݉/^zg K=璼sr7x3XOiEIw яx$GPF.49:ྶb|Gor۵ QR4CΔ^=2-fX ՜\ ,[_IſYvn⻈l*JRQἙN?\Ns XJJlwurI' 4טe^zęCfϓH\bZWj]/+k7| ‚iaܳi$M"HUIJҸ{p=UUa}<.!DL 0t٠x5E;>;{z2R qjkss \]/'=4ӤMc3MI;r%lAO)Q;.ڇsOD{ț9xk7s)Q <'.ZM,J(#Z-Yf#i~TkqT,g."{тDݻdNs(nxb.WK/55-S\_-%}C.TvzxDeIR}2_K|yO |8 6TJ1nc=ϸM\cå[j؟ERAR\XP̒5~ZP\)ksa8ϴ0{ x:qȮЁUX4oĜ$5:Ww+㪎v~~ {Ix9΁H f$a9yFb9jO)s(0}SNS><R"fNfZf|;G< ch/|3>9]* {vs'J7/e,뫂 cg05 s ا3N_>iC=JSQPH$ͨfy]jxYBwywd:~7)Y*j]X@wZ]8<(OT*v[=%gREnZfC%2.9JjH(Z7M1 9( ݪwIt8 HjCT[#-(I|<( }527q_á$JFrm (o uR8)e)9UtɀrV-5r;8^?3YJILl.iӠA%L1 IkvB)mO `l1XFKT2U.Fj.P^g n^~<Ȅ7AՐ4Kc06}Vc0.ўc~^@'xzM:1^xMV0Y +jC_f?(O&Si^Qd]]xM0-< f\tչ{ɷTxvh_@qiP-<`qqmApC 307grendstream endobj 284 0 obj << /Filter /FlateDecode /Length 3143 >> stream x\IsN>fl"/q3$,vT9pHHb %[9@"0 7lL_nD7G;Nߍ__~Wk6pZ(q76ZyÉdL6smUM_]z]naX5dch~"TsxPpFԞ`;e'mYNrXJsAé$ 75D@Y,|c9}G(pS ,LpL0i0ʘ:FqB).D zzέGB1vq͸Xx^NYf4hcdQ^;11Oe`u2Y929==6tTak%F:2Hsۧ<6$G3@6`G }6o]F_=m !>nyMRkӣ$Q̷-z]y\9&('ǭnõ"$ ΃Cd+e(w7Hp%_D6q12S sdM3u}SNI7X$$L+l՛WMd]xb ^I>wl W Hͭ[gXn ΅枟ǐTNwp=#"Q?J7pT_lwƥ[!SşC5]_*QKjХ*vjhah`i> stream xU}Pwj9{KNg;zMQT * $@I$/bND"VwX:[gvngggv;>y@ /MHIzD_~\\\r, !.ƻ*ҳ?%"EAaQq*1+G&_I"NHT"H'^&!Mfj"F,$:"[yY/ 1/4:c *4Xv0DV߅apdXـB-nTZ%rT\a]td;YOWGϵ`AhQ2ˆmOWOt 4; 2"sqrK|?W}㞣On[ !պ578_V qAQqi}aםEaաak(a#[hWhb8}T18ۯ 1e2W쀭 ^\ϙŖ?fsTqɩuf0ǝxB ~7G(P~{̸? ho?>[` hj[TG]C`ncdwJZba,_==X? vL$d4@hXZDe/49QjsQsmXu%z8\jj+c9uL>b;3)+ڒuK4lZ YZ_[x]> vU 1y$NpV\9 VכnGO:Tfdi0'!~u_xb:`ةecw##0 O9V. |S21qqXue#k2d3lj{HKWpx)g=e3“s|YGΨLd k>Tʀ_9e"{L]߫}3Ţ{o ǏƁn"#Cw32"O(׽o(/)j=H])߉[Ң{:A7ۥ(vM+TI-z OUԠmoU֦mT[-,kqG_By_R2'c4wn3rJx8Dp;kl..33>r.^v.pS56Z7Ӫ NP@_՚2nQqgpHzҩ%u|`rvO;}"YTZfCA-Ţ]ՙZ[Xsޣ&:6YB,n53Au~ϦgoGjla=vdhy[w*"fY` OOV%nֵ]*Fs؇N?MI?׭-+;ѝS?sŋ6HM%9'bF@{bhv$*z\p?슄@*)7m'hVUV}hFᎦ6Z4ج=TLfm6־.`-K8̪OE{] 7zp-껽Lbp5eX(P7f=rjVW 2jXYIWVТIŦ/ÊIV2TpUtLA"l> U ڎ>W>1&S ~m\d-uDixṊkf}Io_o߄sdJeha>5ޭcGHj׶gɿek8e.Ljpa쏌GoB8ub#Ʋg;)PU|0@/2;z?#H`sT4w\SHVl5J ؐ[5. $-"b YtL}|QA-ŮQ^ 7 qWendstream endobj 286 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 821 >> stream x* SFBX1728\  stagTUBHg(xhm_XPĚpD𗍑z~t~srqC#| $ y}wSIK}]4dznSwh90J^UHcdіt\<ۦpT8j[ynzphh^}_`j[*!p1Z8ihh]~lvz{rv}nnnl|tkeh3+`#f[w‹→N@$vRF2ԁΝ[GTH;rr|{ ? Épendstream endobj 287 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2648 >> stream xVip^!{XQ01&$\4mC 6cF|ʒ)Y+Y|%X>mphBb&\N1L mЕv=yW@L¶,_l!,! ͟Ad Ρ\3+ڷ?p\DIRK(j+ N©j'ZKERj96BR/`>4(eȴU ¿LiZ@E8ӷL4cW 6lf?~FPgIYaoXZ=,ׂ0FJHa`&4~G۶1\:('3'4S'KZ9ݻ1 T]~05XE:I$"e2rcWsE}}~#&]ڨ &1IR2LduN3:FBYfT{ /-g*+{ >zz'ޱ8W0*BLOjrLǾIe`̡?P,eO-u Oj.2%^ oͨYw@cTӮ>m0MetafML= [ss64BmaKqLRHJ7)*ޤRAx)D'ΘcmN# r;. 6*lWQ?A/ߋ XXRc8L)5LPc `#ըr!g8NgAWbD\^SiFy(j=N]Y'nJqJ҃׾BDyg)ϦOf V}ʠVR5Kk}PhȪ=*o)j|j_DQÆp3u0O`4eI]6}-֥pOJTZ-UDrCz_E"6DwosCX&;T[:jӫoHr<# r"$:.zӺ]Mq5;0;b<O]R3.lOwr5m1]30̸}*zt[QΫOKrQ %ybEXzpxzuTlhJ|5% xHte4ƾN|ε_;{=b4tsvϿ}7K/fK = H4AfqτnO4%oD],=睢WmQ>O}#wsuLfGÌ!iD$C˓AΪNinxѸ+11fʆ%բ~z،t)LJ[RrAC_֝][wZU|(r]./ #N&t6_uiU9 R2d `ҁD ek|\'l! M?!fcDm/͓KbO#Bas|Vlcݓ6-D>Q*hKt]2?&{ln2cAž+?M6]G=G& G[ExֺdMؤom4<-C1T`w*?ޕV4TW˙ aY)2endstream endobj 288 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3467 >> stream x}W TS׺>r"*ʋNyS,AB_01ףZQh"瓤O.߯f |>eݔ]Sz} bJ@gT*}wH"Fsq%v W@WB~oiz4Ha,$DšcT S9lon$ 2QcsHYz˘*c/i%ɡv^E]N?Co >A3Ƣ`iD?+EOBޝ {{x:RvO{0XJuy?@jDNAoLO@WP@b8;A/BL=< O1yc;kMVԙ,p^Ryh\+ \#Wk" ^tfEݻGs_5}_9ndiQ÷/׮#Wb?:C ShGB%:qFP62n8K߂-c1 ){A˿Mu}؎57k6I/ BDl šd0_D#Ɖrec6vDm"݋jsQ>Z$'r s y%@5\Pfs %\^v\\QL:iOTURYpХs9l>Wk!hҏYm/4尊 x<@NU (+09Tb2Kf(uMYf sL_a|QĆs٧!] `>2{e sy(ϐ:n"[328J͠ڵ"CwT%Y~ Oîj[[)Z\/:2$g{}]<^>ݷeU!\XPdz=ܴyh TYˈ\ ]Χ2xgICMy>8 $nKɌͰyُ?M3'54צ9kϨbn8-M8+* mzϽ%m94;<;/D?F"4=m;Ucfb_b$v> pa麄Kٿ39 菉/])1ð;|>3DNn$"'']Ԁ&tFAj_%M3;ZEVޝ>l bBM"F7>7N ѬU~V j(WL)LR]bKk1:Y9Sif&~Y@։ZKDR,iy GutUǏ@D:G~#U;m^ohNCVeQY!K 䬹ve dg$2O ߗ yL!:Jnбh9ˈy<~pe+E4MbaϫEpC0Z "zImG`cGeM#a/s:f.^FBT|S*駯aSEk(iXPDPN :\ {J ` _ upWn~>r|-s[vt=:{JCu:Č<ߏb7XBLCHFhGwzg"gZf슀A\LAl]dBb y(SK9\.ZnꕾbqBX\PPl&ZGJU^Ob! CC}.?3H'[S%n[ۓc9/n{ I?;endstream endobj 289 0 obj << /Filter /FlateDecode /Length 1839 >> stream xXM7sCwoa81X9JܱZ%Mb83 9bU==njLZw&Y(THie!m'2"8qƳJYKL:s7Fe_gʈl40ٲcUvK/ Eb6YLBk\n`mY?\ XiVo0D$Yy}juGT]T1R[kbd7ܫƘ1 !/q35Yz{XL\^d.wj)+ m8m'=LZX]0z;;s pe9]/dEc!h''/wqm.$Z^C$ase߮0eS.Ǔ'Ur1.m)9.Y.eATqp`PXSwPVWaOT/3Z-^Pw^ll;v0iic=57i\3o>|#V?y6ku-n?;c[BZ-yW'N~{l]pbN·M O}_]So *A`$ UowiGbu +{Dx\(ѲM% F;ŧQRZGNO7zcĐ#wP9J^2n8L@SO>398Dma} 6mP 7M?0eKdeZ|O>LyFB%caz~)NrhnlyC֛͛I{|o B&B:-޼0myMC<qD b\vR<c4Jj"02~);t=P[fpPݸAZQp_""(y" VF*n.G h%c.svKs%q7-uIKP"ll_+锊\ڈ[WAk>yz \,PlB+"xeBգNx bˬC Oƈ†o-D0>\bݦXx'=z) Mm>QF Nx u[єz7lA@?K7p4$pzIoՒYɫ;oOb'V, (!{AFwcr8z CG+&XzX1E@8J9 w6 Ba$7UC6M7g8cendstream endobj 290 0 obj << /BitsPerComponent 8 /ColorSpace 216 0 R /Filter /FlateDecode /Height 300 /Subtype /Image /Width 675 /Length 5837 >> stream x}:4Bjî)+mUBe[ '~Kx~ja <؎_;b-g(G\Ly>B|1gG fRs{Q:=GŬXBHKQ&,狕0S0Yϭk;oH!!ljR׃VVwzC-bG ʻD K0DljM`S$ʵ56ׇi~ZD A, %][Xђx\ ^4Bf)f\Gdž|M9-'H2IuFBHԧ$OqI !Q>2B>}e$)D}N %(HH$Nr?['A<.WSߢ8"&ZNr&7!֮D;$Av 7vDҫ;7U$46?l,џ%ߦQ~MDӗz5gՏU?E|U y]9+>̔Fμ?*Nj:TOyQk궪O I2)eGMaJQ!>iGUиi//eFG)Q]"SyG5̹u?JѼ/L<FBy|{,;GCf_doUt{JNAymwDQ2iK?Nvt`ʭ YA T*,%JEjH%*ސ"Տۓz3_g UVT$)?TߪIQTXh~~ҵ/Q7n$ZcWbWelk85:R;,_?R)e\'\ܙWi[4EMEbUE_zI5c$WMM 2: Ik5%֢#$zTEoqʡ ggrftew=/EWO%P~#_s﵏Db[pV6M%rIߙRPEm=M)Z+)SL@dmC;*E-^]?՘jtOQE kDؑAm>]!tzǜ&i8nǥ&ߐ@IV:L.Ui U[:y-v(cft87vaȕ f8%_fl{DH W}"l9?@H`5WՓ"qubՅ _$_ƧWf!1GZ)y17~*[ݶi^sYٵ\I2!"Xk6W;>g訸V3˕ĬH9+r3 Z@cn84 0J]F.S'J|"/舱빊Z \ԗ=Z`䰤OV!)6e( 7JYӟD Q te$J/ ;D`bOFTI'l #`l QB7b1 %J!ftjoI 4gӹ4t_+->%H]q]t9vVXJ":*l?QdFNJ? YO7-!BƽTmѩz5koarL[ ׷Z [=RW;[=7l0>z(OɊH z-]ʟFrw2Y6 [=+H8!$PHދrSH [=mJe+Ao!:-^ʆ֪k\b, iܢ6 3MX/ 9(I[=zGiH\Ԧc}Dj?=}׽-aR҄.U5$oZR9- AJΐrөK';r=Jt:l~x>p[f;)? oq8菏[1S3ڈÍNn&&r#̶ SO3al wpttQh=ՕئA随N=g=]) ZNk%؝N=ZDz}{A3iih"+Z^8D]t4D+fU494(:~ijS?ju5At9o<8rѣiXI6ju '&ea:(΍|t2^keO'хxLu):c^M+|^)^92ӝ(6򀟺E\t*SD[Y [+f6^>U-+Oy.nía/.[Y|:^d#7˒T@Nu~ӭFjXXFhpgm8GDnf:eyTƑLvlo~B;=N%IgGЃoۢii$PlE`0u[7RXŞF&qhJHZɤDo%:b^$;N@\&QNutӮFrwjZ'IR?~~}L{.66X {]Ku5yHD٫-i)kW]`Aף-:ob&F0GK]~%s%Y烼Cw+!݄[amt#>ĜF}̈́0D2z4AGMO̵KMe`-Ԕ[_Mۛ̓[D7W&l'~zf=">e1ݩo!޼JEGWK:{(ȽnCKq*α񼤇Vd.c9 kmrE@'.L1IlmSm&]FR!pVӀ/@u|Z3\ ʷv)q; N> /5jQtԲ9mٔvizuuٙIjt Fgnve+-pOHWDH<:4c`F(HBbbT$)KBu`1jX؄RNmofEK>-ڥi68Jc<ڷo\5MN@5]TZC :tpi@c51F}?0*h$&%ؑ[7!Visv4Vck G&3s*h<}J5^#ݑ^q`({'ɜzRHQ"D=#J>?qot;myjnv̷:Yxz k>2eLa@=-?Z4bvs,ֱW]3X3e1f+"R-: ?jէ!?LGhٜpY=*W=YQv!H$НI!7U!F@>E5g?] 4͢>*RGpjӷRԪecRB XN짽YufRe|ҎPu]Lz>NuMs1z_J4Bc7[(8Hrww1F~ģ Q{.;^2OĢz(RA߽-ӨC@uVN 1blL /9"SA"Sr e_HZ% ]aJPGT_stvӎ1zJTc)WO#Oksy DǐV.D>y'ARި.#uN:oښ T!&W8} 6rGSSiZ0o1-uaeyyyc 1IA&'!IIsq5HZW Ĥ/WZ.6)CRm/*ugnuJ#Lb(Ez?2f]VHr_jJCiSJA/UIյuݥLFa" Alt7 e0e^|l.Ϝao*maXCzYh,o0.Wp28(HH$Nܮ$ !dG$OqI !Q>2B>}e$)D}HR#i^.vJN}$y)k Ô^3i߈ͤl?bFU(ǂ`bK??-VRdGqp(VЕ!r; T="mB #ڭ2ĊzNm S,}wYY?5,V(WڄmE(r^6 4?m`(Ȼ,t~\"6VJo6KYNpiGYQjC< 4 |{>o3@:B_R8C?fksh_K!XUM49|i*Be$FϤCZC {!hisrY~U$*&Jɓ@ BJRU=.rRYȊ{35Z'JUI[aQKV?'eBx>DA$taiwDAIT\P<endstream endobj 291 0 obj << /BitsPerComponent 8 /ColorSpace 139 0 R /Filter /FlateDecode /Height 450 /Subtype /Image /Width 675 /Length 18995 >> stream x4/ k9,B.\`!$i2Cå O[:n~%zJl' {[lI%b-b-b-b-b-b-b-b-b-b-x~_Ϻ/;KlE4DkKclE$n/ol*bb&u'WK=XYhThb7EX.zWK" EҳtoаRr`_vߩz6'B@?yJ6f|#}۾<,\.[V,~ނ@iEUxP7O~[2K7*Q@؅ QA= wߓ~9~_b@sK2' 5+v^r th~ Wt߇SAHϼ\pBqE1} i~c EorpICe]UԾ +}sXTU|~98K$% ZL#;wV7BW¼:KE)OQv-8]HTMEy@R7K2֣'bE} K NrJ_x@ V9i[|~y/_ -yH,Z,') ^rY:\3~Vy~]Ł dN*a<(zSae]zY*W6*zf'EؗΟ Do\hv4y@kQPW̕$ rW3@~[,lhZT˥񒗿nqIK ;;49@ڤ"fmM-VbZ:ԋmM-V[ 2ڣ#KSXhSĦh*^NE%0Y-­ iyYot[0tnԈnˏY腓T]AA /J[0P{3U)Ǭ@uhR93vH: vN+fZ\Q6xMrqZ'PS3+zfWt6ӀE; $͏ۢQy*ttĎ @B{] U w9hu/!@}~r׬mh=@s3h0Y9hv~/9B*CA>\ )EǴOQʀ>7V hqEQV% ' QэR;H) 芀Y@+j~DvJCJ!,@P&;3? ihƒ?U)9ʈHO?fW4,++ E6#)Duu@y@+P4?5^w@Sw~m@ ^E?~ z'׳g"M'O 輾Wh1Erp1q&'N'ݻwO::Z(N>ICGGzjS˔ @8:\OZ9н!*:}Z:z8,իъ@+PKyW9 Lf=b{m~Z9:*4UhU(z ô(Ar[5 hg J@9R@ήb>*uS¶)jzsy92tp*P^#Ϣ@P92[H`(:p\Nt;;Г'O ݉4 e(tEH٬ %xK+:$F%_\zrTw"-!)GuI@}G9jj߆߮_ى8$zB9j:N trٜG9j֑W}$r4QHFhO"ɞhE@ ELX6CQ.ovU+b(UQ^)Uw9>}:::'Cs"(zy8EDUzݗaOh߿9J7 z*#1(GS".(at?JN`(zsMo(qv1œ=~l6eZ ɾcηU=|hqU=9@6Nu{ٔS:f41=k@ (ʁq6EߡVT?vopyLVTa$Ϟq8j_ye aÂ}ɋ -5A[t>|Up14d(j@[C(F E kC; mgqGi@+ ~L+ߝ k)E]XEꫤ@.~hyEePW2*L9?$ m\E= c(MЪzC#@B1tiY;g8 K$ EE@NCQ&@Mt߽~ޡkz@S!Yqr(w"@CK~{Gl$gB;ޡ~{HW@~;8RWC(Pa0yHw?%u'wfh2ed'@VO[Q YWg-$/؇%%f}(ޙ_WD(Ͼgu+OE.PQf&.c@ ;wV[Q/Wd͙WdɳE|Rt)+;k{CtՁН;Ѳ|7@S8@dPTx44,,E:aRTo( E( i(y\{ i(!_N v6-T;y){>1c'%:1{7?*ɜs"v S-@ׯ'40 h[ŀ@؞V yvPh>P 48nyG֠(ӺuVw F !)kt룢fMw; tPGSC[CD3PAd %(ʎRtHT$NtVT?` d@|1(J@y.$P[Њ<ݠ2]@ehyhES@SG'{'Rђe?t 5٤O'K!2 !{PpB2t@N2UBCX ȌөȌF^ .\ݜ:uJ:/-;l*A-4*.Gq4{x;E9GME8R"M.Vw` dtؙ#ڴ#@R~[%YÆ5uDra0;XЅ OH-7D:%:}֔"ŏ6.&;MzwkR3T ?G Pf(vc'oWʜ.E7Ȝ.elHW. dNͨ(XdvXCL v@CWT 3 ܭ h(Q+*3pV5È@D"v钊:˅w܉QURQ`_M?:glQ̪@)K(Z G9O DFZ@Д_X=6TT[Zh8j⫦ѣvƨޏF> gfYE ϳiͶP"i%!Ϩh$1WmDȿ #b@]FOL(С3ha ]O&m܊ZDQF96%v:>0$Ѿzr&f@xrxC5hjަ،Ѝ8A1+soݻٛK$n'9 {E htkZ@P֜jAEohݻ GϜp~ (E.Q*{SdR49p] Q&g9~"UTT{#ݻ GϜrl sn{CAbZlKǕ @ٖPQ!ghGtÇ7J) U޻箺L:Q4W11R?~G$*:)DÇ':s Q{f@Np QR )D~}DG3YMQPahz(C[W"u )) 7E) fMwJ4ECG X?hsFe YL+c5+(x_7jW1.X2f[㌆FbxkS ::2B}FC q 22>uT?'>,HEըBE;-;*HEʖw(nqhà-JQ!N_@qGj(> 9E$*hBUIP/s0pEU B [$"VIu5.Ec5b23`- ^%=3Q PbeQ _j]yGeaCqE޿? Wѓ''a Kn&E~̤hzvXL6ڬV~ d'ONwOr MR chhAE;Q2 "h4_ V)~8@꧕V4܈dž3"L}QJ!} _oV$" ᲀ>CKS򀀡'Պ0 (Ugz\Yiy@POI+4| e=4stEyYCYT!}"v6;U@-Y+2ȭI@/:;&EÄ6OeQt"Kfi!4J˗h PDq{B/U/;,+@$0Խ0Կ X&jV+< PnC6y66kqb/c*PX\@X(EO 5u6l"a<xS؏ 9իzw1v__ewvJ@SEd[tRWH_ $pF[STЫaի4ZHw׽.tQnϚ)VK>Se`N%\$gltpM<2u41pȎ$@:&-YQl:z h H2 uƧ%rԝVTv6+͂ӥTO+)Ov+ ZNP?Q٧%hE[;TFQd M%iE[;}CTFQĮ}*ޏAsh8#ԧK4P/ih4`p{{ƨ c( HY w<Pȑ#9ő#ǝƨ +dS4s1w4$dE6E#; 4431wH lbF %[~TTԹvV!jj?(r H,#Ť&AT&3NhCp`H*PQ^;Wtyniw"6S)e*J lR TT @Y?;ZTQE?9[ҒC*uP7:["ŇT,< P?uDE'?YHCy@$]u>EM0/R dž )j8u@éF(֞4`6p;4\;}1EmI M_Q(oh0quԟ?oh럮{b(}C?!uU+Z74Hɩu/umu.)%=w6ԫ:`o1 t ׅ J@< EBC>І@7n9ԆznRȌ Oڦ.QtﺺlU&Lr:GN-ke} %,8x*tvt S7脀U$LӚ* (gXӼP3Zd<`OA@nu)j_ *eD$y }z"F IEoD1hc@m5*` {%j* [g n)p@IK&U~RtL_ {d uzV1 9XnNtoa1R<6MD@*=rY:1&MÖ2kT(GY@[KEOȞc@UbW@ZQ.ߙI~#zOdTQ9.ЯҥjX/LCox.@HOl Π 7n A ][,CѯL$@@\C5f/ |־Gj :2ԴԽ-Q2\@Cޖɶ( d%@,}@ Q[cT @ < \S)l4>'hY6}WPL@ {=3ڏVV.Ey7"}!!I 0Q:Nm4$-[ t+hUN G %m48S8@)E[hem POUm{jW&Pzy:R}}U?M<{,u)Ph(r4gc eM=ެPXǁTMre1ua s. cO:;sࡌX"fXҽ>cR[xwI,(v^5ARO+ZrLP$xV@TxTj@-V#dxp+ݗq+lVqrfZV~a})ީJ. @ENd-Ph24nÒ'.Hnu@r>g?HEwKk%W+ͫJ&K$c??=ѿy$cr%(Y](dVuv Yu%"r(N?[٬YPxRJFKR1߈1ݧ 9jUN79q:$ƛnYx or we09?oTo偼-hÏ9v*2kr5 j+tiLx^RT>>l _Ѭ =zT+1.hiZ9'%LB 9phL)D~5":#]V(?&zsx4M؎|C@A:@|y (ZDE5R4]3EK)GkE[V Y wq^$iCgm4%݁t~EdQ8Gs1sppEo fEpFQaN>ФoHE=r*K'xWs,nY@n\RO^+1,K(?[2E'18)ZBq4O⊤+K}cϟ/WzˏpG'Ęl-y0+o/rMWE/w0s?Ÿ_1/P(!.߿Y1.?ߵP d)O>3d}ރlO޳ I@^sEBt׏%ڢ!h1Ͽ۵uf 6y@¾hPʸuJHW~- | Rted^m_KL9Geż=ѷ >U؟~QmS #(^i2o):`ӼŶB5TԌc FOzEa%[&Qy14e/2ğO`R߿^;l#j.էLC%h`~VʁFoߴP4H97EQyc<,13j749]:'>P S{41L[Y֢, Յr 䠍\@QeϒmyN/bL~r2oe6ݥ-V[OZ>8mc~s D*ulEY_Z>}]E.~.V]tR"3ڶE;2EfsG=R }-HQhFgzgM(GVB(, J(QїGF=fHCRwg2 ) b="(:PF@ ?fW4B9V6 ~@+Q4 ]UZ2佪*reZȲXH;G?@GS@Y ! /i= JErGG9@S/&jɿBjd>{S+ÇGGEt*Я@( @RE|KmS (ZhjE ELrb](tC ]0&*uSmۢz,X~}xӀt|@r|P$;z}vPgPm'OX|~ԩ,uF ̙̮-h￧ɓMҷ@ l3HݘΜ*Qs-4w4Anow4HcѳT@U >Й35N1܏+Gc)* C2BFg=@v2*?G=@]Bi陀V*E.D3&lTP\#/ \B?9hE8Sm?C2'P(wd8  x'+}rJ2\獣.0TtDdUUԻLk6e?hGa¼=>CC@JQ+Cˁ:272$s4(CdyZ5Ӏ_ (M24VTСCDxBЊ}ݺu+Lt(: z҆}?~(hh@ w!(D!HhNE$HPΚC\d] $4@4#CI66@N q54 $1-T;*l05m Ne 1E۹M*k^hjBa%LZM4}8Hm'Jstrt2ڢRYV6z :Ӏe?Z*ZW_uQkdܻC~}sڗՋeJˡ @*ZhhL_|W"3EBC{GE0cI6Pq"? @EM%SU-d@ǻ2* SfUA! /QBŅh+E "E[+i=2w㧟~R)jPP"SN!@YY3ȭEf`@WtptѣDnv~2:iN4N2X44a$&H~ zCEtǀp Luя)6|(pKc?Ge߰@|NĀ.Eei  ͣ8C=h H[w9N ҷů\qmHHWE-E''M:[SQ ݹHN.DDbF3g32!yghPaƎXCt@Ѡ|M~hzІ@A!ڇ U]g)JN'WDE!`mQ(:P@dFE%xyF6| fཬ腯(dE/|E_k Y S!IC ~*EQ y9^!J^tj !Y`h0(Hx kI{cw64GO?%r”]7EgzTT '"0-g8Ǐ6` ܄+:3Лo)fy. K.|){fR a|:pF δ_"7GAnR3 7FLܩ W Z#>򣉢H& /R\YQ&{STbNՀ-8M\~le؝l4-E-PjW h4m Vh44=bflߺ;lx~];u۷@)EAÇU^ @)E7hR;kq)0Mk^WF!w}{|eZÇ]G_}+0 Q ?N7&:1 Qw`};EaFUtum^zr(F>:QprS$ohG3%VQ )< $GTBSto/h(_BS1}] Xb2fg*zΏ6RST9* :Vx-?) - ?8\)J>q %/f}B *!kv(5+i -D#w[ 6-D#VpB4h&PKE>D>vDLQXjlmh *SI@ǀbjbuKQ*QGdN:^9R@P(f@$<;( Tb\x*"/U"Y*o P4Bev-*,FnݲY/)x ME1(ڷ@rODT`s)ڹ .1xWf0 :8Z ο@l\CGˁ spTt $D=`\6:PDI1C] &HRD4]㖃Ȧ޵i 3LGy<Լy6d8lN6^ \SԩL zJQ7r' }ZQ 3Ju4^/i@N}jvJ(L(;%t|N"ց޿o{BQ PSE֧<$RZ?1혓 .)kY@׮Q~SmiM@C1G hmx4# HY@S1|c(,Siܹcօ(f}cǎu!Z!uô v ;Ph HeSP0 Qظ'vcny3h,Db3~w鄁tptW8ݝ euJd8To*:ݓ=Sjh2'!Aai~!i }1.HK0Hmh"#ݵ+smZbT4%TN䨻HSHѮO49hEqǯʽj['hE@nX26 D+ro?pZ8ŋ9;L)*._N5Ω ]1K$СCB4"@ǎ% g]ED![#UV,r"Xn T޽{FuA`7|)*"7Dv!zhUԙE@.luf?SRA@f@Ng/pEI @Q"PY \Q H @zt3;#ohEӝLumjj| h6i# |SK +:GmE_46[RT]h"Wu^m"r?3s +ZF1k0 jCQT'f2W[3H̙_tUK @WVQ<=&n.y+3ePݤb@#. :}fu抩2v"^ƶh /Cc[4j(Qde:DheKTFH=  s(kٯL,,57 (g ^ N䔢rǒ_%c͖sD) N!FE v[V+h| ʼN/b806(L:CEa$ؑY$~~ ׼ 92rF =1#FnIK@05IOg}qytt֊W|p(#=~tj1 tvj1Zqyj1I):- _#_^dB`b$kiEbM|*gy}ezrF ѥK)-DR4Z5w?M6r)9mhR4sW/h$g(] &kq œ8[4Rj?ϋnEEȂ=/*3]gfRx%8-PjOd/<23/ݷ.߀5˔-sl::6jsv@(ȹꀪ%Z`LUT17\7 xӏ*z8NQt78)ڱ: of6@K($2(o6˲mV͞RjNjJIw@YuI@r] <' ;K/\<o(?i~;0|!9pzQ9PDZo((2 W5R4]3EK)t 2rd(;2&ʎ (ݴ3M1 Cq ]u)fQ9rf\" z5/IGGsř33D'_"|4<Qk#7ř3>2 8+ye ]$&S-G1Mޤ VeHgA+:nK! SGhh0mh ȣCAZ@OAkvvvMһK.-Z7|L.ah)3d"5%#;; 7i8FtWMYt&_Fѝ䴢4&|+:E aԝ$FW*EŁK_vB'b̓C0rt1 h*Կhj {D1P:U ? sD1{E1[,[<6EX{LjnEÔ3-b-b-b-b-b-b-b-b-b-؂tWQendstream endobj 292 0 obj << /Filter /FlateDecode /Length 4730 >> stream xZKFr8\e߮]o~.ժHKg*f{\OǾ=ovi\ 4iY$svj_ˈL #tOԍiqM_x۝۾>[<{?(FYy0pyl&ywc<.si^RjŪu֞[=oW*2ptSҐ/}jo;>VɯD$xЊB#;S/ -m k4<5c7xKCF溉}~9 HʁH؈ek += 8< Yl*,WNNsg)rj'F5즀(mޟuxld;*uſ9<ުP,]*g EBhAB#ЩAiA۾jz O5㔻 "0rxM !Gۑm'/g3_F),br/G.'2J^ 4tʎ 5j^gS$|tuA /RyDP`wl) XCӧoTmsڶh /CDr3qO 2 MH .{E+\2ӛ"k{Q7PQŵjL;3fdb&bIe xx(ni1-qf{T:v_O9iQT?5TE!1njK];$L=UEvDOvP"ojjHBgM㰮9neRI:Zep9t=b:S]N "/rٞ=],W 14S %Yڮfq&>^+-[=]z3ܱKNK3ēdCm[(:;+/3ZZHpWCyreP3>AO.lWiPE,IMd00ATwR텇jMVD/F5ȡd* w9f}vFU_ZCݍz$gp8k[y8]4'[IF)ޫ@GIT|)YZ ³}Nmc&J4y>y񁱎"]8 *5A P_Kr镳l^n7(X>d|HyNT8_N,فRf'̏Ŧ> 6ǥڒhOhbgyM O*IĹ @s*GV  @d/y "8pI^0'\A}&[؀޶ux.Bڒc=n<x^_Zp.szt`rM;=?bDbÉn]؄P(rNh風V;:il?KsXףLoӸB3S;X!4kkJ>0BgL)?Ff:@$ S"%l._{6hIEkaj8~ӽlX@ƺQ]qAQ4g^ .ےw Fz-81'zpVη*óʭHZZ;;RwpJ&PBtU8;uWТ\gjh-dYWkUƣUS:WSׅgT-z jCA|,l.s-^!6h :y<|J!2l"i"ΰ=CBs71oĚE?r3*ˍNaWBK- Y!qɟ,WFRfϻ*8B/"'@e(qm҂Pg̟W/"rVfÙxO2~VFCjm T;H?K 2|Bt`NvG垂4\ɲomffQ0d̩ێmxZ 9^3n0_3bJPt$n=4OOn"`7ap:;r"E-&۶ubh0J 8<Ԓ@]Xm"Z}({\c!zD-h2*gAnNė !&1|N':LGDn>wqAp܊\}J_!~q(Z U*!W >JHAil.k&BrB6h]> T)xo[`0.BNXgSY0/Ɇ79NJ%87yFw[% q|ϨA?@_m(I )gt5x6-oPg|{H-E_ԮK; gxwnڄ+Yz({9t[0j[H͘?QүЛ !$VA ԩWir,Y՗ '4/x3Q|X+C%[xY;m3)A'pN0(]:fp )\){?|3ɨnP6m-Y7čYE[Ig)#edU pMtw}/6cl{$̱X6b~Hscr}^J_a ~?m^: KL_iS/1#iU'1kF$gEœ_r*q*16i7 ?,\ m9`Fx{Oj tu5R1ub~~PUrpw}Ն6JT裡P}$'KEǶAK':^^,p9/u0u.~iHUc_=x߼i~bPt?%3G]ioU Oyi<.i+xkOǥT<08ޏj/άLs6H}t_ Lo012KH@!mxPUDJى<[]u2kbM1= <WOm-XJRޭ[y'q7hS7kendstream endobj 293 0 obj << /Filter /FlateDecode /Length 6948 >> stream x\ݓ6r׿p-Miy`ωSW)$V.HOʺ8 Iݿ|Syx Coo7/}Y߄*w07M[c47o/~c;הyQ4y; u6⯢6`)cw׵~8u{%SgS;/ z3w'$ c{H;bBɦ!c`2 ԷE`$hV9ϷwH`x]xoeYi;?߾r=`5FnjʞL`A 4͝_f 1<԰5+0ƃdhhw |*"̘e:8cd`OhC(v>t[;a JFL[;aפ2Yc_UjDBʼnBA|^Wvr64$4DUeEƱ O43h"žV`'N 9=6 Zg O28]$̃0OaⴝN{l9(NGEӂsqx'&( (}x`n? (MC\;Nd=-0ܗKMBJL ͦn%Gؠ!i&;Nbh-7(]72\㮈O&X u+9|KC'hXV! 55շ = gqN& խ0g?גz)8L= 4#EQ_fD'Si`laj/'1ipgRs9j9O9$dB+ð+ziEb_U5Ld;uMϧ=N W ܴS92, S=R::bK-Dkѱ6Չ c%%Ba^1C,#[rKMb@aUs as> KjŠ:|4K`SSCQ( #FzliR(Fe0 rhxS+*zE06~vexXp0v>{曯l 6yURڽ>)%eʚ/F}@OS+t iTn8O|hK!3 (1ʸ>霄*<*YY-cJC/F+%1'Dtڝt`AQ\,/g1ʬzQ((j gE͞L$85YbdzQ:tFThMI- cɊѢAlkVaȴXS,]MF$lg)Hl6YqkHy7kM@0-{8t 4kBWEaƓ@U@1Gg+E)WDw9;4tN& %4W3,\b<[gDQ!ڄ3O!2>{v#~Tx@6@7/&̞pZ|eo\mrg=fϳr' yMJuhT9pE$Q9(X8SHHcH]), dIaEzP(ĽP/mwIV^sFS4mnX ,8}/U0EܳP4c"~%UDҐ5 2ly㪂8(j.j`9*b%{5ЊXo_E/ vqN6#:+GE3>kH PlYe)hV>, (__2;Q,1hD|mL^YgS9,`+D|FlY\g X|lj`1>1({-ȍ8q0p޳ /s&jdY0g`߷a"5`ycD2MJEְYb[ط)җeo$[檘D÷@nv.]_Udo3'tKΔ-P0 ޷,dq>wBqCVnVp&tvaMɽ\{=dTqK v^|UNGMlt{]i:; ߂d\2ADaSJf#hI.?lTC3O uXV  V` j-E_$]"&~>#!;eWL(ME͔YZcH@D A}d4ziTFE-` XUBc J #B 0cVZp ¹1㏆!î%F'l@{lА^9/iBPY7uJ\u"o#BΛA)8LK;MmnrG$W* s,j.F'jvԷe_ Zui%ZTsRaRUּ6:Yb$AKXӞO%Su"(L]6UE^yY%{+m cظ~LE'y=ⲇ'8,~Rv&XQaVnN[i~AJڅ%U 8q!%cH{,1`^hTKPqLfRjκO$XoGр쵲lIr"x AGKs嶪yeP j7.)&KU KQ',pOwel4.k[\kQHB*4] iЕ˹E/xZ*9>5R9InRŇaVhq\P1DIe@*mk}^sTuG(4YyUP4X):@/{%4G& Zؘ%48MW;VA`Ӳ5a򔪳꘽z}U^ .4 l2nBFtxPY(gj=\:"E.B˰$!bK7pf++GV 0 [խJG'āac"?SAwޥ u!9DXz0./܀a=ɨd@Y\'LDgf֭.St)SP̦Ig> 47W+P[:z" g̒kXr 徊E =e܋m z @p{ Gt]46έe$lUoә3( i;-NK :'e$10&ѽN|wqd n!/Rxx9x>Tph,lpY ] 7>ٿdOW mGmd"4!-׀Hţ3 oDSڇ̒aečejWzaW8iu|6oɠ),>Xo-|#P޸RWC`q1'ըxE}^oTomb{7q8%>ff=Zz҃:?yv+n]uBEY@qd? ,e7|%RRTnН Kz=5s+'C{{ij M1A,_k']R=!SYdYSZKdMiqوL߲zCpFAl+>hΊS0& ooC;DXK9$X̮ꆃKęU_ ;u=xv20\xEx õ_|,ZDyO,MV[J7M4y# b֕*Rj5hz5Z+L6؈UE)e>V|2e CogPP5_Q8ԹB }pՅZ>~&b*) ~$oj Mzc9wP2rjI\-Mxèm:Q.Cg ^W1jcd5\; 6K(l~OɫФ~ KT:CS (ه1QYKJnP ¾uu$܁XrbrGB?E]N*\{ Ϳ'|{JJݣFue'`M!˭bzj8,eC'g$j8WSz.D MƩ{@bPTʩ5 A;,Aȸp #re:W_ RU[ EVq 'hHӁ0.km؝BxRY.-%"}VZw /0d<*cHʼn㷛:v !x~QӉo)x&HbZXc_D?%?)U:OdDK!1p1,8zPs.fzht. d _Ή5Q'OâR ĩc/ ķNʚ-d}o8S*#= A<% =ϱy T,EBXWym.yI}fѣ9\U ftI,[ bqu"z1NY`c8\}񦒂sR0:wgQئ! 1c")uQ)adJʱuYM)*OJ[/OY;3oN%۬N|蝤w|闙1=zBr=M̜t]_x;c!uU~fK2z` Ƹ( R)"eEA4J\}jTiKΓl\,`m% !j=ʥCabqo#n%,iU#S%z<5p46WFh] ?lǛZ p_r-$Rq rӤV/)@MRԢuļ3WRĢ<%pɯ9.nJuNo:_ڒfT5ku,=8UH&WNDwwHc*݀S0+UuBjCD43j6Zi￰hn"&bBJ :N3=n>DvTx}H5>v,1XW!H=+fRz M`7I bPV:[_eP<.g 1*U?:SQMu7wӂ_G<4endstream endobj 294 0 obj << /Filter /FlateDecode /Length 5806 >> stream xDUng/ .m EQG|!nm _[ ʶ>'‘ǻ>]&[_S Ķ\f)VZ8d|۬/Y[-2QRˆ-FwVb?4 ~(Sm#r8wu{F?กg#ڪMSҰo(+Nmapr/ׄRB!力^lt⃛ST U9GOOxD0Lxӝzh-.=qmM/'r ozupq_Y@;ie+ ?/a j|:G]sxRTk B~iXJ".wevA J"`  X0_BNc8e-H{le]^@ `?!xes-/ |_Pcx(@#TWnY[xnC@G^:%2 Q!{b6f&8?h܏-nRZ_Ȥ3 fOD%~-]dU $HAnHEx9Gn}<z䆙Z c}S/eÀg|x+ҽHHNw'M{Č /#ݦ܃WGPj] O`QP fH:\h&қwO9*Z`DS.iZjEZv#` @ x3gQAqV4rHLC ;#ЂF b Aaw=E"':@:{IxaNFU]-"sc~:5>D,%St_IorZ$`EX6:E^ NaKo䜫qD9n C{頦@ނdE̊m(lvd #IqC' KT4(K&&;(e qGZ.7M)J+w +mR?q[C~ dwc3JtHP[>q1ʐ<BiPem{-lA(VXʼn{MIxƉ nG2]\Q@:7f UuC \)- ;lo;JwjM{\)}Ffxo#ύziF":)\"P<EB;]IJļd7$  u_7!&!MAHҕ E|Ź<ٳ|Ss*v3TKr,{?fKr+=VSZ/Ňy+8 8e(\&5s'p%&-ёdh.;mh%fV*VK:&|]ѕOh2%> 6j{ߍ; bȌ(\ KQ@\4Lzְ1Ƌ 0 [I{1e#(*Rbl{A.%.DzL{RMG-A< ?MSq#@tzr1 pTb%$t l܎H) ~#enTSɈð@ߗ@!oF9Jɧ CYD5Q`M gj0ј,ȇ}bm3ٻ&+mWJwlض,5V6FoY|7]p))WU6~K@.侀qîw}ZԼ ߒz:lJ7l03AF,qms~VeP8[ iwTfgSkeD0f  sv#lhI TH+Sm, bL=m8lܛa|wK̨|Q-g ubbĨ25T4y #rH7c7J%,1K,&~N55^b.)ܮ'/&:: ,(%%^bctX0Tң<`lD"oI4 ،kdAWr&v$g3vWNuFqvBIWs{VVe6܌$q(qG`,C$s,9{17'Ë&l.,?>r1$Xs˵qtQ с7~Frd"I)Xlm&9E&)Si$!*Nr* @6PT}[;#Q(7x g4Z 77ETn243{`Jps:͜]H|L=k E As=xT&FsQ˟V$-(w PbE5)PK]5aE3\@7P"\ˎ/M0;7i'&)űͼq1+v@~FP4+FE 3헡kG6 _i;/`=8Ώ?5j,bt8p ,LoR;(T艇QfqXG ; / @/:B^Np#:}C&t{n?ǚKc'Xci >qΥѰKE\KO1,6囊Q=Jd{Me}rKÉ*9ہ|CGIl!Wg:Oo8r`={ j6ÇԪm_۾#eʼnuGr-0&ewv4)- U 躾ޜ0`eWwW.*q[:\8rIcOLښ"j(yFpYK1ZF7‚0~KVGlIGgEfl)p?)vbMȐ$ّiӧ qhwRxi_9&MЭ[z%7: 0Qg!H[ H<wT4ylcIA"[0&wo{() mШ?7lav3>){|r:kbMɕcgvx45 q&cY`0>giR8@#y|UwN6o˿ߤCF#b M$~ ;!Ewtgx ׈7sMDE$玼I.xJ/lhE\`UYyjbM(Q e/[ bsxN`_&W( 39pvۅ`?1 A@_Gendstream endobj 295 0 obj << /Filter /FlateDecode /Length 2648 >> stream xXKKvŷh Al7M7GY4+wv}AJMgsX,?U) CuJ]W*R*K럕ŷOwUqp'SşHۢ.s[dB |+]ܟ~߷w{]ٲRRov+Ƃ5p?™o/Cv{L Gsm4SD["H~74QDH)ր1%YBl 6N4e3 xEV3 {!UG9daTgNv=M-+ ȋ~u˛0xy%zYs}8\}Y5(1v{^ɛ@Q .7C [HAc'Y6=6"Ls{P}u8if@9Lrƕy.4y$nБ 3?\41aABTftjAKGJsF> !,z`[VvhJDIۯG[> |&0h}* aNKM/DwY߮z3;sp}bTv?i')#I)J,:* ӏ|ǫBVwtDƘ k6 tKKǦɌn0I*(Ip%kqJ>e 9iO]O֬Z墵leM?M/s}t7PzmI k0.߸DR^惿nbKkzigT35_q6pIgR"1WB ]BN_`0!nWbu2b\?oyriH|{F^[f:=:W!S5Ɵ!|՛UKn)ciLZ͸hh _r{/pS03;P$7oSӨG N=%s~4mbCi\O9h79xӿ=l 2mS״+ɪ=C*J<\l s{@ ܥ_\M}]J{n/p\ςfe\ NzJM v3 `LIhLM(e% yd`5|ٸz\^j27.iiAC3!59JydI/AHևOCFM_eűam2L9E}54;GX:mMņ#SZǓ8{@q}tj[7şdN[&lfq1_,cp6G)HEQ{]ޘiG.s #Q {eÂR&'0<aZ?@6et m$8uco9/o$CDgNZz~7:VL z\|eds؄#W&ϐ 8[.ȳ?;[3U3[M]:K> stream x SFRM0600v/  n123mbvv-w cgntlklpcSpwsv_f}y~{|XkNPbéʋZ!0=AHSYRWUX||xuGOfn^y{yxhDEDϿNj#' Khuqmbv<,Ϙn>IdBH|\VmN*He11J> stream xKMSBM10SA  R3fQ*|{d|fZsYH᱋ ' y{yzĐYYRxzyzRUkl&JmX$xU}h lx2~{w|pysF8* 7 _endstream endobj 298 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 281 >> stream xCMSY6`R   greaterequallogicalor_kV`Ez}}}y{}q| |qqqv۟o}{{}}{endstream endobj 299 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 761 >> stream xUmHSav-Y,/RQjڋTYQq˗e{1ݽgwKSSDԇ^JٹXts9p1G,D?nލx k)0q9c m[[j+?eTZ-ҲVzRi]j+E8Nc9ʼLd^dfaOccBנD誈 3Vl5c%UwM+Kf3ﲧIxHQzef7cM B+ AeL@~|a?Fᄟ댰 e#iB$ wL-+ CX`@-B=J:˜#zh~*?~ٻ$>eE8C1+G7]!R^jBbN +Om]b\N[6_=L'&`A1"h[&Y%W#D;hd9h nE_?`KDZPMGItT2DO}2okpd S>f:zDh ܢEPMhe$7( A6吆磲l8Lz-WR^ɘ]oT%zbV\U kTyN{ک9a~-&3Ra[.C2LKqG#endstream endobj 300 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3366 >> stream xWyTSw`-9ĵ::uYe KMB1DvVږju}CE9r?r=|+Q`xtIJΙ3S 8/^3)g|fy|Yڤ)vܝYEER)T56RR2jZA"Ukjj ZOSP^D$P`XKK\^젿E^65'Hqȗ K!CY [ =^}* 0a1_PRpכub& DH4qIC g{޴vw< t ڲߋ*X (ipn0mB|%q8 Qu& \N>z8d۽g׬ ?d\Wgccge (=ltҤ)THd-G=쨟fC^<"N VE v/:÷n-H 8vV0vM)*jR\VaH@WCXqa`~sAجq[,bQT&^cPlX6unhX ,w TPf`׋S=NdZ韖pvT1O籑8$7q|?mt_VmŚ5; U&.8%F%cis؇ 5IB-&E# 7Cq rq8>Z._y$쟇o-$"(- vQV6斸-]2X]/b;  Jݩ"辌ɗø6!]\ f?k>HSV\ScQ-i[B+bQ Zt5hXn7Jzb/7[,ɕ}.L[iS?"}#LD'Ϙ"{VyWqJ¢hSmV0r5P"8f%LsM}އO/St*'0) IeLlmbR)9ohzh`\o֚@Z.wx:ZȅFj ЫS "㲤3cxWԌ@\088*ӟ(clc&C!sx-Oa _/m۳k{KPKJLٗ l’N"aEz70+',0P *ʯ+wdtcH>&cT*UJY;4{_4'TƊs" jK''p>kilU$h9rl"+*D̗׫N`͆& kѱr0?yi/?.zY_XUOQM;v|tK̪/Sx,Ճgp3ąC@rjs ~>7?,ȜKzObc1v*!vkF4ސ[~ǵ{7ڰc{KYnqpx0d6qV?ZdH1d GTE"an8L]cmuw}fq]ҫ@5&n_CcM`^s84*, yMmf9toH7d;sfMCOxZG)*JP@+%ژݵt5أX-Ă3]JDÜ(˫7ިxgyNPРs^t n O-?@ Kc'jXmX΀hnkh<E8w eDe7ڈ7kȂIN,"BJZYvVؔ'DVz؞x/G5S?/=1$/w_G0/o}s448IwE|1-;}GAk -5˓.)!&GbPÀ~G#pt3s0C+?LD4Ye>ڶrt3P:sոjq;6;TP,Ks' sM~\yOPnl<{ym _| 4 ![2>VqOܼX@џS[Y(*T!ijk>Wp`$  loڥwgK?nsg 6߷i]AZ-1ĤB.^;{g\b?2<܎#ۺrZL/:" 0GEnhvYEhnHv**寀/ltmw-jKΒՌ[3pDdo4B#|ܒFYQ0܏7[j,R9 M+i挞{IҢS9N$endstream endobj 301 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2128 >> stream xVyp_!kPU-$ B[ rC >%K>dٺڷ]ɗlKdIL1JN1ąh$mJ:i;<1 ݵ'Lf2'ڝyoO$LBD"̴̍RSǷob05;sXiL/,*hKur,BHD!Yv-dYEҐtDlB$?X T&AInO{c؂)Ӟ[ħ^01>J$I*>WCݮBN|'wvʮJGD[SQ6&ѡxƺފ)[<&C.#a-MjF `=ƀj@! :o) !zfGU*m{Hۊ."X|~D4|#L#7.[90΂?prL˭s Wy[6v;Jvr2v|VpC4>'d|ShUlr֐|.#ipVm #*TVnEX Bvr-AHd'n+,-e8э-+~&@1 P~`p6LOm!E踂[),T܏!p`n-[Vw *p{p`FR8_Buїߋ*l;$G QR7O\%)5 kPoQh˿9ЈՈ9O >_?앇~{nD5auRp.@f8:CvM[ ,WpRh?0nK 1F^^pun}T#F!f/L ;4U$eo!6´q{  d^U&H#>K^ҕbL0mܜ]\"7S%YhJ1ajm`טl]>l;)b΄hKy(/8 !wp8  s9t-;Ωe1tl~ܬW"wg-UK{O3)']p 7WdX &v0wAAS_FDC`ӈ.rxmcA'E8) [7\Qь,浲vlveelE%7w!-/ + E{*Y_,T]s$o<^9|JA̯v]5'喽u%d:We!hY>f#O28{0#ntG 3BSa?#@FMIG`by7f`zQ|#56cߞ> stream x\Kq}#| ]])b$9tppHL7v%̬*&!G=22 ?MM OwNwoa&6wZ;8:7MVw޽*Sy?βl~]^0k=*>s NdX؆ʟr 6k6sY0\JKa 66X͛i[\6I Ci8[lfy;@7@m_J^Y,D~8x=V[$mc"fe1x\ÓRNȝr~ WFG2V$Vd4`Ukjr{0dzbʍ2g(Bgl^f<ƅ#ZRd_~fR496ɋ%^ڠU'P:׮(Y;7/ܒ7IIn)|Q/%;(wd`aI#SU`?O\Hߑlateb2m '—,;0`X0.M*UIŷuiFF(re"=6:`Vf[&ZzTX2^L1U˵pl(Bz\\,nپPFW`ϖT^F6̷-orJ5VFv^8g#>zkQ׻rhN9XBh}'4aћKP8ḽ1b.J# n8)z1,~(Îf `G@G-l^T a{hpH/q'U:4pٻhFo[DMCȧǜrbn5CTbDb+=c\Q(pM z;{K=ؾipt6w8rR2;*<,ze{q>28Զnlu7˖tVisCG'st BEabBd/2bSk`j\4 v?F7,)5q%jb qc=gDso _!,zk܃=x{BP.ύ}KwZx.?0FgkĘjZ?wAuLƵ;.ln`C|rkP7=t0bmP8^C zX>^ >z(SQ"GgJqMRڣ%w´B‹ޣ`1LVi!fsfz3Pvu!wj5k1W"mכɍU/nu S#d;V8-!D[eT B|weM@}% i<&uV4' c>[o.xNن`K2Ei~6k5喁n; ف&\@4\`Ǭל-L?QdfҮ&/ԡp={YJ m`j)WêJ=V#n٢E% zh: 7٘[Tqo| j{i'q_]li/tƬ*H]+7vv hmkH(k@'(eF),VM=a}*A@[q]k?&Y fbcll]՛fy ^Z)%nFQ>i_@@e7XFu7hjB|UQ0@mF+lx'CC?pm+ͣ=1D{kw/$ =QA~c OC^X60ĉI3 !Uuɘ1-h!k #dD;2>NSxf3Q0mQqMpzwSz{R  m5}5} ,(h Y6hH 1 6etX j%Vv-`WfhX3ˤ> !&{=4#ɑҭ&Wtsg }6H&8#A Q1?[A}t}7BgM ])NĴ 2* xq*`쫮MKq6=Ԫבy|jy3Ȅ`fX!ps0';#j/,\}El0RMTyOJϱa<뜁DŽ9^J9*Cw@D^JOD?!Ȝ)w:.lBvNd h h283KG1@/N?>/ TN,+;e~ ҹHQRdjW^`kL1( vA}!Ŧ}Sc\k1߂9" =926N:~*dH/ͻ\)'tr5@Xg7պy [-YJBT @IGWaaOQJ`2"W3 c@iz-xi|`ؐY+{S"y>f$zJ46hY[òr]ngIWBcNb(֧w0)w1S2LHړH4(DtS^F阨#yjuwY\ϻn\ B@Myf:'VI޷,.@ܺCodI1{y<ʕSQEua"Iv몉2LS(s}ϝ&"zyl# o³32J2uYxH%DQxX2(F1|^ۇyPg & ss2 sfCz^+ۑE%tFQ"H8C P18:UNyTyUW?Q 涜ْFMIO9MiW!@& A m8@:šc*S'듆m2)VgރUA_x_yJ[d&rMDIJǐ^^`7+ouZDb$ bUJ Ra' -*MGZ»Iey>)Nˬٮ16/j){ 24]0d[ c'ÿ|n0:X-7kiLu~","^W33k^]qt_ x/Ǫj#C{> w e{@'<48N;8>FsdJjUdu' rt,D3]˹8&dhHS[OrKSg}ZsV+OBmCX J{m(Ͼ #ذ8Cf"KQ*,|1} LjwJh5ϮiVcWlO7AM%:iwc;(#;J)vI*;-4fU_{z] ֞qE;)oHAr|pD|&XѶZ*L"ťCҟOw!4;.mU5~)Rb^/t"t?ćSǰ1GgQ!@K(a_BaGcFIȽNiH04*Ѓ刣esNFl,]ub v"VH̖fBeu+2Qf! sC9\sߍEjDJk1Z>v7\|$n3`[mԻoyHN~6acD0cddTSjPN aBFKz?pW/tq7AWSn=?*L6}$m5KsA!6~&\ccMb)p{޸GSl ?rfu9+4CA6~j2c-wG.Ь\RPl P\,gGqڱ=(R:Љ6'|]3 p8dcgx gPCv&k Tu=Ids).G=ISS1i5qhbv /B%fc.sendstream endobj 303 0 obj << /Filter /FlateDecode /Length 461 >> stream x=o0 wvH VD}3cv[..s[ߗ(> stream xZM_HRq  s?*);NGhv>h'ة=F|X$Z$n>,R8/x@"MP%]4[eՏWb{J%$on0)"vYf7WZ8k"K8Mz}[o]\$)"7 L>. |\yYnKZR ;Ui?K]g=-БKr=AXPu6Pj2+ЩlY5IǥbWmW.zZG +'5ѦM/n''UP)+8bo4Pm0`KE>62EᰫdWPx_T;+FK(R8F:PUF]jڡ55NC:gv1B!sl^b=,wJ)> wU.wy7_=,}>lzV0|vRC)J4 jb JbuwGV7u}f7 LF%.D󿖫$6G?,WJVP#8L\/Vd}8#+T v2QB `Ȟucw.Qqx޲" I '"ˊ< /8vn~$AɁ"*/9wUi类5J&5pYHE$vzX6EIH'gǀ$4GA$Hy۵GJ"BD$(p.N$+݆0TRA!k*Y͠MG> rXa,mjDX*I}8lŽABkޔC4V5 vP!=,a#r{/ EӼi݇v2'wa ga+%aSaџ9s^D8~ TrzdSU>HvA -wvAXR[U쟹1BZm;q6Lf;ڟ%FDUՀM;87*4A {:á*֔'pQ(ɧKw#avw$`+,?u]vU_"Tw PA(R*=r@{: ~H+Nҷ"?Lx{|A—,z^6ǜ{E ס}_a NZX] = K@nka!T{R(UE4,Ն8QhK j)~\37"\rJI+t~J;Oa3Ե- f`}>5&5sΤL~Dx( lf3Gˠ\crRk9DnV*IonСK=Ӧteq z(]Gd>_%\{i̹ $ә\59) _P:A6w-#.݀]{}J&Y0.4攥 gH9z9Ryach3j Q,}_652w+e:)[g]uq̲K9J 4y;\g;M]nm?=gS 'X* 9e*Bxk\,;M ;6~ʥ`O˅KqJDoxI 'eR js~{vc\l&y5G>yŭ4w-[rjxOo}^ϔ^^"g9g,~COE䎞O㨩Ą亃&QH[ ʷ0z~u-ʮ4'2x9‰^>u,.%Үʟ fPz0vۀt?Io_Ly."])*ggJ χջ+6,P|M|4ɿ)mAI \,fHkzUxWb/QWoGjBjC̅$Q1Kd)b`)~ $H3e4eKXg>c {b^w6qG /:Qdm>]%\X g8)TjLgV`%_9B.X9V < CTo޻oQ#!JLHgGh#b<ŃO@$ #/$(Z+JwCY%Ǻ Kᢙ" ʈ$?Z4}%K;c>nw7ѫqիk9Y;_]lۉo2~^O^!^]`):I'GtJmvm4va/ '<+U %v@]r}=B!/RӶxz㋌E4.Ys_닇Ig' m٢W߯|ݻ՛^M.ZkCN§hW-33J3HNi8On'!1]G#/CF|0<fKu2eC5:Ʊ3XGY.&:d̰]( 'tϫLNyE=*nq*Vz@.ZޫKS*  &\?Kfn?bJ*ǺC5hl{DKѧ! /Pcb~ń MΞ  cs1ئ>b[g~#Y.yF^@23,W`ݱ)|RH h}ExA?U)tcd18Exz?^c$endstream endobj 305 0 obj << /Filter /FlateDecode /Length 3616 >> stream xZ͏ܶG{soa-i=M!m>x g]93}fWvMZaޏqUrU_;^$=]۫h Etά/x\X(ʻXr=^}+oDP7V>Z;R3*Ƙ{XupEYj'f|}b덱hJg8WQ< + N&} űnZ bӿTVGH52KĖFҟmNvoGbV2B/;q 8k mŠž}էbjhP PAhꐱ5:D5uW ~ _o4iP;LhܡbVsmvbVԼ&/S77 %bEb ]; $N3pԥ>[{=i!J଍^va;+$T1bEjotd%a-,(b:z$ֺġRJyV$# IɂE#nwn6nqK< /ϿÛ&|hvlL&EmDjZ'jN4鶟3>|FՑFu:ʋbE06V`i]yLxe"o56gWM-Gf5[ᆖPn΂{XE:5X|8/u8,+pNu+_z] OdT8UôJ8%u P;μg8@)`a%f,1$80'H—epZTT ʸ}H$Gp5pLwD BZl)[.oqMR=@e֥,\" dlwINɎh>1=x"DQsՑ1B0Afla Vefp M ],u\ Q #ཥ"|2A,wg5n(tZ–Y.@)! I.hTq`D -:w#8nذ6i-܅Z1܀5ZłC0sQQBVRC  Nsܒ AE抺Bҭx$.EHx;Je}}Oҹ<4(]|/'<P<\p e})ϙbj2fVXs!FFu pHj(NuR' Z|…j| TC+& 6q}&87!5*B9/Jw\ u>Tҽc2IC]Q$>!7Xhô~׵}Y(f%ٓʤ}:d($]\y,챕Cf\noƀgJC04+eޅQ:bD[u&INj9 5JxԯHRdU!1`8_hNӲ0.j kA?Ez53Mm'-*|8AQ`IHڃL;D`2BOcI'lpNׇoܳei0fAi8?M+377[蒥Eؕ ѤZ92{Q~(e B7SuեUC!Z W؍s |v_Q k=6мUJZ .دH | xIBCexLu9ϼha'l  7ZYAsq 8.qqKDS2\f]UxD{5OC e4*#U>]f-kdRNiRzg"r~yQ9$`mWl&bf7⋺;V%m]@->{&X>Ϟ4r6w&o@2)Mr?tutL|Dx߁,D G\'>`盿~~-ų0 O{D`7ќS:S˜򔻰ȏ44OoO2}NA3;V?ezsʶ|S\݈̇&l?Ғ<֮,癐,xX v[ z [IܵߛƈJ'rNW&G>euD:,,)@uV ]bb~ۀ\|t|g 3E?5OEVط@yQɭ@``ƛ>,8g vȁ2 9=?Y0hoҪ骦ڜrrHL-B\qB2 8$BL_\v7 *s}" j7x K/OyP<%:]c*c:\gzbBbTH52L|EA{ P<%vSnu Mb1b N[ThUΑp±퇉K0ZgMxO+0qk%(%R!"eQ1={kOcq퐒1f79{(۠T01d)RZ ~|bF4P%?ҵ]}zTt2 7^ߙlŴieBe9[zK72ۑ=2kɥv/_29L":ctI7!{LN;:6Ole(cw)}2Hg$Kڮ~6ڟL_y)4a0#HT jEcӲg>6אּ?-xlS]bUj[8,! %%^ȾwTendstream endobj 306 0 obj << /BitsPerComponent 8 /ColorSpace 223 0 R /Filter /FlateDecode /Height 450 /Subtype /Image /Width 675 /Length 19934 >> stream x\Wz (컢 F#M=#Rh% 1b") /(a$"ErHq%r3#ٓwg?w:%gF]{{yroUUUQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQќj}IQKc: ;Ѣ4ޠX,AHW!IoDn/0=GEEm%pN~,FL]h(X P[NoMo_CcV^^y1+5DSA4YW+R^~ž}g}]+v{Gʿ=$K^?;@"p< K 7X> l?#.N7(''[۳|=zGo+QD7/2'pcCm,#ڶ3pD=3%ֈG$9i> Uf`}VDMRvr(DY$:|.; $)]"$QHaU̙K8"ߘwo+5_o@*N7c*[DY muFd3AI]a G1ւ> 1|%oc(t30wRdHDU>^YIMшqYh)+EGC7r)p-ѓʷ!W+ ?cQ̙KE7icQm/6~@ {ӿ>Ko# [ߠ1Ϡ4 0ec:M~zxB?}E|zhȍW~γ=#c'h<ݾmv@ "jx =NM#{?6_~9.O>I)}m}!*'wO՟Me9eO:v nOmc?h!!>0 `O ٺfWU7OHcÓ$$TUE)pBzIa>ef id ?sT,U]U/RA*,h꼪-*2ܿmL_p[{ jTN; 7 ' }W߉L޿ߨ`ntu vR)ywag>j~NOׅJTrۑ4ѽUǽu 8um;Ch9Z?z'iOBhʔU|nu=ڿ'm"BP>g<@U7Qܸ0=~jjvʃ>r F@M秶F#fۄbFFC%GOz.Y"]NͨuFoq)X?<8nY"KF9;qF{[qBgO9֥ Ri}'8_gH*FDQu lFpk=;Z+>1-QrPA&>"Σzv]熨>BO`gO%AFQqݷ=g-uyQYd 8(F#~ԯ8Č2Sp|#'j *H.Fun3CO5F9w7n "'8"FkL}!Zw @@ 2ft@:t1 8hNNsD3F pɨΏuFI | =FwW(i_(pja RTʮ^gpBnbg5wqP^r 5Pe lFn5Ժ:ƣ}w>yKQ`o<: D {0[z⟯(dS2Gro70`՚*%5KNUFgP]}G ʟb-Y"gUCM=NFMp* u G{=?x"q)2z/(s_{$Q2 /<"yc.KFi wק~FAFe9 p]~|]XR(#1 7cFuŨ>k>Y]G]&Vs4^1@w0ʺy'=َ&V1Gcj8DXuҗ<頻z7h8 },H/崯m(!UK/kFDs~?P!¨_wP7n({HK~]~}1Ĉ6G~G5as}Lo( ҥKkl GN7D`QR}tQ1.o^ٿ1~7>Q|(;5 քя!;# fe=.]~yS]zR_KQLD;dW/yeCuؿ_<ڿ#/ :7Qg~θ뗡)\ k(!2D51<]yDRT]}m3 ڬ^0@@C$;@>=1p挓6Z;=5`tXq]1[dTB]=?ؾ1';e5%SF2V]D Qm(fg撎Ʋolӟ! fWq^cpT9_5Oew77죮> (3ϵY {6":)`FdyIvOsFZ5)c%)պh)s#26 QuϼoI r&`?CD5F Q)= 7Eu6OSQsPɨիL/8ps؞{OfK׈pT @%mr=m=ݾuYG8>)FA, lI% (^; F<rD]]=czႪ19JYA0BE A_ѴblDT1ʖ F5b(#uzB9 !zC19PQ-sM1j>jbplFњQvZW/׈q@k3dwP:pט2 Z]$nڌN>G0Sw41}?h%?hz 2F^ j@]u@A=/k عCgPC}0zN (G?145kD9MD ]4z8u$g;KIwLKszVcC]VgL%hWUQ՟?ͅQeB=nT|CFW(]4(=>5 &Ovw 23%'G G1*$tÕՃ;[59'O4zY D*F/1 QGke? D/,"G~Ic?q7F1=uQV‡.Yɓ'Y_Wo[pz(8Ŀ=RzSSŚQ͟ĨOc|1uG~QmF^vݓ} FW|8Fլ]`M5r14FqW/kƨSB1fLpT92Fy_U9'N5ƌѷaw >b0&&cLͽ剨#3F SQлz8zhgo)uW2`(eRA?G!_M65U(o De*!UŨ^cf70C"Z(y(Q1)MMQߌ颙FWbh;H1FGpw?B DM 0ZW?fd (믿.[1 w5>*|pbt%R3;cP7}_#y15@$1zV$F)D0D;LF-F =Qe}OEC15@btCU-PQaފQ)_>k#GPY/?;fWџQc2Iȼ u(g}O"Q,VaYc-@1 Ac51tŨľ?F>kDI 3^T`&i1zrv^G)S㜰L\oGb?c(%S&Jf&jܹojȾ+Fn:5fBtwC§y͘a@ͪ#FeWH5msIl-T+gbԮs8w0b{σ;bwŨ!&_W׬^&_vӃ>m(_rƨ8;F[({uf{&QcT 1c8Z%n(q>pF&dVҞf~ )MFEMQP!(tD_%cT_xa5cz7Q;g^35]F1ZwGE]}ˈQ@-G;xGȿ/FE9’Qnj? yc԰1qZ"FlMy]=9F_Z 6ZKx#kl.YQz`f_QcԲQx5Ĩ/ j4]9F/Fahi Uc o`~IGڛ}wڷbMkNITr}WcX7:IFzzOښdvk:;};FEb+Fm²1a_Qmő^5x r}"1<;$cS$5І+FE_z ،i\31Z&֠oXH:vII.btm 1 G(pоP'Qgң؈'1a wCM -qN?ڇn61F^62j *c{ 1!^c3FgjxM̌-,kDM-FfbF;ݻpsG?2kl̘oܣ X.BF2D7/c`ެ(`ߎQs?rӿiF2x9gbvWF[ŷn({'1ʡ)ܕ}o7BY"#Fe 1Ϙ`b͌Qq`N9B@1jĨwsjcqz1o'ic,MT̾bߘ}wv5cDfsz&ݺ'm(<7F2MFnEO1D/ӷb'f:] 쫛 O9dxjˡg1j7c4GLǿѭj#:FA!yFkDrȨqt}H>FԶo6~ѕFϮcI#Fz9J~>jфcgjp2D5ks@zs@CIh Ia?"Oc Ǵ^>D8FzF@gFq^1$EIw&{01DƩ>o+EUmO<Nz4USKQgvvH KD5(.;5x&X?ğ=[D'FZU:8F~HҥFC;g|Iˡ+@DkG&a39 *^dhӫMsCc`r3Qc"6, j^ 6ޚѦ#jhVa_L{!qV;\;~ĒU}yS9 ;ZM?,> u8Q#`0 DAk~#hrY2 ~=q1y@o4K/ em`ce.2}2M0}#͕~ƢޝךXp!?hb?ODC:F;*:vڪ?uѽ'<1\Mℵ'|1)xN.CB r"5hvF ;K1302L0"#Do07oLk#0GS(8XdC }WƖW!DWU59h:FϩsǛ02b(Pd{7ί0 /s(bɊf_ ":ՑbvM`@?eDv{vщ~ggf6|\s})d_dƨo}Qr dF,>D[ɉUoEzL:-ۓ!!H~04H]]{òUس]du )-=1=9 @;~ÓP0 B5ڨMrf4Mobe? D75Վt5 m| fL}AP}5^U99o_ѫ:!f? Dkb=m3K;EL/f̡8=CM,g `j>mR7kp#rXrӀ:La~Vsnm?D+6j?ѕmn/y[lD.qۧk? Dϙ:$s2"Z=!%oz2F\nJ~b]{OUsAmp7.w9E֘MFˎʶK证qM,>~Q?`}|yoski'dk\m-Ccmߙygzd!J@z粙ŭk2F.{1ZoTv-il[=7h"wC4/=kj6e3%-Xޥ;W8&kL_$v6C +RM,Ѿ<1D j]x'$ulǵ0Yo-R2as#㺿 { گ`w}*~{~X}H~f M庞%hÕts!q%X@K"#%Yv70>}~n&8vAj?n*]⼹; gMl mKu@}SD.LBͧzJz?2kx嶖#W=@Ϛ̹~~O@ 6=Dʳp1 7Xo7h_K)OnfT*FmWR;qDac mT[|î-OUtAX8IC޳ȿx#eĆTWrDآ=`St{M:"6Y@ V:VџUv|-ժ۝-[FAKv'=-vdțf2icUNMi) GbR!qw`:?Wk6m]1"e5 Ʒ})OjgQDT;zW#26qŐ9d1mVdbRCv4&S}؏"9]o@j][Lc'],Go]|>2P^aec?ﲷIXR(\4Fg߅ :wOGh5;%=l w-Y+Sfzu kVXF? qN["67r6'?,ei'h9Ӟ%ښ5=ЮjfxR!AɧdC+C*y# [tAz 2jGDR ̈5`'Ԙu_@QTx%YunDW؀aj vb7Yz =wT/=i*#DsQ5]rElzEFA)2v2+j[~k5{sh5XKI׻Pٕ/3MD+G\aNGj˧Ծ@􄩬݆[_g8wh, d,Λfl>- Z*ehQ*ehQm Z E Z EK zTA(D2WA(sMѢ e_DUA(sD2 чߚҎӈ:u/g!}=}兡0F@?T*.!J\qzLD}|}?MǓ>yDt_]m@Z+OgsWֈt|W[p*F?!?ϠD$9=F Ge^6Ά?D1mz.{>KS`Mo|}T0zxݽ "Vԓd47K(Vb]`'xxȂi.} rf{iʹlh&Ycxs˛zΪ_SwOlo>mgBHѣQ}DSYg=I%Ad%G|I0!7lNh=(qH]YW^ZOTRsF=3U= 36za 4~GDoF`/^lׁ9~3йgl1u^3E=P|ӦpHh:I hѢ }nhQ1U-DѢU-\Ѣ%=l Z E Z EK zTA(D2Wuv'HםQ]hMwRTFLTm/`U]> Z^QDP-..JQDw+e,Z43 D_6,VeF_4#m'EEmT-\ѢU-\їLD2QA(sD2WA(s DLs>5?לVy׾?'h<5؟oDq%:x;;Yd>/}T6OIc3r Q?_*FgRGoh8W?e?cD}|r:Z/p(uYghw3r/ ~zD(bl|SF44=Qژѡnj[tܽ{7)w@OPQO~Z3#QNgޓ QTYJl;@RU{,FU~% @ٿnj6ܾh\5h'p&<eS&|!:{ɳHwkFyBf_NjQzzaT^b_ }SSF~=Sd9TuF | 4%AJ (F꘣ OGqaPҞb.76z_Q GR/qBm\(سz"]}캊W/ USM4eNp.]Q9$l^Z, UPuUIgO]efmhQq *t /(.kFYv(\^1zMz;"}g#׿d_) \g]*ٿk؇>hpԭdDgj@DBZϰ?ݸqs׌KxxN"r }u7 }7fW[OAv&E-vj5L_oe~$bT(R,1b;}%ld I=;T&ط~ͨ-Qþ6/2/}Vi)qD;Xpp"bTΘ3 ΓQ~=m Fk87:Y=9V]ru90˾l@nǕ(z'c?`3zJQm"D]5neވڽK uI "p|6?qLFtpi_4b_kb>^8;{C#:j**ܿIJNbΜ9[]̾6G f2*. T3 ƌIԘTY_B;al3 ĿӾ n_}Q`϶(U߈&)QkA+nzWK_J\Z'⫶YUcr~D^CML_?k)QO/}T:u,ť>I$\pf.=Z=}*F]f吨m_*iO>kl1(FgZ%'>@b]n3X]}=\ (Gh~B%M9˼VW#)6+fEXMN&F (φ@ )F(g8ax቗4aT(zܪU]TcQG)a?C b`A%sQB2*=hb󍨿 P~ᔨzMPg{V|)N'lb>\4fL fe?QwW/yA?aSd0znJ'Cݪ?C~@Ps/)3"FMluu<@/z&,uMbΨfYF<haUsڿ1ڮ储[FWT(E=ĉje;CG9D+|˨u.k /hM̲/ VXވfQ v]c;ISJz!z2OOQS; QvW85&!Y(1Sig\-JhȈĬ;[ʮ^`G~fqhO꯱!F臎c;?=w¨ƃQNyׯ1gikrGb=  Ua:sY7tc3z}-܀4r1pnyQl"/7=p~v\Sdxm+FǎXI&5bptpTgt8D&FQtQ@ـ㮾l> TU]=;AC01hueP͸{tHˡIQ}ezeX}wL僨8qQI4afO(5ٸ1 GeUob2FѤ%ŦcKD`}A֘X1 2(j\'m1k'ĸ}+FAM@w51Gl_Dus1r^uۗ2juG5.p #GDpMX5cTqMbT Pv8F而'FEgo6.G#fؔW1*:{yct̾hD458='1J%ׅ F@-`(qq#5hJQf_5~V.N:FpB1.FۿxpjĨ\x"UE;FC3u8jl KZw7CgtVnWv^;c∾eWZԩD =V3 g\~.G쮾!"#:2jm0_ƨþQ Ql܀g቗ɎQ}T;XK;$ ;bT1:jPWXQþ?F}W7(E)Lvu("dx#uZUj\e9ˇ4FpGeiwZ}1 /ΨEghrGQPE0F56ݯoܕVQ۸;F%fTMLa̾H5:+DWrtbTQFh5k)ʨ 1˨z%/}w71N˾+F}w7k5oG#Qc^ʮf!\cb1 k1s(5nVq7`%yR"@Sb^z qPk_;z0|dfz1[@a *b%h4F_VRFUc5&w q^1^F;R ,Fy( Chо&Ʈ.uz;d! c_05!jQ8p(0)?dQCg T~V&DQ}8:B1DTwmC538AA?gƷLR%Ep0jXRU4s9c?Ρ,ш}p7ml.MQ9JLs?Zqu=nшPþZ;D!9FaQk8:$/cT+Yb!l_㦦6N1zd$ Fլ!J!k=(obkk/wWn&QZW߿y=fk!TR_ibgy#b^? }8FuƬZ8FᘞC5v0:61PM :gӃp@U]}hXQsh'OUv[̾sBXkc* Dc9.pv}yuCyi56ctptkȾ;F'l#SD(3:|CuQEܾ%x&e}rQxcDi~z};FAHE4.WWxH9X>X} luw%Q}TMo(d uwf o=M{f>Z*+F?t搜rL>3F- }CfOO~UX7cY3;z _aĨ>jƈ/Nx|3@=t=ʆF3ȡk -1굿g"jJ9}4Z(<=.gEhjj%Sg hd7i/Nxg5=F!~rA4"={&Q{>υkO(39YN7EǨf5ዝ4Qm0ew!xϛd/c,$b._ nG1wTzbhƈ)q(U3Uj 5h~׃0[&fڷF* =wvrM`R1ZϘ'J`hfc쩪Mo=_&[KX-Fʰ}I;FFh#1:il)zVlzK!DOb49fe۵b4mֱ&}Q/abzc4^Ұ{QU bF톄{c|эj'fdždwU O)gIKx񾢚Xl]7ǃM,a D)kd+-*~)^(QY NUC 8}#&\CM, 0'<9(}ڕ+hNGM{61J) ;@:y5n};/h-2orZhbM,m[ Sn/]c;+*/$8&|[kl<1{6, js_WM,kb?ѭmEYf`_vpXmpEik%(jM/禐Cڋ`xk!mFkǽ1L "&tqDۡ:mwOkF6آȒa xICZ3?3)Et-9oIѧ>V6RQ/cL=*lbE/Fc0&:j18S(Ĕ6M~HVzjި)2%^{q*fEafjo5(F{E>Խ[gÛ`X\SO Eѝ%ަ/ ;ZW&mj|~53ݺB;(Dw(OWuD]{k}[v+ŪIBCnS)دUB3 ٶ@.\1:x6G} :^-tj{lw>ެһml}\u*h?a0 փ,/WCTƨwVE B ծ$Xƨo] 6/ s@އAw`ͩԏ+]aa*;KA=Fw̐]^LӍ0D+3Q*6~0-'B}?15Վt5 ѧٽD= Z8^U.5i]G]`@gw^I=6w3`,[IitƮ)PcT? ,gvl>T|֬ED\/l2DF,k>L~&Vl:IhBXI_XJ̡QoM,ejj% ʦ ko7.yJh^X}[~ ok2 ;Sw2-;ZڥQE>Xn?#Dw%{چ$*}ZW[PX+׵EčA^G Q8$4nzC,_{D{j}kEK{Ǐz`'4ضznbkRq9A3y!JZ1Z¿ҏЃ]z#l}b߄{id!{~J_obG}1T9;#SAZ1^C(ްqwaNxb)9H 㺿p/p _-FmbI}bx,~f M0c~@j칔A|VE %_5>$ Lsn:ا?{㵴%{ )/z/?J`87ƖYl_Hmi?GDxF2xFrzJz?2kx嶖=IKY9ׯog_%G 'Q2m6[5Y⾖"s}>R|Ľ*0]jg?CDG&ݮ5#zfݗHY!EZ"r)&6گs~o/Yєaʚz !hF=~R[F'=-vxțx =d)41 DY#Z"5$T{Ķ^bBk@o ~o OTg#JW/ȼ`B2y;jL փC3C(FӇ/|t1 (Wkr} p妷wlnc?lX>~ƈ%^fu7j=#xFw&4S=]{|]9]"pޒ2/@jV/EZY~Ѕi -{V-^˳O2VsGtwȜiKumοuhW53-)vF9A4gT۶^>MlTVn-:N] 3;4csh2uM3?}U-\ѿc Z E Z EK MD2QA(sD2WA(sD2@o*e8=|:vAѢ":hQ*>O^\TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTԿ?•endstream endobj 307 0 obj << /BitsPerComponent 8 /ColorSpace 224 0 R /Filter /FlateDecode /Height 450 /Subtype /Image /Width 675 /Length 15868 >> stream x%z3 Îdee K!QvEJvDs}Cs&6pazyzꥻzO}eo^O%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%$%!NJj+ӕMD Ѥ!6N￧}6pMپ: с#-9Hw{U#B-$P~K?|.=%"J^ { K;$ӧ-@_Oy_yI>|[^>=_!!N8WW|oC^?'n E=+^_ŗ^$5"Ddu <{~OH,-MwOĐf9|d8Gd4}{3iZ!h7D1z$uS$!{'|J_˦; O</o?yEJABW)!aQ(u5 *4whHE pBȢLYtʲ(XlQqZbs`%77Lx ٛeDHUt_sۯ15!##/u \?wmnd_*g .(~++~GA~WuN:NXf`]KGFB}l "걿3H}QR$#MALw}H FQnU sZץkHD(<82ُ .p+8]Ћ@g=5$Zb@#9π0ړZGA}6 bi/^o'ُ! Ufݗ~.ިT;f@tcHk`A גz* }Wln ā`_瘰zwF]G(-VL.T^+I?(Nz!ԻXcmrDPz.;겕+s=3o߈^ϲYv%-%Mlv~ 6̮׳5r@B -.QZ: Sx*>jo-l9nЂaGhf@T[#!W74ǀ(L,j)ji4P %Ds GGe,BV֧f#^QM@AiH\=59Ð|eF]J +h˂m0B.}}zzjXP/ʿhyY}CԐF<-]ѯxGǪ C Z-$YCQ{^J-w-tDpi4FQBlĶ[vY$VDMiZ`|fmy~C4SzK(e%i1l9#Zy?`DԙƁ Jz0ھQ ~qDI刞*9٦"ݧ~OOal~\.^V ѯ8$~4g4( wluM /TȇZ(7eLr%#9(Eԩ95?{@QeDBy%-i)%FH܇ڡitG-#*14:it2yr9@#5t?iv9{yJ[7ٮ^z` z JsFo3jç\BI(ϣ;v[x (m@1 >vA(Q[3ͥ"Z2_ӊdc(?QRaԩg#O @C3Qh(VmwAToA%82$3~%BK|ʈ~o2 =H}#t!9WJo (LXM! QG }R =܋#iUm ik|hQ%K(zZyl;.Q  Gu=My2jH=(*=K n { h?! _~%)K;c-&D4" QF%FEni8ouŀяik{tLۿ[@ Dre56,A榄F8F#D(фQcxUJh%Fw1D}(2*%MoJ ' _4(lȌ6 /CӨiQѓP5.=8p6#QxIISWJ G"y2}O&э m!'Eh !:ݏT}葖Dッp5$4z@[+r?Q7qj(Ѷ$OgS4*#"z# FTj"ZxUQyQ:1D(9 z$RF?;,hQ;P J́{}0 Dô[!DQb9r hQdTATM.(<<5ӛRA$E4h xEO!!z$BMSЀPCk¹E(h%Oz"-@cFC ȨCQ^(IT;8)CH(3DYQs'TV7m(>{KQJ:S=QžYjz@3*!{$Kc9haUAaFO%DAjJy5rEZQqsطDˈJAKIoUɤ@2 3ZNG D4*!Jx"#YxoRhyEO0á|j֨,ˑD4Fy-?$$6qZWewyԀlߞF{ʌұQ!'F+]Q >1 J5a(5ܽ*`DXAnߚF쑸$"E3_m!AJ(>0s ?zK9jB<$!)7EQ~Jror,:aQ细-DޙUL-riUWsDY"OY1"q~IQ_@[#GT„(+Ř!!VFDhپܘ=`z_@)fD(e3^DKGԗ}Ǘ +;Lg919_үY5! GeDcCZ5q/˽vDӨ//A]|J`MzTkeqQmJK-+Ҩ{d̈>5ej5پ!.R OPhѵQ}ݔ'?Ie_ˢn Dw>W JMQFS!T-h@$iT ,*E) Hfciԫ@kk|>Ct-Q_maQӃ1{Ylm^~eO=0Fmgogҏ/C3<{[=_wu\tk QԜ~CevҾ0D)3, )6?R!ō^ݻwYyzGf!\btD76/J1"`ûM֘Ly o6u]6|h%3ZZf.KC ѻE~n:6"~F Cٿe%m#ne8t@t [͵K+'7{i*.5H'Qݾe!DKΨWG-@ySMFoy/;7b"VaZʈrFo&+ٳ8s}#)ICwU>/YqUhݤiTOK])ChkhOnv-yN/Oxˉ볩f F%л}1-Pc eFkW-_ڀhi8Y2kq?[Yw]p.5=nco`?98g3:.Dk|i]+{⟴S4HV؏QqR__`7omAaٗ$q,Nظ2QzK]Fsu{ٙ}㊘F o3ըY ibLQkfQ Ҫ,$ _S ؗ@fT_yx.Ui kk䯜fy#\|5Zd()(yrnDA4cKXK+=kp}D;Ua^(_FeI7!5l=o*O*au ۦMsRK*#ʃ̓%yi7Sمucn RQ&J3q" W"·/ y,M>׈h%ϝϻKZ6H~};[*} XW68DAeV FD#Hk{#[U+Ŗ%^ml!#n-i}VEYy`ΥW'J PmCr謘eRN}쇄qk:% vyL]˴4TbQZ n:wD5j}/ӟ;] PnEnH ?ZWkpPg>7fhEg-g>~a|؏Qhwz#<"(M%KjJh$?c@al)V0QSқ w)Ð\FUu'.3oU]\cӼnȂ!zM/2c}r B~S ُQjdDhU㣑ɧ Pч.~~u uSUJ帎ѷK׿@5zPݥE;~qﱥ* dTҡt,|[~+&Υ_E\Z#A4&=tmZAs|7GOHf\KAKmdrfu]xuͰ~iqSP~հ~nNƘvyeW5C=W<̚؏ћ|Kr[h,6ℴluH63E gҮ]հa nyд yg~O1' Ev#Ck,\" i6rL3:@glg8ůn}|c~^e wz{u1^gkӆ5=ˀٻqrWab 0~-Lj(L݅JQMUԔxW`54'm~͕>c UڧLAs~~VQѷ#@Gڵ,M{"-6ԄhfT2=D~7YEw}?5 Ӌ/T".)R8g>S)R]gs.#D,~u&: lfWƦ4@M8t` *mE) FkY6[l饍fjnfH_#=bNJhFRQ;q`uΎUxgŸd4VL]To1G(^~QX6ۥa:-O+186!sl,jzP} GS .l\&c((1lJM1Qj; :7]usi8g8DFpxdI؏QԺaMx~q? /AbP⹑ptqAs`?vDDLkq(9)j0}05D_;9<־xV:h@}wkNR3}'3ïgnk%!|ΌGf Dv}r0ѷO ї<5,4ȿ%"I;/oav!Ȼ'o}BjD_z _{XttKĀ=|I2zLb^Ojx]|YTi13)~DYQ'D/3{Fg$Y#0|rw1hZ_@QRc1هW^."Qv_5=>C9Gt٤Ȣėoa?_a[{|fs Sd@)œ|LV|Y3DU3 % '<"ʖQՊ(s>Q9e#@a?fhXIIX :PEϽj-szPHUDǖ-]>vDim ӷht_݇Gc=y˴]Ӈv H,,XK їf?cPhh%D;*4ICg(C]iJsRTJ&EhRJ&EhRJ&E.IQ)!I+!I+!hRTJ&EhRJ&EhRS] ѤM\ ѤȕM\ ѤȕM\wu%DR H&uUw.!iUC݋HZqDw-ú-σC5ݥE⻭^[DO{GcI@+ZA AB 76n1 (hr`@˾1oD{nfyZWa~~ W.EonI&~{ߨb? E@F[I6 #]" nFjNɐeuXs5I!'D}y0 >weQkK|tayօf\n`Fz6;1-f KG=(` t\o?ݮ*""Q]{=ybkIEN57X)v$ 3QHoEEߺ\ͮzG~Rב${"o97]ӟ*ٷރUAy} ?F14&U'DiV bWR%n<:9qߊ(1uGm?x9fܾ_ŏhرH*=]}"x4e1 M65,ˉuNFd}T n%^*Q {߿ODLMVbA#T G! 4K+Th%*n`qDWZU]ŞuZ1VS&Pno^[^U z}ߣg1A/O"L¾~v ȀhV]meYMyۍ91>He3zD=FR QR39)}b4 #* K *9=e!>sѣ'QnQ*'̷fY9jɱ82L =ȷO(F2]*y]-(|ۇFS > _8JKEENYMOFHMjS|+v.(QfX:'tk@ `N4#?m;^ '=-=drFY' TԢJD=oTk̝rD!V#3bk{UD?b0DA } RBFm(~QFE92iQ4GaQzzBej !*L Q8|$6$RO; >H4 Q6ǯx|%%^!0FDݖ!mPATO=) e)0#,iDAGnj!zDc|Ȓ(I]QDOeD}>Ҁ%F} Fshv%D=  TUDDlĒ(gT/w%QeIMET2"tM0SD'Qƨ_ rc((gUfEI3*n46T2c|*?4DX.G027!*dPQa ݾ>k/O,TF4g>'/F*xirPb,MrE)GqrC)E NσPFm2"-77邿+DbLlyt R 7(haU 3ڬ+D"Ƨ'13Q(b>X iXDe*4BS+?*RD͈uD0JxsS"d; =2F}QZ W\eL@TPDj C(q)FOԌ<n¸(]Mb ytDw A6^D<6D'JEix+Aha Q}Гh +L'D}oBF 1Y z DO"ʭ:oc GT?ø}+&r"Fl1OQI* ڄ~ c^? 75{*f.мo]gEI舒>fDA;ky!hDۢ(1@(nk@b)#ZaOJcN ykΤJUM*zs'rSTBt"b̃,]Rƨr_QfQ6$Q Ң'M*qDIt%=u:1OI,Z.U-(^Ȣ{QK"e*+z6nCS(ITblQMzlS*N Q96#3jndHD`8Zusl͈$GT+>!]`bC4!J{:w*Nēw77M !.|5#*W 7+5cE]#ǜ\ z>80IH);~hw$F؏]q!.5CԐiUPqܿ[mqz?*j!JeU⫿.]B}\4~LzۖPo_AQB@1 Ͳ3lҥmEk&~޴(9oﱟt%Ț}sDsW])Fk]~U[|z"4iwo":; Mrپ%: ]KG1{? JZ.HN33cř :cp}T HT#7\e_/g}3y_; f bS!];7ze-ֺ*.,%=|%zq!z. vīϑDjqf]PMt BʍqEy2^ǩǾhUŇ\z}u"y+'ЈařBtfLB}LaX˴,q]M NEHj+唖j\VO]&{EKqv~ gGhn Qh=@6 (R CZ)*R)t5eAVW.ֱ~l^Hr?$M/C5"5zbp\PC"=k}eoΑ`m_@HzObM)ޮx[tXDRԼYTvW VH}y-gttv58t8Mm/qXjN.g髖kv@ @$ u42nt?G62_qsB i !OҚ+ FUts9Ƥ==74t|>S,vEdp?9A  ƣ-!.sy/ P o3Z7(܂=j]l-Y53\/0//=bq+DIWiJtj(C א-׳qrc"ٕ 5X4 9Os,7W bHw;Y np%{ مI ʵP:熹mZ^J 0o >3Ha@Wzok~v%A^@u Z 1{wm|[uO>m]ӳ Hٻ: [\0>u܊ Q9zi4)1+O`rҐ,>=` z^Ņ(aSIM[.Zl1_ng-6L&+*D%S[E>js.KaR1)udÖd***Dqn}@hr/^!D^V x؞V{+.DQ|FKk~8fk-Uuq kS,N546WHGiCvk:g}*HBfex6BE(NޥZ` I=s/O+ү9lRl,~g%%ڧ(ѱ=qq|JWCs=i|EM%lGK%-,4; : ]usi8x"]c+yHEF6}Yq+~;jT'_,˃Š|ŭHptqxEŋHi\ cq?t#iL;ťM wB9rcRWʎt:ގ 8T;kOD-ҡzݱ2Qf@xQћz+@W3N**z#8ko6pFt~I /%S[tNW9mt~I ZtLm:~f& Eh6r>SizgS}71ȯaNEޢ/| t u7$iyFVD1v%iub:WM:yFqƗ9c77l$;I+ZD*Wbj .*b2ie@Av{ɢ ѤU^GL}Ұrɢ4MNI 4tI+!I+!#?(׃endstream endobj 308 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 478 >> stream x,CMR10?  ^taMUB.J'o8A$##Lr9m )uҧrTAmefHzk1繡[7ԤmcașrSQrj\gdY[9F\Imz]d2fXELm@irW_:rm͋8',Ci^Zbµ9( )t=l؍gp\$l #$~ g>slϋ΋ #s>=qyo 7 endstream endobj 309 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 304 >> stream x%CMMI7M  kappa:%wmpjrpmgu0ؒпs}{qHGXbV=Qpr}wxz}. uݤ>{Dk,~}xdq@XpDl 7 O~endstream endobj 310 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 407 >> stream xsCMR7w,  6=0>wꮨ*ݒձȭˋprvznrua($'k=& ;_V^uYdv|۹yfeaQRapdshkxZ?ts~*~ssr)pt|(|trsw~]lM;|CC|||]Nw}Ƌ݋Ջԋך ˠjQUC4AA~Lw0Guc 7 Oendstream endobj 311 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 107 >> stream xcd`ab`dddw 441Ż|?2~=;@EG#2> T'xq^^qq^+/^!'b>Aendstream endobj 312 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1377 >> stream xM{LSwo)^:һPwٌ/92AD8B:}VQjGBAtQP0E|fL&hI~s8o>œ0雵~~~s7;Z^,syl\ȥwso0]`H|0+)9{13\K1)d+Gw)"Z~e%俈}rlD3qOvzr"8Z1,N#FAbKDƛ͚o|rZUa>́L|޴tvuS֯o 13#!"5DЀ-A v̉"th|rw,b̂9 Yd-vCY~is˓>E7:F+wK-M"݈31Y7x0fӏKGO:\5pVuM4$C]uUmv;KYHbt Ah<@B; +Day8v%FIDw c"B|7l" BLU\QB!ۑEQ'뢓A1P`mj(<#2z}1%ihH1'wZZS+bFw՜13f[qn6ߐ $>g*v2FIWDgvi58.3wA1ҚOHr9!_;HBIĕjK՚۔ZIQ\i> stream x콉w$qhI2  I8A8~ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<Ȼ)Fhtߊ<ȃwԎ>UmO'у<ȘI?ߴY7 vAwH/Wʌ3cҏ(9@߿3u!GRI@o~ln޺͏yya4}L]?$k#?u7Lϧ;OLYZa#s¤SI}t]Q>aqw?eq%:oGAVga}1^sWn>';}D1yCT:oGӏTdxٛsO#oGgaꘫ~$}.1A؟~h:x0Ao"g ?cg>&SR#VG5SVgk&>ܼ|_#;!R9"xяEs֩cu0ufO07|0~o_GR1"yY:x F:o6UuFֳrC1累;0W˔!2G3k~D”BCy@D: hw;Pk^YԩcJAhm~<|WOoDD~sG~B="}zbRr:k3c~8\$SwCb5Rb0t-?|^#߂'ZG>nt$rOޑ<3 3Ό]! 2/SP K#`{S֍QSVJXM-2꘿QnfQc8uK#z QTP:UB_ QTPDͥx Q7P>XL8cE;BT@qh:u jAGDi~i*cls&T FXdruz *8L@a>'F)Cte?)5ȅc:9DE:2i3%꤈NkfQ`m= d #*SݵyE]gDaRêӶ SV#, VQ8i"4^P'BsdF]7(eu*?~VLpu6s#B l+^M(DY3>:!ሮH1:1c sx2s Hi£E]1jz$4:ZI (Y<ǼsM5v5 Q#D&S>'Z<QcP8::"jPط,rR RvKs}}STiicpZB#u|X VM?A $oX7ڰv3CJ{~~M)_>u_dۼ3dd%uKzssnץo?#u%F꟟f:(a VVVOv"l3'F{ju؄ZRs{A!e@NufQ; *\Hm6]fa4FBQ(fNJÎ iY0+b8ux'@':[Q(hV 1= \I9Dy ^Л?xy{[* qڣ)Fz(ZtRD'q:oYQQxp6rnhQ D'+1ˊ/9=>.js!'/u̧ӧZιΧN0e#x;mЉ>ml(;Y8tg'm6'$m9%D/ h¶BT]P*Q!i lNs?D!Z4&C!ʈMz:8 N^-h:W"ȐJ.sl:TΎpx"Dy7\^GV93#bL#,jxMO(NVVV*sMv#At:؈K<>sDCm}#*&DxJet~;B , dJ͵rIon /PghR^iJ4tW5 Vg}}'7"Hԁ5O:9D4' `)ۣse1%;ԹoDCmF!+{v!S1Hцm<:CF__D4t:D(/PCtmS/Z}+)hB{eԁv!JabDԍR At"uU=^QDۅ '*I2:]~\ ! 3'n_ RFT]4;@M.4QTc`}˩{ӥC($6%^#@󦔘p\Y)$R `&_qY؉v N1#JQAP0$~o@4TQRl$*D.\_?&, _3&w[wH@hTGF!e>WYt&ٌ Ćfub4@{:;=8::99;kNNQ@U_ 呙+( z Jű`cuחG4PD P [Q %uʈgiJnD%uʈչoD8Zw~Ɋ <Dيf-7VčWX//Iӧ)^Ip>WWã6%9n)i؆Z+db+݄m._,񱁴4ɩs/Zsӵ <{FTmhNi^DYkE%%F-(dݬ@όH-  /Ѓ '9-..xߞa/:!fECD:4-u:Q1!zO$oPV:E14ZRGsmbe e2h#98gVRmS{{t$"o0w(i-qPB(:¨G(N yu+N(cQi!Jվ̤PgEcD/r *>ꐙOLWBt{:[" u*_*D%'!ByDi!::<>Ff-DT&XhOu(x%yQ@^"dWMlYA~6@4UB?Hu(Uc#j"'ӧ}Y0+>TE/I)eDor4ͅab2D5급uSl@랎(PʼC-(1hD֡E.ʙQΆBNbDQbQ[qJ{/Mh$Ӊ'< (Q7[@w @ǧه:7VHkqy_ŋW(_~ l(~qteaSNdFC+70Bרl7<4އK{,|l: ;RQ,J%( B` _V'E< J){KIlb^hcQeGV+qӯFѧ:(-!jepQ><$!7ЋD^2XQ4NrNχ JMrN[*YQ.VfZB(oGVt]->/Z(Y\H;G_;.9g{-vH [3#׉zx*!KC()!Ջڔ(ϾBaޞ:-M1vm7iY:#D t@a׭\'Z=8/Oo-wv!M}Ԩ IJ#zj&BD)R3At!V#z݁(Q)(ZP'Et nЮ!Qn?y XԹET&@{ri%Q]fwS.kQ7j2piC 7_~ ?N @5ʪ % % @r')6sć5QRk 9B_?D-rj;uQrDؼ9F.Q&/&Hq5C x# dE!D|jbUgDلĈ2 'O/ Jjf"DiND7k%( %E+! 2p0e >CqE+ 2Г:(pQPg|D IzKڑwˊnJ" RE7Bj?ѧ?Lh$`Ws"]JTydTRNҾ(upl \u zRJo޼s0F5Eip? q=;iK '&iK92#քv@G4#ZM1LŦֶK W -Ek9u:_}Z= D)]:Q؏%DhܢA2Zг]@$?_D;|2BMZDeL r?Imgmt>2AKdDήyϵ9D ('sn}D3 17P菾~/_>( :7 O.+ jWgQz=0;]]MHYQfϪ!aK*>Qק?Dv(cz5F)LG!݈ktnu ^DhÔ0јP[?K+&0HD?l y,Tt:h HBD9ohl14Z.ELX?Q%K2 lP!Q ΰ}:YD-xK|/-&J(YJ 8-RUBH? Dw¥P^N = :ڋK4Ph:%:8"nՇhO}.:CD@5G4Qwt#Jz+zۈ.U.\Qh-!SDN ѩH$OR9;JL&Hk ~@RN&W}^q֒[qN}9ڶ;W ٿcOfRy?&ᒗ 6ͩD,Y\FQ*2@Z#ڷ*e?!OS@]MNh݈ڕծ@Nϲ"Ó˧ a>%Ft7z^.Zh#J0Hȩ:+Q).3RS'ﲦyP<#+"  WK:؈6X5b C,8ٍړq6Q!ߺߡkoh~|D%vt # ~zԝ&M1D>+jĦ2(-sN5Vsiu2 pәf,AڏnUՑN=w+j^#]"\8ˍQ@ J :Q0YDeQ" OEFrR;%,B֍h| R3ʔFD79OEq"EBDaMDkDeE[QwQVNZDwDdQ< ZaEU:YDCc:Њ* M'#imIh}" pz8yS,DCшΨNlĿSP#>0F "m+h_'O{ڰlҊje>8*|_] [['/w`M0 ]; zVTM M#DVtoLDNؖ +JBѧuBъlZЖ.(leU! f`*=Ѓ(,eaLdjpLёl7 qi3ꁷy<$Sg ʛ~0qn찢 =ڄnYPPmq xER@~J! ! ! " OyQ`D1fHxQbtDbB"*]mD(1XBcE3˜VфP]ZQy?":++pO-0ڃhcD]7 a@>X& HM{DCHu(U:ec=b)X{RF+< _٥d'F) yc[T#~=ѝXTCڨA#A@0:6q i-Ƚ z SA4k12ԥqlBS:ňQ%V&Gte&#N(Ysn wt2t[I D:_Diul9e4]Jq uel}}_FrV:Q-K >0]%wO޺4Bܤ(„*KB)@9eGP@t`p" gQ( z-E4cBWi1݈BQ>QoB ԙDbhs欨4 M,p"J9UƷ,=^B4w!jVQĊ.LhE *"W(h !Ѯs.;LJ <[%LR(=ZS"/T5.Oh?ʯᾂ4(Kxg u/;K6zD\}RէGI=X8Hl'9 ? [HkNwhS(DR()#2!j\,P5Er0C (!jQrv \%ETEgfw(Hd'DvwQ߷Mױrvt𸘁feebEjMyDΨF@eξ'jDyGYDi"1Ԕ8XOQkIGQ[Z#!_WcDixS&@Aq~'!EܪC(e:"E4W d-GCBSgMC}hRhjE-RC 9?4h3!\Z}ȴ.u aG#ҁ[)#[FcЈ0s = A; 0g!JG*A*S  Hz 'n;cˤ\J=:#WvUa孩H/m~[>I87"y@jKîDtQ^4"ͭ!W(p鬹5Dc)!JDtJ:4{BBf Z+z7ZѣDźGYwQېVWVkݦcDɿY^6qW0SPMuGaU QQp:Du*&'>t{}zov=mWDHiQLo&|CWB4Kܼ@ZDџ&JOS:UD="J4^Dฺlԁ Ћzi:ѯ6;.m骚>iƢf[#e K%@Yhkzxs7"U.#J t/#}(PZI}Јڊ :(i%[IJȡ.$GŁr)!:G| U">Ň3% :Qۮ3V([Ȗp OmX 3TDesZB#B~MQv N[Di_At+F+؈JL# ފ\y~1Fl ]! !JB$/Z@VzDw"+ v1= Cf4AD/#D "&Q+Z@|jD9DtPZ@|Ր 7W:͎" @SuA߷H?OA<ؓ7AG$ړƗ:&p5R Y_x^)nXdo ]ƄJ 2Ma7[AJѝhuCZe%Ê%XI' >|@ Q(xDT]LJ˛DF(Y7hCB QཌI;1l %D=/юMheD]+¦ZDZIDiìmʊjw(-n,#jG@\hъF3]VԫS(>+@@թDf/"M@T}N>r5) `# Y}oP *D$Tf]~rKJ4 T2iI'q_ oT]1ZC7GB͠Y i'~WA֥&bISf!sׇ!s@@'ʈ&;m<PBщ5U]DSQt  l!T" PB:}PhQQ겢a4ii n7L.dlxY#D nƵ)4Ү&V/^ PyD=YQB\464g^o.s~_s:."FyxPmhnP ʍ6DjBP@?)#J'@nER@6XǍ24Qۄks%uz)" ް&AQRH"0'6$˞.BFt"uX>Odڈ]JD%Tj4FqZ/?Zi=?~I~֏:R˄~h(Hb MĊ&]T#?5QdoPa $WQu$@4YQjoIfD i!@M Qf4@.X&(HK=U"ʌf#`:&) JUMhBtќ6" MnD.D]@J0+A47ӽv椈fY:9DL% mEh TGmj[j7t0%6Q%lW/eDZp9y zqA K%_L3Z5,@*1="AՉc<Ń:vS69?::e^Cf.6MӓA?q!Oy+2ш.O{G# 1!Ph4[ pDKꄈrrV! L6q# ~r?! ކoQfT'"D9G4\B+utVt^!N_(Ʀ-VдrK҆׈WШN3pdTi}rۖ^֓8D`)E=7Qq꾠ϋ>hPb/0 O,kG):7E쪴XaIgLA>eCu"Q;5\$֍(D"z#Z#:( B?4G߉h2TVG# qdNAN6(|'͂yDgwz}(}V4 z! lE8Da=A/Z@yЈ²SHzʚ8D^<>DeChB(ۧugmR7^Mr D =݁mŽ,ut ƐXjJM'H;.Gd*09J{(N'iAdEVuDJ:z`6"(C{DO߉ZT&!N'KkȎhmNRoEec[hKDHf]"oೃ l,PrAup%F-C(5ы:uxC-E(-4]O#(X4@RsXՈ4ʝ K17&FxzʮTvU IZuQ%>XɭC;:!x"z\H҉Ue)jD<2c{YeKpy\"Lw 8DRb;iRK,GL~p:(wh-qOňQbt'3Bl~A49F*Op^ŚZS<;Љی %uh֝=cZ "Ad&[-TȫDZ'#4 zvi\D) 3+V!V hdWQ*|B{nw *DيV#ڵ "z-؆?Zń1m΁\Ȕz@- `1.DMKr[+|0gw}Ix֦QOD"K!urdu<RQ Uj\Օ.o⏂5a2*Bӧԑ"AAUIbuф@u|ɇt4JO bm[-;o7pl䥵܁뮌(@QJ\CD"4$u@(#7Mաe1eD(YUrgA5괶hs8I3pzyQ >UGRQ+ZjIA\`5i? I*Y"/@R W!E # W#JաdV*E i~GP7YGtV:H3. )#XUV"a2,)~4)]_DLFQhsI."t7Lt]5fEݞkBp'Z02=Wot,eϋ+*ʑ'@y5ՊnHWmDM==br 9Bju3]H!w#sޏOq'B$~o*ёić!"~u_8v8@VTESo4\!tlݺucCjz_c#5sO ezՉӠކbjU[` 2S\"z栟҆@"=څ(&j3I#ZBjVCBxDmChQf#mubM:pѕ?$S6DZh`QD~FG.i=ښ6bWl h0ЧNb*#VrnkVs^-iJf+B;EW*DaJֺ/|c}mhJ#L*umhNˊ 5:Gvcc)h^|;΀&՟T*D~kWHփ `DqI6yqh75cr}\'Xu3#:2;_Fh=<6XUW>{~CO>ӛd07߭mnѺb @d|Dk 폓V-ٷpژmJ WW/onQ7,LT w+#JZggf?:xw_!F%uH(,/.p/I\)^]ZUyBDda7qWVshoV}7jRYABD>c(GGӋ(Ek]jD+u^!p!g\9^D7]pC]Vgy"o< j6 t2y:qܹh dw-tb@~ ~N62hcDqok(Ac)ty ED#oa*apG1eSh)<+ZdS ΀r%7Xׅk:eD{V|Ə= %x 7p\bىBj rBFVnIc7Eh!ap\L:tҖ3ټ d54ڊ2yN  - Cs h7qE@s)fZ,KQ؈ wz) D)gpzPGWSpۘVG6vb'RAdiϾTa3vuuN[#J0</:أg!8~ǍE67O,5":L2M~ǎ7s@h, A>= AvN29mD%F_E=#DrQTgў5rQdT%/vnɔ :WDqAC%!z"zt4 >+J4P)O͊:%DMD j~ D{zLEI^#08AtsњN5=4t]_ON%+jV9h4d4RrIC6M7 _O 7:%NI ˓~ ]g9-D2zD@DaLDh^ D:!Mme: 3__G9^K*QFBDiIKS ;"43/.J0|LC~1Zb>2$:\t't0V"IJz)#?~Da48ԁv ُ((\PQۉu h*7bʊAA?oD=5VTnuhD`V^>׊xV9[D*c0DikѶ L]dzrC9pQo0JHĔV#;\mj%fA3zH/cVvt:X٥fa/s=|n-1{EA>pH7xGS*)DwnQGT5D4RNͷhN'5Gp1Y ݾ4I e 9D?گNa>kTo /"uzu6jW \%^ i^IBUAT??Cߐ؈\ YDon4SCthԏ^hh@_qmOX'uv>d* j MhDF(܇gƘ'd$<)Daڤ~;@}'쌣vL5_8O4詡\:tw>JvgfAO;: DurC6 UU"ZQ`E#u:Ek[Qa,D]~:whe+B2OLQ>..paՆq yeI}XHP_iE59ϯ,cM~o%)QvasBtN-cL2tG[(ot\ @t>&C_e ҏh Cvp3~E}P|_t:2%+m>A0X]`@U!zXgt +ZDՒ#ZxƊ;S^%R8 jAqB5Q90aG3'xBK} Q(M\ޖ ~2˗.u|W89Rз$y ?}^z\_Wg{c":C4oQnvC"5km0]M'eӗ4b=TXQhXʵcv. lFnRw ہ|^}"畊$EjuZuQ D+J5o~=" ܍sۮB"b+sAimW:a&)pud-={Oh!>1GGROўLY@G7½>/O2Mj*LY"ACnGn4/:- u8ݏ~ڈR_7o??ܨ?e@k{puOư3N2MǏϜGk+*b{C|9?ܰbMeBiz4e:w]gQTGO{;o'_8 5M~̏z?oʹzg1Sz *&W`n.6: Qxs+7;B,NX_:aN I<6ԉPٮI-uޒ:'5R(~m K%clx>!dA!eu:lo:};1則5ata + ̔}>1jq 䈒6-L7::}/D5f4EtsP~rPǼ7KQL)*ufQ/LЧe:Px@ StrFXRwlCBT{A{!_~9૸ 3җN@u"Pu80QQXzN(Z1]Z*Y+(_R_~eWy^ hNGGBh2mr"ˍ<[:A<|]v*hCVSATt@oW_DÐ8 dE at:>^z {{:jIONѨlgPURV:a4O{:dDB1}?DoGMcM9DъZї/^X'aB }CT%u`I!h6-H QԊʹZLEC:sp5%BtD:էm$eIJ(# _C&~K(BL`D Q'"D-OVNG ݗ p?ەqi'PDE؄8Oo8\jChaoU#zAQ|g HoyT(<[8wpɩtEh/ispZ$M/Zu:S@Fu D`5( i CfkM"ׁd=&RV g|w:h'*-3c yQAzShk׳4P[hi7NNkP8/6QVD4 k? J|4j'HD_*+::o2|zH5Չ]Q~mhQJԉ %L"gAC'4RGwԙD݂"i#o:\7/yhdb+}<: e4CdzDXT3:)=Hd;$oo;6 gD0/?VROULN~@L=¡ZQYčtdsPwQGĺ߼QB!u V.& DdtչD9E+)~=-DIS&-D6 "}:^06 Ets8̀]O)fIЄi!jATf7"DXD! kiQmK! D+G֪cN}%`AtъաŚC2tMd2&y3|__o4bO Q"ty^Rguի3I#7Kԑ"R@Fк&gGT!kv]U|z_ E&5sLj8wJZ(! _+Dj!NQ\19OK k3(#j&:T-e u(\wѶ#4~k_oo?XOz#qu%ܘ8:+џpWB6Իi:dDT,2 螭y uҹ#Jp z5>1O5D4ؗuX鱟HyբN:?jDWCG_!B9Q@ԪG#sV'7ЃF2QN^1$QCosc" bE3:uDHF ,w{1BE(DŽ DBF%ՉHG4"2qt"D(_|m(xD/Z(@@/$؇&8z{@4~?/_b~8_+KCݽQee)=)#LfԣN@Co_QJ6M{id'[{MduUtz(-O'|Q^9D(JNC(NDJ(Zr(Ӊ#hկH&BDɤBt"~DlDz" <ʧK "NKC΁D9#R?/lQ9 [q2/Tj&@HDORDOZ3#~>MQM-Fe_3W,RLCD u)kg`Dqs'#K?2ܤGt]j8JQ(!b/2ft kB3dbƉy\&E0Y^D1{GԿ F<[>AYB9pQ@D!%2eΟФ&adHI @^C}dj)yu\~#~ l@:}/zv W =pLzȪ )U)QyW#Q݄$(>Q! ݚdjvY͌:w(P>74$"5!J3r 1FؖT8 F# F(,ÊBt%j(H)w (QĽXѱ(2殱+Jꌋ#ny65Mޒv36@V d,CJh82.֊:ֆ0R Btz*o\%3~Lz+/J:j/i:@ħfTع!V+wA#V I xO_*X\$<_ C>r(5m ] o+Y" 6#e N6f;DlQ5!YdT'("f##TB:f&)Bj]\/Qt#MNKN &l~5 Qo!@/ }ƕ77s#Di|,^%DzQPH +پ[Jl)Fh̛QYJ-I(Ծ4 8q I^#𫳈z<"P8aڊ! DqӖ j]U/ @4Q vPZ(ETU8r?~C̨Q%mJ',2RW rhZmEQLBk* C9gEy$S s?JNÆ7 2؇"0kOӟ&8cD{-ӔRƐbqv4hYDԉvv=NزitF)b4aܗ%b^_#iEE+?QBJ-DqsJDRQtўlD#7“ E m DhQRYRBD|S QԆMDU<}%=CH߰ s){Is_4ͳg}$꘩QP~Gu;m $Hi0M@4:c&77oZ\hBe7D$ӭ`2EDs~D[Q!*{ǟm Qm>KJ^fn8y{N23!VTt"zatQ>J$Du&ATdtQQ -DD?/K}w˗r/%oKEgW:Bh݌фh}xԡNwGQO|\I T}%X2O[g&/B-DE4]A [hSmJ/9?ƧwV.DMFam|D!PKЇhb{DuI<н|/xS~ u:h.OVﮃ\IX}á\ ѰvYDk]rDNLDڜDK- ڎn'2eO«8]tt7wj';|bY΂MND7l[5%dISZ2n͔;2k<ԯ ꌓԎ1/>@Vw ћ<`P*F3'DQ짋h:ٓGэd儈B(@7776b"ZQ<ao၈x> QFVt.D.Q`nDabD(0?#RjRqPi&6u R/`@NW执}T'B4F| DS+"JsŅܹs-lu'Q 66`KRB!u|/E D9 .YvHBhƢї !UӋ! #"95mr-D&&A0ꦗʈRiwfѮ\n^_NtI'n=Ɗ:DsDh| &.x޸ose6Kiz͇EgZkkZt2opG#f#!A݈h SI{m# 5"1AA[Q5:֪ ƈFbE}tzD3.%gEIhAGWS+D9'mD&3 ;.v"*:DPI& %FQ@يVdQXQtQ_Q !@TIb.D!Etݵi(Q]"?ܣ +ZV,p5ɈEѧO557/_7o=p4y>ݢbO[Ɵ%D1%7O@'is~Qhf/"ZX]+ %+:`up/~:DaI.uXp\v'`0O'gc+IsvVsQ^SD{ %޲[bBN:-e$$R"bD!giQ[[aO,5yFz؍uQQ̏h<' DwSCED!}fGR5$ƈB֊Rfm(6ϤD%赢"{ A\P!EIv5<" D (CpZ+hu4}v4B@pg8.Lpyw T'b̽+OZQ=l(I4QR!z~э3D|s  OAQN@2QsQMHaf27^.Duu}i{ND3V$NCJD Ј zD?n5ňQ# -# Q@ڿ>E@ D1 ԁhpj, 5nYH HNwpnQ e:==A9;3ҡhzKǦ8OΕ,OXQTZlw54M#j!1DQNt4]#L?R5.#*i!k9NN@#w;ˎE(}$sI<e9NďFrl @ 25,BiP[DD+Q;śhDѥ&3F3 zq|CQ?L@KT5V&ЋKݏh2B/NvzNEAQ /-Н]m\ã#!S+SO~bk,L%57t=2A!*=#j{B_>75"ҔکzGpWrbWw!a#*UxJD&(P9I(>Y_y=J+ڍhEgCD~3ATkMQUG`5!y؏v>@Vt8v&,\m"{mM^Y(()A}QŨF@(XC:Dg(TJl7 Qp~oH{,CH QPQːG;,s# @'18$Dx;S.M$s8SGtsE#!Q;'@ FQqb4+3N,uȎ(-׹nF=-ݬ)dpȰ.C [vur0/#D2LZCO<|zD!2 ~zNՈˠѕnD%1I: QSf7֎F}4%QE)O:@H4.w 4(d5mdDEA8;^SjE+X @!>pc+_4@d/pjFqMF#i95~~{ z*y'Bp:RUnK10D?xDi' .hDw(`>`E}F$HOCDd|9E%ސs=bL~B xJ~DDi\6j~ي{HETz)X UsyDDOQRj"SGϊ*D Qs!J?Q o*J:52Q=[DIDDx PEdGv-#Ѱ= z#-kPyVA$Qesz-' R+@G&R@{|Gk.iq ~ra{7N5vMȢ\FTBF(GFޟ&8Flh@-">thQH'+jDiB,!xꍦeC51K|Wc~aNuyəxǣd8`?,OI "zA4FA4fDg\*LRܵVрϕ+ DNԠ~rf`2! <䓊'FBD:+)BTEAR3Da5^Ҹ)PhEt%BMFc#0 FmbDSF´Ue5B("5n}l#ځMXҜ%!Dh i|X:ŌPDIQx܋(# 7!JY^DQ&t87~;r)SoFݺψN1ZZ7*ҩ<R+j{7 *X6*ԁQ2/(@zף=>U:Ɣ(f,e V72m+.id̏)hܙug sD3 .E%@#D=*de)lJRDT #J#* r1ɶ[Pe >b ^Dكm)~߹*haϩ;:eD<QU#@75Fhv eD!$NcDAӊfj+ .J7V4( X65)h9U@66ʈ7LuDхJDcFcjQMlR%{gWn+`U!m H\dZusDF![ƂO#DNʄ0Q̨ͼPLWR36G].Y/L(@GN@T3 {o|gh/!1b9ʤ[*B&sQN#6G9$NuQ_#2 ǥѺ:Qڮ@ԸOQ Ԉb'Q*ЮtUAvH#&15ѦU# ʊDm#Q:MBm#i{D(پS˲ˬ(м gE!G.JCԐ0{QT)r+C!Gt-X%G PC1Oދ`6\ 9BMrͻ :"two pO>N|}(gƒ}1A41&8^`E 0 l0.}[(l2 Q#FT'AuD<\qKΔl) FxPp蘿eÐ5p[GTvQq"کN( ` Q 7RBSc a UK )<(&gY2FTo҆exĈR'B:h-DAzhX>KDU #8RnDi JSDOz@tnШQ4KuoV ]5Wm?Y|X|w҇ɫhmg%9)ӌſ_VxkO8u'J:<̿4% юTFq4f@TxIULNIөj>1GS&Q_D" 1"mgMEurD_Q͞!9DE:a(DZV "zkQM7١ 0kًCc9eEClEu XN[QhFVz7GãGu(Rf$$5CZEQ赢Fc i'{h|by.0fὨJKs1 \G'oM*:Mm3ދ7j/S@B4;vcvPTh [Ϊ7رGX6JPgDtH|jS QgsI'کÈҐ{D]2}9vO!z ԁnEd# E$h 'ILDŽqQZc5PSEx N&D!$eJK(>*1jDnK {ztdJ ;z2U} *\]"?;Ɉ1ǻ>3D#RB"4F;F/OUV48ND=9s:U=QxS>h_c,QKݓ(`bD) }nߊ)5 ֆ~3@%jfrSLx+D(5!+zumfT2 š nPQ5qF:3 *zHU~;X~|&݃ߗ&t@ZmvՑζBi8fzDZ5fy SjI:hG\1dgĸ>:S3ÈN_kCDpԚQ'O3uhԯ+i~4A/2~ΐG/:sDhF:/A# D #JOR4b],E&O-" L(I GDeGSˈZ,?~4~H)e;;Kws&V`E]sׯɯ/ Z QAWxMAu rH9ܬ:>Y&tr;N6:͵ Yru`o] =E"D|~DؿWc%D!GDyMuD!G.YQC=i DB Q! cNH(OF8_~xΟP+Q!A(C3`ZN''qFYhnnR _tg(DO^ EﶙЈ>۷By3W> DM!g ܆N#Zk$NP@hnAm~;z!l%"]mF2ij?.Dѥ볢nDڋ:]bEĈ|xDt툶ЈxDaVΖQ ֐53ww>}9K?=R@WeJO:؏ 8\ܼ L݃>ޗC!C\% ',ɸGmB/x8)GhW+(|+71Mȏue(fxFjE[GJw*uZQC:DtZDюI|V'GDErbf,^hry׈..tO&]!iZZSڭ`.+܉3 #xVU'åڻ9VYR)funzCJ|SJz%oLjr^O8!(1ڑ=Dk5:!DFۻ 7eZD8@]Q iG3uCg?CZFT@4G'Ձ~!zX ^^yI=W8QiڥE 4ʻoMT}7[9|)D^/x!Byㇿ?=+ B67@4Qy&v} :uhzQ7+1 OߍK3cYdp?Te)'%D}ni@H:9YE>}y/z[܋򁥗N+F{fr#a7Hjw8}VF;E\Ag/$ z+V2훀vy<'e>m B".D_Uk2D݉Deyp7w9BTDCzUv iHƻ4m l>EDQ"tDۊ~D=B7EDUuu}N(ۋXQJB~ (3c+Oh/j;:(?:2w@PLRB1oKЮ)ΘR)(0pZu{&(pjg&#(G'ԧ?Hbl ;ψu3( o"o# A w)ENї9Ҥ08YD1#Rڭ˂:H5 y0w [F?OϧR371AKD"J-s6^D!v6mDnD"C:蓳Ћ(auN/:Kvӏh@{+:/MA1#6 y}H:!U}|N` ^(vs櫓+uX:TI/?,T$7 7֜jIv5u~ˤ[>y~-" xȝ_wvДV?sQ좬J+fT. )De+I!:jB"er4EMj2:7EU DDCj'f>QB&{NK"QW)0hUXBmʊNf2RoCMU|~sqF 7<,mDeJWP?h&@e2`ms$?>ډ#N2B1DsfEiLњTWg UD=A|)uv(V7xRj ʡD֙puVf p r1KU":ј^Ep$Y1_aDGCxFQRc1DÈCdEtQpNDa uvtagg(6 J FRH[\htƨw 1TǷ~. Qm@SQސ叐:ñŻ4;yM 5E j? )?-0;qA45!=|ӈN]X^ + |]!j/9?5\Q[GW*3n\h3 VV!JrDZЎc5)DˈoԾh:(cѳ38?צ|&${~D C!|{{er.1ET! + FQ^DaV SW-ה^"ھa:Y RV1H;5蝰/˺WXjD˧нѡ{N I8tcCX6wN0=>PPzEV1F"m$Y4 :QĈ:ok1ڲ De2˖,OZ~_Έe={Yf٘{-,2,2,2,2,2,2,2,2,2,2!vendstream endobj 314 0 obj << /Filter /FlateDecode /Length 5763 >> stream x<˒Fr:x3ҨPM됴ڐR}!АǴ*؜M: 5̬|gRZwwW7(z쎫?Ǐƭ* jUU[t*jMvYЬ7Vۿ"2dV{6k s_kT>k6 Ƹޕٮa~ Ue]V}=I(0a THϰ%uHWf?7Fv+7|j/ Ūԕ (o[U|>F[e͒__쇈b~_."尼y9;O}d~::Sǹ6|*j@**%}P`VN:2νl?\̆ j'.G$S/Шs>6c֛–QH2t /Ù:ަR JxrO@Ln.OJt\` z5 Oo0bJ BOݠx=ds@Tul|*m=~_ƛl(XVxǔ%¤O%OYn[>4y/L&w7eA瀙/qº+`]䟡7h:)}D[s{bf' U*EJdֶCd[EH6(s`"`IJbAt)+gyPϷW eM Pژ#6ʒҁ,xLz1K ,3/R0=󉕗aHg/cg1xzYqYף7SnG濦d >d +HZ@&%[7*kNͫ1|! <{;4=r<'ŦI'&MCvVo}tV'G֧ IM`aĴqtw{7& rJ̱9iyN{Oe{؇\ 0tw -c =U'.l2u!.\ y+;G7^C"1e @}l @!$d(! 0)=O{ 0CPe  #賦~Giǫ56fh ^AiIފ|1M{@ )1-vyZJݖk؃Cf*2:zǩJ8g}iꑝ`pad` lQJ8S"ɧ}=Eg][ Ie D⡋Wdh%HSU>wd.^̴ qJdK4.@C;*]Fp:a`2 KxJx ֒_+vTK8ͩƚ2VP}×^CbH&fBd-[qMfIA2 皜C^hWlF3^ڼ$q,UuɑWء7HUHJt?A^rg!-1T^(#lJCac<`nՆF%.v-u lCa1A G~=?LI  CJb<&20`;8p` {qD\Bre~(fe"=lM"5w$ f곂.;G>rkԛ]B ߉xœ0TV#l=q$dHAKd"waŝ ?Mz]3!1>r ~&}$Lgokj>hL oj3!ӘX56{4])r89T99}/MH.(\ĹqkNFSnvǹ"3KQ7?*/+Q6 SS^كޱw=ԧ7 yZLU%}U=᪒rQuUtCϛp$FJkLR*MU)L#@hmB ;CJM5PUz1Q2ȩ XAIN{u'a3wA_waHG+Z$=K{M-\]$ItYDzr0 BIQבY,=(x>UR:!fJήZ6vvCICl=5vG9&TD̥]Jd@n"~*j)ABR& FXh8#9#A=$aeC-BUR^bJ!"XhX$nT>}0wyCsQ=TCT'md8T2h[wჹ8py.?XXy)C?¥6 IAWI[5DӲeBe/ &ab˜h-_+&X3{*ʼ+3?).5Hҧ bCWT*٬>=ર#/} >DR 7.ۋ5J{-q;2tAps|ŋWHx`Q*P[Qb؄Sǖʕlgi-T!p s\' &h=[=G(]pS~7 ~9qM Θ0 5̰?N]T"/hdfj\gҁ- ,(ؔl-<߉r86.MŔnjoA)!,s`ȬjCm!\0XlT5~B/$j="b(A5Qs7H+d0< Dcxt(,!"G7> stream xk4E3;TaHM dJɺetWeٲ(Z7m[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖ZQJ$d8H+ShKlq$:gH޹v~}x>onr׼7(q2~;@@% ȄD?v]GnW_t;ܭ@*^O~6 DݗG>̑գjz{~ǣ44 3(H~ŗ5(2 4DQ7{L߇H$ь6#D@H%W5o#Q+ s$h~҄y]{ެ">|)O$D@ݏ{@{Q@U2j(^@H&,j{3 d!<)oBjL\FպȜ{lLI$i ^X>gD,ьrƫba#_%rLtdM"{mts3IS(߳F ¾( 38bx=b@)M"^8hIt- ZKtٲXug IDlIt- ΦRk?kbg3Hjumq6)P^.38hIMJ>@zu|/@@G(rZ@#fh$ AOݫX*DhDBݹdX@ [ne$Z@H,@qޚ 1j#QmQ$\Ob>2h D $.s1L#Qc^z6V<y@HT=\"4볟h+اAy$7wFA ܒD$D DEn@{~Dϫ]={m畏 4^Tm&eSxf: 4DPmVݿ d=*t&@ȜB$j5\C[)f^L]d&늎t]Q $D [d Nˏ_YH .7+z-3<"CEO8'+)vz\7otavRqб K"Qßx^Nq%h`IUCz3 xh~C(QHKNTQqVY*J@HD$M~!%2k6OK)K)4 ࡴ"D@J5 PO|!?RqTɍU@t8(& &| PCɮ (ySbQ%Hfٌ?<ڻ Dx s' J_rPa%J*ZK> i~yD_3:mt Vmg29b=) qQc 2 g+2pPDѻ $eGuH"QejK$@mlNUуX3S;LjX9 צpB/)'ySQ[zMUGX [=)L',a@@J?f+QJ Mzs=fT,F@#K0#0hŇ@ RQO 4Rxf*E&JrL &FM!&[& W~!hgDi^]h:OkNyܚ;ijϝMp[ySYUپ];%:H%=݁DˁB.l!Qu b8 Cvx$Q$Nšn `3+gr(@B^Ҍ (SI,)eԆ t3@$h%qBH>Do0*AQ.}z Ns7(gSAYo/QOz\Ǘso!@ t/ @xQ/@x Rɨ, P*K$Ef,6 [ .@x@Ğ!M֢]2dJRV(R @xMM7|U |9P[& $ U&~0E I@{+ R%@$ _\Oȡ-N>O.fRP(@ӥ@% _c/{q .9bz; :3: (5%@WuxĆ(0U~G# e!eTCހGM$DuW=]6 䕨rUHJp8|,7Y r^dH4 H_x;Cʛ -Eet'_](jo p~io Ph{؜5PL7T( jDDJmS4Q(3g]?5m~ 4Q 4DvRDՐhURDKkU *ԛ 'R!RAI*l0*tn }lD ҳ%2f>d d@F%zMϘʛl=Bv{fPyΙrG`0R4Q$yDx@\tr7ް`. nI|&Hy(''}OFM%gW5(HH]h( B&Hx@W|DI& +=uԴ k Nǁ7yPj- 6N'Man>7U[,FAwGOEZ;U J|UPc*Ьxq{K[;$ytL^+~@Рj;P蘪AfmǰZK4L!2|{9sMLF&%_AyAO%z@( {T2 ϧRRej,QxJbop\N(K!9r9$(B:d޷n dhᡶ ɇ@ F7JTѡc{ HG 8^$† 7_lMzhWyqhmuTzѓ@QXdtT9%pH i;Jޣ:0 sl w е'x p w9~2R@Yj?)+f>TGN{ik%/ z@O:v*vd8/}{=1>[asHt?oׅaw^ulXڳ@$B@ĒCMZKoVIՏ+ _ݯt +bh p9P?:2iJH J'%a"zzЦK t$@'=Ozh>&"W"d4sy@:xI)rt(}_~ERGG8,?+;ԭ4@*)KD@2XрqSuauc.q`3Tԥ@ >OqS@-c+QpYy] HaIѪIIgFJD1֚ Hu´va@#z`-"3(e@$H"j@PR@IT} j#o TЖ|( 1\O((lb4PאI l}j4c^JT|C>->; ).`q?ʳ[2]8@EK[):,kDK)FUhD6%X@\\&h )@pp>XT6$&м-k18;>펉'@ܸ*yz[ٝn )^hD)dFSdG.]mDd(a:/NxH4o-]/t-*{H4: @;tNC&EshfKĬ@ߣ/1~[*|-./@U~T~m3oJӧF[%421 }Jjt>hlg[lM|G!҃".#jѴ(v3@CI\l#jDKNHd;Z]6ݍEp-(?(*b> 9%P=jKs!XoD|1D&I``>PohDr5 ">?2P(7_[\e9حxxz@SLݗO6>@ E?:ANb <KT虗DUߎlXoݗ P3!Q%#* @K=Q4JHٶo~LG~ٲFIԞ%zgqh[[@nG/|@DO (H}u܆GZQ?` 4@_f=7$M5k=+ (# md>q*iZOK9>~{WWݥǑ׌BB G>~{m1  3hՏ&pw & QuV} 3xE-L}WLOn pITt߿wuD} [&<@jFH~҇mfE#Fb~ Ì՘ 3ݽOECܛzt~ pD?hP2:ݑf4 H1a2s&^/_4'=T2 nQ-gmF'B  ||Z^iV:N#6Eݯ&@63 xh|@KcmqZ˖M=[@M $:gKmq6DeJ3Вglk\$)hNblq$ۥg , khf,=¤=-4hzA(DzXN]@ (l6dɒ4\J "h2 AdO 4zDmIQO$79zwˢb-EZVqvmx: Iz IsZg{st=zmdۯ[I&hg'b<04uuG []{. @F5$t*ѷO< ݈dvx ګ,&/QWsr8u ` h(5샙zP9$OEMFp=T4D1 r=(,E{G y o @//4Lk;㼲pxMy\F= @//@3yߚB'ufEAbW(?͘D@//@3'G@T#їF `K$Q Dձ@>8ЀD$zPydk?D7 cb(b 5P@@5}(Ȯtpy|,jM"QϢM>&V٪hD^$!uM}q< :1P]U5D v3N+*5@FѸo̾Uڈv,hzhʯJg7G.]?$_:DœTC9@xD]=4Fʟ@> Fmhή?J>:*8@ !Ib'J4P?By2zB*:?(ʁB> D#KTɶ7J@_ow$rCWF A@DJT.#@6/T@z a%jgaM 9tb_0PE80hTp" M!Q0. >ȔʁNIЃIGSWbA~wBwD$sD (TPd@zI*ў@B $3hS*@ت(qo05uh*6n8 $5U~*B|bQa4P2$D9.J0|_ P:T\h* Ut —ȀhH5U.~,$^,o>CسMC _ a($Nm73^U (hIy(v Wl*z+댿5:/ڪu@%?6û4EmdNޱDDUd,PGɯɢ&U#Y@+o޶"0W֟B;yq(%ZWmgVkDјX@1/D*l-_-?"]׆M޶9xpϨK9^("&XxNކ%ce!^d+4]G4K(*z@Y ]d,PB*=)S@g[,l I-Z//p&ނuS@[ $7GqEXjrX/ (uɀ\ylrXfp >!@DGu_GdK痕hu]@XPL_?P2}y-ƀ} 3>m|vI.-sGI@o dG}Ś@H$qەd(hIvaZ4> S SuD# |#8HX@~Pc$3a[V!#"P 4ή ㈻K_UA4BE@JDTP"bF =7v _&PCc*{>; 'Q]XN1&6ENYʀBL硊@[S.(<%L0}T#O=W =2*?H=7a}k𲠸 C0#w:<=C5}$ʙ:_A%$$y<:MYfv V6M.LP( ZYK<Pm#d! e 2J0dpD- 'lz <'PS"E8-| yמm^vtm |< '怆բv]+QQ !PTO ԺMEK[ހDS*8~@ߙ@"hD .nzRmH_ 9 OohD7_ +Us]@n׮@@ | 4R.&Ǖ!tEO|ȋ$˹E1D_NL4$ꮼ^%Ž?DӉjQ1~KdH2- @H4#*࿤;t. 5PPV%jK_TZ^Nn;h݂kiAL&ez!"`c%*(ڄNm~ZT Z/Z"Za6PR@brF X } LBD3-GkA49]Bf^ U΅#@ퟚITvq-yGz>d" pq@N#_KGՋgo7K?<2PU*Ԥ夓F omu&kA@,Q"Kc:!߷$k֣5)$sH-_2)NښǞJ{j"ʀi f@\Sbz2q&=q(@%.\U PN(<D8Ҕg@ 'b *1@-jTd$.\lě,$ GM=DD7EϜEZjc 0/@|@*H!fIt4bA_>tIT u'=[U) C7G0!D"KZ r@B ].ST#åT D.@jָR&$IM4^/p߾*ӂ h}Q'L&^mϕ@:bn aq_%cA x+s`S=H3P=8qXb q4<8PS(zy}wu+&v}68 {Jū#X@ @% 5&8G guj= 0wsTJ@PP&aN}]vkpOa<@u=Kԋ ˲:6߂UCt֪P֫B>,Up@ !|uH޵ϬZ "pZ¥6c&Pn5(tFwU!͊$O`e̷p_`2? Pn5(oޔu8WR?Ĉ)ύ"MM+-=+Q)б'H6PDHлDAVԷOK;B64(s@B@o  #s@yEz VS@GpN0;5*xva^TG#\.I:#y]Fz?[΄B:񸷓E$ 1_7_l?Ϥގ0DH:OTÀT' _"Ǣge(l3ɡ]"m 7+dNPS?/&˶釒3%8ж[VGɟ3TK;UJkm;g~l,@D1_ гlQRT@l%Z3zN~,I35~X@we׾#>4=Sh[A» TA+ $3 #CėE!@5 hD;kEx HI $zH-@Q[92zL@^ 5B۫({&""AE@[e=,@#4+m^ qmxuU:j&e˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲeSendstream endobj 316 0 obj << /BitsPerComponent 8 /ColorSpace 249 0 R /Filter /FlateDecode /Height 298 /Subtype /Image /Width 670 /Length 6996 >> stream xr:@_tJT(xm}NeI4<mO=oh*}/?-!b+0W𾔨J/NB~ꤢ+ ޵P'S3w1 65˾(=MlD82KIa{SA<.ā{ؗQT7$!#yS2E oEkSYq?&*f[?Ƥ(4" R'TT[&n`,Nešgi:s*uJW] T獩2Mujyu *u- uұN:IH[S͖Ǒ> JwtAexH$k~aSIc P ;Hp s=㕊(G:?N"۝YKu DK=Y(nyH76wN:M!Rkb+nSx)aʳ\Kq7>9nBwf |}'Թ%ۢwf UvK)w/JG|^gB 9QW3ٞ_V(ֲg~~ )rZ}΁=[0zǍv~ر0tlͩ:_f4~zs5OrT0ڱ:g:W1Y,l,[o9 |jqf?lr%_"4h~<#;a3L6.I .䗶7>IŚ|j!ͥ:-|2unXy=/ӓ:W\#se]Z:Q.dܿZ uf*OCSQ.ꤾ[LݰߌdKFNŝ-\r=.uɷ{R'ЎP'/R\\wf _d'6lrd`ѝ˔._5K.swfQWz ׍zJؠιyu- w[Ke]>dT*]Dהɡ;!weJtLA,ϫ_a ? v~v}wUSQr [$*Ʒ˔_756m??٤\DwḦ́\fw/_1)qur^?}_E(b_h Պz"BTew݈`idK/Sd?׍V/m蹋O˴O"|KBE="/ww2o\w>ŵ!u]ݟ,b:|"#p8-#Rĝ`t|\ xv޲_!G".^||iW߹[ }_nIw_-Ssn>;^vi)o(NyxiWC_F)6*~U'Aveĝ\ FZqrcS#Jͨ?g]ffI\xЋ?t9iOe5K mwvޛ(T{{JИ:7ٰp{>_ 3@/Re.hwV-w.NYWYSxty=uf:̪9@ 3ٲϭxhi,p xu68#|5q 1Z`- ШLig[ O>@6;Pg;ꜵl.aYМ7\^k2啘,i}Ŀc|'1ںCJI}4mĝ.`iQ}ޟ{ĝMStp *MbeJJu.h;M'\rIlZ&xD}{IgiwîSFYSRb_S\ ǗJUNH^;L#.xq fh'-eNm_ĥlG̐̊RbIϳeN\GJ%exu6ٙ^T%@(ujpӂԇH݂<wfb~c.zjec}SzH~<?|g %Lw ֘%IY!.~E\{nѤGTy(#siT-w¾S?3@׳/{ OL|N-"djdd|/U@|۹3xdV )Dͱ'*TRm5 ɌM Lu\h_Lƥcߓg^9]pP<a.f)=`:d#h~3|{צiV*(MzNl>)>'soL8}zjH#g42)&5'cLKϭ׆N_4~vZ&a 'WdT c8t]ehsp}dvEԅT+{Nl>tGs('<'.NFOMx:^'9n*`9ui91$將d~=9 q][+M:]cZ &ٷ;ŖͅuA9ZM:bs ,TMNʞ-^wNxuYRþSnURY9 9$9=OamVIw{w*X˰#rd׌ٖ36ϐec>C.= |&g|RRA%"7$U_%܊&NUIe􎥑PeĈ6Y`ƫNINꜚݷE;EŤ;SVu /x$oVb!3MSU;]hF@;.Jѥh`M.SavF|*s'bgh"Au]EvIsnLz(7ϐtF w:E־OѓDTA&ivv;me|9}*)7]s:4gXϪs7axB8Y's9hNPgme80U`Y#Qy kg._ss:p¾3^*7ƚdRe XvǤC,bV$56܌Df&}HBݢH*fIZMNѢ%ne9b*٧̣CJѓڳulnw,ꎝΔcMVy;j۶ ,fB,',XRV:Pڡ178%jQOmy@Lњ-RɚE[R Ote`qpn.@twVXb|Y7ѥ!u2ڙ ;ɾ1=uF م|zR *jN0WwXuר8'7kB dhK J*]T:i.]ӞP3اa8OWP$I8 Z$d$k!.P!hL^yƮ8,ٻZ}-Զ5Ŷ3rMfgk9tqpXt9+źiȮRI8r !֏Z _3uUnJ8`n&v6" G(fE+hֵ[[n.IortSؤCܨ8bhf1De{ `iYdQKzp4Vl-T`JM3u. v'gk炿2^NzǡkE%8 Cr3i,p1RJ(NSv'3ZG,̵0so?coکir9\;Yoȹû`7Ӣ' {9䕗~-x&NcY4,SkLKFo}u ʦ r hK3Ӯ Vpg\5Q4viYsa(`rЄKݳ5{R=uȨ#7]̚?:~>VvR9Bidn?aZ!W^C\wPب5V/-˩CiiN0{o>W2“FrZ̴B:u+ sEAUYK^.V ;>N9 :| S25ݢHT!6r龉^JX7? wKQ*/? oS2׳M{xǤS^v(:B2Io5눭f;x8ހRyq.woyd7$;/F YNO2;^n_DH3}v]($,Z+: k.&PUrgzvRb !PR`5%Zh]$Jz@<` -z8]p\t)1i=i zɇt8v}P ->֑E!@u5ƞߵVg2?tzte3{ ^t/d:ČX=hTMEl n񠁘 D =8h` EZByJ99V~WׁdW+Yi:IPcD~ S\]۲dRzx wIއ|i]rlR;7sȖ1o3To&ی%5!J߇-4t6 K^WҞ땝J1^9RJ&Ot&3HTcҳ&L*G^]:R<Icg TlWu 3Ay^OfV8_.Ʌ~l#s~2:NC&:!^pOz-9EwZflkO(ekB.K_wT5h[*R?Et?O322ٲ4e112?ǪmMZ<?-yٌ7-325{1k#se|eM,\NN!j^_u|QyT٫?MF{E<5 4E0o}!-4Hw[x)9_-t,QY˨SMI@:h\,Y_}ec,[uΰl I@@O,|PgP瓀: :Y%+F>w_ph/%dr/~vK{b^;R]biR֥yOxӳ9_ ٬>BV癩~pYa5:/ER~Ǫb|+^΁g/ԙ-N)K=~ԥy` [OMsF6\٬?BBygO&nβ.;sv5ḣ^8CZՎ)mTQt'_(%_.Tb/㤙&/5=FymF% oc>ff3l ӥ29-ʅtL[珁XGnGOxj'%d3p Yvvz'^s1?4ybcy>;MZj4ױo$:;/4f&J KyqhТ] 7Y|3!jRXv17 ^Je}cn<QڽLj|A%F̀c~7z}֥9V& US^5SJsj6a4/>-}u& T[vtSƥG"sB r(h1}coN?%wڽD9ّ\S@iR'cqW>hAɝDɺ7R驳4ɥ ;uލ3dώ ?) {; T'TG,/u?TO~](M^j9*2QMSOsz6(1u'G;|Rcq=b" 5>Μ3UH[So(.ױ/z#Bsŝ4iD@yOf4-x0dSgy{[BO@~aV>hGزٲhb@(cxOSfҔ얧IDW|lFӜ́vQ:+ Ҭ ?mNendstream endobj 317 0 obj << /Type /XRef /Length 242 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 318 /ID [] >> stream xcb&F~0 $8Jh?* m(U<M$(Uh끣aP)!Jr+@)pDj(Hnɖ Oy "yfIFD|`4A lf ,^ "@&{H<E f `iV#",~ 4`@.1Y"e2i#.n endstream endobj startxref 284565 %%EOF gstat/inst/doc/prs.pdf0000644000176200001440000020207614750415427014435 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 4277 /Filter /FlateDecode /N 79 /First 650 >> stream x[[s8~_ܚJ۲3G'[yP$,yD*$E$n(K7A3DQDؘh%hܵ 1PUa(#L*K4a0SCmk…LCl1Jw UP(؈$RF`*ȇ ! 7D޷0Dl&m)4Έй8+#(t.QЉPbַJ 1Z)S^TDr GAD @ *`RCBjF$ .:0%C$PRYJ㼐4\A hm,@B,vвZDSLA4BbN , !FZaZв1`Fg5I&$5f]1Cm30 p@""вf94gh_%YOf|\H!YLt l4'hEX]69[]eɦegnWA-yuz+PJ&p'8r*_(';'5w^(#ueMӾ.Vz@{.^Ww,Ϧ! (03^O2]i>O0Uh^@:e? o 4E槊"*z,5c\-eGE,fp *c*V"O W%rBO8G~ .qdj9'9] O`7d˗1Ub k~a5?|KQx<adq28X $77:'-!OcF"_e~2f!ŏ xqKy4V-U$tJT4BBҬM0 B)\-uAikdV/kTTEet*rYf@Vdl_<io7;dt4 Xt.gD"K 'Gw 4(U&juu rG4$(Xt>wNvLxIT)fg8IZU I&zlߒxE8pOe46hG!ZEYG_?;ƻV^u '-nj ]TD[YE9'8sN N hqܿCIGrjܚro.>{v:2<=qz"G$: .vIRliUNKFzJItR9}6oϪGC#z0zF$o s\.|t9xfieT\ln4.:߹B(*nBԍ.x:%9pmpt_i&8֩3ԍ:;JO oc@(ac& F EAKH>$WAV1Y b-"Ĝ@F,Aa8SRmuĥmaV)B)qS(CR4΢h Z*zb2*,Mr\$9I <du?Y>3Pi}'_U KGh&""H"XYhڒ%mƆLJg? ű^(8k,SO7BwCp[~!5)VI ~^C5{ <M{ZVHa1*n Ecah Xӱ@VH Bxqo(УG[{ۊ u`yy 4t};#y :``3Iل)0"AZU_~FjgJK/Sk_MVtUZ kJ]+Wl%T tXl6&e=C{XX4Ӎ-ZFH*wEVe˘ad',u8K|=yW9ÕŁP}N>Ǐ'3ӯ}Kbh}n_WB)fS[5:Y𕵳8MD6Zޅ'ՈeĶO~Xo͊vpʰBuY#C5 ߒ֓y1uE"& ?&YZY*,)ޗt[Q`|@n&,;]\8L,7O)d[о$BDhSqHЀ%ObDK82o4QfOϾ Ÿn_:\냏uLɽ`+֘w AÀOt>:=ts|S!Vq΢WfW?1JOJOn4]c{fi0|P[1Z2a ##Xoq'4>[Cux_ *=Ij4.aS0 ' ~xiגϋ`M#U_!彅WWKh~7k*^-о"AcѠq}Xg]m㼰8O`5~6Pcf./[#Cx |)W^{zEF>Þ}Wh'\<~`o:$^AT dg;_L򶠿 I w,Ye*Ү} /TQpe[,S _}Xp۫bd`9m?hcEF=3Jۄ(sք+dct i|h.TsS5~wn+Jٌ_x4mDMc/ܵH 3: |$Pb%|7 A=;)z?ADߨYlsV^[g^q6TV 1@rqZjT#L…r{6uP 'n#/4F V}Xn -K,vcY[pQpʙP0 vɳv^om"8ofFtQ[4;\`Y8N+"X)kN GIt5:^+v'<_+ Iv?"}qN frQkݲϑ{`}o &2x+= O z`!NP t-m0:]وCgz8C$J<,N p8y_r -7s|E#1?7ÞW.>vn'lY) qI/k3[|jQx"m N}Ԝ@]mۀ?rzCM3ũ˽ICʛzOi >)=Ss|ܸ;잩}\8qu "yL>[0y},@u35$Vk:i}Nw ڟԻ;wzфendstream endobj 81 0 obj << /Subtype /XML /Type /Metadata /Length 1388 >> stream GPL Ghostscript 10.02.1 2025-02-04T14:50:15+01:00 2025-02-04T14:50:15+01:00 LaTeX with hyperref endstream endobj 82 0 obj << /Filter /FlateDecode /Length 3194 >> stream xZێ<&~ dE2ְ+F3]sYs8Z9?_ͩ&VcvUcKQp3^\~Z_ms J)..fi(3V2r;]Tܲ|Kڲzg%p5w÷C?F zF sic%-lIB{)dci# Xc3{Gbi {s'G>RP}MVsYlfʒQf3}SfR)zK]މh=8ClÓ|~lwO]jފ[R) ZxaX}u]/1~45_.{:we2xO&vqXKm (rnmmabg2whx绚KWri`е5grdg}[o 5[&:9۾m?S?+u..B餧] կb VjZ`!( 'XlwVR^2 Q)_l,alTHE~dxC(4bd9HSRJvg ^S]*mBX@R/X`Ows +'Xĵ*M}ʴi8|Y~SNg\ Yi)J2kR1 @ ծjjd 8ʲEE" ]|&z%%z,Vs8vb:MJdUlL^λp[W`KՕC0X  =!8*c*:UH3\x1\}ֆr NzXm$D <.2FÖ|q@|e ,U&D#nf/ }=2)3H.hP ֠ASEx$^TW%S 2$¦=p|1(ڡFI>Lwqȯ,M`WKs`tLA>GKd Hijk>$\p6O؅=b l>\)(N^EĸCÈ@6# B?ܾVPa3wjdE( m4I*sF O'wzFI įQ0石w&.&ݩl_a%X|SNFI9d42OF,ُѯ_>?f!1+AwIfD~GPz;^{RSV(0Kߥ?gQT">/~ 1Yq'}<H=)-``7x7tB3DOқ %]C<+>+v<O~8jn#')v}h'Au.c3tC6-Hxb{{lm^cƌQYvnlY7w! y&3_6IHxa[ t,pj'rXpH|UӍwh) E]7}'wԥYsAXCCrw$9So7QS>kJ5ml~Ztn i5|v'eھu!nUa?:_r'H>Mgn *urz N˶4Ra&]X2bOs<3/.AަBw!;7szgLʺF9&"XwrFԛ6ؼ~aA Zc $EN[{gaj(P̊\Gnɫv>tMԻ*Or{S-Vt?2]ֻ)Ҁevwz-Ձe΍8Y.׋?^>ϏB|Ă|{ iC$~ʙq't0nb)IkΌ+}wcfj*-c(CWZ籆Jz#poWͲerXmOlɇvWlWsřGoA TƳ/E355Mq2E쬩)DQQygKgw Ɵ[{I2iE'm-rrsM[c{,tF.y(ކf%$OϪuMո[c^7PzI$=$-çv̳JBIAI7a$ hyp5/ʚ샫ʌbz>ȸt'=(i{|}@| {JrN&yxǃwKYjm`W9R뛪i^'+x9{80AJ~. !AKt @? }r@&KLM$];fA^ᙋt" 3x!\Nn:DNE F?6+&&U .+fO|d,}7\t*}7睞f<Γ/\ykEWnȳrIT:m;zyӶ=+(u%x F'+Wendstream endobj 83 0 obj << /Filter /FlateDecode /Length 1746 >> stream xXK7 7[5Z!@ZHd-=ڳ)،䷗48h+Iv*8L&o'Nf|>yz4`o'iLA .Ld77jYbfBXv \,8h7̿&I ,PZ(M"YI^9i=UXLr!U~ze`3å3)@hي뛦l>\u+4*.vfYoCfuA{NP5ų~߾=[&hb!Hv[wt;z9tN@6r ]̤GϪE}! l!Qz[0XmU)6Áfr@v$]M]qpW ˚ n<ÎDd\s]K'bؿY= ۂv(c iyְ*}mvAnP:acC'XJ`M:& ^#<˂bݪ)7(@$sh,hYC4f*xY|8Ws/?w7鈹k&.$7 FFFF9  ji_s]k7]}/\dCADÃU 0&i{dБbf)ОcIX`2O%S˺w(}xW5|hVuBI ?Xen> fseuM&Pq'+xRk'-)'U0 akcUУ&drj">c$ RRe38 JVzу(@sGTNPqA{0Z?n5jD%$p=')##!?*duy)-Y//}oW9XaCNg: V hfjEvثb'GgaL,Ih?P.Z$&RfY Bʶ 9"vdfMZg%"\wթŕ~jՔRl[UR:v%)!HvP,l'|`#W8,L\&-+X ̟?ChISP ԆIo cIY`^qp>+cP - X=N,s65\bF۝&$5j^"iTDt ΣF\C(͈nVb g2-;cBƵcc-u:y9ƾWǦ;؋u~h>*WcJL[B|=b#i8Qn;@[2r#_!vOf#vԙ es3`N?'vC}?_y: qx7y$ݑbw 6H> stream xVmo6ߐB1Tf|Hˆ͂)9B-RJH:VVus/gi"fn&fsU>5M(w%K̺E?;Sz. Y\vQ-H-B\qaWVpzmRV ؅c k)Ԓy&Bҗ TH=I57]Eeી:xs}a~q vaz{aC.z&pi:/]7jMB?5LAMEg_Ct}>7R?\;rYVᬙs.]^G}rHS7[ U[ -^B_}枖[6[w#C(skp"Ja]gzEv>IMazoCALB8JJJ,ʣtZwx*߅E$_Am V0%7Ӂ)|4\x5]w )\/#t~}Qi\t A`Ѓ>)А H%(!w`t7"#EI''QD&fwls(ǭ/ IvCepWBlOzٗl0Ϻ<&+!Sr&/wx endstream endobj 85 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1875 >> stream x{PSo -4+νvq;UvwDZE`0!! yMĄ@xGD|.v}[ݝvqV;댽tۿzΝ犨9H$~{ƛ+jg6%CRZ⅋WkAyEeUu:xgP, lNK6M-M-.~]P"D2Ԣq1d[5:zVz>qvǽ qᓎӁӶf/i2@e$ ~(xGlCgYwyx]>/םW1p3z?urp_D:Qc3kK*L6݈Y)RiT/v"gp snي0{8et uN{S])qMȪhԷonws %cPu&UXtcܫVucAFcJ O-uZfhFQ^LWLo)M{"5FR/: ɋ K}EO<5 L1ZH{uC j5o<q$19 W0P0E"HS^ ZGE Ίd #SʲZvmOP8Am@m&%<%)":󘠱?37L'H$N_uC@ L•Ӝs7]z[Br@%>U0yO itzPCʎ'RՋB{{ȞO[,%OHE5f9/j1vra7^Aw="=¾cYtF(Sr`4mt2Qu0 Ӌwb^Cp4Ah6Z| ~s>%aeZ.TvfF k=jw7))2G5elz#|KBzuc]V [q -0 `z:N MQ߾y6 =,PUC3ѼeuI5~L3 ,!hJ!of:^t|trlmp)ᇿUW3D!S U_GwVIu,y1BY/ge"S>];> stream x-{PTuw/rF.VYCE)i. !;,\a#c8 S j&`ҙ|p.pn3s(03b? ]uNe *y>ꇳ/mɉʏ.MpS)+(7 YK֑$YIB*Mbj5Qu #0*E/;]˶?ٻ> vA${{:,iG!wd:gE.w׶wGi'HmEUJONŢJ{ѥ{斄-,a:Eex<Չ@ɾ\slOE)㡲k-u惩rEȢ 9 jij/ w>rQ |]umWڤEv->$d(v}kf/=6,Bw"a!ysPJc<εrYhi ]jM ۡM5V ܎wpXkrȯm+?\k0R=8|<ԋE2ШZ}Y q_:-;z[NɜCP5Vw,SF{b,DC'io.o); yq\Q)9}q|*W0ug[ ړU{ttŋǧE5 w #ah qR#>F&]ϜѾ;ysή8\{Q 5(ԔƚNF+۹d/{PL")Ds/dkrmbr~+t7L(-K[+4җTmLm&w<$AN` a^CsgwV>KƿR`. H> stream xViPTWM﵀2y=SݒrbpQD(Ђ+*H$1b3$T4QPш5Ls;ېTff~̼zUos=wwΑ K $HlI߰IZc H噷O ][nݶln;W&%o_;sOdTOLƵ~qO^Tx{Eh*FӐZF@(QZeh A "wy V-@^H@J[$APh&y DXtN2O*)1YLcAVKeeeRPUpm.T()WZE"nL1cYj=zuuuFS.WIT0r4 {ԥqRMaWbz/Ε*DyR a ۼQL  `zd!Oژ<-۷/PJTd LI?.g;*y{CMGmbkkXnE{x͖E^GNG!!v`}Ja3 p A sslwP/=rKMR -a?;Rs?zҹA. &~Dꄐwwә{y}5HH JqӖмmYYL}PGV]S7V_>KUVVx[QaZr`ޘ{*EZXÁ=xC墴 y_Pc֞FIH5|_NwN)ϥ-2v|77vȗ "^t"FԮ;=+cPP,Ne$ a$ΞmV+\=J''֟A:iwLjP5R6֙ZEd3?|-|M-pw"šLyxUr& 0!H"OnT|6:' $d1\+u֤&ͫ˻|SXⰺ8UͶ3I=Qqfyryr^*x_%10ڶW o\3KNAB`0AkA-sZ3j)J>N?m#d KhU*vg[>}Ip1X6mu@"s1%t3`:LLЎuuIJ]$I✊Tn~ QZVp⨧izilqѩayj8VW`Q; "WD/D?  R ܺ.%I z t <jdPOeAf^r@?ra/d0xw?c/kqrHszj2Yga"GO}UIIqb81\eķ'pn)=y#_g$S@Ciac\t'0dUӿnN Avtܭ0>uq ~&, Y@<J! :S:d6 d /C`d1Ļ`<֧VT6V7.9S8th* jH.Kvފ1M\.=P05g7Ky3%m޴-Xɵ꼪z,o;6'/F@w-X+(`-#),~Me,> tV3rTC9^U[j?bkW!ܦR*]LD:S `%5}u[[iZ,HȬW ߘ;O(/[ȃ9$=6p4)Yu[V蘿ٌ6VllpXl3endstream endobj 88 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1348 >> stream xmLSWo)爄)]'w6M6'"Q5 "hAy-BA0-P(t(U^EN%! H6"f͜K-3˾|9yϏG<oپ݉6n=V#bbQq+xn7. |'`W𑓙Y G$;Ab ގ Zxv~;vWD+Bnpp,>/~*tn1 d|u./LøAPJSH?K h|zM[T+AEPr zMN`*8+%,RA+^W'!TGe5W)TV#Wh7aGNΨ5!c RDvb dsdfQjEOF(l=eq*S<皲ܹCZXu0v_uų')M}APa 5:dCfJK5e}͙e 6z%Jrh^apݝYe̔IWoJ`5*?A.sw*?<"m k{`-UȽMAÞItML@-)L ޳u#ni d1:ZW$2k|ekO$mNC*Ũ訬<F;]t{~Oա:hPjkW1Tqzj~rNj7msOEQ0S.mY0^3>]%|6 zGV7;]df~,0F@8\Ļg2+ ]͋p'8h>CH>Qgi{-?6&w=>W:_0(p΋h0 W %ɿՏii\P7]Y2jIGq(&<$3ŢDv!$ ? \F# endstream endobj 89 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1217 >> stream x5S{LSwmwwn7g 1 eSuSm@ľV[z hK+-` s1@Li,W3c5s翓|;'x<ެ̴]ۓ%'jΛVNBbߎ+w-.OJ ׭H^ D:C#DM̊$K QDpdw#5hEH(s8žfQL©h9J Vr:lnڄv=nS|9Niv8mYQoQFSh6ᯟ$ mtZb;DOd#qdj=@O}$HP5 `w}|.#Қ^1݋!r},=!.k%[~ej?4SQ&p^;>2B[-VN&?@ٌT@EނM%U{QHbjK;ԅlkdZ-@}Q< ݁vY0ͦ2ﱦV-aMB '1Vb&uBߠQը(3DL/L=98q嶁 O-MT%'˃7 ltvd䏞ܼȮbWkmYۨBPhEA'{HEq.5֤iJaU2 !^I 61]ަiU5é11ډVrϖ9450<k;B/*ȀncTe|(0]9zVwzL&g'#!FR7htMFNULU[oQ c_Hղbi@7p_/ N6C}= ^=?aFjO`ڶsęAG#4B[b<|fPBMnA>+\}D9I$zYrEp{ 8l7"NAendstream endobj 90 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3083 >> stream xmVkXgڞEi%fhg\uJK.'z@!@9"@p)`u-jmmkpu)'\/M'~D%GmpXpnH9/wK>qIq-KOޒ-?n,!1Խ}vR>.j7JQpj/uT DS[m BD) ZNڠ*]Xu8׊w>|%?/9˺i .HX ϸt="#Qr{N?asW|fg<$;fFrR㻌~ *Zr-bC}?Yz(zVʻ2L(f%`1H6  mX,H=$3Rܴ̾ U;MCъN??k^ȶ0cK0Ȣm+f%3-¼оd$'i{RˤCk!UsIUށùHX3QvKdj%ŋ!ھrwv.L& Qo@y7I4rvDMuHf3(rϑ#I$sl=hHs f_ 3P AB;#2kb$3?½K/[:/,׆Fɓcq؝NA1(=ƀȇp"bhKQVͻ=E:8go?xbTrxg9LF~_ +*RdPG^WOkGkLHĞ`܅1.u"pڽH!vGڝ~^y_:811"3kk22c@-g'?~xN+EFHx֠Ϙ5ңHFyuAucX$KNukWԪP)b5 1B[Fg4#aHA#=Ux Kij ߑ欉&ĚtF# ^ˠm1yX]w, ܋59~T/9늪cCjCJ\aP* WB.eq`]vKڴ::$Ua^+<h{"^dK 4f~-xeI2춂Ke$htΘo"N; N Yr[>]H2:-_ NЉ؉Lo>xO&^koZ6::b0etn,+/Wmm 6:$lǢ[;mmݖFya8Pپ/j;'{\tŇ im$dVo/{BK")޼/Nv88jOKtkY 0b cJcӛz8iJz7ڥ8ma1p,fuWm4"kVUqeUV`~Į>p\>%Ѱ]ig|Q?f1|踝8}2X:>;h<φCBJ-<=#⍸b,cn5\ϝ9hjujZΈJBA()m-2kkf E]Űrp1j4^Vˇe`̏yn}fkt5Uը5K EHK֨|@;X3֏ZϴX{OWlk{:8p$7_vsz~v ~I7I5sťE{oغ-38e6Bd ؼ̧Ht$~_ :Sٟo 'v) D Ӟۨ\AdXARt?\A1H~d$,! FNV `w*:4G: z}}Ukt+t|u5*) ׊挪DQeȲ*:_{O0=sɽa1Fdҙ+ڢI2P;뱘JFJYffakIcGe2zy`K` 1xI/S"M}d}iGgxt@t{ 7qU%E$tL1UJ3sv!U%u*C騺HĮNߍJO4ix^/I2leKЗ`q/fs=.r++U*'1rSCz|AAEufōSi܇Jxu^A|^"J+]yl B` 2t{BNؚCdśR}LjekQtpJyJE͹]VkWat,*}:G(_ؿ"8 5#i̾DePHrS2塩_fXKy3+⺲{,]=$n~{ Ouϕ_?vv4 Oɫ1PgFY*Cy7gQ ۵V$yI3 ǭQ魱ͣCzVEg%agXqcWc}\yw{a>8᷇;ΜifwpnBqE (꿝_&endstream endobj 91 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7236 >> stream xytSGu/XZ`r/!!L `ޛm$KrfՑU]$Wɒ\`z BBFoMxlC>>$ݙ G0sUKEFF;;աO>x+a տ}5'ynʼit"bΌ]K2cb^g k %MLG36r 1XNA $VÈUjmb 1XK#!# \b#1Ml"D$E# bb"ML"K2G'@bA &('ыH"""f3$Q48Vpt={{< rq&'OR}l~^Gn3ϩWT16uޫ_y/'w|4pA~O|5żvH1Ù+CZ:'7nJx(`WZ Es(v J9Kiq@BH(֘ (9@//V4% upD)љvScRhьh*4]d䤋j[awa(782o0K7 yȆ`XS>6ʮynaWJ7<7I %ǹst H'pRaɸM|^#bw;䟀C~@72$S7 jH"=$3"^G`9mL$V=`> ]VO>I {؞iH'X.PI~B 2JjܣPXCaS_P# >_ 4F-tPgH}|a_Bo~&!J#FQ'۔12)T G!蕄$U2j'=귛$(0j0}s\Xvzqd?yF5{mkTa͐@ <Z[hXGwLIp |DJ h@6o'5k2+"u?|]/0•HK*zQߔ]ԗZAOvFϑPVJ{b162:($JGUyXn1Toc 8\ iROrO,c6&Y1pl .)QJ,zWn[4dL@-|7 {rN}b,)'N 'Pꖆ5~3¹| ݺؼdHGޡIY3k9X i44iz甂b3e8@НW)7ώ|{eEeҲaܢG?ZrkT&uQQh5bҿauRmASneJ֨:r(b($%Sls0p& lF;SGh?ja \j*6&rTrNAA6fPE<ۙ[Ze=GiGK;=mʻ"#åҰ`7)x[^FIgQ$'&{bڲo/2BL2MmW\Ju( p(mp)6 o ņ5"[:Eւ:- W L's1|r7Ѷ 4M&i?MEPE7W=_W9 @'%a wpP~4I@z|Y\M6I~zVePRFN^JU5n:pPZ7Uﱫ%$1\CVfתeGKs}gU6nF}zu@(pNEcl"ʬukRʻT/.̷(9.=l,ohll. #ɜc˱M嗯Pޢ]nU]5" 9J!/D)֊qz/ޮQO#` @ϳڨ*Uh_˖W5هe3O 6 V]Zw /{^G\ݸp>"ь=(Q?Jρr$>mGn܍z%@jw kh8F'cd{K #2.,h-,ؼfql=XI/0`f9w5 )co߄KRϷjV/jnoJdUY*.aKK%‚[/՝I-Z{ȣŪ;d0 yI‘G|86l{JJClJCU#91-+=O%`9U"qPJ<a11i@,R6kg'қ, x7Z=Hސѫ c2OY3i01NvP]:v(lzX~"'f"PN¢P!G=5Q's8|PkcQu~ 7b⎡#( vPyT%nJZ d@jW+@-%nleLO۾ jrr&9*mARTĭ]\agcԁZ3/Dp^A RԊRO-m#Ro4~8wrˍ&f-ky2U\n-%f~~Fܣ RN+دRk|'WJ&8=ކ6|!Ѩ8X_`pSJrr|-yQ)#1HDέo|'O㠌*P6geB9KJƈvro^Q!_^wYLXQHA ts >~^n,Œˠ$ժi;`wJ .ep'Af2<)ڋ-@' {)_0UPfNtdLunߜԚcCu y2QҳTwW ; ;N^cX ͆ na\hX'Z6?+#$0W(nGI!di5k JPl 9  mT-n6O CE98Y&RO4ɋ ))QONwtˠqZE&Ƞ*}"֡#x? C %vC|Zl荷 )=,$ؕ4ǢxO2sE>),lؿśl{}8)~JՆ?$YW "(w;' ػg$o[Ď֣=EMq$ &8.E\S4H0&o64eSΝ_^ >j6uպ 'fj&dzA>QmM_'zQ} gdmЙKH}Iޟ[:52| b|8CS]=y.2}*EE&v]-Si f>r-u 5bXq'ꉄqk+5nܳ9yV9ȨM~vHJi#NjjAGT2/?QRTtж{w_/g]M z\$4eLjfl,\$nĥ"ZIV_u\ e^*M3SyHur||| PZS ٰٓkJ:AY9̺qsx| e3K{ˤ]ٽ5[@9IB>1 jYNYQ7I8fJu2َtg7-l59*R,~*:vKX, K-Ib&)-9-IHDdt7LxwwfOyL"1zN};A%?U) gзkpU)h5(އ;͖uQݽ9R%!DEL'b@._췪*5r [y)4 Ϸʭwf-vx7pu]z]{d=4ujC^n<_+ܽ=96 0|,F+RfZVȜi`EO{0ޭpɾh+T$C-gFK8IfJHjh55(ԕ7h,F5eE䇃1̶> R `E$g@MNgo~!d=:Y `[ 'g973͆h>i,Z 9d@'@L<^J81^Br~A&4pI.Ԡވg:"cI1|9b0Q9U^LK8歞s1{Q(xJjSQF+O Www٭PRP^V/wX|32\ȹig) ے\:9\gNx1K>^@xG28qL%j֧OMqڼǾR` W;Z\8nV1 t&=Ё۶Ht:-[iuy6 ;([5c 8`qSӷxHj|z_VUJ$[gT䬛kp]F~p7Z0a4*M:wp4Kh#o^ܻ)qY ]B= s\Vt ZVKkiu/`ov>͒tw?R ^E$J\})Ucu8iAgh_WI'WgԔZ?PIx / WJ (˅kv ғZ\RZ_vr/lm N,MxrUtQeG<*^6S*F4-:·Q/ަu S-EnyO8)pllڴ >`4FZ2 !::A+*4+hRF}P\%#UkMJwq1 a'L,Y[p&`+/hWCc"f>DzkF%P2HR2XLZZIP&Os|Yʪt*M*Hry}qsJG.et__OesQ|P4Ve0n*wwSTlCѤeEs9h=zY(1lSh_3[p-"7,]džatNg_B}v CktHF1tqNC \9塀nn:=?~wCCcsQ<Ԁ8{zܼrilڏy5BTS2HЫYFhy%S}܇|uz^AibLem^1P1{٩-@oWdeAY!SG?{'ФcZYpYE*NS-NZ7pbAΥׯkkjj|| !  9zaa*w}Z~)BLN{< G0(kj;]rPko\"PʤkVqד<b6qo>3 :$x-jk3R," C7|gAK[>렯"O9|DoFMMUe_\)`Q/DH=a] ϰ܍7 ҏz}O ο~Rb',uHJ+ϨwyNF8vSD6RpF>6U@OIoW[VhI^r ՏR4OOo)jendstream endobj 92 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 927 >> stream x]lSuY슘4iќ^@Fqɐ 32):IV:6(9;=mO?\Y(lP%qFwaⅉnr*M'<>$l"Hl>qCQГڻ͠VZr]v=X !c[pGA&+DF$qJ@SHkj0/>->- sC|TCewtbHZ+!@]U_$zOf)mUX6[ul4(1 >R' K.a1~i@b}*Vy1 hw B緺$#:~jŽ#%d'ک@\Es_Ǭc}P5mq[xa*M]: S*_\럦4T#64[ڌ .fYH~mY0G,pW $$ U&5@ -)'uUzgziuaxo" 3@9?zh—+y^0,W3#z`}>4t2>MAXËrr:T$̲, e&0o\.+{qɭm6jȈ62|҈/$~ZPq"n$y %u9 dž%V|LBXHQs&R8D3/OI7h?hꣃ}Lym[ruws4hVe{N /endstream endobj 93 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 790 >> stream xMR[HagםkPF>QYiQt+-Jf erslǴjg+%XŬdeyyȨ-H*Rƙ:98>h0첔 . ҁA * chgp[(.6!|(K4!<H D $D$l'BG3SyA^Uv h X}ӑ$b[pK#h IΚoV 'NPP$О,={y*(* % ay _Yy|:2B7񮿛|g6eRS+Mfviq A4V\|1CB9H\UTRhYIMTS@ 5tcWWWY!UG'T[(ځSQ z +)++3 1@3&i5,'\IEYeh0ĩzɌiKo R!HX K+,Ci|q5h&QG|nx vqsika)tɟ!{;prx:د? G51`.K56puL"Xfi|*OXzXb^cS?ͤiPoaZi%͏NkbsmkC^þ"'+-]}(~%)fN8Lcɺ4xGa~q*8/L z0iendstream endobj 94 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 850 >> stream xRkhSg>I(*FAFAa1 :unVҤmr&'iN.M&)^Z[+:/܆26_; v~^x<𒄲 I@mu#PJexuƇU7߾>M_\h%bq8BT %1J!/P򩤿yΓ_(}FudkI,oxt孥9:}# ";Bq+,,l=_6p@!9*/Gel=QYPnS|P7ٕcld`Гvf}Jb NwA.3[G.'b-,t!KbKv#el~k+WagumTTwo:2tiqf~A,j2v6+@j(H@I+ja&9<@;/B 82r{>0Yl^dS} .d3R߭豂LFd -o-M8ϛ>i>IM(eF Lv d!!CIIhBρ+6 CHUoR3~:{NJVz ~kbf13QȯnPY'&/mXmz ftbW|.;C?>tPȌ:6~/ Ie%N~8ҀTR͛?H\?IouX.f^ۚa7.r\4-q-6՜p4dnu*- endstream endobj 95 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 260 >> stream xCMMI5uJ  hIπ$|{zzy|t~˝Njڋn`S` }h|gzWgzzxzT^RYt\%(QLjm O iendstream endobj 96 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 500 >> stream xM1LQߣ0ZL:8ȀIcbKk JSHz4mb#Kd& wFM׀0ƍ]:w'A(:ou.΢-w1#jlh0džDdp UC1EK" !k9pkX/Ve#r?c;`/i&>}*kߙ>s]1f=1LxSy;Zw<9_9Ã{7?.e5B ٬0(LЗ[3iȶM䮩M0 o;jg/nF_*X7D6z/*MZ^65B~ I%|vl?_Nb9MhI) (P n; zwNfջ#KTA$IHgf2J* n66WXEe]5Єt EJ%쒵_4/#ؐ ZFendstream endobj 97 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 339 >> stream xHCMR7,  =12F?ts~*~ssr)pt|(|trs͋oKL0bg͋§j~'eg #e'͋JiuP~>}L讧Ǻɋ !74/XWϡ=:4MFkgo0 7 Iendstream endobj 98 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 112 >> stream xcd`ab`dddw 441Żz}_2~=;@1012h9{f{?3T^%:gnU6UUv#'b>CX"Gendstream endobj 99 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7700 >> stream xzxP̸M : Dzv{kKwHB H9I )* XQιwͦ>yY{]C.,//=3tP/Yq6}uZw;z`7r/`_5n|EUs06FbGGc[Maױ!bl6``SgW簩0l:"6BNJ1 zbQ6݋`v6m#ycz7Ynntb1+ɳ=*z깵W[=Ax<ۧ}?wdbU¼M?r? EUJQϋg#yI?B;oHhZЅK>2p=B82}HT@EH\%U)2NU9]fWq?c/@7>7E *1CUjw,x~ݡg꣆X]T};᷂4t:װاW$qypm8t l7Lf^uR,#P5<.E°>6vJ0I2p8v' Y_?shVڨ>Π%CDD*$`-~]\Ja#cAiKyݕ@joci]q90d^RCټ㰗Ga=N~vL|Mkqo<]s.>;GBj3u*p> ֡"h5Zpj]++86fZ2_ڝ2@H."WOT,B WS&QfbW*< D*p=(F* Bp#'-6j먷F;N P [Og0\H}`ڏ&ڄ = IumךLLW˶I8wRIz/ mf/Q]B&2AS]NTe8>b8 !5c5PF}U|EACW M^ ne]wv-F[ȴ -8KQ; sDRcP `0뀞,шs#} YJ$r="Re8fcOgd]+?J23p$UV" TݸX olfNYRI~yRQ pqKPϧYW{]JK*N#9Sf.^z+X} G*:eKP8 o]2`),_Q\OEO?ԅh%+/fũ =jO4QP{^u 8h {'wh@^[-?Bv6b*]+>nzkIU̲f{,Ɯ%X֪`k5 GO/gD:NXjX" iI$hh2G]7d;Ng3"<94 A1l OVH|7Ω!&o5ۓ]B1@bQ>N$aaF%҄_`Cx{M-*?}Dy. byCJ, #6 GV||&]"Pji=d`\=4TD4ik>N%:V0)<, ::iD@:(X!6SO6%d E<q@WEw4v.([QŽ-4 %BZp$=ݿ]342C-plٵLDȓLJ9"HQ|!{acy`[RP,_~_z@&[mu~|PBl/^"{vfK*ػ|t= jҊ;@P0nԴf@6zCQF#  ]'Yc8OI_nR6bF6Ng@PW-Z1-v7.zͶ ܩ zk|'OOwY. z><ǚDv1'7 W:#L &aZЄT>Bǿqsǧq@zp'bz7 {|.C"`=tC8R搃h$t5r:iDss>!:ά30l<ߕ!Rh9ј2 @Ғu }%*r em 87xQT){,joO*N@&hTef@^/[&[$\[",1iLMiF]J~@|@z@rHKn,l_t,y[ }32\BuGvݪJPE ݊4Vb^j1_h8)IY@ uHS~_%8Aam DtXY,:> b{ygwih[rT x,N&^( v \"E ƯL0pA~zyډ7u,uA.$ڢ*r)^v68L^xp?:Zޑ)ά}{~|> gbFK8^< {ҋؼ#UI&$.IY,²Պ5`$~Hx>98vζO&oJ`ʫQU,KɉeYutG8hܶc[) ϼ_ס;(KA k=y8"n۱dM64mn\M5i`6"L"`bjǹV%}uk];y<*U$&^o#("ATe~c3/QCB*( ܋}H\#0X M"{߷3#ת[!ו'RK/?@ATbqHL)x?|.=dM am5 &5~ -["RWʛ:84qB75}gk+9iOUC5aI3 @O&իD /ENtlC x/[D:BjH'VˤiMs=|֧T LՄ 6𴻢68 OlIAl[] HDkF:ڼY+54`튚rurm:q UL$^s= m;Lov.$uĂ_Mbۛ o&L.q~;vws7>#}CևVZ ƙH+kMebz^,,mn[ G)0h)횝 1>&FY\>O(Fi1Q1ָBfj k||/odMܸlЇkYBdLal6D;J[VVLjm8C1N0B!|snIp d\ w_ʉ@;12i4]Be )f, 4kVV g1RU^a. 62Yğ+47p7@l1>HƓ-mQ#aH= | J|ƞA-5 T3 +4_ui"e1R?5/x A+smeS7]WP}3ZϠ8_,jenfm1ق7LRδ3 ޷Z qFM{12NC1B4 5=(\d37džKNDK}OHb sdpn°&ShugW!>IJyEVNpD_+r:fnP$ZAΰ'NJ<"}Ngp}3:-@ns70HN9W7 9;tX᫖%4$'WRYUCݗB^T""ppzG}R `gs(2Yo4!I33B3<ڝ`477;/y.'z\|I/ex^z~*Z`*5-jy+dJp=J'j#pL& ٩#nx;I8%ndTƛR ! Ď#t{"'OkRRH#he1Sn`5;3q뼩5eg97gl1&Rd7U*]æC m)}iի|sBdJn_oÿcX} Gt89l[O`o u ^LU,5:}a;mf)%$#KY"^bl7K!ɩmi?ޥ fĻj:Bg60{4F%9 ,fWv&"a-H'0aMZlv$|1\L@ .UhkK;輵ik.[!+|~AL7'Z?wNI1}3Pʑ)8ى'Q-`g:=@-u ~k4v"=6!4.(ݿfX V0ިNR ʃK`|FnL'Rrmj' tFnnZNG?]|뾧?] g{E %6")ڊ#5 :2jFv/lICbYݯ#A~>k؆HyLH)I갞i7*eiMzZS#QVɋdzHjxuXk%f9ƥYUBTRD`k};"nz&x  bt1U@MJ@S( +c"JW r1jE!C|B)5Er  @"7s3w yWt)SJS͹D$__֥S\ċqgcJ\!͇[ʃ-I~q.͌PPq޿BRPIc[W`Q[+suaJcGTK> QWpFP 󠙧0"*I-xu!a#85.w(l0b x-ׯܕwϓ42ڈ:Esx:G1ZJzp3W#f' `KLz^$;9vE\QnPҀ"B[řD|]t߇wT"ʐī7'Dy{[ylWy#l `}3Sp,3 Т1]Ȟ pwzבFd~#`4zlCJ3Ya!q\~5ՈYڈ_?op9WXLad6(1JxmEJMTENe HZn-ن#?c5{?{G}"a_gؼl^eTO4TA!5FҮ&@|GylzCUYErH jd}쐄i#hXjYܙ]+./&؜jw ȿT3k% uZc ME&N8}i,5ft_㗪5R)kNJk ؓ{>]ߛŽm[cC'` XݒG<&ECIsendstream endobj 100 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 176 >> stream xcd`ab`dd v 5070q$eaaX~= h Ȟ2&K??O[t;'g*{wzAgIg^gnw^7G@E}vg.HHAi魓kr9丘p208endstream endobj 101 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2273 >> stream xEV{pKtGR Vc Ũ h@ &$!OH.~{H%J4#P:>j}33SgC#ݫ83}?vC&\šիWW>~|OnW;o-XV(՚ށaV{k¶a۱fl=V=m6c X v{LE*J_p c7 K~ٚkb҃9Wu^ i\ů=y7&"8wG;^$ϭnkf]fͩyYD=Nύ''lCv[8Um mǸoH}x1,c!̫DAsG҅d'J#~cuapuԡta< ¹\8WQ<'0Z{nfTsYTK.HxMQp8IǿL Q^W*T }W샤\T? kĈ=yn4aH$Fv6 unAWˉ^^*^@Ȱ EO+Z~HuV,tYD!b XYu>jsЀ֞lpPJ?eS^a竹oߕ$F侈{_EA4RVEX^?&d!1w9 &≠%lPu7*'n/7ڌͰ6n ttKIhwJf!&ÈhC!@]2Lh&4x'yvx*LށsQmJU z̯$MJ@*@(2X(cAZ= rvt€b{$Tf IA_Btr5Fnzf(@fzK5O$Pf׈I;佻V]wˑ,NܱD.ŏPMP$TŐD0$WQ}g\ ͔rT2 JLCV:hSt;u-#}>A?8iBГd_ %dRLe(Z (.ňƉ SBK~F 8W\îM#j|uѱ!d9D Lzuة=iޮj:ODi@,~?F2@ "'YG`ev^d珦^ʸހ:PB!,U ]$ƩӯrMq@PiS˜RU,4.7qB?%s/ EJ(E qkb?>?P7j7wZwZW~XW1l @ ~dǎqR֗ fgN}t j: [ԛL{aLgqo|1DAϮ(uBuZ*1{:*dd@:{*8͎GmlWTEp[Oɹ$6SAqD f2*Lz\F5Ϫ#k/ð&endstream endobj 102 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7026 >> stream xyytTUWEDʂ D@EvkUju^^M@dUPiv[gێc-3s_>3s_$wYnqXp'f̘rƲ0>[wa~ݸiSBQX]CSkw媪Wk֭o^|G>'Rs8+988qVsLll̙),,yg i23>gsײ c~e\9Woݽw>^;aÄKxDuʲ=wu'MA"ϾF3ӑAep;mK20\Ե Ӗ8yK`RF& k$%DL嘫D>{k=)u"HI1SfD6QLR!M 21& -3N)pwz@+]6d;[!);xip^EbcjCbLrmFbb0MΤR*a#xnS$/2€ڋ&Qjd$BQ ^uxBdRl%EgE/ꐀz]yXwr^2=ӹVZE>&T&Sh%h{iL c prI˄CINhbh7MÄJ`yI+pbqad^|ip ? /Oq֪/ߓ=u`e>uh2>? X#⇒((,Ik(>vdJ,KȘ{TpSIKG(L&QL!62dKnm/:֡EZƦ2c6P$nELmKX< [C0hx\VN"JR?vܵWq‰ $le\hh/Iά'Kg0CS^z6-BJsAUa1LԉQPIna5|z%,eFIF5WiBCn_T%(`x)~vYNW~QLx0ʡa2ZN!uhXt 8ʤѬ5VYlL8:[x#Їΐ+ B/-@Yjm !3%p[ `VQ ˺tE8tJ_Bܜ)m: Pxk”$~ѐX~!; x{ )t<>=T Q=w'":Ӟ2$F=h4ٚ{<{{]=>ޘҹT:G-KԽqkVp|dE~'&pjG)OidձZʳzw`wSmX>Kҙ܄s0 )MP.ʁbJZW ¡޺yGꄆշ隲:`[evEt"f}D+n4Ͱ/ki^ir_:[yO~B&n%bB QT5c3J>|/b#JH9̝Goy-JhY v>QyM6<Y[]dA >*uxo$Ǵ j`8"5"C ':b I qLڰZڴRR pE9NW{ij}5 K #Ny0yh "DKB_hpZ) Bӭ)SHaQ`U;Oy6[w΂dߡ}u/&p{+^j,8KꐈF]j,hHaO]E,g)WR[fΦkqf ){ " =,pgbTDhS9Np%:N8,:T^Y^$iQJ bfu\EM+;޴&r/sdw6]Ύ`}] cFU*8nLpAyld Nm)ۨ>bjCC`OO6mN4(K,O,MFԭ,SW3X(M+* Ɍ"q\DS/nK-1 VEoi5U M: 9e?aɸ?(SrMƊ7 D+LYbt.$I}G0ؓ Rb2N2s$=7H+ U)˞@!B-8,,6\li\ *ҠVt74!=8< Б$]"gEuXFDYcfNI d߀ d%V*S yz00?HQBK=x5Zf8f<_{r._:G}.?£̫h얉WV_TfOff${b+ \Y33*`ש6088l9hVj۩𗗜 3H3~p}p BpZQXy˳2O ,ēڠ|; z=9$nD$3 sgAΟN~4rKij^q\ܴPZED`cb /AuaQ th,MF&$".ޅ!Q'8tMdMQR-&Ҫ҈.CgZ8g\8@^fq(<_zy[: a1kKxH @.qKį13;\)tdEHք)Fie4F&Lg7TWMfZnC.'w{_?$sK iq" e9[P"3YR߾JB3@eCm?k[HCoZ]z)+jz#;q]IͲ{+DFp}\lj;hQa-.g^b2w. qV*iX+:<I# kKb!r؝ѭQ[565in*ZVtbEr|dzzJ׌ GLYcV4tПٓ\sL,hd1-K~K1|vwMc:Ω:dWJ(vVKӈt3C܇IuJ Mj M,E#lD0<)Hzq Ϊ\YZb9FaZȥ;h]jfݶ_$4w7s>So):yΨ; xB^zIkU+7oL*UxK#z| n1*l%Zg"^LTcߋ("p#p ~Åej"Hi3[`4U**\G#!^_]nƓOZAbںi?7|ˌܹCCUN>LE Laʘ̪&9 )Sv܉>O{/pGD Hn5Fyc~x nvXݲF4ǐ+m0_$ T̍a fRKeye`c~*GtW&r&t6ts>$YY\L7ݫђm 6H h]^@RZ7 ɍZ>T_ jswxDA]\kJbA߂jڥ VY ,]ҋ1>?k?셻t=:.J*&8kqmamPX:JU&a?I͘+P+e>px%6xÿ>N ɂ(m~ 0~cBIJtvQe)KQ[s~5cHx<%~U\plW)2!HZ7/sOoMSUe9 G:jSe3W5.C߾7?nywG[Ӟ`Ī*H3gJzoi B'Bt oE ^moG d@5+,q5wm+>G!R؞q͒;۶u78@d8&j-;`na;!VpezH;߰Tҗj# 'ySYzq!j\EAK6O΅y0WZuWWׯUzЊ+#Tpa!gpC7ppŰ7uQ@L fy٧u^M@ pR[cژ.rF V2KM[L}q~x)`D'U^|oTe?E!oЇ3)6` rv @ v BekPa}`*`}y4iM*ƂRD?l li~Nє.٬vې%<x[Z*rvL*I[یq--&EȴJ-z2 y=/՟M[ktUުeQ+w^W{o"hW MĎ;T*ʊ )-lF`̇p=Ii4FVʫ%tOWxBPnzK~8P>trH‡E7(A# Ls$n%{1 :ܺR`'Em(g ~-g9?' \Po L&4(RѿlJ+eUu(ZD3C$0V9BHPF莜+h@C>9؀,pIMXb f4vM!qy%n'_[F2+,@WwEǶVlw}îts Mou>SJeӱ`ͫ@6~cpʭd؍Cxȉ3l:٫W(d!vV lSO B2t" %"I27רwL[c^X)H.`7X AYӢ@+t(wCt9i…mKkYu:B=\XA^W$jbI#mrny&=(mpj}jowEYub=1siAG)6!e"Ƃ7 5R{%@BDA|w“H#F1'PO?L<"y?@Sové72:;V={i2K9C^ta_3×QͿ7q3%c"~H^EK܅:!uD쇷n,"% R$ugqMX.1(=ѰmW:=.ԨºX/` ;{ <G6Mk 4ULo?Ǝ}} 2#דK,ݲd` $m?bm s.32 ,i8t^@46R 5GY4U5 NvsRɜ^/ޙ/ޟWnVFY=b ,0ޏgZ6%Un7f= 礱*mmdȭrQj]:eA{ By&PSE#b{[?Qejn -ȣ(* 7'F' endstream endobj 103 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 186 >> stream xcd`ab`dd v 5030q$caaV~= h ȞqLI7-?މ&;i?ٻK:s:s9 o=M`of⮲n g2F."ۯ%Oy=';=endstream endobj 104 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3345 >> stream xV{TSW?s*TN#sOFmiUǙ޶:hjy㣢XᝄWIk!J!2:`R;^{Z8mwvXǵ;´dd|8ļ ̏~!:A.\ γ"NZVgkVanb!#gd r^߰fC+=D"O$[D ";."!""b1F2zNCТ {swd)|jA3YҢE!p?G< ^N}(Os{yY`+4G0}6X"iJ-&*I0Id._(rԡjn܆(lVb..ž}]MIRD;ie : }Jx(B-nȓ[&w!(g::R( C#.> h7y )1l82br0Gteނ$~7g=H2B|> X d+6@v%.CϾQ8xF0 :6ڪxṁrV[zS!O8Ov z7n Å E$I]Ǖx|t2Hep=o?|TUUKm+mhi>LݓTG)@qC_4C>z>J̼`R}vʔUa% e2H%NQ_@=f"Z kz켮6h v5V]Y(_ ͆ EvwH:<`u͎zG,6\kSXrǬ)0rnf*VM"mL;ql갮F[ @]xvb4o5 $m7YQk .,)䲒jTV7Y@g0#xtfS;] -[Y){!A"].Q RHQF3Î91c/ < VIWcdd"T_c10lyD 7R'OA$܃r73;˘~79}wQ`t'PK᳇AFgP2cC s wp1`c-O_LֺLN8 ?*8lPj&^.c m5[pB9hA`+^$ftŌ~FJNan znUiQH429Sp(%/LSQ8Bxj'/ylͦx$nˠFeG r1{ ߅9櫟]&#ߕ_,aJ[5m@^\<ۄFAbx Y^g;!I ƟJ ,Ur%suyUf!FYs]sw_.X R/-[{"?⯓8V|X=m\m;?;ntI n.4aSY& H})^=:_ywHRC@m)OE1"{leG^6lj0t=&aGM;2#@JzB/S% ML 7`9[67ܭѫ'FXk-@Y] <Z5{fAgx{:B8}%{<x'F1SG虫(t"s<)nȷ)zzek5'7 r6 ڪֲIK؝}b}lv>j )'C1҇:au(vx:,:𙄓 u||2cY#l0l!\SY"̓ЦFYq"Wx ~OXFZuY,s4 }#L Ե2qUyU?'N>؏/^^.NBo@u۶D9Y\TaxU%T/PF&3u0 R/]p B> stream xT P]RziǴfhScjIBL$j#9(v_;~OS b#5EJɌd.3N| E@ ,޶k׺֭YeT߃W248}5B)kt2dGkr @v"?"%HlG B!Y2dC[pHZnZ,}(ŌTbX?$t< /'aFt^rK~rdoH/pY$S Sc[;&l˾Oo*=i$r$IK&p~c9ܒZ- 58lՇE.(FzRiF4tBzC1za_CVs 6n۽m _*~kaI3v#8Q5•#fC {Ѱ6Id0%I Au:c潝푏jH!3RT+AHPP aAG̩"g\4dkTFdB,{]ҕʈ {+WGm<C :} ,KP|6RCܘ4b lDWK)U56@+yOvx8a6/? PWL ܽ$sT I)VltTW|c E mbpb /X8 rH]ށk 2y`xgJ@ F`6܈^fkkz Ǩ@=hs(º0BGUU٨Z-͠PN 7B:܈I{m@foqؚhiajRW_r!Ya_{Fț_q`el7vX=9x_H@X ttx_2bP>h:;z['Lw\eb#c;َ')NrW7en >DDdn֩kk9(XMA>6X |_h\~-f Qn V3jBpX瓱q!9E _v/ =f$$Gޞ艸옄$-Vh!kJ@ݹXΠPwhfS}F;;C1∔=M$mkTM&Xp⩄'uJ)nFU(qO6дwhDh& `㞻oThOoWSƼ(ǒڏrK%StU7AAN͑.Y)Yc0 <^ut$NU9긑巀\ /爱T!c6Ҭz%9rvrE\QQ5C\QWW(ND޺?I :p"ҥYkX-ci-3_1:endstream endobj 106 0 obj << /Filter /FlateDecode /Length 2634 >> stream xYMo]ݿ_qO\~]hE,+*FVsWv&( [gpyۍv?/'B1\İ)LӾ=,[qnߞ>{M%鶛-D6Wcnw?^onu"gS]ނ&B_o\<=ݼQdװLao%R'k2!m1]%;}s958 `ڂr{)59 E X@X0FS ū[X%r)YQXhR?R{sVT~7-(PT!OX51C4>rAngtvpr'EIz~l{C-QHO28Y6!c B g3N:ۡ2,'gjw\{h[S3sv;r>P#jIvEdWԚ5}d$f+jM>PK9V5šMZ?V!wǿ5eړqC>DЂbEƜ (F8$ w?/lSOD>8?5 ٠rRSz՜f`EG /q\KgOϯ?>{io0yG ~{|9#urMvbS>5~gζH*]@M΂t&,쮨YP x]YP09#Z㰢(6RٮYQhlQg܂R gj-YQr=Wp@У+0|BUkq2ƂOf 3ӂ3?s&ƄLBzV,QHO28 @G!=1ڣ̐q~1.1z Sw`!1h$TZrFZ*hJͬ5)YO_&ʡhjl'$~:"Wp"&~/'l>~*.dNaAO&\hu y=vWׅݸt@i3 3[tY 1nǝ]<6y4 ]AH`'7A2κX)b12hXe+˂HK;5(LD然C&$^}߻*}@Br"@^&&An3A231<'am ~C̈́HtSTʇ]LI|wVUB C_KqY$0.F6LR rD_S U :ǮEG7%HyCIr(]ں g?5LZl@bpXYU] FӆzR5M^n>T9}{ݢGUkw>zPR\n Kb';Mn| ]} )z$9ct'clOSS0>MN{0@[a_uTໄ5KוS>*VXr(}aeL wtA Jt>YU>k6:M@t/c-*0Gs]8%Z3#I Ұ3t3@rPQM55|jo4R1/"rJ1$bpP H*G:IM$t].n6(TbMzR5LƉOͶ(a,J'M:}>f<߼7"m9GU|> stream xYɒ/\dE+yē4:6lhL_vfVP ы4%@Tr\^fZJ8ᆯv7?]aZBH!VBsrVBpz!`[mv<~}k8{Ϻ ÃJv}}8|Mb}+>?/$VeCK/e_I҄b(;YSS,|Bf6]gA+;VҕGiboc{ܭoR`h͆W'JI0`!CsjpV6Cӟ2ez-Aݵt ,GƲ~ o byx<_c obew͡-D{uou3_,v-8vGp76ZY&ōvN2G@2BxB|)WT5V֨0ӛ6B?xyao"'f_lGy+kbJ!ǽ?FVqW k>/+ՅW"߅Q@p ^ OޤsעP7 V@7 j"Ml-W\x )S n i~-?)O9J@9 |K'&jǴn]]vj#:`=BژgdlS@O|a@V,jvЍ ޯD*K)? uOhR4%5 F9_eeʊQCu= IT4 ֙=lk>zCp%#% 5Ǧ( đT+ U⳸RZIT8Q鉘U"N%cݾId IQK&;pU)e00@D6$iZ.؇y1PxG3c\>FkcFߗ\" @1z rұ$D. ]\pA'ujV'y`' } e2]X%{ui:IfDz")}+x mwBG(8)y.+cƄ^TG^7|qL)Hlŏ_cFo0It_’a1mu_3Րr܈"LxQ{oZJ xV @*0vFlR`;=lEŘ w0^(UxIR!%]ps:Hl,bQz4]ɵ#?5 FΩ|B|>^߰A5˞I#.n}UU&+O 8.t<ӱ#Mͣ4?wĚ ?ɣY6{y>f*}{wiKA}MQ<.A屢]?~/m`rqs77 endstream endobj 108 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 142 >> stream xcd`ab`dd v 5400q$baa]H~= Pׁ? 7~H/(>GhXKdiVB~FM|w> stream xXKFٿB7Fa=#U9lAm&9hmZ)[I=#i%# T[_'^,[^6j3aO&Y.O*Xf(>Y/O1'HUK@)|³qrMʪ\iS| oRWܑ.:7bYWpIzg5<% Isz' NڀKF cGYCe usIQ%C7#jg9Dh]P93gTssG̺#nPEzϼ̏̀czQVnb|)nPIE_?&{mUl䘧s&I BFU v/o ,G:UVMkB@8S&U}&w @͊W4SNlx]) uRd,Fg0% 6 Z碎Aw$u/#r33 [u˘ER-D)>Hq\(q,A qQ|R|d{ife!:iQK3f=ګHAZK砮1Sqifa[<9qsh*"|Ga}U{XXsd!#TX(֑|z>Hxasx+Y@gD*9MP0@["zMo i9 Pp `ucuP0*τŎIUb'̌7 #y*k{40q~B䇓WQe< |(a8kJ@ pMyD } 0W@ ZgGSEGAz?&!͟B +/:?O>d5|ZaFtNcsHAh:r@vMO<4*"Q!l3 >q[aT)c%a r .#>aJ#g' Vȼi (9VM@Et<0\Wu<PG` B .fObԚ!m-)Z؇Nrgzy` ЀYml cM{n\-zwhڼN_%L^!#DM1' 8 ݀Q5mݭ&Gnv %@#ȩvI2!ړCY^̅dJw5mbi8vC7fe]!S*:ne] ꩈp^DH' |n@aC(ʙѤ-Mcv9H6q_m|{;_# ׊"D |_gy >HH4Fk@[k+-xy/n3&[ w}_|燶lJY.$%2Oi'Z2߅uv,7!ϯ</e^!pk!IWmĠ_89.k'U QxSgJG;ߢ_#~fٔ 엿G >p%xZZEExݱZM.)%x7 r;fendstream endobj 110 0 obj << /Type /XRef /Length 134 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 111 /ID [<898c9dd564869a14a4b6794ea6297a3b>] >> stream xcb&F~0 $8J+?& u(~yHviɺ DrYA$w1dI` 9^ "c"`0yDH&.i"e΂eEnlu,H2u0 endstream endobj startxref 66214 %%EOF gstat/inst/doc/st.pdf0000644000176200001440000031452714750415430014256 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 4847 /Filter /FlateDecode /N 99 /First 834 >> stream x\ks۶ ~;tL~t2Ǘ:q$NEmJr.YxL9Y&H `.JD,.R"ґ&‡FƲEG^3"ꉈkm#<#! mPE#{4P ##Q_H:P)RҢըn9&"tMK#a#mP]^GF3EF"~IYp8*r949kL$M9ӑTZFõX=8 W1tPaLLS 3~bT\al(ƹZS0ăci.0}B3q7Ԡ,"~JQa";Аe%:ƕF? xb d (k\sԐ8\ (k q$g9%,I BBDف(;nA0t䆚l$bAPW( FqBHHxpv@rAp VQVCɭ읧@=(#e'H ${Pv RB?Aw" (Kh1BEowdȦTq>"~1&Z\Q%o23/;$dv$!CB]&f^$T{*S_? i`@rpttzSnp:&Q.OAWo3 "FSn5݄2 S $6y&85? mmT0PV3cjׇEZ4:p?.;3My ~HN"y a2J:Iޤ$Km2I]2K}ǀ@v.7\)h <(5 dR8A}3qJ1]iOg5PΞf9$/۷WWXA@rY V#.ӈĎOF@V^MamP{sz~ɫx%?*] J@w-hA8M9T"IVԶ7ص,AC" ՚j w#UO6#}˾:G3K-;;MkT(cK)Q6tSإՑS$$^:sQm5 4Y~|nmF m"=J?%l\X-' PD:J磂tU>:K]&">݉FyBV+ ky?Fj]j۬]+ysxyYhҘDHUyjX`O_Uڮ-X9'кMD!4G%zҊ݇3eJ|H3ɧWB60ěj x#0Ct]Oޟ?Dsf;Jh[C>[4Qf|.GjBO'zBO UFC{wSsQg61.|fKtMۚo~cϠ᡿J~ü~VwH'd4$xpK;eI#k>.&Ժ;ZW<5 QuiW" o?.h&xc[]S()Bi|`fCeS[QjHoO^\.o\i;(RjQ.R-- sXg;ܶdjr/Cw4 LAtkuo?^MI="t/sVOF05,-5+e{:ϥ"&.tS5u8tS8 OJv;BQM@+\5hU'0tRX_ͭ(γjj)f_{raNjűA6^LNGP.od{dI3? zWl Upã0=h/pH{xQ[\xC~ _f?ݢ m)׳A:Ng;起~oxqo˗/`>>Mu}s2lbZĞb.u S8/&πb[2ӡ2Ӊ"-#!ʴ.iIeZЩ"")˴O^|p9m-P݃mv]GzUGd]On&g7NKw]ґɝ՞%Ea-(MILqFx0#W'89@'Y~s]OjO;4ePBܭN<6P4gUg==E[^8ɗ7kA馮t]ZAOX~3_5+TR01o ]y>rL/Sa?_Zu4k;<֖Y[-zyрa0E $N^To9O%g;[}Z1L>UdUyZ{[Zioza7`[ >N+["hzӤ< : ĵ6d[uk8zsa#2'[݋mׁ,ogbײ (=:UJ}QlbciTeuM5ߣ\2mi:&Wi۔in~t5g"& ɞtu1L(`S8 ױ:r]v7 c+O)) N:a.N\I:u[3={ MeBB?u#b ,}LoċV)VxqU/շcA-gb +1+Y)i݊]ͳ c^}Ƿ%o:fѲ$k$ ZH pCBcĴ`Nm<ϸ#@* #~8`ȴ@0Dm:6m̤$Z uU(+4ژ`OSi-k=^7vNEv>bV`6Ҍ~N0q/*  ?{B` 3 מ2*~sj?kd>aR(gzfS*v S"c;?h0fd9C6)$4N1$c86:>ш_1-í|LwR 6GU:#V=,M,>:zt+?VK.+|3|ǔ. F)k;멋VѯVEqWF.nvendstream endobj 101 0 obj << /Subtype /XML /Type /Metadata /Length 1388 >> stream GPL Ghostscript 10.02.1 2025-02-04T14:50:16+01:00 2025-02-04T14:50:16+01:00 LaTeX with hyperref endstream endobj 102 0 obj << /Filter /FlateDecode /Length 4176 >> stream xZKFr7}ptz UރCvFz6fC\?/3@͙}p(4 #+3+_&*B??h]?LJ7ouX4U٢ںR;*MԋOſƕ1zS}\_*[b{ތRx]Sx*_+m6uzWfu L]4PkS 1W{3t),|]\?dO/KRy|#kj7 UXW,֓~gϼf۳Иo`pT @kjǃTCZ՚/ >ع OWc#*]|/cwC[▃CO.bXL#6#յ6E˳J] p= =!b14u LuofZMc4vS`LuDfzzvz4$&9WYU,kuOe2cXRO-*Q?.vHV6>d kU {ci/+_/ֺ-nZJV ̴5>( rb]ʹ2u3-2CV#Z_15S}[#Դ^Xl([H\ XMty5/\bkֿrpܕ4?p&'[ RUi+BavUe6r',UKh 6B@>_Ⱥ U,"F)=n״ 4QD({ֲ,M W*ceY*`Im3e4fuVK HJ *"a=Bh6x\t64kC=ӳ%)hCKsyy8 (06ʁP-VlUCsGA&#,}cH/#+MQ5d kbz8o-b*p{DN㎈)GXœ4^Ӊw6]/\L'JiXyqwR𼳑N8vkQ]tm0uǹo#-Z!ـU>]T^j2PC(cadYXRJvHDB ۝q86xDm3lIlTW4ykb xJw"0Oۋ X :}{hGZvoxeqE,a_%xbFw"G]ӑInR8$Hsw ZX +3<~Ȇ1*CްEgD᭶!i( DD.\~~Ǚ+.CKlr%-,e(TIDϪ^9tϣ8|%"(*9=Nag*MmO1GGenݵE"A+hnuoQЌX#lVО qǗV9Ò @I}="2#[b0geH$BT8&wdž9\n<&\3w[)KGґ=ac.ևtjcir[DcRM`ɿ@kR ;;z%x+XbK> >iDz4 D4NT);y.!{ 9'u76ao"TA">gɸZq1eA/&ҕPזM`7eb%j$4{Ԩ+4(KR$Isq 韁2rS6rTk PݮA@/!פp;q3|ܤ$*8M> ~ͫ%xB'dḞ*v2]}$a0)W1ieR)iPO.EeB}7קvf}Z_V`tIB&F$b6XOTp ߂ ŧ(T+;Gs*hrA.jxQ1Tb鑍8&8CКc}X}S*TmkWstjD6NOә3ٕDמw-& d T<&cJym2u?vrfM Puf;xB0N2>er~3_\;;IW1C3ffF*ͤN(CB8B߃9Qd.Th#A( Rh K &4ϋ13\c.!# UXfgVJ=x 9DFk)6cX6T|nVF"IXjԏ._ĕ+};guwFGV\&5TUBB\Ul/ܲM2iUIMPLlNͻ4_h]G*Ē:,;+q<ӛ7>|(vݯ@nSv/]tP>QP~/>%fiKMv>o$2#2NZKM5KeڊpJGMy2>2-RD%%ES)Rk!KM3pToyʈ31}H)ojhw+; 4 8u\n{}GU`NpO$`0FLN~[RS0Jq&Tnb)v+yOɪjEȶC2uK mw4K*>]P[C,f!F]V͝?Brdx =坿HN7ds|oR&<1}&Sx~#HL;tOG _ AhZ0%(X뚾^OwDdU L}&Z6C/C"cr8%ַ"W9ڦ_/\P.uP0 %JytN^v]ndg̳oZ"tSq}z T6{UUe/^M-%-xRR`uy vMbj{DV %͚8)wMp+zOIBݽ #΄z7}k.(9VNZ?LJSs{~Lvow Įx1MZ\& 6YdYe ?fEh=qL ۏb~|g`d| O^B&Z܍4ۢJ&nk UL -R…(j)T$ym >q)yt1822 U/jɕI'B-d2D!M%H/ljyoN=Pq?Z%, #16Xu,MjpΰUG>4'ڌ=jлE?Ŧ;-pVS [o'U\Gx}ldsKϐŇץP8(aC}tUQ wKY\3!u_g?%ٛYjn+"ZfR/aA]>CW'gRcRq4&^lQ(pR3ooƄ6Rfҧ|3&U94iMP)%x#KӐN-MQd75d[~:17E18`i=jX1Z$|endstream endobj 103 0 obj << /Filter /FlateDecode /Length 2588 >> stream xXmQe}b%\iSCxc$u>w^vI,4nL.gggfqr?^/~q!iui6?e꧱Kjiؗ*]nŭ=8$m_xkH?MȚo=hI?*?#.iE,_A;xh;EF"W^[m}WTvTc1nCL*z 6 ų #xX{k7?ފ‹$hRCXTyOe oſ !*E3Ǧok@+rouP~0Q"^TW#A SiV?fyqYi0BnsЄ~43v(/YɳXdUՎ8]mSKZ2kT:$,A'oMF:Pe( "o׳9WWr| 8 k?)KpobD|ZE|O1[|MY mu4QMg[ӺJ|脩T1~q~Z9%tYGvVT~˶lWgb ?)x8Ha 9 Ϩ ׵8fP*U$z+!h7=3(Ki 9fK샧ͤ7:')>{ ZAlr@/@E6i)zDz" XCS{CeWr# )7U.%BB^E}0.!A*vِ!9*ONeC'0pKO\HHxTo!M_={?TfeOD9gCƝ L=\>2r6Hц' FD~> ņ |1HPk/P.)b7VU}*+ da1/)*+)X?c삈!h }%=V>ީ)DpIR_*¶H;, xu*Q!{n|-F"Àp#.EcJz>1R=?D r෬/Z_(8W$~S}e@h8X$2,IqH 18)y]UeG?֣He֟A$=mJeBюKA;խTgͬƀ b*N*88R е5>qH,0awlOIl*zㄫ{jrb.$QcV:R7Y\938/vh^cHSAo{#Eib&;ktoVUȕ5bQDj+y#A'%@VP͇I&#NMڊ'l#&3=ukTT Wqd:,fjG'f܄T; (gи,ڊ(1s7<^]4r/ Ƕl۶vefa_拶Cj?|b.樰b\r1>܁kXKw)RΕPH8cm&T:5#G0pڥֈys.`~%^Vm29/&ѴXluW<.'NI9QH2h@|Fkv8b,VyT8Du}+#hdP:gbԁ](J$ȱy tx7N*b=8n~!\Ůľ 5yW/! &&־ rR?I Ife [endstream endobj 104 0 obj << /Filter /FlateDecode /Length 8442 >> stream xo$u/A0 . pb9!zw .&)KF=vsTϐ ;?Vw}>n۟v??qOߟOôM4㴝N8ny8rvs8NSVfos釪os:>FivLn;F2esJs~64a¶a0S4m397)ii4jVh)S ATan SR 2yS$mԐLIàV1oP$iɠvM;AIQA(Tmh(()`ˡƖ2%rZv,妦2 mӞ&(smƁ :Pc9Z~ WRq桓ǹLI=*tj\v5(۹i öYo;1ȋ*y_?[b2i%RviyПN>?lte*'=W^'ITjK~}&[yË zpٳxNFm!|4ߝ*I]?bLiGt?k}-CNlĹ_Z7_ݘI0 6,C [u=h6xWfi`{[b2V1ncE@{HLZbs-e,lG{z)(iH0JLI∣LR$i&i2E#aMPgO2$~'kyGCIOZ+Wtq2_̷2eJB$sa֋$VIPӋP#(ݱE(jYR>",VWdF};,{Cs(|G .uvfVR+I?K.Y\  ^c yr&\+Yz]s%諹adijU]2l }1c )2WNr̕Sn"sU)JUsQ sm&So"ư\ik-Y?-n Ő[sk1s[ &Yv?.z9eI>e^ċ+G`L-i%g\CQۡL)Ճߎ|I RRi dCSCRfd~cCa Hfv%u#F0}\YރYY"6 Bھ< cse7{-Qbnۮ$ ҕ|lJ btLt#F5M@I]J;Df}+PO8/ٌ2EF/f8b`ZU7R_Hd‡"3Bˍ d,=ۏWĬ(ySW:ըGqô˸PG\ 3 ^# y7r&\&~$n,iыQx$v:4 Wr JUN!rJ(UU]:' Ύ.|zH1&0@w- j•{Uu>}n~+:^WYS-Ħќm@_U (6LcŎ)LNeZՈ=$E>wt<8򍻸li}=ZlʼmŰo8Ճ͹8|6^ g^T×8&$8%xQ,xf!2K+Uz%[%-UN!rJtQB'!Ozٞ'LzKR`j)$9TG:B[>z#' Ԯ2t ld',f[E7lnY!S.~C)Sr7y` &U*'(E!TȴF&d"'#T2OLAI5!dAB!(rV=M%D+"OLA <`YC)(j嬹,96E+ iY)(yb -Ka _<1%6y"* @)W:|4'DІSPdۭԣŠ!״C'SPߏ)gNAa;)(LjDu|o8^8/a봇*; '=9E gQ"Ll@UӪFDn,u6zx}Oy'xAFyʋŐr .R:F{>zD=yY DIa i"ʔ0ğ2%HxşSC+\G0E|/U~"YGOA^Wy(K% sJ}APƮd( F (W<U)WnX! ],Ey((2O@EF_@Y:" ~jH Sq*1dzV0|* Q6C*2>빻BԪ>\JڿSLu)QCt)-%Kg U 4eP )˔Li(QT3QkD=8OEc?*f? Ks#Q)%]Sf04Lr}R%kn=D" <@mY(C0en>2%vi!gAQkLAQ\?=/PAVlT1r(,rU}/pZaTjJNl ِ}h3VrʭSdrYJjUZu:jy(  ji/)=)Sl~܂PDzzRLDO[%BEl, E8 Y(Pr\%+Td=䡈X^'0!zPAe0T\Q>F*((u0QP CEF:Eٱf$c, U)W+YZ((/z(("RmPg0TRG2lSm!rM49D!x Uϴ A[&G`>gc;&ģrL/%/vR풟&ܒCkt{cObw/5u1Yz CmQ(C[\A[d)JA $x|&bPDA5qQPD((p71(U2ʩw aA(-=Ea}EA"@vǃPrEFeA8BeC݈!(SPQ4SP TILAFS ,D+m%'԰eg`-1o۳CL{ K(WfY8SP ^Eۘr% r8L2v+;\h=2( SP;hBjڷgb X|{ѢPQz=+wu0@O \!W\!jU <ӠL|!SbZ,Ĕ)z!ʃI%T)W~J)S~WSP戵9HOB)(H>JOLA #OLA/0#WU'LA3nt#ąQQnDeSP' ~Ur1LE)>EBʢOLA+CGBUCQCi NR:)WvV5:4! Ŧ,/4 .UDiU](vMmŶ)MNoU(6Nus,A驝ߗ:by{{wwy}pu{s_7wWoo.ߜ wo?XۢLwQW'Ïrjջ~槻*isZy˷ՇKɰA꡾ͻ0mvv ,!mIGjq}FwgcKsh>Q6L9O㼑?uf/6ab6bMwJtYvYrdk3¡'>=C~zH8#=5Ői|:$ow׵]Iw޼J?!vcy0˨͗J2Fq]Wx2҂e6nf֯* [m^vo;] ?. *1exѐ's,II)wW.>kU]Vg}^9*C_c W.&m>n.1kjl;rnJ?ye|4卜$뿝XcGN+=xwoY?Wrº&}xnwW{i\= %GR{7#y6=:ϥ/5d! yo!h.1gPFr2 WxѢ ,6D1[\vvPaK_pyg90K4-Y ?]?tKQ8E- Akso4Z?^=ӏ wCo~LKI.6xb Rd.g/No6b6*D3s8 հ9t}`.ShX닏&?ݼEJRƼZ/e}/_R'ߊв~Q'7Co6ۻw)6_/S^Z/Wq-xw}{q}-#hW?^޼a$ć?=\bJ)&YΗFgcZ[]*;_t%A} yNx?endstream endobj 105 0 obj << /Filter /FlateDecode /Length 1880 >> stream xXM/d i&${ =s8nDRKfvWUwԬ>sUUk}g)goY6>8ÿM3jRmj0[9W:y13rafvdžCʦgnM ڂ}5$?5:5EnKSU>_md]2^,U,FL<5s|P˿B.36e^x^9|֬U!Yu}V=%ZCl.leb#hƎdpQ1(IIs1l $}~ ZC9 u Cӊ{Ֆ6@ZrQ{;lJ,1ذۛd%¦hgݱ56q*XmUCS.BH8~qN^JOѨLaP${z <]O |8,[/$z:-}{&K G)N 躇,Ɖ@}uZK wU} <{6$ *H‘tX@ V=[NpXs.߅A]N9ݏH|`~\xGHoQRj~0gUK!1k(-ǔK#,>yο"bے$@^$9?\*N#T"Tv {=p+buV-qŸEO !<P܎ވ08jPeBulP-KwH+W=P UlDJBnD6}T̅/pWXR+X9tJo|bg#i*HCmٛ!z1T ݤ4l2J #n(SB_!ce-]5@rDFr]A7ʼn+u-@sMН6h-i0llU&S7ͺ1x<憸`v_+x6A NlQvS`ٻh4qIi f , hLa;'|A2o]o0@ԾBP" (7pnG:4߁xXP8{ҹL$:vʤt6Ed 4v7 <n<73z4 #\Ys"nا~& T:ׯ't/)W(jK7mEtlʖidjA-OugRy= :ߡ_> stream xZKݷ0*)Yvb-mYmXE 4JA~v14,)kK~ ~3y__׻$ݽ6o>}ɴq_R]&U_z2ϳ\5{gq~QuVy> kn&h+J)/ڎee\JBFUv>ٝ>G!uM(2*ynZ>UxCZ P =Hq,7+qae-.ajW4en3]8Jn5ju˽{Ů~RE4(N Q;irl8[w%l$٥N sNTk b`YVt?tzy Y d{ҠM?($#0J&)u XD҃\z,] A@-1εx[qĶl6& JPFe*C"Cq`Lc|V>hzb״af}V >D?19ͻxe8Tն6vx ^0 fSiSW3;r݇_<%&Qj_sZkMRwHn*M tH m>p /V8b? i :-H_N A[Ϧ);szS6DM8ȸ>If['6ʑWGү#혨s]0i|ȓPJ'A([Ȫ J~H5(x|dyEGBY)sdcn@VPq*؇*7_!=1M <1'ɜWS@撌\X;i+UiT[y8(L!7NĜ":t;y#w `.>ӌ%$eꑬrI>,usH̊USmx `d*gɿ!t բlh[@Ms#y#śPf2jS?KYabp}tfQAb )!ny2$r]h)aJ-eLpyH-!DIඊrASn8 `#Q*(B% PC 0}3fD)z 8+=D}ҕOU"٦"'3/)g džbW(2 ˱p$!lQ$mͭ,j|_W^L]rOB26ڶjF$O*3t9R1Y;"$ p@N iŬ$3m@[Y` 4сO3xVG`v`gJ > -5K9-R3m|)|f[C&%7;n>}[iJJ15- &ǖ:`q5Xm$6y}ۜ8;cN L8tU2Y䰑}Z:ƺ. zHN'{6r2TJڋʋ?NQ6'6 =cXb݄x~S5G\B_*@fLG0&c"g<ͰzTVN.BǤ]S_v'*'H,2 m=p@^WDN"fkuI"afj]Ad{š9EޒGWNVbT(rS-9˩AcggHs~E ޓ Uf:YC2r-ߛ-˱k.5msе􆉔VE<+Q^@RVPjj e[r|hTڋ*i@1L?1= ?4b= EkƘ1\~v-8cH\D!N>U=JhqH_,zaeakZ*$S1[_6[9*r= QK<AJLT D)-74Vu_Ii G-A j 4J0H=0j> ED= X ;WO`&p8gWZHmZ7qeQFR&G, VbB:M*ce3bai{=khU[*5AF-q'272g \HQŨ7(D6Qq/|L;1a~H?S 8kQ`N']~1 PI,^dؗDu?5( qeHdr,>KL)Ay=3͋}ΖW4CzɟM]mKlGc*K)vR dslXy%yxT]uZbuާnY}=ɞ2dO5p%mQlNM/jJ^MnqA|,oH鈏\R^tU=o4 hτ.ЎBm_u)j,sʫz:[l#fFAǂ[,]C] <Px}(qAgzmzPxtl T_ddT'~"HlB`0:hV&g~> cGw:f H>#K[9#`ӧ?YR| 0z@CImVX(,~ $$yh8;#x7lQ9$>4:ps W@WUOP!Og<֒rWFMx83 SqR&V쪶`:miCX m&m * j`isv(bGx; %7~;'"_d# mAx""ײ䟱P87.⿾y>!o(T$9G{>LVU?S; ?ܤ#.-g_+Árt14K9 ?vl _}9gwIմ;X($NTv;Щ" ܕ dD.c{HGU̪Gʑȯ"pendstream endobj 107 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2349 >> stream x{TW'rK%3C=Z]kj"G*y'$'$h" A(lUZ>NўSWasnΙsϙ3O@ >seF3}>08HBBlo{^iYyE 0=Ou[3̝IEQ BB,IkA.|p̷q@xo>s|0GzV jȲ-ʭ,-Vbȿi |T\v0rG)&Ѱw-̚DI)CtQy3D8k뙪x'|cqg>}fV5*k<\Y$W (!hfvnؙ/0Vt-q_'?UwU77(EA'!w>xf 4٭#^_@Qδ-54qWMTNX=IS#3:ГKS?6u:̿ұ:В5/g/)܃\NEp^Ed~2{C>&-=}#P)8=r}j. Ng!.')kEڌ4\pLڰGKUw0C}2"M?±i~ m+41f0ьKmL2Ѯ2נm:70 !S{~3wGLӻ8?7G|+whh+(8rbR ҄ܫߗ0vdE#@6ğkMh5.;z=L.P6ٝś$\i5Xy eUi2;9B[Qn~;w'JF^Z4R|pPіԪeׂ4k?١Tz2HšP7o07t 7_:*ImVl5Zv#ɈꚬMF屹嗥W/14oaD.Gӭ _qq܌e x* M#u۝j[BsK6v6֛0A/?;a`S.=L Ym[#wqA ʠ[ҫ%6?6xNa[3ۨ"4ѦΦO;ݫg8&&CC=4:wj44+f`d%%zEem60UVy.%/b_^BWA* [ckwH<% /_m[)_^[ t|~ToYG- M.:5kz5`%b(Nf(;y#"nJ$UU|Պ:w-c8x F37$^ZFlq%3.A#SИtUw_>OOBFOn{©wx +x> stream x-{PTuw/rF.VYCE)i. !;,\a#c8 S j&`ҙ|p.pn3s(03b? ]uNe *y>ꇳ/mɉʏ.MpS)+(7 YK֑$YIB*Mbj5Qu #0*E/;]˶?ٻ> vA${{:,iG!wd:gE.w׶wGi'HmEUJONŢJ{ѥ{斄-,a:Eex<Չ@ɾ\slOE)㡲k-u惩rEȢ 9 jij/ w>rQ |]umWڤEv->$d(v}kf/=6,Bw"a!ysPJc<εrYhi ]jM ۡM5V ܎wpXkrȯm+?\k0R=8|<ԋE2ШZ}Y q_:-;z[NɜCP5Vw,SF{b,DC'io.o); yq\Q)9}q|*W0ug[ ړU{ttŋǧE5 w #ah qR#>F&]ϜѾ;ysή8\{Q 5(ԔƚNF+۹d/{PL")Ds/dkrmbr~+t7L(-K[+4җTmLm&w<$AN` a^CsgwV>KƿR`. H> stream xViPTWM﵀2y=SݒrbpQD(Ђ+*H$1b3$T4QPш5Ls;ېTff~̼zUos=wwΑ K $HlI߰IZc H噷O ][nݶln;W&%o_;sOdTOLƵ~qO^Tx{Eh*FӐZF@(QZeh A "wy V-@^H@J[$APh&y DXtN2O*)1YLcAVKeeeRPUpm.T()WZE"nL1cYj=zuuuFS.WIT0r4 {ԥqRMaWbz/Ε*DyR a ۼQL  `zd!Oژ<-۷/PJTd LI?.g;*y{CMGmbkkXnE{x͖E^GNG!!v`}Ja3 p A sslwP/=rKMR -a?;Rs?zҹA. &~Dꄐwwә{y}5HH JqӖмmYYL}PGV]S7V_>KUVVx[QaZr`ޘ{*EZXÁ=xC墴 y_Pc֞FIH5|_NwN)ϥ-2v|77vȗ "^t"FԮ;=+cPP,Ne$ a$ΞmV+\=J''֟A:iwLjP5R6֙ZEd3?|-|M-pw"šLyxUr& 0!H"OnT|6:' $d1\+u֤&ͫ˻|SXⰺ8UͶ3I=Qqfyryr^*x_%10ڶW o\3KNAB`0AkA-sZ3j)J>N?m#d KhU*vg[>}Ip1X6mu@"s1%t3`:LLЎuuIJ]$I✊Tn~ QZVp⨧izilqѩayj8VW`Q; "WD/D?  R ܺ.%I z t <jdPOeAf^r@?ra/d0xw?c/kqrHszj2Yga"GO}UIIqb81\eķ'pn)=y#_g$S@Ciac\t'0dUӿnN Avtܭ0>uq ~&, Y@<J! :S:d6 d /C`d1Ļ`<֧VT6V7.9S8th* jH.Kvފ1M\.=P05g7Ky3%m޴-Xɵ꼪z,o;6'/F@w-X+(`-#),~Me,> tV3rTC9^U[j?bkW!ܦR*]LD:S `%5}u[[iZ,HȬW ߘ;O(/[ȃ9$=6p4)Yu[V蘿ٌ6VllpXl3endstream endobj 110 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2199 >> stream xypSƟP+ @ $u o,ƫdG%˖7YF^-Kx;aHSHLf<34 t:λ|;w C [FmXhG8p[CaƇ8K #!oN<3 >"5iu)!)9IͦP[שhj%IR jIR?^QR z,sMh1DB3B Oz.?3ڍԄgc)?H bi5XE1ROGRyQ K֣ǏmpԐ][YD`t؝sMO:ޡ̾ '7aCzfs}5ӘeG$Y$KyZv6UTjqA~2B^a)cQss"=V `QGf)3 1NY4ŕNp2fauG Mo}K1gVѕKz..&/Q5NFbwd2ڼlF[#QJ?50;UqiZ bdvy̕[h{;(9IdXMU5<zpj9֢K,)Ev]S+YVlGF6/ pfY^pn­=in> ʰ} yf6ʉg1J$\ \ Oo7PUө@c΁W,2!^2 ?ʠT59,wX g$ 7oV˸X:^%8} 籙X;x |SIuqI#NRpG2$yT ٠R5nd$4a n;8ʹS'u( gkwwn]{$"ϔy,E1n#Xm[zߓ\1iKlE%O~Ǎ/^ܵ~VuDs O2[-EPmZ._w0Oä$EC<$}Opw:{p%}>H=":oH'{Ӭ,1m1{PɄBnᢡQՕ82/po&*d] APġ  ӾS"=?%! 2R xy؏i$4z_/|/qB$Dgm&Z l]QEC&O:_PKI-nm`8Mt,:^?ujꤌhyW J׫R>OQo֑uh]VdN޶U5BJlV(6I$zo lD] .6;k?.ܪl{JVZ̓YWQ()a&0Rendstream endobj 111 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1637 >> stream x=}PSWo9%wRh]ovڵe]";& $D@` KP-`m10κNk鮻j0Y7L;{fg^A 5?x/a{BesrKO0κNʓl-uzJޡdJJHESME? fL>&ě >4P1GTS@ mI#wϝΖ}H^n`2("I"qiTFv湮:e^_{Q9q0+PCؗD1#8'W82 Ƈ$+ ]N*wZ.[Ezt,pj3Ȉ[WyG%[ *lNA)'E_mjHxz-;c΃8 VvBaVB"CAcRCza>-=Wȼ0=5n'Hl /Љv >*㳐9%?)AaaЅÅ3(-V_ MOrRpo!G琘Pwe>R (5ha;$Awק& NB{"T{B 7eدC`RH]_qcviLʁ}x@Zh5C=օh D*).00VK*{)@>[37n}~k3H6ysׯ{*ޞ>ja [wG^7endstream endobj 112 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2957 >> stream xmVyTSg!PPuۙjeSE!JAȖBH."[a ֥V:VKzT)1yQǙs䯼NoP.@ ~,珉@5j7)WF>co>1r~&HHLJNI]SuۚAqϞ3VRT QS)_*@j1ZJͥ>|ԇ;AqD~TAPuk$7hΣ2L0ç ?fb䜧fK$R:cͣ O}8u=+%ZZ|0#i)j" >g]Ӟђس~)="F"׾ \",EFfG^ d&,i\r*w۹3(t>2B?^T Mj$}4םU_V F¢t]:d04jG'd@4DUdmp@y~Il7l=H{[l5P -|q pl`8t @} Gh+IT~Iޓ!4&WePIZvZ2n *zmWfS 2[wPyvbka$4=R%()PgsĝBm0 }~iyEKL#!Ak#mqv Ji0 tzo'c$J$6yԋ (~~Z~΋=l]6d1R ^[p2->l'1~΀tRN /~4hRN> ༥n.앉RҊlcaUJ7iTW#2Z<ŷpcjX9'dY##|PzuN' ={v$z TE?L&A޼mt!*õ_2^!t+1"z1koyzRdq.{,sHOҕP^s'c6(NswɔR7įZ^Ey +`al{q41kN'uƞ pYXn*kh5Sf'*hL! 9鱊K"OK%bl:mC"q̒ʕgCP-uX-8] UٛbB$. aW^olcƒR01feQ>/ʀԍ7ƦvF{ֆN޳̏st^FѭaCyoC\7B*BZp>K }з{'~Z^iFOy CfqF q};!4@V%F&BD|-)a< ނ [-H98S%x^TQl,Gj6+v 6"19vꊋP̘YEO!!HF0W1kinENZ8)MqsU|]xvJQlA0wE ?|g2if63W_G)Ɔ֓}Yy2$xfŷ[1%~ouccS<0T ]ߜ pApZ-Ry]s0W m=\103=?*q eM:uF J&uw޽ջkm ۶e'MFo@a3_bc1Mg-@0Z"nlRy ;vnhvxOqVo)~cnЗl IU#kK Y[Ά@-0&=,s9S_a(0|Z(Í喥"`f[?OmaE+D$JC5ٻ?уzS|ʴL:0u{ &PDHtF"/m{6cS3ms`OFu k qqɉb| 6+bM+˖4A?ŅK(kآœ=E=oRڤ1)d) Պ2eIDshz`䕷oqkԏS.gƔ,at`h;SG$mnUr5J%GbhTbf_э=۹" fJU =C=/ Щ.^E0fnc+z6`$M*,2Kdr'32-2;bFDb+4'>o+_˿OpʟuƝVYoi#, ~BY!cd.}C|D[uک ^d3 <)%+!}~r^7noE)8B/$Vko%o_';VrJV,NVo0CʀsԊC#LP9󵐨rK(ۋx}@kZVEvW%o8>RN|~&#:|!¨75طў˺Åe GJ/endstream endobj 113 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 8673 >> stream xy XSA$XZ\phjkJjy@ 002;D˜@ *T-jk繷wts}sCrr^k}ߵNѻg/2 KBƿ:Q_$6lg >pr ,9;kNܜy   o/H/ܱ49a粔]+RWJH4)Ͼ6uF?1^zfgؗ_8K#b$xXN"V*b51XCH$clb1XO%yb>K, ^&bbGL&b)!BD1D/b01J #XIPDb8A'2',b1xD#K,'G +׻[zꭏf d]"K$^}<}-wɺ}8({jS"كڧg<,툙2x!!C3~2♗Q<7 ?[>/GFGF܌n>;zoO77 C 7"9< `{n7pZ&n49@PP*Y]̩LBJCsw3`(rRiBUY _\=]rRVYh*J4=!LQ rw-6| (t7 /pl:^`87wn1<+#iTOno C9,vGVqϾldj-`ೲs4"A!M`)XM@? opo ṯgno|#m(TK:~"T%ry:xޡcpW(4Hwc҃!6RI9#٬s0b ,B )z}@ 5zѠ}>%U4dڳQzzA\v2`.F EsdwwhL(B vJ<0=+s΍oV_B8cda'8ns[ՀB+h*ڀVL\7m3P.Mo!p_"\iW V}?)=& (ꤡR7Zn7\|&p 9x.gk@ |EBP+CHTJːg& ,!tXF T[5h끕{u[zjqP^lۀ?>,pc@Q;5ܮY9H?{)MzzG.iTH~WFC)4 K6J_V> !ȦC(>K+yEdzLiH`la3r7hVJldXDZl]|@̓:V~h[ӐdYc@XYPi Bc릞u)GbI@^l jlz3WOU"wyeE527ٗl͚2Z 4* x$uǾcwBd1(j] ufOW@o&6/U` :YFl pIgǞ$R[2_x+tsF=vjv(3TpEj骬U3מzX9F+AmZU[KMeu|BUԇS*QܡߺVvr4۝=fZHaY P䖘)(C֫>ȁL?P f( 1(f,[!q p>B#`<# RnՉGW@GBl~VLJդpӘ1KYplk6z©U~GƗ "v˶\Io&]?Djy|A꤇޽G%*l\+vwDݴvĘbS>nPq,Sss]&Syd>XlY򜢭b|(2Z4yWr/ jmڞ<WI؝jTZ@eZ 41FU.TIj:q{QxΪa 0[' |fg8O+nZ8?"M+HEgqp}GjZ4YRwklv^ _' M}{%^dzk>}^E6$ab amzaJYD5 & 4 Ƭ+7Ph5 Ď.JOu.-+-wٝ21fM T@^-T@|^TI:v@^3XmV9'WVmj KWfzNaR.bgk.ApW e> X\X9^A+%Yǀ 1[otWGY sa'3+H{7wMfz[N~z0 `c̖Q]2[:Z4.+2[}zJO[|:"^&M @R(E *S )W 0 m`{oa >gc*׶)"~D-3XU}9WxWs112h[}#8~`P}11BE ʮʯk(VRvUr,'O r^iYGƼMmQ%JnA/R}_^Njmz>F]#8A$Dn^f0`OI)Dђ(,.2Rz&߂l K1In"&" _盢3eپx_hrTem b(Eơ/'j 3%i\&`\:V<@MbW~TPIc\q=eRN,hgM,?9q8^L< a:I 2xơ[ LZRFHP+e9;fnčԦk:(y_ O H۩4iZrrٺz;n[ZlEX&E^`iy.ԋdzHpm17@fx,_DA$\?/ F&w'5:UP&V^a06D44߲!3캤C+er:}FL`Ek;_*vm~*&;p^)y3sټs' zG k0.az84.FګzPIN ѐJ;ʂ!GvBurbx X#4 ̇cİ?vJƑ\ꋀ"a$Ft]t`P: q) J)dPMsӣSٹjiȧr Uվ#c}4Zx*<QL_`s8Z󈛣A\le5M *LUFpE׶џiJ) E,Hݺ\qVW~hP]8ݦoo GOno 6Rs!+&TpS\; ɀe ZL]Va[fhYW][bU*%(:/kWj j4=fPP&W''Þ1WWŦ3shƦPurϳAL&ɓBwYϘ=hBu/t >߾X]1mzWWZ?IC5|3ٚ2V~l$Ҡ vϛӦ&qCuMwc]h|d״ӂAYUp!6z\P? ;?tεvS^`Jq%E|(*$wc7NTe6WN^La Eчy;{_ ӈFi ~&W/bwXx-j6ѨUJKMȜ\S#K" druP=ߟeCwA F o\QΥGnx^[Әk7/lb  3HΦKJ\\l 5foW]ϔ)ϱME@LvΔ_< IW;F:LPrQ64*eε:lN;ttNGs> Z@crI5R/R\/]y1p募a S]!?57EG,[gM iyT)%Xe -`H6c nu6 暙@~X7 +D]cngX ";П7tŮ"?ݗfKp] ҈1*ֆ_ y"ߒ;x V0SҶuhG3tFNfN 璿Bsk5ѝDO b|~TbηGϝ@/F.Wb, Pb}10+_.^BHB)KRc;S?d$EZZVg^ YoDZjn_9u'1/,m}Wӯ.m"9KBVFi7 $h564mu$`Mr[AX$_w{G{rVK^LW%Z~Jl?×LNђʳD>Ҭ밝&s Ɵ a|>LrwhiP:S"e#ϒe+e{`vOR2pՑCV32 t؃5i2e$K+Ibѕ]RD1}}zfxlG~"F3 !8$`?|whA8bYyDn1BnmCm* q]RSJqh84r<!)q2 8ϡ6LF=&{n( C vC? DZz+`^uNv^~sLG6(HU~U@On OV+!ޢ13< lI,jڤ6P:`qVSmRnR:K]>lj:xtn 4H.Rh 1^1`x"%D>G?\Qm͠:[k-rE99բں; B r4=SR{4A}-. oa ^- P_DL= 8KY 3Ɯ#?ICI7u'U֚9+go{c]( X| tU[.Ήl &QSqͰ7xbߗjp8޲8U=LSr*ܣɞ`%z(G=^~:S:; `2Z /";w'9|VBbbWJ4>)s\e[.Օ5fFxdp,֐: DrWMҦel?孜Zlnx ܦNoO_=w[Beq-.eO\ ̠xiܲRd268TOڿ[-ßRO)W$'$jnWo?O)8%9 R{:qjL.޲“,WÔA\@MںUQҒjTVZAVq{K.n Y JJSJw? A¿1y7;buH"AЀuh@Ztϣ',ZlJsp@:| pdoVڬzL{"gn4th)vPHIHMc:h*Qd8b4aYۭO*WWAPG}q'q \١꺠< 6ct@SX%5./h`#WP?O,a\X--cp`^K` b!:o)'y-?=P.++DŽp2W2 7+,$+BXo9}πFQ9ܪoyH[sB|9}.L<7RFX3'!Jb܉c%)4,AnQ -UȵaYwsGNڧKd2 KSaњu%l\z>ue|߃_ 5>Wj,'aNn?C]sSNY<2*KYg5zV L+rMKpz0\{&^MsWCf gc!D>[9Vj(ҬӹCpt]p|!7(Cj 3ċzGvࠎ+[{|MkڰcG_7 ې 2(t!^hYs .w"? K="w$vL.zywthm|%sƈc?-F> 8oObbҸr P g)6Y$2;@!ܸ}FR0j(j 5ކ:Q-Oo-̃ؽ)?c4{wp*~.aԅ":O16`}sh1˚8 k33S83k`~MV x#`ڏ!{[+wjѐcO¶uu5 !A5h.)I|U]{R*BO|In;<3UD̯ͩmjޞQRh*f X\& \\%emFiʁ(D}v̽`B E *޻kđr }q߃I'E Uf Q|9 ˗&槬,&gd4C(~d}zRA+,4.>ٯA?'endstream endobj 114 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7716 >> stream xz xնnBQ4e@U*ǣ ((2Q$)!sz;ݝNyH!@ `dT@=zTQws r{~|>Bwr=E}b?d$i`\اO^tw߃/U_򄚉& %VL}ʙffmQܲy/xz3ώ81_2daßx)H$#D1KGH?8AՃmPC٣gٯz.yPGoKzH jįna2 Ko)B}BOAza?R-a*_[]. hc1_XWƨ!~[ FnםT9XbC*nH7l%7Aj4J)F DP^/+hftsy>4lB7۝OAeׅT:}\zwU*(Mh$h qO.@σx R/&E.xgɐ7QJ W%k[!Ҩ8U7uCLEZ<OsNQt;#CN,)HdFzeup9F{mbtIg:Փֈ֮RR׃2ч#Psw.d ;5s9A!N_௔l@#~WInv@;u틟}9e7#_|s 7Mgݹak6, ) ӎFCn Ƚ3PnoIvjAJ\a[ch0"O6 HmG,zL¢Ux#\u KA>-.|?lYh ׉CZ\_kŅ?/eۤ{ ȿ^BXZEvn@—ԤG?gQᄋKd f-,,]F @&%z!KK$Uw%P@K|Vhx7#z&zrH7+ $~h zjߟtޕnt;}h))D,p 3 ZQ@&5:XiŐ`zՙ& 0l C υ+`Ú*UDl:Pp$u@ӣP%[$Xޡn$U1;Q[܊SuY7k+viZ-V RVAE^A6Qzd :sX΢$v\Q'i\56,6l,=!xwO}IdZEMvۦ&K [zKp+׷<Qkƛte]9݇QHv2}*iv}PUʒs ̏̋w \BgY;lM+^rl=ZCku3JǠRI Y*KE‰uDLZ֬)Y_ߢ8 9 ; =\ ߥV@j<"N:I:qBN$ZVƖc;s:̨pW|fJAB ĢdB2Ak0 T_`׸aCѱ 'o,vF-$ƢjjɯYz_A#0Χۿ]w۳&G M ɑorNWy l(ĔQt$K=wmo 4KUeø ۘ Vjl t ̟N" ulx[qt;yy8=:0R^pNc%-7KdZFTR >],;>gbG)̏WsujntC1\$eY}tRo ua~D\3?)s2#Ƿ.lMdSvknڍip6I™ٚ5M+EVeV떆mfaG ^σ*XGpgP}H\寫#QX M,waog|GBS;2TT*h98Q+]OK#SvJsowBHul)_=gřY,uIILx1|..[D\7C:^;i;?4c3K.wg=^*ղb̸$eP+|@5EY!.] 鷝.fwsmM{C `4XJuE*zm^EҶ5b`]x۔E6ZMغCVWf -I9mˣkW&xM+6ڨCG` ~]/Q.-הV7*Pom̴{ۋvvvdlJB\l|^f3AwNFf #)~>Qxe8bا;4imheJA|\@Va\m*5.3/Ńˆy3߳ KYn6ea<5RkwB*ƀ&(ZU)j{}0F%؇$Ӻz6PP qcͰ !&qg>HFan(5jY$8nF}w HNhoA8/ӿ ==$G[@nG0ܣ@&j꛱BFAU )amc9%ߧSY$q"ݹEp`a;:-&n Qr_0*SVU46(UM UC2eev뚌 IJ ,>u膿nQ,eЫĊ(<+3r |B'"ɛ~zXbJ/*ԉ&/`ަ-HrԎg523Cݰh،t^|z/ M9 xӤX4`8 YŊ1ZO 26TY:\]ȨO p&7P,HzIBAc.PnH{:aTgY:.LIDv)#ب Ztft`ڷ'ѐc9{o")HY "N()cmce,nA)7t&P(UrqP}vNgRN >K<Ku¬$ؽJ=@OBWauZֱXAx4aXn:b䊥5Ro$WRyUC|נќ|^\""H(HZG}R p#i[l!33B3 E)r NgB?6uxU:CUEX険 JYq+e?UO~LB:ٙ#i;^pd?Xͪo2o*LzލՑ;yGd}rf(y WuheZdYg6ԋub1Fs>Fg@97﹓1&RXv*u}˵Rp}31߀'{'OxcWհF7xxZ$j!OE=G}_ȍ'\Le0 :]@ҶT}k4Z]ԍK>w L0f*8DM;?PN7yIݱ+j`sCS.=)dOF <;O8 .FG}n S) 8%'Ϸ>vtѓG-3X"N1_=Ӈc/2jQhaPA#4Z êjln~z~|"nc5X x#(3Nȍ=VYPKթ&m`;uGu#t rN/ǎ;tQ]ɰ7eVZ0A2S豞 XT$a&_ ҆K ן4]t5Cםxu@(Wi;Bn%#sC螗> stream xMVyt$8HtbgTP+`֧BQCp ! M6{;{|Gv;&@@!kԃ>ꫭ Y3{|?W6'ʚxe˖e>~u{`~̟>t~\@cSsKTV,_US mƶ`EVۆ`Wl-l= +` s\T֊'sVe  GQl"̘}:5[z.nc[%P=hXkpW"s.ju1%B+uoWK$W}q͑7ԯ#MC 48%n<șRnZ*{)p %.t]gSnF{F7j&~˾̅.p-?,^ŷD }=c|^IU˟zJ6ON\G/.LMvvFrc;q|Qmpp"=q+tݟJH2(k~ L]&jvH.`er>S%]cWY4JIdƵ4ePOBҙE<øX6Vq(isbwsEg:DsVEYTVV*$J; pž@jp,Ǣݱn@w燎b =,(]#e쓢6FmHT'=7JTeOY3bioDD(2n{-ba#Ȭ[i&Єf<)_{ZtK>; i 0Kt=-Mh5WHN}tez:r[ˣ{: 09vhaV@4!}/sg /o^ abkEw2۸$sx)v.YMT>Wb"eȚ#"\n'{@G$$눻;X; (@A RnE1@qXp?;X ,J|KBfQ V86:MKrfBiٹmFdt|+6hYd+ #3SI_oxu;;Pzt߹I@QVIڢeb*oMsnn;NB P'TMpߜEv6O $? N9ܮ >FMTJDH.$γE@tQPKuJh*?_S׶Wv3=0JS\LlXljRizF#V̀*H?9=wH,8wLgDE3M~- |WXY34xw21G.ҊWh6yƍa2<ʦrN@?Mf!]on7F.v_N d|XTD듦 +o>c BJC:el5''9us;v"a yfކD*S Q]2>[/}\A0&L?`'L G2I'"zYM&!Z- {@qMhbd- m3t?`{f'c_͢ gzV W~FK/qb-:ޮź]}M:ҬDS#x` ?|(IFR] u@ IJqǑZy|a'\uڗ5;i+mɤ RcIJ*w+KZF' ]LݩUᗄ z]dTXTp0 iՊv\-ʰ&ݕ&fڈ\6v['dݭmp[DEn]юbvBIo)@,~y44C+a) X\WH${g%N|B" (,߭fQ;ldËa};MLh@a'cSw=^' }vDHZ㦅e~E1bw>G}Ue >u) xla@IxɏCv_54!cqblQBWtW 6/:=ngue"’ }tk !w.=qoGdDzwlKѫwfLhܖSYl"m \5tH:@eWBq;rŰqendstream endobj 116 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 8508 >> stream xz tUo"(MK`*(;Ⱦ*al I:}߻o/%KADEqaf|żn%3s9&=Tսw zΟ2#Gg׍EO!sw~G!Y2acSD54%oJW͔%_3{W.ZaQsϿz塣_yüGƕ>'xճjxC""󈇉a|b8A,$% b"D@$^Å xD@Cf_zv0"'5׹G9w=oR;T!Ҁ`}wYCo 5`bܯ[8z/>C}1tPCyx?gF0B{oGn? ~=[zv z`5O ,BCE@,׉%Q]K=^)N&4FhJ{^GÏv{=ekd#(z^T\Z.K:R@ 8)ir.iSxJPH}0%jn/b\R@ƖP 0@R5ԧ-qzXJ#M4p"HRux:GK^IؔRWJ,bndK,"&*^ *L4y3 UHF/4vSilIAp1\!]UC)wP!OEC'KRKf I+f4-&vQhҙTjH6B+Xb_xpm162 C ΰ T@Hi~,NSdCdRlErPOWOX}C:y2$=x-Ht|drJr//<]E@&J| zgo<5!\g&ΡW~<KMUQhPj%:E$e3̽ytf_?rA_QUZ# ):vS%@"tYc<=lE+P?b˧voΡr6/Dg Xa/d}B B? +o~f ɱ?=s ¹b7CK u9T]}\pBׅQAgo Z]~A"yYb雲4j`#kOM3sَvyV'h\wAB(4Z ̟Pz:T Ӭo% ]s@Õ2*B.;N#ֱ/άmҭiq;V;МVZ-wte~ha`;P:K~YY]ibsML Ёõ:'0A; ra؞eJfèg,B`acm]鴛s\A(N*b@a)lHo` r Nq0݁.p( {7b>˝ :1)91S/챒5adkgܴO5Ie:Jg)4oU+V \$۫9JbЋvTYqRR⦘ͮIUR)A]@iR-FSPO\toO mm!Gs}J-Uz>|yl9b]i[oչmY|G] 4A* ._;9$'B1c8i~WKo5V䔇˗JP -FGz}I5ZWvEu<6҉@u9t_H=֦gJ~Ψ+GA&pC#V3Jw'O^8HXK :L{0s=Mv4u6GkEeKAerBOo^++a'c#lhߵ#S,aE@hX5v ??s5)gp%ՓjzyEIuU#$Q:I5ied\M&~WΠY)n@#sYDM r(-gO ijZꍵuQyHj'%in'.΂Tfi70{ ~WȤ2$2q1ŦzEX<<<KeMMM]z-$奰}v5-ʨ;I]:wy4? }0](tJ,VAv!eR)VSy.lYRwq>ܱ盃_ /t mXS!?n,DN8y !8=! K5›;pWVTMmzRҦ~{0IHD2:@[74} cŖfgjEtvtDx$񞣚fFG;JɂX&^3n{>]j0C3tv-eWndKƟ[~p:Q}о W;@*(]t5P9N g] & phOEzmK{%$YEYI8!DH:Pߢ"VŨT*v#S ZM!I̝eA$eM\vGQK{='}gQ_w@klڜx*iTWJ#&`>"Fw9E[;gw o;V?N5G[P; YZ.@>- "Ο|r~L)W^Y+Q򍆍|mK\TfT^q=u&005*,E0R$\΋`*-/-L&&K{?v zN<Ї8&^h JsBѲԵ:Fׁ3N-HNRV"hSwBI}F ਇ_PiTzo#@+t] p%$zӺ7 Oh2 [Ȥʫ Pg6n0,I & Zp aq Zk+`1{d & -]\7Y2ܝ޹e ,Σ ѳhuovbßA?lѨc{i߇#*S+VWArÿѦ6 g/^3`ǔ~r94GR8gܭ)BZ-UTq`$I<"ހiY:@d//.ioj=nδ )uUdV *ШQc̨^'23%~'Eaqhl$kf4 #/#udcNB@U$]>ZkʒSػFY(>Ox1L͟~裳RF։-a΢bIXon:+9vx7q,<)L԰w=q\rGNI4֊6Pf^hi}?ɝ2dѥؗTbSTiMw*iN׏٠DF@2Nt:G5qIQMnF|G(vbZOn5ФJv Z|f'p' =ևZ(r'hsX76hwv}Ջ٧D0Q6ith aejJdPn_񄛛I=.9)lNeST\e1xi,8dԊ1CfggD83FDnVOQ¿n, S8ފ:O+94 siC5;]h*7pŽ㦘-m$\IWb7 mͮ6r?H"qߑTpy\缇D[ ,5jsFvP7ekjq]Qs+ zvwߟء]pcV K0KUDݖ^-Ȉ8_n)&/sqv|c;.Hq}7(G!A%NAb"[dz;:F"byG}o#=0 gʕ܏RBg(Rbk^PltN霥G(5H`9YǨ9jG?gZr[--sحL=_j` N@6݇7]~!ǂmjJlLvamP[$B:Sir*m gvHپpg^y|rjg()L䱆uڪSt^Gk*ru{G;O"(t`ە}ݙ 4{af iAV历47rhZu2;gQV,P_L8jk^>-FZ[\[^pTpde@`|i`Yy`;~;@2wpg7҂7B8^v[dnd;"e'`tllGo G=#H&Ig)\M? F#4i^4hvnr6wwQF|n(c4ccCI]vm.;$񛓷zIPeɪlq`^R}b^#s`a)6lTVWf6k;9::9}^Ioиy2J|7ҖUMΝLS`o`H>nSWo碌)lTZ6nt8F75DUڍ4|tGP~n_ؾ;(a.avȏ_Ğct(* B:ui\x\MeSBn.?z9Fh\ u~)ЈU{9Y4J8kwj !ipCҾٗ ~772 X1 Bbz,8FvMVbo8CL=op*!$FDiMR,-hdy,_ܪֳ=n$?"JjXKNyA;j}^ 7[|#(?,D[>Vʹ6k_ # l"ƀ5hX&V.؁Wb8}ZR Veax¶ca;TQ{gpWCDb)VXS(ʐ2j#?\N[ kjҵ;܌9v8[}@̏Rh0h SjΨfVLZ3i5UFUƬ_.b~҅!Dc _'v赃4t-> ݛJPEb04y=OJ2QmDo cj'ǺUr|-vrO bA:OE_+?r\?PyWz@*"8!g`u<F81_/*}wGy55$jBG痜_tQM37R7 *? vdC!e|+F*Oq'F6G!oЇe:ɭ6hv,q`Aw::ʦ@5TAå#pȾ {(NkJ ba4FC4Lh9=~wxuzfJn g\^}8[X}KOTmsYG{z پb=}W+0YCB#O8H}>?F^!UW  4C=Iw뤑}T`]=vzfb)J=~ NZԒ Ll7uK(a7 Pp|:3Y1঴zح }/fHlRhԭyYp`Lj:Sc=lƮ)M(QrQ7 ؂?TĎJ:~o1n6V1@Ƥ%,rhWNDl窥\r ;Ңa.Pv!_M2p CT3J~GF_kq6a'HcJ>T akpv +0B顫V=7U {MC8_wM7mҩ0/8 FCgr^%̓Z&'5bkEj,EZ?qsJ͌{\TV^r8b:N{ڲf1 wCthqE$-Jf|L?ŰrGu_V4o:%u7;SEqrz8c._z]m\ R^bf9a] ]ۣq&ǂ#O X8㻮}z| jVԣo<^MpAŞ%n;G{>[5ŖlƲKujHYXO},Ytی+`٨[}S;,u tK~Bԗ̋Ch yXͽ; E2f&A 'zuu"XCn(U}xߣG*O/30y 7`%cٷ=X3BWG1emU,*HzIuendstream endobj 117 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2921 >> stream xuVyXSw}1E-iEZ֡_n)aGd_HBJU QV[qRgm]t_s>E1L?w9sϹ,kb|+#_h4= 0 G^9d󚒑'$& OK`?laspl3ۊVck0>}->ľ6b~DlqױL`bYO{{OVouD y7|/|,#lqY#uD}<P bptp6s,G 8.sP+ys[(* pwڳ`-|Lr˛™1e{eG~Ȅ&Q;|u~4?'A ~S_@傋pN)p+jhy t[jNt;]p\" tg&e$ jSc.4w">b_x#[Kc.*+h3@"4Z~'|ka7Ho(oJrxݺ"yQn cw 0t^= dJ W;?|EiT2/A4 ԄXV ɔNʈ `'omREqy1ɹF^4K=qtƅ=@;+7ᢧAQV y.! IBԎKp%b q @RoL+:4" H?Bǎ"S]^4=%~T/[9QWFCacc*&RKTF*<Tj(INȴ2s9Pa0UuH OݞY2֓v_9JZ8Mw U%e9*=t=HNEe.),B %BD'2n8Rt`G#ՅDOKB~8'~3TsOt=с0DWj(O,]):LV4(ӟ&Y=6qDؠBH225YW+&(stqpR`wSm TJ(H9HPYqQ Q/@C @l6r4^m4YE<|ZIz&͹HȌ|u^a1)b ~-Ǖ[.fW7TP1br,$Nu;*rD' 8O7Q-3F ۜ,5dSP)mV;8Y f,eM-f5YAX7n[rOɭT[߸/5KGd,(TJ I#9&5ޘ8ÙvVlLJƪH DB\bHIn%U &pO]?js("( ^PsEJCqaۗ\m+ԩ=\t?ZFSh=Γ`a֘7ؔ`b]ڛɌ^T\L.L؞r+A7ٛጡDW%NGW3!< Wl30"aeszKoomk?BDUT))^THyt QTFUPqhfPi0C4BfVd貭)]H#m&)mH3^eWP2ԭLͯVO{L=覊HBH5.a[").R&9hE/hm(C6i6Ε g,7LZg?\{&oINQ6kzDhCVj侇cUhubh6#EH&igytg=.q+ S\K5F0VUeUCT\^y. 4 .qܧ~ ټ'%/^&|R :" r˲!1؏_;q$}.~14ۙu`;-Y>nfJg Ɖ4=h6U[8 aP d*y4 "x|Z=51:ܟiOe h47}?9 &h֟IFա"ܹ(wJ(%Ԛۻo_ownk*4ˮ\> endstream endobj 118 0 obj << /Filter /FlateDecode /Length 2631 >> stream xYYo&xAAD1o"[}֨i.`W摽&j^Hљ tL>\Q1a+'* ~KJ\%v9'Mݖ pc\V]Sx,FWi m-7]eu}h'mWtUo=?46+neCn!x,< , luدHu-.WoӈTc؜ޗ2[4v+Ůl2Ռ;_Ss1zIBޔ`oUMXB"aI7i_;*tÿeȯ)ّhy4F7 npFMZIjP¦nrh]oPSMtV*n|SzPzC:#MC&D+oȐ$r"(Ŀ`BN rO{,q<94wǘagG*K;7c>" でlz%*=%21sFs BidwEsNvM}W3stc!j"O?Rg=z߈u U #KxU& FZlɾ]՝_u#zV\NDC˫'1bFIqؿwɀk ޤd0ti7MS-*o QH  >Bq8=mF>V %ܖt!ExD؁?t_W 8wvwnSaЖMU&'%:/"O!S/wEh[kB`Q31cJ`rmus:P,#S OAٟ\ kߠ1=C;KbM(Q<{0wFQEpfTÿ 9P;0Im+덁%|Ж vwmۑz>6p68eP<d҆8`K頾'4HȚ"A ԇQpL;ce(J1λmz>Fv8TD7Qr{ ?1#I,w!jDXV5%ƽ,e>nCjg$`!/+~NPs$pZŠ.xONJh6$c@ޅ`"S/!8+颋 dE4#9FhuA0I&cÛU+?; i͑JǗsfŤм}ʍߌ]˄DOVIсFގ޴F3VZL :ߊIEy̭+"A5XЌAؤMr>j4in ڈD2;|N3.nйM B<>uԷ`1&q'\lh4BCjJ? ,@RvmR?S5 X)0ucGhn|Ki52'ׇ&® n:T汎$cX*}v߁xL}pke}jԍy?…"{nfvWHOOKצ]47F.(~44M wuڿ#&x躨xDx[0 V}>p40椭vնhQC8V[DySGl"hAM+핔=!(T4?=rS$q?pL'=o%༟z1opf0\r{P!a-}@@b-A n$>JCxJW~3Nvwjv )oq@gRuIpCe h$Ez\%?M 4+᣷> stream xcd`ab`dd v 1400q$2黲!{@Q!=?}>0c]Bs۟~}O&ђ >S{6us,]@~*}&3{ry%|r\y8T5Kendstream endobj 120 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 142 >> stream xcd`ab`dd v 5400q$baa]H~= Pׁ? 7~H/(>GhXKdiVB~FM|w> stream xm[LegetMX43֚4iD]j"ܖ-ea,{e, ЅM4а^Z*FMR_|h5NrN9! u AJ=䇩 u^{Mu } %f,8O" D1Q@'R55MNVet1OVX{AChXQ/fŠ38SQRW2vpϿ4?Z0N`ri NwdbEzls@X#s'ٺ/2hrvt>/rF81H 7 ݦ6Mu8Jq~_}[ ,n?nC,8/q]|n=MkF (%LL? x.msS+r 9Wqs`'фJzYJ5+px(NƖ*ʕ3kupn8r-6ԢgLh[/>IT>o-kS(4(kÕ!XC3LtW SZT>m({" 8>$ft2EU'Si,NhAw4:Pb{e uڜs?Fkg?ؓ/'suDy=}T`,;7|n'XC >՛?2 Pc5H `?ߺ~UZ-stcdp]EY]7ʕӅe5 kr8> s-KU&KKc<q cmgM&Pve; QZiHDž>CI5'1veY訢SYW1!T6+Ra~}\{Y{j{]y@:2/.nf74TXzJWg iendstream endobj 122 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 403 >> stream xwCMMI7]  AB"#>TAb hUkqP~w #~g:{P}uҏ{Q3xx}>fۺŧ@Ri>z~v|<J! ׋>x~u}|,He:0/hlhMQ(&5  7 7endstream endobj 123 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 383 >> stream xM+qbhՔDZ$.RhصE]}3e6f8^)$),98 _IyNԇcq' DZ.d^B֩'5,1U*ebie*bspüۃJێ}Kzb1 rFi߯ocj>Q0`5C N0`я-XCΦbj $vܤsoܿwC4xX1vr*Ne`Ś>.hkzIXZKocz-I.awQmƄyc<$X J*TXJqT}jn{+Ͻendstream endobj 124 0 obj << /Filter /FlateDecode /Length 171 >> stream x]1 EwN@:D,钡QL@ }i÷dv.:o.aMay8U*]U|"f@ޙu4&'$mZIЛqqθ$8ɪFsr0ה ^ -XRwV5endstream endobj 125 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 194 >> stream xcd`ab`dddw 441%2黋@|y%y9 Lf YltY>w?~ZN1uFm}Gkmܟпk;;$'Ϙ7q$9sWmf;OUsvϟ_]%g#[Uewy9|r\,y8}"Fendstream endobj 126 0 obj << /Filter /FlateDecode /Length 3363 >> stream x[o[pa+"EsmQE胤F-L|Μٝ˖UA^gggӠ&=(ON=>?;wyIqSRf*O:|b鍟b{ݼb4 v4'ZO{=}sr˿m=)0S|vSa9(G7S!/T}7obF\,݋xH_mkzv\SMJb"v)Wjܭ9dǹ┫H݊ I毩NYzx9QM1 FE8hˤ}7zp'[a#_OtRi.*A(h3ܞ|SSEJ>HT5EJ fPY)FIb՘mH+#:\[(C7$xROt)>)""Ň)$[ły (5S!R.*tMgM6sGecdX &e`B(R|tld?iQL*ʚ8yiZUNʲ`#+޻e\xV|uBCM+ޛ)SìwPGGHf3Lyc&ݵ4 ؋+^)Z~tVBOSwJWW|a<8 UKJH YVO`ȲGӍ(+2Xߢr8xy6VeOJ:tH5F6%UFjUA5\6YB޵Gazu4%h>^-:4zxtV5 ̨lsStpn4a㵪Vujn9B4f[` ֢) cr2D?=|i)YkMcMm48/ #Atj47P2|!B߬^/~/1 !@g  ._|ݺG9L VNroZ HPp |yR(k(ގa(UVC1o ra`!*wz/+NASkuّ1u7BbZ.B52<1) w P\M4EϡLy^|$ 'vSm/Mh\㉦3M5 ]ͽ+{$J!(9(]U%2DS!BݼT ǔ KL)X]kDSp[lMJ3.t+8fT#,Q>XǑM<;@m W $E Ru A`( I'SYBE8AGI`h"9#)R$E)$A2e $T)Y- Rfbeb}))D2')R/S+H9e%E P]R"9$XA*r$L%E RsfGR UӱsWBE%QBX@ե%B DNRKWJLKX') /!R8Vb%(/!T+(y9I(aEۤ{* ĬjΉB$ZCT[+˹RH:J">Qԇ m[h,-QҔ?.1L~&="#N!U?U(V$ŋQHCXT5zV$(V$uo1#rzOA}dP%&7EQcEjȌ+TFDX32$Bî4#1> 䴞7bC#Ek)-lgwe e-y *Brׯ^/"v/K7y, dxnoW~/Wl?4w->_0_,i|Z80JƌPZfK? ĭ"%ldNUӗ%jjW/sBK 'xEnshjZW/t~N;ejϟziWzv+84\a!xS`(w{@ѻ5?r'p\߬80Оqon7ݱox06(gynv;DyiEX ez02aз/#^nsv}GKbߙ|Z~~>h,4  n* T_JU'\> stream xZ]oc }o胚UG@Zh&5q[k,GnC{n,)gȫʌve_WVng_cM.n\ .ŸU6inW [_GGc9x;<Λz͟k yu竛^?~nf5TpoŚw61;Orw7ko'Y? Ӽk;+c!t6k=Vp&ڝ7u{x{܊/oj:~8V[<ϤUqt_c6)nןS{y]h v}/˃QI42ٝwh͇I'_{mɹ2|tRgDޮoNh_K~^#1Of[ҥ0L.D&'޳|Z |pVɱȂc+o珞ov2F(8+|C=myʔi0|*=mwkJI渾0nW8lr\8)eK~TGVOWrd|8K|]HuRbBW, ơG/I@GkGa t,2P, ˜^CG K+ ecqe9h$+#LNN uj32'm;笑)s'Fd,E+W" (e$\B=-84L󸅣dDeZ&04)xH%qyiEn-KAʼn(" ]dR |&B"ӕ%P%I)bo%nE8^ &9lÎEe> ͺǹBf,$ H oP_ G2d p$%^bp!EN@9]pB``FB菎\#YS lT8XJKExy0HIjw('DLQDIg(#Kmrp xJd# ^.1؅#U9^fE~ O FΈqO<bLadrE+e2ɢg3wmDΡg)g&2t'#4ܦmt=1rpA1"rZ*I<AT ߖ*jыqǤz3" D QvDoNS gN-  Q/ .49"+(9V唈މj$A!z3@ Of]qZ]Sx~  Z= ا')(%Jpѳ;uvҴ >A0/w(Uy"EvhjtvTo ׄ"l{غa;P-Yn,U(i&ADf̙n^pB<67u6)YO؎29LrrDz)"-2XSMz_ ͠~jA.Immˮ m9r< JKR(*) XVہ,Q;@&h)Gn4wV,O;iL pSM-izp6 m5'}0ɨ pdPisn(9DF%ӖH@!^3^4/_@cY(sku|" II8^63Gd_ͰnجCs-#a{ ?4wr=Dvl//]I4tolL1b7ŤevT-)jV|i>m[#beI6*f2юh=$)rOLJKv8̖v0b =}⏀ɱ4-7kX?sWp;fѤHHYwV/eendstream endobj 128 0 obj << /Filter /FlateDecode /Length 8069 >> stream x}]o%9rᢱ^&d&9 ÔdlURw7'"xuUӍEc*g2x>P?w?C;վût:-Z͇ӺlwWxwxEoX'-XOǗOۏ:So ˻wWdU=/^VS9l=-QS+ʩ s>RkٖS݂sTRii!ik:8T.)oQJ93Iյɣr&>yT$rRK}SR,S"mNڨ-rjt}:)_Wz9iʜQc(%/joiMs8jƥfL I 5RʉR |ڨjk'$ͶS.T{ǴQ[^~Ye!3nR)שnM֤BݚխI5)[ ukRV&֤nM*sӚNn*u|\Sm];qe>_}2O%?^+P ՃJPf\L7J<leNS%l_ixВO9fW7u?.8֕~Zy=kd u_O!SZ^[)6 C6.^qE2XFq!Nz!W2~JȊ0( K(3٩!074*R|)gK݀Ҥfҹ#lT'кXTV>*] ]TuM:1_Zk_h]Vfur/tWA6:ޱf:EuXƫD4 -]ʫZ6w=(su .מP*uKy*JE嘧W= 2xG^e1o uyCvP Pz@ڨ$Ue҇eU @Fѡ@ 7 d(vX dbf. rLZ[~:Bu TCR]Ta U0 0A|R]L=op1j_%e/!{?է5o mln;=2%Ft\T R묱oW4tciͼnp\l[C#u}eضK~ˇcPSX+mߒMP-oj^+%Wki՜N5|գLk]WSֵdO4Lk1oثZZ[J˙Bq&/yts/'JE-} RgQKq:T6Z3׶q&uYOKRʙN}R$EM If ϊ z\*cSrqH&gGq3o &Hy1ώoƑm&n2ï;H/N-X?>>ކ̚hq1RxLZ-'J[9 R5S2|˜k'Hi셷yJ71pi:%ۖGQ+M~m$ژn` pSKt T܇Ь( (aa΃s[TtU8x3md> DM-z74gqDich(6ziH`uJFaPR ILX)zXe ;߯rtփG@}+|O-ԍ1d!Yw ؐx?86ԥ/`C]0j PT:6T:j*;>ذӦ ;3Q.멏;82`CPg@ [uBk. 4F30g1aCRl62ّ!=BI!eSՌ+@ 4Fzcdu)oQhźؖzp]%$,LYDhXJKа.ݠa]:g?`phXа.V}$,JpGO-@C2WXFف@:44~f"@Cn4h9j>]r(B,xE%]Ɩ|) 7OΜ w`WV7`HTɒAҲ a`!Azz8|,Fu;&СA; t {fH=[pS;Xx$spD!cH9QشRS.HA/zh79hRfCgGb9 Â|u € ZSx܋ SXwT-=| z,$yTt(Y3,j`aH ZgBFXՀa>R !bTgYL0-?˷v?0Z\Wå=8:D@?0^bZJ) *I(^"m{ e)D]A9 X3@$1-v-8JhZ|8F4p5#9I&c#9`D#F @Z|8FHǫnЎ]QœGĈfb *#[rt&,#&Zq1M|0"$0bj$$b>cD~}(tĈ*aQ-->FL|"&Ʋ{p!t& Y!0U)K`p|(6CT QfDS: j;' B"X:>T3 A}G45V} tt":Hʴb0 "18.X-񬖹1 F`"UwQٽ8L$X36BY*I(4 GNx x7:^:EH JXb@9Ƕƫ[xahbޝqÚ5:EHXj,Ëi4.vȏz8F\W0AbᾯB.A~Cpx3͐5,48P J;NP =<i5j~opt&a`a‰ -:DQԳy`@Q! G@ym<`>P$%,yLX1Z[{Ċt x<ױ+BBY0zs&Pű"N#:`E@01a*+OXiut&H,+tNJEXQMV s+fnM* |o2;T4 fbԀxF`),&i:Ѓa10D#d;0 ԍ. !+ YN4L_u PQ =K XQU:TԉS2)jdD4ӄybi {Pb@-JQb珁~*T@000:(q-GhrgRȈ! EDrk-J2D FQ"_:D9D2Á$BP #3_-x:@D@j`aB+?[#B>h l!?X0Z|.pb_Nݎ)*aA,f|He['|H~щ?tUTПZ0Z|D|O)|Q"$Z8cMr)grJ;RA5`tgz jV#t@00g1cE~޽OX-űbw t&$ GĊxX}Be3R"$foFV~4!Z74}d;0 A0̜g$.aaNbFD_l Q"$a(ҎXG tU( (aacBQB^ kUӋ9.!B3P+K$",I 9G#AZV.UiN#1hXf@6Z8K"nWHdZ9܆i.]$Cc2m[V .=gU/ǘ#LR!ȗ/6v}#OX0z׷~C1{o:I H50g1կgfĥŃQ^ $@ah8иͅefA)β 8,8 q[f(B5JZ^`HTA}K""Ts 9+ XS2`BTŠS-zy_qzGт0 D SSZbV  a[iYbV|@mЖ14,@p!HXjab^UԂea[qYbV~!--UeL!”/?na>3IG/u2U_iS +M`tצcfohJ5 D ssZnAdjrS-mG#DE GG#ѷܬ!% JZf`hXPGp!@0'q7dvZA~#Ïc+xO7+z,)k|.yӲoǧU/ʟKx51^|}|y~]?~Ѿj\ZkCwOI~x{w7i lN9*>Q>ގ^ew+ͷj\ߴJ|=?oL4_ٔWPT)ge@-_ڴ`oG_e˧ߧeWO/^ m=T[S郛{o7BL/#՜Wnҿ{L˷9?,UGL0Y2mWZaUw'xHs=j}7K?BQ{0׺2!gzjC3|DB@BK#x 5xVh>S~˳&QEm)o|Mo*bJe|qZYT6E?|/?PiX&hʍ8G#T )U7z[hKr/AV.5+ /Z]N//Ddo_ןo~O6'vwY/2.W$6J>}y”Fޜy/dlpSS[~ V?^?endstream endobj 129 0 obj << /Filter /FlateDecode /Length 6155 >> stream x\Mqݿߐ] gJ\"Vy!{P ^I&s3#W\.>sF7zz1W{1?k`/bR~xw&S8B_WRN~?y0?Pg]n_W/}hVȋWgHWkGYv-9չKjsHѡZKVe>= ds믮ΠNYW΍t^j65-㮘mMəl.A(,rg"0@ߔ0%*<{ qjTXܦ\gp_E~"PbmW2mbf= 3Ba 0H­ \Xח-A4-1gZcVC|䭨|n*0EĝpAM Gv F9f*F619`3`F(vl;hg?'MYdv_t&MUfĂ FwZn d.BEf}C_,M%_ tشP-胮j8Oo] Y?\9m " FPqg5 J3m):2ϯp4cm |Ἅ<,mZuQ$5+i`yvj7KY-Lw ),F)vL(^0J $k B1sdj>GSгQ8 /#[<AyP `6aZE;.}kEKd`ӺʭM )<oJ3PWP?]p'Xt_UvNZkk0ZkKVDۀnɡgUe:4ٞ!{ ߔl/`-+ 5îy:h!ht ~8i91t7.U^JUǖ&9YpdU Zb yQTޔr%g~H>i'`_qIfdޱch6٧>=РA<Ϫl')|kKgUŃcM6OL2t[C;ykh-Ε}Si#v:-b}Ƃ53,}[UW[DZAt k꣕ E@Zy=XAdGL7#[ř AL\r`RBw/9l 囇δ)Pџryy{x4O/ c{ 16,5[4?|FE &:1b[`cf 馆L`ǒP~J9 c_ǃ$q} aJ0z,0<%2ͫ.z$9xP5!9B)#<]u>a(X=@X?mܵs /$`MYz€P{'i)NĢn`ȹ dqel{ DfGF e ds~z˟o억ow7r֮8/\\āwWox)=G 櫎9vw`6q[NFϽl>!X[5]mXL~gt$.Mg|} @Ǐn? +X.[ZjuI2FN (Qc[hd+3~-#b["[>(R&oٸX*t'.x}}Gb8|ݣ`5O|@n6Pk-'cf3{E ~M\kqzJa\D'v5#58\5d9;6ʧn0i XĬ[=og18b90(84sIUl]oR 33[eOs J|1=R \ϮZ}B4m-U_p`Š잧Ł擵N҈8᳄qm9 skqze^ z`ҺA9,$x5bS& yڳ\fjJbn$]=&t1h%9UYH4zϣ#̖Z 74p2(d81&mg}cM$qRlāΊSlwRlI$ZYSl$U#&ۤP~5K#tHI C[z8^RB_#t$%؈%|̞`#>ql*XV~i`sRla^T>v^+NRnfmB_#wV!,1FZwȯc~52p*kd =F'uH)k~yz-2__^g584}Hgk鵟 >yz;Ğ?>+{rVpWdF}{8imDc-Efr2llMz;&4(9<|JnAr׫RJV`Jb{y.O5 5xpZ_|#@:Iwh9,-\aye!9GQ.52NEәlؗL=/o{w hr$7EAƪhrJqB7 .I-NغpN`_/OL[oN+MP Q[_ coLj i7;٭![ Q4hKie4w#RF) 4(Э@V\0Рaz4q؏_0Xj5$eKx@['I8p%GZYџd=5;2mC y HT{URd`gE0LfE |A *#5'`qć{ UC^K)GEҔd^{H^;vYpb*i233 Nsp#̪Zd@&}iU|4Ķ'Y!pmAi+8y$Y#pBQ>B H5f Vc3fbs&4-T: k:4H h3[${{:⨖"Hs = s\9[9Zyx6sˀ0ٷ.ɍkN*ԷHP-V[~i޳VzatkIm^OFX!1{ 1V$`+Ў xJ6| ak+A_w׉dG.A4Q9UOۄ( )cCJ% SLLɜ&Mm`b]F3* ?;N0G.#ϷkXxrlMfB8 7YhB mdc=!fpxk佺 jj}0Xζ5[[a  >[;Vl )*Yn%md&{+i#k讖/C ZI9" rNDl%m [U,R16vW̪t#cZ-kjf6fꧣZY܇ -vڰ۵VFŭЩf]6TIj/6K8R+je' mr+ێmpl^܆5K:ZmWカ ;wdj{غmp gm6<$X$91MV܆'e˺QqOSq7+C+FqWٷVq:#4<-W;6Ԝ2ϾAx{׻߽Ui|.}w χ*f{l❴ A~hO6夅w}꒞5ku |Etg-Bǀsz߽r~<͓R*S>!^&JN= ɇN |J{2Dwopb ht?-jm-cd7n=ij =^[xf1Sf28ᔙg' k{('̜GZ̜3a9Wf <:,l{i9c*{K*.,PG)ORI[1.po%裎)*2T{tg*:z,!2Uzc(*I/#q˷{cu ݽU&VVFgc _a+'1>V]νUYS ]0zoU$1lCZÇߓ-MT~o$MφGٓO.$pquuYu_>% zr#'ꔅ,;EMw#s[7ƒebel,alqN8.LLLBRu#a lb?VB Ś"FF-D ˭inџG}jىbO׳tx qQU+bMjO|p{K{kbK"m.}/ٟto>o'Ƿ7omO[I'=Rtxk{EQmUNeԂĥj\nJ8ڶg`ˇgޗcDEN$%b3sڄخF˻qAWOO/f><&?Ê?}log㛭e=qx&Zͭ_}kn?||Ozӫxov<>SǷUI܏1ANuπendstream endobj 130 0 obj << /Filter /FlateDecode /Length 4404 >> stream x\ێ#}7AS+6更 08;Iyjfh.q>UlbsgT:E/]^'_k%kc\!^0Na}N?n׿^kkv56-҉^ w֯W}٭_w\c+FUk qB!߭;pxOW^iA:_l+^ddpàzeׇիTLl(@A螁Ql -$Nl a=L9Rv|A!j}o|;߮Z "&aB!n3ɞWQ[~W\Qhid/fbȟ+bЪH"{ ! YVK}*v&hR# )[xI^F,{ 2yq"'Uo8^,Uⓗ3}8yyX!bky8- =5-[adJKcgBS5T9 T'a !gh)PjaJe`QRԸ2TcW`+zLC\ܚ+m}Ox6#x,ӭt=n6m\[+k#qqqR @3m4H鐿1Zw=~=ޠEAS>ly>"1ؼqs%軷CnCݻMʘowRW6P_ O}m@Ɖ«xٛ-x雮q|pPpˁSC1 Cj1Y&T>Aٵ{pxBeKR09*Y l)PV+ s0U%˗3P={g`z- N|;fR&}i ƤQHy7OF,Ƭad4 - o `*8 m>;-\wV ȃ P dy/g>:3GR. y@Ja?6SlBZ+|<(̣Jdor b_!~fUB.(%ay!t5k||G0D€Q.74ANB  u;Ӏ]5`iф" G1TpT Ce CM(X96ݽ1~QKFB PP@ a@g çi45h(eIm[^ 汜uUHr] x.!>C_!5ĸPBr]\J&וѺ-׋7k =a6~7(*|!mH9d<>HITrT}Fuf)돟X}BY6Ez&oj|ë*Y T,[ڪfPq}"jWՎeK~@ig`d)PppT(om.Ld6 lQ5ͼm- xM-k>MjHC'ڹ w+k|&,a;3۟;Ƚ]|JŌ:~Vj/o^w÷pG_Wo^/?pտC7<2cR:I|`u =펏痪ϬI,L9~ލ saI%R~"^)[t=N9b0JϞ1(͘!Udw 2΄н 85c*qL?-# jwOkp^ آ0:Z?X~`VSnw̏ 7ҫX[nQRzS,}ySY_?n6yOQyҮ\9#d\[-q, qq=n\qpoKt!uK-RW`rM\ޝO߽xqp .S c>Ff]߿= wi1pP 6eN Xnv˽wPT!޿)9{la}%ۏgNGhendstream endobj 131 0 obj << /Type /XRef /Length 138 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 132 /ID [<20f98a0f9a7d49c513c99bff2da44021>] >> stream xcb&F~0 $8JT 3ҕ,ɝ"]@$" "9;@$+)S# RDՃEIF`09D2~`,z - &e@$o.Ad(XN\ endstream endobj startxref 104378 %%EOF gstat/inst/doc/prs.Rnw0000644000176200001440000002004514646417261014426 0ustar liggesusers%% Document started, Sat Jul 3 19:30:52 CEST 2004, my 37th birthday, %% while being stuck for 24 hours at Philadelphia airport, on my way %% back from the joint TIES/Accuracy 2004 symposium in Portland, ME. %% Continued, Oct 28, during the Apmosphere mid-term review. Oh, shame. % \VignetteIndexEntry{ The pairwise relative semivariogram } \documentclass[a4paper]{article} \usepackage[colorlinks=true,urlcolor=blue]{hyperref} \usepackage{alltt} \newcommand{\code}[1]{{\tt #1}} \SweaveOpts{echo=TRUE} \title{The pairwise relative semivariogram} \author{ \includegraphics[width=.4\columnwidth]{ifgi-logo_int}\\ \href{mailto:edzer.pebesma@uni-muenster.de}{Edzer Pebesma} } \date{\small Aug 29, 2011 } \begin{document} \maketitle \section{Introduction} The general relative variogram (Deutsch and Journel, 1997) is defined as $$ \gamma(h) = \frac{1}{2N_h} \sum_{i=1}^{N_h} \left(\frac{2(Z(s_i)-Z(s_i+h))}{Z(s_i)+Z(s_i+h)}\right)^2. $$ It is claimed to reveal spatial structure (correlation) better when data are skewed and/or clustered. The \code{cluster.dat} data set used in this vignette, from the GSLIB distribution\footnote{F77 source code for Linux, downloaded Aug 28, 2011 from \code{http://www.gslib.com/}}, seems to confirm this. From version 1.02 on, R package \code{gstat} provides computation of the {\em pairwise relative semivariogram}. The following code provides an example and verification of the computation using direct R code and using the GSLIB program \code{gamv}. The following code imports the \code{cluster.dat} data from GSLIB, which has been converted to have a single-line header containing column names, packaged with the R gstat package, and converts it into a \code{SpatialPointsDataFrame} object: <<>>= library(gstat) cluster = read.table(system.file("external/cluster.txt", package="gstat"), header = TRUE) summary(cluster) library(sp) coordinates(cluster) = ~X+Y @ The following commands specify a sequence of lag boundaries that correspond to the GSLIB conventions, and compute a regular variogram using these boundaries: <<>>= bnd = c(0,2.5,7.5,12.5,17.5,22.5,27.5,32.5,37.5,42.5,47.5,52.5) variogram(Primary~1, cluster, boundaries = bnd) @ To compute the relative pairwise variogram, the logical argument \code{PR} ({\em pairwise relative}) needs to be set to \code{TRUE}: <<>>= variogram(Primary~1, cluster, boundaries=bnd, PR = TRUE) @ Figure \ref{fig:vgm} shows the two variograms, as plots, side by side \begin{figure} <>= pl1 = plot(variogram(Primary~1, cluster, boundaries=bnd, PR = FALSE)) pl2 = plot(variogram(Primary~1, cluster, boundaries=bnd, PR = TRUE)) print(pl1, split = c(1,1,2,1), more = TRUE) print(pl2, split = c(2,1,2,1), more = FALSE) @ \caption{Regular variogram (left) and pairwise relative variogram (right) for the GSLIB data set \code{cluster.dat}.} \label{fig:vgm} \end{figure} \section{Verification with plain R code} The following R code reproduces the relative pairwise semivariogram values for the first three lags, i.e. 0-2.5, 2.5-7.5 and 7.5-12.5. <<>>= z = cluster$Primary d = spDists(cluster) zd = outer(z, z, "-") zs = outer(z, z, "+") pr = (2 * zd / zs )^2 prv = as.vector(pr) dv = as.vector(d) mean(prv[dv > 0 & dv < 2.5])/2 mean(prv[dv > 2.5 & dv < 7.5])/2 mean(prv[dv > 7.5 & dv < 12.5])/2 @ \section{Verification with GSLIB} In a verification with the GSLIB (Deutsch and Journel, 1997) code of \code{gamv}, the following file was used: \begin{alltt} Parameters for GAMV ******************* START OF PARAMETERS: ../data/cluster.dat \\file with data 1 2 0 \\ columns for X, Y, Z coordinates 1 3 \\ number of varables,column numbers -1.0e21 1.0e21 \\ trimming limits gamv.out \\file for variogram output 10 \\number of lags 5.0 \\lag separation distance 2.5 \\lag tolerance 1 \\number of directions 0.0 90.0 50.0 0.0 90.0 50.0 \\azm,atol,bandh,dip,dtol,bandv 0 \\standardize sills? (0=no, 1=yes) 2 \\number of variograms 1 1 1 \\tail var., head var., variogram type 1 1 6 \\tail var., head var., variogram type \end{alltt} Running this program with these parameters gave the following output: \begin{alltt} Semivariogram tail:Primary head:Primary direction 1 1 .000 .00000 280 4.35043 4.35043 2 1.528 58.07709 298 8.62309 8.62309 3 5.473 54.09188 1248 5.41315 5.41315 4 10.151 48.85144 1978 4.42758 4.42758 5 15.112 40.08909 2498 4.25680 4.25680 6 20.033 42.45081 2296 3.74311 3.74311 7 25.020 48.60365 2734 4.09575 4.09575 8 29.996 46.88879 2622 4.15950 4.15950 9 34.907 44.36890 2170 3.77190 3.77190 10 39.876 47.34666 1808 4.54173 4.54173 11 44.717 38.72725 1222 5.15251 5.15251 12 49.387 30.67908 438 4.56539 4.56539 Pairwise Relative tail:Primary head:Primary direction 1 1 .000 .00000 280 4.35043 4.35043 2 1.528 .36084 298 8.62309 8.62309 3 5.473 .63071 1248 5.41315 5.41315 4 10.151 .83764 1978 4.42758 4.42758 5 15.112 .77691 2498 4.25680 4.25680 6 20.033 .87746 2296 3.74311 3.74311 7 25.020 .89610 2734 4.09575 4.09575 8 29.996 .90023 2622 4.15950 4.15950 9 34.907 .96043 2170 3.77190 3.77190 10 39.876 .90554 1808 4.54173 4.54173 11 44.717 .75545 1222 5.15251 5.15251 12 49.387 .82268 438 4.56539 4.56539 \end{alltt} As can be seen, the values in the third column (semivariogram for the first section, pairwise relative semivariogram for the second) correspond to the output generated by \code{variogram} of package \code{gstat}. Two differences with respect to the gstat output are: \begin{itemize} \item for the first lag with distance zero, GSLIB reports that the semivariance value is zero based on 280 point pairs; \item the number of point pairs in GSLIB is double the number reported by gstat. \end{itemize} The ground for these differences seems that the GSLIB \code{gamv} uses a single routine for computing variograms as well as cross variograms and cross covariances. For cross variograms or covariograms, considering two variables $Z_a$ and $Z_b$ each having $N$ observations, the $N^2$ point pairs $Z_a(s_i),Z_b(s_i+h)$ and $Z_a(s_i+h),Z_b(s_i)$ need to be evaluated, and all contribute information. For direct (non-cross) variograms or covariograms, $Z_a=Z_b$ and the $N^2$ pairs considered contain the $N$ trivial pairs $(Z(s_i)-Z(s_i))^2=0$, which contribute no information, as well as all duplicate pairs, i.e. in addition to $(Z(s_i)-Z(s_i+h))^2$, the identical pair $(Z(s_i+h)-Z(s_i))^2$ is also considered. This leads to correct variogram value estimates, but incorrect unique point pair numbers. (Data set \code{cluster} contains $N=140$ observations.) In contrast, \code{gstat} considers (and reports) only the number of unique pairs for each lag. \section*{References} \begin{itemize} \item Deutsch, C.V., A.G. Journel, 1997. GSLIB: Geostatistical Software Library and User's Guide, second edition. Oxford University Press. \end{itemize} \end{document} gstat/inst/doc/prs.R0000644000176200001440000000304314750415415014053 0ustar liggesusers### R code from vignette source 'prs.Rnw' ################################################### ### code chunk number 1: prs.Rnw:48-54 ################################################### library(gstat) cluster = read.table(system.file("external/cluster.txt", package="gstat"), header = TRUE) summary(cluster) library(sp) coordinates(cluster) = ~X+Y ################################################### ### code chunk number 2: prs.Rnw:59-61 ################################################### bnd = c(0,2.5,7.5,12.5,17.5,22.5,27.5,32.5,37.5,42.5,47.5,52.5) variogram(Primary~1, cluster, boundaries = bnd) ################################################### ### code chunk number 3: prs.Rnw:66-67 ################################################### variogram(Primary~1, cluster, boundaries=bnd, PR = TRUE) ################################################### ### code chunk number 4: prs.Rnw:71-75 ################################################### pl1 = plot(variogram(Primary~1, cluster, boundaries=bnd, PR = FALSE)) pl2 = plot(variogram(Primary~1, cluster, boundaries=bnd, PR = TRUE)) print(pl1, split = c(1,1,2,1), more = TRUE) print(pl2, split = c(2,1,2,1), more = FALSE) ################################################### ### code chunk number 5: prs.Rnw:86-96 ################################################### z = cluster$Primary d = spDists(cluster) zd = outer(z, z, "-") zs = outer(z, z, "+") pr = (2 * zd / zs )^2 prv = as.vector(pr) dv = as.vector(d) mean(prv[dv > 0 & dv < 2.5])/2 mean(prv[dv > 2.5 & dv < 7.5])/2 mean(prv[dv > 7.5 & dv < 12.5])/2 gstat/inst/doc/gstat.R0000644000176200001440000001466314750415414014402 0ustar liggesusers### R code from vignette source 'gstat.Rnw' ################################################### ### code chunk number 1: gstat.Rnw:73-83 ################################################### library(sp) data(meuse) class(meuse) names(meuse) coordinates(meuse) = ~x+y class(meuse) summary(meuse) coordinates(meuse)[1:5,] bubble(meuse, "zinc", col=c("#00ff0088", "#00ff0088"), main = "zinc concentrations (ppm)") ################################################### ### code chunk number 2: gstat.Rnw:88-91 ################################################### print(bubble(meuse, "zinc", col=c("#00ff0088", "#00ff0088"), main = "zinc concentrations (ppm)") ) ################################################### ### code chunk number 3: gstat.Rnw:110-123 ################################################### data(meuse.grid) summary(meuse.grid) class(meuse.grid) coordinates(meuse.grid) = ~x+y class(meuse.grid) gridded(meuse.grid) = TRUE class(meuse.grid) image(meuse.grid["dist"]) title("distance to river (red = 0)") library(gstat) zinc.idw = idw(zinc~1, meuse, meuse.grid) class(zinc.idw) spplot(zinc.idw["var1.pred"], main = "zinc inverse distance weighted interpolations") ################################################### ### code chunk number 4: gstat.Rnw:126-127 ################################################### print(spplot(zinc.idw["var1.pred"], main = "zinc inverse distance weighted interpolations")) ################################################### ### code chunk number 5: gstat.Rnw:136-138 ################################################### plot(log(zinc)~sqrt(dist), meuse) abline(lm(log(zinc)~sqrt(dist), meuse)) ################################################### ### code chunk number 6: gstat.Rnw:147-152 ################################################### lzn.vgm = variogram(log(zinc)~1, meuse) lzn.vgm lzn.fit = fit.variogram(lzn.vgm, model = vgm(1, "Sph", 900, 1)) lzn.fit plot(lzn.vgm, lzn.fit) ################################################### ### code chunk number 7: gstat.Rnw:155-156 ################################################### print(plot(lzn.vgm, lzn.fit)) ################################################### ### code chunk number 8: gstat.Rnw:162-166 ################################################### lznr.vgm = variogram(log(zinc)~sqrt(dist), meuse) lznr.fit = fit.variogram(lznr.vgm, model = vgm(1, "Exp", 300, 1)) lznr.fit plot(lznr.vgm, lznr.fit) ################################################### ### code chunk number 9: gstat.Rnw:169-170 ################################################### print(plot(lznr.vgm, lznr.fit)) ################################################### ### code chunk number 10: gstat.Rnw:179-181 ################################################### lzn.kriged = krige(log(zinc)~1, meuse, meuse.grid, model = lzn.fit) spplot(lzn.kriged["var1.pred"]) ################################################### ### code chunk number 11: gstat.Rnw:184-185 ################################################### print(spplot(lzn.kriged["var1.pred"])) ################################################### ### code chunk number 12: gstat.Rnw:189-192 ################################################### lzn.condsim = krige(log(zinc)~1, meuse, meuse.grid, model = lzn.fit, nmax = 30, nsim = 4) spplot(lzn.condsim, main = "four conditional simulations") ################################################### ### code chunk number 13: gstat.Rnw:195-196 ################################################### print(spplot(lzn.condsim, main = "four conditional simulations")) ################################################### ### code chunk number 14: gstat.Rnw:201-204 ################################################### lzn.condsim2 = krige(log(zinc)~sqrt(dist), meuse, meuse.grid, model = lznr.fit, nmax = 30, nsim = 4) spplot(lzn.condsim2, main = "four UK conditional simulations") ################################################### ### code chunk number 15: gstat.Rnw:207-208 ################################################### print(spplot(lzn.condsim2, main = "four UK conditional simulations")) ################################################### ### code chunk number 16: gstat.Rnw:217-220 ################################################### lzn.dir = variogram(log(zinc)~1, meuse, alpha = c(0, 45, 90, 135)) lzndir.fit = vgm(.59, "Sph", 1200, .05, anis = c(45, .4)) plot(lzn.dir, lzndir.fit, as.table = TRUE) ################################################### ### code chunk number 17: gstat.Rnw:223-224 ################################################### print(plot(lzn.dir, lzndir.fit, as.table = TRUE)) ################################################### ### code chunk number 18: gstat.Rnw:257-259 ################################################### lznr.dir = variogram(log(zinc)~sqrt(dist), meuse, alpha = c(0, 45, 90, 135)) plot(lznr.dir, lznr.fit, as.table = TRUE) ################################################### ### code chunk number 19: gstat.Rnw:262-263 ################################################### print(plot(lznr.dir, lznr.fit, as.table = TRUE)) ################################################### ### code chunk number 20: gstat.Rnw:280-283 ################################################### vgm.map = variogram(log(zinc)~sqrt(dist), meuse, cutoff = 1500, width = 100, map = TRUE) plot(vgm.map, threshold = 5) ################################################### ### code chunk number 21: gstat.Rnw:286-287 ################################################### print(plot(vgm.map, threshold = 5)) ################################################### ### code chunk number 22: gstat.Rnw:300-311 ################################################### g = gstat(NULL, "log(zn)", log(zinc)~sqrt(dist), meuse) g = gstat(g, "log(cd)", log(cadmium)~sqrt(dist), meuse) g = gstat(g, "log(pb)", log(lead)~sqrt(dist), meuse) g = gstat(g, "log(cu)", log(copper)~sqrt(dist), meuse) v = variogram(g) g = gstat(g, model = vgm(1, "Exp", 300, 1), fill.all = TRUE) g.fit = fit.lmc(v, g) g.fit plot(v, g.fit) vgm.map = variogram(g, cutoff = 1500, width = 100, map = TRUE) plot(vgm.map, threshold = 5, col.regions = bpy.colors(), xlab = "", ylab = "") ################################################### ### code chunk number 23: gstat.Rnw:314-315 ################################################### print(plot(v, g.fit)) ################################################### ### code chunk number 24: gstat.Rnw:318-319 ################################################### print(plot(vgm.map, threshold = 5, col.regions = bpy.colors(), ylab = "", xlab = "")) gstat/inst/doc/spatio-temporal-kriging.bib0000644000176200001440000003163514646417261020367 0ustar liggesusers% Encoding: windows-1252 @Article{bakar2015, author = {Bakar, Khandoker Shuvo and Sahu, Sujit K}, title = {{spTimer}: Spatio-Temporal Bayesian Modelling Using {R}}, journal = {Journal of Statistical Software}, year = {2015}, volume = {63}, number = {15}, pages = {1--32}, url = {http://dx.doi.org/10.18637/jss.v063.i15} } @Manual{Beygelzimer2013, Title = {{FNN}: Fast Nearest Neighbor Search Algorithms and Applications}, Author = {Alina Beygelzimer and Sham Kakadet and John Langford and Sunil Arya and David Mount and Shengqiao Li}, Note = {R package version 1.1}, Year = {2013}, Url = {https://CRAN.R-project.org/package=FNN} } @Article{Bilonick1988, Title = {Monthly hydrogen ion deposition maps for the northeastern {U.S.} from {J}uly 1982 to {S}eptember 1984}, Author = {Richard A. Bilonick}, Journal = {Atmospheric Environment (1967) }, Year = {1988}, Number = {9}, Pages = {1909 - 1924}, Volume = {22}, ISSN = {0004-6981}, Keywords = {\{NCA\} Precipitation Quality Network}, Url = {http://www.sciencedirect.com/science/article/pii/0004698188900807} } @Article{biondi, Title = {Space-time kriging extension of precipitation variability at 12 km spacing from tree-ring chronologies and its implications for drought analysis }, Author = {Biondi, F.}, Journal = {Hydrology and Earth System Sciences Discussussions}, Year = {2013}, Pages = {4301-4335}, Volume = { 10 }, Url = {http://dx.doi.org/10.5194/hessd-10-4301-2013} } @Book{Cressie2011, Title = {Statistics for spatio-temporal data}, Author = {Cressie, Noel and Wikle, Christopher K}, Publisher = {Wiley}, Year = {2011} } @Article{DeCesare2001, Title = {Estimating and modeling space-time correlation structures}, Author = {L. {De Cesare} and D.E Myers and D Posa}, Journal = {Statistics \& Probability Letters}, Year = {2001}, Number = {1}, Pages = {9--14}, Volume = {51}, Url = {http://dx.doi.org/10.1016/S0167-7152(00)00131-0}, ISSN = {0167-7152}, Keywords = {Space–time correlation}, Owner = {b_grae02}, Timestamp = {2013.04.17} } @Article{DeIaco2001, Title = {Space-time analysis using a general product-sum model}, Author = {De Iaco, S. and D.E. Myers and D. Posa}, Journal = {Statistics \& Probability Letters}, Year = {2001}, Number = {1}, Pages = {21--28}, Volume = {52}, Url = {http://dx.doi.org/10.1016/S0167-7152(00)00200-5}, ISSN = {0167-7152}, Keywords = {Space–time random fields}, Owner = {b_grae02}, Timestamp = {2013.04.17} } @Article{finley2015, author = {Finley, Andrew O and Banerjee, Sudipto and Gelfand, Alan E}, title = {{spBayes} for Large Univariate and Multivariate Point-Referenced Spatio-Temporal Data Models}, journal = {Journal of Statistical Software}, year = {2015}, volume = {63}, number = {13}, url = {http://dx.doi.org/10.18637/jss.v063.i13} } @Article{Gasch2015, author = {Caley K. Gasch and Tomislav Hengl and Benedikt Gr{\"a}ler and Hanna Meyer and Troy S. Magney and David J. Brown}, title = {Spatio-temporal interpolation of soil water, temperature, and electrical conductivity in {3D} + {T}: The {C}ook Agronomy Farm data set}, journal = {Spatial Statistics}, year = {2015}, volume = {14, Part A}, pages = {70 - 90}, issn = {2211-6753}, keywords = {Digital soil mapping}, url = {http://www.sciencedirect.com/science/article/pii/S2211675315000251} } @Article{hu, Title = {Spatio-temporal Transmission and Environmental Determinants of Schistosomiasis Japonica in Anhui Province, China}, Author = {Yi Hu and Rui Li and Robert Bergquist and Henry Lynn and Fenghua Gao and Qizhi Wang and Shiqing Zhang and Liqian Sun and Zhijie Zhang and Qingwu Jiang}, Journal = {PLoS Neglected Tropical Diseases}, Year = {2015}, Number = {2}, Volume = {9}, Url = {http://dx.doi.org/10.1371/journal.pntd.0003470} } @Article{Kilibarda2014, Title = {Spatio-temporal interpolation of daily temperatures for global land areas at 1 km resolution}, Author = {Kilibarda, Milan and Hengl, Tomislav and Heuvelink, Gerard B. M. and Gr{\"a}ler, Benedikt and Pebesma, Edzer and Per\v{c}ec Tadi{\'c}, Melita and Bajat, Branislav}, Journal = {Journal of Geophysical Research: Atmospheres}, Year = {2014}, Number = {5}, Pages = {2294--2313}, Volume = {119}, ISSN = {2169-8996}, Keywords = {spatio-temporal kriging, spatio-temporal interpolation, daily air temperature, MODIS LST}, Url = {http://dx.doi.org/10.1002/2013JD020803} } @Article{kj99, Title = {Geostatistical Space-Time Models: A Review}, Author = {Kyriakidis, Phaedon C. and Journel, Andr\'{e} G.}, Journal = {Mathematical Geology}, Year = {1999}, Number = {6}, Pages = {651--684}, Volume = {31}, Url = {http://dx.doi.org/10.1023/A:1007528426688}, Publisher = {Kluwer Academic Publishers-Plenum Publishers} } @Article{lindgren2015, author = {Lindgren, Finn and Rue, H{\aa}vard}, title = {Bayesian spatial modelling with {R-INLA}}, journal = {Journal of Statistical Software}, year = {2015}, volume = {63}, number = {19}, publisher = {University of Bath}, url = {http://dx.doi.org/10.18637/jss.v063.i19} } @Article{marek, Title = {Using geovisual analytics in {G}oogle {E}arth to understand disease distribution: a case study of campylobacteriosis in the {C}zech {R}epublic (2008--2012)}, Author = {Luk\'{a}\u{s} Marek and Pavel Tu\u{c}ek and V\'{i}t P\'{a}szto}, Journal = {International Journal of Health Geographics}, Year = {2015}, Number = {7}, Pages = {1--13}, Volume = {14}, Url = {http://www.ij-healthgeographics.com/content/14/1/7} } @Article{Nash2014, Title = {On Best Practice Optimization Methods in {R}}, Author = {John C. Nash}, Journal = {Journal of Statistical Software}, Year = {2014}, Number = {2}, Pages = {1--14}, Volume = {60}, Url = {http://www.jstatsoft.org/v60/i02} } @Article{optim, Title = {Numerical Optimization in {R}: {B}eyond optim}, Author = {Ravi Varadhan}, Journal = {Journal of Statistical Software}, Year = {2014}, Month = {9}, Number = {1}, Pages = {1--3}, Volume = {60}, Url = {http://dx.doi.org/10.18637/jss.v060.i01} } @Article{pe1, Title = {Mapping Sea Bird Densities over the {N}orth {S}ea: Spatially Aggregated Estimates and Temporal Changes}, Author = { Edzer J. Pebesma and Richard N.M. Duin and Peter A. Burrough}, Journal = {Environmetrics}, Year = { 2005 }, Number = {6}, Pages = {573--587}, Volume = {16}, Url = {http://dx.doi.org/10.1002/env.723} } @InCollection{pe2, Title = {Spatio-temporal mapping of sea floor sediment pollution in the {N}orth {S}ea}, Author = {Edzer J. Pebesma and Richard N.M. Duin}, Booktitle = {Fifth European Conference on Geostatistics for Environmental Applications, GeoENV2004}, Publisher = {Springer}, Year = {2005}, Editor = { Philip Renard and Roland Froidevaux }, Pages = { 367--378 }, Url = {http://dx.doi.org/10.1007/3-540-26535-X_31} } @Article{Pebesma2004, Title = {Multivariable geostatistics in {S}: the gstat package}, Author = {Edzer J. Pebesma}, Journal = {Computers \& Geosciences}, Year = {2004}, Pages = {683--691}, Volume = {30}, Owner = {b_grae02}, Timestamp = {2013.04.17}, Url = {http://dx.doi.org/10.1016/j.cageo.2004.03.012} } @Article{Pebesma2012, Title = {{spacetime}: Spatio-Temporal Data in {R}}, Author = {Edzer Pebesma}, Journal = {Journal of Statistical Software}, Year = {2012}, Number = {7}, Pages = {1--30}, Volume = {51}, Url = {http://www.jstatsoft.org/v51/i07/} } @Manual{RCoreTeam2014, Title = {R: A Language and Environment for Statistical Computing}, Address = {Vienna, Austria}, Author = {{R Core Team}}, Organization = {R Foundation for Statistical Computing}, Year = {2014}, Url = {http://www.R-project.org/} } @Manual{RCoreTeam2015, title = {R: A Language and Environment for Statistical Computing}, author = {{R Core Team}}, organization = {R Foundation for Statistical Computing}, address = {Vienna, Austria}, year = {2015}, url = {https://www.R-project.org/} } @Article{Schlather2014, Title = {Analysis, Simulation and Prediction of Multivariate Random Fields with Package {RandomFields}}, Author = {Martin Schlather and Alexander Malinowski and Peter J. Menck and Marco Oesting and Kirstin Strokorb}, Journal = {Journal of Statistical Software}, Year = {2014}, Number = {8}, Pages = {1--25}, Volume = {63}, Url = {http://www.jstatsoft.org/v63/i08} } @Article{sigrist2015, author = {Fabio Sigrist and Hans R. K\"unsch and Werner A. Stahel}, title = {{spate}: An {R} Package for Spatio-Temporal Modeling with a Stochastic Advection-Diffusion Process}, journal = {Journal of Statistical Software}, year = {2015}, volume = {63}, number = {14}, pages = {1--23}, url = {http://www.jstatsoft.org/v63/i14/} } @Article{Snepvangers2003, Title = {Soil water content interpolation using spatio-temporal kriging with external drift}, Author = {J.J.J.C Snepvangers and G.B.M Heuvelink and J.A Huisman}, Journal = {Geoderma}, Year = {2003}, Number = {3 -- 4}, Pages = {253--271}, Volume = {112}, Url = {http://dx.doi.org/10.1016/S0016-7061(02)00310-5}, ISSN = {0016-7061}, Keywords = {Geostatistics}, Owner = {b_grae02}, Timestamp = {2013.04.17} } @Article{yoon, author = {Seo Youn Yoon and Srinath K. Ravulaparthy and Konstadinos G. Goulias}, title = {Dynamic diurnal social taxonomy of urban environments using data from a geocoded time use activity-travel diary and point-based business establishment inventory }, journal = {Transportation Research Part A: Policy and Practice }, year = {2014}, volume = {68}, number = {0}, pages = {3 - 17}, url = {http://dx.doi.org/10.1016/j.tra.2014.01.004}, issn = {0965-8564} } gstat/inst/doc/st.Rnw0000644000176200001440000003643514646417261014262 0ustar liggesusers%% Document started, Sat Jul 3 19:30:52 CEST 2004, my 37th birthday, %% while being stuck for 24 hours at Philadelphia airport, on my way %% back from the joint TIES/Accuracy 2004 symposium in Portland, ME. %% Continued, Oct 28, during the Apmosphere mid-term review. Oh, shame. \documentclass[a4paper]{article} \usepackage[colorlinks=true,urlcolor=blue]{hyperref} \newcommand{\code}[1]{{\tt #1}} \SweaveOpts{echo=TRUE} \title{Introduction to Spatio-Temporal Variography } % \VignetteIndexEntry{ Introduction to Spatio-Temporal Variography } \author{ \includegraphics[width=.4\columnwidth]{ifgi-logo_int}\\ \href{mailto:edzer.pebesma@uni-muenster.de}{Edzer Pebesma}, \href{mailto:ben.graeler@uni-muenster.de}{Benedikt Gr\"{a}ler} } \date{\small \today } \begin{document} \setkeys{Gin}{width=0.9\textwidth} \maketitle \section{Introduction} Since \code{gstat} package version 1.0-0, a dependency of gstat on the R package \code{spacetime} was introduced, allowing the code in \code{gstat} to exploit spatio-temporal data structures from that package. This vignette describes the possibilities and limitations of the package for spatio-temporal geostatistics. To understand some of the possibilities and limitations, some knowledge of the history of the software is needed. The original \code{gstat} software (Pebesma and Wesseling, 1998) was a standalone computer {\em program} written in around 25,000 lines of C code, and would do geostatistical modelling, prediction and simulation. The \code{gstat} R package (Pebesma, 2004) consisted mostly of an R interface to this C code, together with convenience functions to use R's modelling interface (formula's, see \code{?lm}) and graphic capabilities (trellis graphics in package \code{lattice} to show cross variogram as matrix plots; interaction with variogram clouds using base plots). Starting 2003, a group of programmers developed a set of classes and methods for dealing with spatial data in R (points, lines, polygons, grids), which was supported by the publications of the well-known ASDAR book (Bivand et al. 2008; see also \url{http://www.asdar-book.org/}) and helped convergence in the user community, with in 2011 over 2000 subscribers on the {\tt r-sig-geo} mailing list. Package \code{gstat} was one of the first packages that adopted and benefited from these classes. To realize a particular idea, writing code in C typically takes about 10-20 times as long as writing it in R. C code can be more efficient, gives more control over memory usage, but is also more error prone--mistakes in C code make an R session crash, something that is hard to do when writing R code. The original C code of \code{gstat} (Pebesma and Wesseling, 1998) provides all kriging varieties (universal, ordinary, simple; univariable, or multivariable as in cokriging) for two- or three-dimensional data. When the spatial domain is constrained to two dimensions (and this might cover over 99\% of the use cases!), the third dimension might be used to represent time. As such, the {\em metric} variogram model, which allows for geometric anisotropy definition in three dimensions, can be used for spatio-temporal kriging. When defining the three-dimensional variogram as the sum of 2 or more nested variogram (summed) models, one can choose anisotropy coefficients for a single model such that this model is {\em effectively} zero in some directions, e.g. in space {\em or} in time; this allows one to approximate the so-called space-time sum model. It should be noted that at the C code there is no knowledge whether a third dimension represents space, or time. As such, particular characteristics of time cannot be taken care of. Since the second half of 2010, the development of an R package \code{spacetime} started. It provides methods and classes for spatio-temporal data, and builds on the spatial data classes in \code{sp} and time series classes in \code{xts}. This document will explain how data in this form, and methods provided by this package, can be used for spatio-temporal geostatistics. We will work with a data set with air quality (PM10) measurements over germany, taken from rural background stations available in the data sets provided by the European Environmental Agency. <<>>= library(spacetime) rm(list = ls()) data(air) ls() @ \section{Variography} \subsection{Temporal autocorrelation and cross correlation} We will look into a subset of the data, ranging from 2005 to 2010, and remove stations that have only missing values in this period: <<>>= if (!exists("rural")) rural = STFDF(stations, dates, data.frame(PM10 = as.vector(air))) rr = rural[,"2005::2010"] unsel = which(apply(as(rr, "xts"), 2, function(x) all(is.na(x)))) r5to10 = rr[-unsel,] summary(r5to10) @ Next, we will (rather arbitrarily) select four stations, which have the following labels: <<>>= rn = row.names(r5to10@sp)[4:7] rn @ In the following, autocorrelation functions are computed and plotted. The resulting plot is shown in Figure~\ref{fig:acf}. <>= par(mfrow=c(2,2)) # select 4, 5, 6, 7 for(i in rn) acf(na.omit(r5to10[i,]), main = i) par(mfrow=c(1,1)) @ \begin{figure}[hbt] \begin{center} <>= par(mfrow=c(2,2)) # select 4, 5, 6, 7 rn = row.names(r5to10@sp)[4:7] for(i in rn) acf(na.omit(r5to10[i,]), main = i) @ \end{center} \caption{Autocorrelations for PM10; time lag unit in days.} \label{fig:acf} \end{figure} Auto- and cross correlations can be computed when a multivariate time series object is passed to {\tt acf}: <>= acf(na.omit(as(r5to10[rn,], "xts"))) @ The resulting plot is shown in Figure~\ref{fig:ccf}. \begin{figure}[hbt] \begin{center} <>= acf(na.omit(as(r5to10[rn,], "xts"))) @ \end{center} \caption{autocorrelations (diagonal) and cross correlations (off-diagonal) for the four stations selected; time lag unit in days. } \label{fig:ccf} \end{figure} From these graphs one should be able to observe the following \begin{itemize} \item autocorrelations for lag 0 are always 1 \item cross correlations for lag 0 are not always 1 \item cross correlations can be asymmetric, meaning that when $\rho_{AB}(h)$ is the correlation between $Z(s_A,t)$ and $Z(s_B,t+h)$, $$\rho_{AB}(h) = \rho_{BA}(-h) \ne \rho_{AB}(-h)$$ with $s_A$ and $s_B$ the two stations between which a cross correlation is computed, and $h$ the (directional!) lag between the series. \end{itemize} The plot further more shows that for these four stations the asymmetry is not very strong, but that cross correlations are fairly strong and of a similar form of autocorrelations. This kind of plot does not work very well in layouts of e.g. 10 x 10 sub-plots; {\tt acf} automatically chooses 4 x 4 as the maximum a single plot. To try this out, do a 7 x 7 plot <>= acf(na.omit(as(r5to10[4:10,], "xts"))) @ and note that here we see in the last figure (DESH \& DESN04) a pair of plots with nearly no cross correlation. This might have to do with the spatial distance between these two stations: <<>>= library(sp) print(spDists(r5to10[4:10,]@sp), digits=3) @ (What is the spatial distance between stations DESH and DESN04?) \subsection{Spatial correlation, variograms} In the next steps, we will sample 100 time instances randomly, <<>>= rs = sample(dim(r5to10)[2], 100) @ we select these instances as a {\tt SpatialPointsDataFrame} and add a time index to them. After this we bind them together in a single {\tt SpatialPointsDataFrame} which has a time index {\tt ti}: <<>>= lst = lapply(rs, function(i) { x = r5to10[,i]; x$ti = i; rownames(x@coords) = NULL; x} ) pts = do.call(rbind, lst) @ Then, we can compute the pooled variogram <<>>= library(gstat) v = variogram(PM10~ti, pts[!is.na(pts$PM10),], dX=0) @ and plot it (Figure~\ref{fig:vgm}): <>= # plot(v, fit.variogram(v, vgm(1, "Exp", 200, 1))) vmod = fit.variogram(v, vgm(100, "Exp", 200)) plot(v, vmod) @ \begin{figure}[hbt] \begin{center} <>= # plot(v, fit.variogram(v, vgm(1, "Exp", 200, 1))) vmod = fit.variogram(v, vgm(100, "Exp", 200)) print(plot(v, vmod)) @ \end{center} \caption{sample spatial variogram, averaged over 100 randomly chosen time steps} \label{fig:vgm} \end{figure} The fitted model is this: <<>>= vmod @ One should note that the fit is rather poor, and not forget that we only have 53 stations selected. The time resolution is rich (1862 days) but the number of stations is small: <<>>= dim(r5to10) @ We can fit a spatio-temporal variogram the usual way, by passing an object of class {\tt STFDF} (Pebesma, 2012): <>= vv = variogram(PM10~1, r5to10, width=20, cutoff = 200, tlags=0:5) @ Alternatively, if this takes too long, a temporal subset can be taken, e.g. using the first 200 days: <>= vv = variogram(PM10~1, r5to10, width=20, cutoff = 200, tlags=0:5) @ taking random days from the full period will lead to the a wrong assumption that every time index increment reflect a constant lag increase. As an alternative, we will here load the precomputed S/T variogram: <<>>= data(vv) @ % remove the model column to keep text and figures in line. <>= vv <- vv[c("np", "dist", "gamma", "id", "timelag", "spacelag")] @ Plotting this object can be done in several ways, two 2D-plots are shown in Figure~\ref{fig:map} and a 3D wireplot is shown in Figure~\ref{fig:wire}: <>= plot(vv) plot(vv, map = FALSE) @ \begin{figure}[hbt] \begin{center} <>= print(plot(vv), split = c(1,1,1,2), more = TRUE) print(plot(vv, map = FALSE), split = c(1,2,1,2)) @ \end{center} \caption{Spatio-temporal sample variogram map (top) and sample variograms for each time lag (bottom); both figures depict the information of object {\tt vv}.} \label{fig:map} \end{figure} \subsection{Fitting a spatio-temporal variogram model} At first, we try to fit a metric model with spatio-temporal anisotropy: <<>>== metricVgm <- vgmST("metric", joint=vgm(50,"Exp",100,0), stAni=50) metricVgm <- fit.StVariogram(vv, metricVgm) @ As numerical criterion to judge the goodness of fit of model and sample variogram, the root-mean-squared-difference between the surfaces can be obtained by: <<>>= attr(metricVgm, "optim")$value @ The final model can be plotted with the sample variogram (Figure~\ref{fig:mm}): <>= plot(vv, metricVgm) @ \begin{figure}[hbt] \begin{center} <>= print(plot(vv, metricVgm)) @ \end{center} \caption{Sample variogram map (left) and fitted metric model (right).} \label{fig:mm} \end{figure} \pagebreak Now, let us try to fit and plot a separable model (Figure~\ref{fig:sm}): <<>>== sepVgm <- vgmST("separable", space=vgm(0.9,"Exp", 123, 0.1), time =vgm(0.9,"Exp", 2.9, 0.1), sill=100) sepVgm <- fit.StVariogram(vv, sepVgm, method = "L-BFGS-B", lower = c(10,0,0.01,0,1), upper = c(500,1,20,1,200)) @ To compare this model with the previous one, we look at the optimized root-mean-squared-differences between the two surfaces and plot sample and both models: <<>>= attr(sepVgm, "optim")$value plot(vv, list(sepVgm, metricVgm)) @ \begin{figure}[hbt] \begin{center} <>= print(plot(vv, list(sepVgm, metricVgm))) @ \end{center} \caption{Sample variogram map (left), fitted separable model (middle) and fittted metric model (right).} \label{fig:sm} \end{figure} A wireframe (3D) plot of sample variogram and fitted variogram models can be obtained e.g. by <>= library(lattice) plot(vv, list(sepVgm, metricVgm), all=T, wireframe=T, zlim=c(0,120), zlab=NULL, xlab=list("distance (km)", rot=30), ylab=list("time lag (days)", rot=-35), scales=list(arrows=F, z = list(distance = 5))) @ which is shown in Figure~\ref{fig:wire}. Further spatio-temporal model definitions can be found in the help pages of {\tt fit.StVariogram} and {\tt variogramSurface}. The demo {\tt stkrige} presents further examples and illustrates an interactive 3D-plot of sample variogram and the fitted variogram model. An interactive variogram exploration web-tool is avaialble at \url{http://giv-graeler.uni-muenster.de:3838/spacetime/}. \begin{figure}[hbt] \begin{center} <>= library(lattice) print(plot(vv, list(sepVgm, metricVgm), all=T, wireframe=T, zlim=c(0,120), zlab=NULL, xlab=list("distance (km)", rot=30), ylab=list("time lag (days)", rot=-35), scales=list(arrows=F, z = list(distance = 5)))) @ \end{center} \caption{Wireframe plots of sample and fitted space-time variograms.} \label{fig:wire} \end{figure} \clearpage \section{Spatio-temporal prediction} The vignette in package \code{spacetime} gives an example of using the gstat function \code{krigeST} for spatio-temporal kriging of the Irish wind data. The \code{krigeST} function uses global kriging, but only needs to invert the purely spatial and purely time covariance matrices in the separable case. For more generic spatio-temporal kriging where space is two-dimensional, one could use \code{krige}, defining the observations and prediction locations as three-dimensional data sets, see for an example <>= demo(gstat3D) @ It needs to be pointed out that in that case, the time (typically the third dimension) needs to be numeric, and three-dimensional anisotropy needs to be defined properly (see \code{?vgm}). In case the data set is too large for global kriging, one could try to use local kriging, and select data within some distance, or by specifying \code{nmax} (the nearest $n$ observations). In both cases, it is advisable to transform time such that one can use an {\em isotropic} variogram model in the three dimensions, as only in that case the nearest $n$ observations correspond to the $n$ most correlated observations. \code{krigeST} provides a solution where a \code{bufferNmax}-times larger neighbourhood is evaluated within the covariance model and the strongest correlated \code{nmax} neighbours are selected. An additional consideration is that in space-time, observations may not be regularly spaced. In some cases, the nearest $n$ observations may come from a single measurement location, which may lead to sharp jumps/boundaries in the interpolated values. This might be solved by using larger neighbourhoods, or by setting the \code{omax} in \code{krige} or \code{gstat} calls to the neighbourhood size to select {\em per octant} (this should be combined with specifying \code{maxdist}). %\section{Spatio-temporal simulation} \section*{References} \begin{itemize} \item Bivand, R., E. Pebesma and V. Gomez-Rubio, 2008. Applied Spatial Data Analysis with R. Springer. \item Cressie, N.A.C., 1993. Statistics for Spatial Data. Wiley. \item Cressie, N. and C. Wikle, 2011. Statistics for Spatio-temporal Data. Wiley. \item Pebesma, E., 2012. spacetime: Spatio-Temporal Data in R. Journal of Statistical Software, volume 51, issue 7; \href{http://www.jstatsoft.org/v51/i07/}{1-30}. \item Pebesma, E.J., Wesseling, C.G., 1998. Gstat, a program for geostatistical modelling, prediction and simulation. Computers \& Geosciences, 24 (1), pp. 17--31. \item Pebesma, E.J., 2004. Multivariable geostatistics in S: the gstat package. Computers \& Geosciences \href{http://www.sciencedirect.com/science/journal/00983004}{30: 683-691} \item Ver Hoef, J.M., Cressie, N.A.C, 1993. Multivariable Spatial Prediction. Mathematical Geology, 25 (2), pp. 219--240. \end{itemize} \end{document} gstat/inst/doc/gstat.pdf0000644000176200001440000116216214750415427014755 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 2403 /Filter /FlateDecode /N 52 /First 399 >> stream xY[S~?b6[)i.hk+uveX2!ןG-[Ƙ@Nܺ{z 1|0Ť/f*~g! u 3d=1RkT `f @8`RKL h"1A& @L0# d0 !J's+)X4(Yz( ЇP,TPIZDihhXX$4 J0SL^ueXd@UPQ!όx-Q%3: 2e̴xg~ ]kRIf 4'2~Qik.XMw"oٻw֤cWmLvҲ7 OhOx |_q48>ٷ!hG|<(Mq>-a^EܕMOls6KG<)SKo vIV\UUPYa0_U&]ՂJoE5-j&W^5ڭ6$fN6CUmAoFu7aFQcB=[q<>`k3[?݇@lݻl3M0$^&GJrH"9jx{YIvQ$Se*iKL2񚒅aKdqalteg_󽬟$ʊdְrgI7<]CR鸓 ~#J2Cy0RО֕Gmn{ etDnoHT6{ݨbK=j>mn s&ÒF]~ȏxO<}>$(-S>xs1/xamƋ䁗巜O=k9ɳ!XƷnsuWU~ZJZ[:D$M[-'IQܾ#0Ҏ>!Imh\kIiӵ݃OG?Ow{^vhbeU+5-VBbzؑ Mc6FJ@Ju/)mbP"S X^)ӮOI*'C *vs5t+ mKg$+$h4naTFj]"0)i D=ʅ~D-=:vЎ ?Ss~]π^OGf_Ͷ< Ga3>78I7;J7-F'Y1ج(8udx49W{>BJ#̦%nFSS1$g*>^tuR/˴=Mׯ=ס:|Ź(/;'O\0 ?͏wsl2F2fk9tR,z4GuR,nc_8=7D}=;{@jN=d/a_uW)E4S?rg3%_w{2ݜf$(K-s E3u2s)JEn_?Wj[-WKnP[vVVٔ5!%mzoˤol`eY8-jzM cmj)qԗ_ܶ}x~z}=  qpAN6 x7ч]Ggcw`~sg= ݃U7LÙt\Y,zI#QrMwu#wDRW ND\gR)xUi?>.KdzoIBzAbu3']~[lZF@='>}?^{ya-l5xUm?' (P͍H-<t*O6=#(&+ѣc6}LI/+ @'i. ?Cendstream endobj 54 0 obj << /Subtype /XML /Type /Metadata /Length 1388 >> stream GPL Ghostscript 10.02.1 2025-02-04T14:50:15+01:00 2025-02-04T14:50:15+01:00 LaTeX with hyperref endstream endobj 55 0 obj << /Type /ObjStm /Length 1992 /Filter /FlateDecode /N 51 /First 405 >> stream xYko6[+_y3Jcgm;CJ ,XI{6mD;½-1vN3&FΜ#F. F$ F!KuB'c1ˈXr"U "J"]Rj" "|K"d"%%P DQ$JyE W QN2T2u 0K8SK,,Fq@j { #3䠳q]aI/Pp5aȠa޼!dY"ty#cB?NpH՟O)?lyHi)]̹4*,69!s,^LV)6զ\=)ys1ƗHD[+*cAC0 anjſ.@|' )eżgnvmEL"`lj)+;aauxgJky}B>&h%4? - * JHi\ͺqNX_t= *a}[A_bMN-mJm|P%B9_(猷5lyMC-gá}Rȝ-Me0B)Z6'EA֐$y:&+Ps䪘=NjV{9?'yCa!J-4 F/NGP4 rQ {1O۱@ Va[YE'ĶD>lkbu [o۾@]:ƜY9ο*v z!"O#՗`W30ƴp['4G?}h|-,[K8Z]G,N&7#·{g(en{(;bO׈gPk蹩;ZO,Gz2yzf`>B J|CN-r\M49}KDWtMs6%w┎5q*)GR1/j-!UhXgXaNZ|JZ$/E^^:i;DCFڧgN|߳];H>s<wOɿзlo&s,6O 3|S8ZxƭqՎ15Q>>ό2mkS'e,Wd H*a2a\|w9^f-I{8sPjZ:Sf;m%*bZ[_[.a%>E.r=% ~!v_endstream endobj 107 0 obj << /Filter /FlateDecode /Length 2564 >> stream xYے}oPaJ1`0ytI%eW%}%$,p|vNk\vt7e&rҿwK7ǻ/wnŸywT6Q23;Dnd<<7rrs(OvN4mP*QMĹBTfL.2Z @˕ F<5ݦU.m&Ǹ8QJ猸, םI]rS2q`#dL\ Sbt\S]$l]GgRY1sj=~xS$y..WV*1Ȯ=p\D4 d")L'ة") 뼴NV+T3oHCHvGY.E5K}!tNma|o?v.s ŹئyOPʢ j#MMMRdLR*;)SV(+سZP+Qv6E'NXwYmMPla6' Bԏw C`3gϯ.JC~()S*4(S$pw[U_ z}kni6 CgP`Fd׈=,06 q. G웎Kcu3ֻl?BJ:=-^4Tj8_FTMjZ!b|ey lOs0as;:^k /_PM]% 0ƅ #ůcp|:S7SwLIWqazz=*a]b(b{"b}+LtjE])0 _@B= ҠOOgF|BA $W¸0ww7{]ڜL_g#+̟`@M,s > g𓛣 Nv.Hj`<r\V %48& r$b2l_i*rË4J<`}be~Nc{*`9W~JsZ ?mxF'!>a S ; > U5!bh3"",8/O1 b9u \8_ &J~CLG+D:zs*;PaZǭkZ}y!$dBok>L,׃{P+}7 "u)Y@ϻY Zaad1eK 9Ƒ< w!4#I!/nhsuMLkzp]Gw[]5NDE&SP_Tb1 lu՜O25DiϬB>Eg\U=q2hf[YLJPS~Y-:C[.8B+-}i[O{1W_DCnȴaڲ7qj:#y'w1*ݧ/L(T֫[~8W9ZI1ULƤ\QNPS%0qs& ReT0 a>)m?۪dlW~W-rI3Fs|tW.aJeO߈ꋺ8Z fX3Bc=!ڪƔ3aM)q7|hm97YA@Ea!o!o<͆SVyA/ l¬-C> ƫj?b#*e& Ch, [Qy=endstream endobj 108 0 obj << /Filter /FlateDecode /Length 1998 >> stream xXKoW~m &; 3;C{D!E I=nd.|ɮW_U5m#ޖ /-~m߮EJ_ RG ˘HH.7S덌!hϪMۼimZ}1ݮűdU#.SsJ{6d* ޽a}wX$m^zb,ze "$x" i\k!D䌎^\?JVnQ8"^"(poضz-zHݩٱ5e0wYTTj1\0F$ uJ(B@D괦A ;! $ nAe%s@đtBaL mV/7Y#\h-TG4WE >w8::}*-I4Έ2.=7!P=E(Vh&"Q*"s5O|oN9fDDZ4yV9Hu2}uړF P mJ0}|4QGrCr{F·LkJ8cE!NH{e +_т&ȅ/mWm?XlDBqTP@fE'<=l{ܱa&!aO#^e1#W ,ֻxoF޲Ӂllٶ"i2_LuujqӇ`x4hIKh?h=OCD=RH62J.PFL$}dv*F.mJ'qµ?8ekU>Q)D!w~Qq?9R"Mz0Ȉc|aYA/lq{hH VXdы0?L䗨 kzJ0@'.x8aΛNW8p>?l*z;z!YD ʶ*=1o6fns"t N@8*(0֓$FNDQd[թĨ/ozIڪOV2[`!@K!ζ PTm CL !pTp[d[cvM҅ ?31lqꪡycCWڨ\"3#x 3~6ɺm6͹E17 ikߡ+ryҮyLx06WϧBTz>l]U/؊X;G?WE,sV-=cDUVdpIDždj"`4MS"'&fHQ9nO[ +Pӱb·`5a~=/OaPaӭ&]{#y&HcH-nak1gxET~{&h&, & O|9cƚڽc@"}Oa >y73-q(LJ?*JXQkPB͑6#}rɰ> a뵰o>2T7jDpİ1~d'b$IB„/ /0=hvtO[&2M◛C > stream xXr6xS5Qci$3M,hHBQHvj/,}{? s~vF3ßvb{.[|q7N9k(L/kTVY9DŽ = x]qIz35Rjw}\>J6)xdrXU\Xxa;+3,qlzB* S)l1*@˺nVծhCkXRkjmA@S Ͷw5*ЦZu˶lJї)l཭p݄&r 7,DmMn{&pN9h|ڵڥz"rߟbeN3COedKuٳSFqi=zuϬf0hA hɤ#l/!Qa&J2I @?n{աdLr 4,6&9-)>8Ś{APE`(BZZ22SGնu\Vhfxc{V<ߏ@G:dᢼ z0l7~b1%20oo7S@ .{^۲]MMLh?,K,2n΃u}sf#r^8y^&qHW1!JEESXWGjds*05$`]P>$mF>{@+CWU&5dOi^nPNz+ he6?6E|H3Uq`) a%ddu_7ݴ7>M6Յ@may٭>+0 ˠ/,+ Um*oV0DgQ:aCQ-i)3 TtJe:f =a Y'67b_,?8v\է>ؙ> stream x}M&G޽~u6Vc/v3>z4Z4|H>$d -72dz^oOxӟ՟^mzt籍<=S;|g?׳?'bdxz _^ۙ 6 2"0z !Õ oOBy n ߯W"Z!Y6:1[ݔB{#%8CPPG2Xe{g`|ݎ_~n<~{eBמ6AL?_[NpYd,#B RPK`6w>cޯMm PO%Lc{|t<9"wCbnQ86A|'(a= 1ZZjv뜂Mm#flQ.Odl,O:q¦u녃.#zr8 S5d8EPPorXPny!U{t?}6׾ =Os aĴ(9lb" BäъeFqb9e1&2[.32(|&)u猔]EeF$[IVf8l$2%OLec kPs+񜃏oip7(ۏeeA̼)AMF |ʿ OXϓB+4 wyû쬲veU E_2#v;CX^;`G= Y0p%pe8DVsӟpK5]| ֘ڤJqE u\S#IbdJk''hް$O@dLj'9E'dԂԒV; qXL'w}oNd(o|HRSrA}3I8ö@XlݛV{Loס1xe[Iw1`AXP]kDZHx )67um- HFbH.uMF8F^0MvÎȽ 5mZkV;̶SBʪ60!WR`2a|zHdZ0#)%9vԽ90ͫˮ9wn׭ђ˳^9%Nlp݉I*bYu޶V)W S'KYn^ZP4Y !^^dq/" ]TT9V2$xf] ! c`0+ÓpWa@D`D` C`M9Tѫ _-LN8&quFK6Q)p l20q6PnAU0#)%9vBb[`\3/1ͽe Iae Ɂp,8!#l -HA-a#/ } ".g?<D/ApNɀpہܐY!"Ёԑ V+U=1'6Yly,RU - VvX))p,ܓay,01; ZPD?$xŒ~A l l$(O6weA#UѬ(4][RSaB C N8 x*El'ΜL%͉ =/=L q'4NU8bto)ap%• f2y0ˈSTu,|tu%,bY)J%QPVa>=ׂ9#)aP|ƆHH9;R3 CQ=|Y?{-ܸp.~POU@:TaC-uԐVԪK!-p \;Yxgj̗pJ€bP 9L@ A@`b U]-2Ζğb , v2H#`P1>x5`1JFg5 i&gv=KvUMD1JO_ i(&]A@`*pZtsF,@^kҜ'@ -88201ڜȂRęAAa#͎l~`GBmaY O 4l3L%s9 + 8)%9vLu'Rnlfgz1(,} 2TpKdfSRPE`-/3vb$45|cM^<#aIa=)Ɂx{J̩ a 1ZZjѲ,W7 n,<q;pe:+C}bH(Rw{aJ\ RdaΕH׽d3׊8xGvr[nU k^S[k 7Fy}t3GU}en:`͎6䩞 }Y "B0p$OkYNçR@HAa5bi1mZXX:Lۭqy6odDaͤ`(9b@Ḟf %HA%jcGQs^0x6㸽{j@LmHs$󿍷68p D=<2wX61X}hoK%17 pf{ߎ XcaUi^8"|V'@"{W jMax&WLµzntj2%'&fPr@Y]d\M#EV;a]ʄ2v}`~H83Ž*a2^MS qfP;j}Gw?%0<27\-ԃB䜅:h\)-O+@ HOAIr >7roBa{Iȓw>CwwWvcy]!vBaט}Z*8 V)!8V} ]~=߱W9,V,HJ2@͝"(2h]@ h%(#V,C|cIߥ- 8\{0Ia9y2 h2g ߵ4yNKQ .Ͷ̉`uT4[<5 vc4O]C&#A{2(ȡ[\謰 -"tv{2,)fY+^w# ֖.R62 l1t6qp$P9(Ԭ K@ۙ5+felݶr 0ԬUtFT~T`Ǿӡk&}RÞ 4 ,(kMR'U$Ո0q؊a)k%Gۦ[A-!Z';آ%]S:0[0H-=`1"OT?+KwCR.9W{x?)C) 4 ^2 x'1*8E*m0 H #._z6q/ð@@ZW} ? }0Azbv-bo P> X_מas p v(-ؽcQ Fũ-ɁЮFG[3key0X \ RPIrX,Pq#<_un)|@d9 ~BȈB RPKrXgCffw8(1V5-ANg#)̕H:b<*A4Ϫ,z+%#pDu32T6ڴzNyxk yՠ@ j!`=R8n|B RPK`rcVg- eU֣yf`0+:,gqs2YHva P<04mɐ -JC $ u&*4ḭk,rq5,I1,9>41SR8-I7*ǁjiM71Ӷ6V2гk5):9cs])ojA jIj(1ŝhf{~cb΅4(d>[@g8SPN9|5+7^00ye?=*ڬ(B#x<"Ju$ xIb3FnMԒN! lJ~HR RPKrXM1^0wHLk \b+~vBl:bčmsr@Ud|ڱanT-m8).4˪FdDQƟ2F4n`>L9rw80qdtwyLK)F2-d֜%-~sMp l2S,k7%#h{ֶ.VGXGqcn>PS>d9ҭGIeϠ7 /P$82jGޖ/N3R+ћ ݛaĴnUsU!@?ꕀ:je nצhl~s|& ;΀0jOe)#VecKIeh:{^Be7YeFG/:53aY!r K` f#(`=w%HA%jE%Oc쵘T/:t ˏ8׉rt2%Q :Ҥ~8vdVȞu2#kds ;"H}q0}8K) BPXpz ؝#~"#KXP ǽ"#94Ƽ\dDǃZEh؈2EG8qV#cN ^sN{!#|ЂԒV;o[ {^d3,ׯX.x6vй~ZC (\a2X7Bb3/e vŎIa?&޹2#`odojGvt==~FCz#Bm!xo @ƺm޴27U '#U2R{^>yc ᷸')58bL}aX@2CЂԒV;7 [[DL=Y*ToggXR~j+0}A%8tCF;R Rda8\硨Rsܑ?V<93dE1wb} Zsb6 |+2 ֜kA jX'X Gzl}!h75(۔@8u u,E,7Y[{2 ɨ0F)uTL*g{,BSoCUކnA` 1̛#+o>?F7jBܢ 솹 цD>6Uv*8\Z!H> S6B4^.ms)NlKFov:ͿA 9"J5'ҜKJJjR{ƒ6pXm/^m 8άuW&25gQR7(%9v,M:Jw$1>QMۮESHȁxˋFH:eM$Վ1 >}$0O)شpi o"MFi Cqe_fI0R kZ1'$M^0Mw|/k׶kE=k^vPɁp;fv9ꈽ]a޿B*Q;s&jr\]ϸ$ f$))&LJ$gC*Vȁpm88!#7-HA-a\mM?@5¨GpXv:h+߇U=;¾^ v(T +rD=0~yy\_'qmP@8N!#NC R6GsE9WGu99|WsoᚗE.b)BK`E,im{zQKs\|^zPЃaT0_}g"|˯_0 $Q=`"dЯ+M;L!7~|RtTh8$"q<9 Ah" 'L%HA%Ã>5NJ[q1>Q ÁK9,qqb0XlYZsV[p68?='|I\<=|V ,Gܒ{uā)DP%PڪBzԵjTxL3?ׯďC+%?׿$ϸIh__?E6_(CPef~TCiɌ;zY{`&eg2.$}#qp!пd\BlAB&X˞=WcVD-a|K_W Prֿo q}͵S^_6̎G %iO?~SJmw/|}P=܎4Rj?|GY_WU/[ :~d=V8ucdi"@yu ?~`pwxo+]2E}q|x?@E6ڋX ~@$_!/9V2u|SÏ_~JJ׬_.beO<)ϐ<<菔._Ly|r/|O<_~9A"7sQi5x:{g[;__::&^^M}"2%3|j C럿}BXv4G7~C'_*BL^vޯ lŰyɤαuˏ'jOe]^o|9wUMUeߌHL|mRDd^ՏUZX*4NRSi0Zvۆ !G%4W2\[,uX=YhIS<*Kܘ(,mcثC|~Ճ)@~p y6]d:=.tUkTBYG Fɍ}{^NU">G0%9%.2nc9Ey[)}K $XhSIK^헿>*YVd5 B%>ȨM$:Y{:γB^4djb&~:Y{m'd5g(gMzXQVqWStccN|8{ƌ"6r)vۏk{׾X샿Iy͞ҋDZW',endstream endobj 111 0 obj << /Filter /FlateDecode /Length 3636 >> stream xZKIoPS5)8 !.kF`Ӟmgk~;YYm `"lb']L\u)q|6=tOfY>?o0%t~-xSn)O|w~y=<OۿsCf _Ld|;..· K-gYw?]Xr&N;)U_e2=sf-@!/m*.nVdpu+BnIAJn)b`S,unԀ+s1 lR0i1v0u<|05L#i 6!bY<\KrYLf)wxQ5V'4_xk ȆkEq.@EK(NK4fSRiF(,Zj-wWY[c**:εkk++&;׈ε k k#3|vY&%k),!xoaz|R?BEKw$#@%zeq~}J+N7\ё*82t4[M~` X@J\""Π<`pn]+\a!>.CBUWt$ ! Yݍ 9M y#3p"E.ъXŌFCMy)[a#Ӫ+:%PP+[%\!oiJ)ɩHq3U@,ggq |rش VZupEGp4*ƂՈƱB< dr>e(7x 1Z6aˁE V!UID:nEVv ~o|7f́D)낆(y&,ЈmoױpU4br6ҕs6 K"!$u aª4U"!$NyӪ@4w> H~ahh4W4Vnbp8VdTbӗ : 'J6]p 3 G3NYѐ MC\ѭ. .{ r K8Df#x} )NVJ V|:nEVv ~zF; NY[3kFNmO^*,B4' d}f䇂Frtk/W5KZ ;  =AC-KV[9*aUWt%->V+:je[l!Wj7"ؔ/2p\Ih $n'{McCJsA9}]µȖ}'S/V"}DeJf13boꠡ2CJXvXqb[9]µ[nqpۭ<9c=Vz3vٸ GtC6f"Il<AY/8ϻA xcdb˂e9)9/ڣكRJSQL|zbƉhguжcbdM)fЅˆHNlbF)bap.dU H)@Loּ3"y2d'"Bs.K(*Uá [lDsAbetQJjJzR;8ꊸEM%@!0&A /DfYE<@awI|t}^Vӡ'i1  LQu#*R,΢s/n! J~D}vebd]5^i.u"~* rS&PV݉%j"PhLJ$rYA.tbDW}%D e9]SJBL#5äL2;AX!騾A)H&J-h6a!(I=gTi*='$!O]5izk$"$QY/<?. }J|ɢF (6s˴)HĮ!RY`^1O{}o]6Y%O%L^UE$hQ@q2^1y^QK(U#eZIdPOId Lqg,$xBhg 2JE'3"SJZp$P,]T,@<30ʠ9*mZbn ) 3 єdJ 5(4ҩMyҩ&y5 '`!['\}:>ĸW9i<+ԫk<U.h85=h8 G,pRA[EUi4 { eIÉ"%i8rБXbk.=5DG#$3W4b["E??.m].ϧݧK[Z#(Id@Uozk/c7)?=_OKlt ϟXguc^e#?.2Fs>O3">b5~r~'cp*qèet^&ƈG]_v~;=|B5vH(e~"0Ϗ  | ԭ+ݤn><|O"gkogn~x7|~<~C$a#+Kݷ]F/OwF8'Q~;cy}{mm˻ _x뻾 4ńglo~:<aWW-qjӍݿ?endstream endobj 112 0 obj << /Filter /FlateDecode /Length 14914 >> stream xKlGrWht,׮w AY4րjk&>k~D~!HWDFdZ+ax;Nӏiχvކm8<oto|o?}#s?xO#4߇O1c_np;@D?oXqmF]:>uo6jժ(QF9q>8=qV;/Q{oKQyNS+#8n׹jƫ=rS&o-`kKYDUVek!*57F>";~Cqk:}"y7R):9lGوZDmV9FAT0O9NB|^:FkS·X>޽)Jgʼ,LצD~HխA:AdO^Baz]~v3|0`q5trX_ o}kvMqW|9KTXXkut9!rB`=f.b5ӽ}1kzXEZwAkMezV~a) /,fwQ"}aiw1./g En/Յb}a9S\XŅE.l:.tm>S5r hϭԕMcԅ%ƬMȗ %L%&/1NѾX~.<1W鍨%/QC}aH8զnxiu!sJk@I<HAiM +p'ln(ဘӈZr)QbWC `(X`!3 D!B(IDAѽ& 5Q~x1UMJxlb,2(lGxS Ai.8mЊAA+I &q 8}8<W=!w.:=UX$ad"Dn S Y$aF;S iaw]HjM5jTݷkj2$QfW0 bks12 ^3*k12X <Ţ3bV A)mNP% JIҚA A%mq9dvN& !)9gL356RLP\C6BN3̊cb%% #,6 )8Hww@HjB_=O~8,j'92eWВ"MANp_,u\ǰG1<^ޯ(,BCFA9i!AZDB{9iqQHiSRDNZ赐5iEHK 6i7ФŵEZ H{<ùza6ٍiEi0:g65l&g6.2#)"(̦9lZFP01b6lH"3}#}J{#: 84}N]Q>4 DYTT* meR,2)I 1r.hR@ C@He L@H$ v ɬk[$CTQ& B#m#A]o?sC} 㷘sFϥ0[ӶR '`u f@PMZ T:fr䠕JBZhV %D(lePVzR (A|) y\FjI%l}=/@k8}Aù~rI d5G c& :#X$LYNIZNZ+2Erl3Lo+8?,Ne qH$S& 9#HZ'LkiGPh;b$`Lss\{w#Hj>՜3h\wL-ygP;v"yL!3(Ԝjj; 5%ޭ#Yr9EUPt*\L!ސt2I:BűϏoe[Jһ;sw* }gP;B߱pI:_kpwƄصOݎlԡv*@ -M H@  NhԲ &$;aW@PfW@L@ :ùJ"rʹuZ#GJ*rO,\J$.xqR ]㷬nyяy k?Y(/F A#Rԫַ̀(W;C HAlK`LP'[.oʹ H޲C{ y .z EB=[i7Bio[$oP&{ d'GQ[ { ^[hmyKCo+2<_بΰ+ې4V!)Q-fQ؁ R kT.5pdA YgdoAlv6M.6B%F$k2>WG3>mdPRd@Ar*A]>z/N.E|osS9^QIYHc (׏p NѨ~ /h^F0e&zNHr S4@/p nFHuX"q \#†ޝp n#xeӆ40/ i^Q_-?' O[_) FlU_~r?N/qPQb(09Lm63S(S 呩F[ a(P=6k.^Xv{nBg>a,P-0r^ TtG+f >mnAar;tn\q XFADn,߹_ӯ ̃[Kddl~\,2 SĂiV}(>Uk.@imP6$'AR|ɒ}s$q_ yPw,<5ihFlla)P6:J;d F^ Tܠwz8dK'\/[Ve,I $%'9-AnB M(n]"n Ɛ=Oie- HBlkSZv 9 ݻl8vliFlЉA 1rA Xֶ H{A%0qA 2iEЌؘQ?@im9P$?>%9P6;%sm9tmbm辜vfu_NA$s9@&bd9@Izwms@̡W9@Kusxo{9A@A"  ܇AP=v T=ז'0(loy'`&L+O |O Oo[Ŧ9 툵'`'(<1 O ݻlO ĵAPuܴ]oc }l{H"7nJ/zOk[$'%{sԅזIZ@}œ,oݗzߌ=A{jz#HzO#}o#HzD?m1}SDc|PԗĒzHʥ"7nJ/ROk[$'{s,ԅזmIZ@K}œҖ,oκO[ꛅlJ$C&K=b$rzJkG!?^3cDE!*%I} hzX *N/dVw;f#HN {ՍSVw\[$UwJkuknI=$uYݻ޼uҭB6i[!1RwI{w;c8>N! ́;{ѩ7UeSƴRo͙B wյzcRo^;ԛoHޘV(Sol)zw$wίKz Y7 fP7ԛ2InK9gƵ;^7F&h6S.MhSUK=CDmY"ژI 6,NwoEJ񆤢}mhSG,alDJh7 و6h#HMoцLmH{%6WD&z|ZCxS5;P\[ ?'ԛC&N\CZCXVR X)0iX #]4%FK4$(ӭOj8soj(ܺqnF Ks2SR 3a˰zr'BSNir">+\I Ird DRUn+TH.Q@f*ڌ$: 3nMnU\ Mk[o5.#(wmiƴ1 7(2$#HL[nQ%,#H mE8M?y=ӧC[OKz}zMoȗoDUZ48A48= @@1*<7:nV+ `&V6Jk.lI@ dT A5A|I$k>e#H2 |7C,ԅe+ mM[}9M/ [ h~"~JmGd@7P7ɛQ8 y3 d`77#,}:En* X8m4N%J\ͅ-ݕJ˩R7bBi7 &1!Tt1/٦ڈ FLh6#ɦ|\>YC5*!}#sEK=oGA{In=$jIC'oFl$vԒ Uuh͈FZ$U'UĪBNڊ]Xqm:SMVujVuI$Uɪe ĂdZqAPdmYv xt.b}Xljf'wU|m%#6z+ ꨤ =8(`dzp,MV\Iv or['ajyiIŰt@-%È!s;h8-Զ dlx6-esU>0:hmuu_ ;(ôᎣQ=zi>ֽy62:;-+f٨@[ּo-mCA:jfGGu|jbRa%"HH##Kxd#dU<AH#GBúF5RvCj`itFJk7DArC bHؽrCj7r2@l"}Gixד8A2;$&(ô2;$k`CPXZި<doT2酺]&`ޜȘ@2(,o[e1(Ap (}pqDI7IvǠ;!(쎚q;1r8%/c;^;ApKv!HvǠ;lBǙ$cP8$cp5%0\ cjVL6nͭb}Գw!FTbz!5$.⚘^ &WyT'q!6`r6J($$(Fd $J7YזQ"HFI {#}{ヘ(1kE'k{ 'dDP'fDArO*I/[T oa{HΩ0q#==< "A5yL"F*S4u HS52A:.:@ԁeSEST^fAy@i&Pni7 mi!j &th7 AnGMCz呧2R>ݐlէZ\44qNUA1]_;ԫ!IOCy}=`z?w8=.7*{'ƩsdT8Ʃ5NaM8Nq8I_Txcrjԗ35NaƩ5N5@qLw4:ێSdl.4Nu]S1N5@qAqq5N5@cbۑ7Ԏ+T8j8cx3V#2׌Ū^U3j5)+tbjSͨt[Tlj֓SA1N<]pecjS k?Fh㡎7tXFַgE=r\49 E5h jBF.#d*},#ȅ \M>raȅE]v3rzBF.i&']Z&d xadA@=z \Cd,CCC(Ի) t#ρl9ǎCad1}'n~ k!LxMj6;MS1(>{m3},.dvjNz`6ڏtYFn$4후$GjS&;`٥C3KoC"YJ?"S& >՗?gYT 2$ @< -m@P@I>;!*^Fdn@0+J/ . $ F$jS&I0b/oS3]a+` H%"bihH0- FTAR]*ɪKҞ-LiԄUIuK -dPEhqm m}RZ+VKy79 dP&$L dPH$&Ot,5{ӆTRGJ^;yw.-dP&'LMn2(A!T+9C79k&^&tHuMH%Qj7nܣyvZ\DQj`7٥A3&B\8U2YHmM% "H2H%Y)eAAIqc M&,5-%.VHk"^I #k"-M쾥݂`MeE$)" ib՟LDH$PE]Ԍ7~QdAL?Ni"f Bg041ކPkGZ #9GjY+}b>R}DIKttA6I =$aC A6IàI }0pz~34[!FZ @E5JoQCD A͖^[094UYO ԞՎ8Xnt,K Yu SN1&tAS쑄 ;FQpQ5AQ\C*!VԢ kbLB$]Xa *ZRB8i׼aVt%+ \Ӂ7ԥ F BY] uO7K]$!nP& b$$PId@4AP?Wp:`xSȣqN"9opy^O}*6=])ӡR(zގSv+6qQ/bt~l'|?^?x#Bx݆ߗ9ztϧ24/~'ȾqFfaO"\?/q;/a>/_o_<26<~w<ڑ_m*4zıWO?~y> stream xmWyXS!$Z-UyDho|NUТVE2@ I IBHŒ C"$ #Z:UK[Z =D{/w>{,ۋ`Xօ,8%G l02/;KGGĔԅiA%e1qkHZ8kޞ17 b@!&P"XOL&6 DD!"b1xXJˉb%#A|b O"| MLE$Jc^^߲+[ 㨸 LPaa?yU#&q/6l+G>e*?`X?ABrd&ߛ<#U _)u xs0"SjKj AfiEB\_J[ƲC.,Z<4`-Gş?("眊+8~B@N^? Nnjjp+&{zN (1 "4kcɱ lɰ^Da .Y8=4zțq0ȶ 6@Ԏo^&l3,l.*^SdX:T\y@ eqq[VW`F[[>T~`ԡwր}&PnBeE]&JgGVH=vwZH^c&Qx'I>FnGKz\}Su 'ruY [~!H+Y>n<[[>TFǥÀzԀF/.3 RP?#ȁ1q+j}L[fMZTFyv^&1@Ze1r_YGd}Z UVoc/Or}.W9 |!ZJJn(.2SXf\`99aOruR_c.?*74eH󛨉 u֨uC|]>ȣ%ae} lI ȧ\SJY:)AFI?5658Nf{}"nDo_DZ6FuȒV.hpFW '?.KP -vyDž dA$H <7(>)aGl  dw_˜<`?Y JeFQn*Ĥ.)r37&^Yd"CmU({8&$_D}ݼdg@0ƯhޭkTI_HHUϗe221NY<duB {/P$TjCJ;SjFb:s솭i" 1f/]i`g r`, }1SM[ě/ f9GTM#ءZeφw<@ͻ<"G8""KDЫ68 zz=]T\G*LU Sbsg~l!@6ۙƔJ c>cFmH Xm= Tp 'L<˭*5UBbC45,4/q 4:-PxYo@W/쌮ToEn,Rh[x&7{)7gnk5++x ccN Bw5Z S(ѷvdZlBf121&z:(F+,lK=`vLz`GT H/L 6ywjdXM!s[8ڏ0Y7*cEY+)[]kVV PPuv5SiFh0rs+I51;7;3:zns Tj{K^ AsG-go|RQ‚EyLNm[)IV=ome+YHЩ ̏Ydž=s Qdr;tao#V7GMpƂYf HPp;01%c$Ֆ]3A3j`2|ڂAru1ѼV nP?-B음H]㛉[n4`fY.X -Wa(PEr!Oku } CAhzdpdjm&K) 2Yj:m 4Q9=5PV0ow?뤾s=t+&V$-W{,}v2s)Y مp*imiԐ@_W*ʀI'f9GzWY 5Q 6(M6nPSHRbgTܩ{A(VP*1^Ͳ!ڃPi_ x7zEBHPZi˒f$LXG@X( }ؐtl; ɒwŲеkօR(4JPDI3HpKobq}'OGd6q{ws[{wjs,ApӓyO/סOt_絶Uv+i@AU- *!ESoxoLGTLa{-ёfl!i3R 6QJ,c?#o^._lb=_}J5[v{#Eendstream endobj 114 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 8732 >> stream xYxǶ^c]JXѵ($'@Hf7ۀmI"QoeM4{ &q ! BFfm?ݝ9?9AEDDDY6giK%!h@Hпsؘ0$ <6`-jf֬9o /l۲0?) yQJ۶/M]<}eFOkS>j1>=nؗ^6LJ#b ,xXB$erb4C$^ ULb,E#Zmb1%/Db1#& WxUb!BHK &CaI}DI 'hMOE%SM "~9'eԮ>їz]ďnT۠',~*a<՗3cYs;{uCi6l{O+Ow>8bgcmz=ܭG^([+G/[D[ĀaաzIDS!2l)5mu{=;& JXr=9)@LI0ٔ (-և2Y@h+Up*J8&ާu ЋehZ\_3I!8{Db 精=6㵗,,4BMQKÓ%vliW\bw8bi P𷈿!$6- @^p0w0^cLh rQϝYD@ D`fjVL3S>Pbe{]GCƅ"N= ܳee @e4EX4Ca!GTٓ%zxKSP 7;b=p\q^gpaUhUbqxh$&B םhE#\%w"$ 8XBr[>\h3Q夤 ?@}nF_$a9st3GĪ(-kH^P L Ա+؊bf֤cva=lO ?cd˟rwU; 1ő(=|@MfCN8谒nzKk _QP&5upUmXz=2<nj⣶ +y]."r0GϒbL'8غ F&ޟ4*Os$] . Y)RA:E˳O_un6zF/f`7QV(k/Rf 5 c>p_NǗ&ҽdOV^屛03~<0ԅJ6RB܆owKyCٝZI;t"1@i(@9 $NֲBme:d@@)TN2- NK;Ɖ֕S5'ދCv[P^ا'+-m )YƠQ-%h!|Wb]>paj9~QKzMC1cΜLHdxyY ͒VO:PP}yn@jBjKUW` Bh'{r#<]:zO`(ܜmC xUIm42t8Dlr|&Ů*8=bD. Iɴ >׳#hEdOHڲ̒sԨ_wؽȆKXt[-dJ6M*59da;p bo@1K`Cݕ0IBoܲT(m s'L[љ|۠ҩJ(jT5Swe#U!sU8I",, ELXqѮOǑ2Dn\&YMV`!ט[R'];?-YDא-mQE7QpvpNW6Ia?(k8Vy꘽Qb-l-rًr+VU$6y mDn[3>eȚ U9R"{A5*D NC̀Zɯ wԗjU@mRR4-h eCڑktm7 RB~Q;LE` ư``ho 6ϛh6CIכJN#bԱn+F#hkn Vٺ-t:|J$mޛYW[_4g`*E9k/Szֺi;F޵bePګ(2(Mt줙 V{JJ%^oTP!,v[gS閛e| D@$|B^]j: T_=rȾv>N_(S Nc'N0}agI?7D)+JJKK2_v;tfk95@CTE Cd3K]ny4mi{U\dB;@uU~gOsdΥĵ83= WTE5*~{(~ܝp) .vdr2ɀWea֞l7 9BO%$o5,~nsVAz8 `eԣR]Rgo? ZF6ccvϰ Ԑz Qe33g$Q]6{cn^ïB{H 3Pڋ"^VSTd2F$5sHJkS/Y(~a`>̺vC,ȹtZmqݘ%:FJix- ݇T1>a/bc1>8a%$h7axBŎn3V9춋=d5-l 0yj؋opUn0?~M/uW]!TޙdAY2EʲqV7~ZyYVN&P-lb\PH3醢8$d@,7v^5,mUEz`#O` _n`4Kty9FbMnR3 IJ',)dPCqĨut|GTj+W.5l;kFf =x[6ӿKY-\H~NckFy(-,k2}Ł!ԕ[+-{q@5 l )MKT~5pOJ돉އ3o>NpL: `5>y~_B9ow9Pt 4QvszP(Uh XΝ]~LUVFYM*VdTNڞZ$ zބT .bUQ+c|U9M|iuFL`/()9.qߨޜ9?B%_t>w=\E=uZ_V#Cer- M)^_K?@c`Igcb,m][Ѹ 9o ū dᱮ l+~KlM5rn$8MN U5QPȓ){|lsV: w*>0H9T.SbUЕ+ U Zm9ێpqq_lx:R(c]FPaap&{(]4[Ɏ~ xѓp*C*P (x]|rl}I>#|%/Kxv_}XjuЍG/JDe!fLm'*?zTL%b-Qx=w>FE/srp5ƕm|hm$Mjڨr)EҔW+.&M-l,ڱƬ1k h3ف[FxX\1˭_/T cO24,liN ʔ%y78(IO:Yj7x5h< 1u>Vݾ(#}<}Qڄqci4U*.rbW_x+ݣ-mbBd!r5DL6PX%Áf݈aXr`e,k ߘ+`%Vَ߇FfwHFBFCώG#r)nf-R!>4ɨdς0?$İ׆`=, >9vTCuuC}nUNvn^sO>"ҟflߞFD2 h&u \j<Ӄ{>#`xcb{.\mhl-YVm0P9y*Im]eE͹Xn@B8#Ȃ̂}P%K i3W=0x<-ꇈI|<=wkT6~gpP =ce@%+BYfn~c( 980KNi 80s2vCgbl&גb?y7 5^/hPMNCq?ȔX:*TUh} 0pk _F_n#Nr '~ I 4R͗%aD/ʣ'ș 5T(?[X[WS]^JD -Qw>`%G6nō]*LrPzڬ-K*dA*DҰEpPG,4/GN꡼,? RR $@n/Ѭ;\t& Ű +uTc0?3Iu7aAfDxR@#3Q B˹&AtXizZ\Ίp]x ׹Պ8{ɱ׽oD:o3[ţ @` Bg4wκM]vUn A۞fskN\|Ш:d3A*@< =[27>S$?pd8hYM=$Sf7|4]B@%mgonSQTV6fP62>qEp8~3yڄKK-[2_kcY~}5~I+ӄ/ R)%n}]]]CK_0Q/~^7sNRL@cN8<'JjQڦҍ`#XHgq.`}#_~10"i9p SI\b'άq\T/(fF.ՎEKIS\`9Wy]T dh-+)??F ?7\F/ެΧC>=:ћǦjC*>3ۓ )Gwa 1$C$8􆻄9er }TNE^mcʪ-ޠ2SRC:fJo@h1()S[_^9yFĚB9|O~޿A?Yendstream endobj 115 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7563 >> stream xzxT7!Q,( HH 35F ADRcc9G]ݜkF@|翗' ]{v޽%,xbȑc$7 *@P$&MRBTbETbt,WY=wͼוXg=tƍ[2O< s0b1x(!"/ EdUb 1xxxXLL%FӈD11xxxA}36t^?#}vt>qnzH j$nb嶸8Ko+BLAh R-ajI@[n h qE@g1^~[(F.7\TX bcjnx97b7NjK)FPAh t ~4bjZ3>fx | 5IZLit6w$jGLO3eBiIwARN dwBNʃ:^)/x9GbDo7Ѧ3t޶̈̇mKAJGq {/pϣG|wJ]媨5%2vkh(z'Ϝf$J&u_U.3]_WF#9v|8xCvRfqXs}ZpIKݐB~A䯓\TZEn0iѤ*^zP-{\D YnDfMe:zPo N5e ),-UIva-K=h9%n˭"V,jYzוkJ^F% :\ɱ\o <궈 D 2qe%D8^~<ؒ!Цp }#%6[\\{l(wwGհy3˥УY80 .ΗfY/mi,]p=q]F :K5^^\u b6O F .[Γ)M@ V418$4Z@UČXԵLB5{B%JLFz2QShbΑh9sNWꄹ%K_N8T/⣫d6XpB'8ϸ(@!P"MNY^ſ G,1Mp$"{P/tC7,K*J%͝ë+[f, ~AqZR% YjRE\T7EhoH);4Vpˋ1/Sj,Œ(f}MҘYQ,="jǥ_~Dypzr`unBJq[Ex=G&4ADĬ UWAj G :waKꄘVI^߬ኢ:}: ޔ0717svГi+5|6H=h̠A2 n1#4bjTW'ٽ4fŁ#?}l*n:և|qL>GƵ2gQH$7 =g}`7ܖظɽ'h8=փXf o$U%& pO>T N_} -RTV dpMxn2܄/@% 7wkAd.bv]WOJ0ZٲKn;)Z"hOA"M%> ])cyȄUR*vq5n~o8 j X%,fRwMg<$ !ZLUFY RP4b(Q Fúr@UʤuDbglQz>moyCB:i[ EEEQ]i!hU5 [ƴn{SAb0j =^[:~@<ŅL(ޟ_Np*ge7?RN*tDkyV`,nl}ЄBg{ d؛J<wXhaS<`|\ UR򅨫0Hr-̞P%ٛ5z}x@]~=aÐ=rR0sŕt;ކj!eNRM[`+}k'-QWȑmq=f鿺5)YCS;vw"[YkO"pb'Uؼ xj׏;mL& J_|1O*W3!І gX4HeX}TI{X:>sR"jj̙eOXs8"t׹$,Xc~¾#; @,JG4ZC@2l{Wql/ ՑN/#PHۑ R"iQ*j8: @Yvt_yiGf,銝jn\R.pmNtaz~_Ï)O½}N~egqSq^{B6wpioqlZ6A*:6\^i Q\?΁.6?ؔ [lPwTEK8ʗz{\<ԪTbacťB $hB ٙhF  ƚ9uݑ؞4.ƣ Ðj$;^xzӿW42皈'V;%NX,`L4" ^pa7řJ,R?93QR\\lZS nkNrM>x(zK\zX[ AfY ³RX"\&zC!K5JqEG}Jdv%;7;ޥ<$+L cfjR:,>cTz K}lhR76:w;fwH$xОu_ gAԁí>fHoLIkJk+4e5ukjڵ6\_7Sxm{yȮ;4ʵғ /~17Hmy{P"'P{k022xa]xu5@ hX(41[NU˰watIMfR[VUXuE`hET(숳AMT6ț c`3rL:l6TSkR &sq'įl9aH'ݐv$^fg{ͺpz~ho`}1=oTύ[Y\pMfsO@\Xd0t6Ʊ۸ Rw݇e.Tf`,z>yG3)Y߶~EޛxԾr&˽a@upAm=WCed Ƭ1ϪSm:.P^[V>'9I32dNC*QN#7:% W U FW]'@!%UtCClƂw@ۏ?F643Jwly)ʸ5[7lSڐ KW=ȋCVN6].,iZ4f<6liRB }J,~vVx#!]te*r y꧇%6-_ VNm܊{>4&LeFLcLlJ GnSPlNJp~ ᫄g;gU8"9Πose2 Vnuͪ/o X J.YR50 D QQMkH ruȍrFdadB}J{ >6b#Q P->ΥoL]R0gl^oCO|wisYKֳXAv.iZ6'oAW.WH:QO**erzqDY=8]W} ݯFF;9Uʭp@:G1ŮʜR,8;0;<ۻBkccù)bS^_c/zXzKR0YǶ2TL/2lUGC>ԨՅ 2¶I*}"[rrP"ՊX O:}>ԡ wld-a_uV+Y:\`ikx RLs 'Zj&!k q|^$bڧ^^&Dk7\:dž[јG fYN5Y:q[RgC [ O5&Mi=3{6q_QG_"Y:GcqL:yOXz򈆉Uﴸ/NGǤw 6J!7Ґ6iDˎkV,T T:#~T\ľ )(u>eS<;!h[-I)AIe O7?a5|ޙO p- W<҂\^<섐9gu<~݌0vSgl;) m8%'uހ2q_GwrwP|3Uk2mVCyHP>tvO쪚ue)~uw6i6:3!Зw|ˍ.20FA_sa=ILQUXTk jsr#JRҫuP]PR5(SJ?, 0/DR"ˎ;v}Jʧp_z=K{ (ȓu*96I3HE|&$ ◅BVكSHb0ֆćeNDWxe{3C*"OH7 7 9k|ٸC̭ w~WTT9{[(uj.\?@:)yPy;dϵh t// KR_WYޏ"@MB[sS DRz+Iέ Zp9KX5 ~_GODEzsO"Jk)S- WWf! n,!J  -5(YxJ^ UV{) R@,gXD=177eh1ZnV"f%?ěR8oOz oj>{@^Cn>7=xF %/j3@_:-Y_]^jiB)AU0 e:Ȥ1V%~ϱ']g^%4<³ކ;Νh"=T쇥JӗW)K^ tg28~F6K25vYSUT,Py"bWݖ}_=ߛm=ov|ΑS8R0T֔x^'qz"VkF^5G[ah6ǴEUkQgQ WWQu@aT+`nOߗ 7Ԁendstream endobj 116 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 6748 >> stream xy xս3E "K[*"(k@HB}d@[0*Kw*ui3I@{{s<| ϼg˙"!aZԩS SH4sKqh\4ŸG7[Bˋ[HJ+m^Uk쬛6OξLԇ~Db-g`d=Ϻk-E\dKy_ֱaggMa-`=zkkk:k QR25U*fg e(Κɺ555Uư6#cYF֡ DFa{sdgr\˸6ͅ\'Fp#MPiiNb!"+YD XRgh4HB:,g?xU#&-`M|/[ DTx:HG}"(7{ʕrx8ޅvA7ZI֘劾;.wK Wy7s;bi&T`n{<a.w({f-W?c{|ݾ]k ~;@&?i)9|9Wpa#iB " C#7؋+TuK2rč}'h۞qgiGE]L_%+V2yi/ǞV3JB- /`$WDZ`:bgy;.TfNyHLG)aF3{}%uދ+Jsnú-+|ڽbf&`ޜ+'n(J6R)9x<6wy~"hsNg*y>IQYcB"L`A  ZiaK벥*{B2kBꓠ&j,:Iys 6P/@a/K}B hH[ ?+BURm@,1Q?|RiS! S'"ZNE$jwqYP@s\zP> 8:.@Ǟ y*Le)BOӢE6Q7A /rxt+qbx^޺#;}ZTc˼/xkܼ**/ %ݻ{͛MV32Q=3 ()1$U,A* dOڥ6)s2 O5NQ5\pr-ɓ*MoKU",VY& @iTxSqOVQRN#rzjEeVYUP͞sf~ٺ9!uf&i:ItGy]m'#t7/C<2 '+836Ë|U6d|3kY-ZT(Hª4}sIs8 },HP9S5W䧏w)IT8+y$c֯ yvÏ0!H zR@*44B}WVjV*M5MUmJףO1>e)GB=֏~XgL޿Sg*UrI7DLO^gӗUBs%iPIAf]{${yk M;ٱO^Fy.r7X=&I%A>9EP/r@\M\F`Y 49MRθ)Q#Ce6Z(sՆtA>k Q@; P iҐ2E0hY"]#J]SeŽs AQ43Ur0M*0~\pnڞtfa+Mrh3"#X4V5dng670s.lPk/;fKN?ֆ(lJN']П~g?aP|v,w0wP $Z=p0IB NP&QK@RJQm @: *ltMHVIIIa/2Ecَv9; ( 8~DKorA_PP+J*,R4 BJw^| !LLf#LMY#jPbsPr*2JQwc۝~GGQǮ-'4 h(dK)aXs+C+=F! /D $M5?X*?;X8~\iMNW 0cP f,d¬wGN#Sm)A׀O~𗯾&X `* EYݏ|ݏ*ZIl֫Y`~;o+#3̾#8f.yZ ~Da&}<%`>8=ւ>nJӕ>6hUނН0'Wxׅb^=3 =݇> 31#ȫ)r&.>vô%Vٖ-A,QʛjJ 8oҸ+g/!E:+!"l&*i7ZR)Vx1 _@8P{8Wձ;K\7fFWe}q1QkG,i†5u76~%HiNHrJ/3IV]b ⷙ9Wyl4^]Q]LՖE=p+z=fW.Fza'Ͼ[$< C2K1$F; ŏ7za^䥳b5 MnƤB2QHk 'ݷrSs  #\,%0hTR"~@!Y !Tu:'QcooevTM$P 2H=g[o捶G# ^{qፃ ]! 3 dbm"_᏾rRBFOc4et-N%%҇i>f)Pv8 ^k2lM$c<$&]Ha&aтy 4,c|,iY}{Qp9rsM_pKD|z3$ (<ǸXkY,tPo庘!j>;A9;=H1ӓP8X4 L:c}3Yj|r~Ce# }mIWґ܋}}'†`ʣiHNC?od$83[uR? ?q#Ϭۼ$nG3QہD"F0Mޟ>)SP800e^bK,ńaݦfCl BVUi EJ\E ?+L0pwNq\RD;PQ&F7!!rx6'9d_SD LaʰGmԮX׬)UQJFlWVOww OpW[T탔Îsxc%(X?>]?R9 ?f1>Ƿ<.EiZGbÓ'Sjp,Zul"b&g\V=,q>]|7.U-Vn쭋hqs=r2$A? +~CkŦ VVR3Y8LOؽvK('# (dfSq3FZ2HQd;;@ 79Vf>+aQϯin} H"vu@NpiIɴŵƆyos}ã [_Ðsh˙1 Ȍziwg%c1YfeT.Dp翾_GAd5;-OIH_ɝDE w.b+]tlb,B\.i@]l:l*rʛzN,\p}=w>!#" ?A!8$DBo+ S' =NH/(uAle&Ȱǀ,̊٠Vr@sQqi1ǭ15ԡEy@]쮦l-y[kG=v9wV;p)?g•uJ3n1p;H&:,7x y`Y%g!ɗ#\ jQQ~.qzZ}` +wjA{wa&vRjM;<ު#jPxtK{D?0BB!GweqQWD}XdfYxg՘H I΋n*-XFUў{*_[GDPMA3C,*ʪ* Ä8F&ߎ^ع-;5 ԄHG,җ~lYWYj$ua}yv.S_0OE#Crȩ .Z`{"ǻ ^QVG YN ͅRxkFնE kyb.3W<#.8 sP~~؆'1oW5CwmՒM"f<=<,^91 >mc.2"ktͷpx>'ƗT4%#[?O6rY]`S $+u7ʈBN,Ru+wfRD6yH-w;#[Xբ|q8s3zadU7&Q%u)E-jPvv^skf33y^aE4:$NROk/-RdQdQ}JK/'-?_9w}SMR<]KܘgDN!MO.dd^AxfIdEuPPg>әsKf<> stream x}[lm{$۾l `X @?9Y3ׇkwk$!63Z$kׅUŪ}yտr[q]?W8ֺ?^(vOۯ>}bk}_lKy}qoዲ?56o}~OE5辖<ѷMϿ/#(rȏcy;p9)>cc)tFۧG?>>U޶Z1OXahiI֏}v9ַާk o.b=(iL*;8Ζi!>|XOoƭC(>}f_>}]-tsU?1fmI־l'< /F^>,W?Z}[[yHeKeG<Եz_G{NR2$UQ(>ȯŋ껯_u>Z<uź_$K?>ԑ22:?hb5m_㹆~cd/@ilu;#?!=ϴק9kqe=6`?减5Z۹!_̬@]O%jmcGsww__LJ[{_g$؋Am}wVfBv\N^Z˯j@mkT4]EږEH=/EƥHcEZ[~'a:}_׿g| ?c+]JaOӲ7[۲??ٮ=9l_=SWw%V/?aݧ/4f^Vuc#mN)SCZc۽f1bлC/s~r[1n,^[ڽlu{e6me?V},y7c[YfFݪoIR%06(!+B"‹7Z&:s3Lyi;u4/=%Fq!hgV 0FO:U~!F`:P.ڿF~$m:bVS9.%Z`C4*F@X-/ܳښ4(u}'.iEjC"釡{f=[_rQx hV m˚5u>ISJ6UOb= IBx=k٭@wzJh2qjG1MAKwCql>!n|tީhEJQd>?h7?lV_Z@۷<0Tͤk%>3ű~1< N1ʊHŦ;XmڗG?cB4; Ibe41}"@JA*DH0RW/lhh;F牃ot<:jV?i4zxhhP 8Q@6{i -&(~ud t`1w. bsRV4 ISO[|D0FSi|0a^P7;|y LnoX.%^VN:fArBhcnBQeZ8lhIkTPMYiSs $!,j4lt['h~qDW{N+96`.] >u.4b[*|@65 )6  %gt\G]$7ˋȋa#btU#8la`\][[/-q0c)"RKR֨'s4Uc,c|ҚthB (A syEʒ47h A)'QƝ0]>BЮAQgY&Tm rkպa99=]c>Z釢6%lH DK;&ή(¡:uӊ}hW4c'8/`ǤUuND $M,n^Bk't}TYae \Pb- Y6e*[Ǵ[:[sw0 0YD-CIeCxB {CmTwE!,INauVxE*\SFT@Zkqd?9W6ܜζ0oҊM"uXSuOp7n.IC:TDW㹷a͆e;IZ3}x>׽0zݓm-%L $|y8VQ夀oʄ䁶 ú nNjM:Mɾf5Ҋn6DJY[?!M>perOkzA62~Y/E'\lxV X,֯,}5>ho&ZͯgK02έL_SA(@DW'hXEҸlcEB %r)ޔ1 :TrT%4"ꊯ:ea5^&ǁEkzǚ6+nC*G='gG= 4TZXw% [p$ceKZò 0u q뙴t L 1NAS7raM q' 'OUQw"tmکtؚ҃]?ʿ <k v`}ek' }*B"L Zw Ͳ<W]g`j#=$_UnA{%fyw`0|+.`J^m%X'Ί1l.[Y(>ƺH; 9tdq-' dBHxOy<"73= {ƨ0^5^ë4V{)eBH:|-Lʉ`qOˊ+}gmC?, |߳\v s84pBЮH&]>* (FD/4l Lk s]~E0.$ NA c g09 >pЈp[vlge!ԅqp搱!"Y{Q.i"C:8қqrآ@4M/!N866:$RV8r#0ۓȉ' &k%@Tw"T_cL5!Q/^3OHrr]W4^wjDk ܔ^ ,G( / 4Q/N'C8W㓁.xE"Z "r(%09Bҡ윍o x&Z:Do"%n!A߬e g(cWXhW$8 ݓ~WO'-TY*SNQ"2~7/u'NlK^#82gMz[s!,KN׌H|C:DH YW?YYC_VpxCW z[VK!i6)~&RY4t!V ȏn'q#w,ދnY9{ Hjp;#޳80P D[0!$@xq\vv\t,hG 򠡗;dS{ Z:P"8Ƿ3tF Yi^o6nLl0-YcZnz^GmDH:Rq/S "%@!+39ZcilЬK՞4.ZKs !i@><,$fmV"HR/~m Gm1ln eP]vlIPGJ h@d"(=PAҿl1^3憘q*Z;޹\S7Zh^s@S`h7Sxm?"Ug!dcxra\BHq0e`|d!f4fj3J. Ij@4UBa9%F!xUt srœkc& >UQ\@pyip84F i^cfX<8NuF08N/6F U֧DkY>I*@qփSox^ VB6, 6mԆ}d+y u]q䅩T4`HDH:.ıF7" 6uYae \H<$&ÌN;apZR*TS)[8&!hJ9!VXqEbxZXrk#2wEj^NB+ wtlAoYm1>5F i^c]+#FDٝ"iv)!BҮh'q$Sh+F t هX[F қ-s דvBԁьяRi+B" iLZ9:wKNmU Bs@C&@TM${G#!R!}CGնk Ol~zv >s&I?~<MpH'S+KfbOC"U팩4(99ȔABF9Ј;I{3ʐAKGl< ?Sh)v 'Ka'([r**]Y͋:hӻ,<$ X'th b6U :|ܯ~;arlܲ0ɢ"MdhwI%p+@H:Xp CSC4tȊ+}[]T}8fХ@YTqض:YABH )6 xVp3ıFlYxayҒZ$דkL*P"8:.Jʙ8u~dL c!y(*.~J]Iv?['Ńt c oeQJ~~,<S,by!*γ B,!Z8N僤-1E%dSXDR4 Є?UVvŢyEcM;-WOAS.瘡 RU:S6N8:MvC=)8B>OPN'NqP" bl'5t!Vo;ꇁIcDw;mΠѩ+^N62v ( v(HF)[JȈpq] VP LݲT/We[{y8>dX1Agc!$ Bc6кҳaGFm$'kIk i~=40ӎ-5[2!BAHo=Lk-^_`c0%ZB9}9-/Êp;pmtോ礭HͰkK'x4Ӑ$v\"HW7]. |( B" ~~]v\x(Nƛ5m pJx|J mU>H)@lʹ.T6@,猇^]-ݧu>_RJ#KT,u EjwV~u#!dc\ࢹsۧm?16J nk^m@+Z퓥 !hWl1έӹIiDHpB_ ne}LBh Dc]*%0ZkR1*s]PIi߳pq<G҈73<+ȣvz]z=i\)r a86 %,jIia9J"lor,\1U.Tpng'37UDISO{zs= }!F =[}۳3|P5wF?4b9NB;%$/BX OB"L  G1IClP-:0͉=JQJ&B!K@ 2uVVDX)?kݮM1qçׅJV3,ֽM@4 =r ڛ/mgHW/3z_тqXA.Gʆg3Q8{ Hzם9$> 4aCJD(`xیhu邆`&M\ '"d&F r2rE=*b%[.{&SIAK O$'}2!v ŏ΍h:F9) B-Wu98O{ZU[ɇojUh?[E}A u 06 _=7D0vHi?#pu{h8Crlda4v+GH`^fr ]x1\X2~I%Co% N $=yN&@(\,W>ppeL#IyhYuc>%+'T^H#޴"$@ATNoN@)~4+ hϙM L4Ux q"zDG[KZ#_  ;At4x9 .Ф}ĐjR8]V- D5""Wh^X3ӟr^|@H:<Gij!N$V Cp_M\i<Zerm@H:gDGJR[Q ; xƓ}'G@ژ6-蠡SO'%BԡM7;y0j }gVDX/~pO`y@3c[YgB _ZG;IaCɈg&Ii|0Bi^FUGӗݠؕY*aCoD-C}x+NV"AkOVH"‹Mk88s VY*cUKCu*DH02.^:Ǻ<.?+IӐv@T!×&Brz: B⪟ "|.Q=: PM@U29dOYb,!DA_w*^ e 2yۊv@$=ْie&OP,9;,6 4X&DW'͞dqt}5fIS%I ^V=˹;BB[1 |<ͧz{񗆐H^A[҂jI]MmOBeS|K Ja^h.դ<牣0i|S@TqqJO >̞IS'o a@ ~VH"‹ {o0 >?fV||ְ?Ƴ$>']+z/n2Ҿ++$ ꁢaO ޣAoMc8Ъ+w)k eH8~p=) L01N0bRGx9=9/L|D{I@ۤβ$$@T%i-q3t)'QBF@W/+09rl!gLX{P1jz|M<SÈ&DW'dce2ip W=Ж[KZ;I»Q4uo&BrhgZAδ~ɭd:"ΡCP1ߤ zq1Nk'ҁK3bsG+R"L4jl\G[jW UԩhpbJHU@@,YC-H2~dr. aKP$6n|ׯILf"ۉ0ªs!%dEJB v6glW!Vg s 69e׃BΩh6i8\1:o7?n^}'υnͿmg ~z6t{:i?j>lC̯~&c_k\Hwj@†8;hh͊pL69^oXa"%dN٠|g%8fmO8}$ϐ4ui67? $!/21_}Gg'~9gocɠ}0jZL}¤t.\"]W;C qJ!t>tdY/NOqўOZI2&Bҫ^uxzShˊ+⇢.>#=jQƉK%8%_O;S k XfVWrRfg!O6c!'s'oi4qclendstream endobj 118 0 obj << /Filter /FlateDecode /Length 171 >> stream x]; D{N7[4q(Jr,a\lH1#-;DE*ր#MƲe0Sqgendstream endobj 119 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 236 >> stream xcd`ab`dd v 1400q$2{E3'@r\Eez%ņ L  ̌S3g?˾K3~W];om†@X7mfn3Zn> stream xMU{P_@̍GiԉԘִiipE(o{w{h[AQI:Nv&vڽt?~yؼ|,//oΒͯY&&vc[}}Ϸw>"Wiہc; lۈJ-X) [$܍b˟)XWy + oOFEO׊1Szt\{*6 _.6dalq`4Nd)QjiK% #H4pĭ+_sӢc% x:Pձ㟍<8ݴ>)d)ڢ5측QA # y'=WٌzlHEŖyϷع\f21Cr"DܲWϫbGhjTm_ZfPg`bW3W'S \wYl_1hRrfMݢ`Ә {\f[Fcꈌ0[(7 4Yi>rB;Ń%Xon ^ Z+YLi5N YDNʸPH' Y胬DEj碗Y6рpW^1_CK͖fsZ9V|2DtKGHD{wE8rn s6R ҃}ٳ[-D@lի:ACX'Fi<<uhP;`M8%i du /^tw_=bDO[O.ploR7k[wKvOL̗N9ZIaw`RS9"Æx/{> stream x{LSw<~:`cIȖ[K露 qXj)G>Ͻ}>.t<@y`8dEXnd$Wv忓sΗ$v$I&~Nr|xH@R{>J+;̈́R  뛚+'a"( l"H\GFq6K)IHƬ)[G {1Fnm2NnęAKmPv)O8f3i!;q޳‡ FP 0{X8p"m4-4U"~p6[o$N_%b{vm46NхK3YB"_u#&jѰ<ڎ- 5e0h 4sQ0Pu5+\ߤˮR)| .}ɑNj]p ךjG!~gzLוJ~W\A6:XE#zVR{e9%` 4._9UUʢnPL\ҰVBd{O+Gx7څR~vc##+XK,U4;he?-Ԙ;@.^l@5UgtOо07~ GwG?PURp}Nl^K:ZVUNG9Xa1/*+ezՊh-z_H",i'by/𴹅U THA/?~-; tYz^L6 h+u>S_>fPwO<2 d)ԞC}I {zendstream endobj 122 0 obj << /Filter /FlateDecode /Length 590 >> stream xT@]\X a=X˃r QBXzmF8 3 8avwa ÒU]/C -5$ !Hh@V⅒ 0&fc:iF$vzdG+WRM~5AvK;%Nj_@xfyO_;+lӤG.z$fHm{hnmkv+m:eW~eoT_{.7@*a?yEGܳX[>A׍Y6ksѤm|dM3ĻzUS}I)#W PG* u|{@)ݤ^j{8 eDkhxuxQb|!DuxRf&z?HsLQ?ǘ1Aendstream endobj 123 0 obj << /BitsPerComponent 8 /ColorSpace /DeviceGray /DecodeParms << /Columns 78 /Predictor 15 >> /Filter /FlateDecode /Height 104 /Subtype /Image /Width 78 /Length 386 >> stream xI0pCvb~Bm Ȳ |T'VNfmӫtB]nf8=e9NrzR>'d!}Yn8gj4girpes8x-gw" Lb l2 |fTz Wb spmpG^[{18c:xpdp,ԁpy͚g?ε ?z=ﯕ2WԊ\UX X,k%~YrRӲ3j\p-L T26ǹ= t6w;XgO puS{n0aWh%|kŕ ֢.ǂv~mgendstream endobj 124 0 obj << /BitsPerComponent 8 /ColorSpace /DeviceRGB /DecodeParms << /Colors 3 /Columns 78 /Predictor 15 >> /Filter /FlateDecode /Height 104 /SMask 123 0 R /Subtype /Image /Width 78 /Length 1174 >> stream xݜ͙< ǕT&ɖRREΟRf7iHG29 !mqI'w\FluP?8 FN\s~J A{rTIiӥPgvT/Z ǓNΠP JSVToWAS.kJt{YQ pP;y mtgQً)N3G#z=hҩ5N:cHq)h4N `\uҐLR9qbT9JCQgKfk|}$Qgrտ!=փQwmݨܜSW3|JK؜z V@i›ˉQgd86 ,ˍJb(82FvUSV8#jj>K8z;ںʅvFڽ/hkOu:sO+xytjoP3+y*Aj'JupəNisRRTb-!ƚ,ߡI*./ 馅jirm %ΩCY:wVC=i==PL\m<bޞWà Ѩ6ͫaa(j3xw*O4Lq !%DiaHiǬ 8,)m'oir(*|ɵ58{UQ[-Y]5ٴ•8Q[ "l"Y(2ތ|=Nv$dƣ!z Tendstream endobj 125 0 obj << /Filter /FlateDecode /Length 14445 >> stream xKI+r-` M̢{쪬*J|TnL/~1}f) 77=]O= x~<yw{_~}yǟ>1㿾{ßOmNw?=Lpewz^>=>y7OOf8=}{y÷??Q_>ooß'r9 q֧zN>t>??%އWi,( /f%$ L\[;\χǚ tiQu[# đ󃭍ŝyжw4b1Iv8l&\zg-EvDv m;F;_NC[c#К`y[/imVEխdQl%kdJiRlXo%O$EJ^V%]{ҡf<5˵4uhIm݀vLɤ_דnY1h*:?/S8:YdF4:LyuzǬ :s0m3FǬi<4nع(?CPc9y.aD>(DfsI>(D!| Qc!môrK4 :%‡t`aD>t3 #E(tFܜQE(tFI3"Q0Qt6s"QD] Ƒ#M#|GFHmuu67tYGEqYGE:,##Nq̀K8t^7 4-d s_O:.ΰO}}Ý-O<ꔓF4>'N8itAMoIn&<4.áD[/N;ꈃhu~uVf<:0"s霣HD>ͻ8NWxl߽8.uH@J@':oC .+fۢՈLfUL+mU1(RHEҜH`D.HP"iN_C.HEB.Hh\$"A' 9HiU$cz^ݚ*i.f9+mXĢוJbQT\Wڪ[eŶQI(R%(* wONQI,9頦jDDQ˨S"2UF5T,O DiT?QC iT!QAl|Tڀӷ|Y8_E FJB. ڪXPjQ\]/(RH" \3(RѠHU" \7(RFrICԁ6\6Z>*UmU<3Q*l]<`E*7CtHŃ"T<$rHŃ"Thʵ? !OVDZRvSKhZBEZW T1[u1|VC"WL2bV"U \1(R*|n?;W% ;'rG%;9=>?G-c(,pܜ#9792p@se̍6Z 5D3e5tC3z069sko8\ښstKĹ2yBiy6:Rf)غFݧ}9=jiX? X~˭Q5ibnLzcE2qxZ2@8a ̚2$2Y$fQE_Z&bmE[oVXbY}}!?jps9m^w$+%8M pk]kIM\)BVVZS\n_N ũ 9!V:N {' y2m 8iL!{Gڗn1J Zīo!A(@THe«'\sG~kGώ#,%} A5硤h$I"%9)лI9)J ))hN ))^SSb)Nfm6c]"Sxrz҃&knۡA (4ځAE&"59d I4bG4lgcfꓓ@Eb;2aDf;vfdp"E98Ǣ-Z%bjAЎBL-9iv6sf;."2zᎢ;^z>YF,d7G~t(H b1(b]E7اQ#w3FdHG"a,c}tQ$Hا9X]-YYx?*@cS(,F0s# U(b )x,hLp{(4\`EGmp}ࣹ$=S)N X@? фhB?NӄhBC4wf?1#@W8b(ElɏM}]QG:g@[E #EA}Ԉ hꓭ=jId *]vNNf;9ۻl(Q$Hl5l''v({kN9pt$#2q"EFkq"8fwG[q&hGQp5xvdk(88jqAx̭9xsW?}[O=4bqLq)޴5Eوz7޴U`?#{F:MHǭy *أH|>:}^gݪ3vؙ}Ԕ L^3g:WV@L@2D9z72g*PL̙@NtR&H@kЧtMUByAr^E{y#QSW^Eռh_{h%EFD}+PT` hgl `~LgME"qD4r5و:6C ir2IF'A{MlQ#HH&!2jŨId( bPL6I(>?F1 (FP" ŰL¾TI"kG,'G6W\#X<v\Pl ft)ߢ4^[`߀tF҈"jͽ{ݛI+Q$HI[$Pf$H?ǹ2"f=麂'j1:Q/މH[G%҈2FaDFgְHV$%"EBLTm/I$'SMt7I$ɉ@'jN $20QDMP5$ID+ 6UdXvhI6.Q$^(E"&4ӝ0"SEdJ(I"SEds~?9Qo3$[nD'O( ~FDI"EO?Q#~=1?AT'ͣ刯}UZ2sE*2Wi~KdNotGV Z޶5da Y $2dQ$v߷!;QKǐ%[CnɐE'AY( ȢF lM\qQR\_-Desɘ^a.m̢HQ,o<~,h?>$,Ҁb`a 2jȤQ8FMx}#x >{4۽0Qn^w`2Q3%D%O苚( t#ؒO%AW\jsl޿6h^Fkl.l5€2N[68iNI#8%pJ8%|֢b+ 094&hNS8aLSNI8]AbALQ3a%AT@3zNlFI4"3D"qnAeDV+$lվ'}]ٵ!j0G&$0x+LTUl4Ag(R 1@\| *P$h^{d,hڮ߳]|QPСpR| EQDH@"B*559hLQebUHi=[pw e]ɂJ, $ :YhN[3h!cEJ)Yw3)fҴ]զ=b[Iq닟;+d~l8t8!E8QHC"'"dOM8$r9q]8XZ} d%UbBDIb|^^o.J#]K#B['@36/_{.#l8:PBDN )P-.':B[m4sIu4褤!E4QҠHIC"' "iOM4$rtcTI%M/M8G}Z;hD!EVޑ#"gbQD\A8b.#*XĢ )XĢ b"E:,=RSNP꠭RmFHĢ)XĢ )X4EkaM:x4,54A3 (yD8`%EJ9pP ?ܟhdҧ9Bp>tN DK(R.H"EE(RHQD( t.uWC<;OЉH,([-:o[YeQYFGY2(HهȾޣ2n4mg39 ATy凶JH-+, *{gF@쟈ґl(R ҵɥtLGixS 9Q D2D=)PCDN:)!أ]uᵕtvd>NbpDn(T}^hƢH3/m#ضgq+&q3]Nd[{?eUFGF#m"ʶ92#6E :Eб(Et(Rб(Emc:ze:))|(ڊ3Mqƚ3EHqƢ)X3Y?cmlRh6Oֺp<09gzH"ey 1"%l(RaJ 62GR$rJќR[ݤ*HBR EJ))HBR EJ)#:)}fRh>N)%"PBR{mYdBMDjR$rJn9P)2y1r"8fz E2)P(Q2)P(CD2U me9P(#y럮]8P(# E2)P(# E2)he(#'G99I}^tm"PBҋD,E`& 5 ,9hX(BvzX)i<̩6S jTCR EJ5)@S EJ5- )=[lq;)Ho]s߱ruOIHNB) Q$$EJB) i{XGpH3tmg$"#QD2DHEFj,~HL"G2(R$HWjW:*i"k0sl'MuX7m9e[5FW5$&['7"Qɍ%w89Q18݄2a=V!u~Fz&F'58-sMk)QFD9QFEg^GXk(asrHaM"5E k)IFE JnuXHܽk05^[LNdrr$'G2*iqi|&[E2J/qJ4 3"Q}?jruz]giޯ5zUsYV`XWxWEჶlj~ԯ44Ss F·=+)= _sGnjFU?>Dnj@WFl[55xm55褦ǠH}LViV}L FEjjPDnjPwsS[! 75(RS"55$r\4w>jjV} touS"55anjIM 8UuSCtSC+Xnjnjv$106Mƨe/䮆]M IKc`ٸUndܨA{U#Cv#Hj=YR'pjpHEifzONiI= 9AziP6DsA:sA:sA:U:ܹH ܹ]sA:s!;m:U"u.΅lݹH m;tRN΅lݹݹ ;;-u.8`ƀb{nNZI>"iˁOK;𛵲|tOjQ| ĜʗA'E G'>99QGE |GE |)AT :o}]]MDȭ -@Z [t+jPVP [(R+@V9d[4AV&XnnHkVIqFJ0t`0'r(a:V]S&EBEE,dBv,D'e!" YE$rhQF`dQ#,,l: iW$*c]b"JIEJH)ɢ PJ߷"'dQ$"%(%wNIUJ)N(pbMN$r8(‰3E*NQ8"LT'tR8‰N(R8HE 'rGI#r8H"N(R85ouN9@T 'u-9PB"{qG'DqHD"GA(Rц9뱉 uA"'r(H7"ELT=:$ޓy"E={Ux#2‡?%MI"% $2iN=0ּG߽=ڊ$2Q$ޣH 3=ٚ4A2)S NG(g:IF'QLi(Q$JBi)ݴP"4MĔF("Q9]ݴ]}6FݽK7ٚ(F[D7oߴ7: s~r%[(PY@@e*;PI@eQETPIT*0PY eQ`E&, lFI#Ͷ8[aEM)`m%lm`E&, l l}GDOY/LD3Q$"`0XI1+Q$VHQc.?d[Eb%J(+a3Q$i&"ٚ(iL6Ɠ~1@ToTkj$م"nuD m2eHjNдV #A" Ej2dֽFݷG"#y VC}Fq(h+5⦃Ybሌ޸NB=wml;-~C"9B5P$HY&!ٚ4AEĻ0ּkڮ[ƶ_l ?5P$~~;uCP6ջ5tiI)sl2^ ZN(C[ыl{A#2P$HjNpa5P$~/)%2e4A EB2^{a"ыDJfY΍i.vL"H0m3l?i 9rxRaR ("!ErhMeP$DeXA(âKHA2lH'nd.r6ENԂQGnuB(`W3P$9(P$@"U}s#ן?.@:m_^; E*\U mU ʅ".T(RȵJ뱬nn *U"U1\ݷ䒦rIH%M"4T(RIwfWR:7ʰH"T< Ń"T<(RŃ" T"3QDP!KT) T"$r3{YřeQY̲(,̲(,tfYgEqfeQYҜgBgmO9YwEۭGEziATnlY?Q? DrGoX_LPmwUPfUy>cT]Ny<YY*a9y.YH\GuYY;YNcYvwݛw 6^ݏO?Kx-+kRCZCbC\ލ'vCkvcxsl?KK/O7ocq͸w_>K6<}~>?~{ۘcOr7oݞ~}ڗxoj]O/uǻ?>M_51o߾K>y:r|oqN2 %ۤ2dzoގl< Ïxnm_ן_Jzd2*oyig]O:徼avzJ<`_b_.o/1n<i4>/zNS[Hv/'_>g5_|͏>៚|r9-6v~w󷟾| ]4oZ_yߦx$¸f7c2x>|Nv?,r~M{=IUq:> stream xZKo$ϯhXmC#HZ@V쬬@#펴؇|_&N샶)fUwԢ'i݇tO׻83%wBOڸ%)3Emt}}7q_Ϗ˻n9?풓/nOwӍ~;}P-K˶໙/}f;]ݫR76d+:-4YQ9A|xwͮ\WG$xWCբ 8+ (A~*TI9(HTWty^FO횁!}08…dh'a׿1`K}PhdOA5~}<ڑڛ%E=C2O{3Ec4UD?=S~g#@&睎.aMyt8a81meK6Jqczٸ6: (+19kbmԐ)3Ucި15L+N xBXN׊?}^rЭ%W Qbpƴ!WsƵ!WuFǵ"o2yG_vJ(oqPU@ `3^ %! k ƵECa˫N2:R6Q[mx-Dɘ|@ON39 ݽ"N8 iAxJSh%D6l- Ai]zʱ[w?0rCr9uHR %4ΰ" ICsKlA^|\otې NY/$o7&^[?*@FZ`2&sBqs$.gȊ Y8l5BwFI8mQ! kUcCp#OK Y#iƱApur= YN(,O QhhB4&caB4^wS\H{=4Ne\ǁA#7RAu9;\DhMº(PlED 6mW A)l'uح_xuc2$Q’4u+\LضiFThuF3!9!d7Q Q#uџ!),S$>zxݑLl,@ZI3{@ Vi[,Xquj &_[>j ZE쮩e}\^kt16kvqlDYq`1ڰoˑs=\DhMĶè(Zn_pEXV-QbbhIvi&EhRF=8/S(.~ꬥO RStgjN_@}.Z4; nWYUH87q:pK"E&%3'!bFTvaO$4tƥɃ(fj\Df f1Eu>gvb&|M)/y-HE%jv,_F]<ӋBq!I': 8Fkre Vn琓(`< ^ l<휒dXp]7R0fHл,pRM@ kKfwH1]Ih| "H%S"!yEtTAC}_pGPgiqJ6;E/A $'»}.$1l]y^++v̮N)ht-IJvaKIyD )ΨXb|gфEP.WfT/u(K`1DF內EtFh30V:Z2 M$԰όAc|B$dx>P7"Ǡz@p ‚\\hR1\2*m!ĔdV3K2uHTA8 Yi4\hA]xjCxw "ke$DFToX;n~X~P·yVt}$_(;=>>ߗE1?]^n")|}ͷzۈ\8$brlzf~~s9ܿ|iDJAwb~~S%4gs jH!m#ݲb;N>>?޽zo?8 7WK5rPfߟ=!@cә,Fi=h߿ǕFySg&œGdGqPԜ ۯC-rhqENA سY29ɅϦieVendstream endobj 127 0 obj << /Filter /FlateDecode /Length 59351 >> stream xM,n9? IT @=64h $ߕbbxϿy:|=o?ۿtm_߽$y/<~NP^O_e}?I;^ow$=^p|\^^9h޵Zn[rx3}.7qP0'^>llO;iW+u~KER%H#E5Y*YtRx'Z=^_7[϶c\y%b\'^X:h6:޿_=l>zw~'eIx?G7dG7b FRR:\>:߁IfpSԱ&|MTD$6*l+Ե X|p`VN]V޷KRSޙͤoq|tp߶u KVKJw x*p}pihnF&Kh{SVL#sIUӇ.*x :^={#ZOJ^ZLLXʴo5.]{]w}֪mwr8_O1n\us 9&J?آ.?&y9/_r^nw;zō>p `jx .=VG$9Tg7ɤCӺrrz\7zJ RN80Zv{ zkh?~E*>!`R 4RDNj\~h'ɍT3n" zqһPnq?\b]NࣂT`M5R,xMmVwAT:&jCt6|ԆB~D|ay'nl܋Pt(%UٽFQ= ]\N.s'WoڕQWK'ֺHn^*L5j=!ulnzL6y\m!5_r6P 0v^3;G@9mG\+ rV m$n<hHIӚjF=q32H{چ:<}~;_Nׯˮ:"ȋgD1^x칖m\Gڨ68X?(TBGhKi˷qFu Ampbm v}߲s)P?5su < 4 w~67<&G#5h) -޾Pim4Rsvom4Rcܪ}r+Tr%Z0Ho/xIu$/tfWΧqדV ǭv'{n}\U]^.[W֟4Nj_[u|ޔxG#;2^펞)74ǧ`_.-޲:F#1>&qnjt5v>{Ңƾ>>߶PDc4RcmZ޽GcM|jYܝ4z=N1Z7gΦi7] s.ǧ/9W^ 3܎Sgxu7F#u4Lz&6.򡹛Uu3c>ӻtgp3Cλ&PG[@}.'J9WRFѻ4p]߉ڜwgvjy84 /Ǥ7BsU˧k/Oҽ݀[N*[je6+يjb\zza+qyk6i.~E#+OoM/DtzGjSLVmZ>k:֦ginS4Rk}oN%D|nY0]y}^tu'MS[bq>Ey1Y54˥vg緦NWu4mMFjb|t6xTÏ%'<{î FG_\^FjC4RǑ;wej9>QCC-%L磎j>i97K ?u:Ԟ%[ׯFޘ=3o_ئ8z.ZSm@pxrx[>5|>RkxLdf._828TUcDYkq[ѠuԬToI;]I[bRK\~}kܙܯIm:xqj;ԵhNE֪d^E#x:6zjJ=QKO Xos!h"֖vGg$ɹ{S]ܳdq >IoOMp󓛼mrZh16ZqiʨٻrPV' n'^މvNsc!1: ;=]=uz>~>^_ |қ]k`WwXy>Mf!F!Q۳D=nGG]q|zO850!M Zv oMta45gЦFmWr x:A&^a 2q͖|6Sj/EwuY%Dkx<  Gf%i2|Oç^> \^sZGB{9G8E|:X:*ir}Kf˫IYyEQA6h&I:SV)CT|,[M"(Rz@ɗI%{\'N~/E8ޖWCMʵ$n+D5:=U5)4DsDoOc^R)Dc<0tt#S) M'_&yyx`|{FY7=$WՆkW||k0㲽hՊqKE5G;HHc6hzmbQXCVOZS, 1>h5ب*6jiv|Ϗg%vkC~l8 x-C7 ѕG{fַQhvZZޢG.U4]k僿Ih$ &#LŤtm)S7hfR0fR:C y\OJ*Mco--XdiI$4HHB#hkG1j1jh1K I`4So('3 smz .8ӐxШs r=6Sl<&(AgM-M- T*BªI<'ZHB#Q,}>_ ߿B"~F%z cW qY!)F˲47c qA.ÐK01D<82{ľ3Lx&}|#4FFN`n\&3 =Wa.Qn]_J5ʉiD zLSģ6:'|y4Fba <:в-ii44(v06d%bl10W [e?GA8F^1 p#G_᯾11xk5 NU, מ#w|ӡD|jˇjA@:;- 71/xF"E6/9vcdaK#^B4xN=k?^8~x10F=\<jq-0!ĵr6ܲ02ų|ıl1JB#a\ic h:6#xX)e ed" DoxS~.+$H'"$Q"-qc=R_O; Ķc'-go(L@5ͰjF9nFPV$e-u"s h pd"U7hq᭺9#G0H({[gځ+] ;*K:pQNIIKfU0c `V`/ k=Q 7YafVޔF6۲iRn@V߮ `\K@0,[=9ڌr._;:C.)y"Qu19m)7+a 44eԦ^oĸ:_U1hqp iz.Q 6BxN8'&Ci0V 8W\ĸr8/{^=G-a֕Kn1w+a hoG’0o&6xrcaZ".+6i#RO`4yc!, ^$sl(eS4a1aFk~w ~BʨF1U %8PZD D o:.(җDz=&VM,ՉF4&H1D|E/ΧwJu=nMB('|* <;Ш1 mFd½Dd*oބJD+SV҅ɉ]Pb +43=oDyE_HĝFhjв,@ :xNBBDD!ܟ3]x[ϱ=x p%'<;xpA m5of0!L"JI!)N< '13JIA)| ɛJ3趙JpDf,+EK<(_ ^~V~W>UXToG: czЦ'/!L|a(BBCk?t^&M>|t(JɞQS%P=z6ӑt>Iɇ4!M|,aeMkc2钉-`[ɦcwlOHJ''<x OhԈDn?,pQAbpGgU~bU}_%I}2VF9<)JTt0/N-ᗀEtrנUOhN_g.#^0h0h0hpbJ <c|R6䰝 ǀA#11Ft) cuOyɧ;2 5 %K9bCEɖYnȼ&f̐CyJ>( æ M:xބS5͕4_dP6K-s8IWM4I${f!a/cĞqJ=>ӻcX? xvԳvꉉ;~4`6" BJ9%s%B{6Ph٘(pq2\LIDP)Qށ=^3l,aۤ/7Ґ2 Y.B `K-1eF1%/'{~E L0?`4y$LLupՆ\4zE\5NvsM:q27a 7mG f+beb!|%Clh1:&8I_%ACy-< Fxr?^5c&Yy}k+gjg .&&1"RC|pѐDF 8.+ ߒMT5}26b  +7VWTITٲ@ 16ЪJr1[d@A:b(x=,%/KskSLZy߿'>g4CSOQ'Q_`AQvfS>)lB# pD[ڒT8JYlJW͠ʇh Nh$aollߠeducV)V9 fvU ftBe`E&UϏ^vҋd 5H|9K>薽&]z\ q.[3o^6gÏrŴa eRVŠ2'eQ}3&^' h4R34JE2V^oZp|é\8T93 zF[Ă5EFTv?Tz?z"TW kɲ"R>[!u6u6ҙLS0&LcTxL0)FHI{vnh& A`RtdxM>DL*3V*[ܟUߟ腞k Z^t,\ dm腱Cz-]1vY.zShU+]g+=+蕾yè0Ұ iٴ{9]t8Xx8W%΁K ~bL:4[(Vޞ)V:=SOCψbX5|/Dt: be l:<14g,+T$nѲB LanaBUM7z(+d(mN__sgwk"<.'NzRp%F,%e~>5Ń1?E0C%.y/#zUy4LhD}@MDED|RB-^bDKbԦSw4wOL[5w-(8_-B ;c|_xx`4 (=Ij@;ڱVx >;NZBθ`\/` Ƹ*ʡ{?؉Y\9\'8'~. tt: 5H-&mKgCp;t.l>YA7!s9\[3f.Y7ev2{g={^t|`[ ӆOpg4H]ᷲcLsW݈u97v&u=H]ޟiC P4&qafJC4dz52FF6deb6\|"x w:`~O/^)ʧ' MBJc, f^;%:IQ>#,,(m:i$`$"`om=WVJ7"词_'-Χ9t6jfFl/xUowNN#F"`٨a/Z4tL-2Y p]{qYzit״b%HF"$:&mEkqb=J?˛pniFB: 01Fz: [egaCTü\qE8_cDqފjz1 骙pؓ#y,}wf?6V8?[_y)?l9?_F$5_'5P)RW,s &j(A;yv%@FVp;1ͣ@=4H'.ȟߏ_ F6J2n⣑NZj'<ɊjTH(4qyΆx69woOF_^eY)5ίSdcr<ۓKξD/Hb WW#N>xaz{EEqx >퍞Mdx{x]+ : }|y. 1^y1H>ܳ1>Se17_ZẆu~xݵ7ǹ= btedx[/0`F r[CR Y=i!}XMdCYG7c !EQߍ\.'p%$*Ё>/MSkr!-9h%0XtԓD\^T'7._Sk]:%U*+T\ϮN&I RԶ 8 v" :kj̮gKzb0"R.4 KI'd s$ m&{3=[פCICIC5SԴN:e IʠKyc1嶶ǔ zL ,O%xųtoH$gH?0+?EF2ѲZyYL蝕WQg; 556.h$RS'ե'~>4)RWI* sK>HvV#T |R<$8ʗL# z )t,CYiX;ْwKND'9Xz D;)J4-Mh&[Է#Sq1%ix>o,X%:!/ *  _H2AM#co_TvExuUMvJj CAJ!A nQBZLew`1U%%EG`QFM?.*T5SL5S=i NJc)]^%hHh$ITک5.-9Tߝ+Ah@p_='j4xyD^Ph$ FKF<2 =QFaaLI>BHJs܅.񺾪֤dQ.ШɧzΒQ^T ˢ*[k*l>T$k)4~JoϺ)]B 'LD pJW&\S)%Z)Rҡ$ꡤvTnOKzbLt&Gh#yFGZ"whT55S};R4uEz'jV9蕠pT|!ʪ'&Ljؓz]K&~P7A5A݈9X6wkĞצc#A- 95!Ej)FN<[. (\:yQXAIBMG/fW-IOS*Olj1l;oMr ^:5 5 5 VµDY=Q)zo.VYSlx%lj@A WO#v/rxh?2j?\Y2FPQ>Vw+;4\D;IrJԡʮ.[*B]إhO'.I*/*.zWyZ#ߛ=E2/4_>+i H@/H._9l>}P}Ye_iVYѕJС[y{oYMv_nŒx[x7LJ⭶&Wj_?9]jq+]t :V D#i?_T"|_^bkChO#YN;$XMұVI4}f9NI RpA+Wٔ-,W9*>5ҮM2z a, YB2vp_`)Lb+meiYdmYڙ%ƣ?X{?`.2i;̬Y:R$f~MeC4Yt,,CK\^J2xt$&$!Isy򱖐kKjsC?'NJ Z(I҉w,&-*t,Sᐻ$b ZniPZ";R%-A'KQ~$~NӹurW_7c)%+.0V\^ ueZJյ|Wt+v ѕ+8tZqի%lv]c5a.t-M$eӻn!,nF-[+=^z-_tj&f$qk$q'^;m([% M)جyZ[⢑-YMӢRzYaB~+u cW~" _U(tWa} kqKgǮp^|VF㏻hzRz_M++W>h+d+j>]|Ш7doL:.1ivqM+7g+HѲ['V>!IIUAps>py3/$&^qV%qF WP壴Z[fP_ZUd{;rU]]@y>'djMkh$((((K^Y9<^Ynʤ^ILGj]$wUHu]CItJ=7tn,X\S{g'% )* ImB #R. -oRNezx^HTӅ!R B'2[?<b#$tp!!(.ɅC_Ur=׷.=UX*I4t0 l%ҡZ.ҡ$ꡚȗAҡJ"+ :HKҡa;tY1$#1)o"I <0IoYQAPݫ I ڻa 5Pww?b=Hd fG2 {Pb2@^1M~ف>r|r| rPl(3a^uC| -Poq٨PH@KjOA؍lP.Hɫ68Q2?ȉAQs浃`C'L-Jp6U(c(\)B+Nd1^w=7/a+ګg %ybX~ h@s :Īt%`^Nt(Ft$.{:!A:Gcw捻01!D4ӕ5;j(,1*c2;&^Fu,#)+96`4 zS=P,= XF3 *}HѧI:i9|iꑄt$JɆ2jwI6:zOVJ_W3\I)\cS=RcWlΦ׀2X*vkOk7B ;ş'}/*"=9S/ac:F' L3 :;pJ#&UTQpBT "*e`*U*EwJ@UENm6D86qu|ㅞj>%3?dG=iדn=:A^OG|nxA( lO jO`ȓkAڌO,!O6fʕ*z0W3eI\.si+mBwtij'+~%3q|1^D! `@#р<'Ǖ4K_.?&_A}׶҆{eG1yyNʗִ]Ew75~'^ MF/zUNNRWom8.ߍ~oJ>{Ls5/#Uwo⵻ w{N?qae;?Oz߯u7gZeu8-R%}Ew2:v% h$W^i *8/~Oz>}Nv_~8>xO 2|VEѫgˎ|brYR??_F_H]4x]/AXyk/W 9w1Bxkp}<^^f ^$UI])U׮ tu_[=;.˿Zp\tYWrehInS=^+Fţ,?pQp/﯇ɥPo$}.+J>4]\UlǤ#(8o~8[7IR_[ ^>~hmtP~`~+R[q: _ ?q;lJ@G O}`?nj c]L\R] t ߦ99`:u}A떁gQ+\|J;XKXn!:{D7\I_AZAG}?] 6˾Ʌ~WFJ+*n[5[9B W[tY2hOK QMqJOvti'^$~aWF + Fn1zFZJ:]fn8,0 u}k|[^;nq5<7+n@Ҁd£'*1 <{AOz@}A1pjv(=Qhlpe  LK^Aψ8Pt7TX g"s6KFFjzynK.g5jⵋ./wd.%[y^QIۡgvwX=jtvX3l;~evZ c@޽1v|&7Z|,u'/ ]zk}]KӓrpǢ]$ulygt$u,U͉F۬ jAL.lAشz'֥Y ;otv_kp[j^rn͞O5ڡӡ]ͱhs^~sߝk59{Ty٨u6@>kc^Xkvx톄Z]GOᲦz{[X ev}n6m!ZS]T7qݨSߓCg]X+{z<{sӱx=9:zF_90<q+n͟њ?A ](O8ߓ? ͈5#&ey~ì>Xy%9^9^@M#kVCQQ}*?6qMà .Gh]FmK͋FW4RNfУLJgtZ^ޖhVSTKC?qjI<%;pf6Mo=[O5r>:[8w8:||Z?8/񑕯(C-u=`u5^a<|}GEtPG=w܀"=De5Pjr);޷4p)}Caq<py[9:\"y^Ak|(}=?]8#}6G@y˞ |\t4e<@z;1@enW^soz\\<86U6e[G8!.:^NQgsӖh~M66/x-_l7w{_V{y^{[kg1C@ç#1o<ks!٭!48jtj{(M=wfnb4sqyTٛWm}6U4R릞c{\h.z޴wkhԻ4Լtuݼht;nˠ߯\+678 $Z,WNΆØux[ FǠ> 3GOX[OróQz=:spS=RSObbWѸa%쉝3ܮZsVjpD6ΆpRr]ܼ<\s>XKزpY?>ukXtꝾ2w:2=I Z=#Sht+~}}Oshש8AwvVO^'KkVL3`-!˙z(P|jQˣӋޣny8W<-&z>z~ryw=zKb'~ByM.&xF 0M* ^:3w>.z g:/9 4\# hY4RgQѳ^uy'X8xZDz5_ٯ=ka<0Suv4Ѭ t:qZv+4E)29}~ `=]kLvsNg} #è #\Z4fVF9Az& ZIex&G>iM 8E$Y 4Ҕ8=orCN(r=*&^FԨx FxPKHdeɀKk2D<('a(O15i3)|Mt <4}p铎ެN$|xUu=G/_&F\_{ns\c6Hm/ߦ/6x6ب )6j Zjԫy4a_F ^Pb`jC !OmzfјgfL͎zwIotE}.iMz.47'K %:#ybx빣j¢&l}gIڐ,KoxR|ra3K=g(!RB+yƃQ0یUx4HG#Mp4p=HC41u?zbNlLHù^9Mlrz| 6҉m8wa|pb!me4rF.-l2pil.k!m6^+eh48Nɹ@UKZx.^] (. Vgz \ W=EJ!VaS t>bp3 WLQ,U޲aON4K'` /ɖ!Vk ,[qeq?\Ix ]%ʼn"@ ,%d2؂Y/Ja c4X&e=ShYiZgDKs% :|uˊ 岛pqw;.əe6 A@.8 } v篯{^^lYi7q vo5!B<$XXۻXXۼXj K0 )!l^w]y7f`vTf3Xca"#8Afw0^wo\8I N+ܔ5k;-k HA<̇+<KϏYfk7ȉS25WEjcNk!Wi};Bjy;*z1'DE0ɆV*ъFhFk؍z<|fmDZY[GM#Ct1.qq6s6\4^Ѩ5!Ck4l =}/*Oaμv4l %D~s۾JꀄNr0%yUdq?(wC2mBlHgћw2g`l@^~ ]-)OK7xF8+h+h[*氆"[dD9tyW]c^ 1g4N/0 F =V)<͙ᅡ֥6 *NVU9MSp>Sx1ʗŪz1zbX9!=@j`^_>3!Į6.fиJgkvEW>7xxFc/uة3nl3A9o=ŵn[66p57hQ-0Gk lDͳqkX <ѭ-YsoU@<0Z|e~fZ_鴅tJ\b+A3F"l!$q~Nxvt~ӨAee{nU؆B zZp 9XUC Pdn<A鍈=*ل;;1җ4J!&ڪyˆ/ә H"c$@i\axIJ:۫}?da^auUuUyؑ2 =?ahQ1='U.ѮhWN{ppёpcXfnY7ρ[=!12粷ɘU64H4C#\#,}nEIWz pG: D52>5zGSIIGVŗzPRvUGNND%\U*o <8"y@!L^7(| BceTNdLh$2Ȕޙ(>0)Bt >fQ1 ?Тr[+v}sgK.صR<~TxvT*<(.@gDj:%1zL K,>eg,14(tWs#q+]3aJP|L(Z0U#|\̅)4H4(]5(]5ӈ<~] pBG*Gݙ^O='1 ,F .ddˊ(ًeKoC2- 9e!)B-kʠFӫ5.|nZ7o58ָQ$@%;7`j:7ً: PG:XBE3KHؠ32%6^>7#[c\}%JJɆ2!Q:D B#1o'^1~~$(M FLb797&aՅB~~LHIoS#.ҰG ; ;\FG|" cƷQ.sNXs@g5^;z 䰹@fC:8h$$)FPq3{~l:3K FF"Y#}WF X>~|4qUL=717C'ԧ YN -7$ԋ'$w <+! tX #Cz;D3yFBC̋#Hh 4ફ[Pߦp<F>Pzz"NdϢ"ga )nXNִ&kt s1)҉ T@|El9l'8A!l7np9Y tff\SQoNv?=k4Lv/<x'ƈe3Z%(O'(Y|EA#q^<'H-Aa-OT ʧ!]"Q>Dk,HDF 8pҕ2p01|d?Irx?=_}s>gk kWGh3 CH }v緀ɾK'4IҥU0Čt- lfNQРݙfzF>B5Aqˊ h$hd/iߞh2v.=D&^1>=MAZʓtag:ElB&Y$p0it&Am:ҹ I<ħv>c PJ@*oˆ2 -lToK8iѲ[`5]V?ahgeK_L,Ж!!M}y>r"6=, oXk;p@HC5;tohFvXV~ZK`k>Gmߩ !re? NݐD 64HB#+$FV #eׯ$?! :tzm7&F %.,kR7&A!z4`MlRl^d$/M J"oRMyjb5M ϏСagћ4c1ޤ)dN v8Fћ47i [j)l1h:Dy(5Mk0oR<3SNoO V^EA!N!t!Dۑ݈!N3n)zoH>qd#UjOSZ{ȡE:qEU=USϲ[DlA.@ȈF0‡1Ы--An1`-6X4ndn͔KGx1!|O !Uİ|bQW)Ʌa-|ME_a&)Փ61왛!F|h#AI:p;0Yq-9&gD3Z ANOȂU~CU&"^EF L}LhTmqgeT xuڀY =88pN-S'Б.t8q:GGnc\߹No?ܭlG,"sXT%@c@kfZF*!,x2Y`qFYxͶtA :JlLK=S_{՝m`4yZy^xddM D/#INX-'aTI#zF\C.?J5U;HNE0)D˚El"/!zFTIe7҉AقAd`꽎w/kQ&ԭx}],q!́sI1^8rb-Qg sH;q$-!y`ߑÕDϐЇFB_1䰝 Jx>F|@f`za~cdmAy:,}zMgt~_kbxP'bB(,('|IH)K44))s/r41'|Ć&n'IB&.'`P@ ĕJ4H31]?w"Lī=ҁ YKW˗@K1Yyx,^xH#(x)Fd$dkiY/HYc9iZ[)3Qq{`bhC=?e7^u騅tfܹC ,`\?A9]-Cˤ<)x.!=|3<B X #fx:+3=̞ /"+|\9شkƦ .(j`U{&5eimFM\^7o Fz fs8l ,S!} T4v- 5= +T)|&FU#/_// 95iődAMdA>dnZJ`xouY ?Yyx/1'^s \_y?&/>VRrX"r $%9J6FH.}2" ] -ރQG{}2{cވp_}Ǥzu{\^{ZֈT UT07'P@PG꥙x<%#:'^;5ʃӀi"}-HBx"kƯ tuy=oO6 T#UٓE&g#P;ݫPxB~}B>xvgO] 9\u?Kt!|?׫?Z#0ڂ"K"fJ;fǓfH"HؖLg/(113t8 )z!Aq{d> BZQH,T[ uITFK%&% @F~fuWgQ?zF%MQ|%ҡ$Ȓh$@F&k/5v`d ^`DB߆|*P"\&nظ~?r?NA` >v`M(ad\zlLVԮѝ:3<ܱXZ. ϥ$v;Y ᥶ !V-ꡅ)=E8[jNԑ4ٱ ;0a< 僟 #0.-O/%$@S>F2 +2r1)ye]FO|>B.z+'gCa)<]Bxtu4ͳ@Xaz> 툯''W,݉@9Z)TgU!sIZ>`>Rh$Mښ3&^{qa/P^2i)ad]D  rV/bYn,TII<5P'&R? )rLKHH#^4$R0 wl}pii0%sjK=h#Sޝzl*j8[H"q4<tA<$$#(nUΨ++--B9a<.x^44N:IH:I')y?3ɚl˚nu$A&k耭`)L:L=LV5T4 rb]vt>,9_hziⴓK5+QxQxRVxRUxZŒO˭r^`:XII_ BύýE_"#k. }4W6Yi|i.ŋ[s9EQ"oVj <Kb ztU"]svxb$%IJaez2֢C›Nr"JO* *_+rbV^IdM;Md@N4U D5UD5Ş+I_T=1|B6;AbMR=Sb&8&*џ:aLlIltQzCE 5DՏ5gdQ>|%x&ӴR>J?մɢ|>MMՓV*ZO># [<l{ۏ IA8.1YIA4.bz؃2tK%Ok].B"^P<ܲ]v vқxZ~j~w%$-X%qX6,-lցoMJշz?d oC M3}BƱ_Wd#HQ'Rd#G6{\pgWSMU a͗#W=q?u^J6njHe!p5CF6F&Rjd#mF6c>TE̪'d6vbl,tcTuwVLm-IIG@WnAؕ\5\g]Ǎ9dqZN"\ ;ۖt],,rl$Ϊ`KZUJ•#>N^~{KR<c8 i >ď~s~NJ&&.1=.-W߂m]zB̄廴oWDJǰ.IY7V`؅#7rxmpmXKPڑjmF҅h$X:5+֬˽e+]9CICRլ˷ւ#&(RvmHUݕ]Vu僵;j%FRrh$V+[[M|VQq&N%WQJ=3d\k@;tؼӓC5ʭII/ͺ/zr~5ʈDzoS/_Jit kŰģ J⡍TIɕO1w\^Rr#J.Jx˖+9\V-*V=.*l N##+*p|(en=IIOԓ(5ܷ/$Oq:w ^:$U&Nԕ ID|~DIJVdsE%$pUZ: ]HD{dAeAAu('$e-UF=nD*lD*FU, RM4yI~`bh$Q]nRdMR֦zuuz@/ר??Oɾ2zYx'Dv\YdOMƋP3?ULG1?KK?JltXHa?}>-kQ#|HRgxb?V~ܾ؏Fb5ӸGv^9Np쨯qB}2)䱨Z#Tu4B9?DNf1FPbrR l 9ϫ6/jLo],$׈*zYȣEjFVZCRk)4IG!V< ddHXV l94`.8+6Xdyl3SkNGC#OV3x`A(A=Oc:9C0-K!Șލrx Hsea$]H lA̾1A0] LB^`ieȼW|//oXAF=cbbM=X= %3tt: :_+'l$K , R>WX9+'2xѨMj2/n4'~7~:^ɌM ;rld4KhTšcwk[h xӒ~÷vPă:vL=F.Gl#PcPSN߃Ћ/4y\c`vBixbibiW资4kz= f}~I>J*Y2Ja@1 [ʡ TnMz^xC p}n5ܯ N0>=>vĂD'I k zʵ,5thyFyƢ'Bڳ8xѓUStx 31k,b%.Gp5^?'sZ#0x >``,MIYǣ֔D# ĕÍ> k04 1)=<^|u\*%Ws{F\-qͼzNp}ՒjզEDWm2ͼ46C6jhCb6sب͜4^q "C*VMDD҈*z'rpmfw;yUltp>fj?yncP Z>hףa5 ? @4@#5lh..q=܇"0 >#PMbR>n4RӠz37ky"%&wvO:.v(ev(Q+PD#~Ɉ[^bOWmuݛx $],]Ɖ.n'xݯu|= p= uxOzo+߾_~ML=8%"WdM|Gy= _oEo&ЯO־Twp<|uey2~__/ 2]okU(W,?~>^{H|FcW4pryyݾURw{k+@$ܶoruYhˊe.+{Mw맋莢WJ"?ˇ3٥ ^ޢ([X~{gtn:3n]wW;M;JJ|rwU~|‹ k0'^_ݴXzpAٛ hD(įRC1!|}- :v*rMV⩋V^WwT=AuzCwШ5ٸwp6u6O>KS>UT9xq=߸q5hF}Wފ{o9&.c;j8X=֍:12]YF, 7b=15b_īwyRF}I6±*aq!٨͸h٨hsN*u U Ƃ]q7탋FQPjy# `F]7vg;mH+n}stlyjdr YNGjm v'6yn nfn.Rgݹw/"}qz15GznfzDC"Ba1xyهBz mjCi<)UҰs`@#M4ROrݿ+d4$QεvRC_;?sy٨uxNA-GRC"٨8ތlkYo(?>`ĀguAXtڼ{e~yUu:uw׫GO#峑T3wwqYz:Yuw\}|M`4a=zVgqFUO_{|vf1=K-_>_|it4ꘇ;}긬{rF~>M-qQ⸼C37)jdi}uu=;zZz(uy:Tr:w9.vy6 w9.G#56r9\_x{ea0llDdTãC&=NPbNylI7z8|qUr:43rcSnln|r.^~pyVS<ǭFp^cRju\>Tqz|>aoz\6rJnz*EAkt!-9yP}VG.NTW;V7Ӛ_Z3D59,ܧd1!m>ֶ⻇)+](hחu|it{&]u1jqFiM5PRvq_S>VocJT]L6fԭͨs)֫`$5fvגkǻֈk<[]G 1J- -^5/𵞏^(ud:Iu$ ֧X45*=,w5n>Ļqjig}pZz|U>oLx[3aPΚ ͔a`.@OSOϣ=c=%(@4H37=-{4j~rj\^r?+#wdA >t8nCFjf4RѤwkTb<~9S71zF؇ MuC׷.ظ|HwsOy/}Yo/=AN}.$;e +f^6px0[i'= z_}4 g~!߲& :"݀[Dg&>n'_ǒV+xLv 9^}L诽j4d95|ώ[MZS$]\UÃ{qNbh|chcY2駝ظ-r_ )f2ߓ/ϗʃ盉׮5p(dP%=N PA|8NP'hɑݮH9it(T:X5:S%<;Fn4\ ~FS:ۻ&^v_NhMcoⵛ4+|tth MӍVxC#2ڱmV}g\艓 =7UR =CyG=R8\Uc-yl_XiM:{;Ώڹڒ#y~ŅG~e'0`WRu hW԰ܛk1371շ# >}?}p;Coj7ّW͎6 df^XԌf6lT.IfLFf|J3f-yvh$Wz0EQe֗;j#WDyt7p?^SB//C:+8ȗ$$ :4HLC#! :R3^~it6NxBx&Ȑ%d XٖOZl SF4pr/bA͵|>Z|Zt ̵xq-BXCϓCw_t;Aʫa8ppԾ E :!ѳ a3S,E~0BI ϗ7ML,@dPdzcBj> ډ)R+lAVhF*mvcQ^y3^ =-tcf'ɼ 'b^5@v:>:o3#.1'Uk_4棉ToDE~ 70 lKn,b"`zB!nꡑFbY fY~b/{-"s *4hdbh D%4H /Cu>c2`-ag?1b0W Ni)FP:D0HJ,ᅝŢgEFNtDČ JB#!D6+p1E tX1npWW bL jSzL^4Ƣ e|E 16 @x$ؓĞKvbҳ˦x҅StT>,]l/`} Bp1/\"q`gX ^"{HEȨM|YE2EV2Zh%JYOJ8ù`d 촷G^*q:"o⨰l,l822)uќ8tX83.BKy] $AtX#VRK/ ~h$8Fb,Ge$EG 1Fi\orlE3y\r\8`_*\oj@'pLzz6.p";8r X|0{3{™=xFB(^8A#DhQ 6Mڈwpn3p} 0hP ",ž"h^R'l8CNfbaY )h\RK,~ )7A =W@)Bƅ/HѠT4 +'C50xp7] &݀ 4pAT3th\"D|u߸(BP y @P4U<8.!@-hE|%U,`Q4#(fQ8P޶fQz (`Zų+E4›۴a((LIiJu7pFNzEy\,:PYY÷X+jLGaQ8"S!#D4P+ekj`B(yË&WxGghFJ8!%\+##ϣaxx2m;4œU4V: Ae0Wh-ZCںrA֕ !\bfHvIxH~ @:35j~n#ŀl$q!X SO6j ӠjN~B?Z,9R>Uy@G~ߡΧrL{rs q٪ mJǸF'խ1@ P!Cr"UEd@)?< <}DxYn8()})}?< >P|}2QWB}?TVMgX>pln$"A>%{أq;)*,5-iFGfGz/$ oī'hī'Pa #H@#Q" DNTxR"Ex-č, N48C $)*x|ҫsmJ2=[LG@Ʒ%" a-zD7I™+񤄕pR lJx \!#$:!$!̄Ř'%к-X@$<IwS%M(I.TC$ r}yxUTWx :41$C0P"L8 ں$ g!Cp&< Jc3T≈*!D4p iޠF $h$xDoK#`$dcDn5H,8T@>}t9bb5fW+px4RG#uz4Rw1 uhnмDyPsGz)15yڝLX%5hiPt%ótGԅX܅ #0/'FݰH7k|5.;tkyxu.?'^~A g LCuh]CdaR8hz4o#0HB#)\&)\ hP<A'E/0"! vKUDL% p a4Cnxya&)t,by̐p(*:H@#DD8j!$j*D nB'g\`E8"hr3-;(G hG ؈Ol 6hյ-N mbp{>/ad# !D LgFDԜ$s3ExBB$zM<}?OТ)Sh$N.D{.ҭD1wcTyT1һԊh팭t1}Ls#->·n1ko2b \.y.ES8up%Ёge Ii d|20+i耯9/ѢthT@m)+bg4Jha1=ĝ 28FB[8[F5HB#* 6p[" \8ª3hT)Z Ҡtuk;$;6ܹNÑ/4;-W_i*^daRzRMn,MՄB&c}"\a\QqLx"l %-( ]o*FMՔ !JRHd$L)\e)4cG7:n$|% $Oڏ ?MMZzuhh㈍ }xz xOᠫ6UYiE+BJs,IP OT oc-C`l|֊{dCBt鍱A\Amφ~k 0%سU9m0+8mae^p΍7&xT1 Gm} jd pЂxX4 S0y\8`FSxFbnUbT8 K+>FQxI̢,"CA#ބ'- a>B9*OfwzlNp`%p'NpRLW- ilb g ,gP@a:^TfVф*4ɚU8XX۷ C Iu3O|ҬJ73+=++>+,'t1%)~?zy5ow|W *X< ݹ3CЙ ^=abR.( h>%:HFb"4 ~ .DB H, ``m[pe8A".XKzQZwqTn37pszwmq%!xU :H_.h)@a>˂\81sչ$wEOZ_sax9.|Jh]UihC h>Bpndg:5.J30]H@E#Ao|ET]PHM?C4˄2f3ɂunuI86D׊֙X LUIKH/&un&"u.IDRSLQGyT^PNOӤl|3ޠ37glDGs2%2ɉ䱺1`Kf6p¥itL|$&bܣȎFym:n~_wyLH#oEWXWg2ŒŒ/ls9I5&/<5#cnhC>:[ԏ'%ڧ^ <"))@zR, $%A>9I<x% < %%.L8$,M:H^d~~ 85Q@Nl,NmSEcJ|ħ2?k|REEx9$c]ythܔ(((OQ|<Г\d#qa1Bgؽ27xP1%Zh^8^::?Bhsl6nr{f`+KxmH\MN5 ׃U FDqx$2z.*$t|:bq81aWc&c߸OD'%&ko8c*C<㢉dd@G j0qy.siW808`ZSFtzIh^`N~{}UkgEk[}r1o4 NY혏F *{G#shq7i@wiCyLp hy\HGBV$SZF; h$r ]3GaGVF ipMY R8`j5-P hPch"^neLǽ +|aeÛ^a)xC|+)xέuLUgW1'gXُ+KcEKtK#I%CI%CY%ɩ EB> A>ѐOKFhG@# 4h@#ؠ]7XA`B E.D>Mj"ã*/Wu>?}49fD ¨GH½IL(ȝ{|22*(HѳЃDz$ 04Ғ6ˊZ#bm].Bb H,΂B>\QX7 2P@#h-pT pxCYIDCH@#XA#H8j"}@(h!-`!`H?F,.O -%1^' VG0<Ѡ -Bs(tAڟLR7%LШhUa\*RZXM^ 2$CE L2$]Dː|E` ȧ%)N$Ӣ%Zu|R2TDS4El*hX4DSzfM8RxG8jB>JoN.J'i]D%B#4IŲj;Djg"aCF2h#F.h$F$h$Aa#o!2ZӸΏv|%zxu xuqHI,ZD fy%UGKW|sresH3_\GxQOpآS¹J M6r$84 ID f)u !-Σq.I/u R$/)$DK>D hHI:itd(/+4JZm%%y// {/?j1>kZKy2wly2FJͽHT #ZidM>;VyDٯd%!mD6EQhK#S"(<ihC-z'I0M4hP",4vBd"ɓ8UesS"O:+ɟ~OzC4ui!!DKz'[vkֳJ(IY0!*OvQ%}2,|O~"tئ'uثhS۠g[f{jtg`4ɒQ3jH fPx A>O13q#3xL)y_5[t`R`ԧIԠHOyA;ajK;z'w+) NLȝ$AĞ'gY鞏)|u"r#ZQG=ȟdMuC@J>%Ѡv4~w-+2zNEoS[XsQ8k.4B#ɫQ *s"U&[LhYa9UaI|<3\9)|()6|}hи7 !T8TՆۿq{*%!%+Ֆrim uR'.ς/Ob/]X#/O6u`荦):o഑O~œ<x^0UkKCXF,I\,I|^LZ1}OSgVUuI6ERI^ߩ#0ɱ:DcRLg% U,5f:!Tw"_i+iKrhIKJB"ll )HcJ'++,#rp"-  = `f4d%BL*Ѭ͠JD( H3 #ɽBIOGA2ud#G6lII_g%Ƒ6bYz-U"ղ[j-Z:ao,.ď Y 6,}Txցs _jсWg.*xj**A|;V`Qz4S~A pU%UTEO|L|(p(l= *Z6?)Z5ltUazLN1O1<$s1$sil+ aO(p 4*jӇɢ6n>.-.Qx,j^WSaUf4DՇT!&һƒjb5V~Exz?o,HmaTdr\٨39dpr8rp?UZ0в5 -^hH哔n')um n lRC#34  -,<ҋnaFXwu/ɕF[8U.Uj6?|, ҕNHҌ'U'|zjt6 c:mP&\ꒁWG ںKȺo+ =&0cIШ,C*`>UC"|Ipx%?³G@T0`VQE@# 4Ho̊v+|R鐖!T;+L$Œ&I2S\$kQ]Z`+MWG Wr$^$FH7-EP@OybW7S$*lU2d UuD>tD>z6>a'H"?[IW] Z"Z/4-60[lE`Mh#@FVh$F\AWb'74[́I=Zf˰#%އK2,S rV'^okng5\X%ge- h$f Y b%(&V\JPTE#֭Ќ%gz-M1M̅hSh]Li"}<85#O] Tc.Ra5R"9 邉|B@*Xc/8A,Vpz  Fؼ.#.‰ 8fA^{v8v+ܚơ F`48smm7"˕W,?LTNFI:)dJς4JK~n4舨AXPYFM6^'X!PAHbQ8`e* h~ʡ8lFJo vYij\H(]tLcD}϶ADF]b9h$Ġh0JЄ T ̺pl0l@#4pF?FjhNFݰjƑԢutN-=ELԢ66]zp;|bOi )l*'wtRn +l΋SMt^YMK@&g|jGήamә^N|ԷÑأakToH]>] w.s,?=,` mj+ON`ԑj~aέ4:nr/PZ@OAt̊ lΞNr<+22% & 8ЀF@ڦ3sO SBhƏFǣMin}|Wҧ4gQs#;,8|9¨\9:9_5\J·Sʩ؋_4RE#lj͔sR!ޛG8=wem1:} IuTQܝԲi}ݲsI>prj bA>6{4tRnI_ŧj6*D(Mֿ6UZDꔸg꬞:#׾I#yռXHҙ%/O0tInNN"CF|c:U9ΟOǯO4o̟:\:lz^MS]>|`!QJfutt6l_g_z6|p:䀇3:gl ` ԡo6|踃Q̣g||au"tk.MmkU~v,:Bx'P>>~|"hسKo O~y---9×V4zy`S#ԇgSϣF3͑Wju veξxYeGg9w*}2gGǣScOG9q>wy:?t1ԇBDyq:  F7';/{T=jP?ßY?_'uK֪}GÏ-QA<:A^nlʬBzo=뵧&q{XzC>zF8T`_[E> *L p:_j8jK,j XV[H0up˿unTѿW]O«aGҡχGO< g;?'O;nvUK:@`:?8Ý?K/b; ϭڭQ?_8 8Nz:pC`Y(y1FQG$;KyLGg}t&>iѧ)AN:8I9_yuGFqձEֱ͇ұřc 󛏩CJj]ctطCCyCYEy| /w 'xkeS=d]m3yYG1˹&`Y%"GSl"$G6Q}[C2R餑gWNҳ{crب/ ]P;6"#ٕKk(ǘc=Z8_ |%ʩ@r MWɎ5XX]cf3yE5{bXx߀v>p(|(pYv|:&8,WqаRUC |a"¹3@?ܞ у0t:gZ=}D`f'hCN|nrށ#:g>j$QrBr>?~|sv@vphu4R@O z"Tw4RV '[Hn"H8c \fa#HV:ˈy^ xm䄺xuN: fnjg~3wc: zN:J895|rKΒ6>W= jD4W5Yk~ȴfԲ^^CuR.s5|<5%\^-b_ECC̈́x ZM4*#v ƒnkW;L472gFj2oiIּviCw:M*!#ZOn*j=ޥOG=hڃ;νczOzZAAXLLᩫ!jBh~^'7t)܅ewgp@g==ȴ/zr4;mU&UߩsPձ`MdD 3h\}lq 8c(V!DKhMh֥V7BT_p'q3rӳ9 AtWgӏMyN^5ZwWibk^qK'u1t6¨]rh-aRI1Js B-[<'5;X-pA9}3Q?>ӽT~ޟFK{mzvcʧѵJ7YF׎{ȫ} QIZ~)=×FtőVy6ʣNʣ:)llS&7&zLֳZ:Fst=hk(H6n[k~6}0/^N{;V>ijMVozZ9sV8% F P8up>)9c~ۇGkM=>C-jnjhyXu ]l @_>}q|{:(5ZS*(5PJJ286 K9Cc%4r tչs|(/JC*QƀC#5ؗ32Ѓ%b 2Сqkj,pW9μ?Nֻ6^ $bm^L U 8z3 0%4 <4`*o]3.UI3.UIC/KҊqXehT D. NVBe2Ii8W1 6gi41F" Rh$0)0Eː Wp#FP&}ɼz_S`n sjkӪũ\k -p*22H,ۦ ^PX&Wj^XwKx`Xo -a = [4C&0s -X=0pbaFBXYt6̣,x ah$ ʪCóc[ ~hC1m!O\. z!6s^ΈkY16 ,W1-] `ҙk`@FaZ>qq =1ŷ|L =Mʬu1HxC#! k" ={]<`Gmm_aEÕ21 ih$ (8h'+2U N_? sD…p#ī4%%b ZxWO鈈h$Y+l߂azDؗؗ^+w4y[v8öУyw3HýL 5S2e30 (=,)LA?U6}Us^&N.-<|8̦[nA/g[>1!/U30ZoVѸCBL;*ɖ+^].OK33KnCbV a g.Cvn&%Up Wpax7)!*AJKt\L\8) V2sI P"z6q*RfR2ϤLȄ%m_->j>J[M'f&f<$&!bMb2s1qw7R617>1OZs8z^3ax|3ɳ4O@d&* FEI eJr>":~`(ZbL~ fA%OT'&*STdf'*y"lT/:~ fb>Ȟzb71+PJUDhJZPbz I^ H0.Yw91 2vH`WTm@D hh562)SJT5z. eFc( G0}AY,Q,@<4ɓ OG䉮%C >Ox>ѤOh7^X}5xV K"tj;}8a k]("S~"S8Q*ҕR4S*GTBV87*]+# k%:O Odd"a=X_IH."FP|Jʝ֨ osg7b|eJp*bhC=[7X,0j%K|BK8Ya&_a&8%P VZk1WHq h$W8aMyMC-DfēZIEOCMڼ 4~ZDh x SGM6p0NpP|VY4JH@#"_#":}CV[e=5Di/%DnC2&<C<1DEx Qp+܋O8g ^\Tޭ;?F;>4J9z Q2BeӺoDx+-\/+:%*PE3ȱ񼇒_c)X*\#6Lp2Lt2 8]#)SY)]W!@ֻ>5ϗw ˩& ̯cd؛h4@!LPmJ2pق#\!wpu|tg@ͯ]iAKǧR[}jLi4oбuA xEA@cB hT(.OZlZ4ODl9N7051x !$>s!Vٸ8\ln ^f,gE  % m(^](dcV粧}% ԩ#7ls@0YA#_;$ddhghК`ԾHOY4A捫x фVA#A#-!f` h$2kbK~bKp&)@,XقujtV"ƜzZ۠)7҇*C6XN]H5m`*mШ%h$~ h~BFBF8# pVI#h!ncG F :ښ@)@=l p!~=7ޏG`x}X|xm'JH(BWGb3v4Q$(gxMA*0Wc~ sH[ařhsA8 -h$ kc&j-тFB &r&j z|`4Z7AC :]`J3`Jߤxu_Zxnu%NW B#1{v)H$Ԥ h?:g%VGb <*HB#𼍧jUaVabUd'b+bQOm>&mnD> >}HFsl^{e}[.KP8xm:4X րOU`;6 ըGmގ !2CLXH]VhaE#22Ho1Fb%740mga 4sIl{s#Ƶ^9 qG52h0tgչ/|{sKR`ϋh4vF غ4̣'p ҋA8g1( =4C'KPqui?4'.1ĶUCiXN!-3o}s൹NsׅW` S4=_h~[}[POP|E&|L1-rW0b~6kԼ|p2]L/)Ȇ)C4W36\B7L/z4~/Fq|B1VG '"c~]~!bӆUj\%$./UKHUHxu{kD+4qt^yѰ "6c 蹊%bǾElXc ;BȎ";*h+ Ҙ.!ܐƅi}ҐO\Ħ0H\gk.+bHp{]jهޏd$p G AR E5k?* ޹i*6|a5*VF"0UZʼn`TJ|Qh *RqXa48F(߾uy)aZWOfpFE'&"paACmr75 ˟i_w|mr7(l 6_o7pڤX(+X( 3U02]0-PhS kվA Ci2n[wѡ@Mh) MefٛVxf4P9Ң2 *ʵ.fa) 69zxxxpQ:0G;y` S#o'N1^t,Q 7G^PCB1!ZTk~E$=ف $JӌmX p6:ɣ F|Yw,A%tvgTDgwet,UHcEgDgXd4* _ʯMYg`v\&"L^s_ =sr2FON%mnb k]rȰA=h1ӡ h((ʣ B~>Kݹ`WP: >:Э'T3B X춫"ܣpUZP>> o^: 4YIij:.HS'1qbKS @*!H!$8u.l+('ˈ\NJZF,^Qs*YV z.b@JH'dB>z6O_\<V@pzUEA4* /8 i4@#!?i*U(X@tV!]A]V 2=2 C2 : ˀLr_a9koYj !ӑ@\"eF.dF.d«RuĂdm+ \ֽHUFjQ2JeDkbGUǒ@惉`&eQ Mk>@nZ¡`r ``*XH)X+U bɂsJ.E *]BF"نZHͻvݭUE  D x]LJ%DK*) t8\85 I,PkQ0)i,gKШ#h$FEh4΁gϦheDi hjh**:"5nժ'¡'0IxYyH:d^8Ɇ ! YXwv4eKR"hIJDXUJ q<_\v3_Q[ 6EB%@p tb!bY$TI0* OU :J$W]$YczPKhK*163h$݂F*ETZR%,YַtΤj`dNjn:k%G\A#2B MU#yHF`YKd YY73g2*MrIIIt$[H m$HH$5p(55h$%94z4D8}qxdE|v0g-IJWe8XAD̾ ISEAXVQi|U%I:D2"cUnlˊ|^Ys'OR#/,HSJIųlIO`? ?I>;E$}:7-ȱ-$8ˍt;UD6Dd#.QffHQL4$SvVL1voo_%ӔN4C%t[ J, I%hL %4eBeD>n$ `p "*6d=X@[Ƀ]%XUE3J*NUh_1ʪ5dVɂt"[,!Y?$Hd2I늇9'z?;A O30zʘSǠ T2JlxYyFa%ggU}d:OY4lCS!6OuS f,Om4X G<Q"/$Q|1& &QR(S}$S{PI:,)&\߮p]TNGT>G=%U6SS}`tE{}`~Ee=@VL]j7M'b׽Rt6qh$F=r IࡑIˁQfg=G9YI-oHRIa>cXƳ[Ad2!!֨VhHUHc2KC]hTV4Ukf]6VuW,Uwe;C]X+IAڈ%I,Zj0HUS`AM 6yEsB (Z)-hxkTGRZbwh<̚4DO[z7T%F6b霥hp)Ĥ(/,?HWfb٤-βeV{YMYpҨe4f j%F6E{Qܦ1%FZv~ XWJ,U%3R%VuZpVNL2-yN\Kti-Cة#R$NUejgC~I,RHeVΊJ#Kl #5X#In2,YnTxsRD7TQrPIvH|Y5Iㅋ+OZ*/](itH+ԊZIFi-pH޼C;̭jo DvRD1$ǂHI1>#ifѨJJQ! %#U fAՂxmk׫LŲ@x>) $kTsӒlŒLoE+VLdzLųLU"4K*ξUg5`CU:+[oHE{j>*xV-t)*].oa/i0φ!%Jj֟h$͹0߀ /ex5izhuAՂ2e$j8):Ğdj8dj<4+z45k8)IpR5TEO=TE#IՅl*UET*J5j4xVL\R5-U iyHƧ'U=UFcYCIbPB̪WHVU1!IН;4(KpZQt൑tod]j%,RnA%%RUx, )˞*&t3~61=8vnddFk_59^ >xRo@-OJJ)\2 mȲ*2^ H @`;ly#MڀH2`չѓU D7uANw#^'"g_?$;Hh-6"jK'(M z@F@ZӐ! -BpsjF|[P"<$DiHþC9Ib5q&H|R%ٮQIȖ*ٞQKvW1(xUAF4/1^;-V8X Hb"*LU] # }ŗ $$B_Q"DE8F>F8E>YwyYd犥R$<ⱤBJ,]a"$MԡIMXzDѦѱqϰp.9tl\3ÁpSwЎl YeְˮiHԭA|~7 e,ij?PXN Ao4pB zҏge  .h$YštLp$(]hCfn -Bb =[HDL™?ddIg/DW0‰@8jqkx# Ѻ+HJD (猡WA+#WIoK-85*/Hh@#Q 71a{6~g!n@YZxssg);9 4V1FMh 8hz&hںǙ %I#LYz(>ާ%~R;S`3xIp gFj92,RjDM|H*h $1Wߧ>uHDEh5M.8D# Q1]{bA p@ȅ7^+nL/"$BËh#LF"/B١I vCzYtLc"ӘH$a"u\(!?5q"[ z+&^gEDC P:1cj4ZQa ذ~PyFjsROm?CisRO]>]swyXvχRGEA6T*G2jU;`mZx0¥boeٓXNGmyɻwhF×k|!ԎS{8]>T<ԣS9?=|wT)amιn:tÐT^{5g1U*&MWSE5PӉ]vUj>)5|!T1TSKJA3zh.'|ۿ9>_/GJ8?ze>]O~ӧ~7/Vߖo"[Η)yZ ?y?_>t>"v^6 B4pMx$ zLmjiX 9_X|#ӤoYl;^Y֫ Z9õ=&ewN~;N^{wO8);|4{٨vzpeuR|/,V_VVcM\Ko&j+fu9:]X,=jYY&=.ʿ:L𾌨YY]}/ʿmؔ/S,{tN[u:sO~4ԁoF>t?OWۢSriޏa~m::T))zMzy{??_}]ˏ_}=M~oe:-t8]o?~_ǩ4Ocq9\,v&O{}8_:W۟|~~?/?~?~wh _~|9<ۗ#uy'ׯ,Zᇯz?ϋL>?!{?S矿3ǔ.FCͯno_~\q/?&ѻo:[Mqۿi|K sxW_?p凟znwNN_]Yʱq7㴝wocݬ[i{UIQO6O;o\pw&8oҙy5nZZjgs7a7)k{I|np5t7۟9]O[w}tu9ߦˇMVҖ H*_~{f^PGm:Ljtos4GE}~3NOã_ϳt>t)q:S't~ѿ̭s_K:їwúSJg_}}>M4G;_Emo??wr?ryoߕ0SS:_>v2m:?k~.S"ȿ?_9~V|Zi}yڞoiԟ3|?MߖN5?˟~j{<UbU%8K|}_MnXHendstream endobj 128 0 obj << /Filter /FlateDecode /Length 12476 >> stream x}K^IrGkX7 A,C$x<\EsND1jf/732"#Noovo~{J-eyzw~|{?ol 3oe-QoT~ޖj뷯o.o}y^"nFokmwi/˧~"/^n<.Xur|)w'?7{oݶ1] iYWn~u6JrUvWs@ιzwBNud^9ej[w}2rΔJw;er䜩=&39r*>9#=f9}mwzՙmĵl tw<,ُۧӹoޥv;۸GևUX6/m-uh60KjEzmGJجs\r:հl%j5Yф}ߣQz>nrl%,)[)9Id廒htlXs}}*i5B6eIp|h(]X9Ap` c` r;U<-]H[d\=0TH ľ-أr&6FE^F L$X[/XǏ'dBO=;mܑ7A[nUjh(^MgÊ8OGpOa([;m KYM[rskgS V7bc"װ۹ Ob^F k~IȰ҃LFݙ豓a=i]߭s_ibT)c5I (= cNV́Xž@2ag givSjw#绱j@@҄`;jOm(ыǡH2 䬥m`fR|*+vmIyKװjJ,@QNm(6#z5\ce7a5=RlozMmG=me}ǩ*Z@~LYӎt44 D"Gt1jVvdvP0=ZuՂ9 QCJb G`Жц(ɨj82ʁ[ PPlzDR- S4]Ũ 80X AA-l [ھ2l4!S"uGZ-D @8jmS-05p(鬹 `5J`ЩsMa59TcȌjljMBiRa Ѐfb V!,?DJOt D̖_"PH;H6v((ʓ+!*uP"҈c6I "R])JA3^ 3HT(Dt4PT <]Bj}NѻI2`7@v3fXvƘI$<2N$ b[#[/ $1iKҰ&I攚iᜃyTthtHMҝ͢ (ءXSMAj wE v >1ub:%epƣrSۆ0&Kp:ﻐ!e$i5d@EVW&0XI~ٴ 4Bj-Syp$i҄Ll Cmtø2?JUۈEb#-h_$à ]8b}]Ŀ LOE;DLm/^fSM_LwnϣH>|yj}בp^GzZ^z:W^Nk,ftwqCBEbnB19<6QJ:XȠFQB8rD/q̶l ~ZzdG0.~a$!j%U}W 40\zʏkܾlqcq1*jEQJ Q,]|`kgmX,NO[cpqLYVt]!_nUzRH*~ljxavMB*LY^eQdygo"!L^m\T[֍m@xcwEtXTFHkW]i_Y9&gnXe|0 +|A7Iט7 .#)(g2]\5BTʷ\|I#|s“AiUlN\UHӡjVUMuWUi%_(<-IH?ULgqhw9-oFc Ph7wf$2&i0LkP3A/u,iIQpt!]~^{P+EћB2N@;7G v߷UY>?e;wWLM s9cLQqL89Ygz!S(>[Pq cĭڞEw,pƨf(BݚFϱ)4<ɬ" 4K R-aWL4LYμڔT+J!IBB#UtyT SIM2JiLҌ+v JT[nH1}'|+ "6 `{-gB>G-ɉ*;^b*f@'" =E]hN_5+2>.5,Vr+i䰼džt E:!q)7=.y'~U=66/?2k*Ͻdž wBs~Y!~.Zw;6`ܹX[ˊ ױ t+!-BwK$Z|ul9wqnOc]9fkDg&l +XS.DZxgKGΈ86{Y]㌘\x}3cCϸ;M*#͐z_tO*g qӚ96o'҅g[H%XMí]Nnܗ[ƹ/M2_{ %8ol@|~~ee ̳A7^8AOڵtW3*p |ǥ|]pCʉ`ȉ[sș>K8ч Lyr+L3UY!L5g;@n @N1}ʵS.gLr-ވ!4}f)B"uHO#3^";hC/e3fPI4f#?}!jD@H*&MլWKS>9Vd;GM99^j*"S&tU"%GD ȑF;jX] @?Om(ыᝌ 4cW~<n&`^~H;ɘs9`oA9 V b@}Q޴N-(}s!rD1,1 $ c"Rgxz;0FVN!j@Ĺ8j@8S9^F ɴ=g6"뙊|+7/1ёW <j`@x}`b5SJf콈^84{ }bˉdA [m=ʸ>$өrԍ׼V,H9jh$GJh콈K8D4ֽFn^[ٜCa^qiK#M1/h"65vD G ;̏69z9Q8DiM'f3t7 N-{sB"QCK8ҹώlL{?4ދǡ IVB x@ ӧ-g9+H!lհj%/@ף I9NxIUd8W%GM vdE\gevs\9f6wic!;n79Pickljx\6w4A<.`T,ⱙ u uW }`y\Mmՠ}BwIH; 9hy%D.OЎ+ܛE!c;^98s+t8Ǎgjcm8m/GڰG.12tq v\ū;튷oҙvlH i /q]wOybq01-<'fwbJY YX4 ;`gڱّ;Bcqgt,q%7C}=)*+|' `ĩvLfOc$soXc99 cL:b}իoG)wLkӺm98cRQ؂-؊sIŪ|fhoAYXǜu8ioW#`58ǃ ߝb QNBWDCޣqF1`cW"'sHB=ΙʅS8 մboN8hVZAô%"8;3o$*:^za Mq3čuu/7XW4"h1*EC8 I2b㑻5o cSsj GYǕȐȧe fV ٔA"&cBsЙAGqxAD<11t?>pD"=|ᷭSXL,d3xSMD="7*6E=+AXzApIHsqd?.DYs+cᢢNwF8!&E>{9/=ntt!8 8ݗ߿IO&e1> 0@52D=޺DcQ
Pgj28!Io<$)U")T}MS28ض0J:֥ʃ5UIN&zN7Ɉrt'yxoE;֔`S&D$-1[D R\pL!2v)ķmsDK iu9SЎ5HF|C 󄩛/tyͿKi@DN3N:aD!yY`w}~>f[ VK?iO0St!S4G90Sr9k!\~\λ=W^N~-^->9W^NkWk3n{LWs9Rz.~9 D nt}<=kx{MF+ ruɖtU?Ɂ*3joY/zyg%Ku=İ4]ufuz&d%CίHx|6hG&/YX9Q8kkA﷕{e%I3+a4T|x@d -h$& +GtZ5<ù!^1t N8e#eW J#^v9j` !|;|ܮmцIKV/VurUp5'%.GNJ#a\]s"?)^:jARr ;UK84I9Vq8)MxBZw)4R$2n&)y9Y5t~ R*F~s^z O!Rrd<3c{J_,u@8G@ǯ^t14leޱUߝ̧*buKّwrvk`eZyW8{:C?Z ّw W0 р!{"C0_i\Ok_^e3# `GTZ #,|!jDdG*_i8#vH#9!8ǺEz;׌Xkؐ. =Kﱞvrd{,)6Da()Ҟ8}&xt0')mMo7Y\@JHkԩ'c`I19 Rq[8&naCn1˥RHj=Mqrˇ0yĩkU\L06heȜa]yrqޖV!YTסֿzZtrsOhDsuv)=MBh]-ngJ eSCuSNbm{qӫ;2Eť݆Z2a+ <9fʭt}a'$g>[0?wwy, n(7 U)P8G99>A]c=]$N:5YHu_\]$N:`SbPi\ C|\wJvZܛtݘbH8D$xfO4Ƣ>w{hzseb21]Tw==M;t'!WyN$n7=26X|0I}vo7 $W Jx"0 ]}H>?L^O(ӣ 4u-R;?ݖݹ+^N<`ibDkߥaäL-\NKC 7>_=P1x>X *VdGfcJ lKX<b&w#ĤuB石{S3w&Hn.q [ÑH;;sS3|yyuGMr# %c+bˇ.rnz~p#g`]p`݋l> NuElys// Yn%HGG6av9Z##g8a#;*TNCD(kN:N0] 變-W2gW! WrRŖ'ـ~9{ݑlHxd%@ҟ XGeõGRKi3)?#O^yN /Wq!9{:0(&>o8OD/wFX^e'~-w9'_?xI6Q/'Kl03?ES ^>婛 PM~7V`W߼@' |~ܩ ƽƍ+Q.Cm>ݽx b緯x=8ptnrӧw_'6g6M6yd:A$"_P-Qver#zv\s3빪Mr9hUlG_;dzN@!Xkl{6ζVrjib>dxZLs1m+.k 1}I_?`#%LZք/7:|ꇉoGW6cr1kJ6e6yfB>mbr74&lM.wny/߼{Ow;^4ا3[qTglo>o޽? N%ThOO5 &YsflmДlɪ79l9a[4mЏ'ŋ&y/lT dzvGAOO:O?MluOlj3s孎EfYcyWN[<͘$KeHxd˫2U)-qf|c3/||&I;$D"/oC}g[OdS:<}OdoBknWGg$2Я/.(D~4bLٟYx1*tbF^+kOEhgR<x:h{ǶF|";<28g); I>+=bR}UN "y{: {-뤥s?SȴolǷB@|;5 |ێ8愠̂lL[&%%^,(0nWZMLA?NO?g9 TqȻ[oB1X}fOWV#Fm f}϶ @/qKTȾԵ1==3>]ٶ09!қ g%^GE`C>ůϿ~[ˇzYԕ˹StM MT (n˗xM4uoϬP+2qW}o?~`}ze@_}'`1[#j2B5TkW}6YQ4>X}1ߚÛ/Kʞ8h; S@>endstream endobj 129 0 obj << /Filter /FlateDecode /Length 5603 >> stream xŝo7f?r{! H>n֒-4-Nۯ*G䷧#SXi3~mjmi~uʹmnG'?o7ݷǛ͟pv{;vxm/PvaS]ƿvፌkq0[7Ԛotmo6]= ]㶿Е? l8z؎oIKՓm~ܴښ*$VֶM%FS;ZIKÔXŖR[cS+iIa!heFgDHH&-keaLS[ZLRВZ!QhXttQhYX PKomO?4=f i9.L4>lvW;fLuk C k^"wEmNuNn$s<*$V!u+iIB&V8uUlIB&VҒXM%Z&d A*Eks Nq"a\suosarkV*-'rJIrb+)'6JIl()'rsh sFw>'*S?}A=P>9S4m0mMe&rݼݴ#Ū6`VMS}?Ӭ`6+ ⓝ/Nqa{7{O fOZʶq191VFR|(mGHgv4ሎяktfvtD~5ytiii%eWF[9{://qh,V=<$U: 9j GS8d 8sF+o" "!b6KK><#iǶu߯y65L@x2ƟZ@0y3s{~ ܃>۾ r@fl6 R@jRh| <] 1v?`8Ov?p 8 RsuZQ?ȠCO0(\rdgjMfm.&P2 RtfZ-cji19~1G@ `SXBTct(@61N5sƬ؁n`Lx7t)v =͠y`JTCmp( %.h2_D@OijR`B[آ-ā9x;:eEhN;I ܚOȃ'~HH+"28Q fAYb:bd sCPX"p .ٱQ u,)||\.CcG)=@GDA T selV9q G ->Xv @GmLn(p&fhg P$cJ1ãCѮx]xj>&|gF \,~BT5 P?Y?AֱŅ[#8 ZF-].<5O9J!O1(^*˯ PA~BB5rH5⫗oxV1`?Pw4X3mۡ#S'?o:*q_6f-yyQrweRo?RoŰPi8}ߴ #YWY )]Ң ?_]Ұ]ގݸ$dMh~ZEyU}ܵn4VGח4y=^ުn~7%\QI7)ܷU@P ,=-1l^);+eOۏ> س=3O2cO9;eρ`ޟzJ,Iݞw.N0C=7?ICj[ةWU7Llo,zٹ//z* öC){| 'ؑjlLN v{Gujޥ=H&Ӥ-keNTD󬺉ڌhqabKjcъ[VV JBª{ic - ѿo -16?,ZB6? - +GVea5,/4x#t  rSQ.p}&6bԱM-hs]:sC7["9ꫧ%k2rRTNg{~mmwWi}ŭqdMpeVOׇۏ;*7xp?멯w1]G CǫZzm_]wy!qEr }uNiڡzh}i|_mhARQXve~"8A.qwA۾a eۧ߂kᾞFHS j—m.UeqԃMX=Nx#uyhMGk[YJf;t;(4񿱦4ߣY>?Q7CY_S!]ux88VWw!{xx}CsMs{e£V]M?֧@7ٶz?¿?_E2:6޿y ޺#_>=ޱ-%ݬuHBpH{:~8xu43Q=*N2 8CЛ ={w%EA91+>J #Yix,Ipxt4i(eh1V_.FVi$MelP5wwǖƘE_]ׯ2AooOzvtu1Maz/wvE*sl~L>̤:c*b>j+'Ȥ[;N&X~X\cizW(J&̦q.VI{P[UO1B fe<WL?"JjN欰γ(q^X$@^:y7Np/.mfДSz|~t?/uؖC=L6 K/{pײ]r{\{Ȼ _ml71/tfFZUmW5rK-0u5s}k&ZJUV9^QmKi:ؼٵ$Ɏ/ 8ZޟVgd_MBdendstream endobj 130 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2449 >> stream x{TW'r/,-ivvmw]ZkkBQZ" <yy͝< $&<ămUZVO} ;Ns93wf~wyDx"7$%⥕MK@|^,d z'!BL*ڝ$N)[ Al&D Jl%$뉷 ;FebG {Rq.(qc6K7ç"VDxH8`adxd\LԲU.$NKY$BNډm{u4s-bQ9J1禗)sjqU?-[@ x?\+4}tj>F0RDj%81HmSw'p5ÿʼ Sڔh//- 2f#E0^n@ ̉SbcV6x +xwixAoKu|!@(,R8iM6Nw4WHT  7z[r w$VQ4GpJ 2 _9* 򎪆y|$JaJ7&'EU8H8[jRm Yĝ8oz̽Շtbk4wS Wx^EZ6 zdUd58\6W-sٜpA;7ݙc28/ڬbTdH'\~<=`*fTڜ97An`cqQZE̽ {bB:45F@ynqhXwM!I%8 aJ86Z!*i}>]6ž ȋuڏ: MmMWEяqVb"cF*,G,O}PPj7}*D.)a¿ :}x< 5%s-c~ oOJXK-%FN,8$M M$.` smJ`AzF ,ysI32}-U9?ji==!o_,SY4>D>0q«vNa.[G5>x~\U]12&BhmyW^=}( ~dؙfjcmnb̕LʶNF $w7l,]c8lt(Q99!}MMCѬQrd? =>,? #&FÙ ǀyF_t'qGSIki-Ғ m}JWf/Z{q)-^A꺵;6Z]xr6mt~u16Nl3UJR.NCE-kM:nf $~v/eZmUKWZݐo, `wo/Nso| OBQ,()g,? fdrRԨܪV 4xj'm*fPf7qEL`vË.N@ԋQ17{Ԑ۫3v?u,̮>2וp(H+jsyTS{/|֫=$ҏAZj5FZd^YgA!k䥤l6P *o* Aᷫߎ_%89h`⫊5=] tۓ_C ɲw6nNLB0l Pz7oA¼ rPVjOdpg[HŖBqɬ&?zp]r )Y[IcΊÆhn@ ~,tpd*My\ 5o 5e HKRAuVLYtioPG WB%}GSpFk zR8Md5]v}wTR+m&qf߅Q9‘S; a?8:O7oLM[$F *A! /sӟRq;X83>4WgR \IT!d&Ikm#2R8c6Ӗ\V:~ <|z?>FbK"'[ ]%35H,!#{ 쇩`ЩCj%?|fM+y<,PP/ƃ,pgjPRfkp\MVxʎ=vqmuiZmp4$3^0{|١Cuq;vqℌTTZ&àoT4.DB@dd.^:C?; q3^SL[g|IV,ϰ HͨUww6fD^& ҂֢-(qGe % Z7B|}?|S}_%hSI9,!? qϑZDFݯGGĿendstream endobj 131 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 788 >> stream x=kLgg|*Qd8?AJKEX4f,gvY`/.,%ڠ% 5mML MLF0Kx$HhPV\^OM.hw- Y鐕|=-sze]mr*2Syz'6~y_H']̹$[$W.z"|Z >h{Z73V!Ccw)= 1A$;̂dΏ46?X9 J2qg۬FWj$c>GUgPp7 2vMA7"X7D׷Gh7,;l`ZLJYjn)< #yR0) GLgKVǾi? 2%+9UR{[}N> stream x{PTpRl7b0i'gĚ&j v彈peAj@Lj42Aj&sֹػ1v:3=}~*b%Ho[i%K›Xt? QRpΛQ4̾,*D_.|{OiYF\dE=GmP۩TO%Qj-Lɩ'R)% !9u\ %ZMw֭]O$ș$}bHŒICqre#Jac(Ĕ(IEUa0l%L֑i.;Tv<*7A _׼gFfZ LZ^i(Aa ΅̛";-9+Nγ`h=n[N^Ȭ%u!~%w*9n>Gw"EȾ"rU>^`uWXEAX7mS\?u1;: jp5yNN]0->|zk)#ۛMO8`,efd߸'Kf#{XQ(9v; 5NsdEGǛ- ǒݘזvbŞ e1 $+;E!a~elRY;ɬLk2^,[1{^,~8D1nQ`Y_ oC@II~s;='$Y-YwEc غwIHiJ?m8궸Eem7b +3_Sz5@Q /B 2wu{S7{l(b^l&ΰ)IӤ?7Z8ݝޟ}w'^N(Q^Z$i|˹dS2"̀PwC#&+P?E2- |z.JD;%B׃#xҋ.#%wq 0`qeTD(ʚl#k7757^\jcEZG&,s%j,P\Yj(Ɏ[U-n43p~FYdX RX駭=-Γ~ K藄YѠ=9.ܢFUIU{DxLݞgj?޴۝55/{&IӘկChlݟ%iK S:D拶Ԡ\C7 fi_|bc_*J\:哫:,\$ωvL9$'t 3-mѶZOkh76UԔ 3|-^7n~2=(Wsdw)w.D:#:#6lB_=µH6Efꅘ ?))Kb պ2_~g2 Uowta$_\ߋpn)"~7=w~Tu+#FUL;;hcI1NS^0IͰ1t i 6$csBԆ 2(Y%'=*oň]*I[cA ߃|&Ḧ́8 Kr!nHSG#VRwP$iB#4i ĦQd Ot7/VtoVۀU"+t?JhTϡ!7zv2?jճqngWs z*b(O% fwϟd W~NU[jjim9UYqg23ףSԿendstream endobj 133 0 obj << /Filter /FlateDecode /Length 58668 >> stream xˎtKSekB'+㚑]$DjK4Nā_A@OD+V*!ho37ss73V\?~~??~Nopx{}8.oay8\_ϵqǟ?y|]N?/__<x܃/v>?Hezv|tuߗ={o{Bӯ}|-~^ Ό]}'|?>s<]W/qz:^o~sefu:>];Y|IۿGt?U^פ?xzds"G#Њtu{sx:}.KRi^҂W"MJq~+wy:ʍQpOnpiC""I<^Hv K[]XzNq5uOt`UgFLylj^׷!.q)%(=Y,˦],vKHրDpmJppqpP 1@^+5;5dź']t>}n^^[.0h^=S]}PKOГ^H!EqHz[+R=V=(V-ۢvK>oGO҅ׄu՛Ԕ`4oԍSK,ծo.:`b[VqsK) 9iԇy>ԯG.o٤C]wk5jkD 7F$S{cbbj<1t9:jeG/pU4Rqyul|FC]^>Swgxnhcr.&-{? j uq#uv\C56[8Ϊupq_?8MC\Hm qW7{:=WqtnsIj:40ؓ&{nf#˓ۈ|ڌ`<(笁jA]MUKۣHՎXxyR˃עs'tڅ{cT7sy"r APg.U[;"}xf :lrqJz4 x~Ҝ{0{0>-6G#67F&Jj^4RGs5^t1FOpnrݸFr(Mv(>zTo-MKHjjf7fso 9&6Gd6޽_AT=pE/:tz;=>_ x}C9MPm>Tcbjs4RGٻsz=ޮNo׏jrrj<9>]^G1PM)P)A?k Ώ#J`P蹩l< < _Ciй|k4s􀠚ʓhF_4ڄ{xqy0.?a\U튫FZJy3\+&,oS/O-Y:vԅh.A;t8>BLHV#hՍW տ/cQCcq{vwVqd㎎m˫wG|ct^FQKoE't/u/B KFQ4R;ZΣ`\Y"zajE4Ra-'Ƥ<܃{~\\]?owmƦ޲jں֥xkR\|K֯N@Ϲ0H:èj[3zyu}59]=}~skGƫ@P51xMA YxP=@&q>zZˏ>nJGc)ko1ۗynO\=Fs9;^ם?οd_?rzo/hҭsawsZnF#u0> ^uuqkCǤpm^O9֎yNwL?֨F#52 x|5~)M6U|򘏺W=edpF1Ԫig\VZvTZԝyߖ#Gps5kr 1 lǤ`48:`ӗCPPT+8O8>p3oZ\ M|PmdD-zޞuzU! i3$ ^}dF(xٿF -^ cih`5/pѧWyxxPpr}NJ q=/;ӼCi^ƢwBw#vɘxc\^oL .h˦U\u:\Z{}WKEFos,LͰ k37F-i'F`c6~6زtxq&lM=,ǡGڊ{b086kiW.&:N9 Z t%zox;>1sKl^8^ jXW͋2LH\s9ۊr6鵫5Gq92^5Ϸ15t=qѻ 3hg<q<˻Ҹf}>cI|o_B]~?[xFv>zO QDC(Pb BQ ׎wRKTZxْ?Y.0ET¤B# == )Fy>TPs&fL}bK^\qmɌc'ȁG_v}{$pO9r.iH=,ޖ'iĕ be-ZG]9iOqp{"WG_,b +ÍWB,ЇFB_Xp\xMH0 s6 qiacVPU,Da@ڥF H40Ѓ>x\9ZDiU1dG_G2\~zL;v &D;ǴC#-pheiWC6QQ8I0KRl̲,L8a`xmxRy{qqa rRt4ON-''҉q>,./ ݣQG R0Wn ],)M fIy<#njPT11Шf(d\[62IM@c1Nbq4dV#t(8'xtfƗD;ˆb%R|$#󱚬_vENPHURs5~ NZh;R F'&lN܉й1 щˋyNZ^DABgc 28IX%,B); H$؇ѣz" +S0ɚ]3 iGs>/mҁрY".6 6t4s w+ poMmJbY|6f⢍RN[SD=:0z̵|k[ F/TiAYo,RM3ܝFbYXZy֘`Қ`3h@coο#f9$q(MgB,\VeH4Jq"Rl(5/XA _ Ѩ_F.ܱUNGU~s/Dd6wġBa~)!^w- ߷5 H,)n@DĠV徍CgEPB|AM3+h?$YcMC01D#B#zaW=IT݁De1HA#A4_K\G| E8QTF( _aEM -S߶ :ˁcL :DL0Y}:>}vTsi:ePXb9%1e!&wf< G0S5 \ !@DJ)7;hpU7!Q2Bt^/qV-)Vͺ14FJ QE/ [B`%4%Ԩ+MPW10P7QUݶUߒwqC*oq*aU0ʵ13 'շ'# p VAQ B \~vTN:RusTB#Q D%oHY|HK/ Ew$Zx#% 8*q6Q=pTQ9T`43ʵ1c`TyT=T!:xxvp3 #0ZpqU?&"e0D%7|_mFs CPY}"]d@@/W`+(΍/4 Xp< u1yYPNr)ܟȄFQ|L%\^$ʦ(m)F 8`4.y10EJ/)6Q<&'B6q-JB'Qr]7'>Im32<ЀDU2yH< $rNW '4Q)<*_s<\OtBOx ME?p+Fh$ě3{ₚApFBƈ-7Z0{F1zFhF0f6& (!(<#z!scH5q|eJzRF!RxOM1Y*Z|<;>Hz# qLGc#'tPsf j`ÏsY 2X}dg2F=[q^rS<^?%c)R)tፑz"bJ}L>:e7q"i! .hV/\~.qُ,9YpZe)g|H> #mhણ_Ǯ!`bpS'efZFF( F(ٚEP|KJ Ȁ zxF-бSP"94`:ioA!B0!aO3d'TR!T#4;z anI'7bLTgCP8FP9'cQq^%ǀ.׏`|܊WVx~dP 緯T|0|] =pR}J谽BT=ܪȸPWoS l(a8(8T`8p#0HA[)Q\'S'&O=Pu<.z|=qik :h9jj| @"a<2 =G CxhgㆰzBX5 č.4Hݴ;tSS FE3i[q14< ,1t}umuf\=;bo^j 5e ]>x-8G;16F"`(E0p+OnD240^q<i_4̯r C0f,Nlp ˡij͵j(ql\+sC\ԅ28N/\IB(1ʵ1ʵ1w_ϟK4WRO-F/I0[=ٵ ?|&@Ug Ox7'1[xɽd;`W/H/ȣ/X_[DsDb'F\Ʒlߒ|=7-H[{IOر#AAk#rL^c{l2|Qjα,mᵣ} {d/^k`Aبlf. [h6@Mc@[x EyIh$ 0FBO|\ CyBSM1TP^CbR=U>- #&Q"C&UH*o|&ؾ?-ӄi{mԐ>1-p4\R;W #ls'Z;~"wđFqG/y6ؑu|:px T+g!Ң u:!]< =JBxz)F6bV,9 _6UlE/Ek¤n7(SP(ObCDQLL!Z<8DX8 /[x`Up Ecroճ1z A`sQC^GCF6" u2| p.}žE!L `a7(F@׎*r G|D(!SnՓ VaU> H*_ ?y g!@-7s.>iw *g 9^sS Th$.E06^#.#.-b ؏a wdHUn m0E\͢r 27~ꉈEFBOVI00TDiCh$ Dc&t Ջ &SoLJfxw /Ns.&,!n5yj.e X10J0x~#,^7Ï- tz"ڈTAZ+eE>4H+jڕk#շ-Q:PUE94H`C#*n h%qkz8=>x~]%}k7׎xue ze#%hf(~^V7\~7 o|+g!Ѣ[9Uߪɚup; zB"TXU__N $!F0qYewA ϱ@DXe!WaKP & u.&e\<sԙbqR<^lq~:~kNoF[3iR9/z_a_FbLj:Mg4H v}r(a|ьib&Cmtrfr=nhCLy|r{t7}+ݳFn Q,=eW^GhgO@B6ih X^-\kGO߿rk6ZDl .B?]dA Ir~ܱp_}~Q V?մj)?V],^i>LP I $.XF QMxt QԣB !=iO1jyb=&&Q||#}RcGǤx44b>d" 9z{ثW/ac9 9pN7ǽv7^bd=ӎB8x K1O1Y&|cy}pշ@|#61&i{|.>./2߳j v 4Wgc*6bGŵ ߊ ߿"CIw%A@ @4H܏wo1_48.m޳__b S.!Kl&jX4y^] @y9@Sz @R"(aFqp;)#? Iu'=qjx <1=o6|u6z\Cš @Ƹǝwybp9S٭3M0?ߵ8?i#S a<۫UT/mH^2dI$" 9H_1Lx4kB,&#4 &1%MJ#y$,.7 胮⬭#3H$(F2lƒQm43^ZkNJ/`QٖpCHg uR=p+t.V'h$Qwk\Z*5$}% W,Q6FDYxfw$ݒUN%'ݲ7-I]ȤYv!]dII`RHHr(ie B)qҖ)1X`R$h$2\iim9gk5G\ r%y%P$p[P&0c\rjn$QYH`KK$<jI>(r&nF)Z̔󐆉/ #aC&>WkA%- ׷:[@t!Cdu_Nn,Nz8]9_YP-ɮc<J ãK0;JjMeEI%,-Lai]1K/4jr+O^ WGo~%V ʮZCIŒ.ס1:mir`eW9Uˮ,bYVHWEdwAT eY82*EIUTn++DT*$>sE4EF,s(AA&S1FuZST?NSTXjj40TSRe{nAKqꡚvA5FM;QKI&%Lw/Tϧ%ܥiOSFS S a_@ojSeICj\ ^6jz' AtKsA6AF |kMaب6jr'۝/NԩiU;Eòc]qnթ[x5ULBYE,k!6syFRcYRbP55F,$4.py .4^RB  >R_Pdp$&mW֒,߮$YXޛ&U_Lh4$( krhD[$H .-K%K5ڎTb{Y>m bIe⳵(IhkztYYg;%-x{GO?\}Q%iu+8y81\\ VX}V*0Hi]1\wt#.WI.% !, fOJ1>Hkr(Izɛ~D~G~hFrX1MbIb"Moj"XyqeC4D#IE;Q%U^|&VzYҋYQ{r>i҄: NL;Z% XR4iF/=26/u&]p>])vIG)]%jEIUחʋ7"W d7;!W GŁr 8ܱ+KБHϕחKwkWdW<Z&/&Ac}X6^E,,G&RydcU`I 5a`rߤa}镴ť<;x:VCtJ˦10?EQ%>jxֿJ^xR?+ϬtMf:BI&6E )./ޔ.CfH{滕 89[rNjP M4D#)ɸ֗yLt8 fvRc[VƵ$&a5KK9.ў".̶!5 \('U (%)^;*UftپΌ3)K,hTFDa%WN~ݦ W WrF%#KE3(iэ'Ih$45Iws.%vmf޵ezyH[mJ[dd1ij֖pmC{,@B3.g9Dg}Mtf9%NEg\"θ9-:11duљ'%% hYxf[*Y-(I6ګZW+4̺ ,hu(q/I]IA /%b.[x* Œx5-FRRj-~Q <|Kw%./FfIaRO@\ɮs4n[,vTΪ;RhV>/Krrj0z>XДT,.%-ouFbQKYK%+3߅Hˉ(단j]LW)犗p1'2<Ỵo(~Y{ylukPk2Z6FsF Uk|)K|V,KVҤIII|w6yHi<,ij w/NڕCHKx;;TN 4jl5DM|O,jc_fh4XzQUFUQ{, *.UF.$79]j,?@z%d9YUEIDDhgXxM I@Q h#yF yq̮ yLZGKDO<sb12D'xvpwhi݈nl7%0 7ǀDQzђ<^&Zֳ:EKiNܐɹH=/MIhD6s-o梗%dmFtNLZxM^ep ?ޅGx㯩r<}8N+`B#qrC9LB ASn+;\UA!`01Zn#yK=rJbMԄvQ1{_0Xx ߭C'cLEV^2oXx`#l,2} Gj4` 0Z`<;%HD4!0zy:"cBeF-!,pFhӠPޏ'}oᐓ'b'/On4Ҡ~5yne\F#23z3@9OMi/UyGWق&8?ONI2I6ݩ05ÜM6mr_\8:,ys[s>FCNN&WMx[0'oѤ&fP%֘ddN9o&bS>5O^ K^QB`jlV6xNɻ$Vx4BF; iylC3 e g tSS hL)yyn.h׍W07^ǽ I4jcm4|>H.ɼ?_6q7u~@.ߍf]ŭ6M<"0. znuޏ1v_6jhk4Rxv"N"6z"tN+fDNlԆ*ps(̩ <~dLX͠mϠl+?P?~5SCtB'/f4k*Jب ] \Y}XzwS{>ɺx YTkdh@!5{2y2dwY x?OѼШLƯ XX#'}1ՙ[gԮٻ3IwܮSëO'.&}ߪ.&x{F{%;+6~ǯ|/תCp7_Sv;=~~+Ah?lx_;^Go>|kMa_۟A-o^vx^o\???wj?kuq_˦_Q][v鱟yg_*zз)q:gxXc=iIQKztw񜫟[]x f׮YKמxTEKѫIu^#leBP7 uY_ymӣ@N]zk !'F:14-6 ɽzLFN-vtg?Z4InwV&i@D:UD'/>'i7ڽ8{|Mfr풠:D%Mjz_S6o7FWwYj^,Ssxt? y^%PI^;*xq(OYy<]hYRT(_8s_N\]N\}xt9.a ^\/r`"J_ޒ+ 6+ px7Cךk7miWm&٨Ōt_\tӡr|< |jNEd)՛bcT{N}Wjj tĹuMF8\/?ڊ:+ncyJ0f DjpפhΖ(kx-^6U.Yo29چ>эqdp~BQ/]MR]['R|Pg`D} Ϣkåg]}..t}:t:t˰lJ-mK ^ahT/f>FA}c(x>y=˸z9>(2-9w\ Iw=~g]$%ޞ;-hLpwwǠ4P7wr729̇x^_L/ }uxrqqq鑻ߓ4S立phS#yinͤsjz^(j~15@s8aϗ}j+y8gKlm`/m4A#M}~VnoӨ EK"f8-fzzkTl8%0Koq\Pz=U'w\ޣ:V_I|<:#פ:hj1'51"`8=GO{4j}W TXo/~P:Mz4c4kz7z^ܼ+=6^ ^;)} fhȓ$5  M8km`Oٻq!0P\OzY%^G#7bלjہ~1:+{z)qˡZX/5qV/51$)53%=]53: qN͌Xou_˷%qojKr/M4t4hnDv⮏(cFcAcK4 mFԷ! x-qcTIzgoy07ǜp9`ojnsڝ;:[=G]ހZna^=kuNhx3`5y= xh|t@'"w=K3\LGm6TajPc i[YCyߏܫh}aBXv#)phO<ܑ:ey˽SǫTOV{F=Y, 24| pKpX_#=C<6/fm2h_L8@~_-f%)koyL=UkPރ7vi+heeڊ'9ۖ͞WZ?%PC簣˻R{éi_Ʀtg.Z_gjӛ;kui k&Ŭ" [p[`PDzH,u@Ozc<=)FC4H5|λ? >eڞWm^U9ޞwc$kZRgyc4}+Mh![SWQJLa&|j[< MM[vVUշ59 (ux=r9ߒջ܋o5QlQ, Up@v:τ舯1/ n5vDl(C\Oz61Wo7 ?^|k! ],#$KH3e5)൘)Y<͔WgJ{cjA{ؠQ+`<ɓ֐Ҕ=4&޻M96k9׷Zz'xF?Ѣ^P¤4Hfdlbp{_ĕ@)''&:'NJ+ 8[PB<ʡ4|vy><𚼬bi&-&Qk1lIYRRfh>h%ϡC=Gs^I?p͟|7?Xf8RZ%><xD|8?[v 4 #A ] jQB9`4;&LFN&1W]PT) Lj4]YTQGKq!<(1ϤAv/v-_?-Ղl&*kKh䭼^f`W,f yM&I9_?٦e6-5٨ ƭQ 511 G6jˏ?v?Nԭ?:/+B#/OPspuws߿>h?x8>k݌mBy I anktg4k24\=qѴF4hHN4h>G WfJc4Hc8>DL41/kJP}{dќYbk€ׄ Xb@j=QvRkN4?oŸh$2Q/j%. P󳓯!tyٍw:/9 F.^aBbZ z\ːmr#ۍlQo5^ Qw!Ee5^ȁx|ts-Jʠä&%8F&}B-O29(܁< rMD…׎Oax%~8=.k}~ovwD^;l~Y,:D?\Z[,#`GKvpBLv &0-a#eek;ID$ -hE#5Bkf-$vx;?j~qn$hQg$5$6k&,= xh$0nB%d|1<&sWxn_B#(]./S='cWẹzBP0P| x[S5I)%bXpuj1w0YJ`>}w~42h'V9AEaF?NtF?C_T1i4,扉Hhѓ|yD>γeh8بD>N }lC/;vF rlԸFe<3͸\]a+b|,kyu*>K!4jɨs6GPf|y!#֠05oHhg-"/I'FWZ oWɷ+ėZlgE<1UZTjYyrbW=9V!plh7⭘{yb^ԯb^fmʹ z;unm[Phw=Q0E)K|F[* q98CIp%S5Mdb+68Q cGjY Jo$!6,,a#وD@4 @fazsG(IL^C d ̮7:Hb32?s yVWЄFCBQ#c0:ɊBZĉ9T.~Z: yT aQy !4x30IMRyTa#vȄ)_d#U6TZ.RG \ғ $V2y8ZfI^*`x8&Mx i ~bw#rs~SJ4dd4r<qKbn讚4yR""`q<=yCKF~}y|c6F%!oۖ6~؁{qBFOKPP GyzDy"Q9@$רPTb 6jfqC('*1[{_fFƨ42;` D"|^/BYBI@i9; ^M=8(GX*#Q>@pF@xݰC,E7lMYP![hS5C i& bĥKQ/Ky<5s|%`*'%6)G-7;1&pN E[fH4wdSpS"CAqkn)Ek|22F #(8DC6 ؘ2Փ2eйB6 B6bFx;2hqlu2'e@F-z:f- ҃5 ok?}f^)Q1HF}xW=k NĩtNz d$c³9YTQ D./<[4gdNo9U!NѦͩjO :}L«F5:F :琵Ɠ ё;0xB)',UcKiy;H/Ĩ@:] GyĨYQqF"Pw}0Zu(FT9pHd"#Cĝ0wSܩ0uv;}<~~;W y'krGhbUY,hɲX+68-t*O5a3z͈a͈gxt/B *`Lin0z@X=,SS w*VNV4UM=1ڪyl墙l`Wn1hw8=>}f_iD)^C yO-lC#|[+t/^G~,>KQ%Cb*V[mIO-vbGDp[$X cj~g"'FOZ-2|+8ƮBel0 dhZdrNtόٯƘ@`}@Xzg5^ # w!d>>F Oxs =m6_Vq/]~YH\A#Ca 66pK M;D4mululѰ&e]jc~sHǞ ;" is0^x9, x h]+ڥ5TFК,EIs{DWsLսLDk_w/DUL +8jn{PUZ؂1FЂWHrY)Uݾ)E)FXJf!s=Gwe6^X÷^gw DDY,=z*܅ᓅpƏ[s??X!Ha!N؄FQPR&a Aw[L"r/h{yKRKaJa"S9sAU.T=)*a7 Ooc4B#ek}4VQJ4BFY,N40x_^xh@P*#\Vd_@ GpTODlDFl*gn6UCSS2h*!LKT6T>UcWSWSWcj1BvйVQ1%4y%𚼒ZxM>^]4^8u~9aYNb%~p @ѓ>p0p>O.{'"1ZPbZ=1 1ʉdxu #SzRZzzVbFFFY9[ 5m(>Oiw><>9^z1 C#n%8M`"aN".ibaCمF]y.X=@]h$va[Wl.LD"# D(8%4jhB6h$FbJP 0Q5O5O?Gsi}pviS ĭw S`4 %$n-&* ID7tD7BCC$ɋzzϦ;cX#r 1.CpF"  zh$葑F@ఄEGXD#az;#n^/Y avC>>oo{`1F]xMO7FT ' `kX* (CX+Y@T4jEqQY$!K1K0|K-aZ= aJkIѧ_(꒗ZyF]^Avi +ے[W2dyd4 _ ꓜlɑDz7j ^'6ZrB#ZvatGyQ.mj誩v'5+'_-= .3eF_.wQ~˄zq\.NC.5+( zL1,x']xv/,CawUK^Єb1zerʀ[#@qQqW2iWʊDezeftz:V IwwΗ@xNt22HF41?YDj/vrcb>>>ގ8IQz}iQ6"7 ԋwqiqycT{i66&&6 ҌdZF#q1!υƌatbcw)bѻa[ݒijxHENhUX`|PLig7d6L2bzy8;:z^WJG`B.^QB"iV 8$,% 6^E9YR XϑR@!%,%PM_#IVËJ@HWɞF,2{HڅxZkٵԧKwY'%iœ(IXYɊ%&k5Q]NJ9Ӑp(*!PCzaiArݻ\]MNHJ\lE^ RyL+ AdKrpr~x"I2\ em7Ū`  63ևEat7,C wGnb  1lN[B"na4| |n!xώznH] <%ayn!&h\jVyD|}3|N)긴0e-6h$6H1 t!sDetx(bu5q㺞]ߪ'8TG#:{b'MYiL_gyE]oJrH Hj$GbӪ~{?W }䭄,xuXzyɇ(!!z&ɐ']E,X^d%.U&%AMZP>4䏧/@,UkJ*(%Y^cT[-ROz <<YGjoZ Xޮa|A21푮!TIwVFLJ1KJ1!H׌%"II"\xhKDG$Y{wދK'j|UUxykN NcMph,?i,4a-,D"x-/'*hRqVqYy[9%٥%dq|9jJZ=gzCrRy$gߥd19+1t)C)΀/ v ]N$I=b\+dvI '$$m 2v ]>Y,i̬Ҙ1ZgR,)H1֓ձrbPV@ӟsM2iNemRr4yҖҒ&_2݉%d+(K 8M"HB )HVHBHVs\$r.%]Mu0uTTu v-^.Ž%ug%g%YYro~gq4V`vK?v@/JO/9k$5`I0pd#eqxKz|WGwW>I\X$'1KZ"&bO*1'F$#i¨HQVY,A,-\sX^<{ F)FǒW}W@Uo6㲒x6'I$bR`ԥ!5m6҃ D#)åH.]إS˽MX9˾E&z[-&/[~Q~Q,,_|,gQǔTcJ/g.^_¼ϯ5 6sp0k,aҠ?E$./g/-J[zfC47^;3/4)POt {h=)mZEF+뻓eUM,xFBIĀBĀg1.ʡ$YP1H10r z ϶>*F"'? r,p[ӠQ1h#F.kiMS!MS xtRV- u9H$S+\ZB%]qa ,01itu!Bk9˺lF’h$т9䳤&&[y>5/܌|:_NݙF{=[\{a.Ix/WOCICI Te1{"5g.P̼p@ ,~0 HgW?Q .L4x3}Ox^zfc"/9 ?J^5'11=AB'˹Az DC{# ^KlNj` jvb534cח|0#Y5.׏R\&,.`9f6j G9 ;={`z4|JNh$ "./8987(!Rh$2ŧ`Bmz1cC ;Q͞W}-|(s?tOqWrKow+& 7"8aчP4ѩ'p0@b 憎a?Nh$0,O^ 0`Ric8iy|\}4tݡ,}/TϷ6g 1S4NJf=hSwZÝ>N'$4M8RQzWwNyz13x88H#j{#v=vw9 S,yK8<϶ IicR4x ڈ=ioG#?? je=Pѕ⚘ Q[ 8rhF}QjC[&|]xMkp$Ұbi؂.EU4,G6'k&!xXz2pi 34ZI-ZZs m4Hs Otn<80+.'Xt5peMhhv5$4;ٗgٷOh@]>>+$nO,Z-m  6mv/zeŞ?H/$\ kݦ6|< CyƻhNq> Gv)B0Kk,d\C4u {`xf<0}ﳲiib]K磄p{ܿiЇj۵.b ]c^8goD4Ras'Ɉ?٫ekNjb X Pj@XrsF &+w;x e-&:>?w>v?~uO~_pjQnqET;2(?_~iMa_۟[t;~U/9~z<ݺA_׿믿㾇k̟:.|i)WG~?~}P3v>$+r=Nwפ)J{bۻvչmk8xP=c5)x/V_=MիXzRŅפ XQ(Ʋz §=޽ yr'c#莅t5V>,^;8=7ϓ|vt|;Cz6^˰;1]/"]ukrQc ÆQ>^\~{vXrwF_sSiJ:m0NᢑsTVxД~{޽>>^T]nȴZ 龰'с=_<.@.Q^cy$/nu;Hv]څ׎VY,]ڍ譀X j/2=r6hi6szZZ9L<>8>ҙ 4]{0|5v[ΧXka^cj y:^_}\txnLHwtߣKy}ryGwH=r9O4 ݥUEEջhcT@; _S'=GB wLmU*Gp[wcliv䉒gFJÅ؃$˓GJWȓrϏ*͐UyMls$̲͐<**,[#?J%I<=:بM 6zQQ}Myq5 xmBp~{0Xy_Q& C6Ic70z`Sә}qd㮮n^=ޥg@3̀f}#x'XxM^d4%po>pmhKjl<确ݩɪy xھWU<OqoNh>F#-&mK˻mq%,쾅zm0fg&KfFQ3ZߒԷh^E#*WQOoF^f{5H Fկ\): oz=K;p!ͳVֳVߢa<;5n=vG qy9 tt NE|玽F];LYӛnv8ϰuwcdӔlԷwԵ icu# \ncڻf{}c6;xný[)&֏@S+q:w?HL /{FF M}8|{tM1 <{SԻh6%#w$nyԑqܑtBLZ]9FM'Nk:,yHiS}?Fe^NN,UO{KӚAxj}ʝf @Ç[hsچfA9 ū@ٷ9&xQosu3muWMsy;ni=̞f&.@M̧G]\Z6oEk͉=[:K^vx$9ʳ8zyN^FC7˾L̓r"'۽=ZC\S7?S}^BkrnErwmn4~*uޏy6P4uШM#x?zܫFW Z =f@@#<5tժy@{&K뙀j в̈́sN_{Ο<inF& IFh9L͉C?z$JiXAa"NӤI&]>O5Z;dИo6(s5o6^yX<&JVB# ھ ɶy^yטiNjpjA{@# z֚h`,Nfy>$4& ;MMwCd=%3'R5 O6=\^n^K=%OMίF5zғxm1zx)#JB)Ő fH:am0M:hAh$0V7n3SǤq{<= y?{njSHm>=R Q'^_z{}wԉC>\_Na5ŋ^YB&$7Ā-eY g4U‘(i*KHx=`:`hkϞ7HAUMЂLfsJ6W"NYC#AbobM=N`Sf#+ba,L&Nr+3xd m)0JqjpoK̩,!qj@7q*%pFz%p.04+hU4fY>YhWDD\a݋DjQ<ɠ,Ç/찹52Ea{$aYE343`c0\ѓ ~ܛ @H#{Q^A8z`@^; x+aKt%HCahixp,Җ`B]CF61H4Úm#;4[H\DD.ذNc;ql8AP+P+P}A-#q&^w&NY$a/9^{`"oxB_TooU{ncaD;H46B`f"-Ƌe"La<0C+豾9T-+DI` lBVYaE<22(ʭ!G `e>1\xZNl\"k1M\ ײx@\k+ 06 r*|3Lr&_p x#&#<ÖDW-c=HzV"g&g8zVbj9+Àj¢ r:{ƒLE#!m8=$鈘ddbDM^D#pRwRÕgy1<̳s_!:Q 6GZ^0.qX(+;J.6爍T,FpCҦ 1%4Gg%2la¢0? a>NvNB5`fDPi*z:ibsH3q7)ghv>/OGŤDq:*cL|r(oyri9Rކ%-V1K߇߳CJeeYt V4K342?.a42׸Ɋx;aw:~C9֍9 $9LCqtc!ԬjhLĩ7蛫ƿ|)EΧ\/@HhiY1o"[}1E6C=|!L'`L=F9Ưyl!2ozT!x@CH e959aÏ` vq҆/ؕV!0Fkh#(C5/WESP5 ڑǦ }0vh$A-:Ӱ`5-0VIXu?b3hYSY  <;pap#i Vd!Ci9h$䠑!M0sV!su7i DPRɤ1Iy>bR9uięn>_?<̢z 6ʋJh0)U>FV=EdLU1&^;R W`P^k)\B5o 1<_0+dl8,s8Vrx~ bN3Ī3dxŻDbME1\ѣ3m|+5j(rBb[*a*4-mhH4ve،!DNvB:S[)dTN=TD7HYRxB4{Ts6wpx!5DL97P)$|(N' 0TzDVe~NKʿhׄ, 8tXi4,J9CP14J`i2" 7ˤA#DJ*8@BK`vP+G=FxL5Q0Ɋ!FF|FLR w~x3  pͬz0z!6 j|GDpxA`eaEA #{|OPSA\n#&D=9k'91K )O!ѴAShGXjŎr r4U&bp[E 9}-rڷ! ;BJ5:▾dYKG81@БLnVߩ7Ts@ʹ  =R )T+!ee| )h4ghR#qbIy7 'qyX!N04wƔg-P2b :z^B>..]0Ƙvor7tC0vW9)1~km@L n| Cx@#Cӓ'vH8 #xbF_ n cjd[gQͫrk/ގq:/ 7/ޯOCcUc_y7v0Vc :x9ql?zy0!G.=̯g".[Ȱ8HU@# L0xAaQޖ&f`QN(atcTӂvS̓u%ℎ|C<ώ:剉+93i8'ҸRFX#/9Ĩ&gP4_Ɋ+7" zn^ X%X}nP r:L\+&NY)(D"4NpNoʡy#/̧T9cjzu)r[e}(C# F0 / ޘm!V!Cp聀j3Yl jr C#q CFܢE [D b2bX9 V!Cb؉3( /1ܚ@@-(ǭ_>|Kv@6\OneY,lsoECO=QiM,40S&UY_*G0!&t}?LHU!l™Toʤ'"la""U""j:F;4핍Cx4Шtԧz<(Ƞ/K﷢m>#>eO4q24`..>'~.#h剉^9zFWV8rV9 CЪh M{xE![qCWD"mmК:H`u5ʳ0ʕ219Xz"\}?aڜZymuQ@Sk4Vaƽ_(_j[}5؆$QX^)a=ccr"*Z#Z+ tq" ]A" ]_GT` zyI ]XO᪞p$p̵lEUcW0;!UOJ Z번zxٽm!>yG3qNʱ~h%3H cp:.|Aڐڌid#(B-ͽDB,O_ AE0fF+g*AZua ririQwKL-Hؚx 4Μv^\Y>B mL«UT%*%\ +&6QF 1hTSGb<00ua7"+D*R|*Ҁ*҄0īos^ _v'gv5h5,l?xxvJ>&N9Qj2Eh+b Y4y*^kS Hd?7D,tWˡ1UE[։\E1;+uѨ>*!V!a U@N515htϭӺE*4hg"xjC*H#R7V `ZMv.]yE3Z& D =loU!Vë/\܂]Q# OJ Q&T=E35HP*'+@J<*o ^IKټpx{ުx<;x`$x=T!4fʉ㲉yVLX'qha1JH\yp hjxM0) 7ap6ᘣ`FCk|C,AZ+CG`w 4(,W(NX 1)d{%Fa|"myN#-9$mI[ߠEU%yꕓ`3`awbdTULEDz 'U71 BYFb$nZh Z'C5kCkJBYY92ڿ>&XE|C,=.-z>PVm>Fz$7eV`Dr(A6[.K-'+u3PuuVf7: MCݴfw9!;iӇ-}NF0qdq}2s}2zZ\C8؞e؞T= %g(a _U|.Y"]c֗g"I6c FD'#iUlQqXvkg3$Ћ}ҰZL0eH`E#4޸*sH=KtVbwTI#%A8U@h eN~tw1bOyC4 4ӊ b E3x.{yw ^yN;}5yh#\O?\p IFgI y<}oxFpsuRzZ(>q ?NIZ(+|&O~9HD[Z!g@8@#atuJǑx)>NǸxK8Nb'v}9ުy7C=~ T_yw.'^j pڙAN ZWI.+]8M > º qzR:?z^@ê0ԛ4jSNfd- x*V_]7 ]`h xXubq:ў2I d@8/^.KǨPb5}M |ШȦ/0hId$ &^us}%o.뻝l$! tP-"QǽH `>y>MM/5@t, gQɢ R*!tCIOTeDJ"*FhY< h$-Zour~!^ήBV !/H<&MptI4!{ R"ՅIg%Z7oB"tٺ/=F8N^MrM[DgEb#OO $Ai/u/YQ EJ5Dd>+x&V 8,)Z=+/ŐzCtxYYs]gLv§'u%eFMR$Ť;D3 4蹾3!́ǁ HfE9W ,V;-(I[\$(s&D|$"$  ".UD<5KhnyP/9K_`Qa-✬/('ˉ,'I ZRh]p$)u9A;w]QѾXyު{8I 4jc2%1O^dA]2R%蹑 R#1R#`6 h$BJMEGD qV"ItDբ#OV"Sh#AFmn9OrzιCĤe?ē@ڂ$%F!eD43LH2$#XFdS%zloG!JO B^V(>[YyVk\-IKj̦˗4^0 ?T+8 5ײGjZIWj7c.iZ+nR^Lrr4qyki5]tMN>Nt֭sYd$~&^bD@9^}ɦ!C+"6>Q>Q>QpRB@VBYRB%嶈OZbu16Nd#D9/H&ͳ֑BJfOi8tyzLa> K59uo^&zhB&+D6NqA`p ݥRqVJWJ Ff2#6aDo(I(8]\h:Dj o]?"X"5P4+IR@P,[,$ Ų2jl}4utX,o]MBR'wQ5]_bj}To:Mf) wWS.S)KJ*OJ$&gM5 Ҹ$ƚx?,I.\97̹I ]}˔,u^S|>طK1޹Mz'wAk2]iMRqZ$2BJmqwӴVX&Xw5]nMT&ҹWtz= חתJ$&#?#I7>LDxq+blwW,%fHtVmgbh$ٕp_8$5Ʌ)$: %W9mq;n酉Im˲+OL+)l_y_Tu/4J-5AHe I,]e IQ$F $H*V4}미Y% k(IQ,pZL@=JZ5>Vj6n:;V#Ju}6 d,h#}ؕHYwaGK…;::{$hHɸ8_9rfڗm=G;iP'8^&*Fc6=VKcrZ'K4>IB fn u45nIѼ%8ͯ{wK tKi)GKɑtH,-YK$`VfŮa=ۣ:rmArؔ\J&YvƳZ?zÚ[aCI:4|H$ҽe\]1CJa-$HsXK:ܮ90HС$+rw -_6꣡&CܘÄ$t7iӐ˦!7QaAMˊ0%HkjFR L̲NϹbX9-HPT/ Q _)!IF"v> !IHs{r(~Sr=Q.R, K1ZhkIZ2IKZ2ɺ tvak2'QY]`b$0Ȣ2=]\b҃x %NAzd֓GhTbE,)[5F[22:Ö,%hT$%ag")ŒxwsM t/Idlr,w$yI $h0זMਣ[䥐AחT]uL5THcHŷ)1yКŒ|KF˒N H׎% TkgxR!9}8ѭEH0VFǏJ,5y,3(g S2# '݁Ę sW%v]bFHoG8/ } t;곔(O@rzz<,7yH{~iF9s8Zn`:MYY8$ \[8LvCL \;:_?d7=mH IN=G'װY bDzf5So&%kRbӆLJLD,@Q'R&Gs7&bt31>ix# Ɵ ~p~{endQ"il`4F%Ц [xosC^9@^=@8mhsn01maU&=K/OW+g8W^GaQC^\\V/=_ҙ=GKrzǷ.~9Nj*dr?]Fœ,=y,:9S#nY 1ܐ.jiŃgib'; xk|TCMv+hcXjcټ&^ï u2s/Kr} z =*0!0LH= ZʒVʒVJ.{lުݦݻ0soj'|guK}mT-Վl ۟tюY N^>draRο5javXVLk\|zI)ʲq-}8y qyBOut^y͊,c?8 (!oc:6kg3&fLb^}36c6߶?}/˗{÷[/_~zoK__{K-xF%v~(rX8TtP?}_[r-W|iӟ^*r9^O/?|f2rUßˏ:~ÿ|~XVVoOoE=iŏz]p}xjm.oV%5ڜi܅PVw<-xo6"ڧ5ڙk<Ӷǥ9/^ۿi1&^;k)q,tVy ʼn:2hԎ 0Fy9SQtdD>]A; \@sNs5 s0t\<{/q88:NhԎTgSKCM&3npz9vz nW?n&)CIIPj .NZu>`4\oyk/{v:p2u|zMvN/9"&:q~sFa'<@:@q: : i:)AONrټ^o<`4j 8Z6&0/*ɧ95z CnvN/br=H.WL<NNs]n!vAMF~5% &t?3>y癴6zzefgfDyZ]6pXy cΆUǘߚy_J :F>5u wPh{?^ =G "պF9: T{נvڝ"Zŷ}-w~wQ*08j;}q?nOPƌ7%:ԓpC\~W^)x-xp~x.tqvuuttu=7[_-\kT+|& }hGgGRsjNYQo,Ȓ'^;TSGƤ}qMƧ4>rVB}u(RF޷o29; {-t+ދ6>`x^yo|ˡt`>8z) tay>攰6 k #O59StnRч:ćӓ'^;W^ᩆx;;V=ׇTIF#d4j^r tu򩮆.']ΣdTg˂o{cZ:{ijUDw >i4vrD {# (q♪#))q j%8T‘CpD[38/e+vn@^>lNڨ~ih>똔(z!v9Y7ف;8-s:y>:hCv"M󑞝 oǏD{|>F:+L>hsF:`ķyvqѱѱttaYQ|j3Qu@ѨO |pޮ-t/n鄂W? ґx/^Ou27y(P/y/:гo(5Әjs^O{<zrsS+z ;Zhp/ph;a5 {ss\㪉Yc6R]ւF".Bq qy@~mvϣiр".R[xCxgpmZ&wx:$ >+ 'n+ C:eH9sr{Dqy9޶IJЇoQϙx(ΥOK])Ἣ+WoB`O)֞Otuω2wo0<: nGOxTu4R㠪W` vVܽ":#r[e_q &C4Z`2J㧞IZ:d) D}!Dz;;H9 uXSLp,jԠz;w fD6E6;ZW!Q!5n=:f?xIZf7d׹ZCō^/|m_f,YYpV./MB]N5v ,XKm zC#I^쎆ÆFëӡZhi~V8*.^dèiђQQTh49<,v"O?z5zxx8Ѡ#$kyΆ~kЭ͆~hY%^k9lKMM&!&y&٨Iڤۙ_}\DѼ>j8uz>>LNz'ʡgg'tn?~y޴o~Όח~|ܛknv-IFO?p5,i5eH0!I%d׶w {=caV/'^؁{=j q W>&D67 ve/^v~`m@W^8 Η5s5phj2^zE0Xdb gBoY[V -Z.m5ykW:a7M=VaGk!a>r-L8kKyjyBt|pynZtۋ}vx+epIx8MMá84&x<&^ce gƈgY ų,x^;~4 ?fC 5ǵA,.W.`WON}Co V2i r^9/^sIOFs2&V- Lt8=\+Ņq9ZkY1Ԭ*xuU@.Nq555'Fpb L[O&,&х#z zb(m33Z.oZOA@6Ci }>>]a' Cqd!se 3GĄDH04S=GߤLAYR*Ot5Rb^fH$Nbbf"-ƙ"7i&F!?Day":l('.ǖr"lYXYXX!C4#!m5#0IGಛ/ڛ]WpL\_Z7|l$xM q!ItJ'& ʸ%,reIi|dTnS3'rNiߙh$ZVkHc9I[8UAr:$jC:=3<=3\sC=#H I%7H,LZrUq^k8nnv8Nv8z Y(rUfbBl&$xmxHaJb5 j(ss1^s.#zmּh$mL0OL,,`!ݴ,,0,Ӳ^1s ?=Nkyiyiu9zq>zQ< 6AQ'r\՟/ʢ26)ڮ8xSVAEzC>27p0o'[H)U)By#4K=R!+dԳsh%4R ug m2ssv/HYy>A@#:(Шlv;h10H=u "8S)ꉈÎnN ZS>A)o1RB#tF2N30M!DrA$+k^5D(0KnŹNn}gl. {j},rYK|wk崋x犥W+h5 T 7$natBç{ʅoB6ܤة&#Њ!mQ)OZ%HSZ '#Ȕτ(Gj) qSgЃ{}}P!pYGm;+3o''] 1;>wOE|4X3rytؠC<22RH)oY#F^1 #3J& r%mݺ5A' xvh-Kv3Qsx1%gGKq& *T)RNCA8[챹[1_c4&MyN V2pN|&BQS8;xmpHݚChGcaWXW Qڂgd#lo؉_Wu¦W&Y9÷$vX5mS 5F"Q+4rVFnLv^2h$Q$ǝK&\2aNb #(}=GE0bG9eٹ/(@r>*vxQÊddd@ mbE=+&ZS7.{< ]ud_LFHYy=5430i oiz#koq5@b8a| eA/q>J0jw`  0ddCe}]m4mpXw z"Mu6owS'j۽ݚz.DqV^lM(&Mvn׶Mє&Bow,%rsH,aGĪUJ׷#+-iH*n|&YpC#uO:9:i:x"u:qt^^ѻ0'i븶`Rh$XhK .23@_.x@Q4׎bIdY2$X6W +yvs^K.` 8j4eBR8q}p" F8@^ @f<`Ch$'G=tjg;G#:LFx\LsN:E4>b;ddtOy)uku X>xuGۣ|,N0hb8M`b;8]!G= W3oӔxw\|C( i̮ Ҙ  !9]G$ :"/t/ɐ oP]5xgxp)=kd$%!%~څE9 JDCy ) _bAHLvHKCI xu}F"+6z4 ZHШ$8*>#i#KI>IX.G0)a2a\8e"IzxvUO#&%QMA5Csh/Yఇѭr"8-pp8|$lEɧ!SP'xZ{+~B'N?cJ`$v$vpx8{6ֵ4j,pJTUW6R6@3ddF,d=h ҙx=IJ$lH&& d&Gf5Wxg=׷N$_pP. : "UCXɠHІhkd%SGJ "ROH%|.iRͧ+BB%mZ]IH$i7]KPR#^.5Jz,\= p)nJJ9Yx,f2Yv$ oWx=<.x&C?$) Z &߇A^;Xn (% sh V^e$~ ZX> yܨ+rV:dR78Tp0 \I58D Ik 8XT K -R *q6XC &%qvXXBYhNhV$yR&y$Q01I<1816lWBUpx{Pώb5h`I(cI()$DQȚhi eEDq}"MD %MQ"l,{ V'IРMT'cCC͓.u-rfRB0xp8.j2iR]%ERzZkSSid8u6y~SdkGeJe$۰dRhd$Ab,J nummA#ؕK/pd|4}YtV^wf8BI$ahGmHؠH$l @¦:Tz&5 /0 -łFR)8J. !6)h$]JuK0I4.?Ke.?<4Ip]`$C$Cpx22)8^ zΦ|:S+/zհ?qNw(^0)QDvɎ d$4ghcb9Ns0ތ@r"f{\o<?%IP%)P]BK,@>Ύ*BGuǙ^騹QG+.'.:< =nlq3 5?6p|}|9_#O>cӚ783cԼH}ԧO' rJLzR^~95gIWjuFOz֌FjqIݞixw$9=983cjp{BkoxV u5~ߕzRRƄnhnix[}Zk;-z⭏n+hY6\7s/WF{܆ 9 d:8nhnKYvqWS\VP~VSxD'CY:LH]RC#~bR2vm˕áeJޙMCvD#uxq##¢&_#~[z=vmWRhe.EC!z$ LZ-&[ʫiNiŠ: MX;ZLz ւckO}CL옵cqJ^m瞼|gCkӘAAV u0V kk56j>̺50SW%S`{`v٨w2Nkz7uN C6:4czfIL6ʫF2ԱʪcES%c5^E;/ Ɨ*x9zͱ3_KW߈8W,k;Owmzp3\N>!Կ?wK [B_/ajQ69,[p8߾iQdx~&#寗(K+>a0wݒnSOw?||r9^O/?|xS2r)ßˏ:}ÿ|~XV?gg˒ >޾·5n|8o=|N/oi=M󺼾/Zy]_]+y=~ڝgSt~܌w>>kr}}ڨv,C[oqǗ?.xY&djX=rVYtQ^5eK 2:_խn(]YlspU&HWFvzWF/ظ//Ϻo/g$˱:i~9_ޯV゙VZzOg˳uxlep-yX:?~_dW}yz[i₎_:ro ^_?~z?do?|?O?7_/Ӝ>__?˥ǹ|NcyYw?oWoO?kN7O|n3;}=VeU'Uw?~m7W-Ƿ_~O|YKmc_iu-Əa_Nr)3mNZ_㟗ul;3s+?4,?gqًwjoU h۩"^ogpXAendstream endobj 134 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 636 >> stream xM_HSqm׫m\r/wf05f(M%ꡬȒć f[tnv6 %,!CFJŹC:Oϗa<0 6=P1R f\< u[Z:!#DI4DGb"'dPɐܪm05"{YnX]a0k޳ Xz1$*-1?&dHyjP[SMфj6Nl4R]p4Pd@ 0NST@7pbhe?Fy&ջs\N7zɯN@s}4j/7@+9g &Ӄ2XڻiII)X0pg=5bcX;X|>z$ 0kA&YB-W2ob0]8Z]Вِn͚5 |<<|9:˟Ac $]A/np}M.\8yP8h^Zsh7a8v,Ku?1 #k QUݑ^6b!PUS+\u w&[>@y#z]XeIQ˶4W4ښC]Tgq\>endstream endobj 135 0 obj << /Filter /FlateDecode /Length 12615 >> stream x}Ke׹Z򦭺:|ƀhFjcȾu*ՙYj/|ʮVf0S `D0ގz꿧շW.r:F[%cMߧ^?\mAկw_])^c5믾ݵt?\\=>7_+м#ZuJ]_n|:>ݼqj;u/sIⱔCr%cεchח4_՟F?RAԑ*LeLUb=ÎLTDf%1W)Cf1ęH(.LDDSg"EfXґDLC>|+0ZQ4 (C5v 4rܰhmG'W MX?i55Vշo嶔>_\xm?1-^Vb±!NYovur3ʍ'ASgO-XY@ Crs=ZIunCʨa\qi-8T@7ZOOG?fOh61Bco0AQ!:,}p EtTZA;.>Š0.u<ӱ# ytf5Z9 ;Z!-E굑M$b[Y:@Cb8VPXvAʨa,h->(8t2M F J @}ElV}we LYP-qbyYf3eByonGO qZI F+dDA4`et5@ZԇQø0 ZXcs+˄HU*Uw ʨ܋ԫ12[Q!72̈́OVVo_7xT UbD}ƨR!m'D \1gV~?SY-2dz@#ԇQø0 ZX!c#),Ȋ $ʚrV#N{k8 ~ngέ+kT# ->>Na|[ 8xl!MN@QZ!Fkc+zZAqCLi-)3ka'h<@sQmLFq Ԃ 0N k՞Ao<ʡ^F  ٟ*yT4I§Gc?[Ei"@FN e-PyCqaƥ-"_PH;LD:($RN >K`%SP/-Jd=h5Ny12Yz6";M1rx桀oLqbG V>P >@oaF{RF (Kka '6i );rcP#E)RZC{]Rۊ<H ƨlѼ1*_):n<*X ?X@Hy.tcu!Uбzl-n" +jB'IBֻ"* wc8͖*  i$6plB&I|kBkDmᣆGe H1ҍ;$Ap[r@ Bصl"㱲=ɺ># +d :=̄75Dւ6LIP`̗rAÞ\ _  YM1 XғFTeH1bO18WP #msV5>Hf{m;8`%+adG$GF%AXWD};V0H$@∃ |Rd6*Z*OMVTEBoxi6 ˘3~"gi:{ BCu X%f>Pˠ!S&:̲9:rhG)(u0`__%uԮ= <ȍmh*+l#4ԩK]["[RiF\JEa!p/6 d2*D,F4H{qamil=W )6o c$$,Ў$tV!Lh$'8-LD3 4Iq:#Zd$jO $Xr@&$HbjN&чMI& ҇͌cA+!fB!rnBh}r\IH yE #7MaBpeV me(YO݄d-]K: ay奲 Ul`h+"4xB"ib WZe Yw!yId βdHH,&QY C+Y:ͼ[l,@fi7!X&W$B)+@H2"e"g2ߟH )uD:ʎ^N uAb3#tsFHt"U]G=4t?x;W9j\Yd7e& \W8Q;6dnPXvT<TT0cG&Ph"N*ډt/?m͛@4 T"m)~PIں2C# T7ީ&߸Q QNսjwT{S xN49ȱ;+t׳[3M•e mcWNO`謹|1LQ&xek(Bg it8>E0u|FU.%>ia(T^J/SpeGV@oHz2jFa,Z dXCKpLi2p[7C/<.(.@)k@[gתVطq BX.ط nG*+a#+ \zCe0JuLUZBhb2jFa\Z 8xlC"nɵ@p뀻~08uAjaނaAϖCʨa\E[[X!cM.+bk Fb<}:/)SQ>PR+( 2f\(ER[؍džKʗQ$QȄ )~4 ^NQH-XY-ԇQø0 ZXcXkQ }NÎR E5$uEi(76nԼQAƟ@FժtR`\@v+2wyw/2 kV +K\C;@zjSRF B)Im` .%a'^b83 VG{S4q}p C*_>|\tηǖCAˌ!Leq ^.Eo"5Nek T0d ,H ?:"ȕxXu:>C  Ie\BWֲ6 TֆWyցAٯƭU^т8W =d÷!73L}2^."=k+ч1.an<2+8_[W$F2 Urz V> XT8EP%-r):[uERA8>5<0+B/RU#bw խ,pEP r0N=H50u,>hˢqVzp8;uʁ\ 4얪8%ZMdӨ+,Hr$;!e_4CFQtEG9{}P]4HlIA.lB,4p F:7pıߒZc$a\H@CI0֠bPă']ʞt//Vc&kdB6}vub5e'Y`ޥ'R2#Ub 𯻠Fw-ǥpLv" lqiP]@**DPJm J[;F<.s?EAʑBrXܟ +tPfC`1i:)$By H堤cF+ѪiCHa+a撅ex 1$Wm"^1'7 pQoWxHq;Y""@&PRG,ԣ~µ;#! $(#OBiAAVGrYce!y2UHR"q%ޫMF8tIop %!䋽W>CƙWUrxi8$nZ45jR\CtKuf]I;dc0Ri"ǐz aCB1 M+P!ѰIR0cX=c1$ÐI%\+bJ\$ikjy5L,iq?-Yiӆݬv^7"ʂu mEOC۶ٖk@ lD kS({x({8IC|Dv[6!PwHXEK:ON]?Ah(|1rN迁qIcC$Uӎ a>Ȑ3dCfH;4$ yQd&BLF\}Ж >2QiDՑJ' ǕeE#V?El_K`?)b tNJDN\udeN}3ZԂN}VshAF\V}=t"5Yq~s?z!Y'n' I-XYgC}>jpaoma= c_ wO[N9L'⧳pP$)-XhAG=saƵ6 =8ZO{f$I=W2=gT pMDg8(zt eM{,J Ahs!Q~ /#;qڳhӞkP4-Xy kIH#>E|k 849p`7'iφH4I a!1.lDי" &eXDV|4ʜAfc`et5M8Ѻ"]94뙯rGJS0|DI~ve5'S)M"tV[5 Rĩ)sraƥCF'l#3f Ep0ʜ,H[;C7$2g> BV%YFRK˄k4 ^23_Z39 tPT-XYgAp9BC˧r?(:Ivl5%s sj#8CE' doFu+K\A_%>z2g>+ Fa,Z d`0l&3D.(|&ma8#5-xaw5|z/K\Aj)14Kރ9YX0΢&?Ir>cCqvr6ʚg р$ @\G>co=hYsLa,Z X7L鹚ak99,Ú(#l̚Q6?Z-Yҟ#<ڒϱӟ3{YjyVc -mdke?GDJ?Gμ<ʖL:oj`ђQ"'?g6ԕϐ798}56In=)ۜK&d ^ OpF:@V ?cQmr[7gO4,i2,bˀm#) QI|whB.g߳ɨĚ'KhN @uUs4ؑ7,lhfs 4uac@cWwYĸ,hm%cBD},G}̈c XD}̀D},HM|bFH@ԕmEZg p*ՌTy rF3 QyE8WzB"t%4m%@`]*@BлT9eB'ZZyUn8nST~E4єir F9k&^>嬙 W>bM{C}A4[?i I9yIb Iq>gu֑:RN˻W vs;h 2Z 2j#zv@ӎAzԘ6#K1#$֣ۆrI?+[B 7fAp;?7 /%DcO#{vdC-yP dh#&=OTDNT;{;Uww5o'0ON՝jrw*w4=މ&xN5z:8(xgJl!-q!?ɁMƊǁ^$Z_N d^@^3UdAhe+r8^Hk׽:<jm?kV{]sE$2!]@,7)+s4?4(ٛтӕ!I@eӱ>yŠ.G 84q [iE;' h8ʜ-"][et5!C΅Qt84wZ4 ^PY XEUTkAǰI0(~֦t5 BXч9sZ0 ZXyYL"Ix?jA[?"z$qMh7 D)-^ч9oZv0.u7-Œٵ|%S6p(s4 WxuY ,}p E$:wsq .s-!y$RGܼ $m,. J+sXÝy4et5ba92M3Qh4dwijZܐ8' 8T'N+"@YQ\9ơ_ǠyQ |K qHtG`%uڀ!o <[9 Vk[r/p6\xo]/-ƙV_8diw?ǚ'CT$g*̇qou8Go]L!-˯>E&{ 4[Z)g(ؗ H&X s|<9_]sq@;yG)`ƢBͮϦ\fxAҾBq~\j&;Zec-BGGR>] .¸qh4)&bBi{K 2xbw lp´"0*aS̱UTi#=9NRPqQ%Hc2(^J+$)c!eNަ?`Γj˓7H?-r4IU=^ȔrpIV4pIƙҘg<%&>&(h?qtbCŸTiy0ڎ<LU-NB DfofwW~gM*q,VE${͌0ߌa6vNqg'XfK4ϗEL|Ɇ|,'}G!V& i҂>Tn8OivNƫpZZIQ^f㦊+=;%Ӥ&Zb ""t%$$KvxWs7KpI 'dӑ5s:}:NTz[D:K݂D—H6Ti9q7dmx#t$,KÒ,)f⨕V`&"EYm_Vk W \M;%I mi`Fz=pZf@\ cxbڮl$.-|B ^ɂ]d/77`/W!:#y'ƭ^~jqaז D k3q Ј  ^[x8 ɫ*A-R?OmA%K,/8Kċߐ9 ix څCT}s:!}^1^SI??޼_s{ e>woݜ?ܾ=O/w(zl/70X|~І*û ˻}:Tˇyw}/7}7H!??< 2L0-a3Ɵ{EA8_n]_Ǎϥ?^ݳrшBGe:?\𥈲jP?Gߧm&Z < oj:B1gF@K˯FZ7$um!%~miZӸ=5}k8g<J@L$+:^CfG$("o mM;X^T :n&}X U+kX!:<^Rgu> bmlwc0KZJMk "(ɰ~A4:?kI uMϋKmق{e۾2ܟޖ35.gdn AWO/ZKmw$TH DvrZhp+B惶tgtR|;J`Yݳ1o\jB+_,2~䏁9v ]tv~=ä4蔖C8ɇG磚ۻ Ogmυˣꘓ{#H9z_>K.pYS|4E_໻*px8׼<~-ɗ^LJ^n7YCg*hOߋE"f+_:@jG PD17 \Zс"ږ ~bj }27zSqc_kFdӔT6t7<% .[;AMz9O͓Ftu2=:9IǺh.A51)s2jdA_AV1!h(wxt~ww,?U|4d2:&*O}s4L0Wnts'QjZ F]!cqWWI%%?B|zC7LM|&m#>޿'V.i;;v|>_Br؅KAç[=5.<ه |:>gOjNc~mmC[4L J5ۇn_< фkZ{`[Ð^"#{C"(O'/aM>gq@g%|xt0Aj (jH1nS:DuG1ڰ̱ja{>=?<=~Hf$c=&y`?V|Յ?vA_1Mw^5'aIpÓ~giɷDm9B測C$7"YmVL{zCm^ 8~$Y ﰶx|Xy ~"MV^/V'D)-g:z^ҷ^iZNAM KYFCAlƖaoaA%D+GI~&pg8oX}8?Dax zO(DM6ٚ.rDmcZ: /~ť 22InX{$>nTڀۙP+ V4'P}ب~yH-˞/a^{i$qu4i]yA&% D{>u;_n0X̴x_LSu1̓? h?׽%{Δ?k S.V#CBv+r$э[-hBtGY~e[̛rQs8[R !jdI9{Wܰc7JpΟUpnM#i 3qLęI- XIZXOj}}lM’C˧sg,Ɩ)FYX6t7x^ #nH! b'\h2llH뭵賾&?nl}ٞQ%Y l02Jn bitsm6?H#fv#Իwrz1?o4'<=Zi ;Y<OVHQ}ӋM+r~}zy ,C\3 %I_v͝X>A=H[z9e]B 3|Bcޝy=q=6vt%i1B2l>~z\tZx*5q:x`mgoIi-ָ gOͷ~leZӽQ*[ȿc\1е2N><E'GE[o{׻ۛ7!9$3ɺ_[y=~8~2m:Ybi:Z'!Hg|{^hut7w/S\_n Z_N=Z~0/\sZbܐ7KQendstream endobj 136 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 395 >> stream x-=Hq?-{#Zjވh) ,ͮ^oK+͟/y4(^E/t4-6~'Wy=3<%2B)5t 4PÅF}:WCFG.B+=i$yگMe" 2g'L~+5$NRyU'32 F"c/E]5`czjnrg)=/KyŨ6&3/|+~?@)Fvp덳Ҳ8nD-j BJ7$ 8̿-rHXWĞ~AkI7ieg Ã/O<{8h"i4I|qm[tb1YIc%!Ͽkendstream endobj 137 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 188 >> stream xNCMR7,  <2p͋JiuP~>}L讧Ǻɋ !74/XWϡ=:4MFkgo0 7 LHsendstream endobj 138 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 167 >> stream xcCMMI7M  'oPZǁ8)( '@#$$YYڴťfAs(_EePOkY 7 <endstream endobj 139 0 obj << /Filter /FlateDecode /Length 24393 >> stream x_/%~?Eand_`0`~XJQ5H]z3,VhF $#}9^aOo?~~^zs>Fy)g{e㵜/?o/?-훟9~ x=ڜuo~v}>o?z6_~|[9ev+gg=JsX?̾~j__˨o1sپ/_//:x9ejlj\?^i՝u_N1R;~~=쭜y'{k~ujλ1_fG״[ݹ[+w烑oN=f~.Pus^y ?kvW:w?o6rl㨟?GZϿ}nw=?o¿WH?D_T}4,UqGW?3(Xo^GGUn͟oG=ooMSޛ?b~luۯѥ?DQ_|VKk>/l_2_G]39Ͽ1/ӧ:g;_gOeu1^?q54o!K.KQ(:5Rs=KQcʕ뢭?Bk-.亃mXפէ ~9TLywu[7Ma XwBJf+Uƹ^ThkY溞ף娣^%]}.3_|d/.Gg]zlqvyG(5k/e:xm}ɭF˪^u73-mx j֣r[z,<uV"@2Ǻk=s&k:XDhjHN 릷{kP/T 0i/JYq{uƽڼl߯UрUy+ @A]c#Q]C7).6m^u\6!ZonW,KvV^_wVig]cG16lpg_ϟ46ߔk۲^Q֗d=^(v?$[V4[9oZ64kj(voi_mPEPe9m=m\nIsVZx5u}c1l&vMgƷP {~mwkWYGMa5_ֻZkk^l׬;hմ˫:9Y:˞Mym}:5ӟv ^uzںx7 &mnkhP4,mZ \4>ޥlf7aVktMUZ^k,k.ޛf}7;տoź&z7vka\$uN6wfվ}Y\fػ?(3mUࠝ'>l#liU^Q``s=D#9+6C^E|kжpPwrGը9_֡6s]k_Cˊ~˞TWTz%z(ٷuAja9Lk[έ~֦utnuc9 <2xnZC>t^ ,O޽^vxk[)?0 [+޵~]3psכ0%ׂg5MkڵˤC(,iSk=uo"?*4e:4 Y2[t}0Oh0K\Y36\]Wl d߷ofoaq:;޻>,+yӜ(_vyAѱ.Lu47޻茻5oYo4~`暆S-$PV7\Ɓ{4Cl+Lߗ9}a[l71^x\ssʅ|,Ž}4vuh&쬋4óWz#[ 5Bt*57>K>-ͤc4s;0߱]55;6FWii:vny.yKqPijix4'>!X3(GbM\n4> 4>!/O?],G.vwWJMOu}kZ;×G:KOzR6;ĆϨ7͚?}O`8h|W [8vJ~o$ A ![j*^s}Ju>y!Lڽx.hjHZčqKm@JƶZsUoI.yґ^|cIGʫ]{^b]+RcֳigQdKD/i8|lll#𥉉0A֧4t *}Ph}h-" qiN:߶wx,ToAy{+q5}dA2ڰAHj*^s}TpcG{]Kyj~(7d!d4a5 60u%Gcbt[m>tڢy¥o[ϊ*VµۋsdXB +}_QB7UPtwۣ26-Sc68G}(^O fx-NDrCsi\:<>[y,j͉"jSL?pVb嬼`l:::556m Nc[#? D:++r%)GZ~[Skx 1?4**PB `6aEY+AsQ־誼Y |&5ɍ}pп6[6WŘtjDږ rW x2<SŘ :v-c"7t:MN|xl;IxlߋMz5Ttȳ3܄7f8*bN}r= .!.IN歛zM6f<~ޡOh]1A%NG%冯R`{MOl/xK^yZN;7gAxĢ0AWwnByi̊SYt#lPw#AY"Z`ĻT;CF-J.,HFVC%oZXf- VCP Rf}݀qѣzʸɽ dkw]@{ mX iN 㝳 ~5 P/e9.˻i7 ^*y9,%F* )}Fxף*^‡qγ2 C~7oN5 aK4pJ[" PD VYy@#FBvA%EYx6l)9/ ‘J\?Z64oEZ7Qm@JvaQaGiҴkng^:h\=G +ծ*{`&BF^C8 66%߰a>6kt*\5,V˚'|I6؈рW JD촱E+_Tj|Ky5OU)gD-jU;~Su^TYV=a㺐qi.>Usn;!vUfw<wd"-|_ c~,άv)[G-z/a^̺Y<ag.`{t՟AmB'>ף4=a̓B`4q`57lM8pik:]95k jUSK.+^h  .]E l5X5T^Cx 2i(tBgEQqP4w9Vȝ8z21f58q'q \ )&.R"+*YC*S.x}x+$bٽP%\N[WC@t">/އއΐ\RSYcN5'lhaO|c}v+47,[9#9/ֺxM3@/r6T肆*w&9cAq%dRt,Okii1a ,TFEF h4X +"ainO 0ǛA1[aP)dkesƫ`YY n- J`th9ϴ'@j NѢa; ­7g[gP=+"_ѮJ^"gM.gCMN'Wލ]4DDzWkH^ ;p^/pܚ;QoV Yye%a`;XXo)!/$JT~ebn5w,͈Z+>8^UŎ b7 a3| lp/M[JyK3lѥLPߡaɼϥ ~a tf3dai.f>C>d@,T K1%l'>, ~a4h)P-| uY vlG aMhF, qB (3hiUS3pDK7'Ǩt&rsxV%ݣy'B æ@FM\̃aMW昺 hjHc,O6 [ %a>y6lܿoi =&EkՒ{c#KFVAih!\Pe9 w zZaX NuIhΛ{G~ K% Md.( A``eil͸*7W@)f(a0 5 5X{_6FND>Gv #85p^gCݼWAo: ŰDsgwZY`iƕyF:Ջ(^806mRRϵRh}upU,}y3Ė%'0|!Dgm[՟#ZRcUPfseݎpWAɀD`婘~ Pq QB]!"}y5oy馼OǴDevr04IhB,mm@q@{) q`l'W՗yKS*ђ ~WKFVA{s O `TB] 0IAD7sw{Cܚ>_+,85X䱺9ҶKVMWuL5]pȶ飑ς!Gr\w(6%a`$Dy):WO [uA%0ǖEq4e@T$qq尸Hj  pq =uȚc\0]:VVGي/y0<}wmv{vB}Yiv )fXG8`UӁ:50 x2IpS2hAۦ--Fڧw0̋XX1 8&Ҫ~2и3q;N1 Nk>_G [KAo.EN9l7햆NXVcҚۥ\-V9tjYk~%.q!^5'yT}1, ;J2roи腻*!GݸwCYX]0r0;־58dT|)Ż} |O=Iyqbϓ)H#r{רh2oaw%з(<Hߤ-_]7b㎷ *wu6}[Hf2|[\6JGn% }Π*MlE0 /0.yW hJC2yt[I ouKqNO^+ 1^GW^~^ZYxew^9i}؎IJWҎ,/i&4ħYe.NS@f'x|GKw;>j_Yq Z?i5)Z~U_Jq!}hyj}Ug+P blv["v~v}D6\Ru9D=qL]X/tmlŸvfjŕKc8 FQ9vvfiNtnNyx˷>R>a~4 AT oA&Ly#,d !Viنpl*^sat;\(l]ك,$,#N D''ih9 ;)AՈ{:liYdŵ4?R$+" !$+Fb9KZ(Tm@N,Ɋgd 1JXrg h"kH1,X`x& YqFvzւ,Mo ɂ=VP KHLY;ԜHO HcJz\^UT0%xYpQKNbiD, )*|"Ȃsvlrrg 2,<\DSӁE6#$YiA2Hb_f*,n6wuz*^O&w;6T%CB,`*0TyIR%Կ 4>MN&4Ђ.%ȃ%'AqpZ6'*; ' IP%KYxc'(Ɣ|mūȢ";g)+%'EqeZ6ر%-NtM =Wm#(fNH 8K~8-PfIPȡ$(,<DZ;416bOt[Ojs,Jrg l# =v( EڠYB8<~6bl vGN]0rEE @FrߝN(34!E9 %EQŷJEQ|(((C"E1, Ŗ Q28%IQ\ͣPըɗ L \tUƱ&Q2OMW;JIU욋(dUkzI+ bLŮ 48jz]CiJ_-b&5]C&g]3FT\l=Q+X57x +y]HKiA bTXX5]A^;`Wbb^<Ů=y]#Ĉu-r⋧5(bW4ŮxԤ)vIR_yB4Ů$%nA)\BREP5@&MkBbp4Ů/ik iy]SIw|sx]3T5&Ok2MbuOcP!PS1_xU<ŮsoŤLDŮ%V4]q]%@ITBZ⁅ldjQ1 QkPHMkHw Ї@3莵TOIS4fP]LS~8M;IWh-w)+HD7JJbRsmx)7 E (baXsgVG5.P?)EٟEkCdnB&ty!nF%H$ @m@(}z) q씾A}NqȥpKF]%$$#|k{z@9|: 1ll;|P 2_r2P0HN:,0  $/KW69|(!lt~qmt~]{qX%ծriYnKљmP vR|}TYQ׷ƞ4I7* I2_X˴RƯj>s ڹ|q>_ĢG\uG%ԛB>^+M7!,e6 'oP/e9˷;Z6._5:ȁgWrrf 0h#|6 'o~s;o_7 uI&%xv+&,|ʴ2}5-˚m P Rع|4o$du00|~Irrf Ԥl#|* `L\eWg A؉|:CnfxM('oIoX e2 `zWL ~ A0sfdz?KFI} Tjrf uQ{76^D }N&Iߛ%@BFIqu@hrF%-|N߫Mz~Ů$Nћ(.- {՟#)|1}4$yZ04u%'oAoZ6Wմ>l$EUbulOHx RF+9{yBh"{fа4ڀQB  w)H|+ H| %B$NG1AZ_8q);N!D{+5!H|gib5H|zW8RGjg:_gi1Y|4,8OƷr9Ƿ|-j "|&&"ߥrG/PL +|&.__a7ߝ0̫{L _܈P%CEr0D.pD %,c,tqL:Dϝ8#o3NNAކs6EI#ty4i|ɦN6ǃ'rjY\qL._D\$D>(jxM ._5V+T:q-s 'u"Ɖqk rkL\"K0|\yp; \\)|wSv2ͿC2_߂( "' D vO.`\J.=W }|옑 u sWd2ߥМ2_W2C2_אXKK.7dV =kpO2_` -|]q\( WB2__K7$|]C\"u .|]3YcpAHvd7dKsq"k:}p*2_7l!q0|M߹+n2%z*&>{ + u yޗћə'|O| .ߥ8E ._pu x"+xAA2(A{Cf+9spӂd`pΝ1Wr2f Rs7\ =)m%'gn#,H<4sRiQoZxc#?N\?}x *VLm-nZ&8WAajFA9sD >;Nr Ze<63D|%@$3jS b 'qnNc ;m.(6\z/.a@9Is(qÀDo )s}Am+YBN,;Wnzx7 co+6K0QR55ϦeF`%-|Ε$~h틨o瑂Vrrf h!rĎAG+7Ka9+wXHjNĞښН\Y0iA2HtGP Rعr(\تZiZ"c+9rhBȊJ 2JD/i8v\?ƕ R"p@r{o/a%?U`E2FL>=+1r%V'gOi:Ĥ?z*$}x $7J7 HP >=~c#]ꢞ v\wP#׺ct)YTs.'9 n\}drf 7`.r\K™q-(t#ǵ *s<8r9-8 ǵhUlVTZʒsA{ 2qoY;-TB] rȽ r\f$[T7ނЭZLj\u0HafSoEKj\,q}O@LRVK̹FR㦻XԸee'$u @ APFj\߂&˯XC&VC18I C9("ƭ/ɋ멸%xq=x`Z균ջh&Y-hq}JAoA~g>D܍g.q;)p ry R\ߒ x=7P4IBz[ 97GM uoΉjh44|σ$`+&ŠsQ y R)m\#.woA?T68'j@;!oʃ Ԯ)2QƗqV_105Zwl<(d7bv4pb8'o&0 x@#,p}ľMT+2\אppSẆ-  ׽xA ZK:\. kHQ >\5·7|+>\ ?*p]#].{:U$;q=^Ԧ 1⺆`GE[0jay+F#ovq'Ȉ`E>0oUU>q][``vHAꨜ{ȇfLp]Y0MB\(;!.wB\pX"%kxט`cfp=\d͔c"|Cd,d1dE^2xYbu )`#up]C~Wfp]C:W"  :U&:\d8tHqfljUhE7Ňt< (ufp3t>ǝL=p3Zt9I^ ^ɏ;NfNp]e5p#Hl-6\dmcL`ut[ZV&f8Ka9x>ьNGظv4cq VqX&64cgЌ q`'e1gpx #Q` h~V lhaيр]c#x;flD%I($aeX% x <41wuN[ l;'~݉e{Ǚ8Ô7 ( ml@Ș 8J95%L@!e!d!yҵ!)ۀ!G >hl/=wDn s!G >BK 6 'qPe96j j<a qL-7PUZhgSHPUSgaD G Ja15YL ) Ԏ;A'! qP/e95XSAl `9Ly5L @+Bs.-m@ޠwQշ?Ѝ"w U/lY1 X8\0ɤa`͌BPe9ʱ1x Cp'J ḇ~'qT|1,5HIPntA%EYxr<&ki"|a 8J)0,|6K--4O6 o(QB8sl0Ǧ>vc_SaL9-a`969Z)̱i4D%yOR%ĉ[;4sl9FaMS0Ǧ90ǦA`M0Ǿ|h:v"бiб?Ms>MGOбipe a!+XKc\c8Ǧ:x@ǾD |֥SK2cOE/αk|w ";α)LQ96 tlt8Sls<+ s"4}Kc` QS&"49v E]iL:v4:5:5zIxbpC-mۄg) бt؀/Û_6JPO{S(ʷ J |RC_-,,ͳ"B[ l_yKq%4 l בAJ4Ɨ(^wsk Ęb$\jEFC8_@J9a( A<`ͧs'y(0BŘ򆓬Al'0m`B%KZ0+6Dj%D1 ,9J(,HFZA8(,*ۀ%G ђ` -yA*pyHƔ7(MFXܢ7,7ڀ%G vRx%;2D %N*<Ɣ7(A bLGjfv, GC P/e9Jrs7 RUOLom ?701Btشwm!nB%KYxげlGv>t߁`LyCI@ !N18-#m@Pz) q!, A drP/e9d!'¬x%)oQȲA*tBʂC~d.n=K]玗#+8)oxQxaba[(?#e7(.sdw2;&3A&G "hcL6=al%KYxcGM#yo~9|pl"I%'\?b'iL)Ov 1oz 0l**MƄO5O(z"!7NO dӀWBɮiϨMC m'PO6 kxDWɖ'pgcJi @yWLu%@y@4]1&rjr=Oβ{xP/6?xZ~W Rӈ/c`Thy Kf+ekJfkQ^܊\j.OqK]LzI-i &Tѧ`+uDRq`pX62&,XN'7-|ǞO ^i-RDr}%g>q@p&2}؂8-46 G>qPe9=w8z[=D}%d>ql14a9= P|USg|5Nfz@2y3 zh atY-@d, "Q$zxׅVD_əL%pB&njP@D șL%uO&nvF4`hQuF2q30螹38K [8-HFO /ig"',<DZ7@o t,Nܜ2T_əN%,${M lr&g cSA{*q3ྖ~L%YgiA2T/ \=3XrG%-|ǞJ \o"Wr&g h#Q?y>ڀYB8l4~}&nSo+HQS@&HI Ff{,/,m@l,^s_EpmĖ64Ći\5ͳ}lfs؍,[d#rM &nR|1سۡ52!9.4$nHM?x=/f_:*oC(V&q3Z *<`Dit(#sG )#nNa7CB"t#7cHe"Lf迕$+9I xK$vF&&H܌ aWO[3iDbWA cFeOGz/EC<⥡oUyĮ|DʺDLG :܋> stream xˮ,ud_dy (POTCNU}tnqHA<|J??q^y~\_?o?z?N?iq?N0z}/+u+R=/jLTp}+S|'+ߪz>\n_*2QNjLUu>Ͽ??2l~܇?~|t˰öO?p:_\x˟}t<<^/m.d<pn~r>~6DH۷į4x/IbvL N۰o_|`a=uXnCO8}vOq.:eJ >>}VO{=]?Ǡ8{p=b3ѦŃ|_Y1[ðs,u>qpӟ΃h=p OgO1|4c8*^Ñ k|z;)`P$FP$,@T$ha QXVt/;Etx։0=T7'cdV+P$Hd&]oX>oC'#V( Lኗ *\aE(Dhw B@n MO: e\ JZs"qӉCCx %0UשOU,j DTQ՟{N0U;] Uy*!/}~Óoo(oMxΗ Tֈ޻111=҈D2H"@r99=0q/+vik++N'\Q$\Id\& ~9_OG&Pֈ \@a%(Q$AT&(8!C:urs"kik!!(Q$Id&s= |_Y^ϊ^_;{AUJGi,]r =~H\jGaE*Z;>TvD,;7>,'/2yf~bmpvD:,j?H=xٱΈ=DP#HdQ$i&4X"E"E"DE:,HGHDzwflH *H"aOi컫O-?=5ﷰm5 Eb.>b@^I;hP$Q, E2NX^1 s1Oϫˊy*̣Hw80v:ܞ_O"Dw¾;…w\=EZB\ݡ;bXEr;&;HP$CHhjd(!U@; [q=+7X<ԈE(`D@$Uk<999 sX]a"a Tylq6*n@w|9ܣ߈40."-p6hQ$@ƹvn"aDQPԃhCVn[9PAN"5~oQ!Q$KQ$q:1L"3 u,D@煈/u  *a haNئS wG]0c]|Ga5uJ_ YfQc Z1΅4I9^VՊzlE t5Y&٦m5yvLjc;>b6W?uQ?OG K:*::$Q$a9 :nBz^@T0#L~1|G)tC)C\!>pqxnYC 9B"$s@0*~"YqtG?e(,6G@vw?O4 zz:!]l!HHHň??Kmk6fo *DU!z]zn[Sm/# w X'|7EgFl=hB$H(Curw _pg i}&=}"ֱi w0ǹ<9ԩ|[؂  E +P$p:! F*c#"!ս)Q!PHSHaB E I.n Yh BTB B,HHtDD AsB,]v//+jHؑ"E".Q$Wޗh+.,jpA 5\x Y}j V+BXaQE Z^oK~J&y=7/ƍ"E"  ( 8H  Z",h}"VeHnf0Nbu?AhQ&G RHMөItąQFZEjeURafA^,V/B""^DzS/hp#KպBԘ>7f^/.Qu)~Yp[W?8º n&|YlB?ǏN2pMҾƧyhÿ0OimEifCSN ; G|$Kmh/Hp>|zEirb-+o_$k<}-Z}Ƃx,?_ÙO3pYC|˗R( o^./oxJ7vz>+r]~~gQW01z>z^Ϗϛ]nmZ8K>s |#T?\V6Mq:\{b5543tYȴe((dw6 ]UwĂ8=ϴgt91ϙcc:/K݈#l^L3O!x9Dr&1L$چ5_n7M3y,j,jtBEʼ;X@sݵuf.e{V8̀qkZQ$@Ө53xG.-HRFэK2TOPg㵚4O{f)̸sƝLx\ >q{VNj5:~>NF]Blt6d<|~e)i_Y \52XHwӴ8ˬ,JHƁ"!+(큪#H&^mu@@wvD9Bf{HS(D̎:xf{@Vd֎/!qb(W%+88)+bt##֦8N^AdN9qP2"quE(.B8je_ ܱ>Ƒ8ąRh"Rp}r8.BE듥ĕabl @4I"AcӘ9&rB0Bs>]}G\cǒj?wDyIXgcI zco}>Dj]7||,2L:DP$ȫo6߈6x;Jg{H&"d"ԑ67h:[d(;}g8?h Fv$g'm:-l! x tG|I gsO(NlF(h[o/+@Va@"nF綐x']dfYL$.%<.G'l!P7+?ICO(]"d:g+5@D6 n{CXFg(Zdqw5P!v (;jeq$FAqj q݁l(đt6!HJP#C !> CWVP$C@ !GC$ !H"y@hUo v3(qcw7/n; ;2:-֬wK_|\ ."Of=04|Y-."] n[[B N@~Rgp8@W>@{F?S=6},ў!8x m t26Z} V>W+B>Jr<c־*O s ГHhm)X\$6Y _F8J`M =$BW#Y|I,'8&ĭcjm98(!^f WeeiaC7Go(A1v8"C^/V^Ѽ"_Ɓ"$^=Ļi[}CC8riiO ; 4RϨBC6AJ6isf9^Pgh$fa48L,Jw:;;N^b9Z=*,)hϐHHdSiFpN xszwĂ8XѰӶ pxC8]֌axk v&;Chs}wo 8ψ{k>p@K酆E7^ፗdx#vs4ek:"L'c18mx╖dDPKߚs~ԔgQ$tӀB7F4ǔyhQ$iIFEXH5b2>$J5Lkk5ּK8UPa _a,1apn1_Wp\mc,܎:}P\GLcFNXEX,yV Y`a!+c4XhjMUkP$@Wj"?>OfNl+C`#h2P$PG? ` qws7g,?X0I@L 1Oaf9L|ff̘`Mb:MEile!6 Gr㡫;b F: mوk6Ŋ ,Эc;yƁ0L\o>N!t8ߟ?? B1sqgnr>M?$,y+[W$yN?^Ö=/_^X:~gJtN~܇|6<_~8N·|n]~? `+u|gʊ<&t$~_}r:y6Б_OyÔC=ƘiR tsrtFNr~ޏwCңm3,pm+ouŶW圵պgbիkSWm)fVmjRuv\wr~[/t+ƉnM*B[) eEEW_- ZE]}Qy whHc(8LP1 1@:b)(噶fΝgS0    ,\s|xB""A _443Uk<C^g/ X+0]"""81Ŝ&vy#8af2&&E*Mp$qDw8ƧI8b"0>DH[oAT8܅####.sV]'0:P 1ĢP_) ( <Rt |I}oxe 5@vxF2j,jƢZns`gP)rРRA.M-^Vb$PIdPQ$6m6qk_T,ZcPi& GpDpDpDpE m ]Sh=H}&E"L ^IHѐ&0NK|KE@ N#@DDDE`~,#?ݑ]'$:#y3qF>G tlqvZ;C|4^f3P 2e2e0l )@lE &pD|86&(6'mgg@$JDEBj2(ec4:rX`0(G(G(%qPNqsE8` s;3TF?W$2(T l`ǧ`#AT,t////η4`v4͵3i:C.Ӏ4!iVRVjlJ0TjS{2-?@ĒFax:~MvFXBk H^l$XFw}pJYԨ>rM Վ$9k~pA4o,s|I7>݆;l);' P觤< ݺyj3"1"1x%1N"3"1-x_2#?VE~~m>M,,aDOsGGF8^1NofE:z3TG8^IȌHDZfV:~HFHXciD5]$H7bl}92'k 83(((j$Qn:3qx88+qqqXF-~GGuX8]Sǩ{>N33fQ$jE?^VY{g3(TGGǚ8^IȌH!>nW8}VVO _s/,_6{f)A`6vgEeZY 6Mme8]d̄/(S&|J _5|Y#2_o(|qo/N-|YeQ×kj(,jw06|#Gq1p6.龿:!~ߞ;t6(3ĔQfId)rDfu|Q7̻ie D4NuxC:^VvhK2ޚ~Zk_ -c"aH"cH]$ Q$P$/Æmust-k3yTaC`4lx%F""!OK[`:?Hq[E‘DƑb#^I8H8H8HAf±1c3T #^V8ՊM$DؤV3)K)K"1aԀaQE ѿ\׼\}C2B.ܟ7R\R/T VrqpjvXI]Q6:nmx׈k Ss ܶB=PEjs[`=^] eU7nݸsVgQm+s fK粽iQ-FU YnҔ Q煨)_ժjqs֭"u;- "CSQGΫiFWq& P6P$@mBDFEB=>JNlF((TP *k8˨SFΫeQ$@3"1"1"1"1L3i\1j 4UkQ$q:1"1"1L5aObK'f-0:+t1LbfEb3(((6(Mw>莏tbM7FD7Dw9F=>qOuV Yr-]GFlFhR="42a*\!T Sϸ UH҈G8HHs F҈EМÿb=#ǢnΕ>jj@v}%5&;Hܱ9K^wcS?5;\SC#0ؙmnHv{jO;WzUSslTM ֎"GZd4ME2P$m6i\" ME2: @W# cu(&@W6GO{*ܧ`}^ `2hom( H&"@6n9T!>JEr,P&"7` a_iZkHdG%J24BL ^M H&@K H&"d(q{x=b6t0>Κ `2$F74&!N=r(LE2&^I&"qo&K P6P$@L ;B9v,D&@"=GPiU! WE1D1]HSM8+4XN# 4B77774)+bbblө}EUvG,4E.@Q$@Id@Ӏ5iÈHHHHGiZm6Qc*74LC!W&E v5)!|5YFw8f4ŸEbNQ̢F1q0ƥbͫ8+!(F(F(Ei&W!~LT xYM{kQ$i:am9dXȧM0yZ@W6ĕ @Ud( @,Wd8l +˚|*аbE~\ `hl(((n3|* nT]!i %I#Œ3aRXW!`i- +hiB&6yxw鮘AE00Ktif4 *bӈ7C4CV"W+jzHErm~2e,jQFy_ 6GŢVgpI K,j55bXԈDLfb 5.P.04Z/Djyq:u9ݥEsf!υQϫU :-@"#)A;b2HOъ4\E(8@ 7wħd9 @msӣH}NYPǷQFEʪQQFMkӔjaZ[uԨܨܨXEjTZ?2x5msC3NcWN1s)e.(?Nk_1~^_Uc$K^Ew[>LTc8;ͪDuǨ/U{e0oU{Ek_{]ߵȵMv6~ny>ρhypo?hxp:΅NÖ¢_=dvt޳EqX!W#t'U;LM=^wyKGM[#iQm`Դy`b'o(:T{EmZ6@v9mֽ kp۸iD;@wx)@4m-](`Dр4{>=/+[kD-4EDy=k 7O4E n;blS# ܋gZQ(E \(A@fP [`H`ĻlJhI$|{~_ZHqIUwĂtFW(W0w.PʗPb7) ՐHu5?";ՊfEZk0<d!aD޽i3-xne?rtC`D9ANOa'(@?{G;(1TOO=ݶ > Xlw;b\#z,^QB!((E,L:%%mDX$cIK:)dO`ur4b:@XfET 7KOV0M_}9]Y!nE]_*RAmw-; l4~|q2[r_=G2ba5SM"J.W%nF>,$ L6ty)bT`$m acĀn"I,PB"hH[˼FVfA]0 Q"YBme hDYR.">$BEE›j2(o,PxxS;y><ǹX7(KtAxw 1»;$t"aD ;RDHDt"E"Eh:wirZ@w; %Ц.薾_N{X'pgݹ },Dhu(8hGhGQJڠ===C֚v 96x-ߩKyl# 4UkJb[|Ib:CÈ6x[Hюi!Tjtww|}`4Hn; i17A# yls5`Q3|d4¦AiěcG@IUe'--ыg);QH{ukac_f!Gy,R{dKw^g,ݎ"9JZ+GV;h t/;$_V؄\^pn9Jrl/iSk.פZ^CkAx? ʯţK轕ty (o^v'Vkoe'(HFRN.;I-oIO' 4,ӈWdӠjFe,;@jG,0w-p.kС(xYQ"Q"Q"ZHlUlUlXN@59o5]qq=XUaxNmI#I#I#5"Fd'0` ^ՋPO9ܻ/:n"f7$ۚ7U&I#ԩ8 M1 [%%%a3bxb*"){K3a*TئeƯt8C1<δD 9(fi82D2N'IdiHnܞ#dX!e鎔tG,b# -H{./\eӈkħo_@_>Gcf(\w35C=@#..X %V.]xGą]hGl(,jBs6g Q*נZ]#? =Nu (kD7 /Q$RE4(qnAL"Cݙ|I&:CDwG,ODst;ݫbF4b|F>u/a\JB@qXT99U, p,D&"q""ѝwѝ0TB=BFQ~ؾ_%<y1ٽI,ULHLbbDfPKָ n:GݞZBUEkEkFkg q ǛoPl܀#C;;GȰwW=}Þ!5X" B ns!n[!n[ xo۸o(Jy!"Qm1[ȈHTQM)c)CTDQ.OQHQE3#n#%z a"anF莘f.ɌPf;fs xE b$-xX܆h{Y(E,9 R,j`p?QOa\Hc!?"B $r7aV۪K|@5Q$rgHL5J_ereղ ͹yc(z`w fB-x^c 濼s0z;bKl<~SlY?w48;|^~1Ν9y{vt6юBnW8….c1%pކ#x>A_4ܮd挱{s<;zY/Yx@7:0C7:^V]ߢiĄ87z#nt*ݽ"6E/Qގ]1xB#lB >,NFsB.{pĤtAMhs JC4's"qhH4E\{µ9sqx2\_iNXht(дHHHL!ex;Dh@h}$_hp!B 1:(:i90:a\ƻ/3p#XQhE_^P8}\҈Ԑ+7h.1q!^0q/xGLlXƭp@M7/pWvU"(Ϯ@"A2h#$ X e>]vx}fFkif?#OَE 4((jǡaLJgx #XlqJFEB4_4( ޞ㪌h5CRyͷG9^ ^5xPʂ7>>߄)nJا>Gp u iE8.BDxi7TwPNj5ViԴ>C"A/IŚpAxk/4Rb> Ÿ|^E=B xE~7s;MI4dE77s PӬ nԶbOprs;qz3wS5n8J&C}28 Z9-ݼEK^/+ODH|6Z; UkećlϠjm(k9-V]Wi~4ٲRli" ,A"^IܣHܣHHSFhp:m3qstq>^M ^6T@giG72~ [z0?a>0ār8Ў@:li ay"@"Vo]$ôQe):/=x̴HA+P${1M>MB6g+F~OhE@o}++K)=⧆xc#hs5h{AE2\|#W4wL$ÎB˳P67P$-I3]Qh{ *&n&#cG9(qUvڞAB/Pa|#_L$HhGJ; (h+7P$@|E#Tm@Erl YE?HxhSm"h߈KoP"N3Ut7d*r*o`! 7P$߈&Beߠu ЈFw!^1sHf&UYP<"GYP6 sV+X!E\͂g5myr|H>lk^#ޑa?T$ F&1ƞ4> ,ҘG< ⒚k-p:R@\L*qNprjPOc@ھm'64!n \|FGkɑI[K-J[м2H#O tiD>iD~jF3bÞO{7F>7}}8CbA"'+lZiůp7̈́\<` nԈn {i㳰e 2 <˚KPPDiKSڬeyz|/|E*X5 C{@Ih(t"@a>^8ӆ !_ =3F^ K[h {jCko$ tE(O@<E80Ҟ#uH{BCiO4 yU ( tZ@|yB> "bu /%2^ ^ ^^,^Q$^HJQ:q hkV#wy1iTf!"Dq}E1=5qxo98Tyu%Zsw,Jb)seWmGbXc?n nAp /]Fo]!>[DXK1&6x4xYA"qGX4 B%mmwTzqK\P$CEx7 XNx9FqҤJ,)QLHLAfea"Cә x (X貫710$m1`8R7,mB$N`8dӘ옣1CAfEL3,j*Vq(WޘɻB'&0 V+LP4 /\htkH݌"50ԳY=",Mƀ?e#YZl^HY0I FVgay.Wen2,sܟ~ڽo ?=O??*s{xf;p꥔N|vGד˪Nxd exJ'#<ǵ8={^ ^E|X48L]Α\=/shw78vtnnp/yۚ8$r'Zw2%_~7trƽP[cjkU[tWBָ$5mz? Ewc$O}պavEvG:9+ϸ2 +Q$n*)qIB8KDRN!# ai")Ɓ/+Id%¸ZIڗ0/Zgm"3ݘb*VQ$VQ$7~ЎEv()JQ(L9dj8U*KGX:yTOz F6 0PQFM#5]4Zg(-o;2e޸y?y|.[ /ą⃵Mty㫛~|߱fFfGf9(B;P$@#\$I6h7=&i6Q^Cy (s1_ýg`Qs 5yf G??qXaZF>v,ǎ9}i\V^cpi1=c Ǡv *&İ}pNϳIv8Q>d@(mK}t71k@#^`/AEl0#֏q$ӳP$/D^}HQ>(@ю"9g@L"NI`xo T}E*Vn0lxMY&S hnMxf/^Iơ}/+|Q$|QԈs5/񥩍//D,$bJD4L46_Zҫɞf2YȽ3iM0TMq\gh|ewDi%{HSOAYf#{ rH5龛4 O8}_eH#;H g;HlP4rx5rt…vzX9'8'8Oc9 }vГFCS}i~O }Sۧga)FԣHY >mQ$A/Ii?4k?^ ^!NS䋕UBlbmTw9s~#>SG܍d ;'aQ330+QWjy<#]gI3pdy<#C[(ȣeyl i6"9p?} |CÆ63C8sm3۔g n~SEtyS@$(F,j=6e!<Q4@^,mӽA7:%Z6(RoHδ8wp7p.t;q{?4O7C=Ƿ=Hwx_yuz%]ᕁݯuz_#V}^^_ʷ~zwƿڡG>L՞o(F9NC}8Cz-#ܫ 1'#\x6!u(kFEB ^;kxt >fNpĴ-4_#Bhh9B;Jo~'9FE,P4ѐرI>8҅vw# 6sw_?I_ױc09Kш @=̈́uGx֭s|­;b,pKOp0{ ̟S6PUQ"A1)-Ûf )t#ڶ4btBFwV^ |,-cz_Qƕ,(JZQ"Q/ɔK2pxK] ?^~~Bw-r ڂ?ݑ;b6*ީuӍ6T|?;ռǕx{|K($2;(` }T҈x>x?!XǡB9]l/Leu>O\ÈB(Պk\󴺍0\F#xY߽m79`*Ӎ.=4xS=øwG,pҋd;OHK2qFھޛ}{+' i:(Q$ATPл#Pw7a7z|F8*=^qOp=>@OdQ$S}pߡxB틠,,kDy αЯj^b:옣MpHCΑᅵ_fEbG99֙?5aln~U)F,*ˮ> ?(]6!#(Yt2 ,PJ"2 f"C\͢;> 'H+ssЈsIR-hn)I+FoDr` #DZGg> tG, x7E^P$GPo#oty 5 *{M(GI;%]wy V+{I^C?Sxr{ d/iGtG,cz I0=x )c'8Bv\vK%f-?vcG)c48BF;"ɷMFW+wD#V>c4;hF:{XP,(a8ow E#C`G9l(T=[Ce(t4y(7_ C>r|PpC'uP6,CIw4~kq{ =b=Ee#fo_-7t]v/7sWċWs8p{ *Hw"= ,Dn[TWkWS+ҞG@uV.w=?zKW d5"fY|*!XmKvV"y! *m]nNy:<$=W{UP>bĭc۸;'x(+29@(t^${(oH]FxHϸo(peq6 ݐ#>D=gų-nv,>ψm+msCuPF1P@T;R"N'HG|5V-נ4ǡ?z-kDmo(yF8 &Y6^Zp_j8N7X7^vSZw\ 0+@ T{4CQms-GZE߯SU| <'C?a6dm8bzsx*v {s$%FlgEЅ ]Vn;h@ӿPc^/րbh7q!Ek=E+(@b2VL;b&˛ t#}?fs5"y+NE;/UÈ=_`j ;]vx}Xŭ9ȧE~ww{UGyB|fx qU,8YF)_+Fts$_Н/2Ebxua]CeK'&#.nW!mDw]d# q9F{?>gnu=;q"t7ƈF'pwq" HlZDix3w!{8tavl}eUي9w:uWԕ{H2<F# ؾ4k-49Hvko +^co0aa)"7lNC4.Zdbт 0BFܧ0yc3D4"7ΐ58ORIˮ7ZÉ'`&0 8 t g|&Bϧao\Іz h&6y}@ᮆ/z; 8H}3~E?.金ˇ;VͲE?X]\=o ^ǰh8p㈯4}y^(JkSv\[s H^/O^#KpT!v+Oxړm׽ZFKGhwQN$cz$KôY@kS&!(8צ,l US` i hm ltxz5cCi3. . `0Y F|a[*Ô!8ǷMBvo$_|e\LZFGVZm'WbN:$$ E/B3"sm/ ,~hΒfCص^&/Hn%%; @g`ݲ.CKħcٿ6M^~GAgdp-:;Y+0Kw#L4}WPW3 Xyv<-/yS5K8Gިq e<7ټ;۱<[7-Onˠֲ5 |>$?ɓ 瀷;oDiiwU(ֵ{_aػ⍑w2mUq/ئ:N6x?l@X9=l9v"nz9RmGwB]Qv9݆+.^a.ov4D6#ـhQ:;!GocLș(H΄DozPtv Piu95ˡ3up}$wCNg^Ǡ8>#Vp(xPJ3F5Sm62xm68bm%Ck]  -Bˢ6Am⃶ vZ%gx:~Aڋęvw8C#~שn>m0]1_Gm׉#:Z̦/C/CCa'm ;Nf+ձ~7NͳmSq2- X5YUmudU8rkͪ(Vۦ5:Mōa{KMKKSȦӵK;fڿc.\hoV =k7~ZUeUqµ*NEaPԽ GzJ P龸oڥBvج W-")n r)])/J΄#OG=n|<#˘:EmSΛ޴;P>M@({ #+6st\0S 1P8=o?X4F]ƀK]5*#V%7@Zmr|9| R4fq-G>Oȣ~Ĺ(_mG|2; wٿ$ ul;:.C#OQ6k_}ؽfMh .A 9.d[v`*b{*wCijVRoyDG&{|zs/5ElxL'}iv鬦o L=?iTB| O#w.VLl(iDG qt:{ 香RbYc-.e{`ڧK9.ъ#5) ?+ߩ'\ S,a}Ԧ2n+SL&-0'7M^â‘Vo0D (zJ#Wu Lk`9m Ҩ7R \&z9Og6uӛ~wiVs~OwI>uNó˸Ͽ_? ˸nlӯ?]>81<܊o_?~˿O {q#_9Ƅ]~k_ߪmo^R [6eʗʯ|(ULD/ip[WT *}\y?qDu=އ;뷪2U=UW&>K^=ߪT5lc"z0<MV^էc nmȻ`.XM(QmD@"oE_[`Qہx$XPC^Nq8_?/߾^}F9yz4E]; ~ nx>;Emv7Gk zG+qjPHw^7Ϋ&J7Ԉ7q}N7qԈCyUr*9Gw_F9)e0W0  )OAlE9X<[[6BuFP$ sH Yěcq rcSr'w5"XVpQf"C鎔?(E5d t!( PMv/rHdif q|߿.a$M97/ὣ:0޴#&mCZ6Ya_Y /V.uX\_.\`ǒ%p޶?Ky'[_dQ$KxsR46DȅiӰbE((jBI䦻\vGa!ik4qwqwۓoߢ@LÈb5x%1-pt$1!aDPhv 8hGhGQ!Ӿ+C*X3M՚/xRu&?wzU?|gP[f"ߨwosDh6eͮ%/]#DBd"0L6LEte"XLEDxdDP$߈mtG,KĝmzM:vR#N@a'y!hD9H\/+ALE2xl0L]nN9-@LE4-LjH;b 翪'f CENkO]k۰9,7` Ul<@ٶ 1JmtQidYlk+W\VJ9M,W\6 V&]sDZ#Aw:maǍu8`DRvUkàj(eH6MFkR6.H-IOl׬' /Ҿ+ÈWdǠjh׭@7 0FTѨgQ?!V!  h_wͱ-i?~Un? X,`{xoeM.{ kDA_ÈB$2%-d"ÈB6xn./iV-% vJ dPІd8,Dzɠ::63f tQlC!6U;%Ulw7k"[h|O(okD}ݾ5PwYdX,DZ8osBd(9H"Ce#OiOmtG)>qFpF\m#.ʶ#mwsr{]s|-@l;sQ/B6j!y!2.#rrؑ2mJ^ F?0tWkZy/P (X &!bq !5 9w:GU# tC ow>G:B|'P 6 hP!@ǂ==N'IdA=="Q$Q$KF麋#/4b t|1cwsy_ XcQ# j䱨5P$HNNގ9\zðG̙0.PJUx~W>,/?StG*ZS[=%FJ1ҕ (FT1"1GK2=$C՚܋-`M00&B vdi;bq1+D /\nq5?Zp:V#7 '#\R#npa.硽吝6?.U}naO[S%{11_ZHe(9FAt~LFr-5~?K&5a~_rnck{3N͸_\fq <76ٱ<-$sj~1-Ux̎T핉jyFֵVT*JVWUT|nu+R镉Zv诰B #UKP QE,Zi{&QKٜ =sfYMw5I؅.ZVȠ:WZX"c4Z±3rwE'RλE(pcvkEMLEQE1pyE6 ݮ=kL˓Le \|7@x iI1kZz$|9k\|7O0NRpǸw(:<~tvKZ䅈CR?ԅ}ld-C#Sn",Ûbw>mm;{rrYPwXLj~ ]nIiL<dogw΅Te |5\N!RxW/U&⦶2ߓ]qe{~>my2%-ϛ[G$~w KԮ:P3CY٦T|諎*Lqo_`2ӥL& ,4`sI:p(ȘD;x.R]f\K4XfWNo> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 142 /ID [<72b5533bb8cdfbafa6616cdbb4d4cb86>] >> stream xcb&F~0 $8J@gqf Ï FÐpd:?@$_B< RD=Als t"YA$t69dK%ېDH7`]y SX5pش`dd S@dM  endstream endobj startxref 320178 %%EOF gstat/inst/doc/spatio-temporal-kriging.Rnw0000644000176200001440000015665014646417261020406 0ustar liggesusers\documentclass[a4paper]{article} \usepackage[colorlinks=true,urlcolor=blue,citecolor=blue]{hyperref} \usepackage{alltt} \usepackage{amsfonts} \usepackage{enumerate} \usepackage{graphicx} \usepackage{multirow} \usepackage{natbib} %% following the RJournal.sty \usepackage{geometry} \usepackage{booktabs} \usepackage{amsmath} \RequirePackage{fancyvrb} \RequirePackage{alltt} \DefineVerbatimEnvironment{example}{Verbatim}{} \renewenvironment{example*}{\begin{alltt}}{\end{alltt}} \RequirePackage[font=small,labelfont=bf]{caption} \geometry{a4paper, textwidth=14cm, top=1cm, bottom=1cm, includehead,includefoot,centering, footskip=1.5cm} \raggedbottom \RequirePackage{setspace} \renewcommand{\abstract}[1]{% \setstretch{1}% \noindent% \small% \textbf{Abstract} #1 } \newcommand{\address}[1]{\addvspace{\baselineskip}\noindent\emph{#1}} \date{\footnotesize Mar 25, 2016} \newcommand{\code}[1]{{\footnotesize\tt #1}} \newcommand{\samp}[1]{{\tt #1}} \newcommand{\pkg}[1]{{\bf #1}} \newcommand{\CRANpkg}[1]{{\href{https://cran.r-project.org/package=#1}{\bf #1}}} \newcommand{\email}[1]{{\href{mailto:#1}{#1}}} \newcommand{\dfn}[1]{{\normalfont\textsl{#1}}} \bibliographystyle{plainnat} % \VignetteIndexEntry{Spatio-Temporal Geostatistics using gstat} \title{Spatio-Temporal Interpolation using \pkg{gstat}} % \VignetteIndexEntry{Spatio-Temporal Geostatistics using gstat} \author{by Benedikt Gr{\"a}ler, Edzer Pebesma and Gerard Heuvelink} \graphicspath{{figures/}} \begin{document} \SweaveOpts{concordance=TRUE} \maketitle \abstract{ We present new spatio-temporal geostatistical modelling and interpolation capabilities of the R package \pkg{gstat}. Various spatio-temporal covariance models have been implemented, such as the separable, product-sum, metric and sum-metric models. In a real-world application we compare spatio-temporal interpolations using these models with a purely spatial kriging approach. The target variable of the application is the daily mean $\rm{PM}_{10}$ concentration measured at rural air quality monitoring stations across Germany in 2005. R code for variogram fitting and interpolation is presented in this paper to illustrate the workflow of spatio-temporal interpolation using \pkg{gstat}. We conclude that the system works properly and that the extension of \pkg{gstat} facilitates and eases spatio-temporal geostatistical modelling and prediction for R users. } %% main text \section{Introduction}\label{sec:intro} The collection and processing of spatio-temporal data is rapidly increasing due to technological advances and the societal need for analysis of variables that vary in space and time, such as weather and air quality variables, and crop yields. Analysis of spatial and temporal correlations is useful in itself to get insight into the character and causes of variability, but they are also important to predict values at points from neighbouring observations. Spatio-temporal interpolation can potentially provide more accurate predictions than spatial interpolation because observations taken at other times can be included. In addition, spatio-temporal interpolation allows predictions to be made at single locations or entire fields in between and beyond observation times. However, adding the temporal domain implies that variability in space and time must be modelled, which is more complicated than modelling purely spatial or purely temporal variability. The spatial, temporal and spatio-temporal dependence structures, for instance represented as variograms, do not necessarily coincide with each other in terms of their parameters nor in terms of their family. In the simplest case, a spatio-temporal anisotropy parameter might be enough to deal with the different dependence structures, but this poses strong assumptions on the process. Interpolation of spatial random fields is a common task in geostatistics. Simple approaches like inverse distance weighted predictions or the well known kriging procedures have routinely been applied for many years. Nowadays, modern sensors allow to monitor different variables at an increasing temporal resolution producing rich spatio-temporal data sets. This calls as well for theory and methods to deal with these data sets to gain a better understanding of the observed spatio-temporal processes. While the theoretical aspects of spatio-temporal geostatistics show good progress \citep{Cressie2011}, implementations lack behind. This hinders a wide application of spatio-temporal modelling, as typically extensive scripting and thorough understanding is necessary to build spatio-temporal models. Handling of spatio-temporal data in R is provided by the \CRANpkg{spacetime} package \citep{Pebesma2012}. In this paper, we present an extension of the \CRANpkg{gstat} package \citep{Pebesma2004} (version 1.1-3) that reuses the \pkg{spacetime} classes for the estimation of spatio-temporal covariance/variogram models and to perform spatio-temporal interpolation. Our implementation handles various types of spatio-temporal covariance structures and facilitates spatio-temporal interpolation. The notation of functions in \pkg{gstat} are extended in a way closely following the purely spatial design. This allows a researcher acquainted with \pkg{gstat} to readily use spatio-temporal tools. The use of the newly implemented functions is presented and illustrated by mapping spatio-temporal air-quality data. Another package that offers extensive spatio-temporal geostatistical functionality is \CRANpkg{RandomFields} \citep{Schlather2014}; further packages are mentioned in the SpatioTemporal CRAN task view\footnote{\url{https://cran.r-project.org/web/views/SpatioTemporal.html}}. The paper is organised as follows. The next section introduces the general interpolation routine and describes the different spatio-temporal covariance models, followed by a section introducing the German rural background data set for 2005 and performing the parameter estimation (i.e.\ covariance model fitting). Cross-validation results are presented and discussed in the section thereafter. Conclusions are drawn in the closing section. R scripts reproducing this study are available from within the \pkg{gstat} package as demos. \code{stkrige} re-estimates the variogram models, \code{stkrige-prediction} re-executes the prediction for a time series and a couple of stations, and \code{stkrige-crossvalidation} re-runs the entire leave-one-out cross-validation (note that the latter takes a few hours). \section{Spatio-temporal dependence modelling and kriging}\label{sec:theory} In the following, we will assume a Gaussian spatio-temporal random field $Z$ defined over a spatial domain $\mathcal{S}$ and temporal domain $\mathcal{T}$. Typically, a sample $\mathbf{z} = \left(z(s_1,t_1),\dots,z(s_n,t_n)\right)$ has been observed at a set of distinct spatio-temporal locations $(s_1, t_1), \dots, (s_n,t_n) \in \mathcal{S}\times \mathcal{T} \subseteq \mathbb{R}^2 \times \mathbb{R}$ that may include repeated measurements at the same location or simultaneous measurements at multiple spatial locations. Often, one is interested in modelling $Z$ from the sample $\mathbf{z}$ in order to predict at unobserved locations in space and time or simulate from the conditional distribution. Across our domain of interest $\mathcal{S} \times \mathcal{T}$, we assume the random field $Z$ to be stationary and spatially isotropic. Hence, the field can be characterised through a mean $\mu$ and a covariance function $C_{\rm st}$ where the spatio-temporal covariance only depends on the separating distances across space $h \in \mathbb{R}_{\geq 0}$ and time $u \in \mathbb{R}_{\geq 0}$. Note that extensions beyond this set-up can easily be derived as has been done for the pure spatial case using for instance universal kriging to overcome the stationarity of the mean. The general spatio-temporal covariance function is given by $C_{\rm st}(h,u) = {\rm Cov}\left(Z(s,t), Z(\tilde{s},\tilde{t})\right)$ for a separating spatial distance $h$ and temporal distance $u$ and any pair of points $(s,t), (\tilde{s},\tilde{t}) \in \mathcal{S}\times\mathcal{T}$ with $||s-\tilde{s}||=h$ and $|t-\tilde{t}|=u$. In general, this covariance function is hard to estimate but a couple of models using simplifying assumptions will be presented in the following together with their spatio-temporal variograms $\gamma_{\rm st}(h,u) = C_{\rm st}(0,0)-C_{\rm st}(h,u)$ and encoding in \pkg{gstat}. Given a valid covariance function, the covariance matrices used in the linear predictor are easily obtained and the same algebraic operations as in the well known spatial case yield predictions of the desired random field \citep{Cressie2011}. A major difference is, however, the computational complexity of the matrix inversion. Typically, observations are made at a rather high temporal frequency leading to a number of spatio-temporal locations that is too large for global kriging. Hence, interpolation based on a selected neighbourhood of a subset of all data points becomes beneficial. Additionally, this relaxes the assumption of stationarity, as smooth variations in the mean value across the domain can be respected. The related class of dynamic models also addresses the computational complexity resulting in a temporal Markov structure. Implementations can be found in \CRANpkg{spTimer} by \citet{bakar2015}, \CRANpkg{spBayes} by \citet{finley2015}, \CRANpkg{spate} by \citet{sigrist2015} or \pkg{INLA} by \citet{lindgren2015}. \subsection{Covariance models} The covariance models implemented in \pkg{gstat} and presented in this paper are introduced in the following. Besides further extensions we focus on the basic classes of the \emph{separable}, \emph{product-sum}, \emph{metric} and \emph{sum-metric} spatio-temporal covariance functions. The building blocks (in the following denoted as \code{spatialVgm}, \code{temporalVgm} or \code{jointVgm}) of the spatio-temporal covariance functions are any of the purely spatial variogram models already available in \pkg{gstat}. Each one of the building blocks is created by a call of the function \code{gstat::vgm()}. Remaining arguments such as \code{sill} (the joint sill), \code{nug} (the joint nugget component) or \code{stAni} (the spatio-temporal anisotropy used in the \code{jointVgm}) are scalars and refer to parameters of the entire spatio-temporal covariance function: \begin{enumerate}[a)] \item The \dfn{separable covariance model} assumes that the spatio-temporal covariance function can be represented as the product of a spatial and temporal term: $$C_{\rm sep}(h,u)=C_{\rm s}(h)C_t(u)$$ Its variogram is given by (see Appendix for details): $$\gamma_{\rm sep}(h,u) = {\rm sill} \cdot \left( \bar{\gamma}_s(h)+\bar{\gamma}_t(u)-\bar{\gamma}_s(h)\bar{\gamma}_t(u) \right)$$ where $\bar{\gamma}_s$ and $\bar{\gamma}_t$ are standardised spatial and temporal variograms with separate nugget effects and (joint) sill of 1. The overall sill parameter is denoted by "sill". The R package \pkg{gstat} encodes this model as: \code{vgmST("separable", space = spatialVgm, time = temporalVgm, sill = sill)} The separable model has a strong computational advantage in the setting where each spatial location has an observation at each temporal instance (a \code{"STFDF"} without \samp{NA}s, \cite{Pebesma2012}). In these cases, the covariance matrix (and its inverse) can be composed using the Kronecker-product of the purely spatial and purely temporal covariance matrices (respectively their inverse). \item The above model extends to the \dfn{product-sum covariance model} that we give here in a slightly different notation as \citet{DeCesare2001} and \citet{DeIaco2001} by $$C_{\rm ps}(h,u)=k C_{\rm s}(h)C_{\rm t}(u) + C_{\rm s}(h) + C_{\rm t}(u)$$ with $k > 0$. The corresponding variogram can be written as $$\gamma_{\rm ps}(h,u) = \left(k \cdot {\rm sill}_{\rm t} + 1\right) \gamma_{\rm s}(h) + \left(k \cdot {\rm sill}_{\rm s} + 1\right) \gamma_{\rm t}(u) - k \gamma_{\rm s}(h) \gamma_{\rm t}(u)$$ where ${\gamma}_{\rm s}$ and $\gamma_{\rm t}$ are spatial and temporal variograms (see Appendix for details). The parameter $k$ needs to be positive and the following identity defines the overall sill (${\rm sill}_{\rm st}$) of the model in terms of the model's spatial and temporal sills: $${\rm sill}_{\rm st} = k \cdot {\rm sill}_{\rm s} \cdot {\rm sill}_{\rm t} + {\rm sill}_{\rm s} + {\rm sill}_{\rm t}$$ The above equation can also be used to estimate $k$ based on the three sill values. An alternative formulation of the product-sum variogram can be found in \citet{DeIaco2001}. The \pkg{gstat} definition of this model reads: \begin{example*} vgmST("productSum", space = spatialVgm, time = temporalVgm, k = k) \end{example*} \item Assuming identical spatial and temporal covariance functions except for spatio-temporal anisotropy, allows to use a spatio-temporal \dfn{metric covariance model} where, after matching space and time by an anisotropy correction $\kappa$ (\code{stAni}), the spatial, temporal and spatio-temporal distances are treated equally resulting in a single covariance model $C_{\rm joint}$: $$C_{\rm m}(h,u)=C_{\rm joint}\left(\sqrt{h^2+(\kappa\cdot u)^2}\right)$$ The variogram evaluates to $$ \gamma_{\rm m} (h,u) = \gamma_{\rm joint}\left(\sqrt{h^2+(\kappa\cdot u)^2}\right) $$ where $\gamma_{\rm joint}$ (\code{jointVgm}) is any known variogram that may include a nugget effect. The following line generates the model in \pkg{gstat}: \begin{example*} vgmST("metric", joint = jointVgm, stAni = stAni) \end{example*} The spatio-temporal anisotropy parameter $\kappa$ (\code{stAni}) is given as spatial unit per temporal unit. In many cases, this will be in m/second, as these are the base units in our implementation. All temporal distances are hence internally re-scaled to an equivalent spatial distance using \code{stAni} and treated as metric 3D-space. \item A combination of spatial, temporal and a metric model including an anisotropy parameter $\kappa$ is found in \citet{Bilonick1988} and revisited by \citet{Snepvangers2003} as the \dfn{sum-metric covariance model}: $$C_{\rm sm}(h,u)=C_{\rm s}(h)+C_{\rm t}(u)+C_{\rm joint}\left(\sqrt{h^2+(\kappa\cdot u)^2}\right)$$ This model allows for spatial, temporal and joint nugget effects. Thus, the variogram is given by $$ \gamma_{\rm sm}(h,u)= \gamma_{\rm s}(h) + \gamma_{\rm t}(u) + \gamma_{\rm joint}\left(\sqrt{h^2+(\kappa\cdot u)^2}\right)$$ where $\gamma_{\rm s}$, $\gamma_{\rm t}$ and $\gamma_{\rm joint}$ are spatial, temporal and joint variograms with separate nugget-effects. This model can be defined in \pkg{gstat} through: \begin{example*} vgmST("sumMetric", space = spatialVgm, time = temporalVgm, joint = jointVgm, stAni = stAni) \end{example*} \item A simplified version of the above model is to restrict the spatial, temporal and joint variograms to nugget free models. Additionally, a single spatio-temporal nugget is introduced and the variogram takes the representation: $$\gamma_{\rm ssm}(h,u) = {\rm nug}\cdot {\bf1}_{h>0 \vee u>0} + \gamma_{\rm s}(h) + \gamma_{\rm t}(u) + \gamma_{\rm joint}\left(\sqrt{h^2+(\kappa\cdot u)^2}\right)$$ The \dfn{simple sum-metric covariance model} can be obtained by: \begin{example*} vgmST("simpleSumMetric", space = spatialVgm, time = temporalVgm, joint = jointVgm, nugget = nug, stAni = stAni) \end{example*} \end{enumerate} \noindent Note that the above mentioned spatial, temporal and joint components of the spatio-temporal covariance and variogram models need not necessarily exhibit the same structure. Taking for instance the product-sum and sum-metric models that both contain single temporal and spatial variogram models: the best fits of the respective spatio-temporal models might suggest different variogram families and parameters for the pure spatial and temporal ones. This is due to the target of finding the best overall variogram surface resulting in (potentially) different marginal models. \subsection{Parameter estimation} Fitting routines for the above variogram models are implemented in \pkg{gstat} through the function \code{fit.StVariogram()}, which calls \code{optim()} from the R core package \pkg{stats}. Additional parameters to improve the numerical optimisation can be provided to \code{fit.StVariogram()} and will be passed on to \code{optim()} (using R's three-dots mechanism). As some of the parameters are limited to certain ranges (nuggets need to be non-negative, ranges must be positive), it is advised to use an optimisation routine that allows to impose limits on the search space (i.e.\ \code{L-BFGS-B}) and provide sensible limits via \code{lower} and \code{upper}. By default, the method \code{L-BFGS-B} is called and the smallest lower and largest upper bounds supported by the model are given. The estimation of the spatio-temporal variogram models relies on a sample variogram empirically derived from the data. In contrast to the spatial variogram line, the spatio-temporal variogram is represented by a surface for lag classes composed of a spatial and temporal separation distance. Different from the spatial case, a spatio-temporal sample variogram contains lag-classes of zero spatial separation describing pure temporal dependencies. Without duplicate observations, no estimates can be made for the lag-class with both zero spatial and zero temporal separation. The sample variogram is calculated through the function \code{variogram()} that dispatches the call for spatio-temporal data objects (of class \code{"STFDF"}, \code{"STSDF"}, or \code{"STIDF"}) from \pkg{spacetime}. For a visual judgement of the fit between sample and fitted variograms the \code{plot()} function can be called to show the variogram surfaces next to each other as coloured level plots. Alternatively, a wireframe plot is obtained by setting the parameter \code{wireframe = TRUE} (Figure~\ref{fig:allVgmsWireframe}). A further option is to plot the differences between the sample and model variogram surfaces by setting \code{diff = TRUE}, see Figure~\ref{fig:allVgmsDiffWireframe}. Additionally to visual comparison, \code{fit.StVariogram()} provides the output of \code{optim} as attribute \code{optim.out} of the returned S3-class \code{"StVariogram"}. This attribute includes valuable information to diagnose the success of the \code{optim} routine. It contains for instance the convergence code (\code{\$convergence}) or message (\code{\$message}) and the optimised value (\code{\$value}), which is the mean of the (weighted) squared deviations between sample and fitted variogram surface. Furthermore, it is advised to check the estimated parameters against the parameter boundaries and starting values. Additionally, starting values might also influence the success and result of the optimisation, as local optima may occur due to the interdependence of the parameters. Alternatively, the user might want to start a grid search in order to better asses the sensitivity of the estimates. The fitting approach is identical for all covariance models. However, with the flexibility of the model also the number of parameters increases, making a numerical estimation at times cumbersome. Starting values can in most cases be read from the sample variogram. Parameters of the spatial and temporal variograms can be assessed from the spatio-temporal surface fixing the counterpart at 0. The overall spatio-temporal sill including the nugget can be deducted from the plateau that a nicely behaving sample variogram reaches for 'large' spatial and temporal distances. An important issue is the potentially different orders of magnitude of the parameters. It is at times advisable to rescale spatial and temporal distances to ranges similar to the ones of sills and nuggets using the parameter \code{parscale}. \code{parscale} needs to be provided via \code{control = list(parscale=\dots)} and holds a vector of the same length as the number of parameters to be optimised (see the documentation of \code{optim} for further details). \begin{table} \center \caption{List of implemented weighting schemes for variogram optimisation. Methods 3, 4, and 5 are kept for compatibility reasons with the purely spatial \code{fit.variogram} function. The following notation is used: $N_j$ number of pairs, $h_j$ mean spatial distance and $u_j$ mean temporal distance for each bin $j$, $\gamma$ the actual proposed variogram model and \code{stAni} a spatio-temporal anisotropy scaling.}\label{tab:weighting} {\small \begin{tabular}{ll} \toprule \code{fit.method} & weights \\ \midrule 0 & no fitting\\ 1 and 3 & $N_j$ \\ 2 and 4 & $N_j/\gamma\left(h_j, u_j\right)^2$ \\ 5 & reserved for REML \\ 6 & 1, no weighting\\ 7 & $N_j/\left(h_j^2 + {\rm stAni}^2\cdot u_j^2\right)$ \\ 8 & $N_j/h_j^2$ \\ 9 & $N_j/u_j^2$ \\ 10 & $1/\gamma\left(h_j,u_j\right)^2$ \\ 11 & $1/\left(h_j^2 + {\rm stAni}^2\cdot u_j^2\right)$ \\ 12 & $1/h_j^2$ \\ 13 & $1/u_j^2$ \\ \bottomrule \end{tabular}} \end{table} Currently, the implemented fitting routines are based on the (weighted) mean squared difference between model and sample variogram surfaces. By default, all values are associated the same weight (\code{fit.method = 6}), but other options are available that allow for different weighting schemes based on the number of pairs, spatial, temporal and spatio-temporal distances or the variogram's value. Table~\ref{tab:weighting} lists all currently implemented options. Depending on the target neighbourhood size of the desired interpolation, it might be beneficial to narrow down the spatial and temporal distances and to introduce a cutoff. This ensures that the model is fitted to the differences over space and time actually used in the interpolation, and reduces the risk of overfitting the variogram model to large distances not used for prediction. Please note that methods 2 and 10 (Table~\ref{tab:weighting}) involve weights based on the fitted variogram that might lead to bad convergence properties of the parameter estimates. Furthermore, the scalar \code{stAni} in methods 7 and 11 will either be the actual fitted spatio-temporal anisotropy if it is included in the model or a fixed value that has to be passed as \code{stAni} by the user to \code{fit.StVariogram}. The latter is advised, as the former might lead to bad convergence properties as in the case of weights based on the fitted variogram mentioned above. As the estimation of an anisotropy scaling might be cumbersome on a visual basis, we provide the function \code{estiStAni} that provides estimates based on the empirical spatio-temporal variogram. Four heuristics are available based on (i) rescaling a linear model (\code{linear}), (ii) estimating equal ranges (\code{range}), (iii) rescaling a pure spatial variogram (\code{vgm}) or (iv) estimating a complete spatio-temporal metric variogram model and returning its spatio-temporal anisotropy parameter (\code{metric}). The choice of the weighting scheme will influence the selected model and different weightings might be further assessed in a cross-validation of the selected model. To increase numerical stability, it is advisable to use weights that do not change with the current model fit. \subsection{Kriging} Standard kriging (\code{krigeST}) and trans Gaussian kriging (\code{krigeSTTg}) have been implemented. As spatio-temporal kriging based on the complete data set might be too computationally expensive, local kriging is an attractive alternative. This poses the question of how to select the "nearest" neighbours from the spatio-temporal space $\mathcal{S}\times\mathcal{T}$. A natural choice would be to select the spatio-temporal locations exhibiting the strongest correlation to the unobserved location. Depending on the spatio-temporal covariance model, the relation between spatial and temporal distance in determining the strength of correlation will vary. As a proxy, we use a spatio-temporal anisotropy parameter that relates spatial and temporal distances in the same manner as in the metric covariance models. The k-nearest neighbours within this metric spatio-temporal space $\mathcal{S}\times\mathcal{T}$ are selected using the R package \CRANpkg{FNN} \citep{Beygelzimer2013}. The interpolation performs iteratively for each spatio-temporal prediction location with a local subset of the data set. Without neighbourhood selection, kriging uses all data. As the metric induced by the spatial and rescaled temporal distances are only proxies to the strength of correlation between locations (see Figure~\ref{fig:vgmVsDist}), we provide an option to search a larger metric neighbourhood. Within this larger neighbourhood, the covariance function is evaluated for all spatio-temporal locations and the neighbouring locations with the largest covariance values are then selected for prediction. However, this approach might still suffer from a clustering of locations and alternatives such as a staged search (find spatial neighbours first and select a set of temporal instances for each spatial neighbour) or an octant search (select neighbours per spatial quadrant from preceding and following time stamps separately) could be considered. However, these alternatives are not yet available in \pkg{gstat}. \begin{figure} \centering \includegraphics[width=0.9\textwidth]{vgmVsMetricDist.png} \caption{A contourplot showing how the spatio-temporal sum-metric variogram model (as estimated in the application below) and a metric distance relate to each other. Distances are rescaled by 1/5 for easy plotting.}\label{fig:vgmVsDist} \end{figure} \section{Application and illustration}\label{sec:data} The data set used is taken from AirBase\footnote{\href{http://www.eea.europa.eu/data-and-maps/data/airbase-the-european-air-quality-database-6}{AirBase - The European air quality database}}, the air quality data base for Europe provided by the European Environmental Agency (EEA). We focus on a single air quality indicator, particulate matter with a diameter less than 10~$\mu\rm m$, measured at rural background stations for 2005 (${\rm PM}_{10}$). The data base contains data for many years. Besides rural, also urban areas are monitored and not only at background locations (e.g.\ traffic stations). However, these processes are considered to be of a different nature and should be treated separately. As a use case, we therefore limit our data set to the rural background stations in Germany. Figure \ref{fig:dailyMeans} shows for 8 randomly chosen days daily mean values of ${\rm PM}_{10}$ concentrations for the entire monitoring network over Germany in 2005 with 69 rural background stations. \begin{figure} \centering \includegraphics[width=0.95\textwidth]{daily_means_PM10.png} \caption{Daily mean $\rm{PM}_{10}$ concentration $[\mu\rm{g/m}^3]$ at 8 randomly selected days in 2005.}\label{fig:dailyMeans} \end{figure} In order to fit a spatio-temporal model to the air quality data set, the empirical variogram surface is computed and used as input for the fitting routines of the different models. The empirical variogram is based on spatio-temporal bins that span regularly over space and time. Regular measurements over time (i.e.\ hourly, daily) motivate regular binning intervals of the same temporal resolution. Nevertheless, flexible binning boundaries can be passed for spatial and temporal dimensions. This allows for instance to use smaller bins at small distances and larger ones for large distances. Temporal boundaries, instead of lags, are required when the sampling of the data is non-regular. In cases where regular temporal observations can be assumed, this is utilised in the sample variogram calculations and any two temporal consecutive observations are assumed to have the same temporal distance. Figure~\ref{fig:allVgmsWireframe} shows the empirical variogram along with the proposed best fitting model of each spatio-temporal variogram family as perspective wireframe plots. In order to better identify structural shortcomings of the selected model, a difference plot (Figure~\ref{fig:allVgmsDiffWireframe}) is a helpful visual diagnostic plot. Beyond the selection of the spatio-temporal variogram family, each component of this model can be chosen from any implemented one-dimensional variogram. In Table~\ref{tab:vgmFits} a selection of fitted models in terms of their residuals compared to the sample variogram surface are shown. The best fitting spatio-temporal model of each family is given as: \begin{enumerate}[a)] \item separable model (weighted MSE: 6.82): \nopagebreak \begin{tabular}{l|rlrlrr} \toprule & partial sill & model & \multicolumn{2}{c}{range} & nugget & sp.-temp. sill \\ \midrule space & 0.86 & Exp & 558 & \hspace{-2\tabcolsep}~km & 0.14 & \multirow{2}{*}{124} \\ time & 1.00 & Sph & 5.6 & \hspace{-2\tabcolsep}~days & 0.00 & \\ \bottomrule \end{tabular} obtained via: \begin{example*} separableModel <- vgmST("separable", space = vgm(0.9, "Exp", 200, 0.1), time = vgm(0.9, "Sph", 3.5, 0.1), sill = 124) fit.StVariogram(empVgm, separableModel, fit.method = 7, stAni = 117.3, method = "L-BFGS-B", control = list(parscale = c(100, 1, 10, 1, 100)), lower = c(10, 0, 0.1, 0, 0.1), upper = c(2000, 1, 12, 1, 200)) \end{example*} \item product-sum model (weighted MSE: 6.91) \nopagebreak \begin{tabular}{l|rlrlrc} \toprule & partial sill & model & \multicolumn{2}{c}{range} & nugget & k\\ \midrule space & 6.8 & Exp & 542 & \hspace{-2\tabcolsep}~km & 1.2 & \multirow{2}{*}{1.61} \\ time & 8.7 & Sph & 5.5 & \hspace{-2\tabcolsep}~days & 0.0 & \\ \bottomrule \end{tabular} obtained via \begin{example*} prodSumModel <- vgmST("productSum", space = vgm(10, "Exp", 200, 1), time = vgm(10, "Sph", 2, 1), k=2) fit.StVariogram(empVgm, prodSumModel, fit.method = 7, stAni = 117.3, method = "L-BFGS-B", control = list(parscale = c(1, 10, 1, 1, 0.1, 1, 10)), lower = rep(0.0001, 7)) \end{example*} \item metric model (weighted MSE: 10.05) \nopagebreak \begin{tabular}{l|rlrlrrl} \toprule & partial sill & model & \multicolumn{2}{c}{range} & nugget & \multicolumn{2}{c}{anisotropy}\\ \midrule joint & 123.4 & ${\rm Mat}_{\kappa=0.6}$ & 453 & \hspace{-2\tabcolsep}~km & 17.4 & 189 & \hspace{-2\tabcolsep}~km/day \\ \bottomrule \end{tabular} obtained via \begin{example*} metricModel <- vgmST("metric", joint = vgm(60, "Mat", 150, 10, kappa = 0.6), stAni = 60) fit.StVariogram(empVgm, metricModel, fit.method = 7, stAni = 117.3, method = "L-BFGS-B", control = list(parscale = c(10, 20, 5, 10)), lower = c(80, 50, 5, 50), upper = c(200, 1500, 60, 300)) \end{example*} \item\label{bestfit} sum-metric model (weighted MSE: 3.31) \nopagebreak \begin{tabular}{l|rlrlrrl} \toprule & partial sill & model & \multicolumn{2}{c}{range} & nugget & \multicolumn{2}{c}{anisotropy}\\ \midrule space & 16.4 & Sph & 67 & \hspace{-2\tabcolsep}~km & 0 & & \\ time & 9.3 & Exp & 0.9 & \hspace{-2\tabcolsep}~days & 0 & & \\ joint & 91.5 & Sph & 999 & \hspace{-2\tabcolsep}~km & 7.3 & 185 & \hspace{-2\tabcolsep}~km/day \\ \bottomrule \end{tabular} obtained via \begin{example*} sumMetricModel <- vgmST("sumMetric", space = vgm(20, "Sph", 150, 1), time = vgm(10, "Exp", 2, 0.5), joint = vgm(80, "Sph", 1500, 2.5), stAni = 120) fit.StVariogram(empVgm, sumMetricModel, fit.method = 7, stAni = 117.3, method = "L-BFGS-B", control = list(parscale = c(1, 100, 1, 1, 0.5, 1, 1, 100, 1, 100), maxit=10000), lower = c(sill.s = 0, range.s = 10, nugget.s = 0, sill.t = 0, range.t = 0.1, nugget.t = 0, sill.st = 0, range.st = 10, nugget.st = 0, anis = 40), upper = c(sill.s = 200, range.s = 1000, nugget.s = 20, sill.t = 200, range.t = 75, nugget.t = 20, sill.st= 200, range.st = 5000, nugget.st = 20, anis = 500)) \end{example*} \item simple sum-metric model (weighted MSE: 3.31) \nopagebreak \begin{tabular}{l|rlrlrlc} \toprule & partial sill & model & \multicolumn{2}{c}{range} & \multicolumn{2}{c}{anisotropy} & sp.-temp. nugget \\ \midrule space & 16.4 & Sph & 67 & \hspace{-2\tabcolsep}~km & & & \multirow{3}{*}{$\Bigg\}$ 7.3} \\ time & 9.3 & Exp & 0.9 & \hspace{-2\tabcolsep}~days & & & \\ joint & 91.5 & Sph & 999 & \hspace{-2\tabcolsep}~km & 185 & \hspace{-2\tabcolsep}~km/day & \\ \bottomrule \end{tabular} obtained via \begin{example*} simpleSumMetricModel <- vgmST("simpleSumMetric", space=vgm(120, "Sph", 150), time =vgm(120, "Exp", 10), joint=vgm(120, "Sph", 150), nugget = 10, stAni = 150) fit.StVariogram(empVgm, simpleSumMetricModel, fit.method = 7, stAni = 117.3, method = "L-BFGS-B", control = list(parscale = c(1, 10, 1, 1, 1, 100, 1, 10)) lower = c(sill.s = 0, range.s = 10, sill.t = 0, range.t = 0.1, sill.st= 0, range.st= 10, nugget = 0, anis = 40), upper = c(sill.s = 200, range.s = 500, sill.t = 200, range.t = 20, sill.st= 200, range.st = 5000#, nugget = 100, anis = 1000)) \end{example*} \end{enumerate} The variogram parameters are numerically optimised using the function \code{fit.StVariogram} and the \code{L-BFGS-B} routine of \code{optim}. The parameter \code{fit.method} that controls the weighing of the residuals between empirical and model surface of \code{fit.StVariogram} is set to \code{7} (the spatio-temporal analog to the commonly used spatial weighting). A full list of all weighting schemes is presented in Table~\ref{tab:weighting}. In our application, the residuals are multiplied by the number of pairs in the corresponding spatio-temporal bin divided by the metric distance: $N_j/(h_j^2 + {\rm stAni}^2\cdot u_j^2)$. The spatio-temporal anisotropy is estimated beforehand and fixed at 118~km/day. This weighting scheme puts higher confidence in lags filled with many pairs of spatio-temporal locations, but respects to some degree the need of an accurate model for short distances, as these short distances are the main source of information in the prediction step. Note, that different weighting schemes will in general result in different model parameters generating different interpolation values. Our selection is based on the assumption that well filled bins provide more reliable empirical variogram estimates and the fact that short distances are the most important ones for a local interpolation. \begin{table}[t!] \centering \caption{Weighted MSE (\code{fit.method = 7, see Table~\ref{tab:weighting}}) for different spatio-temporal variogram families and different choices for the one-dimensional variogram components. Columns denote the spatial and temporal variogram choices. The metric model is only applicable if both domains use the same family.}\label{tab:vgmFits} \begin{tabular}{ll|rrrrr} \toprule model & joint & Exp+Exp & Exp+Sph & Sph+Exp & Sph+Sph & ${\rm Mat}_{\kappa=0.6}$ \\ \midrule {separable} & $~~\cdot$ & 9.87 & \bf{6.82} & 10.42 & 7.50 & $\cdot~~$ \\ {product-sum} & $~~\cdot$ & 10.09 & \bf{6.91} & 10.64 & 7.59 & $\cdot~~$ \\ {metric} & $~~\cdot$ & 10.25 & $\cdot~~$ & $\cdot~~$ & 10.59 & \bf{10.05} \\ \multirow{2}{*}{sum-metric} & Exp & 4.10 & 3.60 & 3.89 & 3.32 & $\cdot~~$ \\ & Sph & 3.74 & 3.73 & \bf{3.31} & 3.36 & $\cdot~~$ \\ \multirow{2}{*}{simple sum-metric}& Exp & 4.10 & 3.60 & 3.94 & 3.32 & $\cdot~~$ \\ & Sph & 3.74 & 3.98 & \bf{3.31} & 3.56 & $\cdot~~$ \\ \bottomrule \end{tabular} \end{table} \begin{figure} \centering \includegraphics[width=0.95\textwidth]{allVgmsWireframe.png} \caption{Sample and the best fitting spatio-temporal variogram of each family.}\label{fig:allVgmsWireframe} \end{figure} \begin{figure} \centering \includegraphics[width=0.95\textwidth]{allVgmsDiffWireframe.png} \caption{Differences between the sample and the best fitting spatio-temporal variogram of each family.}\label{fig:allVgmsDiffWireframe} \end{figure} \begin{figure}[b!] \centering \includegraphics[width=0.95\textwidth]{pred_daily_means_PM10.png} \caption{Spatio-temporal interpolation of daily mean $\rm{PM}_{10}$ concentrations using the sum-metric covariance model with the closest 50 neighbouring spatio-temporal locations. The crosses indicate sampling locations. The cell size of the grid in UTM projection is $10~\rm{km}\times10~\rm{km}$.}\label{fig:pred_daily} \end{figure} For comparison with classical approaches, we interpolate across Germany iteratively for each single day using all available data for variogram estimation. The purely spatial empirical variogram can directly be obtained from the empirical spatio-temporal variogram, by fixing the temporal lag at 0 separation. From the same set of variogram models as investigated for the spatio-temporal models, the exponential model (partial sill:~66.5, range:~224~km, nugget:~13.5) is the best suited based on the optimisation criterion. Alternatively, we could have fitted the spatial variogram for each day separately using observations from that day only. However, given the small number of observation stations, this produced unstable variograms for several days and we decided to use the single spatial variogram derived from all spatio-temporal locations treating time slices as uncorrelated copies of the spatial random field. Once the best fitting spatio-temporal variogram model is identified, the interpolation can be executed with the help of the function \code{krigeST}. We use the sum-metric model that obtained the smallest RMSE (compare Table~\ref{tab:vgmFits}) to produce a gridded prediction. The interpolation domain consists of daily values for a regular grid spanning over Germany in UTM projection. The cell size is $10~\rm{km}\times10~\rm{km}$. Figure~\ref{fig:pred_daily} shows the interpolated grid for the same days as Figure~\ref{fig:dailyMeans} alongside with all sampling locations. Additionally, maps depicting the differences from a leave-one-out cross-validation are presented in Figure~\ref{fig:diffs_daily}. A time series view is presented in Figure~\ref{fig:timeseries} showing the observed and predicted time series at a single location along with its 95~\% prediction intervals. An animation of the entire year of daily mean ${\rm PM}_{10}$ prediction maps can be viewed online.\footnote{\url{http://gstat.r-forge.r-project.org/STpred.html}}. The interpolated maps are generated for a set of time stamps \code{tIDs} and a grid over Germany \code{DE\_pred} by \begin{example*} krigeST(PM10~1, data = DE_RB_2005[ , tIDS], newdata = DE_pred, fitSumMetricModel, nmax = 50, stAni = fitMetricModel$stAni/24/3600) \end{example*} \begin{figure}[t!] \centering \includegraphics[width=0.95\textwidth]{diffs_daily_means_PM10.png} \caption{Differences of spatio-temporal predictions and observed daily mean $\rm{PM}_{10}$ concentrations using the sum-metric covariance model with the closest (approx. strongest correlated) 50 neighbouring spatio-temporal locations.}\label{fig:diffs_daily} \end{figure} \begin{figure}[h!] \centering \includegraphics[width=0.9\textwidth]{singleStationTimeSeries.png} \caption{Subset of the time series of observed and predicted ${\rm PM}_{10}$ at a single station in Lower Saxony along with its 95~\% prediction intervals.}\label{fig:timeseries} \end{figure} To further compare the different approaches, a leave-one-out cross-validation was carried out. The spatio-temporal interpolations are done for the closest 50 and 10 neighbours assessing the impact of the neighbourhood size. Inspection of the ranges of the variograms in the temporal domain, suggests that any station more than at most 6 days apart does not meaningfully contribute. Furthermore, the local estimation allows the spatio-temporal random field to have a varying mean value over space and time. The purely spatial interpolation can be considered as the extreme temporally local case, where only observations from the same time instance are considered. \begin{table} \caption{Leave-one-out cross-validation results. The column wMSE refers to the optimised value from the variogram estimation.}\label{tab:cv} \centering \begin{tabular}{lrr|rrrr} \toprule covariance model & wMSE & neigh. & RMSE & MAE & ME & COR \\ \midrule pure Spatial & & 10 & 6.15 & 4.09 & -0.01 & 0.84 \\ separable &\hspace{-\tabcolsep}[6.82]& 10 & 6.08 & 4.04 & -0.01 & 0.84 \\ product-sum &\hspace{-\tabcolsep}[6.91]& 10 & 6.08& 4.04& -0.01 & 0.84 \\ metric &\hspace{-\tabcolsep}[10.05]& 10 & 6.11 & 4.07 & 0.03 & 0.84 \\ sum-metric &\hspace{-\tabcolsep}[3.31]& 10 & 6.16 & 4.08 & -0.06 & 0.84 \\ simple sum-metric &\hspace{-\tabcolsep}[3.31]& 10 & 6.14 & 4.08 & -0.02 & 0.84 \\ \midrule pure Spatial & & 50 & 6.10 & 4.07 & 0.00 & 0.84 \\ separable &\hspace{-\tabcolsep}[6.82]& 50 & 6.05 & 4.04 & 0.01 & 0.84 \\ product-sum &\hspace{-\tabcolsep}[6.91]& 50 & 6.05 & 4.04 & 0.00 & 0.84 \\ metric &\hspace{-\tabcolsep}[10.05]& 50 & 6.07 & 4.08 & 0.03 & 0.84 \\ sum-metric &\hspace{-\tabcolsep}[3.31]& 50 & 6.14 & 4.09 & -0.01 & 0.84 \\ simple sum-metric &\hspace{-\tabcolsep}[3.31]& 50 & 6.14 & 4.08 & -0.02 & 0.84 \\ \bottomrule \end{tabular} \end{table} \section{Results and discussion}\label{sec:resultsDiscuss} In terms of added value of spatio-temporal kriging measured in cross-validation results, Table~\ref{tab:cv} shows hardly any benefit in the illustrative example. This effect can to a large degree already be explained from the spatio-temporal variograms: a temporal lag of one or a few days leads already to a large variability compared to spatial distances of few hundred kilometres, implying that the temporal correlation is too weak to considerably improve the overall prediction. Nevertheless, investigating a process with a higher temporal frequency will likely show a stronger correlation in the temporal domain. Looking into station-wise cross-validation statistics (not shown), the four stations with an RMSE of 10 and larger correspond to the locations with the largest annual mean concentrations ($>22~\mu{\rm g}/{\rm m}^3$). The added value of spatio-temporal kriging lies in the flexibility of the model. We are now in the position to not only interpolate at unobserved locations in space, but also at unobserved time instances. This makes spatio-temporal kriging a suitable tool to fill gaps in time series not only based on the time series solely, but also including some of its spatial neighbours. A very irregular sampled data set would as well largely benefit from a spatio-temporal approach, as spatially close but unobserved locations in one time slice are not of any help in a purely spatial approach, but the spatio-temporal model would benefit from the observed value nearby at another time instance. In a completely regular data set, the distance to a spatio-temporal neighbour is at least as large as the pure spatial distance and hence the correlation is weaker. Furthermore, being able to capture the covariance structure over space and time might foster a better understanding of the process under study. While we see spatio-temporal modelling being a powerful tool, the cross-validation results in Table~\ref{tab:cv} show that spatio-temporal kriging will not solve the problem of all poorly spatially captured phenomena. Further preprocessing steps might be necessary to improve the modelling of this $\rm{PM}_{10}$ data set such as for instance a temporal AR-model followed by spatio-temporal residual kriging or using further covariates in a preceding (linear) modelling step. Providing the best possible model of $\rm{PM}_{10}$ concentrations across Germany was beyond the scope of this paper. The selection of a spatio-temporal covariance model should not only be made based on the (weighted) mean squared difference between the empirical and model variogram surfaces (presented in Table~\ref{tab:vgmFits}), but also on conceptional choices and visual (Figure~\ref{fig:allVgmsWireframe}) judgement of the fits. Even though the function \code{fit.StVariogram} provides optimisation routines to fit different spatio-temporal variogram models, the numerical routines in the background may struggle to find the optimal parameters. Besides the lower and upper boundaries of the parameter space, the control parameter \code{parscale} of the \code{optim} function is a valuable option to improve the convergence of the optimisation. With passing \code{parscale} as entry of the list \code{control} a vector of scalars must be passed that controls the different levels of magnitude of the variogram parameters. In most applications, a change of 1 in the sills will have a stronger influence on the variogram surface than a change of 1 in the ranges. The problem becomes more difficult with an increasing number of parameters. In our application, using the simple sum-metric model as starting values for the full sum-metric model improved the convergence speed of the more complex model. In the presented application, the sum-metric models turns out to be the same as the simple sum-metric model. While this might at first sight be due to using the simpler model to generate starting values, different non simplified starting models converged to the same result. Generally, it is important to keep in mind the strong interaction of the model parameters. It is typically not easy to distinguish how much of the spatio-temporal nugget and sill is attributed to spatial, temporal or joint components. In this paper we considered a joint numerical approach, but step-wise approaches where the components are estimated separately could as well be considered. The interested reader is also referred to \cite{Nash2014}. However, all optimisation approaches follow the premise that the studied process can be approximated with the given model and available data. If this premise fails, no optimal model can be selected. An extension towards a restricted maximum likelihood method (REML) to fit the spatio-temporal variogram model would be desirable, as it overcomes some of the above mentioned drawbacks of the method of moments based approaches and would additionally provide standard errors for the parameter estimates. A REML approach would allow to take into account that sample variogram values are correlated. However, for large datasets (as in the spatio-temporal case), it is computationally more feasible to use a least squares fitting. To reduce the correlation of the variogram values, some randomisation could be implemented in large data sets, to calculate the sample variogram based on partially overlapping or even disjoint sets of observations. The selected anisotropy as proxy to the relation of spatial and temporal distance in determining the strongest correlated neighbours might show a distortion for some models when only few neighbours are used towards the true set of the most correlated locations. However, this effect vanishes as soon as the spatio-temporal range of the model is sufficiently represented through the set of nearest neighbours. As mentioned by \cite{kj99}, an alternative to space-time kriging might be co-kriging. However, this is only feasible if the number of time replicates is (very) small, as the number of cross variograms to be modelled equals the number of {\em pairs} of time replicates. Also, co-kriging can only interpolate for these time slices, and not inbetween or beyond them. It does however provide prediction error covariances, which can help assessing the significance of estimated {\em change} parameters \citep{pe1,pe2}. Several of the space-time variograms presented here may be approximated by sets of direct variograms and cross-variograms. Fitting variogram models to sample space-time variograms is in our implementation done by \code{stats::optim}. Our example script uses method \code{L-BFGS-B} and provides upper and lower parameter boundaries, e.g.\ to make sure sill parameters do not become negative. There has been a lot of research in optimization since the methods in \code{optim}, some of which has been reported in the special issue of the Journal of Statistical Software \citep{optim}, and we do see potential to improve the options in this respect. The approximate selection of the most correlated neighbours solves the lack of a natural notion of a joint distance across space and time. However, other sampling properties might introduce a bias in the prediction. The prediction at an unobserved location with a cluster of observations at one side will be biased towards this cluster and neglect the locations towards the other directions. Similar as the quadrant search in the pure spatial case an octant wise search strategy for the local neighbourhood would solve this limitation. A simpler stepwise approach to define an $n$-dimensional neighbourhood might already be sufficient in which at first $n_s$ spatial neighbours and then from each spatial neighbour $n_t$ time instances are selected, such that $n_s \cdot n_t \approx n$. The presented example considers stationary random fields that are isotropic in space. Further extensions towards more sophisticated variogram estimations allowing also for spatial geometric anisotropy are desirable. One could for instance plot variogram maps for spatial separation in North and South direction for each temporal lag. However, the current implementation does not allow to use the anisotropy parameter \code{anis} of the pure spatial variogram definition. Nevertheless, a preliminary rescaling of coordinates would be a possible workaround. This route has for instance been taken by \citet{Gasch2015} performing 3D+T kriging . The soil profiles in their study show a clear difference in horizontal and vertical variography. To correct for this, the depth dimension of the data has been rescaled to correspond with the dimensions of the horizontal distances before hand. In the subsequent study, these pseudo 3D coordinates have been used to fit the spatio-temporal variograms and perform kriging. The code in model definitions is meant to be kept both flexible and simple. This is based on i) re-producing the notion of the geostatistical models in the R code and in ii) reusing existing definitions and functions of the pure spatial cases that have been available for many years in \pkg{gstat}. The data handling benefits to a large degree from the implementations in the \pkg{spacetime} R package. \section{Conclusions}\label{sec:conclusions} The spatio-temporal extensions to \pkg{gstat} allow to model a set of spatio-temporal covariance functions. The implemented functionality eases estimation, visualisation and understanding of spatio-temporal covariance functions. The extension and reuse of already available function structures and nomenclature facilitates an easy translation of spatial workflows to handle spatio-temporal data. The numerical estimation of the variogram parameters might be tricky and needs a large degree of the users attention. It is advised to carefully check the outcome of the \code{optim} routine after optimisation. Spatio-temporal kriging predictions can be made in a global and a local neighbourhood set-up, while the latter will be the preferred solution for most spatio-temporal data sets and common computer hardware configurations. Spatio-temporal covariance structures carry valuable information, but a spatio-temporal model is not guaranteed to outperform pure spatial predictions. The benefit in terms of prediction quality of spatio-temporal kriging becomes only apparent if sufficiently strong correlated locations are added with the temporal dimension (i.e.\, if the model permits strong correlation across time). Nevertheless, the spatio-temporal covariance model might be of interest in itself. Besides some publications where the authors of this paper were involved in, such as \cite{Kilibarda2014}, the software presented here has proven useful in several independent publications, examples of which are \citep{marek, biondi, hu, yoon}. \section{Acknowledgements} This research has partly been funded by the German Research Foundation (DFG) under project number PE 1632/4-1. We thank two anonymous reviewers for their valuable comments. \bibliography{spatio-temporal-kriging} \pagebreak \address{Benedikt Gr{\"a}ler\\ Institute for Geoinformatics, University of M{\"u}nster\\ Heisenbergstr. 2, 48149, M{\"u}nster\\ Germany}\\ \email{ben.graeler@uni-muenster.de} \address{Edzer Pebesma\\ Institute for Geoinformatics, University of M{\"u}nster\\ Heisenbergstr. 2, 48149, M{\"u}nster\\ Germany}\\ \email{edzer.pebesma@uni-muenster.de} \address{Gerard Heuvelink\\ Department of Environmental Sciences, Wageningen University\\ PO Box 47, 6700AA, Wageningen\\ The Netherlands}\\ \email{gerard.heuvelink@wur.nl} \section{Appendix} \subsection{Derivation of the separable covariance and variogram identities}\label{sec:derivSep} The separable covariance and variogram identity is readily available through \begin{align*} C_{\rm sep}(h,u) &= C_{\rm s}(h)C_{\rm t}(u) = sill \cdot \bar{c}_s(h)\bar{c}_t(u) \\ \gamma_{\rm sep}(h,u) &= C_{\rm sep}(0,0) - C_{\rm sep}(h,u) \\ &= sill \left(1- \bar{c}_s(h) \cdot \bar{c}_t(u) \right) \\ &= sill \left(1- \left(1-\bar{\gamma}_s(h)\right)\left(1-\bar{\gamma}_t(u)\right) \right) \\ &= sill \left(1- \left(1-\bar{\gamma}_s(h) -\bar{\gamma}_t(u) + \bar{\gamma}_s(h)\bar{\gamma}_t(u)\right) \right) \\ &= sill \left(\bar{\gamma}_s(h) + \bar{\gamma}_t(u) - \bar{\gamma}_s(h)\bar{\gamma}_t(u)\right) \end{align*} where $\bar{c}$ and $\bar{\gamma}$ are normalised correlation and correlogram functions respectively. \subsection{Derivation of the product-sum covariance and variogram identities}\label{sec:derivPs} The product-sum covariance and variogram identity is readily available through: \begin{align*} C_{\rm ps}(h,u) = & \ k \cdot C_{\rm s}(h)C_{\rm t}(u) + C_{\rm s}(h) + C_{\rm t}(u) \\ \gamma_{\rm ps}(h,u) = & \ C_{\rm ps}(0,0) - C_{\rm ps}(h,u) \\ = & \ k \cdot C_{\rm s}(0)C_{\rm t}(0) + C_{\rm s}(0) + C_{\rm t}(0) \\ & - \left(k \cdot C_{\rm s}(h)C_{\rm t}(u) + C_{\rm s}(h) + C_{\rm t}(u)\right) \\ = & \ k \cdot {\rm sill}_{\rm s} \cdot {\rm sill}_{\rm t} + {\rm sill}_{\rm s} + {\rm sill}_{\rm t} \\ & - k \cdot \left[ \left({\rm sill}_{\rm s} - \gamma_{\rm s}(h)\right)\left({\rm sill}_{\rm t} - \gamma_{\rm t}(u)\right)\right] - \left({\rm sill}_{\rm s} - \gamma_{\rm s}(h)\right) - \left({\rm sill}_{\rm t} - \gamma_{\rm t}(u)\right) \\ = & \ k \cdot {\rm sill}_{\rm s} \cdot {\rm sill}_{\rm t} + {\rm sill}_{\rm s} + {\rm sill}_{\rm t} \\ & - k \cdot \left[ {\rm sill}_{\rm s} \cdot {\rm sill}_{\rm t} - {\rm sill}_{\rm s} \cdot \gamma_{\rm t}(u) - {\rm sill}_{\rm t} \cdot \gamma_{\rm s}(h) + \gamma_{\rm s}(h) \gamma_{\rm t}(u) \right] \\ & - {\rm sill}_{\rm s} + \gamma_{\rm s}(h) - {\rm sill}_{\rm t} + \gamma_{\rm t}(u) \\ = & \ k \cdot {\rm sill}_{\rm t} \gamma_{\rm s}(h) + k \cdot {\rm sill}_{\rm s} \gamma_{\rm t}(u) - k \gamma_{\rm s}(h) \gamma_{\rm t}(u) + \gamma_{\rm s}(h) + \gamma_{\rm t}(u) \\ = & \ (k \cdot {\rm sill}_{\rm t} + 1) \gamma_{\rm s}(h) + (k \cdot {\rm sill}_{\rm s} + 1) \gamma_{\rm t}(u) - k \gamma_{\rm s}(h) \gamma_{\rm t}(u) \end{align*} %%%%%%%%%% \end{document} gstat/inst/doc/gstat.Rnw0000644000176200001440000003154014646417261014746 0ustar liggesusers%% Document started, Sat Jul 3 19:30:52 CEST 2004, my 37th birthday, %% while being stuck for 24 hours at Philadelphia airport, on my way %% back from the joint TIES/Accuracy 2004 symposium in Portland, ME. %% Continued, Oct 28, during the Apmosphere mid-term review. Oh, shame. % \VignetteIndexEntry{ The meuse data set: a tutorial for the gstat R package } \documentclass[a4paper]{article} \usepackage{hyperref} \newcommand{\code}[1]{{\tt #1}} \SweaveOpts{echo=TRUE} \title{The meuse data set: a brief tutorial\\ for the {\tt gstat} R package } \author{\href{mailto:edzer.pebesma@uni-muenster.de}{Edzer Pebesma}} \date{\today} \begin{document} \maketitle \section{Introduction} The \code{meuse} data set provided by package \code{sp} is a data set comprising of four heavy metals measured in the top soil in a flood plain along the river Meuse, along with a handful of covariates. The process governing heavy metal distribution seems that polluted sediment is carried by the river, and mostly deposited close to the river bank, and areas with low elevation. This document shows a geostatistical analysis of this data set. The data set was introduced by Burrough and McDonnell, 1998. This tutorial introduced the functionality of the R package \code{gstat}, used in conjunction with package \code{sp}. Package \code{gstat} provides a wide range of univariable and multivariable geostatistical modelling, prediction and simulation functions, where package \code{sp} provides general purpose classes and methods for defining, importing/exporting and visualizing spatial data. \section{R geostatistics packages} Package \code{gstat} (Pebesma, 2004) is an R package that provides basic functionality for univariable and multivariable geostatistical analysis, including \begin{itemize} \item variogram modelling, residual variogram modelling, and cross variogram modelling using fitting of parametric models to sample variograms \item geometric anisotropy specfied for each partial variogram model \item restricted maximum likelihood fitting of partial sills \item variogram and cross variogram maps \item simple, ordinary, universal and external drift (co)kriging \item (sequential) Gaussian (co)simulation equivalents for each of the kriging varieties \item indicator (co)kriging and sequential indicator (co)simulation \item kriging in a local or global neighbourhood \item block (co)kriging or simulation for each of the varieties, for rectangular or irregular blocks \end{itemize} Other geostatistical packages for R usually lack part of these options (e.g. block kriging, local kriging, or cokriging) but provide others: e.g. package \code{geoR} and \code{geoRglm} (by Paulo Ribeiro and Ole Christensen) provide the model-based geostatistics framework described in Diggle et al. (1998), package \code{fields} (Doug Nychka and others) provides thin plate spline interpolation, covariance functions for spherical coordinates (unprojected data), and routines for spatial sampling design optimization. \section{Spatial data frames} As an example, we will look at the meuse data set, which is a regular data frame that comes with package \code{gstat} (remove the 88 from the colour strings to make a plot without alpha transparency on windows or X11): <>= library(sp) data(meuse) class(meuse) names(meuse) coordinates(meuse) = ~x+y class(meuse) summary(meuse) coordinates(meuse)[1:5,] bubble(meuse, "zinc", col=c("#00ff0088", "#00ff0088"), main = "zinc concentrations (ppm)") @ % the following is needed because lattice plots (bubble wraps xyplot) do not % show without an explicit print; in order not to confuse users, we hide this: <>= print(bubble(meuse, "zinc", col=c("#00ff0088", "#00ff0088"), main = "zinc concentrations (ppm)") ) @ and note the following: \begin{enumerate} \item the function \code{coordinates}, when assigned (i.e. on the left-hand side of an \verb|=| or \verb|<-| sign), promotes the \code{data.frame} meuse into a \code{SpatialPointsDataFrame}, which knows about its spatial coordinates; coordinates may be specified by a formula, a character vector, or a numeric matrix or data frame with the actual coordinates \item the function \code{coordinates}, when not assigned, {\em retrieves} the spatial coordinates from a \code{SpatialPointsDataFrame}. \item the two plotting functions used, \code{plot} and \code{bubble} assume that the $x$- and $y$-axis are the spatial coordinates. \end{enumerate} \section{Spatial data on a regular grid} <>= data(meuse.grid) summary(meuse.grid) class(meuse.grid) coordinates(meuse.grid) = ~x+y class(meuse.grid) gridded(meuse.grid) = TRUE class(meuse.grid) image(meuse.grid["dist"]) title("distance to river (red = 0)") library(gstat) zinc.idw = idw(zinc~1, meuse, meuse.grid) class(zinc.idw) spplot(zinc.idw["var1.pred"], main = "zinc inverse distance weighted interpolations") @ <>= print(spplot(zinc.idw["var1.pred"], main = "zinc inverse distance weighted interpolations")) @ If you compare the bubble plot of zinc measurements with the map with distances to the river, it becomes evident that the larger concentrations are measured at locations close to the river. This relationship can be linearized by log-transforming the zinc concentrations, and taking the square root of distance to the river: <>= plot(log(zinc)~sqrt(dist), meuse) abline(lm(log(zinc)~sqrt(dist), meuse)) @ \section{Variograms } Variograms are calculated using the function \code{variogram}, which takes a formula as its first argument: \verb|log(zinc)~1| means that we assume a constant trend for the variable log(zinc). <>= lzn.vgm = variogram(log(zinc)~1, meuse) lzn.vgm lzn.fit = fit.variogram(lzn.vgm, model = vgm(1, "Sph", 900, 1)) lzn.fit plot(lzn.vgm, lzn.fit) @ <>= print(plot(lzn.vgm, lzn.fit)) @ Instead of the constant mean, denoted by \verb|~1|, we can specify a mean function, e.g. using \verb|~sqrt(dist)| as a predictor variable: <>= lznr.vgm = variogram(log(zinc)~sqrt(dist), meuse) lznr.fit = fit.variogram(lznr.vgm, model = vgm(1, "Exp", 300, 1)) lznr.fit plot(lznr.vgm, lznr.fit) @ <>= print(plot(lznr.vgm, lznr.fit)) @ In this case, the variogram of residuals with respect to a fitted mean function are shown. Residuals were calculated using ordinary least squares. \section{Kriging} <>= lzn.kriged = krige(log(zinc)~1, meuse, meuse.grid, model = lzn.fit) spplot(lzn.kriged["var1.pred"]) @ <>= print(spplot(lzn.kriged["var1.pred"])) @ \section{Conditional simulation} <>= lzn.condsim = krige(log(zinc)~1, meuse, meuse.grid, model = lzn.fit, nmax = 30, nsim = 4) spplot(lzn.condsim, main = "four conditional simulations") @ <>= print(spplot(lzn.condsim, main = "four conditional simulations")) @ For UK/residuals: <>= lzn.condsim2 = krige(log(zinc)~sqrt(dist), meuse, meuse.grid, model = lznr.fit, nmax = 30, nsim = 4) spplot(lzn.condsim2, main = "four UK conditional simulations") @ <>= print(spplot(lzn.condsim2, main = "four UK conditional simulations")) @ \section{Directional variograms} The following command calculates a directional sample variogram, where directions are binned by direction angle alone. For two point pairs, $Z(s)$ and $Z(s+h)$, the separation vector is $h$, and it has a direction. Here, we will classify directions into four direction intervals: <>= lzn.dir = variogram(log(zinc)~1, meuse, alpha = c(0, 45, 90, 135)) lzndir.fit = vgm(.59, "Sph", 1200, .05, anis = c(45, .4)) plot(lzn.dir, lzndir.fit, as.table = TRUE) @ <>= print(plot(lzn.dir, lzndir.fit, as.table = TRUE)) @ Looking at directions between 180 and 360 degrees will repeat the image shown above, because the variogram is a symmetric measure: $(Z(s)-Z(s+h))^2=(Z(s+h)-Z(s))^2$. The first plot gives the variogram in the zero direction, which is North; 90 degrees is East. By default, point pairs are assigned to the directional variorgram panel with their nearest direction, so North contains everything between -22.5 and 22.5 degrees (North-West to North-East). After classifying by direction, point pairs are binned by separation distance class, as is done in the usual omnidirectional case. In the figure, the partial sill, nugget and model type of the model are equal to those of the omnidirectional model fitted above; the range is that in the direction with the largest range (45$^o$), and the anisotropy ratio, the range in the 135 direction and the range in the 45 direction, estimated ``by eye'' by comparing the 45 and 135 degrees sample variograms. Gstat does not fit anisotropy parameters automatically. We do not claim that the model fitted here is ``best'' in some way; in order to get to a better model we may want to look at more directions, other directions (e.g. try {\tt alpha = c(22, 67, 112, 157) }), and to variogram maps (see below). More elaborate approaches may use directions in three dimensions, and want to further control the direction tolerance (which may be set such that direction intervals overlap). For the residual variogram from the linear regression model using \code{sqrt(dist)} as covariate, the directional dependence is much less obvious; the fitted model here is the fitted isotropic model (equal in all directions). <>= lznr.dir = variogram(log(zinc)~sqrt(dist), meuse, alpha = c(0, 45, 90, 135)) plot(lznr.dir, lznr.fit, as.table = TRUE) @ <>= print(plot(lznr.dir, lznr.fit, as.table = TRUE)) @ \section{Variogram maps} Another means of looking at directional dependence in semivariograms is obtained by looking at variogram maps. Instead of classifying point pairs $Z(s)$ and $Z(s+h)$ by direction and distance class {\em separately}, we can classify them {\em jointly}. If $h=\{x,y\}$ be the two-dimentional coordinates of the separation vector, in the variogram map the semivariance contribution of each point pair $(Z(s)-Z(s+h))^2$ is attributed to the grid cell in which $h$ lies. The map is centered around $(0,0)$, as $h$ is geographical distance rather than geographical location. Cutoff and width correspond to some extent to map extent and cell size; the semivariance map is point symmetric around $(0,0)$, as $\gamma(h)=\gamma(-h)$. <>= vgm.map = variogram(log(zinc)~sqrt(dist), meuse, cutoff = 1500, width = 100, map = TRUE) plot(vgm.map, threshold = 5) @ <>= print(plot(vgm.map, threshold = 5)) @ The threshold assures that only semivariogram map values based on at least 5 point pairs are shown, removing too noisy estimation. % The plot is plagued by one or two extreme values, corresponding to cells % with very small number of point pairs, which should be removed. \section{Cross variography} Fitting a linear model of coregionalization. <>= g = gstat(NULL, "log(zn)", log(zinc)~sqrt(dist), meuse) g = gstat(g, "log(cd)", log(cadmium)~sqrt(dist), meuse) g = gstat(g, "log(pb)", log(lead)~sqrt(dist), meuse) g = gstat(g, "log(cu)", log(copper)~sqrt(dist), meuse) v = variogram(g) g = gstat(g, model = vgm(1, "Exp", 300, 1), fill.all = TRUE) g.fit = fit.lmc(v, g) g.fit plot(v, g.fit) vgm.map = variogram(g, cutoff = 1500, width = 100, map = TRUE) plot(vgm.map, threshold = 5, col.regions = bpy.colors(), xlab = "", ylab = "") @ <>= print(plot(v, g.fit)) @ <>= print(plot(vgm.map, threshold = 5, col.regions = bpy.colors(), ylab = "", xlab = "")) @ \section*{References} \begin{itemize} % \item Abrahamsen, P., F. Espen Benth, 2001. Kriging with inequality % constraints. Mathematical Geology 33 (6), 719--744. % \item Bivand, R.S., 2003. Approaches to classes for spatial data in R. % In: K.~Hornik \& F.~Leisch (Eds.), Proceedings of the 3rd International % Workshop on Distributed Statistical Computing (DSC 2003) March 20--22, % Vienna, Austria. ISSN 1609-395X; available from [1]. \item Burrough, P.A., R.A. McDonnell, 1998. Principles of Geographical Information Systems, 2nd Edition. Oxford University Press. \item Diggle, P.J., J.A. Tawn, R.A. Moyeed, 1998. Model-based geostatistics. Applied Statistics 47(3), pp 299-350. % \item Pebesma, E.J., Wesseling, C.G., 1998. Gstat, a program for % geostatistical modelling, prediction and simulation. Computers \& % Geosciences, 24 (1), pp. 17--31. \item Pebesma, E.J., 2004. Multivariable geostatistics in S: the gstat package. Computers \& Geosciences \href{http://dx.doi.org/10.1016/j.cageo.2004.03.012}{30: 683-691}. % \item Ver Hoef, J.M., Cressie, N.A.C, 1993. Multivariable Spatial % Prediction. Mathematical Geology, 25 (2), pp. 219--240. \item Wackernagel, H., 1998. Multivariate Geostatistics; an introduction with applications, $2^{\mbox{nd}}$ edn., Springer, Berlin, 291 pp. \end{itemize} \end{document} # g = gstat(NULL, "log.zinc", log(zinc)~1, meuse) # g = gstat(g, "log.zinc.res", log(zinc)~sqrt(dist), meuse) # lplot(vgm.map[["map"]], c("log.zinc", "log.zinc.res")) % vim:syntax=tex gstat/inst/external/0000755000176200001440000000000014646417261014206 5ustar liggesusersgstat/inst/external/ncp.shx0000644000176200001440000000037414646417261015516 0ustar liggesusers' ~VA@ıUA&(AFWA22n`27v xB@D6D FI(N XP[&`^ hN@l x gstat/inst/external/cluster.txt0000644000176200001440000000757214646417261016443 0ustar liggesusersX Y Primary Secondary Declustering_Weight 39.5 18.5 .06 .22 1.619 5.5 1.5 .06 .27 1.619 38.5 5.5 .08 .40 1.416 20.5 1.5 .09 .39 1.821 27.5 14.5 .09 .24 1.349 40.5 21.5 .10 .48 .944 15.5 3.5 .10 .21 1.214 6.5 25.5 .11 .36 1.619 38.5 21.5 .11 .22 1.146 23.5 18.5 .16 .30 1.821 .5 25.5 .16 .31 1.349 9.5 19.5 .17 .30 1.012 36.5 43.5 .18 1.60 .944 21.5 5.5 .19 .59 1.416 13.5 3.5 .19 .18 1.146 40.5 7.5 .19 .75 1.012 31.5 17.5 .22 .44 1.619 46.5 40.5 .24 .58 1.821 10.5 7.5 .26 .54 1.281 28.5 11.5 .28 .62 1.551 8.5 7.5 .28 .97 1.281 47.5 .5 .31 2.88 2.023 4.5 37.5 .32 .35 .944 14.5 21.5 .33 .48 1.619 22.5 48.5 .34 .48 2.023 18.5 6.5 .34 .23 1.619 3.5 38.5 .34 .51 .944 11.5 46.5 .40 .47 1.079 31.5 26.5 .45 .74 1.619 14.5 29.5 .46 2.52 1.025 14.5 43.5 .51 1.21 1.079 38.5 28.5 .57 5.55 1.083 45.5 14.5 .62 2.30 1.281 4.5 30.5 .65 1.06 1.416 6.5 41.5 .67 .43 1.821 7.5 12.5 .71 2.07 1.551 26.5 23.5 .79 1.40 1.281 8.5 45.5 .81 .80 1.821 14.5 46.5 .83 .72 1.079 13.5 24.5 .84 .60 1.012 26.5 1.5 .89 1.01 1.619 33.5 7.5 .92 .99 1.619 45.5 22.5 .93 1.29 1.416 48.5 25.5 .94 1.06 1.619 35.5 10.5 .96 .66 1.214 34.5 14.5 .99 .52 1.214 13.5 39.5 .99 1.53 1.821 7.5 18.5 1.01 .67 1.214 15.5 27.5 1.02 .66 1.146 3.5 33.5 1.10 1.09 1.146 11.5 15.5 1.11 .42 1.315 22.5 30.5 1.21 2.16 1.416 45.5 29.5 1.21 2.07 1.619 13.5 12.5 1.27 .61 1.517 22.5 11.5 1.34 2.15 1.821 17.5 34.5 1.36 2.58 1.619 39.5 43.5 1.37 1.45 1.146 3.5 23.5 1.38 .99 .944 30.5 22.5 1.38 1.37 1.416 46.5 13.5 1.66 4.68 1.079 30.5 9.5 1.70 1.30 1.349 27.5 32.5 1.71 3.61 .944 12.5 34.5 1.78 6.25 1.497 25.5 4.5 1.81 1.37 1.416 27.5 34.5 1.82 4.73 1.146 45.5 6.5 1.89 1.89 2.023 3.5 47.5 1.96 3.47 2.023 33.5 31.5 1.98 4.96 .571 41.5 26.5 2.13 1.80 1.281 19.5 20.5 2.17 1.41 1.416 .5 41.5 2.33 1.98 1.619 5.5 22.5 2.34 1.25 .944 43.5 10.5 2.47 1.80 .877 41.5 45.5 2.75 2.65 1.619 28.5 42.5 2.76 7.66 .573 21.5 34.5 2.84 3.66 1.416 16.5 13.5 2.99 2.74 .870 23.5 24.5 3.04 1.66 1.079 2.5 1.5 3.33 1.89 1.619 47.5 44.5 3.35 2.94 1.821 39.5 38.5 3.51 .87 .958 46.5 34.5 3.81 4.44 2.023 35.5 45.5 4.60 4.70 .787 25.5 25.5 4.89 2.10 1.281 28.5 44.5 5.05 5.18 .587 19.5 42.5 5.15 2.19 2.023 38.5 36.5 5.31 3.29 .347 2.5 9.5 6.26 17.02 .292 32.5 36.5 6.41 2.45 .348 .5 8.5 6.49 14.95 .328 31.5 45.5 7.53 10.21 .306 9.5 29.5 8.03 5.21 .445 39.5 31.5 8.34 8.02 .341 17.5 15.5 9.08 3.32 .445 2.5 14.5 10.27 5.67 .429 30.5 41.5 17.19 10.10 .360 35.5 32.5 18.76 10.76 .261 37.5 36.5 3.64 3.86 .311 38.5 35.5 3.59 4.99 .324 38.5 37.5 9.08 1.68 .499 39.5 36.5 2.22 3.23 .482 1.5 9.5 7.56 19.74 .272 2.5 8.5 8.90 12.32 .348 2.5 10.5 2.55 15.91 .309 3.5 9.5 7.92 12.01 .444 31.5 36.5 4.29 2.49 .438 32.5 35.5 2.33 2.30 .335 32.5 37.5 3.21 2.75 .510 33.5 36.5 7.71 2.82 .315 .5 7.5 12.74 14.04 .682 .5 9.5 15.77 22.46 .272 1.5 8.5 20.35 14.09 .328 30.5 45.5 5.54 9.00 .339 31.5 44.5 5.38 9.08 .306 31.5 46.5 15.77 11.87 .665 32.5 45.5 10.20 9.61 .360 8.5 29.5 9.01 4.38 .566 9.5 28.5 9.27 4.40 .769 9.5 30.5 3.56 5.84 .546 10.5 29.5 2.52 6.19 .479 38.5 31.5 18.64 11.79 .298 39.5 30.5 7.94 7.09 .425 39.5 32.5 2.28 9.32 .341 40.5 31.5 2.51 4.96 .493 16.5 15.5 19.44 3.60 .445 17.5 14.5 2.96 3.17 .546 17.5 16.5 2.97 3.62 .566 18.5 15.5 4.92 2.86 .769 1.5 14.5 5.54 5.92 .733 2.5 13.5 8.71 11.72 .345 2.5 15.5 2.74 4.07 .789 3.5 14.5 3.61 5.03 .497 29.5 41.5 58.32 10.26 .450 30.5 40.5 11.08 9.31 .396 30.5 42.5 21.08 10.26 .326 31.5 41.5 22.75 8.21 .427 34.5 32.5 9.42 6.76 .413 35.5 31.5 8.48 12.78 .419 35.5 33.5 2.82 9.21 .271 36.5 32.5 5.26 12.40 .252 gstat/inst/external/ncp.shp0000644000176200001440000020355414646417261015513 0ustar liggesusers' VA@ıUA&(AFWAPAVAAg%AFWAZ P"A߯VA@"A#VA"A`LVA 4"A`jVAc"AVA`}:"AuVA("A RVA L"AҩVA!A෨VAl!AVA!A@צVA1!A`2VA!A@VA@B!AdVA!AdVA`!AʠVAC!AVA!AJVA2!AVA.T!AWVA Q!AVA9!A@ӦVA@Q&!AtVA !A`VA A ,VAP A|VA` A۞VAh A4VAmC AYVA3 AVAAVA?A`eVA ]A1VAAnVAAjVApxA@QVAWA@_VAAnVAPAVAAWAAFWA!A@eWA)#A@AWA*3#AWA;%A@VAAg%A@VA`\%A@VA`:X%A@VVA`^%AVA u]%A@VAS%A VAC%A@cVA sD%ABVA`D%A@HVA 6%AVA`P#%ANVA4 %A@!VA`$AVA-$AVA$A@VAc$A@VA$AhVA`$AVA`$AbVA`$AMVA"$AXVA $A$VA`U|$AVAIK$A0VA`%$AVA$AVA#AIVA#A2VA#AVA#ATVA`#AVA`#A@ȷVA #AVA%#AVA#AiVAލ#A@8VAw#A@'VAee#AVA`O#A@VA`5#AfVA`#AZVA`k#AVA` #AVA"A~VA P"A߯VAVAUAZ&A@VAAg%A@VAy%AVA%A@VA%AVA @%AVA%AVA%A^VA`>3&AVAZ&A9VAL&A@VA<@&A VA[1&AVA I&AVAj&A!VA &AVA &AzVA&A@&VA@=&AVAF &A`ҰVA &AVA &AVA j&A VA (%AVA%AyVA%AsVA`%A rVAo%AqVA >%AoVA%AhVA%AaVA%ANVA@%AVA %AVAU%A@VA%AeVA%A VA {%A@ٮVA%AVA w%A@GVA %AVA%AVA`d%AVVA@&%AVA%AVA%AMVA%AVA%AVAG%A`*VA@%A@êVA)%AVVA N%AکVAi%A`VA%AVA%A¨VA+%AVA@'%A\VA`F%A`(VAl%A VA~%A VAz%AVA`zv%A`|VAVr%A iVA*n%A@YVAj%AHVAe%A0VAa%AVA]%A`VA Y%AѦVAU%A@VAR%AhVA|N%AVA J%AҥVA@eG%AVA C%AXVA ?%A+VA;%A`VA7%A VA t3%AƤVAV/%A@VA@/+%AVA'%A VA@"%AVA`%A sVA%A`gVAX%A@\VA,%APVA %ADVA %A 9VA%A-VA %A VAV$A@VA,$A VA $AVA`$A`ףVA`$AVA$AVA@$AVA ]$A`VA0$A`ãVA$AңVA$AݣVA $AVA}$AVAP$A@VA$$AVA`$AVAʺ$AVA$A` VA@o$AVA A$A@VA@$A@VA@$A`VAϡ$AۣVA $AӣVAt$A`ԣVAC$A@ףVA$A@֣VA@$ẠVA$A`VA$A`VA`\$A VA+|$A@VAw$AVAs$AVAo$AඣVAqk$AணVA@Lg$AVA +c$AVA _$AnVA@Z$A`WVA V$AAVAR$A -VA@~N$AVAYJ$AVA 6F$A VA@B$A`עVA=$A VA9$AVA5$AVA1$A hVA-$A`CVA)$AVA%$A@VA !$AมVA` $AVA F$A`IVA`$AVA $AVA $A`rVA; $A%VA$AݟVA$A@VAH$AaVA |#A(VA #A`VA#A VA@#AVA G#AFVA`#AVA@#AÝVA`#A`yVA@'#A*VA`#A؜VA`#AVA 6#A`3VA`#AVA@#AVA`t#A 5VA >#AޚVA#AVA#A8VAB#A`VA#AVA #AdVAZ#A&VA`#AVAɬ#A@VA #AyVA4#A@VA@\#A VA{#AؗVA`#AगVAΕ#AmVA`#A5VA9#A@VA {#A@VĂ#AVA2#A;VA#A VA@|#AVAx#AeVAu#A VAq#AєVA n#AVAj#A;VABg#AVAc#AVA``#AHVA<]#A VAY#AஒVA 'V#AlVA@kR#A0VA@N#AVAJ#A ÑVAF#A@VA C#A XVA`B?#AVA;#AVA 8#AVA4#ADVA1#AVAk.#AVA*#A`IVA ,'#A VA`J##A@ԎVA#AVA#A 6VA<#A`͍VA@#A[VA#AVA#A@oVA #AVA#A@tVA4#A`VA! #A`VA@ #AVA`#AVA#A`YVA #A VA`"AVA@ "A6VAW"AЇVA "A@jVA@"A`VAH"AVA`"A3VA "AʅVAy"A aVA"A@VA}"A@VA`"AVA"AVAs"A=VA`/"A͂VA`"A\VA@"AVAn"AyVA&"A VA"AVA`"A*VA7"A`VA"AJVA`"A@~VAG"A`k~VA@"A }VA"A}VA~"A`}VAJ"A|VA"A@5|VA@"A@{VA@Ӵ"AN{VA࿲"AzVA"AdzVAͮ"AyVA "AuyVA9"A xVA@"AxVA`"AxVA"AwVA`"A wVA"A@vVA!"AvVAk"A uVA N"AuVA6"A~tVA "A@sVA@"A |sVAښ"A`rVA@"A`{rVA`P"A`qVA"A@~qVA@l"AqVA@"A pVA@"A@pVA+"AoVA "AoVA"AnVA@"AnVA%"A~mVA@L"AlVA@f"AxlVA@e"A@kVA:"AvkVA"AjVAՅ"AjVA@"AjVA`R"AiVA"A iVA "AhVA7"A`hVAs~"AgVA}"AfVAS}"AyfVA|"AeVA |"A`oeVA|"AdVA|"AcdVA|"A`cVA@|"A WcVA}"AbVA`}"AJbVA}"AaVA}"A _VA`}"A '_VA6}"A^VAU}"A@^VAL}"A]VA|"A ]VA{"A \VA`zz"A\VAy"A [VAcy"A [VAy"AZVA`x"AYVAx"A`tYVAx"A`XVAUx"AhXVA`2x"AWVAx"A\WVAw"AVVAw"A QVVAw"A`UVA`Bw"AEUVAv"ATVAv"A :TVA`dv"ASVAv"A /SVAu"ARVA`u"A$RVA`t"AQVAJt"A@QVAs"A`PVA`$s"A` PVAAr"A`OVA@q"A OVAfo"ANVA-m"A#NVAj"AMVA g"AOMVA2e"A`LVAb"AxLVA _`"A LVA`^"A@KVA`["A+KVAuY"A`JVA_W"A`FJVAlU"AIVA@S"AWIVA`Q"AHVAO"A kHVAiM"AGVAJ"AGVA nH"A`"GVAE"AFVA LC"A NFVA@@"A EVA>"A`lEVA`<"ADVA ;"A}DVA9"ADVA7"ACVA@ 5"ACVAJ3"ABVA1"A'BVA/"AAVA -"A`=AVA`*"A@VA'"A|@VA%"A`@VA 6#"A?VA!"A@!?VA "A`>VA`"A1>VA`"A`=VAg"A N=VA'"AVA}&A8VA }&A 5VAvy&AVA x&A@ݧVA`x&A VA5]&AVA` ]&A8VAFW&AnVA@P&A}VAI&A`VAjA&A ڧVA5:&AʧVA'7&A`ȦVA@6&AVA`%A`VA /%AVA%AVA@%AĢVA%AVAO%AVA@i%A@VA`n%AVVA`%A?VA@<%AVAʾ%AVA@\%A@VAt%A3VA%A@-VA@T%AVA`T%AǠVA@ %A@VAgf%AVAIA%AuVAB>%A@VA2%AVA+%AVA%%A}VA@%A@`VA.%A@(VA%AVA$AƜVA$AVA$AOVA$A,VAB$A VA@$A@ VA$AnVA$AМVAf$AVA@֔$AVA$AmVA$AGVA't$A VA1r$A@ VAn$AVAf$AVA@*`$AךVA@Y$AzVA@ZQ$A%VA@5G$AVA>$AVA/$AVA@$AЗVA% $A@іVAE#A&VA#A}VAR#A@VA@#A@VA`8#AVA@R#A@VA#A@VA¶#A@~VA`f#AђVA #A9VAJ#A@VA@k#A=VA@#AאVA@#AVAq#A`%VAm#AVAf#AVA@(`#AVAV#A5VAM#AVA@H#A(VAiB#ApVA=#A@ЅVA<:#A@"VAI8#AVA`5#AVA?1#AVA@L+#AZVA@v$#AVA#AρVA#AVA`#A@VA #AɀVA #A@gVAc"A{VA"AzVA"AxVA"A}vVA"A7tVA@"ArrVA@R"A@9qVA"AoVA"AnVA"AlVA"A]kVAT"AxjVA@G"AoiVA5"A@hVAk"A@gVA"AgVA "A`KbVA "A8bVA"A bVA@9"AaVAN"An_VA"A]VA`O"A@\VA"AG[VAv"AYVA`]"AgXVAԻ"A:VVAB"A@1TVAR"A@RVAd"AKQVA@"A@APVA|"A2OVA "A*NVAk"AMVA@"A@KVA"ABJVA"AHVA@"AFVA@"ADVAF"A6DVA"ACVA@("A CVA"AAVA"A AVA"A@>VA"A;VA"A@9VA"A@+8VAN"A@6VA@"A5VA@"A 5VA>"A3VA@0"A2VA"A1VA"A@y1VA"A0VA_"A@Z0VA@"A/VA"A@1/VAW"As.VA"A.VA"Ax.VA}"A}.VA`"A.VA"A.VA"A/VA@"A/VAp"A.VA@"A.VAo"A.VA2"Af.VA"A@I.VA"A#.VA]"A@.VA`"A-VA@"Ae-VA@2"AF-VA "A-VA@܊"A@c-VA@ҍ"A@ -VA` "A@-VAd"A@M-VA"AY-VA`)"A-VA7"A[-VA@Ђ"A,VAA"A@B,VA"A+VA"A*VA@|"A:)VAMv"A&VA s"A%VAl"A#VA`Ud"A!VA@]"AVAqZ"AVAU"AqVA@M"A/VAD"AVA ="AVA@Q6"A.VAM1"AVA@,"A@ VA`("AVA!"A@`VA@"A@ VA@"A VA@ "Ah VAd"A@ VA@:!AVA`'!A@VA@ !AVA!A%VA`'!AVA`!AVA.!AVAy!AAVA!AmVAo!AVA!AVA !A@?VAy!AIUA[!ATUA`J!AUA@!!A@,UAѧ!A&UA`ע!A$UAo!A@UAF!AKUA!A UA!AUA !A "UAt!A*UA f!AUA@{g!A6UAj!A`UAn!A@UA_r!A UAu!A LVAx!A VA`{!AVA`~!A\VA݁!AVA@!A!VAQ!AVA`!AVA!A`oVAF!A@VA੎!AhVA!AVAn!A eVA !AVAڔ!AYVA`!AVAV!A@MVA`!AVA ܛ!A`@VA !AVAI!A4 VA@Ġ!A VA`0!A0 VA`!A VAb!A' VA)!A@ VAƨ!A VA !A VA!A VA!A@ VA!A$VA_!A VA!A-VA@!A`VA !A@7VA`!A VA@F!A`@VA!AVA !AHVA]!AVA!APVA!AVA`!AUVA@&!AVA`!AYVA!A@VAݶ!AeVA!AVAB!ArVAZ!AVA+!AkVA!A@VAʽ!A]VA u!AVA !A`SVA!AVA!AGVAH!AVA!A<VA !AVAK!A@2VA!A@VA (!A .VAC!A VA!!A 2VA!AVA!A7 VA !A VA`'!A@:!VAK!A@!VA@z!A;"VA!A"VA!A@;#VA v!A#VAI!A3$VA!A$VA@y!A)%VA!A%VA X!A6&VA!A &VA!A`6'VA!A'VA!A#(VA!A(VA@!A@)VA!A@)VA`W!A*VA !A*VA !A`+VA+!A+VA@!A@,VA"!A@,VA!A-VA!A-VAE!A'.VA!A.VA!A2/VA!A/VA0!A;0VA@!A@0VAa!AD1VA!A1VAv!AO2VA !A2VA@y!A Z3VA`!A`3VA!Ad4VA`H!A4VA!Aj5VA@!A@5VA`|!Ah6VAm!A6VA~!AV7VA`"A7VA@"A68VA`1"A 8VA/"A 9VA "A`9VA "A:VA "A:VA0"A;VA "A;VA"A@;VA"AkVA "A`>VA!"A@!?VA 6#"A?VA%"A`@VA'"A|@VA`*"A@VA -"A`=AVA/"AAVA1"A'BVAJ3"ABVA@ 5"ACVA7"ACVA9"ADVA ;"A}DVA`<"ADVA>"A`lEVA@@"A EVA LC"A NFVAE"AFVA nH"A`"GVAJ"AGVAiM"AGVAO"A kHVA`Q"AHVA@S"AWIVAlU"AIVA_W"A`FJVAuY"A`JVA`["A+KVA`^"A@KVA _`"A LVAb"AxLVA2e"A`LVA g"AOMVAj"AMVA-m"A#NVAfo"ANVA@q"A OVAAr"A`OVA`$s"A` PVAs"A`PVAJt"A@QVA`t"AQVA`u"A$RVAu"ARVAv"A /SVA`dv"ASVAv"A :TVAv"ATVA`Bw"AEUVAw"A`UVAw"A QVVAw"AVVAx"A\WVA`2x"AWVAUx"AhXVAx"A`XVAx"A`tYVA`x"AYVAy"AZVAcy"A [VAy"A [VA`zz"A\VA{"A \VA|"A ]VAL}"A]VAU}"A@^VA6}"A^VA`}"A '_VA}"A _VA}"AaVA`}"AJbVA}"AbVA@|"A WcVA|"A`cVA|"AcdVA|"AdVA |"A`oeVA|"AeVAS}"AyfVA}"AfVAs~"AgVA7"A`hVA "AhVA"A iVA`R"AiVA@"AjVAՅ"AjVA"AjVA:"AvkVA@e"A@kVA@f"AxlVA@L"AlVA%"A~mVA@"AnVA"AnVA "AoVA+"AoVA@"A@pVA@"A pVA@l"AqVA"A@~qVA`P"A`qVA@"A`{rVAښ"A`rVA@"A |sVA "A@sVA6"A~tVA N"AuVAk"A uVA!"AvVA"A@vVA`"A wVA"AwVA`"AxVA@"AxVA9"A xVA "AuyVAͮ"AyVA"AdzVA࿲"AzVA@Ӵ"AN{VA@"A@{VA"A@5|VAJ"A|VA~"A`}VA"A}VA@"A }VAG"A`k~VA`"A@~VA"AJVA7"A`VA`"A*VA"AVA&"A VAn"AyVA@"AVA`"A\VA`/"A͂VAs"A=VA"AVA`"AVA}"A@VA"A@VAy"A aVA "AʅVA`"A3VAH"AVA@"A`VA "A@jVAW"AЇVA@ "A6VA`"AVA #A VA#A`YVA`#AVA@ #AVA! #A`VA4#A`VA#A@tVA #AVA#A@oVA#AVA@#A[VA<#A`͍VA#A 6VA#AVA`J##A@ԎVA ,'#A VA*#A`IVAk.#AVA1#AVA4#ADVA 8#AVA;#AVA`B?#AVA C#A XVAF#A@VAJ#A ÑVA@N#AVA@kR#A0VA 'V#AlVAY#AஒVA<]#A VA``#AHVAc#AVABg#AVAj#A;VA n#AVAq#AєVAu#A VAx#AeVA@|#AVA#A VA2#A;VĂ#AVA {#A@VA9#A@VA`#A5VAΕ#AmVA`#AगVA{#AؗVA@\#A VA4#A@VA #AyVAɬ#A@VA`#AVAZ#A&VA #AdVA#AVAB#A`VA#A8VA#AVA >#AޚVA`t#A 5VA@#AVA`#AVA 6#A`3VA`#AVA`#A؜VA@'#A*VA`#A`yVA@#AÝVA`#AVA G#AFVA@#AVA#A VA #A`VA |#A(VAH$AaVA$A@VA$AݟVA; $A%VA $A`rVA $AVA`$AVA F$A`IVA` $AVA !$AมVA%$A@VA)$AVA-$A`CVA1$A hVA5$AVA9$AVA=$A VA@B$A`עVA 6F$A VAYJ$AVA@~N$AVAR$A -VA V$AAVA@Z$A`WVA _$AnVA +c$AVA@Lg$AVAqk$AணVAo$AඣVAs$AVAw$AVA+|$A@VA`\$A VA$A`VA$A`VA@$ẠVA$A@֣VAC$A@ףVAt$A`ԣVA $AӣVAϡ$AۣVA@$A`VA@$A@VA A$A@VA@o$AVA$A` VAʺ$AVA`$AVA$$AVAP$A@VA}$AVA $AVA$AݣVA$AңVA0$A`ãVA ]$A`VA@$AVA$AVA`$AVA`$A`ףVA $AVA,$A VAV$A@VA %A VA%A-VA %A 9VA %ADVA,%APVAX%A@\VA%A`gVA`%A sVA@"%AVA'%A VA@/+%AVAV/%A@VA t3%AƤVA7%A VA;%A`VA ?%A+VA C%AXVA@eG%AVA J%AҥVA|N%AVAR%AhVAU%A@VA Y%AѦVA]%A`VAa%AVAe%A0VAj%AHVA*n%A@YVAVr%A iVA`zv%A`|VAz%AVA~%A VAl%A VA`F%A`(VA@'%A\VA+%AVA%A¨VA%AVAi%A`VA N%AکVA)%AVVA@%A@êVAG%A`*VA%AVA%AVA%AMVA%AVA@&%AVA`d%AVVA%AVA %AVA w%A@GVA%AVA {%A@ٮVA%A VA%AeVAU%A@VA %AVA@%AVA%ANVA%AaVA%AhVA >%AoVAo%AqVA`%A rVA%AsVA%AyVA (%AVA j&A VA &AVA &AVAF &A`ҰVA@=&AVA&A@&VA &AzVA &AVAj&A!VA I&AVA[1&AVA<@&A VAL&A@VAZ&A9VA`&A VAU&A@VA 3&A֬VA&A@VA@&ArVAL&A@VA&A@VAa&A@VAU&A VAv&A VA3&A֬VA_&AVA&(A@VA3&A֬VAv&A VAU&A VAa&A@VA&A@VA&AVAA'AVA}'A¥VAj'A VAe'AVA@i'ARVAu'AVA(AXVA&(A@dVA(A@VA@ 'A`_VA'AMVAW'AVA 'AVA 'A@VAV'AVA@'AVA`v'AVA'AVA۾'A'VA'ARVAh'AiVA`'A@1VAڵ'A]VA`'AVA@'AVA'AVA ʦ'AĉVAԣ'A҉VA'A؉VA'AىVA@'AVA@O'A/VAt'AVA`D'AVA@'AVA,'A:VA@'AVA'AtVA`'AVAא'A`VA'AdVA+'A֍VAb'A+VA@ 'AVA1'AVA@k'AVA'A؎VAՓ'AVA'A@VA@Õ'APVA@'A`VA@t'AVAѕ'AΏVA@'AVA`/'AVAB'AVA@D'A>VA 'A)VA`/'A@VA'A VAچ'A VA4'AVA 'A@VA<'AVA4}'AVAz'A@!VA`{v'A$VAt'A,VA@s'A@"VAr'A@VA\'A@]VAa\'AVAX'A`VAeT'A@VAzK'AZVA`H'AVA@HI'A‘VA~E'A@VAQD'A@VA@'AVA@@'A.VA>'AVA:'AҒVA7'AVA4'AcVA.'A֓VA.'AVA-'AVA`-'AkVA@,'A@הVA+'AtVA@+'AVA*'AVAf)'AjVA('AЖVA]('A4VA''AVA('A@VA''A@4VA1%'ANVA%'AVA@&'AȘVA`!'A@VAK 'AVA@%'AVA'A)VA'A vVA@'AVAr'A&VA@ 'AVA@!'ADVA'A@ȝVA@'AVA 'AVA@;'A VA@B 'AVA@Z 'AVA'AVA'A@VA@&AVA@z&A@gVA@'AlVA'AVA@'A͞VA@T'A@=VA &A@VA&AVA@&AVAj&A`'VA&A`VAϝ&A`˨VA_&A cVA3&A֬VA x7$AVA@&A cVAl_&A cVAϝ&A`˨VA&A`VAj&A`'VA@&AVA&AԞVA&A>VA'&AVAQ&A`џVA6&A@VA@7&AVA&AVA&AŸVA/&AVA`&AZVA@|&AFVAӷ&A`VA&AVA^&A`VAi&AVA&AxVA@&AIVAW&AVA@h&AVA`7&AiVA&A VA̓&A@VA3&AVA&A@pVA?&AAVA&AVA`Ä&AVA.&AVA~&AVAZ}&AVA`s&AiVA`4o&A9VA2n&A@1VA`m&A`-VAc&AVAY&AƚVAO&AVAJ&AVA@D&A0VA@=&AVA9&AVA@7&AٙVA6&AVA4&AVAu/&AVA@7+&A@oVA='&A@cVAc#&AvVA@k&A_VA>&AԘVA` &AUVA@&AVA&A@NVA`%AVA%AQVA ]%A-VA%A@VA%AVA@&%AVAW%AVA`%A@VA%AVAV%AVA%AVA%AݗVA%A`VA,%A VA`%A;VA@ܴ%A`VA1%A@ܖVA`s%A@VA@k%A5VA%A8VAx%AwVA`W%A8VA%AVA%A@3VA3%A@fVA`z%A@5VA@}%A@YVA@3z%A5VAn%AVAm%AVA@Wg%AіVARc%A@ɖVAu[%AVAR%A@VAL%AVA@K%AVA`J%AVA@I%AؕVAcG%AÕVAE%A`VAlD%AVAi>%AXVA.1%A@VAU/%A VA@+%AVA(%AVAo&%AVA@$%AVA'"%A@VAI!%AVA%AVA%AVA%A@VA@ %A@GVAK %AHVA`Z %A`VA%AVA%AVA%AVA@$AwVA$A VA@|$A@VA$A@]VA`$AMVA$AVA$A@ȐVAv$AVA@$A@VA$AfVA4$A>VA$A@$VA@e$AVA$A_VA@$AۍVA$AVA`~$AƍVA@$A@sVA@o$AHVA@$AOVA:$A@#VA@$AVA@>$AVAϲ$AVA$A@mVAe$A8VA@e$AVA$AVAB$AVA$AVA`p$AVA@$AVA_$AVAה$AVA7$A`MVAl9$AOVA`=$AYVAlB$A@VAD$AŕVAD$AVAmC$AQVAA$AgVA@A=$AVA:$A@̖VA8$AVA:$AVA@<$AVA?$AVAA$AVAD$A@VAF$AVA@E$A@ӖVAD$AVAuB$AiVA!C$AVAE$A1VAH$A@VAL$A@ VAXO$AFVA4R$AVA@U$AVA@ Y$A?VA;[$A@UVA/]$A@FVA@*`$AFVA@Bf$AVA@hj$AVAk$AVAhk$AOVA1m$AVA`Go$AVA-r$AVA`r$A˙VAr$AVA@t$A1VAw$A@KVA@y$AKVAz$AZVA@z$AVA@ x$A@VAv$AVA't$A VA$AGVA@\$A@VA@o$A@VA`$AVA$AVA($A@VA|$A@VAl$AVA$AVA`4$A@VA`$A@jVA_$A@3VA$A)VA9$ACVAH$A9VA@$A-VA$A@HVA$A?VAw$A9VAc$AEVA@$A\VAx$A@VA$AVA@$AVA$AҘVA)$A@VA$AVA@$A@7VA>$A@sVA`$A@ƙVA@$A@VA@p$A0VAy$A@BVAr$AJVA?$A?VA$A@FVA$A4VA5$AVA$A!VA$A'VA+$A@VA$AVA$AVA$AVA$A@VA$AVA.$AVA[$AVA9$AVA`$A#VA@$ANVA-%A|VAS%AVA%AҚVA@%AVA5%A@_VAy%AVA%A@VA@!%AVA"%AVAC&%A#VA@)%A[VA.%AFVA@15%A@KVA`f7%AnVA>%A@VVAB%A@VAE%A@VAF%A@VAD%A@KVAIA%AuVAgf%AVA@ %A@VA`T%AǠVA%%AVA@L%A@VA6%A@KVA"%AVA%AVA@1%A?VAۗ%A@jVA%AVA@d%AVA%AVA%A@VAy%A@)VA %AVAA%AlVAK%AVAU%A@VAu%AvVAN%AVA@,%AVA>%AVA@8%A+VAС%AdVA@=%AVA@%AÝVA@Ѩ%A@8VA%A@gVA%AgVA`%AkVA;%AVA%AVA%AVA%AΞVA@%A@ɞVA@ %AڞVA@.%A VA@%A@IVA%AVA_%A@!VA@%A@VA`%AVA~%AɠVA`%A@ VA%A@eVA%AyVA@)%AVA[%AVA&A,VA2&A@XVA&AVA /%AVA`%A`VA@6&AVA@i;&AYVA?&AޥVABE&A \VAM&A EVA@;R&AVAW&A@VA`]&A@VA5]&AVA`x&A VA_x&AVA@y&AfVA`z&ArVAT|&A@nVA~&AKVAz&AVA~&AVA@y|&AVA|&AVA}&AVA`;&AVA&A˦VA`&A ĦVAQ&AVA&AVA &AVA~&AVAE&A@VA@1&A@VA&A9VAQ&ArVA@n&AVA\&AߧVAЊ&A@VA&A@0VA`&AHVA&A@fVA`<&AlVA&AeVA_&A cVA@_x&AVA&AlVA%&AeVA`<&AlVA&A@fVA`&AHVA&A@0VAЊ&A@VA\&AߧVA@n&AVAQ&ArVA&A9VA@1&A@VAE&A@VA~&AVA &AVA&AVAQ&AVA`&A ĦVA&A˦VA`;&AVA}&AVA|&AVA@y|&AVA~&AVAz&AVA~&AKVAT|&A@nVA`z&ArVA@y&AfVA_x&AVA`x&A VA x&A@ݧVAvy&AVA }&A 5VA}&A8VAM~&A>VA#&AdVA&AeVA@6&A EVA`]&A ڧVA'7&A`ȦVA5:&AʧVAjA&A ڧVAI&A`VA@P&A}VAFW&AnVA` ]&A8VA5]&AVA`]&A@VAW&A@VA@;R&AVAM&A EVABE&A \VA?&AޥVA@i;&AYVA@6&AVA'7&A`ȦVA  %AVA2&AĢVAA /%AVA&AVA2&A@XVA&A,VA[%AVA@)%AVA%AyVA%A@eVA`%A@ VA~%AɠVA`%AVA@%A@VA_%A@!VA%AVA@%A@IVA@.%A VA@ %AڞVA@%A@ɞVA%AΞVA%AVA%AVA;%AVA`%AkVA%AgVA%A@gVA@Ѩ%A@8VA@%AÝVA@=%AVAС%AdVA@8%A+VA>%AVA@,%AVAN%AVAu%AvVAU%A@VAK%AVAA%AlVA %AVAy%A@)VA%A@VA%AVA@d%AVA%AVAۗ%A@jVA@1%A?VA%AVA"%AVA6%A@KVA@L%A@VA%%AVA`T%AǠVA@T%AVA%A@-VAt%A3VA@\%A@VAʾ%AVA@<%AVA`%A?VA`n%AVVA@i%A@VAO%AVA%AVA@%AĢVA%AVA /%AVA @o$A)VAF%AVAZIA%AuVAD%A@KVAF%A@VAE%A@VAB%A@VA>%A@VVA`f7%AnVA@15%A@KVA.%AFVA@)%A[VAC&%A#VA"%AVA@!%AVA%A@VAy%AVA5%A@_VA@%AVA%AҚVAS%AVA-%A|VA@$ANVA`$A#VA9$AVA[$AVA.$AVA$AVA$A@VA$AVA$AVA$AVA+$A@VA$A'VA$A!VA5$AVA$A4VA$A@FVA?$A?VAr$AJVAy$A@BVA@p$A0VA@$A@VA`$A@ƙVA>$A@sVA@$A@7VA$AVA)$A@VA$AҘVA@$AVA$AVAx$A@VA@$A\VAc$AEVAw$A9VA$A?VA$A@HVA@$A-VAH$A9VA9$ACVA$A)VA_$A@3VA`$A@jVA`4$A@VA$AVAl$AVA|$A@VA($A@VA$AVA`$AVA@o$A@VA@\$A@VA$AGVA$AmVA@֔$AVAf$AVA$AМVA$AnVA@$A@ VAB$A VA$A,VA$AOVA$AVA$AƜVA%AVA.%A@(VA@%A@`VA%%A}VA+%AVA2%AVAB>%A@VAIA%AuVA (@#A4VA@z$AVA7$A`MVA`4$AJVA@.$A@AVAR*$A@HVA&$AbVA"$AXVA$A VA$AVAC$AVAG$AaVA@$AVA $A@VA@B$A@!VA$AVA3$AVA@0$AVA3#AVA@l#AqVA#A9VA_#A/VA@#AcVA#A@VA#A@}VA#A@aVA#A$VA`4#A0VA@#A@)VAf#AǑVA#AVA`#A@VA#AVA#AVA@R#A@VA#AVA@#AVA#AVA|#AVA#AhVA#A VA#A@VA#A"VA`n#AȏVA@#AVA@G#AVA`#AVA-#A@VA`'#AfVA`#A@VA@#A@/VA`^#AVA@+#A@^VA#A4VA@#AHVAש#AVA@#AߎVA>#AVA@#A@VA@#AVA@#AאVA@k#A=VAJ#A@VA #A9VA`f#AђVA¶#A@~VA#A@VA@R#A@VA`8#AVA@#A@VAR#A@VA#A}VAE#A&VA% $A@іVA@$AЗVA/$AVA>$AVA@5G$AVA@ZQ$A%VA@Y$AzVA@*`$AךVAf$AVAn$AVA1r$A@ VA't$A VAv$AVA@ x$A@VA@z$AVAz$AZVA@y$AKVAw$A@KVA@t$A1VAr$AVA`r$A˙VA-r$AVA`Go$AVA1m$AVAhk$AOVAk$AVA@hj$AVA@Bf$AVA@*`$AFVA/]$A@FVA;[$A@UVA@ Y$A?VA@U$AVA4R$AVAXO$AFVAL$A@ VAH$A@VAE$A1VA!C$AVAuB$AiVAD$AVA@E$A@ӖVAF$AVAD$A@VAA$AVA?$AVA@<$AVA:$AVA8$AVA:$A@̖VA@A=$AVAA$AgVAmC$AQVAD$AVAD$AŕVAlB$A@VA`=$AYVAl9$AOVA7$A`MVA "Aj\VAה$AbVAT#A4VA@+#A@^VA`^#AVA@#A@/VA`#A@VA`'#AfVA-#A@VA`#AVA@G#AVA@#AVA`n#AȏVA#A"VA#A@VA#A VA#AhVA|#AVA#AVA@#AVA#AVA@R#A@VA#AVA#AVA`#A@VA#AVAf#AǑVA@#A@)VA`4#A0VA#A$VA#A@aVA#A@}VA#A@VA@#AcVA_#A/VA#A9VA@l#AqVA3#AVA@0$AVA3$AVA$AVA@B$A@!VA $A@VA@$AVAG$AaVAC$AVA$AVA$A VA"$AXVA&$AbVAR*$A@HVA@.$A@AVA`4$AJVA7$A`MVAה$AVA$ÅVA$A@VAq$A$VA~$AvVAy$A@ˈVAv$AVAq$AVA@Hn$AVA@ui$A@VAh$A VA6f$AVA`d$A`eVA|b$A@JVAa$A@3VA`G]$AԄVA@[[$AVA>W$A>VA@kV$AVA@R$AكVAP$A@VA:L$A%VAXK$A҂VAKF$A6VA`gB$AVA`@$AyVAp?$AHVA@?=$AVAq:$A1VA ::$AVA:$AVA@7$A~VA`5$A$~VA@4$A}VA`2$A@}VA@@1$Ad}VA@)1$A@}VAD4$A}VA@ 4$A@|VAS/$A|VAl.$A@|VA`$,$A.|VA@-$A|VAM.$A|VA0$A@{VA1$A{VA@u1$A@.{VA/$AzVA`/$AzVA@.$A@wVAt-$AIwVA (-$A wVA@,$A@vVAh)$AvVA$$A@uVA@$A@!uVA@!$AtVAC!$A@ptVA $A@/tVA` $AsVA$A@2sVA$A@rVA$AqVA$AqVA9 $AqVA@ $A@qVAj $A@WqVA>$A@-qVA@$AHqVA3#ApVA`f#AnVAh#A}kVA`Ȳ#A*iVAv#AZbVA@_u#A5bVA`u#AaVAq#AaVAp#A@aVAn#AbVAqm#A bVAj#AaVA@Rj#AaVAh#AaVA@c#AaVA@b#AaVA^#AaVAK]#AaVA@V#AaaVAR#AaaVA`#M#ABaVA[J#A`VA@G#A`VA3G#A`VA8E#A_VAA#A^VA@I?#A^VA`7=#A-^VA;#A^VA8#A@]VA6#A ]VA@O4#A@]VA2#Ar]VA/#AF]VA,#A]VA+)#A\VA"#A\VA"#Av\VA#Aj\VA@"A^VA;"A`VA"AaVA@v"A@vbVA"A`cVA`R"AcVA"A@ dVA"A0dVA"A^dVA"ASdVAy"AcVA"AcVA"A@cVA"A@cVA@"AcVA"A cVA@"AbVA"AcVA`"A@QdVA&"AndVA"A@dVA"AdVAF"A}dVA3"AsdVA@"AedVA6"A@MdVA@"ADdVA"AdVA"AcVA"AcVA "A`KbVA"AgVA@"AFgVA\"AfVA"AfVA"AJgVAL"AbgVA"AHgVA"A>gVA4"A@kgVA1"AgVA"A@hVA0"A+hVA@W"A hVA"A@gVA"AhVAW"A\hVA@"A@hVA@"AhVA"AhVAI"AiVA@u"A-iVA`D"AUiVA"AoiVA`s"ASiVA"A%iVA@V"AiVA/"AhVA"A@hVA}"A@hVA@C"AhVA"AiVA"AiVA"A@vVA$#AvVA%#AvVA@&#AvVA'#AwVA@'#ABwVA@%#AwVA`b #AxVA#A@yVA#AyVA#AyVA#A@yVA#A!zVA#AzVA#A&{VA3#A{VA}#A{VA@ #A@O|VA #An|VA@ #A|VA@#AA|VA.#A{VAc"A{VA #A@gVA@< #A5VA#AVA@#A@VAI#AVA@#A2VA#AVA2"#AVA@ (#AVA(#AVA`)#A@VA[,#AVA/#AaVA[2#A@VA^4#AVA27#AVA9#A@VA=#A@`VA@A#A@VA@F#A@VA`K#AKVA=M#A~VAL#AVAiL#A@VA K#AVA@I#A VA@vG#AVA@F#A@VAL#A@VA_Q#AVAV#AaVA`s\#AƆVA@_#A҆VA g#A@VAol#AVAr#AVA@v#AVAz#A@VAm~#AVA#AVA@#AVA#A%VA`#AVA@ŋ#AԉVA$#AVA`#A@>VA#AXVAT#AiVA!{#AxVAdu#A[VAxs#A7VAq#A`%VA@#AVA@#A@VA>#AVA@#AߎVAש#AVA@#AHVA#A4VA P #AVA`#AxVAGq#A`%VAxs#A7VAdu#A[VA!{#AxVAT#AiVA#AXVA`#A@>VA$#AVA@ŋ#AԉVA`#AVA#A%VA@#AVA#AVAm~#AVAz#A@VA@v#AVAr#AVAol#AVA g#A@VA@_#A҆VA`s\#AƆVAV#AaVA_Q#AVAL#A@VA@F#A@VA@vG#AVA@I#A VA K#AVAiL#A@VAL#AVA=M#A~VA`K#AKVA@F#A@VA@A#A@VA=#A@`VA9#A@VA27#AVA^4#AVA[2#A@VA/#AaVA[,#AVA`)#A@VA(#AVA@ (#AVA2"#AVA#AVA@#A2VAI#AVA@#A@VA#AVA@< #A5VA #A@gVA #AɀVA`#A@VA#AVA#AρVA@v$#AVA@L+#AZVA?1#AVA`5#AVAI8#AVA<:#A@"VA=#A@ЅVAiB#ApVA@H#A(VAM#AVAV#A5VA@(`#AVAf#AVAm#AVAq#A`%VA`T"AfVA'#A|VAi #An|VA@ #A@O|VA}#A{VA3#A{VA#A&{VA#AzVA#A!zVA#A@yVA#AyVA#AyVA#A@yVA`b #AxVA@%#AwVA@'#ABwVA'#AwVA@&#AvVA%#AvVA$#AvVA##A>vVA##A@%uVA##A tVAE$#AsVA`i##A+sVA-##A@rVA##AZrVA@"#ArVA@"#AqVA##AqVA##AqVA@##AgVA"AHgVAL"AbgVA"AJgVA"AfVA\"AfVA@"AFgVA"AgVAk"A@gVA5"A@hVA@G"AoiVAT"AxjVA"A]kVA"AlVA"AnVA"AoVA@R"A@9qVA@"ArrVA"A7tVA"A}vVA"AxVA"AzVAc"A{VA.#A{VA@#AA|VA@ #A|VA #An|VA A;UA !AUA5t!A*UA !A "UA?!A UA'!A@UA-l!A>UA#g!AUA`Ge!A@UAc!AmUAFa!AUA`Q_!AUA_!A@=UAb!AUAEe!AUA@f!ARUA@g!AuUAi!A@UA`l!A@UA5k!AZUAj!AUAl!A@UA`o!AKUAp!AdUAMp!AUA@]q!AUA8s!A8UA\z!AzUAx!A@+UA@u!AUA`t!A7UAs!AUA`p!AlUA@6m!A@UAk!A@fUAk!A@UA l!AUAo!A@UA@UA`?u!AsUAs!AfUAn!AKUAIl!AUA@?i!A@UA@e!AUAe!AkUA@c!AUA``!AjUA\!A@ UAW!AUAZV!AUA@%T!AUA@LQ!A@TUA@ O!AyUA@M!AUA1L!AUA`F!AUA?!AUA9!AUA`6!A{UA`w2!AQUA@\.!A5UA`+!AqUA'!AUA&!AUA@Uv!AUAy!AUA`A!A?UA&!AcUA@!AUA`΅!A@UA!AaUA!AJUA`!A/UA@!A9UAס!A UA/!A>UA@c!AUA!AUA@!AUAT!AUA!A!A$!AUA!AUA`.!AUAZ!AUA`!A1UA!AKUA!A@lUA !AqUA!AUAl!AUA!A@UA` AUA AUA AWUA A@UAi AUAs AUA A@UA A@xUA2 AUA AsUA AUA A@UAM A`UA' A@UA@ʵ AUA@ AUAP A@UA/ AUA@ܷ AUA) AUA. AUAĹ AUA@ AUA[ AUA- AUA@ A@UA A UA` AUA A@UA A UA`7 A@AUA AUA AUA@ AUAƾ AzUA@Ⱦ AMUA@ A/UA@> A@/UA6 ALUA" A@sUA A@UA AUA! AUA] AUA@ AUA A@UA`^ AUA AUAb A@UA AUA AUA AUA A@IUA AdUA AUA AUA& AUA AUA@ A@UA`v A@UA A@8UA@ AZUA$ AzUA@ A UA A@UA AUA A``UA AkUA AUA AUA( AUA AUA ANUA A@UA* AUA`X AlUA@i AUA@ AUA A@UA AUA`P AUA A@UA5 AMUA AUA A@VUA] AUA AjUA ALUA@ AzUA@o A\UA0 A@!UA` AUA!AUA!AUAk!A@UA@$ !APUA`!AcUA!AUA!ARUA`!AUAk!AOUA@ !AUA8!!AWUAg"!A@UA@#!A@UA@&!AUA`2!A.UA5!A=UA8:!AAUA@!AUA@>!A_UAC!AUA@E!AsUAJ!AUA`N!AUAP!AUA@xQ!A@UA@tR!AUAS!AUA@U!A@UAW!A@UApZ!A UA@\!A UAsa!A@UA@e!A_UA@i!AUA`un!AUApr!A+UA@{w!AgUA`z!AUA`}!AhUA!AzUA!A@UA!AAUA`!AxUAx!A@UA!AUA`E!AUA!AUA`̑!A@UA@!AUA!AUA`!AUA@p!A@FUA`!AUAo!AUA[!A AUA@B A:UA@oE AUAG AUA@uK AUAM AgUA)P AUAQ AUA@S AUA@̳ A@UA AxUA A@UA`@ ALUA A1UA AUA@+ A@UA` AtUA@ AUA@ AֺUAU AUA A\UAC AFUAL A@UA` A@UA A@UA@!AҷUA\!AUA !A5UAm!A@hUA!A_UA!AUA@M!AUA!AUAD !AUA#%!AUA)!AUA+!AUA@j/!AUA@u1!A@UAE3!AJUA@4!A@UA9!A@]UA7!AUA:!AUAE>!AUA@I@!A־UA`ZB!A@UAoD!A@9UA G!A@jUA)J!AUA@M!AUA`O!AUAS!AUAWX!AUA\!AUA_`!A~UA@e!A@UA`i!AͽUA(m!AUAp!AUA`$u!AdUAav!A"UAJx!AUAp{!AǼUA`{!AaUA`p|!AUA0~!A@UA`!A@}UA!A UA͈!A@UAڊ!AUAߏ!AUA@!AHUA@!AUA@!A׹UA!AUA!!A@KUA!A@(UAO!A@(UA@0!ACUA!AhUA!AUAb!AUA!AUAn!AyUA}!AUA)!A+UA`!AUA@U!AUA@!ADUA!A@UA!A˺UAO!AUA!AqUA@ !A'UA!ANUA!AUAi!AʷUA!A{UA AL_UA E A43UA_Tg AM0QvUA5B AutUA9u AdUAe A6FTUAMj Am!UAW A-(UA6Hh AlUA"5 AlUA${ A.LUA[oaq AIJZ*UA ' A`UA[ AZ6 UAPcM AUAl> A}aUA:^7 ACǙٍUAy] A UAW AsoKUAԸ`h A aUAa,5 AFdcШUA;ht AoUAИ A$EUA5(ꜽ A 9UAX I A@qUAV AsB0YUAjz A0>X|UAeq A;UA 1.5,10.787137,50.619179,907,EISENACH,160705008,,Schmiedefeld am Rennsteig,no,4.390458645846876 DEMV017,DEMV017,DE,Germany,Göhlen,1998-02-01,,Background,rural,rural,unknown,,11.362965,53.302353,25,GÖHLEN,130545416,,Göhlen,no,6.004551736946301 DEMV004,DEMV004,DE,Germany,Gülzow,1992-01-01,,Background,rural,rural,unknown,,12.064709,53.817772,17,,130535313,,Gülzow-Prüzen,no,6.843800975142158 DEBB053,DEBB053,DE,Germany,Hasenholz,2000-11-21,,Background,rural,rural,regional,,14.015253,52.563835,88,BUCKOW,120645408,,"Buckow (Märkische Schweiz), Stadt",no,9.110279139763184 DETH061,DETH061,DE,Germany,Hummelshain,1999-10-07,,Background,rural background,rural,remote,,11.661233,50.791618,357,,160745007,,Trockenborn-Wolfersdorf,no,5.704372785485123 DERP014,DERP014,DE,Germany,Hunsrück-Leisel,1984-01-01,,Background,rural,rural,unknown,,7.193486,49.741035,650,LEISEL,71345002,,Siesbach,no,5.223882314791547 DENI031,DENI031,DE,Germany,Jadebusen,1984-06-01,,Background,rural,rural,unknown,,8.09059,53.59617,2,,,3405000,"Wilhelmshaven, Stadt",no,10.450504669281006 DEHE060,DEHE060,DE,Germany,Kellerwald,2005-10-09,,Background,rural,rural,regional,,9.031753,51.154842,483,,,6635009,Edertal,no,6.500547300478271 DEHE052,DEHE052,DE,Germany,Kleiner Feldberg,1992-03-12,,Background,rural,rural,unknown,,8.446078,50.221943,811,,,6434003,Glashütten,no,6.913817430801052 DEBY004,DEBY004,DE,Germany,Kleinwallstadt/Hofstetter Straße,1978-08-01,,Background,suburban,rural,near city,,9.171545,49.869419,124,KLEINWALLSTADT,96765630,,"Kleinwallstadt, M",no,17.107523426602675 DEMV024,DEMV024,DE,Germany,Leizen,2010-06-16,,Background,rural,rural,unknown,,12.463929,53.396348,116,,130565621,,Leizen,no,6.520525826751615 DEHE042,DEHE042,DE,Germany,Linden/Leihgestern,1995-04-05,,Background,rural,rural,unknown,,8.684398,50.532963,172,,,6531012,"Linden, Stadt",no,17.19400233075487 DEMV012,DEMV012,DE,Germany,Löcknitz,1994-01-15,,Background,rural,rural,unknown,,14.257408,53.520458,17,MEWEGEN,130625212,,Rothenklempenow,no,6.572471710102648 DEBB065,DEBB065,DE,Germany,Lütte (Belzig),2003-02-14,,Background,rural,rural,regional,,12.561389,52.194225,111,,,,,no,6.5688081305907895 DEBY013,DEBY013,DE,Germany,Mehring/Sportplatz,1977-03-01,,Background,rural,rural,regional,,12.781385,48.182835,415,MEHRING,91715101,,Mehring,no,14.525675711369342 DENW065,DENW065,DE,Germany,Netphen (Rothaargebirge),1985-12-01,,Background,rural,rural,regional,,8.191934,50.930328,635,,,5970032,"Netphen, Stadt",no,5.5828906369949856 DENW066,DENW066,DE,Germany,Nettetal-Kaldenkirchen,1987-12-01,,Background,rural,rural,near city,,6.195867,51.326939,49,NETTETAL,,5166016,"Nettetal, Stadt",no,19.60067672326852 DEUB030,DEUB030,DE,Germany,Neuglobsow,1991-11-01,,Background,rural,rural,regional,,13.031661,53.141304,65,NEUGLOBSOW,120655502,,Stechlin,yes,4.248033122879065 DETH027,DETH027,DE,Germany,Neuhaus,1991-08-12,,Background,rural background,rural,remote,Unknown,11.134591,50.499954,840,,160725051,,"Neuhaus am Rennweg, Stadt",no,5.4560661043846945 DEBY049,DEBY049,DE,Germany,Neustadt a.d. Donau/Eining,1977-03-01,,Background,rural,rural,regional,,11.777817,48.85321,359,NEUSTADT A.D.DONAU,,9273152,"Neustadt a.d.Donau, St",no,11.463016348388106 DESN079,DESN079,DE,Germany,Niesky,2003-05-05,,Background,rural,rural,regional,,14.749731,51.285355,148,,146265502,,Quitzdorf am See,no,8.341097323821916 DENI058,DENI058,DE,Germany,Ostfries. Inseln,1996-02-01,,Background,rural,rural,unknown,,7.21398,53.715302,5,,,3452020,"Norderney, Stadt",no,8.455727814497608 DERP017,DERP017,DE,Germany,Pfälzerwald-Hortenkopf,1986-01-01,,Background,rural,rural,unknown,,7.826522,49.270264,606,HORTENKOPF,73405004,,Merzalben,no,4.996870112175138 DETH042,DETH042,DE,Germany,Possen,1996-01-12,,Background,rural background,rural,remote,,10.867189,51.33308,420,POSSEN,,16065067,"Sondershausen, Stadt",no,5.731506017470791 DESN051,DESN051,DE,Germany,Radebeul-Wahnsdorf,1967-12-01,,Background,rural,rural,near city,Unknown,13.675006,51.119511,246,RADEBEUL,,14627210,"Radebeul, Stadt",no,12.431592385265933 DEHE043,DEHE043,DE,Germany,Riedstadt,1996-03-20,,Background,rural,rural,near city,,8.516797,49.825165,87,RIEDSTADT,,6433011,"Riedstadt, Stadt",no,16.680100143239645 DEUB004,DEUB004,DE,Germany,Schauinsland,1968-01-01,,Background,rural,rural,regional,,7.908036,47.913254,1205,OBERRIED-HOFSGRUND,83155003,,Oberried,yes,2.069317908430549 DEUB029,DEUB029,DE,Germany,Schmücke,1991-06-01,,Background,rural,rural,unknown,,10.769533,50.654068,937,GEHLBERG,,,,yes,4.390458645846876 DESN074,DESN074,DE,Germany,Schwartenberg,1998-02-06,,Background,rural,rural,regional,,13.465077,50.6591,785,NEUHAUSEN,,14522400,Neuhausen/Erzgeb.,no,7.68523284266574 DEBW031,DEBW031,DE,Germany,Schwarzwald-Süd,1984-01-01,,Background,rural,rural,regional,,7.764528,47.809892,904,,83155012,,"Sulzburg, Stadt",no,3.4389926002665256 DEBW087,DEBW087,DE,Germany,Schwäbische_Alb,1994-04-27,,Background,rural,rural,regional,,9.207639,48.345778,798,ERPFINGEN,,8415091,Sonnenbühl,no,6.540338979727645 DENW064,DENW064,DE,Germany,Simmerath (Eifel),1983-09-01,,Background,rural,rural,regional,,6.28107,50.653236,572,SIMMERATH,,5334028,Simmerath,no,5.509009866414982 DENW068,DENW068,DE,Germany,Soest-Ost,1989-03-01,,Background,rural,rural,near city,,8.148061,51.57066,110,SOEST,,5974040,"Soest, Stadt",no,12.670414585555143 DENI077,DENI077,DE,Germany,Solling-Süd,2010-01-01,,Background,rural,rural,unknown,,9.55462,51.708839,295,,31559501,,"Solling (Landkreis Northeim), gemfr. Geb.",no,8.40113799392387 DEHE026,DEHE026,DE,Germany,Spessart,1986-01-01,,Background,rural,rural,regional,,9.399442,50.164433,502,SPESSART,,6435016,Jossgrund,no,7.538232128849274 DEBB066,DEBB066,DE,Germany,Spreewald,2003-04-17,,Background,rural,rural,regional,,14.057064,51.897598,52,,120615113,,Neu Zauche,no,6.242489303806773 DEBY072,DEBY072,DE,Germany,Tiefenbach/Altenschneeberg,1983-10-01,,Background,rural,rural,regional,,12.54887,49.438465,755,TIEFENBACH,93725308,,Tiefenbach,no,6.55314033706656 DEST098,DEST098,DE,Germany,Unterharz / Friedrichsbrunn,2003-06-24,,Background,rural,rural,regional,,11.043384,51.662453,410,,,,,no,4.3249722250585805 DEUB005,DEUB005,DE,Germany,Waldhof,1970-01-01,,Background,rural,rural,unknown,,10.756733,52.800774,74,ZELLA-MEHLIS,33605402,,Lüder,yes,6.637390724799518 DEHE051,DEHE051,DE,Germany,Wasserkuppe,2000-07-05,,Background,rural,rural,unknown,,9.935862,50.497711,931,WASSERKUPPE,,6631010,"Gersfeld (Rhön), Stadt",no,5.258516400704886 DENI060,DENI060,DE,Germany,Wendland,1998-04-01,,Background,rural,rural,unknown,,11.16705,52.95702,16,,33545407,,"Lüchow (Wendland), Stadt",no,9.88399812585395 DERP015,DERP015,DE,Germany,Westeifel Wascheid,1984-01-01,,Background,rural,rural,unknown,,6.3781,50.2665,680,WASCHEID,72325006,,Gondenbrett,no,5.270283853346025 DEUB001,DEUB001,DE,Germany,Westerland,1968-01-01,,Background,rural,rural,unknown,,8.308208,54.924969,12,WESTERLAND,,1054168,Sylt,yes,5.123743401705111 DERP016,DERP016,DE,Germany,Westerwald-Herdorf,1984-01-01,,Background,rural,rural,unknown,,7.9735,50.76675,480,HERDORF,,7132050,"Herdorf, Stadt",no,7.5608887467047445 DERP028,DERP028,DE,Germany,Westerwald-Neuhäusel,1994-01-01,,Background,rural,rural,unknown,,7.7299,50.4243,546,NEUSTADT,71435004,,"Montabaur, Stadt",no,8.176328171592356 DERP013,DERP013,DE,Germany,Westpfalz-Waldmohr,1984-01-01,,Background,rural,rural,unknown,,7.293522,49.423138,455,DUNZWEILER,73365006,,Dunzweiler,no,7.241496239470168 DEHE024,DEHE024,DE,Germany,Witzenhausen/Wald,1983-05-01,,Background,rural,rural,unknown,,9.774589,51.291759,610,WITZENHAUSEN/WALD,66369200,,"Gutsbezirk Kaufunger Wald, gemfr. Gebiet",no,6.34763255724478 DENI051,DENI051,DE,Germany,Wurmberg,1991-06-06,,Background,rural,rural,unknown,,10.612481,51.758163,939,,,3153003,"Braunlage, Stadt",no,5.652281144348398 DEST089,DEST089,DE,Germany,Zartau/Waldstation,1997-12-01,,Background,rural,rural,regional,,11.17235,52.59317,95,BITTERFELD,,,,no,6.349581619662699 DEHE050,DEHE050,DE,Germany,Zierenberg,2000-05-01,,Background,rural,rural,unknown,,9.271233,51.360752,489,ZIERENBERG,,6633029,"Zierenberg, Stadt",no,8.549351783351376 DEUB028,DEUB028,DE,Germany,Zingst,1991-09-01,,Background,rural,rural,unknown,,12.721938,54.436989,1,ZINGST,,13057096,Zingst,yes,5.197794008346108 DESN052,DESN052,DE,Germany,Zinnwald,1978-05-01,,Background,rural,rural,regional,,13.75145,50.731476,877,ZINNWALD,146285201,,"Altenberg, Stadt",no,6.719808983782324 gstat/inst/external/oxford.jpg0000644000176200001440000017505114646417261016222 0ustar liggesusersJFIFC   %# , #&')*)-0-(0%()(C   ((((((((((((((((((((((((((((((((((((((((((((((((((('" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((cVr5)Vh촻:c l&7'?)]7J ?(/)d6׭rUJ!fTe)\0İW|R:}S[kMr݈S#eH I9+y〹'XƯkx?zI s<ʁ@Rp=:+iʱ]4,B@Hx6Wg* #!RGU=b~#h-GƞoZYOt9H.cpq joe]~ѻ>Am6zPE|cJ&Y^!ti6gKXò#,Y6 ƽ;ǚ{vʶ22DCnB2hQ^uwށD3[B~e'8Va߇.O; ,ѩ\Up @+[N x?`o6JAֺ(_Y<׳~nڑWn|G_e;g}?n۴[d}޼^kwⵯ]Wje"Ou$h}`^~WXK_5 yz̍mC:+H *4ƯAm Z2"+TF$fÎ/q}ou+`I ȿ#A x |bOgWnnol/EzMM%e#Rqx/Z>:n^^Ep8!BoF9#:o#> g_Yյ=ե~dɈ.Ðp:kxþv滇OCʮK+-Z+4ͦ:VKCe@%@`7劁(((((((((((t*~!.몮WM>((((((+g]7J ꨢ(((((((((+|ATkVi"'c"b]`=]yW/7)tx?U񞕶;{"IG61 s&| ih%#H'ses7QA>O|2^L&Ucc["ez|t_WM6Oytb vǵFު4rvjR麄^u%+7XdFA< ;Xml hQc(*F0@ ? W ?~v_ɻnFq#>s/ cB?" lb8)'D2Ǥw".ӌX'|46.WKᏆSC&;*[ I \ ?(;w 5音Eυ/|}Fm|2Jy޼<?O%momLуIkŖAf.H!9.4$28w1NUv<=xW>kֿdԭ61dۺy~e$oi ~c=ם![ۏ94:u?a>F=1>fO ؓLWq\I#<N:`q^z? MKhO ʌ>~ߜm"E;nCGZ񝆑Y]}˔ݘ@8r 7 . T_ K^@,5/?J i\_IZ6o1,qme6_F@T[e Z5hhbKI8W6X<R麄^u%+7XdFA< Yo!{i)P2H0U _~|K:c-S7yѧn0-o‚xWWR(jDA]w4]NKΎ\bA1Ux_vo~{.%GG.c1Dg]Ĭ} uf~]JIW8C^Uyk^'>ScF (_0r8_Pi:YZ|u)qJ2#3_:B>x{6Z'4 v䐔Q$lIr(fWZNkiVzneg [#E $p( ( ( ( ( ( ( ( ( ( (9]7J ꫕g ( ( ( ( ( ( t*~!.몮WM>:( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (((((((+g]7J ꨢ(((((((((((((+Iƶ㏂^#F}z6P;2@$sp_vC@VYG%UؚW,?M+?@ g??lUxsGW,-4CFM-&x+khSIrĂܨ$`$O g??dUxsGW)>?Ю5]C #|ȧkOß? ?&K<9A#cß?6?*D9@ #k>9vsKhV,-#"Ԋ3xsGGWSL~Zj)?AV FX32k~'ΝZv+Ay v88tQg"=H?, 5ҿc^ X_-.9@ g?dUxsGGWzU2Hti!8u^{idGtJ$h.3dDnP%TY^K:@.{Xdi$kϾ9ڋ }4h#{pqf>ß?2?*K<9A##?G"~q4YG%UUt*~!.몠((((((]7J ꫕g((((((((((((((/_)O~NƠ( Z֛]C0&Q p@"KCx=WBTJٛ.Qx$j3/-<[he@qFDR`!*xx\/ `7<e߳v߾͌nn]X9|)+l#u ^k[#i%ib4p su]#ִ.t\L#8SPWz~];b0k1+|~xK%쭰w%I#S5h'x[tKj!W{Ñk 3qKpF&=1+z@=o_ZO,O)wː9bOEkƋj 0-GXm会͝IaF#;&{uR# q@hd:F-|\8w f#ܞ®[h15\ c*@RRgP\;x3%: ?»rS'M1dT8.<܀33qPtEP گto?1*/EUYpԓ]PEP\-oxxImun]}pJ;Lp6@cQ@Lҩkj|! !}RQEQEQEQEQEQEQEQEQEQEQEQEro?LW+St]UQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEQEQEQEQEQEQEQEQE~NƯt v?F5tQEQE޹o-. eLdJ렢2th8?ٺu .1k_)((v0NJ)T  +9${(5b!'~:Z1cSY9 ` {(Wks(((( U-mV/??/Zڠ((((((((((((WM>t*~!.몠((((((]7J ꫕g((((((((((((((!WW۫?\.]J) n+Q׊z9_6W:+v$tPx*\0Z=/TS0\pOx/?%|Z\_Մп$;H8=r>]O#1 ?U{|c"d~lN}x%Z=T)>HHp(SO#p:/X.e> K mBn,g֠;)Sզ]"+D-8bPH9#qצQEQEe\փylC7!U@$<9'գ('uscs/1@ SKkuU[zs ʡF@`FpO>/KvJ{Gm ĥHPp>€.QEǥˬ_# WBsJG gnu9kͤe *|ypCYe̷\nFF}*ZǕXYn38Yj{eNA+$ AÉq46I#DR"!<ug5vVuv}d0F$I?yk\Axqԫd~jQ@k'Ώxc@|KLw# mld.̪ $$>\ j/eǙqsa>,I} ( ]SΏcN#>%[,w,;0,sJ ji5iyi_"ۼsw;@xCA3BJgK[TQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEWgImsk\W&?@Cym1ME"7FV#jrCm$unt*~!.((((((((((((((+m־p|?]ZV%id2D/ lqS袊(WX_zɲL " cQ@@5]J[K#QHV!|#Ok6f%p2zmnp3Wg߉-ZKJûv%fx>`t}nUuI}qrwwۮLȦXBa_j?Hukom'/$+!9-yĿ'$7qcNwM z$@(x]d09R$~kWY !`:9^ŋ^ mB ^P>a$g4EGY{->im77aI[ )Je3ZC4Ȼr =JTyleGr W|dvx㕅_n(` ]Ƨ J:o}Ccïu4]F_AkSͼ" ۏ'$fBԼ!ZXNFKoqր=.DF<}l&:fnŖXPFnX5Q^+wm w&IԬ0:*pܳ8D"Cj(+uO6tiuuu7l1 ~V#Ҷ[;n"HvZ.M;ĺ\~mJn*7!=<}xs[!%HaV#Vxt*~!.몠((((((]7J ꫕g((((((((((((((?MmZ 6zi7܊9*'5}?x7zvha1W9jֺ4cէi.eb^,A+ ҺKlU澝((W i]\ 8by $ӠV) ~ۛ?1ba2X0<\H9+_&_T@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@%O??}uUTC`]3GU@Q@Q@Q@Q@Q@Q@ro?LW+St@UQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@]Z,PKs$hΰT< R.OA_lXo3[$DL;Wy]f+mѺW6~#.,xnu5O evPYF*v`\m|whZM?-<٤vB͓-zPEP+Ow.}:V{{^WF|=myVK o.< Pn#8'Ҩ׾_ƞGsWdPĀE|]ǃ*Xu UV -u|g^E/ŬMw)WI3e_*F@v 9$-|kC BE#7VUF2{upq ɮ-tGFF)vU3kh.F`FxmR 'c@x~fm,A'x2{9F%# ,bk=*[wݵ (g+D?b?((((((+g]7J ꨢ(((((((((((((+3$G9뵮+m֊((((((jKotd؋{A-A,3+ӮylV`?Z'Z؆"g|~\&:$@C,ݧ,iVO,{~teNs\;2{{ZoUeeߕ[깮@o2'm@f5`d1c׊iG<|Q|=h V/8[apBF 94Lҩkj|! !}RQEQEQEQEQEQEQEQEQEQEQEQEro?LW+St]UQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEQEQEQEQEQEQEQEQEz|PMn2cs#6SفEvm:q-F1G,4g+$)ǡ^,xs:*jڎyg>/.\T+O-00@>(ZkoQ/m$,ܹX␌?#nwciж3%MZ7 uJ؂;T#ڦ=RS[wm,7M y2fdQl0BzקEPQZ\yk ՜Om2,KIC)A\?ڷot^[XjX^O3EFOU mFs xw~˻˛hI?(dIewTQEyCc226q |=o[[HUXDb5ŏ@>BsyKτZ!ȃvo1@~x%ğ t]R'y7C1Tcy r4Ko ilY™rHv븏Nճ'/M  h~+hoXsl66bybG'5K,6(I5gPxV#:]'YGn׈x'}_JOXıibE3V%RȲ`TE4Lҩkj|! !}RQEQEQEQEQEQEQEQEQEQEQEQEro?LW+St]UQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEQEQEQEQEQEQEQEQE._ AoBZXY-Wz=y[3VZxN`A|..QY^-𮳬>e5ߓgmqc85o)]WI%ޛ%˗ܷ10zyrkɣIf$hK3닸zBFF@{g,/IZ$0GR1_?|ottY%ICer?vmb|xWU"rd YV{+~Iu_M=\ fi xo&OCQ6(mf =}cIgs@ku\JE,͒#R(JzQX>d]ZWVr)6<HIH<ޠ*UY^BIC)8#4nE6I4gf8ׂ|ii3oemb>p71P&?,LBPG?{'&rDž9jn]vXA8'54>O.&W;QA,p9<Ҁ,V[jĕT~-SV> z޻Gm%gF*>퍦:Vje-/ >X<)tu;+ƹ(z*݊}~a]>rrzJ_ԑ܅_6 D{O(Sh*kgqa̻%ۮw#yqF'u U(+OFȱ3]˷h CI;~fͻ-5?K,o,Aw7&_TXLҩkj ( ( ( ( ( ( ( ( ( ( ( (9]7J ꫕g ( ( ( ( ( ( t*~!.몮WM>:( ( ( ( ( ( ( ( ( ( ( ( ( ( ? jfG;˫qF.*ੌ`;`s|F[ hڢe$ @~# xf'M2+x0GqnjWIYi}١~=+> )el&lva[nh$wvy2|2ӯ#5#g q6F"`-Զ0l}<:TZ@V=t~FX@O#qSw~0xN[#XN=}s_Li x}귈7kVByG<<'?_ͥ>|f[ OopP|=IUMKdErG{4DNFv8X{UGL2}dA7$)U'$qpy-дem/\%%|p|a˿YCI,w7IrLCUPTFW/߀k{;mB8gbSG!FI'~8WǤi;:ul,R?:^YX_|q@U׈QW@X/-45Mn0R63Khx+Y"Xj;8(/ cb}1H=i(~|M׍tH5_4K> 2TmrB1aEcCHAΝ]_}K8"nAh']לd PRm-&/>U*WX],vr:qCMFIu3$g\.e xR6DnwBr:qI#̳D5mŁ;W+NK{ԑԩ9N}H-_7Co졤m.2+2҅f,~PT>Y"+ NB9I+ppx+B ( Ꮘ?Ye,6VEޥ<^Xt}1 ௖97? 0ҩkj*O׮!=v ( ( ( ( ( ( ( ( ( ( ( (9]7J ꫕g ( ( ( ( ( ( t*~!.몮WM>:( ( ( ( ( ( ( ( ( ( ( ( ( ( 6o,L[ĀFn=0;uX<>w7K)20YO>j|B ÷eU$Km-t=q>ޕIxJ-“ d~"m4Z4FP cӐhVAVܠ^X#-/aXrGʸ\-o*$$rc4)ij5LF#WG"ɿнZap #|]*dgSvr0y$ ͧ#e 7Wq2 5+FvHXܳ9%ę$k((((((((((((WM>t*~!.몠((((((]7J ꫕g((((((((((((((pgM>-2+Ky%EfGR :q*'h[i$FE $`2r:=A~x#KΟkq}q--M*4 | ~ff: zy>fg)OHN*Ɖ/ 夬V'!6 >JTZ:TlI)kn,6Fڲ-Nր.\P;to ]2}.rg<7n9‰u]*;z]iC,E%AFTtii藺do F$nHdt R+k^"uIḖݧ{;!1ȉ/ ro[msmYtXr")cey9O5Jg;U2U@$jWY@ I'$}M%ڏGqU>~קPI将Yn%2H=9曤GXCuP\ L5t[]v-Y^ Em->VY$~n8Myf/_kV֗UDw,7V;F0u_]? ?kڎ W2& ۶PTF#{lnsmnd]2%Ip@ z1i,c/DŽ`(8"sqM|g:wc>L1ѴQ`O.Ce?(09 u 'IQ^&2 j{֚epaہ:Iqax4m* #{B>(Hg%E(YOPA+?@tٽmxC+.}@=O_=n(btD)s߭w(jw:1^܌K2.Q@ 5'Au*8>h;h<#Ǟ޵k-U\ vmqJ1$oEׂ/dzb6GMw[ Wӿe!mb1H{ JA9mO^b]ʝ"}ns<}3EPY7w#"Wm$΍~kU uk(g녑 >Y$nœ3@ nd}<繕-q!8'Z,Ċꪨ]K[QEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEW E;iҾ"'/ wiDUH"=# E IU0պ[.0uyPci13\dr;]6Q(ڪz֓D{֛}i^Ŭ9qX#sq#,bFABGy`z^o$^:{tI=a&I@reOcZT{ibqQ92>yh:m!qb3f_u}P\1]#Z"!Rf}*qԜ ހ:߇^0-kCgʸ\Qz"zo=G>#[=I)?, m=W?]\÷BѮ<.xWA^c]ğxZR٬< ;Ƃ hIc򗏝rxCA3BJgK[TQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEWoIF<ڸ_Mtm'4+So{[#jd1=J7 b#3 i2]h(-S;y#(2x~::W\0[;ƦiGCT'$,p<E@٣E:yi8V>]Yf2*;o,4咋f}sn7qZol0*lr}>fQdֶ<jw1W޺Q =AkCW ᮟ5k{F*̬~VN1_z}\K$G$x ܎ۍ44kR?b7D9'#bf.nK+ԍzAr4a#a={aWh`G+asGJPOHNGzY?\[ mR| ̓ۨ*Dtak;[4n(i*y>)?^>a?11FjZBHol% $9+ĺ=ׇ.F4$n, AԓԜk)9N})4&toQk61h`3Os_2ڷdfo*FRr cA^+."%'Fw マ(׍|_۹-(HekWio,(l/ͼ9kK8.aϕ2,#"I;H%Vd]ʈ~R3 H!̈8ڻJ;|^d~ d[,bfR~2r>vĘWZ#gK1!P9* `$&:WaG|kmK/ċo趶Xn䗍KF F+#>ן |R|]i%ὟPX82m!@\`|' Ck40&lilsN 99g!Mh+HcYfEv| gK[U9_tkj ( ( ( ( ( ( ( ( ( ( ( (9]7J ꫕g ( ( ( ( ( ( t*~!.몮WM>:( ( ( ( ( ( ( ( ( ( ( ( ( ( 6zk3$G9fV$NBdSa[ɩ3mZU (Ys@=sV[86ఆ'ʜINm~ͣ^jpn[KUٵL<o9PA\]?kJ.&ah3)=+9>O|[sC[YQOy7(TF A$&;YbJ0ʰ#Jgg~)i$%`ul%t Rpsqc_U? Λqj4btK8>KTʡA\x=CI}W{R0[o*A'1#5R4-cJӵ;h˖A('V ZKD rxRc"kIK 0E p_'r/$/5OGrHħ6o\{mwZƧ$5!#VOpnsniVGw> ⊡Gaւϭ< t0(eQ@ L\4(˨1M6zϱSc>ԚF'tIx٤yXH&\' =[,tmX7mkwdV<*{Wk¾*v%ZwGٓlu I=ܵ]6> "5'`7r:g?:D>o٤6*&FFGK$%ӵhD`pאA-MխcXm- q>o"J$.U0 |&㏅-m$$T# Ā|MLj5&4VsHʘ9ل] 98#׾yudԡ,#U!>P{'u%y$iYrerIc9޻zȫ}]LPEPEPEPEPEPEPEPEPEPEPEPEP+St]Uro?LPEPEPEPEPEPEP\%O??}uUTC`]3GUEPEPEPEPEPEPEPEPEPEPEPEPEPEP^#1B6x}I} +Mn%XD857v^Zky SLJDaH ם a7R4mFd9.Do '5^W:,z[۬Awnv Ny%ev0 ^WT.V RyoskX20)z%xcY"C`FA5mBHү5-B_&MFY$,& \q2GA4^[V\y1,#*@7߈zoP#?&EQ$qLC1`ezVV~7V;wm8zd֭ 4g|5'v C*D: ' xK>^%݌A^GPU @ހ!tx^_ZE@&bHUU<2k;i>, w BO)Z+@,0,H$R{Z[kel$X I8#>DҴW6Yۤ(@Ppϰ)EmX`;o}sp+Nk>4|/sxqX(Z[me$r3F895洙=j-AчAߩquD2>a3Eׁm89NWJO]~y)Yn\QEQEyݕfʣ-!y3RAb9k|.ďp"GדU>-iUᆖGl2p2A>uȯ_v mzgO:V/ҙkk]-QEQEQEQEQEQEQEQEQEQEQEQEro?LW+St]UQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEQEQEQEQEQEQEQEQE|mogImskX.M[B;tL[ʟ7t.s[tia5[$t N7ݍ6_c:T#Gg) ,ɴ9%pqEPo0x76LgUVOG(G Nxp+fi~,>54+2Kku7?L$cڇjH:0or;$ %("r2+>]x}2|CH]b5gPX6U10q9CW!աWEbF `Gs{#d(?kPlR% cǧ|89ǥu_ه[^^[eԣWyfg*CG6Bt dyT!'.BBU={v;J)t<((+7_ӎYUyP6 :qByHFsI3^26چ->JXmfr}C|e:/)jy-Ͼ= ixOA/ e7$ [gnv" rGYaZMS=Y:JB1xP_EXJd_*_WS%tQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEWgImsaw:Zq(FF9dE =|GK4wE-?mӮ@B$cV O}EHH`DyY@$ MsrcTc>9G5=7Vv; YclcrmA6%e@8pH8ܬ`8"3Wsiwڟ!v^ie9>\+Y<h}7 V&jV4oui,)$S38D2N޸yU(ι3Ӽ Ǫj]l[TV` `1sQO:sEignaFXnXVGZ'kiuɿdy¨ 6%ݿr2pb:NeJHW̍W Hz[/I }߆n}kԸy&nHS,CxPJz˃kSt5 2;)trrwA".?Rk6sA!g"w1s ;# |C~FkZT{+ykHʝnNPe;ᐤP֖zS mb2,0z/?]9G5|Ba,h6ks\"6,V'ub= Fy}'EXJd_*_WS-tQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEWgImsk\W&?@Q@ud7g3i뎼V!l{%V%'Ye\=p: k/GբAq52;]H= J̽4=V 6Un0p,PkIM|SFj i{wl!p]X49(2;>O|6nz07Hq} |"$ J(}#ƚ5զo wrF+h0ۆ#8P$qO ;5Yuff'@:Ljg߽Yj\23[*#?J;ko |sg\F5;"ψ0>br+~*v8O>crePxX_'r0Gͷ (]WNld,lǙBX |Qo>ZNE#89Gaѱ`qUmFQKmsC,dÏPM|k(R@h_!\ſ7 .u[Qi`<7ŭZ"FNJ24Ɲ(@yyކ^h]mUoܿ(U@eGkו,$uC7cIX %)⒑'_EXJe_*_WS-tQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEWgImsk\W&?@Q@fbRcԕdcH1Gb9ɭ:G\O j1Js"<Ń {d@#q_7|)ԿjvIl`r$EU '׾&~K=JQq'0#6ך|,3 jhLgFycp 0?I(oRզ<9Hu z^iAS,#>ra)ۛR\_j>K |6?< Y=Oyػf,S(f%X{YiI{kwq?ڶyw*;7`?63@QEQEWx'Pnzx2W;[9<({vdc.*2A eX|I `Y~ h.5جmY t<(+xFLv;ѕrm*OM1r3ھ)4[᷍d5XZ(c;L޼kV4Vb0trp%{@)iq źM$Oʺo֤uCi}$ڶQSOCrzbLdp @tAmI~wCɎ<ǡ*}+Ev^DѠ،矠4&yDLYFrAER:V/ҙ+k]-QEQEQEQEQEQEQEQEQEQEQEQEro?LW+St]UQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEQEQEQEQEQEQEQEQEgx_F>;AB}G fvI7ڤP$c7}y_"zugnR̬B*@\玔}ŏ ,Z7$'1\~n1}xgB*96Zf ]*z:|tpZ?oq Њ(W}׉|{%NҼkRsǵ@|.$/q?5wPEP^k>E˽Ou$([!~fP@l t5TP? ۏ/?ɺE%w?|v;U^ sw%G2C2(m/###k7B;خ7-k? 22O1#6z}kwsk(sBdzT&_Ɩ fFo9 ~#پX9M2)Fe?OxM5ݘI2)%cV,qNOVE)o CUQ@/_vZGS۬fYo)+0J[>EuUJku"_w2K@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@%O??}uUTC`]3GU@Q@Q@Q@Q@Q@Q@ro?LW+St@UQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@x_S1+"э@gjz'fY!vZ4Plmɦ\dBzq}yWA|{~m,wD&r qr+2k0`7㶍[+ci>[4R3݆J1TGhkl=Xīmy< b2{zywVRޘM:. W?Ko'G4~[DKmcn9@]_=x32L1[UXY*ST$&W2!PQEQEQEQExŖ Xm-REj컲9eg$ wx/ @9~]nR[cn-vcݲ}?/iӴV1E#tEܿGC_V~'tRaZC\$6Yۤn% Y]#wƥyok,kK*x0yҍoomf'( s?NQ ij0@> (:_*_WS-t|:V/ҙ+((((((((((((WM>t*~!.몠((((((]7J ꫕g((((((((((((((}s:%mYuicB e#; Q'ÓM-c "O3'''qsQETwmo,20DF dOޤyOme6ٽ Fq"j.S2[Γ݌88ϧ,iРao`1H>{CGß@?jotlg;Wo%Ŵ)hY=G8}h/ZEh|22D.NA^UO=z/kKODT"`v_R[Aw?gy4z% ch@I8$0:ҽ+:j$ r)#(9^9{^ <_]ƐJ˼H6` Zg}kI?EwHc %+~>GfNMxvƚfjekqh?%̼umq 6݃ ( naH @@,=Z^6k(-94{vɮ%8l >Plo $UJku"_w2WK@Q@_5n OZfB[moy!B?6J0ak|gĚΑe4qjvvo"WfӼoe_ ^kqcy[KK-qm[BW3|6s6i$GhPby$I&:Z+K_oJ{K[;d-%˃!qpx)xZlu3R< IMneR6Sx=W|5{jq, +#+svKd )pk [P4KPɲ'imc 8h>'3x h|9sHMdl6udW=ᑂ6pB]x'߉Vz/lh~\q ml̸sTWu[!ON=6h|+i'9G݁&;JM١H~u'4T '&-QEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEWE;iҼ/?)OQEQE*T]xʒ21X'ghM|~Xžq֨7ٚ{~qMI- g1%Zo2BfgxcR~" (ج w\"n19eg]PFN.9(=?¿' m+Y)W 4oiGCz›y?}y߻sc>sz'kH"ߩ?a"5ݔӽvK5dyC̱ ) 9=u֊^v((ȫ}]L5EXJd (8_u4kw66(Юk9/ "vM .>` srΝω'Տ|.QMG.#bnbC|T2@5O ^F9bۄ˰OJ$:HC=˧KmefXpn|*/R2kh+D|7麾♮u)n jDd嘅 aA`pJ=kM"olkyd Aq]p);OkZν}RݵB/ʮTj>4cX'ټ2ͭhͥ>]̐Dm@;?3ƺƉ|][hx| \4L.UHpB]Gk:o:$Iq,f9ːŀ8|O^2k}yN"|bvs]>yω߆w.3 X``,kfW9I ( )_Z ]GE/=_˞Ly1ֺ(UBxkMMb_A~pJ,ѡ ` u*QXFk𽎱c%v{2;}P ƭ2ۓic^Ex~k~[*éJ&TH P3 T;dEQEQEQEQEro?LW+St]UQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEQEQEQEQEQEQEQEQE5;-/ZY.cvdlGJSx\M]U%1ġy0rǩ'E}úBou(1L~/=Բ[oGBLH zɮxxOH UZA1?N8+X,mbHEI|chCp/TuGvc5-B9oH<Һ +KYnd0Hpdjv))z^* Hiw+c8ʁy;uRoI=*O.@H=xx[z4wʹgqkR ޥnt~auhi#3c$9=1=_o~k&]12r{V󲲟ݩd}}Py]?sqF9z þ&|E }&9UZH:dwbNQp,NGjP_OnX;pay(*+M l}J y͌b<pkؼ7Ŷq,M^Jg;tOxIw[Y%o&\@‚z)b5i0jzDhw&MX=A+B ( +G5mB;-{R-ԑ <_(IT*}:.3xIF]Qm/T[MD2A!kh(OɽJI >e ьb9O:ƻ/zlj6vzPn>fr]@d؜(HƽxR¿Ϫ粝˷r(((((((g]7J ((((((WM>t*~!.((((((((((((((%]7ELfJGEݜ/:kM;=hQTXT_X\LXGqDO 0 ߚ𯅬5Ks'6N65EݠA]B }}I `)~:`~;* kJOih 02qU1ZvKK)'7L vV2eܤ2qDŽ0}VBI[9OWdOoJ±i~9񧆈F,e\COSu|-cCOә9'Xpr0k*3Ck·6Q]hw @axp? D[ö6Zo;{t |U 7Ŗ+lpQyynFz{ mB;d@E~mbGUa([iWhflNr翥V]xSUI|aA ~sJ j=y<< lJ-jkxŔum##'Vuoè[,0>,R|>?O}wd-[kO(_;Tr:-y ?\ 9 k."ya3ѐrsQ@ïb)Zȫ}]LEPEPEq_2Ѽ{oK5fH$p큸?8=>(WW-| ).ollmw.Ȇpyp&ΗW]Z,./9cRjƙÞ0}DJt-፤xE"4?Ն\1~e18O]ѴmT-Rf(tT#oUTg[?><"u9lWɺY]W|k^59[iVw_mtl`7qP"+nTȌ(Q{-QEQEQEQEQEQEro?LW+St]UQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEQEQEQEQEQEQEQEQEqoU|soF-EEQ@Q@hGTh?;N:hċL 3bcԓF~=,ae<'+kWo+Mdv'i< f-p7[F/|?"YΟk?r}bv>"qcv08Eex%`+ldC_t[qi_3ivIb4\@1КZ)U\t, u3 k?B2e=~cGŸ쯥{oĺM#(뜌ƽ& f)` nH#^%hz;nlJnA.|O[obV) v{>׺}ϷZ[:5}댎+|Wn[px88:hmu6%!vRNtд+]:;r} p:((u"_w2K\ïb)Z(((:YZ|u)qJ2#3@++B?Ft?o+T۝d=2kޥ}mu6WڟiVXl78mgENKOKuY9GRMLY] AC JtM+K4;.HN1SZV {@5{4- XY@"$ggօQEQEQEQEQEQEro?LW+St]UQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEQEQEQEQEQEQEQEQED0dnm"P?2{䞽8WWqmy?>Nkh|(,UY\/'1;MCJ9"pvQ[ּ .,[˙ nam9x##8/i:lJFDʱG\/ xnqEcqw,s0b8`dd LaQj̄JG8T'U~hbfN[}R46|9$0O@+ƣ[\\xP6p"69ҺSNfV C#:~9.cZs#.o3OBB,``''`죁$隺=& ium.܀O$h+:a QNT==~l"MK WS ꥣXGX4G*3n|g gdc= = -~:S¾#F7^<~y(UA$g1޽Ħ.$ӼAk[ˆC 09Y7VVR%ŴI KbTr IʖKGϭMh+|)X/5tf-"G2X<⽖x ܎D4]3)YuxmĉJpqֻ/.3WYc\y0xڽs@EXJe_*_WS%tQEQEO{i?q"Y"T9>*cγH}[QSw]N~ltZ((񟇵MGíft(#Ie(8|4\[m7^u7:IT.k=kM"olkyd Aq]PEPEPEPEPEPEP+St]Uro?LPEPEPEPEPEPEP\%O??}uUTC`]3GUEPEPEPEPEPEPEPEPEPEPEPEPEPEP\W&?]q_hG=vg?JZ(|en5,gUwgxfkݶ Qo2) H$WдP͖> @~Li^Ffu |BwuGӟ- IpJdg+3H@9z`&Sc":kg"J1@Wzo 6sG'/ X~zd+fwK`lLia!8$nٸp;k=cQҬxJ$6n] $, >~#hVva.Up 89q_ ? 61n^tZ{57uaF+퍣k;]д~kv˞0NܹX@a2q@)j7mR?*x\UuX:x ɼWxXt!Y=9Gxþ6{lgtCt~Ps3UgN29qݛ方-+le0pu>$$jp`rh3uYL.h20@R8#KRMW-)4؜9Gs=1޹xn[+gx;w?hYXBO .u*'CT'{ZB:_*_WS%t|:V/ҙk((((((((((((WM>t*~!.몠((((((]7J ꫕g((((((((((((((?MmZO:){2K$B]drb=PEQEEwsWE(K,#E,MKEr qBtWo gqFO7' U@Q@sT񦷜1Hb1L c#9:wk[ZNO2i<(rI$I$ "~k^-ݏoKn +Y\rYe c8uTTqP(I*@'񞣞#(#xN/oRX}l/냁<@-!8moⷃ&uo*Zi:~BF{Mx|PEFkFMF6J }9zW=xWN+.H đBo,rxkƭZw(4\C%*<˞ymWƅaXZ0?g9!uϾ${_RYE_6ΊW9 Yv |kk2mgA%`kܼG/B״M"t7%$) \* )>e(|El0@s"a@8>+-uK+V8 68SKխJ"WsgR3jV͐#6?!?p&𥾢OfKnF?zMkxV6Hr ws+ 0:'$X\*y+x4; h),2&ul\.[ΒF "t7et9 Ę O\PW!q뾠((((Jf[X.}IB IrsPX}/5HR;ۛ1\)%hYx0s@(((((((t*~!.몮WM>((((((+g]7J ꨢ(((((((((((((S*24lbpC) :^Q> ZlCFw \ybZrx5|moEV~k5ޕ$Xݧ4qCw! Ќ  ZP+_'ۿ>ݞDٻof7Lu((ȫ}]LW5EXJd ( ( ( (8[X׈NԒXp.-ud]V27c`j՗ZBIM%bHOʥI8#@O֤Yrp>\@=޺ :Xi7v%2[B"N7}A's sH]gMx>hNvWr[94#۹ :[L?L)HǧJfzu;s7`qǚxlE<(0\O.elF=5sc-nj YHYNhOS֝ǽR׃#xZxq;d.mzb,(>fA9t{=7|.dnXI :ʃ+5{ vH4#Q~4:V/ҙ+k]-QEQEQEQEyW)l 8d#(u'"+#` Yf'lZ#sd21|IăCx{▮~k{MH'SH۠$+AHڞ+$ּ1s6"^[,Q,g̍!8(((((((WM>t*~!.몠((((((]7J ꫕g((((((((((((((puOWڵVֲ}=Grm MfV+m֊(|o>k~Cq%?16)0wLV⿳~[L:^O4Zg>o&z㎙w5ryvc;Ic$mV^޵)qsdՇzZqoE1>P jY-om 8j٢(?xY?vֆY6QsgzPJ1ڜi$ڊ(Y.}>o-"r60sG'^swK[{LA33tpx>F~~&{.go1v|c_}9ָ'?tz%v4 ( ( ( jFyj6Vpm-4Rp'ZWǟ_V>͋X}6(b[~_r9gO?gr N/+T\_ٻ$</3>x_Zױo/|$p3$__EpS wPo6(~vZΓ͋-#u,<'((((((g]7J ((((((WM>t*~!.((((((((((((((/mҸ?Mm;Z( <ފ |WF o_ιu[0FgGJK1aZ@"7S?hIN{ԟQ=f '8ATn-}:qM +QL((2VdS[y#cyse %?Q~5S._zM EyF(7qQ@Š(((A$Kz%v5| y?((( [.qY\y>2]Yw^izb}÷ A"ahJ|k{ycJ G7rr}E|׈|-3JѲ.nbV9IoGzwOZ^F񏁾ͥ\ZOI Y<6bamP d €I((((((t*~!.몮WM>((((((+g]7J ꨢ(((((((((((((+3$G9뵯?eVռIr{Y!<`K$ r( (O[~ C զ#1I帘=F:P4|~WIRcs ѥmcT9eZR955?xkNXE.uwو N⣜կiiݼ9b۰ {֚:(AEcx BwEmYO-Tkz4kp̦if9\FprÌhRjx #>k5 #Z52d+ n7/lv^s svclK1WdݛV^Cyc-"s+RW (?I$0[nqh<=?ޟG]qF>|ԐQEQEQEQEQEQEQEQEQEQEQEQEro?LW+St]UQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEQEQEQEQEQEQEQEQE2:`P4Y Ie_xy+3$G9((_"k[E *pr cp3]XW3v .M+=&T8~ 5[u yЬ(*qzNLע)QEQEf]JB@#9"[!JLLd(#d=3Pk0=Γy y;t LW.Jp3#׌>S4!'-ȶ6ؙH+xX7|rg~\u5i3\Y!^H9#jq| $~e q'8)QE}I>J+E$L~%v$Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@%O??}uUTC`]3GU@Q@Q@Q@Q@Q@Q@ro?LW+St@UQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@q_hG=v|moEQEQE⿵65`֡%+"dc߂xO{WS۰FG~+3E%gQPfe<w`z~}ua+> yϧ (4UQEQEQEC0D>t.In^{ꅀ;;1csT5Ya4Qx@l}9KеE" R)Q@Pz3|WI>JjH ( ( ( ( ( ( ( ( ( ( ( (9]7J ꫕g ( ( ( ( ( ( t*~!.몮WM>:( ( ( ( ( ( ( ( ( ( ( ( ( ( Ya{V񎣩[\[koni_3! 9p gqc3$G9(j^n"igymqo$.lnkh9 VHɻ/_6Sm4A,AI }QM]♮wyon6wJZix 6:wwv#_?hϴK5P*3\K2RAx=NÖտsoշF~^rRٷ>#g3")' ct[LZhQE1s?4 hYIr%L@VQ@ҧ|7g4o4;4d9vaPzT፧;OH*Gמ!f8m_*Hdԑtr{w40`c=n_Zr`}i!!hc _z[{EYk;oqz=/+;/|ԐQEQEQEQEQEQEQEQEQEQEQEQEro?LW+St]UQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEQEQEQEQEQEQEQEQE|mogImskEPEPEP_X[I%ik= ߡƟ91eěn6yGc?+}͖&VIhavB,d#Nõ{x _ӡ.0[)1xCR[^2&Ӏd<_AGOxOj>/ߗ[Yd!YsБ^xp1N3OlRYk0f̅((((((+g]7J ꨢ(((((((((((((+'s)$ycQ1kelq]N5qKrQ!f A8 qzW~vojzΣauk fXiZhn T"(`qvF8QEQY^+Mb_ 1xe֤[+R|m 90]Fd)WxFtb)R;Gj7|cT|gXqtni&L̊8-OZ+'>1i4a] yx.y\"+#0Îgcր>||Yg|-kϱ=?_^[i/!B7Lx'<;۸+K;ls^;⿄>*Ls%c1ۀpHqSv:ئXHG2!{~Fqa5oiZC%D`YQn1}*xNtB>a$|d*.;%Lc~@`&fD7#1܊QkmJqQՀ;p;xPxSKqE@1<<-xrX|d!7 E}-+_MSEnX0H]Fm0BN}8=FGJ3 ,n4B;/$" %N@w4׎,z7.xp?>A<;f|+dde`@ppxAǰs"d_<=* =8L+:_j6YpoA@ =?;}l''eCGP}*}U'g9Wc\/'g+HQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEWgImsk\Bimi$-FG8(ϋ>6~ Պ%Hֱc dd.2 :ƃL'Čq9qšυ}Rx9olt\Y1ۚծh:.4 {{=.(,;f?d<}5|shPxY_x;TlFi&,1oI B1PEQEUu ]_JԴ|+R 6e8 Gf,637Ž.)5].ڤHLmX8 `g1}u^QMhͪ,966qBunr1Ą瞝9 ~![-Fܦ˘ʩ#UPo XiqCk#rju+ݳ,Q[FP71s (z6VF+` R֫j7zeu sjHgܐˀʪci 7N3eYH}NF9s=jΡٱK+˖?4B9T`8$0 ¨+'Zi<0H`pg}rk^vMOұg{d%T BWk*\g;Y_8V0^`_@70!%BX3\g8=ko<){x/s,z:.Vمo_L@\9$s|8efG<]q 4>j;:Y0X$($}vQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEֳ-ErQRKe 8 3:׆~?/lrY 8gp++3$G9(iO|mƐ&hV&\D]LL3ƪghC}E}ovvg.>C/kKuO%Ûot03+1S O@xkC}kѴ:4yfpD;x\}!Ul-f%y-%c,c&v TQEr1}/~G=ȁcrȠ:cv9$,1EO> }=sk=eTnwfl֊+ ? CVx~C/b;z뫀 }m٥݌5 "ToVk~[R[ )utnbJ 7ӎ?*`^CBkME&\/",E*c.~nX;d`X@,eR6w_ %Bc{PF0 ĜWM\I՘`n$ ]EQEQEQEQEQEQEQEQEQEQEQEQEro?LW+St]UQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEQEQEQEQEQEQEQEQE|mogImskEPEPEPEPEP^EQr|+|_Gl@I Iy_0>6‰M{tG*StoK͘7sslq^.Ɯm,E&r炱c}k-cIuhC>Z($^8#K_W7czҙ+((((((((((((WM>t*~!.몠((((((]7J ꫕g((((((((((((((_oLw\={\q\>dqڽ'h[i$FE $`2r:=A0{?5o:#<؃c$=Rj{65c=]ڢ fv^rWqdNfm\H΄0ʜ4%}+ŚdW6]Mhx;y⹷{iRh%PWR2#RVh:i$ڽv˱&eW'eP€pi+(y_QFlKq;B4?}9@?I2G~t-\JOB4?}9@fa4Eo!yzjs#Do^Ft*~!.몠((((((]7J ꫕g((((((((((((((?\мc6,Q-㻖(ː/'3+p7/o&l5M?N(.57{% I.lnu/#*K?$&pX AZ~0 M&+]du8`rȇv]lh+oޛ}isgZ5n7FIM#TpcbBں_㽿LԴIF YhhAEqMܥZܶP^ɦЎ,wȬ  ˶MͩwZU[Ic;W3ʰ+p$HQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@%O??}uUTC`]3GU@Q@Q@Q@Q@Q@Q@ro?LW+St@UQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@uz#ӥG{#v"yq<eUMC"W5m.=l޵kKnEUNϽR'$L2toG$&ݾ[gg9ҼMK@@Z}2GpRi]W 1ouE6NVhffkI3[I#DblS|(Ǯ|Moym֝7yl9jx C -+Wյ}yI^;|HO9|I|6}$߶&mwkɤ@&}.S@˻I>zE{>[IZ-\gʒ22g\ԓo@i_x@iZ|:d%R8vXbŘū.ˤG=ܒIdĚ}]ִ$ho8UukplϾڶvyuu8:zGq+5\#ewD+&MxB5oxW+icSȦqt2, <5+xN{&iu=zPI' 1JH<1-XhPx#RҾ+wKh.NF(FWCHphܳxQԞk]^It[m''ˈL . 9ڹuPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP+St]Uro?LPEPEPEPEPEPEP\%O??}uUTC`]3GUEPEPEPEPEPEPEPEPEPEPEPEPEPEPEUM{u[gh>WؤDOyvlce*x$?{.?kIuhFr#Yo,$(,${q|7?L >%k^E}E$_1 #c? 9xU+Л &op4_O ~!>ii  ϒ7.щb6NyKT?|I_W7+ǁM h? "{m?Pm"iH. zmagmce|{h($P$ITQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+h:%WZ΃鶟j5ԼάnjA(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag( |9z뚝孵$i X9>讖((((gstat/inst/external/ncp.dbf0000644000176200001440000000457014646417261015451 0ustar liggesusersdrWAREAN PERIMETERN WSVGEB_N WSVGEB_IDN WSVGEBIEDC(WSVNUMNWSV_ENGELSC 31647227904 805264.750 2 1Centrale Noordzee 60Central North Sea 23836518400 991292.438 3 2Zuidelijke Noordzee 59Southern Bight 2996116992 608006.813 4 3Kustzone 58Coastal Zone 21310684.000 25581.318 5 4 0 529338496 176858.797 6 5Eems-Dollard 39 809406144 237455.656 7 6Waddenzee oost 63 2482308.000 8782.396 8 7 0 8828493.000 12204.778 9 8 0 37539448.000 36667.668 10 9 0 58258608.000 52365.965 11 10 0 92012928.000 71875.711 12 11 0 1566943488 222147.938 13 12Waddenzee West 62Wadden Sea 37442780.000 43513.047 14 14 0 160017344 60477.840 15 15 0 890277632 192198.391 16 16Voordelta 57Delta 116148648 69161.266 17 17Grevelingenmeer 56 371725664 182730.094 18 18Oosterschelde 55 455953504 212864.031 19 19Westerschelde 47 25196141.700 47435.919 0 0 0 gstat/build/0000755000176200001440000000000014750415427012504 5ustar liggesusersgstat/build/vignette.rds0000644000176200001440000000054314750415427015045 0ustar liggesusersRMk0 u۴] Av=s.]EIllNn~l)C1fQf=;#ztD 2cNe}6 cJLQH4%+< ܠ}meRȎϹd@ZP9X#)‡޾6 c?t5"12a wO2*gPR[k![1x mLv48ZZ 3tca2g+OQa/qSKMhe= dnQ?n犒LPCR-2gstat/man/0000755000176200001440000000000014750415156012157 5ustar liggesusersgstat/man/image.Rd0000644000176200001440000000540214646417261013534 0ustar liggesusers% $Id: image.Rd,v 1.10 2007-11-16 12:59:47 edzer Exp $ \name{image} \alias{image.data.frame} \alias{image} \alias{xyz2img} \title{ Image Gridded Coordinates in Data Frame } \description{ Image gridded data, held in a data frame, keeping the right aspect ratio for axes, and the right cell shape } \usage{ \method{image}{data.frame}(x, zcol = 3, xcol = 1, ycol = 2, asp = 1, ...) xyz2img(xyz, zcol = 3, xcol = 1, ycol = 2, tolerance = 10 * .Machine$double.eps) } \arguments{ \item{x}{ data frame (or matrix) with x-coordinate, y-coordinate, and z-coordinate in its columns } \item{zcol}{ column number or name of z-variable } \item{xcol}{ column number or name of x-coordinate } \item{ycol}{ column number or name of y-coordinate } \item{asp}{ aspect ratio for the x and y axes } \item{...}{ arguments, passed to image.default } \item{xyz}{data frame (same as \code{x})} \item{tolerance}{ maximum allowed deviation for coordinats from being exactly on a regularly spaced grid } } \value{ \link{image.data.frame} plots an image from gridded data, organized in arbritrary order, in a data frame. It uses \link{xyz2img} and \link{image.default} for this. In the S-Plus version, \link{xyz2img} tries to make an image object with a size such that it will plot with an equal aspect ratio; for the R version, image.data.frame uses the \code{asp=1} argument to guarantee this. \link{xyz2img} returns a list with components: \code{z}, a matrix containing the z-values; \code{x}, the increasing coordinates of the rows of \code{z}; \code{y}, the increasing coordinates of the columns of \code{z}. This list is suitable input to \link{image.default}. } \note{ I wrote this function before I found out about \code{levelplot}, a Lattice/Trellis function that lets you control the aspect ratio by the \code{aspect} argument, and that automatically draws a legend, and therefore I now prefer levelplot over \code{image}. Plotting points on a levelplots is probably done with providing a panel function and using \code{lpoints}. (for S-Plus only -- ) it is hard (if not impossible) to get exactly right cell shapes (e.g., square for a square grid) without altering the size of the plotting region, but this function tries hard to do so by extending the image to plot in either x- or y-direction. The larger the grid, the better the approximation. Geographically correct images can be obtained by modifiying \code{par("pin")}. Read the examples, image a 2 x 2 grid, and play with \code{par("pin")} if you want to learn more about this. } \author{ Edzer Pebesma } \examples{ library(sp) data(meuse) data(meuse.grid) g <- gstat(formula=log(zinc)~1,locations=~x+y,data=meuse,model=vgm(1,"Exp",300)) x <- predict(g, meuse.grid) image(x, 4, main="kriging variance and data points") points(meuse$x, meuse$y, pch = "+") } \keyword{dplot} gstat/man/DE_RB_2005.Rd0000644000176200001440000000552114646417261013775 0ustar liggesusers\name{DE_RB_2005} \alias{DE_RB_2005} \docType{data} \title{ Spatio-temporal data set with rural background PM10 concentrations in Germany 2005 } \description{ Spatio-temporal data set with rural background PM10 concentrations in Germany 2005 (airbase v6). } \usage{data("DE_RB_2005")} \format{ The format is: Formal class 'STSDF' [package "spacetime"] with 5 slots ..@ data :'data.frame': 23230 obs. of 2 variables: .. ..$ PM10 : num [1:23230] 16.7 31.7 5 22.4 26.8 ... .. ..$ logPM10: num [1:23230] 2.82 3.46 1.61 3.11 3.29 ... ..@ index : int [1:23230, 1:2] 1 2 3 4 5 6 7 8 9 10 ... ..@ sp :Formal class 'SpatialPointsDataFrame' [package "sp"] with 5 slots .. .. ..@ data :'data.frame': 69 obs. of 9 variables: .. .. .. ..$ station_altitude : int [1:69] 8 3 700 15 35 50 343 339 45 45 ... .. .. .. ..$ station_european_code: Factor w/ 7965 levels "AD0942A","AD0944A",..: 1991 1648 1367 2350 1113 1098 1437 2043 1741 1998 ... .. .. .. ..$ country_iso_code : Factor w/ 39 levels "AD","AL","AT",..: 10 10 10 10 10 10 10 10 10 10 ... .. .. .. ..$ station_start_date : Factor w/ 2409 levels "1900-01-01","1951-04-01",..: 152 1184 1577 1132 744 328 1202 1555 1148 407 ... .. .. .. ..$ station_end_date : Factor w/ 864 levels "","1975-02-06",..: 1 1 1 579 1 1 1 1 1 1 ... .. .. .. ..$ type_of_station : Factor w/ 5 levels "","Background",..: 2 2 2 2 2 2 2 2 2 2 ... .. .. .. ..$ station_type_of_area : Factor w/ 4 levels "rural","suburban",..: 1 1 1 1 1 1 1 1 1 1 ... .. .. .. ..$ street_type : Factor w/ 5 levels "","Canyon street: L/H < 1.5",..: 4 1 1 1 1 1 1 1 1 1 ... .. .. .. ..$ annual_mean_PM10 : num [1:69] 20.9 21.8 16.5 20.3 23.3 ... .. .. ..@ coords.nrs : num(0) .. .. ..@ coords : num [1:69, 1:2] 538709 545414 665711 551796 815738 ... .. .. .. ..- attr(*, "dimnames")=List of 2 .. .. .. .. ..$ : chr [1:69] "DESH001" "DENI063" "DEBY109" "DEUB038" ... .. .. .. .. ..$ : chr [1:2] "coords.x1" "coords.x2" .. .. ..@ bbox : num [1:2, 1:2] 307809 5295752 907375 6086661 .. .. .. ..- attr(*, "dimnames")=List of 2 .. .. .. .. ..$ : chr [1:2] "coords.x1" "coords.x2" .. .. .. .. ..$ : chr [1:2] "min" "max" .. .. ..@ proj4string:Formal class 'CRS' [package "sp"] with 1 slot .. .. .. .. ..@ projargs: chr "+init=epsg:32632 +proj=utm +zone=32 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0" ..@ time :An ?xts? object on 2005-01-01/2005-12-31 containing: Data: int [1:365, 1] 5115 5116 5117 5118 5119 5120 5121 5122 5123 5124 ... - attr(*, "dimnames")=List of 2 ..$ : NULL ..$ : chr "..1" Indexed by objects of class: [POSIXct,POSIXt] TZ: GMT xts Attributes: NULL ..@ endTime: POSIXct[1:365], format: "2005-01-02" "2005-01-03" "2005-01-04" "2005-01-05" ... } \source{ EEA, airbase v6 } \examples{ data(DE_RB_2005) str(DE_RB_2005) } \keyword{datasets} gstat/man/progress.Rd0000644000176200001440000000075414646417261014323 0ustar liggesusers% $Id: hscat.Rd,v 1.3 2008-02-04 10:06:44 edzer Exp $ \name{progress} \alias{get_gstat_progress} \alias{set_gstat_progress} \title{ Get or set progress indicator } \description{ Get or set progress indicator } \usage{ get_gstat_progress() set_gstat_progress(value) } \arguments{ \item{value}{ logical } } \value{ return the logical value indicating whether progress bars should be given } \author{ Edzer Pebesma } \examples{ set_gstat_progress(FALSE) get_gstat_progress() } \keyword{models} gstat/man/estiStAni.Rd0000644000176200001440000000666314646417261014367 0ustar liggesusers\name{estiStAni} \alias{estiStAni} \title{ Estimation of the spatio-temporal anisotropy } \description{ Estimation of the spatio-temporal anisotropy without an underlying spatio-temporal model. Different methods are implemented using a linear model to predict the temporal gamma values or the ratio of the ranges of a spatial and temporal variogram model or a spatial variogram model to predict the temporal gamma values or the spatio-temporal anisotropy value as used in a metric spatio-temporal variogram. } \usage{ estiStAni(empVgm, interval, method = "linear", spatialVgm, temporalVgm, s.range=NA, t.range=NA) } \arguments{ \item{empVgm}{ An empirical spatio-temporal variogram. } \item{interval}{ A search interval for the optimisation of the spatio-temporal anisotropy parameter } \item{method}{ A character string determining the method to be used (one of \code{linear}, \code{range}, \code{vgm} or \code{metric}, see below for details) } \item{spatialVgm}{ A spatial variogram definition from the call to \code{\link{vgm}}. The model is optimised based on the pure spatial values in \code{empVgm}. } \item{temporalVgm}{ A temporal variogram definition from the call to \code{\link{vgm}}. The model is optimised based on the pure temporal values in \code{empVgm}.} \item{s.range}{ A spatial cutoff value applied to the empirical variogram \code{empVgm}. } \item{t.range}{ A temporal cutoff value applied to the empirical variogram \code{empVgm}. } } \details{ \describe{ \item{linear}{ A linear model is fitted to the pure spatial gamma values based on the spatial distances. An optimal scaling is searched to stretch the temporal distances such that the linear model explains best the pure temporal gamma values. This assumes (on average) a linear relationship between distance and gamma, hence it is advisable to use only those pairs of pure spatial (pure temporal) distance and gamma value that show a considerable increase (i.e. drop all values beyond the range by setting values for \code{s.range} and \code{t.range}). } \item{range}{ A spatial and temporal variogram model is fitted to the pure spatial and temporal gamma values respectively. The spatio-temporal anisotropy estimate is the ratio of the spatial range over the temporal range. } \item{vgm}{ A spatial variogram model is fitted to the pure spatial gamma values. An optimal scaling is used to stretch the temporal distances such that the spatial variogram model explains best the pure temporal gamma values. } \item{metric}{ A metric spatio-temporal variogram model is fitted with \code{joint} component according to the defined spatial variogram \code{spatialVgm}. The starting value of \code{stAni} is the mean of the \code{interval} parameter (see \code{\link{vgmST}} for the metric variogram definition). The spatio-temporal anisotropy as estimated in the spatio-temporal variogram is returned. Note that the parameter \code{interval} is only used to set the starting value. Hence, the estimate might exceed the given interval. } } } \value{A scalar representing the spatio-temporal anisotropy estimate.} \note{Different methods might lead to very different estimates. All but the \code{linear} approach are sensitive to the variogram model selection.} \author{Benedikt Graeler} \examples{ data(vv) estiStAni(vv, c(10, 150)) estiStAni(vv, c(10, 150), "vgm", vgm(80, "Sph", 120, 20)) } gstat/man/coalash.Rd0000644000176200001440000000230014646417261014056 0ustar liggesusers% $Id: coalash.Rd,v 1.2 2007-03-21 15:14:25 edzer Exp $ \name{coalash} \alias{coalash} \title{Coal ash samples from a mine in Pennsylvania} \description{ Data obtained from Gomez and Hazen (1970, Tables 19 and 20) on coal ash for the Robena Mine Property in Greene County Pennsylvania. } \format{ This data frame contains the following columns: \describe{ \item{x}{a numeric vector; x-coordinate; reference unknown } \item{y}{a numeric vector; x-coordinate; reference unknown } \item{coalash}{the target variable} } } \usage{ data(coalash) } \author{ unknown; R version prepared by Edzer Pebesma; data obtained from \url{http://homepage.divms.uiowa.edu/~dzimmer/spatialstats/}, Dale Zimmerman's course page } \references{ N.A.C. Cressie, 1993, Statistics for Spatial Data, Wiley. Gomez, M. and Hazen, K. (1970). Evaluating sulfur and ash distribution in coal seems by statistical response surface regression analysis. U.S. Bureau of Mines Report RI 7377. see also fields manual: \url{https://www.image.ucar.edu/GSP/Software/Fields/fields.manual.coalashEX.Krig.shtml} } \note{ data are also present in package fields, as coalash. } \keyword{datasets} \examples{ data(coalash) summary(coalash) } gstat/man/sic2004.Rd0000644000176200001440000001121414750415014013522 0ustar liggesusers% $Id: sic2004.Rd,v 1.11 2006-02-10 19:03:27 edzer Exp $ \name{sic2004} \alias{sic2004} \alias{sic.train} \alias{sic.pred} \alias{sic.grid} \alias{sic.test} \alias{sic.val} \title{ Spatial Interpolation Comparison 2004 data set: Natural Ambient Radioactivity } \description{ The text below was copied from the original sic2004 event, which is no longer online available. The variable used in the SIC 2004 exercise is natural ambient radioactivity measured in Germany. The data, provided kindly by the German Federal Office for Radiation Protection (BfS), are gamma dose rates reported by means of the national automatic monitoring network (IMIS). In the frame of SIC2004, a rectangular area was used to select 1008 monitoring stations (from a total of around 2000 stations). For these 1008 stations, 11 days of measurements have been randomly selected during the last 12 months and the average daily dose rates calculated for each day. Hence, we ended up having 11 data sets. Prior information (sic.train): 10 data sets of 200 points that are identical for what concerns the locations of the monitoring stations have been prepared. These locations have been randomly selected (see Figure 1). These data sets differ only by their Z values since each set corresponds to 1 day of measurement made during the last 14 months. No information will be provided on the date of measurement. These 10 data sets (10 days of measurements) can be used as prior information to tune the parameters of the mapping algorithms. No other information will be provided about these sets. Participants are free of course to gather more information about the variable in the literature and so on. The 200 monitoring stations above were randomly taken from a larger set of 1008 stations. The remaining 808 monitoring stations have a topology given in sic.pred. Participants to SIC2004 will have to estimate the values of the variable taken at these 808 locations. The SIC2004 data (sic.val, variable dayx): The exercise consists in using 200 measurements made on a 11th day (THE data of the exercise) to estimate the values observed at the remaining 808 locations (hence the question marks as symbols in the maps shown in Figure 3). These measurements will be provided only during two weeks (15th of September until 1st of October 2004) on a web page restricted to the participants. The true values observed at these 808 locations will be released only at the end of the exercise to allow participants to write their manuscripts (sic.test, variables dayx and joker). In addition, a joker data set was released (sic.val, variable joker), which contains an anomaly. The anomaly was generated by a simulation model, and does not represent measured levels. } \format{ The data frames contain the following columns: \describe{ \item{record}{this integer value is the number (unique value) of the monitoring station chosen by us.} \item{x}{X-coordinate of the monitoring station indicated in meters} \item{y}{Y-coordinate of the monitoring station indicated in meters} \item{day01}{mean gamma dose rate measured during 24 hours, at day01. Units are nanoSieverts/hour} \item{day02}{same, for day 02} \item{day03}{...} \item{day04}{...} \item{day05}{...} \item{day06}{...} \item{day07}{...} \item{day08}{...} \item{day09}{...} \item{day10}{...} \item{dayx}{ the data observed at the 11-th day} \item{joker}{ the joker data set, containing an anomaly not present in the training data} } } \note{ the data set sic.grid provides a set of points on a regular grid (almost 10000 points) covering the area; this is convenient for interpolation; see the function \code{makegrid} in package sp. The coordinates have been projected around a point located in the South West of Germany. Hence, a few coordinates have negative values as can be guessed from the Figures below. } \usage{ data(sic2004) # } \author{ Data: the German Federal Office for Radiation Protection (BfS), \url{https://www.bfs.de/EN/home/home_node.html}, data provided by Gregoire Dubois, R compilation by Edzer Pebesma. } \keyword{datasets} \examples{ data(sic2004) # FIGURE 1. Locations of the 200 monitoring stations for the 11 data sets. # The values taken by the variable are known. plot(y~x,sic.train,pch=1,col="red", asp=1) # FIGURE 2. Locations of the 808 remaining monitoring stations at which # the values of the variable must be estimated. plot(y~x,sic.pred,pch="?", asp=1, cex=.8) # Figure 2 # FIGURE 3. Locations of the 1008 monitoring stations (exhaustive data sets). # Red circles are used to estimate values located at the questions marks plot(y~x,sic.train,pch=1,col="red", asp=1) points(y~x, sic.pred, pch="?", cex=.8) } gstat/man/spplot.vcov.Rd0000644000176200001440000000114314646417261014745 0ustar liggesusers% $Id: spplot.vcov.Rd,v 1.2 2007-11-16 12:59:47 edzer Exp $ \name{spplot.vcov} \alias{spplot.vcov} \title{ Plot map matrix of prediction error variances and covariances } \description{ Plot map matrix of prediction error variances and covariances } \usage{ spplot.vcov(x, ...) } \arguments{ \item{x}{ Object of class SpatialPixelsDataFrame or SpatialGridDataFrame, resulting from a krige call with multiple variables (cokriging } \item{...}{remaining arguments passed to spplot } } \value{ The plotted object, of class trellis; see \code{spplot} in package \pkg{sp}. } \author{ Edzer Pebesma } \keyword{dplot} gstat/man/gstat-internal.Rd0000644000176200001440000000065514646417261015413 0ustar liggesusers% $Id: gstat-internal.Rd,v 1.6 2008-03-10 10:36:04 edzer Exp $ \name{gstat-internal} \alias{load.variogram.model} \alias{gstat.formula} \alias{gstat.formula.predict} \alias{gstat.debug} \alias{gstat.set} \alias{cross.name} \alias{gstat.load.set} \title{Gstat Internal Functions} \description{gstat internal functions} \author{Edzer Pebesma} \note{these functions are not meant to be called by users directly} \keyword{internal} gstat/man/variogram.Rd0000644000176200001440000002251514646417261014445 0ustar liggesusers% $Id: variogram.Rd,v 1.23 2009-11-02 21:33:17 edzer Exp $ \name{variogram} \alias{variogram} \alias{variogram.gstat} \alias{variogram.formula} \alias{variogram.default} \alias{print.gstatVariogram} \alias{print.variogramCloud} \alias{as.data.frame.variogramCloud} \title{ Calculate Sample or Residual Variogram or Variogram Cloud } \description{ Calculates the sample variogram from data, or in case of a linear model is given, for the residuals, with options for directional, robust, and pooled variogram, and for irregular distance intervals. In case spatio-temporal data is provided, the function \code{\link{variogramST}} is called with a different set of parameters. } \usage{ \method{variogram}{gstat}(object, ...) \method{variogram}{formula}(object, locations = coordinates(data), data, ...) \method{variogram}{default}(object, locations, X, cutoff, width = cutoff/15, alpha = 0, beta = 0, tol.hor = 90/length(alpha), tol.ver = 90/length(beta), cressie = FALSE, dX = numeric(0), boundaries = numeric(0), cloud = FALSE, trend.beta = NULL, debug.level = 1, cross = TRUE, grid, map = FALSE, g = NULL, ..., projected = TRUE, lambda = 1.0, verbose = FALSE, covariogram = FALSE, PR = FALSE, pseudo = -1) \method{print}{gstatVariogram}(x, ...) \method{print}{variogramCloud}(x, ...) } \arguments{ \item{object}{object of class \code{gstat}; in this form, direct and cross (residual) variograms are calculated for all variables and variable pairs defined in \code{object}; in case of \code{variogram.formula}, formula defining the response vector and (possible) regressors, in case of absence of regressors, use e.g. \code{z~1}; in case of \code{variogram.default}: list with for each variable the vector with responses (should not be called directly) } \item{data}{data frame where the names in formula are to be found} \item{locations}{ spatial data locations. For variogram.formula: a formula with only the coordinate variables in the right hand (explanatory variable) side e.g. \code{~x+y}; see examples. For variogram.default: list with coordinate matrices, each with the number of rows matching that of corresponding vectors in y; the number of columns should match the number of spatial dimensions spanned by the data (1 (x), 2 (x,y) or 3 (x,y,z)). } \item{...}{any other arguments that will be passed to \link{variogram.default} (ignored)} \item{X}{ (optional) list with for each variable the matrix with regressors/covariates; the number of rows should match that of the correspoding element in y, the number of columns equals the number of regressors (including intercept) } \item{cutoff}{ spatial separation distance up to which point pairs are included in semivariance estimates; as a default, the length of the diagonal of the box spanning the data is divided by three. } \item{width}{ the width of subsequent distance intervals into which data point pairs are grouped for semivariance estimates } \item{alpha}{ direction in plane (x,y), in positive degrees clockwise from positive y (North): alpha=0 for direction North (increasing y), alpha=90 for direction East (increasing x); optional a vector of directions in (x,y) } \item{beta}{ direction in z, in positive degrees up from the (x,y) plane; } optional a vector of directions \item{tol.hor}{ horizontal tolerance angle in degrees } \item{tol.ver}{ vertical tolerance angle in degrees } \item{cressie}{ logical; if TRUE, use Cressie''s robust variogram estimate; if FALSE use the classical method of moments variogram estimate } \item{dX}{ include a pair of data points $y(s_1),y(s_2)$ taken at locations $s_1$ and $s_2$ for sample variogram calculation only when $||x(s_1)-x(s_2)|| < dX$ with and $x(s_i)$ the vector with regressors at location $s_i$, and $||.||$ the 2-norm. This allows pooled estimation of within-strata variograms (use a factor variable as regressor, and dX=0.5), or variograms of (near-)replicates in a linear model (addressing point pairs having similar values for regressors variables) } \item{boundaries}{ numerical vector with distance interval upper boundaries; values should be strictly increasing } \item{cloud}{ logical; if TRUE, calculate the semivariogram cloud } \item{trend.beta}{vector with trend coefficients, in case they are known. By default, trend coefficients are estimated from the data.} \item{debug.level}{ integer; set gstat internal debug level } \item{cross}{ logical or character; if FALSE, no cross variograms are computed when object is of class \code{gstat} and has more than one variable; if TRUE, all direct and cross variograms are computed; if equal to "ST", direct and cross variograms are computed for all pairs involving the first (non-time lagged) variable; if equal to "ONLY", only cross variograms are computed (no direct variograms). } \item{formula}{formula, specifying the dependent variable and possible covariates} \item{x}{ object of class \code{variogram} or \code{variogramCloud} to be printed} \item{grid}{ grid parameters, if data are gridded (not to be called directly; this is filled automatically) } \item{map}{ logical; if TRUE, and \code{cutoff} and \code{width} are given, a variogram map is returned. This requires package sp. Alternatively, a map can be passed, of class SpatialDataFrameGrid (see sp docs) } \item{g}{ NULL or object of class gstat; may be used to pass settable parameters and/or variograms; see example } \item{projected}{logical; if FALSE, data are assumed to be unprojected, meaning decimal longitude/latitude. For projected data, Euclidian distances are computed, for unprojected great circle distances (km). In \code{variogram.formula} or \code{variogram.gstat}, for data deriving from class Spatial, projection is detected automatically using \code{is.projected}} \item{lambda}{test feature; not working (yet)} \item{verbose}{logical; print some progress indication} \item{pseudo}{ integer; use pseudo cross variogram for computing time-lagged spatial variograms? -1: find out from coordinates -- if they are equal then yes, else no; 0: no; 1: yes. } \item{covariogram}{logical; compute covariogram instead of variogram?} \item{PR}{logical; compute pairwise relative variogram (does NOT check whether variable is strictly positive)} } \value{ If map is TRUE (or a map is passed), a grid map is returned containing the (cross) variogram map(s). See package sp. In other cases, an object of class "gstatVariogram" with the following fields: \item{np}{the number of point pairs for this estimate; in case of a \code{variogramCloud} see below} \item{dist}{the average distance of all point pairs considered for this estimate} \item{gamma}{the actual sample variogram estimate} \item{dir.hor}{the horizontal direction} \item{dir.ver}{the vertical direction} \item{id}{the combined id pair} If cloud is TRUE: an object of class \code{variogramCloud}, with the field \code{np} encoding the numbers of the point pair that contributed to a variogram cloud estimate, as follows. The first point is found by 1 + the integer division of np by the \code{.BigInt} attribute of the returned object, the second point by 1 + the remainder of that division. \link{as.data.frame.variogramCloud} returns no \code{np} field, but does the decoding into: \item{left}{for variogramCloud: data id (row number) of one of the data pair} \item{right}{for variogramCloud: data id (row number) of the other data in the pair} In case of a spatio-temporal variogram is sought see \code{\link{variogramST}} for details. } \note{ \code{variogram.default} should not be called by users directly, as it makes many assumptions about the organization of the data, that are not fully documented (but of course, can be understood from reading the source code of the other \code{variogram} methods) Successfully setting \code{gridded() <- TRUE} may trigger a branch that will fail unless dx and dy are identical, and not merely similar to within machine epsilon. } \references{ Cressie, N.A.C., 1993, Statistics for Spatial Data, Wiley. Cressie, N., C. Wikle, 2011, Statistics for Spatio-temporal Data, Wiley. \url{http://www.gstat.org/} Pebesma, E.J., 2004. Multivariable geostatistics in S: the gstat package. Computers and Geosciences, 30: 683-691. } \author{ Edzer Pebesma } \note{ \code{variogram.line} is DEPRECATED; it is and was never meant as a variogram method, but works automatically as such by the R dispatch system. Use variogramLine instead. } \seealso{ \link{print.gstatVariogram}, \link{plot.gstatVariogram}, \link{plot.variogramCloud}; for variogram models: \link{vgm}, to fit a variogram model to a sample variogram: \link{fit.variogram} \code{\link{variogramST}} for details on the spatio-temporal sample variogram. } \examples{ library(sp) data(meuse) # no trend: coordinates(meuse) = ~x+y variogram(log(zinc)~1, meuse) # residual variogram w.r.t. a linear trend: variogram(log(zinc)~x+y, meuse) # directional variogram: variogram(log(zinc)~x+y, meuse, alpha=c(0,45,90,135)) variogram(log(zinc)~1, meuse, width=90, cutoff=1300) # GLS residual variogram: v = variogram(log(zinc)~x+y, meuse) v.fit = fit.variogram(v, vgm(1, "Sph", 700, 1)) v.fit set = list(gls=1) v g = gstat(NULL, "log-zinc", log(zinc)~x+y, meuse, model=v.fit, set = set) variogram(g) if (require(sf)) { proj4string(meuse) = CRS("+init=epsg:28992") meuse.ll = sf::st_transform(sf::st_as_sf(meuse), sf::st_crs("+proj=longlat +datum=WGS84")) # variogram of unprojected data, using great-circle distances, returning km as units print(variogram(log(zinc) ~ 1, meuse.ll)) } } \keyword{models} gstat/man/oxford.Rd0000644000176200001440000000650714646417261013762 0ustar liggesusers% $Id: oxford.Rd,v 1.5 2006-02-10 19:03:27 edzer Exp $ \name{oxford} \alias{oxford} \title{Oxford soil samples} \description{ Data: 126 soil augerings on a 100 x 100m square grid, with 6 columns and 21 rows. Grid is oriented with long axis North-north-west to South-south-east Origin of grid is South-south-east point, 100m outside grid. Original data are part of a soil survey carried out by P.A. Burrough in 1967. The survey area is located on the chalk downlands on the Berkshire Downs in Oxfordshire, UK. Three soil profile units were recognised on the shallow Rendzina soils; these are Ia - very shallow, grey calcareous soils less than 40cm deep over chalk; Ct - shallow to moderately deep, grey-brown calcareous soils on calcareous colluvium, and Cr: deep, moderately acid, red-brown clayey soils. These soil profile classes were registered at every augering. In addition, an independent landscape soil map was made by interpolating soil boundaries between these soil types, using information from the changes in landform. Because the soil varies over short distances, this field mapping caused some soil borings to receive a different classification from the classification based on the point data. Also registered at each auger point were the site elevation (m), the depth to solid chalk rock (in cm) and the depth to lime in cm. Also, the percent clay content, the Munsell colour components of VALUE and CHROMA , and the lime content of the soil (as tested using HCl) were recorded for the top two soil layers (0-20cm and 20-40cm). Samples of topsoil taken as a bulk sample within a circle of radius 2.5m around each sample point were used for the laboratory determination of Mg (ppm), OM1 \%, CEC as mequ/100g air dry soil, pH, P as ppm and K (ppm). } \format{ This data frame contains the following columns: \describe{ \item{PROFILE}{profile number} \item{XCOORD}{x-coordinate, field, non-projected} \item{YCOORD}{y-coordinate, field, non-projected} \item{ELEV}{elevation, m.} \item{PROFCLASS}{soil class, obtained by classifying the soil profile at the sample site } \item{MAPCLASS}{soil class, obtained by looking up the site location in the soil map} \item{VAL1}{Munsell colour component VALUE, 0-20 cm} \item{CHR1}{Munsell colour component CHROMA, 20-40 cm} \item{LIME1}{Lime content (tested using HCl), 0-20 cm} \item{VAL2}{Munsell colour component VALUE, 0-20 cm} \item{CHR2}{Munsell colour component CHROMA, 20-40 cm} \item{LIME2}{Lime content (tested using HCl), 20-40 cm} \item{DEPTHCM}{soil depth, cm } \item{DEP2LIME}{depth to lime, cm } \item{PCLAY1}{percentage clay, 0-20 cm} \item{PCLAY2}{percentage clay, 20-40 cm} \item{MG1}{Magnesium content (ppm), 0-20 cm} \item{OM1}{organic matter (\%), 0-20 cm} \item{CEC1}{CES as mequ/100g air dry soil, 0-20 cm} \item{PH1}{pH, 0-20 cm} \item{PHOS1}{Phosphorous, 0-20 cm, ppm} \item{POT1}{K (potassium), 0-20 cm, ppm} } } \usage{ data(oxford) } \author{ P.A. Burrough; compiled for R by Edzer Pebesma } \references{ P.A. Burrough, R.A. McDonnell, 1998. Principles of Geographical Information Systems. Oxford University Press. } \note{ \code{oxford.jpg}, in the gstat package external directory (see example below), shows an image of the soil map for the region } \keyword{datasets} \examples{ data(oxford) summary(oxford) # open the following file with a jpg viewer: system.file("external/oxford.jpg", package="gstat") } gstat/man/plot.gstatVariogram.Rd0000644000176200001440000001277014650146411016416 0ustar liggesusers% $Id: plot.gstatVariogram.Rd,v 1.14 2008-02-19 10:01:22 edzer Exp $ \name{plot.gstatVariogram} \alias{plot.gstatVariogram} \alias{plot.variogramMap} \alias{plot.StVariogram} \title{ Plot a sample variogram, and possibly a fitted model } \description{ Creates a variogram plot } \usage{ \method{plot}{gstatVariogram}(x, model = NULL, ylim, xlim, xlab = "distance", ylab = attr(x, "what"), panel = vgm.panel.xyplot, multipanel = TRUE, plot.numbers = FALSE, scales, ids = x$id, group.id = TRUE, skip, layout, ...) \method{plot}{variogramMap}(x, np = FALSE, skip, threshold, ...) \method{plot}{StVariogram}(x, model = NULL, ..., col = bpy.colors(), xlab, ylab, map = TRUE, convertMonths = FALSE, as.table = TRUE, wireframe = FALSE, diff = FALSE, all = FALSE) } \arguments{ \item{x}{ object obtained from the method \link{variogram}, possibly containing directional or cross variograms, space-time variograms and variogram model information } \item{model}{in case of a single variogram: a variogram model, as obtained from \link{vgm} or \link{fit.variogram}, to be drawn as a line in the variogram plot; in case of a set of variograms and cross variograms: a list with variogram models; in the spatio-temporal case, a single or a list of spatio-temporal models that will be plotted next to each other for visual comparison.} \item{ylim}{ numeric; vector of length 2, limits of the y-axis} \item{xlim}{ numeric; vector of length 2, limits of the x-axis} \item{xlab}{ character; x-axis label } \item{ylab}{ character; y-axis label } \item{panel}{ panel function } \item{multipanel}{ logical; if TRUE, directional variograms are plotted in different panels, if FALSE, directional variograms are plotted in the same graph, using color, colored lines and symbols to distinguish them } \item{plot.numbers}{ logical or numeric; if TRUE, plot number of point pairs next to each plotted semivariance symbol, if FALSE these are omitted. If numeric, TRUE is assumed and the value is passed as the relative distance to be used between symbols and numeric text values (default 0.03). } \item{scales}{ optional argument that will be passed to \code{\link[lattice]{xyplot}} in case of the plotting of variograms and cross variograms; use the value \code{list(relation = "same")} if y-axes need to share scales } \item{ids}{ ids of the data variables and variable pairs } \item{group.id}{ logical; control for directional multivariate variograms: if TRUE, panels divide direction and colors indicate variables (ids), if FALSE panels divide variables/variable pairs and colors indicate direction} \item{skip}{ logical; can be used to arrange panels, see \code{\link[lattice]{xyplot}}} \item{layout}{ integer vector; can be used to set panel layout: c(ncol,nrow) } \item{np}{ logical (only for plotting variogram maps); if TRUE, plot number of point pairs, if FALSE plot semivariances } \item{threshold}{semivariogram map values based on fewer point pairs than threshold will not be plotted} \item{\dots}{ any arguments that will be passed to the panel plotting functions (such as \code{auto.key} in examples below) } \item{col}{colors to use} \item{map}{logical; if TRUE, plot space-time variogram map} \item{convertMonths}{logical; if TRUE, \code{yearmon} time lags will be unit converted and plotted as (integer) months, and no longer match the numeric representation of \code{yearmon}, which has years as unit } \item{as.table}{controls the plotting order for multiple panels, see \code{\link[lattice]{xyplot}} for details.} \item{wireframe}{logical; if TRUE, produce a wireframe plot} \item{diff}{logical; if TRUE, plot difference between model and sample variogram; ignores \code{all}.} \item{all}{logical; if TRUE, plot sample and model variogram(s) in single wireframes.} } \value{ returns (or plots) the variogram plot } \details{Please note that in the spatio-temporal case the levelplot and wireframe plots use the spatial distances averaged for each time lag \code{avgDist}. For strongly varying spatial locations over time, please check the distance columns \code{dist} and \code{avgDist} of the spatio-temporal sample variogram. The \code{lattice::cloud} function is one option to plot irregular 3D data.} \references{ \url{http://www.gstat.org}} \author{ Edzer Pebesma } \note{ currently, plotting models and/or point pair numbers is not supported when a variogram is both directional and multivariable; also, three-dimensional directional variograms will probably not be displayed correctly. } \seealso{ \link{variogram}, \link{fit.variogram}, \link{vgm} \link{variogramLine}, } \examples{ library(sp) data(meuse) coordinates(meuse) = ~x+y vgm1 <- variogram(log(zinc)~1, meuse) plot(vgm1) model.1 <- fit.variogram(vgm1,vgm(1,"Sph",300,1)) plot(vgm1, model=model.1) plot(vgm1, plot.numbers = TRUE, pch = "+") vgm2 <- variogram(log(zinc)~1, meuse, alpha=c(0,45,90,135)) plot(vgm2) # the following demonstrates plotting of directional models: model.2 <- vgm(.59,"Sph",926,.06,anis=c(0,0.3)) plot(vgm2, model=model.2) g = gstat(NULL, "zinc < 200", I(zinc<200)~1, meuse) g = gstat(g, "zinc < 400", I(zinc<400)~1, meuse) g = gstat(g, "zinc < 800", I(zinc<800)~1, meuse) # calculate multivariable, directional variogram: v = variogram(g, alpha=c(0,45,90,135)) plot(v, group.id = FALSE, auto.key = TRUE) # id and id pairs panels plot(v, group.id = TRUE, auto.key = TRUE) # direction panels # variogram maps: plot(variogram(g, cutoff=1000, width=100, map=TRUE), main = "(cross) semivariance maps") plot(variogram(g, cutoff=1000, width=100, map=TRUE), np=TRUE, main = "number of point pairs") } \keyword{dplot} gstat/man/vgmArea.Rd0000644000176200001440000000207514646417261014037 0ustar liggesusers% $Id: variogramLine.Rd,v 1.3 2008-08-19 07:27:02 edzer Exp $ \name{vgmArea} \alias{vgmArea} \title{ point-point, point-area or area-area semivariance } \description{ Compute point-point, point-area or area-area variogram values from point model } \usage{ vgmArea(x, y = x, vgm, ndiscr = 16, verbose = FALSE, covariance = TRUE) } \arguments{ \item{x}{ object of class \link[sp]{SpatialPoints} or \link[sp]{SpatialPolygons}} \item{y}{ object of class \link[sp]{SpatialPoints} or \link[sp]{SpatialPolygons}} \item{vgm}{ variogram model, see \link{vgm}} \item{ndiscr}{ number of points to discretize an area, using \link[sp]{spsample}} \item{verbose}{ give progress bar } \item{covariance}{ logical; compute covariances, rather than semivariances? } } \value{ semivariance or covariance matrix of dimension \code{length(x)} x \code{lenght(y)}} \author{ Edzer Pebesma } \examples{ library(sp) demo(meuse, ask = FALSE, echo = FALSE) vgmArea(meuse[1:5,], vgm = vgm(1, "Exp", 1000)) # point-point vgmArea(meuse[1:5,], meuse.area, vgm = vgm(1, "Exp", 1000)) # point-area } \keyword{models} gstat/man/plot.pointPairs.Rd0000644000176200001440000000334214646417261015560 0ustar liggesusers% $Id: plot.pointPairs.Rd,v 1.5 2006-12-12 20:44:07 edzer Exp $ \name{plot.pointPairs} \alias{plot.pointPairs} \title{ Plot a point pairs, identified from a variogram cloud } \description{ Plot a point pairs, identified from a variogram cloud } \usage{ \method{plot}{pointPairs}(x, data, xcol = data$x, ycol = data$y, xlab = "x coordinate", ylab = "y coordinate", col.line = 2, line.pch = 0, main = "selected point pairs", ...) } \arguments{ \item{x}{ object of class "pointPairs", obtained from the function \link{plot.variogramCloud}, containing point pair indices } \item{data}{ data frame to which the indices refer (from which the variogram cloud was calculated) } \item{xcol}{ numeric vector with x-coordinates of data } \item{ycol}{ numeric vector with y-coordinates of data } \item{xlab}{ x-axis label } \item{ylab}{ y-axis label } \item{col.line}{ color for lines connecting points } \item{line.pch}{ if non-zero, symbols are also plotted at the middle of line segments, to mark lines too short to be visible on the plot; the color used is \code{col.line}; the value passed to this argument will be used as plotting symbol (pch) } \item{main}{ title of plot } \item{...}{ arguments, further passed to \code{xyplot}} } \value{ plots the data locations, with lines connecting the point pairs identified (and refered to by indices in) x } \references{ \url{http://www.gstat.org}} \author{ Edzer Pebesma } \seealso{ \link{plot.variogramCloud} } \examples{ ### The following requires interaction, and is therefore outcommented #data(meuse) #coordinates(meuse) = ~x+y #vgm1 <- variogram(log(zinc)~1, meuse, cloud = TRUE) #pp <- plot(vgm1, id = TRUE) ### Identify the point pairs #plot(pp, data = meuse) # meuse has x and y as coordinates } \keyword{dplot} gstat/man/vgmAreaST.Rd0000644000176200001440000000155614646417261014311 0ustar liggesusers\name{vgmAreaST} \alias{vgmAreaST} \title{ Function that returns the covariances for areas } \description{ Function that returns the covariances for areas based on spatio-temporal point variograms for use in the spatio-temporal area-to-point kriging } \usage{ vgmAreaST(x, y = x, model, ndiscrSpace = 16, verbose = FALSE, covariance = TRUE) } \arguments{ \item{x}{spatio-temporal data frame} \item{y}{spatio-temporal data frame} \item{model}{spatio-temporal variogram model for point support} \item{ndiscrSpace}{number of discretisation in space} \item{verbose}{Boolean: default to FALSE, set to TRUE for debugging} \item{covariance}{Boolean: whether the covariance shall be evaluated, currently disfunction and set to TRUE} } \value{The covariance between 'x' and 'y'.} \author{Benedikt Graeler} \seealso{\code{\link{vgmArea}}} \examples{ # see demo('a2pinST') } gstat/man/fulmar.Rd0000644000176200001440000000205114646417261013735 0ustar liggesusers% $Id: fulmar.Rd,v 1.7 2008-07-03 11:49:08 edzer Exp $ \name{fulmar} \alias{fulmar} \title{Fulmaris glacialis data} \description{ Airborne counts of Fulmaris glacialis during the Aug/Sept 1998 and 1999 flights on the Dutch (Netherlands) part of the North Sea (NCP, Nederlands Continentaal Plat). } \format{ This data frame contains the following columns: \describe{ \item{year}{year of measurement: 1998 or 1999} \item{x}{x-coordinate in UTM zone 31} \item{y}{y-coordinate in UTM zone 31} \item{depth}{sea water depth, in m} \item{coast}{distance to coast of the Netherlands, in km.} \item{fulmar}{observed density (number of birds per square km)} } } \usage{ data(fulmar) } \author{ Dutch National Institute for Coastal and Marine Management (RIKZ) } \seealso{\link{ncp.grid} E.J. Pebesma, R.N.M. Duin, P.A. Burrough, 2005. Mapping Sea Bird Densities over the North Sea: Spatially Aggregated Estimates and Temporal Changes. Environmetrics 16, (6), p 573-587. } \keyword{datasets} \examples{ data(fulmar) summary(fulmar) \dontrun{ demo(fulmar) } } gstat/man/vgm.Rd0000644000176200001440000001622014646417261013243 0ustar liggesusers% $Id: vgm.Rd,v 1.16 2008-10-09 14:25:20 edzer Exp $ \name{vgm} \alias{vgm} \alias{print.variogramModel} \alias{plot.variogramModel} \alias{as.vgm.variomodel} \title{ Generate, or Add to Variogram Model } \description{ Generates a variogram model, or adds to an existing model. \code{print.variogramModel} prints the essence of a variogram model. } \usage{ vgm(psill = NA, model, range = NA, nugget, add.to, anis, kappa = 0.5, ..., covtable, Err = 0) \method{print}{variogramModel}(x, ...) \method{plot}{variogramModel}(x, cutoff, ..., type = 'l') as.vgm.variomodel(m) } \arguments{ \item{psill}{ (partial) sill of the variogram model component, or model: see Details } \item{model}{ model type, e.g. "Exp", "Sph", "Gau", or "Mat". Can be a character vector of model types combined with c(), e.g. c("Exp", "Sph"), in which case the best fitting is returned. Calling vgm() without a model argument returns a data.frame with available models. } \item{range}{ range parameter of the variogram model component; in case of anisotropy: major range } \item{kappa}{ smoothness parameter for the Matern class of variogram models } \item{nugget}{ nugget component of the variogram (this basically adds a nugget compontent to the model); if missing, nugget component is omitted } \item{add.to}{ the variogram model to which we want to add a component (structure) } \item{anis}{ anisotropy parameters: see notes below } \item{x}{ a variogram model to print or plot} \item{...}{ arguments that will be passed to \code{print}, e.g. \code{digits} (see examples), or to \code{variogramLine} for the plot method } \item{covtable}{ if model is \code{Tab}, instead of model parameters a one-dimensional covariance table can be passed here. See covtable.R in tests directory, and example below. } \item{Err}{ numeric; if larger than zero, the measurement error variance component that will not be included to the kriging equations, i.e. kriging will now smooth the process Y instead of predict the measured Z, where Z=Y+e, and Err is the variance of e} \item{m}{ object of class \code{variomodel}, see \pkg{geoR}} \item{cutoff}{maximum distance up to which variogram values are computed} \item{type}{plot type} } \value{ If a single model is passed, an object of class \code{variogramModel} extending \code{data.frame}. In case a vector ofmodels is passed, an object of class \code{variogramModelList} which is a list of \code{variogramModel} objects. When called without a model argument, a data.frame with available models is returned, having two columns: short (abbreviated names, to be used as model argument: "Exp", "Sph" etc) and long (with some description). as.vgm.variomodel tries to convert an object of class variomodel (geoR) to vgm. } \author{ Edzer Pebesma } \details{ If only the first argument (\code{psill}) is given a \code{character} value/vector indicating one or more models, as in \code{vgm("Sph")}, then this taken as a shorthand form of \code{vgm(NA,"Sph",NA,NA)}, i.e. a spherical variogram with nugget and unknown parameter values; see examples below. Read \link{fit.variogram} to find out how \code{NA} variogram parameters are given initial values for a fitting a model, based on the sample variogram. Package \code{automap} gives further options for automated variogram modelling. } \note{ Geometric anisotropy can be modelled for each individual simple model by giving two or five anisotropy parameters, two for two-dimensional and five for three-dimensional data. In any case, the range defined is the range in the direction of the strongest correlation, or the major range. Anisotropy parameters define which direction this is (the main axis), and how much shorter the range is in (the) direction(s) perpendicular to this main axis. In two dimensions, two parameters define an anisotropy ellipse, say \code{anis = c(30, 0.5)}. The first parameter, \code{30}, refers to the main axis direction: it is the angle for the principal direction of continuity (measured in degrees, clockwise from positive Y, i.e. North). The second parameter, \code{0.5}, is the anisotropy ratio, the ratio of the minor range to the major range (a value between 0 and 1). So, in our example, if the range in the major direction (North-East) is 100, the range in the minor direction (South-East) is 0.5 x 100 = 50. In three dimensions, five values should be given in the form \code{anis = c(p,q,r,s,t)}. Now, $p$ is the angle for the principal direction of continuity (measured in degrees, clockwise from Y, in direction of X), $q$ is the dip angle for the principal direction of continuity (measured in positive degrees up from horizontal), $r$ is the third rotation angle to rotate the two minor directions around the principal direction defined by $p$ and $q$. A positive angle acts counter-clockwise while looking in the principal direction. Anisotropy ratios $s$ and $t$ are the ratios between the major range and each of the two minor ranges. The anisotropy code was taken from GSLIB. Note that in \url{http://www.gslib.com/sec_gb.html} it is reported that this code has a bug. Quoting from this site: ``The third angle in all GSLIB programs operates in the opposite direction than specified in the GSLIB book. Explanation - The books says (pp27) the angle is measured clockwise when looking toward the origin (from the postive principal direction), but it should be counter-clockwise. This is a documentation error. Although rarely used, the correct specification of the third angle is critical if used.'' (Note that \code{anis = c(p,s)} is equivalent to \code{anis = c(p,0,0,s,1)}.) The implementation in gstat for 2D and 3D anisotropy was taken from the gslib (probably 1992) code. I have seen a paper where it is argued that the 3D anisotropy code implemented in gslib (and so in gstat) is in error, but I have not corrected anything afterwards. } \references{ \url{http://www.gstat.org/} Pebesma, E.J., 2004. Multivariable geostatistics in S: the gstat package. Computers and Geosciences, 30: 683-691. Deutsch, C.V. and Journel, A.G., 1998. GSLIB: Geostatistical software library and user's guide, second edition, Oxford University Press. For the validity of variogram models on the sphere, see Huang, Chunfeng, Haimeng Zhang, and Scott M. Robeson. On the validity of commonly used covariance and variogram functions on the sphere. Mathematical Geosciences 43.6 (2011): 721-733. } \seealso{ \link{show.vgms} to view the available models, \link{fit.variogram}, \link{variogramLine}, \link{variogram} for the sample variogram. } \examples{ vgm() vgm("Sph") vgm(NA, "Sph", NA, NA) vgm(, "Sph") # "Sph" is second argument: NO nugget in this case vgm(10, "Exp", 300) x <- vgm(10, "Exp", 300) vgm(10, "Nug", 0) vgm(10, "Exp", 300, 4.5) vgm(10, "Mat", 300, 4.5, kappa = 0.7) vgm( 5, "Exp", 300, add.to = vgm(5, "Exp", 60, nugget = 2.5)) vgm(10, "Exp", 300, anis = c(30, 0.5)) vgm(10, "Exp", 300, anis = c(30, 10, 0, 0.5, 0.3)) # Matern variogram model: vgm(1, "Mat", 1, kappa=.3) x <- vgm(0.39527463, "Sph", 953.8942, nugget = 0.06105141) x print(x, digits = 3); # to see all components, do print.data.frame(x) vv=vgm(model = "Tab", covtable = variogramLine(vgm(1, "Sph", 1), 1, n=1e4, min = 0, covariance = TRUE)) vgm(c("Mat", "Sph")) vgm(, c("Mat", "Sph")) # no nugget } \keyword{models} gstat/man/krige.Rd0000644000176200001440000002413414646417261013556 0ustar liggesusers% $Id: krige.Rd,v 1.25 2010-01-12 12:15:48 edzer Exp $ \name{krige} \docType{methods} \alias{krige} \alias{krige0} %\alias{krigeST} \alias{krige.locations} \alias{krige.spatial} \alias{idw} \alias{idw0} \alias{idw.locations} \alias{idw.spatial} \alias{krige-methods} \alias{idw-methods} \alias{krige,formula,formula-method} \alias{krige,formula,Spatial-method} \alias{krige,formula,sf-method} \alias{krige,formula,NULL-method} \alias{idw,formula,formula-method} \alias{idw,formula,Spatial-method} \alias{idw,formula,sf-method} \alias{idw,formula,ST-method} % move to krigeST as well? % \alias{krige,formula,ST-method} % calling krigeST \title{ Simple, Ordinary or Universal, global or local, Point or Block Kriging, or simulation. } \description{ Function for simple, ordinary or universal kriging (sometimes called external drift kriging), kriging in a local neighbourhood, point kriging or kriging of block mean values (rectangular or irregular blocks), and conditional (Gaussian or indicator) simulation equivalents for all kriging varieties, and function for inverse distance weighted interpolation. For multivariable prediction, see \link{gstat} and \link[gstat]{predict} } \usage{ krige(formula, locations, ...) krige.locations(formula, locations, data, newdata, model, ..., beta, nmax = Inf, nmin = 0, omax = 0, maxdist = Inf, block, nsim = 0, indicators = FALSE, na.action = na.pass, debug.level = 1) krige.spatial(formula, locations, newdata, model, ..., beta, nmax = Inf, nmin = 0, omax = 0, maxdist = Inf, block, nsim = 0, indicators = FALSE, na.action = na.pass, debug.level = 1) krige0(formula, data, newdata, model, beta, y, ..., computeVar = FALSE, fullCovariance = FALSE) idw(formula, locations, ...) idw.locations(formula, locations, data, newdata, nmax = Inf, nmin = 0, omax = 0, maxdist = Inf, block, na.action = na.pass, idp = 2.0, debug.level = 1) idw.spatial(formula, locations, newdata, nmax = Inf, nmin = 0, omax = 0, maxdist = Inf, block = numeric(0), na.action = na.pass, idp = 2.0, debug.level = 1) idw0(formula, data, newdata, y, idp = 2.0) } \arguments{ \item{formula}{ formula that defines the dependent variable as a linear model of independent variables; suppose the dependent variable has name \code{z}, for ordinary and simple kriging use the formula \code{z~1}; for simple kriging also define \code{beta} (see below); for universal kriging, suppose \code{z} is linearly dependent on \code{x} and \code{y}, use the formula \code{z~x+y}} \item{locations}{ object of class \code{Spatial} or \code{sf}, or (deprecated) formula defines the spatial data locations (coordinates) such as \code{~x+y}} \item{data}{ data frame: should contain the dependent variable, independent variables, and coordinates, should be missing if locations contains data. } \item{newdata}{ object of class \code{Spatial}, \code{sf} or \code{stars} with prediction/simulation locations; should contain attributes with the independent variables (if present). } \item{model}{ variogram model of dependent variable (or its residuals), defined by a call to \link{vgm} or \link{fit.variogram}; for \code{krige0} also a user-supplied covariance function is allowed (see example below) } \item{beta}{ for simple kriging (and simulation based on simple kriging): vector with the trend coefficients (including intercept); if no independent variables are defined the model only contains an intercept and beta should be the simple kriging mean } \item{nmax}{ for local kriging: the number of nearest observations that should be used for a kriging prediction or simulation, where nearest is defined in terms of the space of the spatial locations. By default, all observations are used } \item{nmin}{ for local kriging: if the number of nearest observations within distance \code{maxdist} is less than \code{nmin}, a missing value will be generated; see maxdist } \item{omax}{ see \link{gstat} } \item{maxdist}{ for local kriging: only observations within a distance of \code{maxdist} from the prediction location are used for prediction or simulation; if combined with \code{nmax}, both criteria apply } \item{block}{ block size; a vector with 1, 2 or 3 values containing the size of a rectangular in x-, y- and z-dimension respectively (0 if not set), or a data frame with 1, 2 or 3 columns, containing the points that discretize the block in the x-, y- and z-dimension to define irregular blocks relative to (0,0) or (0,0,0)---see also the details section of \link[gstat]{predict}. By default, predictions or simulations refer to the support of the data values. } \item{nsim}{ integer; if set to a non-zero value, conditional simulation is used instead of kriging interpolation. For this, sequential Gaussian or indicator simulation is used (depending on the value of \code{indicators}), following a single random path through the data. } \item{indicators}{ logical, only relevant if \code{nsim} is non-zero; if TRUE, use indicator simulation; else use Gaussian simulation } \item{na.action}{ function determining what should be done with missing values in 'newdata'. The default is to predict 'NA'. Missing values in coordinates and predictors are both dealt with. } \item{debug.level}{debug level, passed to \link[gstat]{predict}; use -1 to see progress in percentage, and 0 to suppress all printed information } \item{\dots}{ for krige: arguments that will be passed to \link{gstat}; for \code{krige0}: arguments that will be passe to \code{model}} \item{idp}{numeric; specify the inverse distance weighting power} \item{y}{matrix; to krige multiple fields in a single step, pass data as columns of matrix \code{y}. This will ignore the value of the response in \code{formula}.} \item{computeVar}{logical; if TRUE, prediction variances will be returned} \item{fullCovariance}{logical; if FALSE a vector with prediction variances will be returned, if TRUE the full covariance matrix of all predictions will be returned} } \section{Methods}{ \describe{ \item{formula = "formula", locations = "formula"}{ locations specifies which coordinates in \code{data} refer to spatial coordinates } \item{formula = "formula", locations = "Spatial"}{ Object locations knows about its own spatial locations } \item{formula = "formula", locations = "NULL"}{ used in case of unconditional simulations; newdata needs to be of class Spatial } }} \details{ Function \code{krige} is a simple wrapper method around \link{gstat} and \link[gstat]{predict} for univariate kriging prediction and conditional simulation methods available in gstat. For multivariate prediction or simulation, or for other interpolation methods provided by gstat (such as inverse distance weighted interpolation or trend surface interpolation) use the functions \link{gstat} and \link[gstat]{predict} directly. Function \code{idw} performs just as \code{krige} without a model being passed, but allows direct specification of the inverse distance weighting power. Don't use with predictors in the formula. For further details, see \link[gstat]{predict}. } \value{ if \code{locations} is not a formula, object of the same class as \code{newdata} (deriving from \code{Spatial}); else a data frame containing the coordinates of \code{newdata}. Attributes columns contain prediction and prediction variance (in case of kriging) or the \code{abs(nsim)} columns of the conditional Gaussian or indicator simulations \code{krige0} and \code{idw0} are alternative functions with reduced functionality and larger memory requirements; they return numeric vectors (or matrices, in case of multiple dependent) with predicted values only; in case \code{computeVar} is TRUE, a list with elements \code{pred} and \code{var} is returned, containing predictions, and (co)variances (depending on argument \code{fullCovariance}). } \references{ N.A.C. Cressie, 1993, Statistics for Spatial Data, Wiley. \url{http://www.gstat.org/} Pebesma, E.J., 2004. Multivariable geostatistics in S: the gstat package. Computers and Geosciences, 30: 683-691. } \author{ Edzer Pebesma } \note{ Daniel G. Krige is a South African scientist who was a mining engineer when he first used generalised least squares prediction with spatial covariances in the 50's. George Matheron coined the term \code{kriging} in the 60's for the action of doing this, although very similar approaches had been taken in the field of meteorology. Beside being Krige's name, I consider "krige" to be to "kriging" what "predict" is to "prediction". } \seealso{ \link{gstat}, \link[gstat]{predict} } \examples{ library(sp) data(meuse) coordinates(meuse) = ~x+y data(meuse.grid) gridded(meuse.grid) = ~x+y m <- vgm(.59, "Sph", 874, .04) # ordinary kriging: x <- krige(log(zinc)~1, meuse, meuse.grid, model = m) spplot(x["var1.pred"], main = "ordinary kriging predictions") spplot(x["var1.var"], main = "ordinary kriging variance") # simple kriging: x <- krige(log(zinc)~1, meuse, meuse.grid, model = m, beta = 5.9) # residual variogram: m <- vgm(.4, "Sph", 954, .06) # universal block kriging: x <- krige(log(zinc)~x+y, meuse, meuse.grid, model = m, block = c(40,40)) spplot(x["var1.pred"], main = "universal kriging predictions") # krige0, using user-defined covariance function and multiple responses in y: # exponential variogram with range 500, defined as covariance function: v = function(x, y = x) { exp(-spDists(coordinates(x),coordinates(y))/500) } # krige two variables in a single pass (using 1 covariance model): y = cbind(meuse$zinc,meuse$copper,meuse$lead,meuse$cadmium) x <- krige0(zinc~1, meuse, meuse.grid, v, y = y) meuse.grid$zinc = x[,1] spplot(meuse.grid["zinc"], main = "zinc") meuse.grid$copper = x[,2] spplot(meuse.grid["copper"], main = "copper") # the following has NOTHING to do with kriging, but -- # return the median of the nearest 11 observations: x = krige(zinc~1, meuse, meuse.grid, set = list(method = "med"), nmax = 11) # get 25%- and 75%-percentiles of nearest 11 obs, as prediction and variance: x = krige(zinc~1, meuse, meuse.grid, nmax = 11, set = list(method = "med", quantile = 0.25)) # get diversity (# of different values) and mode from 11 nearest observations: x = krige(zinc~1, meuse, meuse.grid, nmax = 11, set = list(method = "div")) } \keyword{ models } gstat/man/ossfim.Rd0000644000176200001440000000425714646417261013761 0ustar liggesusers% $Id: ossfim.Rd,v 1.3 2006-02-10 19:03:27 edzer Exp $ \name{ossfim} \alias{ossfim} \title{ Kriging standard errors as function of grid spacing and block size} \description{ Calculate, for a given variogram model, ordinary block kriging standard errors as a function of sampling spaces and block sizes } \usage{ ossfim(spacings = 1:5, block.sizes = 1:5, model, nmax = 25, debug = 0) } \arguments{ \item{spacings}{range of grid (data) spacings to be used} \item{block.sizes}{ range of block sizes to be used} \item{model}{variogram model, output of \code{vgm}} \item{nmax}{set the kriging neighbourhood size} \item{debug}{debug level; set to 32 to see a lot of output} } \value{ data frame with columns \code{spacing} (the grid spacing), \code{block.size} (the block size), and \code{kriging.se} (block kriging standard error) } \references{ Burrough, P.A., R.A. McDonnell (1999) Principles of Geographical Information Systems. Oxford University Press (e.g., figure 10.11 on page 261) Burgess, T.M., R. Webster, A.B. McBratney (1981) Optimal interpolation and isarithmic mapping of soil properties. IV Sampling strategy. The journal of soil science 32(4), 643-660. McBratney, A.B., R. Webster (1981) The design of optimal sampling schemes for local estimation and mapping of regionalized variables: 2 program and examples. Computers and Geosciences 7: 335-365. } \author{ Edzer Pebesma } \note{ The idea is old, simple, but still of value. If you want to map a variable with a given accuracy, you will have to sample it. Suppose the variogram of the variable is known. Given a regular sampling scheme, the kriging standard error decreases when either (i) the data spacing is smaller, or (ii) predictions are made for larger blocks. This function helps quantifying this relationship. Ossfim probably refers to ``optimal sampling scheme for isarithmic mapping''. } \seealso{ \link{krige} } \examples{ \dontrun{ x <- ossfim(1:15,1:15, model = vgm(1,"Exp",15)) library(lattice) levelplot(kriging.se~spacing+block.size, x, main = "Ossfim results, variogram 1 Exp(15)") } # if you wonder about the decrease in the upper left corner of the graph, # try the above with nmax set to 100, or perhaps 200. } \keyword{models} gstat/man/krigeTg.Rd0000644000176200001440000001006114650147010014026 0ustar liggesusers% $Id: krigeTg.Rd,v 1.10 2009-08-17 14:38:28 edzer Exp $ \name{krigeTg} \docType{methods} \alias{krigeTg} \title{ TransGaussian kriging using Box-Cox transforms } \description{ TransGaussian (ordinary) kriging function using Box-Cox transforms } \usage{ krigeTg(formula, locations, newdata, model = NULL, ..., nmax = Inf, nmin = 0, maxdist = Inf, block = numeric(0), nsim = 0, na.action = na.pass, debug.level = 1, lambda = 1.0) } \arguments{ \item{formula}{ formula that defines the dependent variable as a linear model of independent variables; suppose the dependent variable has name \code{z}, for ordinary and use a formula like \code{z~1}; the dependent variable should be NOT transformed. } \item{locations}{ object of class \code{Spatial}, with observations } \item{newdata}{ Spatial object with prediction/simulation locations; the coordinates should have names as defined in \code{locations} } \item{model}{ variogram model of the TRANSFORMED dependent variable, see \link{vgm}, or \link{fit.variogram}} \item{nmax}{ for local kriging: the number of nearest observations that should be used for a kriging prediction or simulation, where nearest is defined in terms of the space of the spatial locations. By default, all observations are used } \item{nmin}{ for local kriging: if the number of nearest observations within distance \code{maxdist} is less than \code{nmin}, a missing value will be generated; see maxdist } \item{maxdist}{ for local kriging: only observations within a distance of \code{maxdist} from the prediction location are used for prediction or simulation; if combined with \code{nmax}, both criteria apply } \item{block}{ does not function correctly, afaik } \item{nsim}{ does not function correctly, afaik } \item{na.action}{ function determining what should be done with missing values in 'newdata'. The default is to predict 'NA'. Missing values in coordinates and predictors are both dealt with. } \item{lambda}{value for the Box-Cox transform} \item{debug.level}{debug level, passed to \link[gstat]{predict}; use -1 to see progress in percentage, and 0 to suppress all printed information } \item{\dots}{ other arguments that will be passed to \link{gstat}} } \details{ Function \code{krigeTg} uses transGaussian kriging as explained in \url{https://www.math.umd.edu/~bnk/bak/Splus/kriging.html}. As it uses the R/gstat krige function to derive everything, it needs in addition to ordinary kriging on the transformed scale a simple kriging step to find m from the difference between the OK and SK prediction variance, and a kriging/BLUE estimation step to obtain the estimate of \eqn{\mu}{mu}. For further details, see \link{krige} and \link[gstat]{predict}. } \value{ an SpatialPointsDataFrame object containing the fields: \code{m} for the m (Lagrange) parameter for each location; \code{var1SK.pred} the \eqn{c_0 C^{-1}}{c0 Cinv} correction obtained by \code{muhat} for the mean estimate at each location; \code{var1SK.var} the simple kriging variance; \code{var1.pred} the OK prediction on the transformed scale; \code{var1.var} the OK kriging variance on the transformed scale; \code{var1TG.pred} the transGaussian kriging predictor; \code{var1TG.var} the transGaussian kriging variance, obtained by \eqn{\phi'(\hat{\mu},\lambda)^2 \sigma^2_{OK}}{phi'(muhat, lambda)^2 * var1.var} } \references{ N.A.C. Cressie, 1993, Statistics for Spatial Data, Wiley. \url{http://www.gstat.org/} } \author{ Edzer Pebesma } \seealso{ \link{gstat}, \link[gstat]{predict} } \examples{ \donttest{ library(sp) data(meuse) coordinates(meuse) = ~x+y data(meuse.grid) gridded(meuse.grid) = ~x+y v = vgm(1, "Exp", 300) x1 = krigeTg(zinc~1,meuse,meuse.grid,v, lambda=1) # no transform x2 = krige(zinc~1,meuse,meuse.grid,v) summary(x2$var1.var-x1$var1TG.var) summary(x2$var1.pred-x1$var1TG.pred) lambda = -0.25 m = fit.variogram(variogram((zinc^lambda-1)/lambda ~ 1,meuse), vgm(1, "Exp", 300)) x = krigeTg(zinc~1,meuse,meuse.grid,m,lambda=-.25) spplot(x["var1TG.pred"], col.regions=bpy.colors()) summary(meuse$zinc) summary(x$var1TG.pred) } } \keyword{ models } gstat/man/map.to.lev.Rd0000644000176200001440000000200314646417261014427 0ustar liggesusers% $Id: map.to.lev.Rd,v 1.4 2006-02-10 19:03:27 edzer Exp $ \name{map.to.lev} \alias{map.to.lev} \title{ rearrange data frame for plotting with levelplot } \description{ rearrange data frame for plotting with levelplot } \usage{ map.to.lev(data, xcol = 1, ycol = 2, zcol = c(3, 4), ns = names(data)[zcol]) } \arguments{ \item{data}{ data frame, e.g. output from \link{krige} or \link[gstat]{predict} } \item{xcol}{ x-coordinate column number } \item{ycol}{ y-coordinate column number } \item{zcol}{ z-coordinate column number range } \item{ns}{names of the set of z-columns to be viewed} } \value{ data frame with the following elements: \item{x}{ x-coordinate for each row} \item{y}{ y-coordinate for each row} \item{z}{ column vector with each of the elements in columns \code{zcol} of \code{data} stacked } \item{name}{ factor; name of each of the stacked \code{z} columns } } \seealso{ \link{image.data.frame}, \link{krige}; for examples see \link[gstat]{predict}; \code{levelplot} in package lattice. } \keyword{dplot} gstat/man/get.contr.Rd0000644000176200001440000000270614646417261014361 0ustar liggesusers% $Id: get.contr.Rd,v 1.6 2009-02-20 13:53:38 edzer Exp $ \name{get.contr} \alias{get.contr} \title{ Calculate contrasts from multivariable predictions } \description{ Given multivariable predictions and prediction (co)variances, calculate contrasts and their (co)variance } \usage{ get.contr(data, gstat.object, X, ids = names(gstat.object$data)) } \arguments{ \item{data}{data frame, output of \link[gstat]{predict} } \item{gstat.object}{object of class \code{gstat}, used to extract ids; may be missing if \code{ids} is used } \item{X}{ contrast vector or matrix; the number of variables in \code{gstat.object} should equal the number of elements in \code{X} if \code{X} is a vector, or the number of rows in \code{X} if \code{X} is a matrix. } \item{ids}{ character vector with (selection of) id names, present in data } } \details{ From data, we can extract the \eqn{n \times 1}{n x 1} vector with multivariable predictions, say $y$, and its \eqn{n \times n}{n x n} covariance matrix $V$. Given a contrast matrix in $X$, this function computes the contrast vector $C=X'y$ and its variance $Var(C)=X'V X$. } \value{ a data frame containing for each row in \code{data} the generalized least squares estimates (named beta.1, beta.2, ...), their variances (named var.beta.1, var.beta.2, ...) and covariances (named cov.beta.1.2, cov.beta.1.3, ...) } \references{ \url{http://www.gstat.org/} } \author{ Edzer Pebesma } \seealso{\link[gstat]{predict}} \keyword{ models } gstat/man/krige.cv.Rd0000644000176200001440000001417514646417261014171 0ustar liggesusers% $Id: krige.cv.Rd,v 1.18 2009-10-30 16:11:21 edzer Exp $ \name{krige.cv} \docType{methods} \alias{krige.cv} \alias{krige.cv.spatial} \alias{krige.cv.locations} \alias{gstat.cv} \alias{krige.cv,formula,formula-method} \alias{krige.cv,formula,Spatial-method} \alias{krige.cv,formula,sf-method} \title{ (co)kriging cross validation, n-fold or leave-one-out } \description{ Cross validation functions for simple, ordinary or universal point (co)kriging, kriging in a local neighbourhood. } \usage{ gstat.cv(object, nfold, remove.all = FALSE, verbose = interactive(), all.residuals = FALSE, ...) krige.cv(formula, locations, ...) krige.cv.locations(formula, locations, data, model = NULL, ..., beta = NULL, nmax = Inf, nmin = 0, maxdist = Inf, nfold = nrow(data), verbose = interactive(), debug.level = 0) krige.cv.spatial(formula, locations, model = NULL, ..., beta = NULL, nmax = Inf, nmin = 0, maxdist = Inf, nfold = nrow(locations), verbose = interactive(), debug.level = 0) } \arguments{ \item{object}{ object of class gstat; see function \link{gstat}} \item{nfold}{ integer; if larger than 1, then apply n-fold cross validation; if \code{nfold} equals \code{nrow(data)} (the default), apply leave-one-out cross validation; if set to e.g. 5, five-fold cross validation is done. To specify the folds, pass an integer vector of length \code{nrow(data)} with fold indexes. } \item{remove.all}{ logical; if TRUE, remove observations at cross validation locations not only for the first, but for all subsequent variables as well } \item{verbose}{ logical; if FALSE, progress bar is suppressed } \item{all.residuals}{ logical; if TRUE, residuals for all variables are returned instead of for the first variable only} \item{\dots}{ other arguments that will be passed to \link[gstat]{predict} in case of \code{gstat.cv}, or to \link{gstat} in case of \code{krige.cv}} \item{formula}{ formula that defines the dependent variable as a linear model of independent variables; suppose the dependent variable has name \code{z}, for ordinary and simple kriging use the formula \code{z~1}; for simple kriging also define \code{beta} (see below); for universal kriging, suppose \code{z} is linearly dependent on \code{x} and \code{y}, use the formula \code{z~x+y}} \item{locations}{ data object deriving from class \code{Spatial} or \code{sf} } \item{data}{ data frame (deprecated); should contain the dependent variable, independent variables, and coordinates; only to be provided if \code{locations} is a formula} \item{model}{ variogram model of dependent variable (or its residuals), defined by a call to \link{vgm} or \link{fit.variogram}} \item{beta}{ only for simple kriging (and simulation based on simple kriging); vector with the trend coefficients (including intercept); if no independent variables are defined the model only contains an intercept and this should be the simple kriging mean } \item{nmax}{ for local kriging: the number of nearest observations that should be used for a kriging prediction or simulation, where nearest is defined in terms of the space of the spatial locations. By default, all observations are used } \item{nmin}{ for local kriging: if the number of nearest observations within distance \code{maxdist} is less than \code{nmin}, a missing value will be generated; see maxdist } \item{maxdist}{ for local kriging: only observations within a distance of \code{maxdist} from the prediction location are used for prediction or simulation; if combined with \code{nmax}, both criteria apply } \item{debug.level}{ print debugging information; 0 suppresses debug information } } \section{Methods}{ \describe{ \item{formula = "formula", locations = "formula"}{ locations specifies which coordinates in \code{data} refer to spatial coordinates } \item{formula = "formula", locations = "Spatial"}{ Object locations knows about its own spatial locations } }} \details{ Leave-one-out cross validation (LOOCV) visits a data point, and predicts the value at that location by leaving out the observed value, and proceeds with the next data point. (The observed value is left out because kriging would otherwise predict the value itself.) N-fold cross validation makes a partitions the data set in N parts. For all observation in a part, predictions are made based on the remaining N-1 parts; this is repeated for each of the N parts. N-fold cross validation may be faster than LOOCV. } \value{ data frame containing the coordinates of \code{data} or those of the first variable in \code{object}, and columns of prediction and prediction variance of cross validated data points, observed values, residuals, zscore (residual divided by kriging standard error), and fold. If \code{all.residuals} is true, a data frame with residuals for all variables is returned, without coordinates. } \references{ \url{http://www.gstat.org/} } \author{ Edzer Pebesma } \note{ Leave-one-out cross validation seems to be much faster in plain (stand-alone) gstat, apparently quite a bit of the effort is spent moving data around from R to gstat. } \seealso{ \link{krige}, \link{gstat}, \link[gstat]{predict} } \examples{ library(sp) data(meuse) coordinates(meuse) <- ~x+y m <- vgm(.59, "Sph", 874, .04) # five-fold cross validation: x <- krige.cv(log(zinc)~1, meuse, m, nmax = 40, nfold=5) bubble(x, "residual", main = "log(zinc): 5-fold CV residuals") # multivariable; thanks to M. Rufino: meuse.g <- gstat(id = "zn", formula = log(zinc) ~ 1, data = meuse) meuse.g <- gstat(meuse.g, "cu", log(copper) ~ 1, meuse) meuse.g <- gstat(meuse.g, model = vgm(1, "Sph", 900, 1), fill.all = TRUE) x <- variogram(meuse.g, cutoff = 1000) meuse.fit = fit.lmc(x, meuse.g) out = gstat.cv(meuse.fit, nmax = 40, nfold = 5) summary(out) out = gstat.cv(meuse.fit, nmax = 40, nfold = c(rep(1,100), rep(2,55))) summary(out) # mean error, ideally 0: mean(out$residual) # MSPE, ideally small mean(out$residual^2) # Mean square normalized error, ideally close to 1 mean(out$zscore^2) # correlation observed and predicted, ideally 1 cor(out$observed, out$observed - out$residual) # correlation predicted and residual, ideally 0 cor(out$observed - out$residual, out$residual) } \keyword{ models } gstat/man/wind.Rd0000644000176200001440000001143414646417261013415 0ustar liggesusers\name{wind} \alias{wind} \alias{wind.loc} \title{Ireland wind data, 1961-1978} \description{ Daily average wind speeds for 1961-1978 at 12 synoptic meteorological stations in the Republic of Ireland (Haslett and raftery 1989). Wind speeds are in knots (1 knot = 0.5418 m/s), at each of the stations in the order given in Fig.4 of Haslett and Raftery (1989, see below) } \format{ data.frame \code{wind} contains the following columns: \describe{ \item{year}{year, minus 1900} \item{month}{month (number) of the year} \item{day }{day} \item{RPT}{average wind speed in knots at station RPT} \item{VAL}{average wind speed in knots at station VAL} \item{ROS}{average wind speed in knots at station ROS} \item{KIL}{average wind speed in knots at station KIL} \item{SHA}{average wind speed in knots at station SHA} \item{BIR}{average wind speed in knots at station BIR} \item{DUB}{average wind speed in knots at station DUB} \item{CLA}{average wind speed in knots at station CLA} \item{MUL}{average wind speed in knots at station MUL} \item{CLO}{average wind speed in knots at station CLO} \item{BEL}{average wind speed in knots at station BEL} \item{MAL}{average wind speed in knots at station MAL} } data.frame \code{wind.loc} contains the following columns: \describe{ \item{Station}{Station name} \item{Code }{Station code} \item{Latitude}{Latitude, in DMS, see examples below} \item{Longitude}{Longitude, in DMS, see examples below} \item{MeanWind}{mean wind for each station, metres per second } } } \usage{ data(wind) } \author{ Adrian Raftery; imported to R by Edzer Pebesma } \references{ These data were analyzed in detail in the following article: Haslett, J. and Raftery, A. E. (1989). Space-time Modelling with Long-memory Dependence: Assessing Ireland's Wind Power Resource (with Discussion). Applied Statistics 38, 1-50. and in many later papers on space-time analysis, for example: Tilmann Gneiting, Marc G. Genton, Peter Guttorp: Geostatistical Space-Time Models, Stationarity, Separability and Full symmetry. Ch. 4 in: B. Finkenstaedt, L. Held, V. Isham, Statistical Methods for Spatio-Temporal Systems. } \note{ This data set comes with the following message: ``Be aware that the dataset is 532494 bytes long (thats over half a Megabyte). Please be sure you want the data before you request it.'' The data were obtained on Oct 12, 2008, from: http://www.stat.washington.edu/raftery/software.html The data are also available from statlib. Locations of 11 of the stations (ROS, Rosslare has been thrown out because it fits poorly the spatial correlations of the other stations) were obtained from: http://www.stat.washington.edu/research/reports/2005/tr475.pdf Roslare lat/lon was obtained from google maps, location Roslare. The mean wind value for Roslare comes from Fig. 1 in the original paper. Haslett and Raftery proposed to use a sqrt-transform to stabilize the variance. } \keyword{datasets} \examples{ data(wind) summary(wind) wind.loc library(sp) # char2dms wind.loc$y = as.numeric(char2dms(as.character(wind.loc[["Latitude"]]))) wind.loc$x = as.numeric(char2dms(as.character(wind.loc[["Longitude"]]))) coordinates(wind.loc) = ~x+y \dontrun{ # fig 1: library(maps) library(mapdata) map("worldHires", xlim = c(-11,-5.4), ylim = c(51,55.5)) points(wind.loc, pch=16) text(coordinates(wind.loc), pos=1, label=wind.loc$Station) } wind$time = ISOdate(wind$year+1900, wind$month, wind$day) # time series of e.g. Dublin data: plot(DUB~time, wind, type= 'l', ylab = "windspeed (knots)", main = "Dublin") # fig 2: #wind = wind[!(wind$month == 2 & wind$day == 29),] wind$jday = as.numeric(format(wind$time, '\%j')) windsqrt = sqrt(0.5148 * as.matrix(wind[4:15])) Jday = 1:366 windsqrt = windsqrt - mean(windsqrt) daymeans = sapply(split(windsqrt, wind$jday), mean) plot(daymeans ~ Jday) lines(lowess(daymeans ~ Jday, f = 0.1)) # subtract the trend: meanwind = lowess(daymeans ~ Jday, f = 0.1)$y[wind$jday] velocity = apply(windsqrt, 2, function(x) { x - meanwind }) # match order of columns in wind to Code in wind.loc: pts = coordinates(wind.loc[match(names(wind[4:15]), wind.loc$Code),]) # fig 3, but not really yet... dists = spDists(pts, longlat=TRUE) corv = cor(velocity) sel = !(as.vector(dists) == 0) plot(as.vector(corv[sel]) ~ as.vector(dists[sel]), xlim = c(0,500), ylim = c(.4, 1), xlab = "distance (km.)", ylab = "correlation") # plots all points twice, ignores zero distance # now really get fig 3: ros = rownames(corv) == "ROS" dists.nr = dists[!ros,!ros] corv.nr = corv[!ros,!ros] sel = !(as.vector(dists.nr) == 0) plot(as.vector(corv.nr[sel]) ~ as.vector(dists.nr[sel]), pch = 3, xlim = c(0,500), ylim = c(.4, 1), xlab = "distance (km.)", ylab = "correlation") # add outlier: points(corv[ros,!ros] ~ dists[ros,!ros], pch=16, cex=.5) xdiscr = 1:500 # add correlation model: lines(xdiscr, .968 * exp(- .00134 * xdiscr)) } gstat/man/fit.variogram.gls.Rd0000644000176200001440000000400014646417261015777 0ustar liggesusers% $Id: fit.variogram.gls,v 1.4 2009-02-20 13:53:38 edzer Exp $ \name{fit.variogram.gls} \alias{fit.variogram.gls} \title{ GLS fitting of variogram parameters } \description{ Fits variogram parameters (nugget, sill, range) to variogram cloud, using GLS (generalized least squares) fitting. Only for direct variograms. } \usage{ fit.variogram.gls(formula, data, model, maxiter = 30, eps = .01, trace = TRUE, ignoreInitial = TRUE, cutoff = Inf, plot = FALSE) } \arguments{ \item{formula}{formula defining the response vector and (possible) regressors; in case of absence of regressors, use e.g. \code{z~1}} \item{data}{object of class Spatial} \item{model}{variogram model to be fitted, output of \code{vgm}} \item{maxiter}{maximum number of iterations} \item{eps}{ convergence criterium } \item{trace}{ logical; if TRUE, prints parameter trace} \item{ignoreInitial}{ logical; if FALSE, initial parameter are taken from model; if TRUE, initial values of model are ignored and taken from variogram cloud: nugget: \code{mean(y)/2}, sill: \code{mean(y)/2}, range \code{median(h0)/4} with \code{y} the semivariance cloud value and \code{h0} the distances } \item{cutoff}{maximum distance up to which point pairs are taken into consideration} \item{plot}{logical; if TRUE, a plot is returned with variogram cloud and fitted model; else, the fitted model is returned.} } \value{ an object of class "variogramModel"; see \link{fit.variogram}; if \code{plot} is TRUE, a plot is returned instead. } \references{ Mueller, W.G., 1999: Least-squares fitting from the variogram cloud. Statistics and Probability Letters, 43, 93-98. Mueller, W.G., 2007: Collecting Spatial Data. Springer, Heidelberg. } \author{ Edzer Pebesma } \note{ Inspired by the code of Mihael Drinovac, which was again inspired by code from Ernst Glatzer, author of package vardiag. } \seealso{ \link{fit.variogram}, } \examples{ library(sp) data(meuse) coordinates(meuse) = ~x+y \dontrun{ fit.variogram.gls(log(zinc)~1, meuse[1:40,], vgm(1, "Sph", 900,1)) } } \keyword{models} gstat/man/extractPar.Rd0000644000176200001440000000225014646417261014565 0ustar liggesusers\name{extractPar} \alias{extractPar} \alias{extractParNames} \title{ Extracting parameters and their names from a spatio-temporal variogram model } \description{ All spatio-temporal variogram models have a different set of parameters. These functions extract the parameters and their names from the spatio-temporal variogram model. Note, this function is as well used to pass the parameters to the optim function. The arguments lower and upper passed to optim should follow the same structure. } \usage{ extractPar(model) extractParNames(model) } \arguments{ \item{model}{a spatio-temporal variogram model from \code{\link{vgmST}}} } \value{ A named numeric vector of parameters or a vector of characters holding the parameters' names. } \author{ Benedikt Graeler } \seealso{ \code{\link{fit.StVariogram}} and \code{\link{vgmST}} } \examples{ sumMetricModel <- vgmST("sumMetric", space=vgm(30, "Sph", 200, 6), time =vgm(30, "Sph", 15, 7), joint=vgm(60, "Exp", 84, 22), stAni=100) extractPar(sumMetricModel) extractParNames(sumMetricModel) }gstat/man/meuse.all.Rd0000644000176200001440000000467214646417261014347 0ustar liggesusers% $Id: meuse.all.Rd,v 1.5 2006-02-10 19:03:27 edzer Exp $ \name{meuse.all} \alias{meuse.all} \title{Meuse river data set -- original, full data set} \description{ This data set gives locations and top soil heavy metal concentrations (ppm), along with a number of soil and landscape variables, collected in a flood plain of the river Meuse, near the village Stein. Heavy metal concentrations are bulk sampled from an area of approximately 15 m x 15 m. } \format{ This data frame contains the following columns: \describe{ \item{sample}{sample number} \item{x}{a numeric vector; x-coordinate (m) in RDM (Dutch topographical map coordinates) } \item{y}{a numeric vector; y-coordinate (m) in RDM (Dutch topographical map coordinates)} \item{cadmium}{topsoil cadmium concentration, ppm.; note that zero cadmium values in the original data set have been shifted to 0.2 (half the lowest non-zero value) } \item{copper}{topsoil copper concentration, ppm. } \item{lead}{topsoil lead concentration, ppm. } \item{zinc}{topsoil zinc concentration, ppm. } \item{elev}{relative elevation} \item{om}{organic matter, as percentage } \item{ffreq}{flooding frequency class} \item{soil}{soil type} \item{lime}{lime class} \item{landuse}{landuse class} \item{dist.m}{distance to river Meuse (metres), as obtained during the field survey} \item{in.pit}{logical; indicates whether this is a sample taken in a pit} \item{in.meuse155}{logical; indicates whether the sample is part of the \code{meuse} (i.e., filtered) data set; in addition to the samples in a pit, an sample (139) with outlying zinc content was removed } \item{in.BMcD}{logical; indicates whether the sample is used as part of the subset of 98 points in the various interpolation examples of Burrough and McDonnell} } } \usage{ data(meuse.all) } \author{ The actual field data were collected by Ruud van Rijn and Mathieu Rikken; data compiled for R by Edzer Pebesma } \references{ P.A. Burrough, R.A. McDonnell, 1998. Principles of Geographical Information Systems. Oxford University Press. \url{http://www.gstat.org/} } \note{ \code{sample} refers to original sample number. Eight samples were left out because they were not indicative for the metal content of the soil. They were taken in an old pit. One sample contains an outlying zinc value, which was also discarded for the meuse (155) data set. } \seealso{\link{meuse.alt}} \keyword{datasets} \examples{ data(meuse.all) summary(meuse.all) } gstat/man/variogramLine.Rd0000644000176200001440000000365014646417261015254 0ustar liggesusers% $Id: variogramLine.Rd,v 1.3 2008-08-19 07:27:02 edzer Exp $ \name{variogramLine} \alias{variogramLine} \alias{getGammas} \title{ Semivariance Values For a Given Variogram Model } \description{ Generates a semivariance values given a variogram model } \usage{ variogramLine(object, maxdist, n = 200, min = 1.0e-6 * maxdist, dir = c(1,0,0), covariance = FALSE, ..., dist_vector, debug.level = 0) } \arguments{ \item{object}{ variogram model for which we want semivariance function values } \item{maxdist}{ maximum distance for which we want semivariance values } \item{n}{ number of points } \item{min}{ minimum distance; a value slightly larger than zero is usually used to avoid the discontinuity at distance zero if a nugget component is present } \item{dir}{ direction vector: unit length vector pointing the direction in x (East-West), y (North-South) and z (Up-Down) } \item{covariance}{logical; if TRUE return covariance values, otherwise return semivariance values } \item{...}{ignored} \item{dist_vector}{numeric vector or matrix with distance values} \item{debug.level}{gstat internal debug level} } \value{ a data frame of dimension (\code{n} x 2), with columns distance and gamma (semivariances or covariances), or in case \code{dist_vector} is a matrix, a conforming matrix with semivariance/covariance values is returned. } \note{variogramLine is used to generate data for plotting a variogram model.} \author{ Edzer Pebesma } \seealso{ \link{plot.gstatVariogram}} \examples{ variogramLine(vgm(5, "Exp", 10, 5), 10, 10) # anisotropic variogram, plotted in E-W direction: variogramLine(vgm(1, "Sph", 10, anis=c(0,0.5)), 10, 10) # anisotropic variogram, plotted in N-S direction: variogramLine(vgm(1, "Sph", 10, anis=c(0,0.5)), 10, 10, dir=c(0,1,0)) variogramLine(vgm(1, "Sph", 10, anis=c(0,0.5)), dir=c(0,1,0), dist_vector = 0.5) variogramLine(vgm(1, "Sph", 10, anis=c(0,0.5)), dir=c(0,1,0), dist_vector = c(0, 0.5, 0.75)) } \keyword{models} gstat/man/pcb.Rd0000644000176200001440000000343414646417261013221 0ustar liggesusers% $Id: pcb.Rd,v 1.8 2009-07-03 12:10:55 edzer Exp $ \name{pcb} \alias{pcb} \title{PCB138 measurements in sediment at the NCP, the Dutch part of the North Sea} \description{ PCB138 measurements in sediment at the NCP, which is the Dutch part of the North Sea } \format{ This data frame contains the following columns: \describe{ \item{year}{ measurement year } \item{x}{ x-coordinate; UTM zone 31 } \item{y}{ y-coordinate; UTM zone 31 } \item{coast}{ distance to coast of the Netherlands, in km.} \item{depth}{ sea water depth, m. } \item{PCB138}{ PCB-138, measured on the sediment fraction smaller than 63 \eqn{\mu}{mu}, in \eqn{\mu g/kg}{mu g/kg} dry matter; BUT SEE NOTE BELOW } \item{yf}{ year; as factor} } } \usage{ data(pcb) } \note{ A note of caution: The PCB-138 data are provided only to be able to re-run the analysis done in Pebesma and Duin (2004; see references below). If you want to use these data for comparison with PCB measurements elsewhere, or if you want to compare them to regulation standards, or want to use these data for any other purpose, you should first contact \url{mailto:basisinfodesk@rikz.rws.minvenw.nl}. The reason for this is that several normalisations were carried out that are not reported here, nor in the paper below. } \references{ Pebesma, E. J., and Duin, R. N. M. (2005). Spatial patterns of temporal change in North Sea sediment quality on different spatial scales. In P. Renard, H. Demougeot-Renard and R. Froidevaux (Eds.), Geostatistics for Environmental Applications: Proceedings of the Fifth European Conference on Geostatistics for Environmental Applications (pp. 367-378): Springer. } \seealso{\link{ncp.grid}} \keyword{datasets} \examples{ data(pcb) library(lattice) xyplot(y~x|as.factor(yf), pcb, aspect = "iso") # demo(pcb) } gstat/man/fit.lmc.Rd0000644000176200001440000000465314646417261014015 0ustar liggesusers% $Id: fit.lmc.Rd,v 1.4 2007-11-16 12:59:35 edzer Exp $ \name{fit.lmc} \alias{fit.lmc} \title{ Fit a Linear Model of Coregionalization to a Multivariable Sample Variogram } \description{ Fit a Linear Model of Coregionalization to a Multivariable Sample Variogram; in case of a single variogram model (i.e., no nugget) this is equivalent to Intrinsic Correlation } \usage{ fit.lmc(v, g, model, fit.ranges = FALSE, fit.lmc = !fit.ranges, correct.diagonal = 1.0, ...) } \arguments{ \item{v}{ multivariable sample variogram, output of \link{variogram} } \item{g}{ gstat object, output of \link{gstat} } \item{model}{ variogram model, output of \link{vgm}; if supplied this value is used as initial value for each fit } \item{fit.ranges}{ logical; determines whether the range coefficients (excluding that of the nugget component) should be fitted; or logical vector: determines for each range parameter of the variogram model whether it should be fitted or fixed. } \item{fit.lmc}{ logical; if TRUE, each coefficient matrices of partial sills is guaranteed to be positive definite } \item{correct.diagonal}{ multiplicative correction factor to be applied to partial sills of direct variograms only; the default value, 1.0, does not correct. If you encounter problems with singular covariance matrices during cokriging or cosimulation, you may want to try to increase this to e.g. 1.01 } \item{...}{ parameters that get passed to \link{fit.variogram} } } \value{ returns an object of class \code{gstat}, with fitted variograms; } \references{ \url{http://www.gstat.org/} } \author{ Edzer Pebesma } \note{ This function does not use the iterative procedure proposed by M. Goulard and M. Voltz (Math. Geol., 24(3): 269-286; reproduced in Goovaerts' 1997 book) but uses simply two steps: first, each variogram model is fitted to a direct or cross variogram; next each of the partial sill coefficient matrices is approached by its in least squares sense closest positive definite matrices (by setting any negative eigenvalues to zero). The argument \code{correct.diagonal} was introduced by experience: by zeroing the negative eigenvalues for fitting positive definite partial sill matrices, apparently still perfect correlation may result, leading to singular cokriging/cosimulation matrices. If someone knows of a more elegant way to get around this, please let me know. } \seealso{ \link{variogram}, \link{vgm}, \link{fit.variogram}, \code{demo(cokriging)} } \keyword{models} gstat/man/predict.gstat.Rd0000644000176200001440000002341014646417261015224 0ustar liggesusers% $Id: predict.gstat.Rd,v 1.18 2007-11-16 12:59:47 edzer Exp $ \name{predict} \alias{predict} \alias{predict.gstat} \title{ Multivariable Geostatistical Prediction and Simulation } \description{ The function provides the following prediction methods: simple, ordinary, and universal kriging, simple, ordinary, and universal cokriging, point- or block-kriging, and conditional simulation equivalents for each of the kriging methods. } \usage{ \method{predict}{gstat}(object, newdata, block = numeric(0), nsim = 0, indicators = FALSE, BLUE = FALSE, debug.level = 1, mask, na.action = na.pass, sps.args = list(n = 500, type = "regular", offset = c(.5, .5)), ...) } \arguments{ \item{object}{ object of class \code{gstat}, see \link{gstat} and \link{krige}} \item{newdata}{ data frame with prediction/simulation locations; should contain columns with the independent variables (if present) and the coordinates with names as defined in \code{locations}; or: polygons, see below} \item{block}{ block size; a vector with 1, 2 or 3 values containing the size of a rectangular in x-, y- and z-dimension respectively (0 if not set), or a data frame with 1, 2 or 3 columns, containing the points that discretize the block in the x-, y- and z-dimension to define irregular blocks relative to (0,0) or (0,0,0)---see also the details section below. By default, predictions or simulations refer to the support of the data values. } \item{nsim}{ integer; if set to a non-zero value, conditional simulation is used instead of kriging interpolation. For this, sequential Gaussian or indicator simulation is used (depending on the value of \code{indicators}), following a single random path through the data. } \item{indicators}{ logical; only relevant if \code{nsim} is non-zero; if TRUE, use indicator simulation, else use Gaussian simulation } \item{BLUE}{ logical; if TRUE return the BLUE trend estimates only, if FALSE return the BLUP predictions (kriging) } \item{debug.level}{ integer; set gstat internal debug level, see below for useful values. If set to -1 (or any negative value), a progress counter is printed } \item{mask}{ not supported anymore -- use na.action; logical or numerical vector; pattern with valid values in newdata (marked as TRUE, non-zero, or non-NA); if mask is specified, the returned data frame will have the same number and order of rows in newdata, and masked rows will be filled with NA's. } \item{na.action}{ function determining what should be done with missing values in 'newdata'. The default is to predict 'NA'. Missing values in coordinates and predictors are both dealt with. } \item{sps.args}{ when newdata is of class \code{SpatialPolygons} or \code{SpatialPolygonsDataFrame} this argument list gets passed to \link[sp]{spsample} to control the discretizing of polygons } \item{...}{ ignored (but necessary for the S3 generic/method consistency) } } \details{ When a non-stationary (i.e., non-constant) mean is used, both for simulation and prediction purposes the variogram model defined should be that of the residual process, not that of the raw observations. For irregular block kriging, coordinates should discretize the area relative to (0), (0,0) or (0,0,0); the coordinates in newdata should give the centroids around which the block should be located. So, suppose the block is discretized by points (3,3) (3,5) (5,5) and (5,3), we should pass point (4,4) in newdata and pass points (-1,-1) (-1,1) (1,1) (1,-1) to the block argument. Although passing the uncentered block and (0,0) as newdata may work for global neighbourhoods, neighbourhood selection is always done relative to the centroid values in newdata. If newdata is of class \link[sp]{SpatialPolygons} or \link[sp]{SpatialPolygonsDataFrame}, then the block average for each of the polygons or polygon sets is calculated, using \link[sp]{spsample} to discretize the polygon(s). Argument \code{sps.args} controls the parameters used for \link[sp]{spsample}. The "location" with respect to which neighbourhood selection is done is for each polygon the SpatialPolygons polygon label point; if you use local neighbourhoods you should check out where these points are---it may be well outside the polygon itself. The algorithm used by gstat for simulation random fields is the sequential simulation algorithm. This algorithm scales well to large or very large fields (e.g., more than $10^6$ nodes). Its power lies in using only data and simulated values in a local neighbourhood to approximate the conditional distribution at that location, see \code{nmax} in \link{krige} and \link{gstat}. The larger \code{nmax}, the better the approximation, the smaller \code{nmax}, the faster the simulation process. For selecting the nearest \code{nmax} data or previously simulated points, gstat uses a bucket PR quadtree neighbourhood search algorithm; see the reference below. For sequential Gaussian or indicator simulations, a random path through the simulation locations is taken, which is usually done for sequential simulations. The reason for this is that the local approximation of the conditional distribution, using only the \code{nmax} neareast observed (or simulated) values may cause spurious correlations when a regular path would be followed. Following a single path through the locations, gstat reuses the expensive results (neighbourhood selection and solution to the kriging equations) for each of the subsequent simulations when multiple realisations are requested. You may expect a considerable speed gain in simulating 1000 fields in a single call to \link[gstat]{predict}, compared to 1000 calls, each for simulating a single field. The random number generator used for generating simulations is the native random number generator of the environment (R, S); fixing randomness by setting the random number seed with \code{set.seed()} works. When mean coefficient are not supplied, they are generated as well from their conditional distribution (assuming multivariate normal, using the generalized least squares BLUE estimate and its estimation covariance); for a reference to the algorithm used see Abrahamsen and Benth, Math. Geol. 33(6), page 742 and leave out all constraints. Memory requirements for sequential simulation: let n be the product of the number of variables, the number of simulation locations, and the number of simulations required in a single call. the gstat C function \code{gstat_predict} requires a table of size n * 12 bytes to pass the simulations back to R, before it can free n * 4 bytes. Hopefully, R does not have to duplicate the remaining n * 8 bytes when the coordinates are added as columns, and when the resulting matrix is coerced to a \code{data.frame}. Useful values for \code{debug.level}: 0: suppres any output except warning and error messages; 1: normal output (default): short data report, program action and mode, program progress in \%, total execution time; 2: print the value of all global variables, all files read and written, and include source file name and line number in error messages; 4: print OLS and WLS fit diagnostics; 8: print all data after reading them; 16: print the neighbourhood selection for each prediction location; 32: print (generalised) covariance matrices, design matrices, solutions, kriging weights, etc.; 64: print variogram fit diagnostics (number of iterations and variogram model in each iteration step) and order relation violations (indicator kriging values before and after order relation correction); 512: print block (or area) discretization data for each prediction location. To combine settings, sum their respective values. Negative values for \code{debug.level} are equal to positive, but cause the progress counter to work. For data with longitude/latitude coordinates (checked by \code{is.projected}), gstat uses great circle distances in km to compute spatial distances. The user should make sure that the semivariogram model used is positive definite on a sphere. } \value{ a data frame containing the coordinates of \code{newdata}, and columns of prediction and prediction variance (in case of kriging) or the columns of the conditional Gaussian or indicator simulations } \references{ N.A.C. Cressie, 1993, Statistics for Spatial Data, Wiley. Pebesma, E.J., 2004. Multivariable geostatistics in S: the gstat package. Computers and Geosciences, 30: 683-691. } \author{ Edzer Pebesma } \seealso{\link{gstat}, \link{krige}} \examples{ # generate 5 conditional simulations library(sp) data(meuse) coordinates(meuse) = ~x+y v <- variogram(log(zinc)~1, meuse) m <- fit.variogram(v, vgm(1, "Sph", 300, 1)) plot(v, model = m) set.seed(131) data(meuse.grid) gridded(meuse.grid) = ~x+y sim <- krige(formula = log(zinc)~1, meuse, meuse.grid, model = m, nmax = 10, beta = 5.9, nsim = 5) # for speed -- 10 is too small!! # show all 5 simulation spplot(sim) # calculate generalised least squares residuals w.r.t. constant trend: g <- gstat(NULL, "log.zinc", log(zinc)~1, meuse, model = m) blue0 <- predict(g, newdata = meuse, BLUE = TRUE) blue0$blue.res <- log(meuse$zinc) - blue0$log.zinc.pred bubble(blue0, zcol = "blue.res", main = "GLS residuals w.r.t. constant") # calculate generalised least squares residuals w.r.t. linear trend: m <- fit.variogram(variogram(log(zinc)~sqrt(dist.m), meuse), vgm(1, "Sph", 300, 1)) g <- gstat(NULL, "log.zinc", log(zinc)~sqrt(dist.m), meuse, model = m) blue1 <- predict(g, meuse, BLUE = TRUE) blue1$blue.res <- log(meuse$zinc) - blue1$log.zinc.pred bubble(blue1, zcol = "blue.res", main = "GLS residuals w.r.t. linear trend") # unconditional simulation on a 100 x 100 grid xy <- expand.grid(1:100, 1:100) names(xy) <- c("x","y") gridded(xy) = ~x+y g.dummy <- gstat(formula = z~1, dummy = TRUE, beta = 0, model = vgm(1,"Exp",15), nmax = 10) # for speed -- 10 is too small!! yy <- predict(g.dummy, xy, nsim = 4) # show one realisation: spplot(yy[1]) # show all four: spplot(yy) } \keyword{ models } gstat/man/jura.Rd0000644000176200001440000001115014646417261013410 0ustar liggesusers% $Id: jura.Rd,v 1.3 2007-03-08 09:35:49 edzer Exp $ \name{jura} \alias{jura} \alias{prediction.dat} \alias{validation.dat} \alias{transect.dat} \alias{juragrid.dat} \alias{jura.grid} \alias{jura.pred} \alias{jura.val} \title{Jura data set} \description{ The jura data set from Pierre Goovaerts' book (see references below). It contains four \code{data.frame}s: prediction.dat, validation.dat and transect.dat and juragrid.dat, and three \code{data.frame}s with consistently coded land use and rock type factors, as well as geographic coordinates. The examples below show how to transform these into spatial (sp) objects in a local coordinate system and in geographic coordinates, and how to transform to metric coordinate reference systems. } \format{ The \code{data.frames} prediction.dat and validation.dat contain the following fields: \describe{ \item{Xloc}{ X coordinate, local grid km } \item{Yloc}{ Y coordinate, local grid km } \item{Landuse}{ see book and below } \item{Rock}{ see book and below } \item{Cd}{ mg cadmium \eqn{\mbox{kg}^{-1}}{kg^-1} topsoil } \item{Co}{ mg cobalt \eqn{\mbox{kg}^{-1}}{kg^-1} topsoil } \item{Cr}{ mg chromium \eqn{\mbox{kg}^{-1}}{kg^-1} topsoil } \item{Cu}{ mg copper \eqn{\mbox{kg}^{-1}}{kg^-1} topsoil } \item{Ni}{ mg nickel \eqn{\mbox{kg}^{-1}}{kg^-1} topsoil } \item{Pb}{ mg lead \eqn{\mbox{kg}^{-1}}{kg^-1} topsoil } \item{Zn}{ mg zinc \eqn{\mbox{kg}^{-1}}{kg^-1} topsoil } } The \code{data.frame} juragrid.dat only has the first four fields. In addition the \code{data.frame}s jura.pred, jura.val and jura.grid also have inserted third and fourth fields giving geographic coordinates: \describe{ \item{long}{ Longitude, WGS84 datum } \item{lat}{ Latitude, WGS84 datum } } } \usage{ data(jura) } \author{ Data preparation by David Rossiter (dgr2@cornell.edu) and Edzer Pebesma; georeferencing by David Rossiter } \references{ Goovaerts, P. 1997. Geostatistics for Natural Resources Evaluation. Oxford Univ. Press, New-York, 483 p. Appendix C describes (and gives) the Jura data set. Atteia, O., Dubois, J.-P., Webster, R., 1994, Geostatistical analysis of soil contamination in the Swiss Jura: Environmental Pollution 86, 315-327 Webster, R., Atteia, O., Dubois, J.-P., 1994, Coregionalization of trace metals in the soil in the Swiss Jura: European Journal of Soil Science 45, 205-218 } \note{ The points data sets were obtained from http://home.comcast.net/~pgoovaerts/book.html, which seems to be no longer available; the grid data were kindly provided by Pierre Goovaerts. The following codes were used to convert \code{prediction.dat} and \code{validation.dat} to \code{jura.pred} and \code{jura.val} (see examples below): Rock Types: 1: Argovian, 2: Kimmeridgian, 3: Sequanian, 4: Portlandian, 5: Quaternary. Land uses: 1: Forest, 2: Pasture (Weide(land), Wiese, Grasland), 3: Meadow (Wiese, Flur, Matte, Anger), 4: Tillage (Ackerland, bestelltes Land) Points 22 and 100 in the validation set (\code{validation.dat[c(22,100),]}) seem not to lie exactly on the grid originally intended, but are kept as such to be consistent with the book. Georeferencing was based on two control points in the Swiss grid system shown as Figure 1 of Atteia et al. (see above) and further points digitized on the tentatively georeferenced scanned map. RMSE 2.4 m. Location of points in the field was less precise. } \keyword{datasets} \examples{ data(jura) summary(prediction.dat) summary(validation.dat) summary(transect.dat) summary(juragrid.dat) # the following commands were used to create objects with factors instead # of the integer codes for Landuse and Rock: \dontrun{ jura.pred = prediction.dat jura.val = validation.dat jura.grid = juragrid.dat jura.pred$Landuse = factor(prediction.dat$Landuse, labels=levels(juragrid.dat$Landuse)) jura.pred$Rock = factor(prediction.dat$Rock, labels=levels(juragrid.dat$Rock)) jura.val$Landuse = factor(validation.dat$Landuse, labels=levels(juragrid.dat$Landuse)) jura.val$Rock = factor(validation.dat$Rock, labels=levels(juragrid.dat$Rock)) } # the following commands convert data.frame objects into spatial (sp) objects # in the local grid: require(sp) coordinates(jura.pred) = ~Xloc+Yloc coordinates(jura.val) = ~Xloc+Yloc coordinates(jura.grid) = ~Xloc+Yloc gridded(jura.grid) = TRUE # the following commands convert the data.frame objects into spatial (sp) objects # in WGS84 geographic coordinates # example is given only for jura.pred, do the same for jura.val and jura.grid # EPSG codes can be found by searching make_EPSG() jura.pred <- as.data.frame(jura.pred) coordinates(jura.pred) = ~ long + lat proj4string(jura.pred) = CRS("+init=epsg:4326") } gstat/man/walker.Rd0000644000176200001440000000163314750415156013736 0ustar liggesusers% $Id: walker.Rd,v 1.2 2006-02-10 19:03:27 edzer Exp $ \name{walker} \alias{walker} \alias{walker.exh} \title{Walker Lake sample and exhaustive data sets} \description{ This is the Walker Lake data sets (sample and exhaustive data set), used in Isaaks and Srivastava's Applied Geostatistics. } \format{ This data frame contains the following columns: \describe{ \item{Id}{Identification Number} \item{X}{Xlocation in meter} \item{Y}{Ylocation in meter} \item{V}{V variable, concentration in ppm} \item{U}{U variable, concentration in ppm} \item{T}{T variable, indicator variable} } } \usage{ data(walker) } \references{ Applied Geostatistics by Edward H. Isaaks, R. Mohan Srivastava; Oxford University Press. } \note{ This data sets was obtained from the data sets on ai-geostats (link no longer functioning) } \keyword{datasets} \examples{ library(sp) data(walker) summary(walker) summary(walker.exh) } gstat/man/vv.Rd0000644000176200001440000000121114646417261013077 0ustar liggesusers\name{vv} \alias{vv} \title{Precomputed variogram for PM10 in data set air} \description{ Precomputed variogram for PM10 in data set air } \format{ data set structure is explained in \link{variogramST}. } \usage{ data(vv) } \examples{ \dontrun{ # obtained by: library(spacetime) library(gstat) data(air) suppressWarnings(proj4string(stations) <- CRS(proj4string(stations))) rural = STFDF(stations, dates, data.frame(PM10 = as.vector(air))) rr = rural[,"2005::2010"] unsel = which(apply(as(rr, "xts"), 2, function(x) all(is.na(x)))) r5to10 = rr[-unsel,] vv = variogram(PM10~1, r5to10, width=20, cutoff = 200, tlags=0:5) } } gstat/man/sic97.Rd0000644000176200001440000000147514750415037013411 0ustar liggesusers% $Id: sic97.Rd,v 1.2 2008-10-30 13:47:05 edzer Exp $ \name{sic97} \alias{sic_obs} \alias{sic_full} \alias{demstd} \title{ Spatial Interpolation Comparison 1997 data set: Swiss Rainfall} \description{ The text below is copied from the data item at ai-geostats, (link no longer working). } \format{ The data frames contain the following columns: \describe{ \item{ID}{this integer value is the number (unique value) of the monitoring station} \item{rainfall}{ rainfall amount, in 10th of mm } } } \note{ See the pdf that accompanies the original file for a description of the data. The .dxf file with the Swiss border is not included here. } \usage{ data(sic97) # } \author{ Gregoire Dubois and others. } \keyword{datasets} \examples{ data(sic97) image(demstd) points(sic_full, pch=1) points(sic_obs, pch=3) } gstat/man/plot.variogramCloud.Rd0000644000176200001440000000546214646417261016413 0ustar liggesusers% $Id: plot.variogramCloud.Rd,v 1.6 2006-12-12 20:44:07 edzer Exp $ \name{plot.variogramCloud} \alias{plot.variogramCloud} \title{ Plot and Identify Data Pairs on Sample Variogram Cloud } \description{ Plot a sample variogram cloud, possibly with identification of individual point pairs } \usage{ \method{plot}{variogramCloud}(x, identify = FALSE, digitize = FALSE, xlim, ylim, xlab, ylab, keep = FALSE, ...) } \arguments{ \item{x}{ object of class \code{variogramCloud}} \item{identify}{ logical; if TRUE, the plot allows identification of a series of individual point pairs that correspond to individual variogram cloud points (use left mouse button to select; right mouse button ends) } \item{digitize}{ logical; if TRUE, select point pairs by digitizing a region with the mouse (left mouse button adds a point, right mouse button ends) } \item{xlim}{ limits of x-axis } \item{ylim}{ limits of y-axis } \item{xlab}{ x axis label } \item{ylab}{ y axis label } \item{keep}{ logical; if TRUE and \code{identify} is TRUE, the labels identified and their position are kept and glued to object x, which is returned. Subsequent calls to plot this object will now have the labels shown, e.g. to plot to hardcopy } \item{...}{ parameters that are passed through to \link{plot.gstatVariogram} (in case of identify = FALSE) or to plot (in case of identify = TRUE) } } \value{ If \code{identify} or \code{digitize} is TRUE, a data frame of class \code{pointPairs} with in its rows the point pairs identified (pairs of row numbers in the original data set); if identify is F, a plot of the variogram cloud, which uses \link{plot.gstatVariogram} If in addition to \code{identify}, \code{keep} is also TRUE, an object of class \code{variogramCloud} is returned, having attached to it attributes "sel" and "text", which will be used in subsequent calls to plot.variogramCloud with \code{identify} set to FALSE, to plot the text previously identified. If in addition to \code{digitize}, \code{keep} is also TRUE, an object of class \code{variogramCloud} is returned, having attached to it attribute "poly", which will be used in subsequent calls to plot.variogramCloud with \code{digitize} set to FALSE, to plot the digitized line. In both of the \code{keep = TRUE} cases, the attribute \code{ppairs} of class \code{pointPairs} is present, containing the point pairs identified. } \references{ \url{http://www.gstat.org/} } \author{ Edzer Pebesma } \seealso{ \link{variogram}, \link{plot.gstatVariogram}, \link{plot.pointPairs}, \link{identify}, \link{locator} } \examples{ library(sp) data(meuse) coordinates(meuse) = ~x+y plot(variogram(log(zinc)~1, meuse, cloud=TRUE)) ## commands that require interaction: # x <- variogram(log(zinc)~1, loc=~x+y, data=meuse, cloud=TRUE) # plot(plot(x, identify = TRUE), meuse) # plot(plot(x, digitize = TRUE), meuse) } \keyword{dplot} gstat/man/ncp.grid.Rd0000644000176200001440000000151314646417261014155 0ustar liggesusers% $Id: ncp.grid.Rd,v 1.5 2007-11-16 12:59:47 edzer Exp $ \name{ncp.grid} \alias{ncp.grid} \title{Grid for the NCP, the Dutch part of the North Sea} \description{ Gridded data for the NCP (Nederlands Continentaal Plat, the Dutch part of the North Sea), for a 5 km x 5 km grid; stored as data.frame. } \format{ This data frame contains the following columns: \describe{ \item{x}{x-coordinate, UTM zone 31} \item{y}{y-coordinate, UTM zone 31} \item{depth}{sea water depth, m.} \item{coast}{distance to the coast of the Netherlands, in km.} \item{area}{identifier for administrative sub-areas} } } \usage{ data(ncp.grid) } \author{Dutch National Institute for Coastal and Marine Management (RIKZ); data compiled for R by Edzer Pebesma } \seealso{\link{fulmar}} \keyword{datasets} \examples{ data(ncp.grid) summary(ncp.grid) } gstat/man/vgmST.Rd0000644000176200001440000001042514646417261013513 0ustar liggesusers\name{vgmST} \alias{vgmST} \title{Constructing a spatio-temporal variogram} \description{ Constructs a spatio-temporal variogram of a given type checking for a minimal set of parameters. } \usage{ vgmST(stModel, ..., space, time, joint, sill, k, nugget, stAni, temporalUnit) } \arguments{ \item{stModel}{A string identifying the spatio-temporal variogram model (see details below). Only the string before an optional "_" is used to identify the model. This mechanism can be used to identify different fits of the same model (\code{separable_A} and \code{separable_B} will be interpreted as separable models, but carry different names).} \item{\dots}{unused, but ensure an exact match of the following parameters.} \item{space}{A spatial variogram.} \item{time}{A temporal variogram.} \item{joint}{A joint spatio-temporal variogram.} \item{sill}{A joint spatio-temporal sill.} \item{k}{The weighting of the product in the product-sum model.} \item{nugget}{A joint spatio-temporal nugget.} \item{stAni}{A spatio-temporal anisotropy; the number of space units equivalent to one time unit.} \item{temporalUnit}{length one character vector, indicating the temporal unit (like secs)} } \details{ The different implemented spatio-temporal variogram models have the following required parameters (see as well the example section) \describe{ \item{separable:}{A variogram for \code{space} and \code{time} each and a joint spatio-temporal \code{sill} (variograms may have a separate nugget effect, but their joint sill will be 1) generating the call \preformatted{vgmST("separable", space, time, sill)}} \item{productSum:}{A variogram for \code{space} and \code{time} each, and the weighting of product \code{k} generating the call \preformatted{vgmST("productSum", space, time, k)}} \item{sumMetric:}{A variogram (potentially including a nugget effect) for \code{space}, \code{time} and \code{joint} each and a spatio-temporal anisotropy ratio \code{stAni} generating the call \preformatted{vgmST("sumMetric", space, time, joint, stAni)}} \item{simpleSumMetric:}{A variogram (without nugget effect) for \code{space}, \code{time} and \code{joint} each, a joint spatio-temporal \code{nugget} effect and a spatio-temporal anisotropy ratio \code{stAni} generating the call \preformatted{vgmST("simpleSumMetric", space, time, joint, nugget, stAni)}} \item{metric:}{A spatio-temporal \code{joint} variogram (potentially including a nugget effect) and \code{stAni} generating the call \preformatted{vgmST("metric", joint, stAni)}}} } \value{ Returns an S3 object of class \code{StVariogramModel}. } \author{ Benedikt Graeler } \seealso{ \code{\link{fit.StVariogram}} for fitting, \code{\link{variogramSurface}} to plot the variogram and \code{\link{extractParNames}} to better understand the parameter structure of spatio-temporal variogram models. } \examples{ # separable model: spatial and temporal sill will be ignored # and kept constant at 1-nugget respectively. A joint sill is used. separableModel <- vgmST("separable", space=vgm(0.9,"Exp", 147, 0.1), time =vgm(0.9,"Exp", 3.5, 0.1), sill=40) # product sum model: spatial and temporal nugget will be ignored and kept # constant at 0. Only a joint nugget is used. prodSumModel <- vgmST("productSum", space=vgm(39, "Sph", 343, 0), time= vgm(36, "Exp", 3, 0), k=15) # sum metric model: spatial, temporal and joint nugget will be estimated sumMetricModel <- vgmST("sumMetric", space=vgm( 6.9, "Lin", 200, 3.0), time =vgm(10.3, "Lin", 15, 3.6), joint=vgm(37.2, "Exp", 84,11.7), stAni=77.7) # simplified sumMetric model, only a overall nugget is fitted. The spatial, # temporal and jont nuggets are set to 0. simpleSumMetricModel <- vgmST("simpleSumMetric", space=vgm(20,"Lin", 150, 0), time =vgm(20,"Lin", 10, 0), joint=vgm(20,"Exp", 150, 0), nugget=1, stAni=15) # metric model metricModel <- vgmST("metric", joint=vgm(60, "Exp", 150, 10), stAni=60) } \keyword{models} gstat/man/variogramST.Rd0000644000176200001440000001113514650147707014710 0ustar liggesusers\name{variogramST} \alias{variogramST} \title{Calculate Spatio-Temporal Sample Variogram} \description{ Calculates the sample variogram from spatio-temporal data. } \usage{ variogramST(formula, locations, data, ..., tlags = 0:15, cutoff, width = cutoff/15, boundaries = seq(0, cutoff, width), progress = interactive(), pseudo = TRUE, assumeRegular = FALSE, na.omit = FALSE, cores = 1) } \arguments{ \item{formula}{formula, specifying the dependent variable.} \item{locations}{A STFDF or STSDF containing the variable; kept for compatibility reasons with variogram, either \code{locations} or \code{data} must be provided.} \item{data}{A \code{\link[spacetime:STFDF-class]{STFDF}}, \code{\link[spacetime:STSDF-class]{STSDF}} or \code{\link[spacetime:STIDF]{STIDF}} containing the variable.} \item{...}{any other arguments that will be passed to the underlying \code{\link{variogram}} function. In case of using data of type \code{\link[spacetime:STIDF-class]{STIDF}}, the argument \code{tunit} is recommended (and only used in the case of STIDF) to set the temporal unit of the \code{tlags}. Additionally, \code{twindow} can be passed to control the temporal window used for temporal distance calculations. This builds on the property of xts being ordered and only the next \code{twindow} instances are considered. This avoids the need of huge temporal distance matrices. The default uses twice the number as the average difference goes into the temporal cutoff.} \item{tlags}{ integer; time lags to consider or in case \code{data} is of class \code{\link[spacetime:STIDF-class]{STIDF}} the actual temporal boundaries with time unit given by \code{tunit} otherwise the same unit as \code{\link{diff}} on the index of the time slot will generate is assumed.} \item{cutoff}{ spatial separation distance up to which point pairs are included in semivariance estimates; as a default, the length of the diagonal of the box spanning the data is divided by three. } \item{width}{ the width of subsequent distance intervals into which data point pairs are grouped for semivariance estimates, by default the \code{cutoff} is divided into 15 equal lags.} \item{boundaries}{ numerical vector with distance interval upper boundaries; values should be strictly increasing } \item{progress}{ logical; if TRUE, show text progress bar } \item{pseudo}{ integer; use pseudo cross variogram for computing time-lagged spatial variograms? -1: find out from coordinates -- if they are equal then yes, else no; 0: no; 1: yes. } \item{assumeRegular}{logical; whether the time series should be assumed regular. The first time step is assumed to be representative for the whole series. Note, that temporal lags are considered by index, and no check is made whether pairs actually have the desired separating distance.} \item{na.omit}{shall all \code{NA} values in the spatio-temporal variogram be dropped? In case where complete rows or columns in the variogram consists of \code{NA} only, \code{plot} might produce a distorted picture.} \item{cores}{number of cores to use in parallel} } \value{The spatio-temporal sample variogram contains besides the fields \code{np}, \code{dist} and \code{gamma} the spatio-temporal fields, \code{timelag}, \code{spacelag} and \code{avgDist}, the first of which indicates the time lag used, the second and third different spatial lags. \code{spacelag} is the midpoint in the spatial lag intervals as passed by the parameter \code{boundaries}, whereas \code{avgDist} is the average distance between the point pairs found in a distance interval over all temporal lags (i.e. the averages of the values \code{dist} per temporal lag.) To compute variograms for space lag \eqn{h} and time lag \eqn{t}, the pseudo cross variogram \eqn{(Z_i(s)-Z_{i+t}(s+h))^2} is averaged over all time lagged observation sets \eqn{Z_i} and \eqn{Z_{i+t}} available (weighted by the number of pairs involved). } \references{ Cressie, N.A.C., 1993, Statistics for Spatial Data, Wiley. Cressie, N., C. Wikle, 2011, Statistics for Spatio-temporal Data, Wiley. \url{http://www.gstat.org/} Pebesma, E.J., 2004. Multivariable geostatistics in S: the gstat package. Computers and Geosciences, 30: 683-691. } \author{ Edzer Pebesma, Benedikt Graeler } \seealso{ \code{\link{plot.StVariogram}}, for variogram models: \code{\link{vgmST}}, to fit a spatio-temporal variogram model to a spatio-temporal sample variogram: \code{\link{fit.StVariogram}} } \examples{ # The following spatio-temporal variogram has been calcualted through # vv = variogram(PM10~1, r5to10, width=20, cutoff = 200, tlags=0:5) # in the vignette "st". data(vv) str(vv) plot(vv) } \keyword{models} gstat/man/show.vgms.Rd0000644000176200001440000000516614646417261014414 0ustar liggesusers% $Id: show.vgms.Rd,v 1.7 2008-12-15 14:27:29 edzer Exp $ \name{show.vgms} \alias{show.vgms} \title{ Plot Variogram Model Functions } \description{ Creates a trellis plot for a range of variogram models, possibly with nugget; and optionally a set of Matern models with varying smoothness. } \usage{ show.vgms(min = 1e-12 * max, max = 3, n = 50, sill = 1, range = 1, models = as.character(vgm()$short[c(1:17)]), nugget = 0, kappa.range = 0.5, plot = TRUE, ..., as.groups = FALSE) } \arguments{ \item{min}{ numeric; start distance value for semivariance calculation beyond the first point at exactly zero } \item{max}{ numeric; maximum distance for semivariance calculation and plotting } \item{n}{ integer; number of points to calculate distance values } \item{sill}{ numeric; (partial) sill(s) of the variogram model } \item{range}{ numeric; range(s) of the variogram model } \item{models}{ character; variogram model(s) to be plotted } \item{nugget}{ numeric; nugget component(s) for variogram models } \item{kappa.range}{ numeric; if this is a vector with more than one element, only a range of Matern models is plotted with these kappa values } \item{plot}{ logical; if TRUE, a plot is returned with the models specified; if FALSE, the data prepared for this plot is returned } \item{...}{ passed on to the call to xyplot } \item{as.groups}{ logical; if TRUE, different models are plotted with different lines in a single panel, else, in one panel per model } } \value{ returns a (Trellis) plot of the variogram models requested; see examples. I do currently have strong doubts about the ``correctness'' of the ``Hol'' model. The ``Spl'' model does seem to need a very large range value (larger than the study area?) to be of some value. If plot is FALSE, a data frame with the data prepared to plot is being returned. } \references{ \url{http://www.gstat.org}} \author{ Edzer Pebesma } \note{ the \code{min} argument is supplied because the variogram function may be discontinuous at distance zero, surely when a positive nugget is present. } \seealso{ \link{vgm}, \link{variogramLine}, } \examples{ show.vgms() show.vgms(models = c("Exp", "Mat", "Gau"), nugget = 0.1) # show a set of Matern models with different smoothness: show.vgms(kappa.range = c(.1, .2, .5, 1, 2, 5, 10), max = 10) # show a set of Exponential class models with different shape parameter: show.vgms(kappa.range = c(.05, .1, .2, .5, 1, 1.5, 1.8, 1.9, 2), models = "Exc", max = 10) # show a set of models with different shape parameter of M. Stein's representation of the Matern: show.vgms(kappa.range = c(.01, .02, .05, .1, .2, .5, 1, 2, 5, 1000), models = "Ste", max = 2) } \keyword{dplot} gstat/man/hscat.Rd0000644000176200001440000000273314646417261013560 0ustar liggesusers% $Id: hscat.Rd,v 1.3 2008-02-04 10:06:44 edzer Exp $ \name{hscat} \alias{hscat} \title{ Produce h-scatterplot } \description{ Produces h-scatterplots, where point pairs having specific separation distances are plotted. This function is a wrapper around xyplot. } \usage{ hscat(formula, data, breaks, pch = 3, cex = .6, mirror = FALSE, variogram.alpha = 0, as.table = TRUE,...) } \arguments{ \item{formula}{ specifies the dependent variable } \item{data}{ data where the variable in formula is resolved } \item{breaks}{ distance class boundaries } \item{pch}{ plotting symbol } \item{cex}{ plotting symbol size } \item{mirror}{ logical; duplicate all points mirrored along x=y? (note that correlations are those of the points plotted) } \item{variogram.alpha}{ parameter to be passed as alpha parameter to \link{variogram}; if alpha is specified it will only affect xyplot by being passed through ...} \item{as.table}{logical; if \code{TRUE}, panels plot top-to-bottom } \item{...}{ parameters, passed to variogram and xyplot } } \value{ an object of class trellis; normally the h scatter plot } \author{ Edzer Pebesma } \note{ Data pairs are plotted once, so the h-scatterplot are not symmetric. } \references{ \url{http://www.gstat.org/} Pebesma, E.J., 2004. Multivariable geostatistics in S: the gstat package. Computers and Geosciences, 30: 683-691. } \examples{ library(sp) data(meuse) coordinates(meuse) = ~x+y hscat(log(zinc)~1, meuse, c(0, 80, 120, 250, 500, 1000)) } \keyword{models} gstat/man/krigeST.Rd0000644000176200001440000001370114650147332014015 0ustar liggesusers% $Id: krige.Rd,v 1.25 2010-01-12 12:15:48 edzer Exp $ \name{krigeST} \docType{methods} \alias{krigeST} \alias{krige,formula,ST-method} % calling krigeST \alias{krigeSTTg} % \alias{idw,formula,ST-method} \title{ Ordinary global Spatio-Temporal Kriging} \description{ Function for ordinary global and local and trans Gaussian spatio-temporal kriging on point support } \usage{ krigeST(formula, data, newdata, modelList, beta, y, ..., nmax = Inf, stAni = NULL, computeVar = FALSE, fullCovariance = FALSE, bufferNmax=2, progress=TRUE) krigeSTTg(formula, data, newdata, modelList, y, nmax=Inf, stAni=NULL, bufferNmax=2, progress=TRUE, lambda = 0) } \arguments{ \item{formula}{ formula that defines the dependent variable as a linear model of independent variables; suppose the dependent variable has name \code{z}, for ordinary and simple kriging use the formula \code{z~1}; for simple kriging also define \code{beta} (see below); for universal kriging, suppose \code{z} is linearly dependent on \code{x} and \code{y}, use the formula \code{z~x+y}} \item{data}{ ST object: should contain the dependent variable and independent variables.} \item{newdata}{ ST object with prediction/simulation locations in space and time; should contain attribute columns with the independent variables (if present).} \item{modelList}{ object of class \code{StVariogramModel}, created by \code{\link{vgmST}} - see below or the function \code{\link{vgmAreaST}} for area-to-point kriging. For the general kriging case: a list with named elements: \code{space}, \code{time} and/or \code{joint} depending on the spatio-temporal covariance family, and an entry \code{stModel}. Currently implemented families that may be used for \code{stModel} are \code{separable}, \code{productSum}, \code{metric}, \code{sumMetric} and \code{simpleSumMetric}. See the examples section in \code{\link{fit.StVariogram}} or \code{\link{variogramSurface}} for details on how to define spatio-temporal covariance models. \code{krigeST} will look for a "temporal unit" attribute in the provided modelList in order to adjust the temporal scales.} \item{y}{matrix; to krige multiple fields in a single step, pass data as columns of matrix \code{y}. This will ignore the value of the response in \code{formula}.} \item{beta}{The (known) mean for simple kriging.} \item{nmax}{The maximum number of neighbouring locations for a spatio-temporal local neighbourhood} \item{stAni}{a spatio-temporal anisotropy scaling assuming a metric spatio-temporal space. Used only for the selection of the closest neighbours. This scaling needs only to be provided in case the model does not have a stAni parameter, or if a different one should be used for the neighbourhood selection. Mind the correct spatial unit. Currently, no coordinate conversion is made for the neighbourhood selection (i.e. Lat and Lon require a spatio-temporal anisotropy scaling in degrees per second).} \item{\dots}{ further arguments used for instance to pass the model into vgmAreaST for area-to-point kriging} \item{computeVar}{logical; if TRUE, prediction variances will be returned} \item{fullCovariance}{logical; if FALSE a vector with prediction variances will be returned, if TRUE the full covariance matrix of all predictions will be returned} \item{bufferNmax}{factor with which nmax is multiplied for an extended search radius (default=2). Set to 1 for no extension of the search radius.} \item{progress}{whether a progress bar shall be printed for local spatio-temporal kriging; default=TRUE} \item{lambda}{The value of lambda used in the box-cox transformation.} } \details{ Function \code{krigeST} is a R implementation of the kriging function from \link{gstat} using spatio-temporal covariance models following the implementation of \code{\link{krige0}}. Function \code{krigeST} offers some particular methods for ordinary spatio-temporal (ST) kriging. In particular, it does not support block kriging or kriging in a distance-based neighbourhood, and does not provide simulation. If \code{data} is of class \code{sftime}, then \code{newdata} MUST be of class \code{stars} or \code{sftime}, i.e. mixing form old-style classes (package spacetime) and new-style classes (sf, stars, sftime) is not supported. } \value{ An object of the same class as \code{newdata} (deriving from \code{\link[spacetime:ST-class]{ST}}). Attributes columns contain prediction and prediction variance. } \references{ Benedikt Graeler, Edzer Pebesma, Gerard Heuvelink. Spatio-Temporal Geostatistics using gstat. The R Journal 8(1), 204--218. \url{https://journal.r-project.org/archive/2016/RJ-2016-014/index.html} N.A.C. Cressie, 1993, Statistics for Spatial Data, Wiley. \url{http://www.gstat.org/} Pebesma, E.J., 2004. Multivariable geostatistics in S: the gstat package. Computers and Geosciences, 30: 683-691. } \author{ Edzer Pebesma, Benedikt Graeler } \seealso{ \code{\link{krige0}}, \code{\link{gstat}}, \code{\link[gstat]{predict}}, \code{\link{krigeTg}} } \examples{ library(sp) library(spacetime) sumMetricVgm <- vgmST("sumMetric", space = vgm( 4.4, "Lin", 196.6, 3), time = vgm( 2.2, "Lin", 1.1, 2), joint = vgm(34.6, "Exp", 136.6, 12), stAni = 51.7) data(air) suppressWarnings(proj4string(stations) <- CRS(proj4string(stations))) rural = STFDF(stations, dates, data.frame(PM10 = as.vector(air))) rr <- rural[,"2005-06-01/2005-06-03"] rr <- as(rr,"STSDF") x1 <- seq(from=6,to=15,by=1) x2 <- seq(from=48,to=55,by=1) DE_gridded <- SpatialPoints(cbind(rep(x1,length(x2)), rep(x2,each=length(x1))), proj4string=CRS(proj4string(rr@sp))) gridded(DE_gridded) <- TRUE DE_pred <- STF(sp=as(DE_gridded,"SpatialPoints"), time=rr@time) DE_kriged <- krigeST(PM10~1, data=rr, newdata=DE_pred, modelList=sumMetricVgm) gridded(DE_kriged@sp) <- TRUE stplot(DE_kriged) } \keyword{ models } gstat/man/variogramSurface.Rd0000644000176200001440000000251614646417261015755 0ustar liggesusers\name{variogramSurface} \alias{variogramSurface} \title{Semivariance values for a given spatio-temporal variogram model} \description{ Generates a surface of semivariance values given a spatio-temporal variogram model (one of separable, productSum, sumMetric, simpleSumMetric or metric) } \usage{ variogramSurface(model, dist_grid, covariance = FALSE) } \arguments{ \item{model}{ A spatio-temporal variogram model generated through \code{\link{vgmST}} or \code{\link{fit.StVariogram}}. } \item{dist_grid}{ A data.frame with two columns: \code{spacelag} and \code{timelag}. } \item{covariance}{ Whether the covariance should be computed instead of the variogram (default: FALSE). } } \value{ A data.frame with columns \code{spacelag}, \code{timelag} and \code{gamma}. } \author{ Benedikt Graeler } \seealso{ See \code{\link{variogramLine}} for the spatial version and \code{\link{fit.StVariogram}} for the estimation of spatio-temporal variograms. } \examples{ separableModel <- vgmST("separable", space=vgm(0.86, "Exp", 476, 0.14), time =vgm( 1, "Exp", 3, 0), sill=113) data(vv) if(require(lattice)) { plot(vv, separableModel, wireframe=TRUE, all=TRUE) } # plotting of sample and model variogram plot(vv, separableModel) } \keyword{models} \keyword{spatio-temporal} gstat/man/krigeSTSimTB.Rd0000644000176200001440000000410614646417261014721 0ustar liggesusers\name{krigeSTSimTB} \alias{krigeSTSimTB} \title{conditional/unconditional spatio-temporal simulation} \description{ conditional/unconditional spatio-temporal simulation based on turning bands } \usage{ krigeSTSimTB(formula, data, newdata, modelList, nsim, progress = TRUE, nLyrs = 500, tGrid = NULL, sGrid = NULL, ceExt = 2, nmax = Inf) } \arguments{ \item{formula}{the formula of the kriging predictor} \item{data}{conditioning data} \item{newdata}{locations in space and time where the simulation is carried out} \item{modelList}{the spatio-temporal variogram (from \code{\link{vgmST}}) defining the spatio-temporal covariance structure of the simulated Gaussian random field} \item{nsim}{number of simulations} \item{progress}{boolean; whether the progress should be shown in progress bar} \item{nLyrs}{number of layers used in the turning bands approach (default = 500) } \item{tGrid}{optional explicit temporal griding that shall be used} \item{sGrid}{optional explicit spatial griding that shall be used} \item{ceExt}{expansion in the circulant embedding, defaults to 2} \item{nmax}{number of nearest neighbours that shall e used, defaults to 'Inf' meaning all available points are used} } \value{a spatio-temporal data frame with \code{nSim} simulations} \references{ Turning bands Lantuejoul, C. (2002) Geostatistical Simulation: Models and Algorithms. Springer. Matheron, G. (1973). The intrinsic random functions and their applications. Adv. Appl. Probab., 5, 439-468. Strokorb, K., Ballani, F., and Schlather, M. (2014) Tail correlation functions of max-stable processes: Construction principles, recovery and diversity of some mixing max-stable processes with identical TCF. Extremes, Submitted. Turning layers Schlather, M. (2011) Construction of covariance functions and unconditional simulation of random fields. In Porcu, E., Montero, J.M. and Schlather, M., Space-Time Processes and Challenges Related to Environmental Problems. New York: Springer. } \author{Benedikt Graeler} \seealso{\code{\link{krigeSimCE}}} \examples{ # see demo('circEmbeddingMeuse') }gstat/man/tull.Rd0000644000176200001440000000542414646417261013436 0ustar liggesusers\name{tull} \alias{tull} \alias{TULLNREG} \alias{tull36} \alias{Chlorid92} \encoding{utf-8} \title{Südliche Tullnerfeld data set} \description{ The Südliche Tullnerfeld is a part of the Danube river basin in central Lower Austria and due to its homogeneous aquifer well suited for a model-oriented geostatistical analysis. It contains 36 official water quality measurement stations, which are irregularly spread over the region. } \format{ The data frames contain the following columns: \describe{ \item{x}{X location in meter} \item{y}{Y location in meter} \item{S411}{Station name} \item{S429}{Station name} \item{S849}{Station name} \item{S854}{Station name} \item{S1502}{Station name} \item{S1584}{Station name} \item{S1591}{Station name} \item{S2046}{Station name} \item{S2047}{Station name} \item{S2048}{Station name} \item{S2049}{Station name} \item{S2051}{Station name} \item{S2052}{Station name} \item{S2053}{Station name} \item{S2054}{Station name} \item{S2055}{Station name} \item{S2057}{Station name} \item{S2058}{Station name} \item{S2059}{Station name} \item{S2060}{Station name} \item{S2061}{Station name} \item{S2062}{Station name} \item{S2063}{Station name} \item{S2064}{Station name} \item{S2065}{Station name} \item{S2066}{Station name} \item{S2067}{Station name} \item{S2070}{Station name} \item{S2071}{Station name} \item{S2072}{Station name} \item{S2128}{Station name} \item{S5319}{Station name} \item{S5320}{Station name} \item{S5321}{Station name} \item{S5322}{Station name} \item{S5323}{Station name} } } \usage{ data(tull) } \references{ Werner G. Müller, Collecting Spatial Data, 3rd edition. Springer Verlag, Heidelberg, 2007 } \note{ This data set was obtained on May 6, 2008 from \url{ http://www.ifas.jku.at/e5361/index_ger.html }. The author of the book that uses it is found at: \url{ http://www.ifas.jku.at/e2571/e2604/index_ger.html } } \keyword{datasets} \examples{ data(tull) # TULLNREG = read.csv("TULLNREG.csv") # I modified tulln36des.csv, such that the first line only contained: x,y # resulting in row.names that reflect the station ID, as in # tull36 = read.csv("tulln36des.csv") # Chlorid92 was read & converted by: #Chlorid92=read.csv("Chlorid92.csv") #Chlorid92$Datum = as.POSIXct(strptime(Chlorid92$Datum, "%d.%m.%y")) summary(tull36) summary(TULLNREG) summary(Chlorid92) # stack & join data to x,y,Date,Chloride form: cl.st = stack(Chlorid92[-1]) names(cl.st) = c("Chloride", "Station") cl.st$Date = rep(Chlorid92$Datum, length(names(Chlorid92))-1) cl.st$x = tull36[match(cl.st[,"Station"], row.names(tull36)), "x"] cl.st$y = tull36[match(cl.st[,"Station"], row.names(tull36)), "y"] # library(lattice) # xyplot(Chloride~Date|Station, cl.st) # xyplot(y~x|Date, cl.st, asp="iso", layout=c(16,11)) summary(cl.st) plot(TULLNREG, pch=3, asp=1) points(y~x, cl.st, pch=16) } gstat/man/meuse.alt.Rd0000644000176200001440000000143314646417261014347 0ustar liggesusers% $Id: meuse.alt.Rd,v 1.6 2006-02-10 19:03:27 edzer Exp $ \name{meuse.alt} \alias{meuse.alt} \title{Meuse river altitude data set} \description{ This data set gives a point set with altitudes, digitized from the 1:10,000 topographical map of the Netherlands. } \format{ This data frame contains the following columns: \describe{ \item{x}{a numeric vector; x-coordinate (m) in RDM (Dutch topographical map coordinates) } \item{y}{a numeric vector; y-coordinate (m) in RDM (Dutch topographical map coordinates)} \item{alt}{altitude in m. above NAP (Dutch zero for sea level)} } } \usage{ data(meuse.alt) } \references{ \url{http://www.gstat.org/} } \seealso{\link{meuse.all}} \keyword{datasets} \examples{ data(meuse.alt) library(lattice) xyplot(y~x, meuse.alt, aspect = "iso") } gstat/man/fit.variogram.Rd0000644000176200001440000001234314646417261015224 0ustar liggesusers% $Id: fit.variogram.Rd,v 1.6 2006-02-10 19:03:27 edzer Exp $ \name{fit.variogram} \alias{fit.variogram} \title{ Fit a Variogram Model to a Sample Variogram } \description{ Fit ranges and/or sills from a simple or nested variogram model to a sample variogram } \usage{ fit.variogram(object, model, fit.sills = TRUE, fit.ranges = TRUE, fit.method = 7, debug.level = 1, warn.if.neg = FALSE, fit.kappa = FALSE) } \arguments{ \item{object}{ sample variogram, output of \link{variogram} } \item{model}{ variogram model, output of \link{vgm}; see Details below for details on how \code{NA} values in \code{model} are initialised. } \item{fit.sills}{ logical; determines whether the partial sill coefficients (including nugget variance) should be fitted; or logical vector: determines for each partial sill parameter whether it should be fitted or fixed. } \item{fit.ranges}{ logical; determines whether the range coefficients (excluding that of the nugget component) should be fitted; or logical vector: determines for each range parameter whether it should be fitted or fixed. } \item{fit.method}{ fitting method, used by gstat. The default method uses weights $N_h/h^2$ with $N_h$ the number of point pairs and $h$ the distance. This criterion is not supported by theory, but by practice. For other values of \code{fit.method}, see details. } \item{debug.level}{ integer; set gstat internal debug level } \item{warn.if.neg}{ logical; if TRUE a warning is issued whenever a sill value of a direct variogram becomes negative } \item{fit.kappa}{ logical; if \code{TRUE}, a sequence of 0.3, 0.4,...,5 will be searched for optimal fit; alternatively another sequence can be given to this argument } } \value{ returns a fitted variogram model (of class \code{variogramModel}). This is a \code{data.frame} with two attributes: (i) \code{singular} a logical attribute that indicates whether the non-linear fit converged (FALSE), or ended in a singularity (TRUE), and (ii) \code{SSErr} a numerical attribute with the (weighted) sum of squared errors of the fitted model. See Notes below. } \note{ If fitting the range(s) is part of the job of this function, the results may well depend on the starting values, given in argument \code{model}, which is generally the case for non-linear regression problems. This function uses internal C code, which uses Levenberg-Marquardt. If for a direct (i.e. not a cross) variogram a sill parameter (partial sill or nugget) becomes negative, fit.variogram is called again with this parameter set to zero, and with a FALSE flag to further fit this sill. This implies that the search does not move away from search space boundaries. On singular model fits: If your variogram turns out to be a flat, horizontal or sloping line, then fitting a three parameter model such as the exponential or spherical with nugget is a bit heavy: there's an infinite number of possible combinations of sill and range (both very large) to fit to a sloping line. In this case, the returned, singular model may still be useful: just try and plot it. Gstat converges when the parameter values stabilize, and this may not be the case. Another case of singular model fits happens when a model that reaches the sill (such as the spherical) is fit with a nugget, and the range parameter starts, or converges to a value smaller than the distance of the second sample variogram estimate. In this case, again, an infinite number of possibilities occur essentially for fitting a line through a single (first sample variogram) point. In both cases, fixing one or more of the variogram model parameters may help you out. The function will accept anisotropic sample variograms as input. It will fit a model for a given direction interval if the sample variogram only includes this direction. It is not possible to fit a multiple direction model to each direction of the sample variogram, in this case the model will be fitted to an average of all directions. } \details{ If any of the initial parameters of \code{model} are \code{NA}, they are given default values as follows. The range parameter is given one third of the maximum value of \code{object$dist}. The nugget value is given the mean value of the first three values of \code{object$gamma}. The partial sill is given the mean of the last five values of \code{object$gamma}. Values for \code{fit.method} are 1: weights equal to $N_j$; 2: weights equal to $N_j/((gamma(h_j))^2)$; 5 (ignore, use \link{fit.variogram.reml}); 6: unweighted (OLS); 7: $N_j/(h_j^2)$. (from: \url{http://www.gstat.org/gstat.pdf}, table 4.2). } \references{ \url{http://www.gstat.org/} Pebesma, E.J., 2004. Multivariable geostatistics in S: the gstat package. Computers and Geosciences, 30: 683-691. } \author{ Edzer Pebesma } \seealso{ \link{variogram}, \link{vgm} } \examples{ library(sp) data(meuse) coordinates(meuse) = ~x+y vgm1 <- variogram(log(zinc)~1, meuse) fit.variogram(vgm1, vgm(1, "Sph", 300, 1)) fit.variogram(vgm1, vgm("Sph")) # optimize the value of kappa in a Matern model, using ugly <<- side effect: f = function(x) attr(m.fit <<- fit.variogram(vgm1, vgm(,"Mat",nugget=NA,kappa=x)),"SSErr") optimize(f, c(0.1, 5)) plot(vgm1, m.fit) # best fit from the (0.3, 0.4, 0.5. ... , 5) sequence: (m <- fit.variogram(vgm1, vgm("Mat"), fit.kappa = TRUE)) attr(m, "SSErr") } \keyword{models} gstat/man/fit.variogram.reml.Rd0000644000176200001440000000365314646417261016166 0ustar liggesusers% $Id: fit.variogram.reml.Rd,v 1.4 2009-02-20 13:53:38 edzer Exp $ \name{fit.variogram.reml} \alias{fit.variogram.reml} \title{ REML Fit Direct Variogram Partial Sills to Data } \description{ Fit Variogram Sills to Data, using REML (only for direct variograms; not for cross variograms) } \usage{ fit.variogram.reml(formula, locations, data, model, debug.level = 1, set, degree = 0) } \arguments{ \item{formula}{formula defining the response vector and (possible) regressors; in case of absence of regressors, use e.g. \code{z~1}} \item{locations}{ spatial data locations; a formula with the coordinate variables in the right hand (dependent variable) side. } \item{data}{data frame where the names in formula and locations are to be found} \item{model}{variogram model to be fitted, output of \code{vgm}} \item{debug.level}{debug level; set to 65 to see the iteration trace and log likelihood} \item{set}{additional options that can be set; use \code{set=list(iter=100)} to set the max. number of iterations to 100. } \item{degree}{order of trend surface in the location, between 0 and 3} } \value{ an object of class "variogramModel"; see \link{fit.variogram} } \references{ Christensen, R. Linear models for multivariate, Time Series, and Spatial Data, Springer, NY, 1991. Kitanidis, P., Minimum-Variance Quadratic Estimation of Covariances of Regionalized Variables, Mathematical Geology 17 (2), 195--208, 1985 } \author{ Edzer Pebesma } \note{ This implementation only uses REML fitting of sill parameters. For each iteration, an \eqn{n \times n}{n x n} matrix is inverted, with $n$ the number of observations, so for large data sets this method becomes demanding. I guess there is much more to likelihood variogram fitting in package \code{geoR}, and probably also in \code{nlme}. } \seealso{ \link{fit.variogram}, } \examples{ library(sp) data(meuse) fit.variogram.reml(log(zinc)~1, ~x+y, meuse, model = vgm(1, "Sph", 900,1)) } \keyword{models} gstat/man/vgm.panel.Rd0000644000176200001440000000455714650146451014346 0ustar liggesusers% $Id: vgm.panel.Rd,v 1.3 2008-10-30 13:47:05 edzer Exp $ \name{vgm.panel.xyplot} \alias{vgm.panel.xyplot} \alias{panel.pointPairs} \title{ panel functions for most of the variogram plots through lattice } \description{ Variogram plots contain symbols and lines; more control over them can be gained by writing your own panel functions, or extending the ones described here; see examples. } \usage{ vgm.panel.xyplot(x, y, subscripts, type = "p", pch = plot.symbol$pch, col, col.line = plot.line$col, col.symbol = plot.symbol$col, lty = plot.line$lty, cex = plot.symbol$cex, ids, lwd = plot.line$lwd, model = model, direction = direction, labels, shift = shift, mode = mode, ...) panel.pointPairs(x, y, type = "p", pch = plot.symbol$pch, col, col.line = plot.line$col, col.symbol = plot.symbol$col, lty = plot.line$lty, cex = plot.symbol$cex, lwd = plot.line$lwd, pairs = pairs, line.pch = line.pch, ...) } \arguments{ \item{x}{ x coordinates of points in this panel} \item{y}{ y coordinates of points in this panel} \item{subscripts }{ subscripts of points in this panel} \item{type}{ plot type: "l" for connected lines } \item{pch}{ plotting symbol } \item{col}{ symbol and line color (if set) } \item{col.line}{ line color } \item{col.symbol}{ symbol color } \item{lty}{ line type for variogram model } \item{cex}{ symbol size } \item{ids}{ gstat model ids } \item{lwd}{ line width } \item{model}{ variogram model } \item{direction}{ direction vector \code{c(dir.horizontal, dir.ver)}} \item{labels}{ labels to plot next to points } \item{shift}{ amount to shift the label right of the symbol } \item{mode}{ to be set by calling function only } \item{line.pch}{ symbol type to be used for point of selected point pairs, e.g. to highlight point pairs with distance close to zero } \item{pairs}{ two-column matrix with pair indexes to be highlighted } \item{...}{ parameters that get passed to \link[lattice]{lpoints} } } \value{ ignored; the enclosing function returns a plot of class \code{trellis} } \references{ \url{http://www.gstat.org/} } \author{ Edzer Pebesma } \seealso{ \link{plot.gstatVariogram}, \link{vgm}} \examples{ library(sp) data(meuse) coordinates(meuse) <- c("x", "y") library(lattice) mypanel = function(x,y,...) { vgm.panel.xyplot(x,y,...) panel.abline(h=var(log(meuse$zinc)), color = 'red') } plot(variogram(log(zinc)~1,meuse), panel = mypanel) } \keyword{models} gstat/man/krigeSimCE.Rd0000644000176200001440000000222214646417261014431 0ustar liggesusers\name{krigeSimCE} \alias{krigeSimCE} \title{Simulation based on circulant embedding} \description{Simulating a conditional/unconditional Gaussian random field via kriging and circulant embedding} \usage{ krigeSimCE(formula, data, newdata, model, n = 1, ext = 2) } \arguments{ \item{formula}{ the formula of the kriging predictor} \item{data}{ spatial data frame that conditions the simulation} \item{newdata}{locations in space where the Gaussian random field shall be simulated} \item{model}{a vgm model that defines the spatial covariance structure} \item{n}{number of simulations} \item{ext}{extension factor of the circulant embedding, defaults to 2} } \value{A spatial data frame as defined in \code{newdata} with \code{n} simulations.} \references{ Davies, Tilman M., and David Bryant: "On circulant embedding for Gaussian random fields in R." Journal of Statistical Software 55.9 (2013): 1-21. See i.e. the supplementary files at (retrieved 2018-05-25): https://www.jstatsoft.org/index.php/jss/article/downloadSuppFile/v055i09/v55i09.R } \author{Benedikt Graeler} \seealso{\code{\link{krigeSTSimTB}}} \examples{# see demo('circEmbeddingMeuse')}gstat/man/gstat.Rd0000644000176200001440000002355614646417261013606 0ustar liggesusers% $Id: gstat.Rd,v 1.23 2009-11-02 21:33:17 edzer Exp $ \name{gstat} \alias{gstat} \alias{print.gstat} \alias{[.gstat} \title{ Create gstat objects, or subset it } \description{ Function that creates gstat objects; objects that hold all the information necessary for univariate or multivariate geostatistical prediction (simple, ordinary or universal (co)kriging), or its conditional or unconditional Gaussian or indicator simulation equivalents. Multivariate gstat object can be subsetted. } \usage{ gstat(g, id, formula, locations, data, model = NULL, beta, nmax = Inf, nmin = 0, omax = 0, maxdist = Inf, force = FALSE, dummy = FALSE, set, fill.all = FALSE, fill.cross = TRUE, variance = "identity", weights = NULL, merge, degree = 0, vdist = FALSE, lambda = 1.0) \method{print}{gstat}(x, ...) } \arguments{ \item{g}{ gstat object to append to; if missing, a new gstat object is created } \item{id}{ identifier of new variable; if missing, \code{varn} is used with \code{n} the number for this variable. If a cross variogram is entered, \code{id} should be a vector with the two \code{id} values , e.g. \code{c("zn", "cd")}, further only supplying arguments \code{g} and \code{model}. It is advisable not to use expressions, such as \code{log(zinc)}, as identifiers, as this may lead to complications later on. } \item{formula}{ formula that defines the dependent variable as a linear model of independent variables; suppose the dependent variable has name \code{z}, for ordinary and simple kriging use the formula \code{z~1}; for simple kriging also define \code{beta} (see below); for universal kriging, suppose \code{z} is linearly dependent on \code{x} and \code{y}, use the formula \code{z~x+y}} \item{locations}{ formula with only independent variables that define the spatial data locations (coordinates), e.g. \code{~x+y}; if \code{data} has a \code{coordinates} method to extract its coordinates this argument can be ignored (see package sp for classes for point or grid data). } \item{data}{ data frame; contains the dependent variable, independent variables, and locations. } \item{model}{ variogram model for this \code{id}; defined by a call to \link{vgm}; see argument \code{id} to see how cross variograms are entered } \item{beta}{ for simple kriging (and simulation based on simple kriging): vector with the trend coefficients (including intercept); if no independent variables are defined the model only contains an intercept and this should be the expected value; for cross variogram computations: mean parameters to be used instead of the OLS estimates } \item{nmax}{ for local kriging: the number of nearest observations that should be used for a kriging prediction or simulation, where nearest is defined in terms of the space of the spatial locations } \item{nmin}{ for local kriging: if the number of nearest observations within distance \code{maxdist} is less than \code{nmin}, a missing value will be generated, unless \code{force==TRUE}; see \code{maxdist} } \item{omax}{ maximum number of observations to select per octant (3D) or quadrant (2D); only relevant if \code{maxdist} has been defined as well } \item{maxdist}{ for local kriging: only observations within a distance of \code{maxdist} from the prediction location are used for prediction or simulation; if combined with \code{nmax}, both criteria apply } \item{force}{ for local kriging, force neighbourhood selection: in case \code{nmin} is given, search beyond \code{maxdist} until \code{nmin} neighbours are found. A missing value is returned if this is not possible. } \item{dummy}{ logical; if TRUE, consider this data as a dummy variable (only necessary for unconditional simulation) } \item{set}{ named list with optional parameters to be passed to gstat (only \code{set} commands of gstat are allowed, and not all of them may be relevant; see the manual for gstat stand-alone, URL below ) } \item{x}{ gstat object to print } \item{fill.all}{ logical; if TRUE, fill all of the direct variogram and, depending on the value of \code{fill.cross} also all cross variogram model slots in \code{g} with the given variogram model } \item{fill.cross}{ logical; if TRUE, fill all of the cross variograms, if FALSE fill only all direct variogram model slots in \code{g} with the given variogram model (only if \code{fill.all} is used)} \item{variance}{ character; variance function to transform to non-stationary covariances; "identity" does not transform, other options are "mu" (Poisson) and "mu(1-mu)" (binomial) } \item{weights}{ numeric vector; if present, covariates are present, and variograms are missing weights are passed to OLS prediction routines resulting in WLS; if variograms are given, weights should be 1/variance, where variance specifies location-specific measurement error; see references section below } \item{merge}{ either character vector of length 2, indicating two ids that share a common mean; the more general gstat merging of any two coefficients across variables is obtained when a list is passed, with each element a character vector of length 4, in the form \code{c("id1", 1,"id2", 2)}. This merges the first parameter for variable \code{id1} to the second of variable \code{id2}.} \item{degree}{order of trend surface in the location, between 0 and 3} \item{vdist}{logical; if TRUE, instead of Euclidian distance variogram distance is used for selecting the nmax nearest neighbours, after observations within distance maxdist (Euclidian/geographic) have been pre-selected } \item{lambda}{test feature; doesn't do anything (yet)} \item{...}{ arguments that are passed to the printing of variogram models only} } \details{ to print the full contents of the object \code{g} returned, use \code{as.list(g)} or \code{print.default(g)} } \value{ an object of class \code{gstat}, which inherits from \code{list}. Its components are: \item{data}{list; each element is a list with the \code{formula}, \code{locations}, \code{data}, \code{nvars}, \code{beta}, etc., for a variable} \item{model}{list; each element contains a variogram model; names are those of the elements of \code{data}; cross variograms have names of the pairs of data elements, separated by a \code{.} (e.g.: \code{var1.var2}}) \item{set}{list; named list, corresponding to set \code{name}=\code{value}; gstat commands (look up the set command in the gstat manual for a full list)} } \references{ \url{http://www.gstat.org/} Pebesma, E.J., 2004. Multivariable geostatistics in S: the gstat package. Computers and Geosciences, 30: 683-691. for kriging with known, varying measurement errors (\code{weights}), see e.g. Delhomme, J.P. Kriging in the hydrosciences. Advances in Water Resources, 1(5):251-266, 1978; see also the section Kriging with known measurement errors in the gstat user's manual, \url{http://www.gstat.org/} } \author{ Edzer Pebesma } \note{ The function currently copies the data objects into the gstat object, so this may become a large object. I would like to copy only the name of the data frame, but could not get this to work. Any help is appreciated. Subsetting (see examples) is done using the \code{id}'s of the variables, or using numeric subsets. Subsetted gstat objects only contain cross variograms if (i) the original gstat object contained them and (ii) the order of the subset indexes increases, numerically, or given the order they have in the gstat object. The merge item may seem obscure. Still, for colocated cokriging, it is needed. See texts by Goovaerts, Wackernagel, Chiles and Delfiner, or look for standardised ordinary kriging in the 1992 Deutsch and Journel or Isaaks and Srivastava. In these cases, two variables share a common mean parameter. Gstat generalises this case: any two variables may share any of the regression coefficients; allowing for instance analysis of covariance models, when variograms were left out (see e.g. R. Christensen's ``Plane answers'' book on linear models). The tests directory of the package contains examples in file merge.R. There is also \code{demo(pcb)} which merges slopes across years, but with year-dependent intercept. } \seealso{ \link[gstat]{predict}, \link{krige} } \examples{ library(sp) data(meuse) coordinates(meuse) = ~x+y # let's do some manual fitting of two direct variograms and a cross variogram g <- gstat(id = "ln.zinc", formula = log(zinc)~1, data = meuse) g <- gstat(g, id = "ln.lead", formula = log(lead)~1, data = meuse) # examine variograms and cross variogram: plot(variogram(g)) # enter direct variograms: g <- gstat(g, id = "ln.zinc", model = vgm(.55, "Sph", 900, .05)) g <- gstat(g, id = "ln.lead", model = vgm(.55, "Sph", 900, .05)) # enter cross variogram: g <- gstat(g, id = c("ln.zinc", "ln.lead"), model = vgm(.47, "Sph", 900, .03)) # examine fit: plot(variogram(g), model = g$model, main = "models fitted by eye") # see also demo(cokriging) for a more efficient approach g["ln.zinc"] g["ln.lead"] g[c("ln.zinc", "ln.lead")] g[1] g[2] # Inverse distance interpolation with inverse distance power set to .5: # (kriging variants need a variogram model to be specified) data(meuse.grid) gridded(meuse.grid) = ~x+y meuse.gstat <- gstat(id = "zinc", formula = zinc ~ 1, data = meuse, nmax = 7, set = list(idp = .5)) meuse.gstat z <- predict(meuse.gstat, meuse.grid) spplot(z["zinc.pred"]) # see demo(cokriging) and demo(examples) for further examples, # and the manuals for predict and image # local universal kriging gmeuse <- gstat(id = "log_zinc", formula = log(zinc)~sqrt(dist), data = meuse) # variogram of residuals vmeuse.res <- fit.variogram(variogram(gmeuse), vgm(1, "Exp", 300, 1)) # prediction from local neighbourhoods within radius of 170 m or at least 10 points gmeuse <- gstat(id = "log_zinc", formula = log(zinc)~sqrt(dist), data = meuse, maxdist=170, nmin=10, force=TRUE, model=vmeuse.res) predmeuse <- predict(gmeuse, meuse.grid) spplot(predmeuse) } \keyword{ models } gstat/man/fit.StVariogram.Rd0000644000176200001440000001423114646417261015471 0ustar liggesusers\name{fit.StVariogram} \alias{fit.StVariogram} \title{Fit a spatio-temporal sample variogram to a sample variogram} \description{ Fits a spatio-temporal variogram of a given type to spatio-temporal sample variogram. } \usage{ fit.StVariogram(object, model, ..., method = "L-BFGS-B", lower, upper, fit.method = 6, stAni=NA, wles) } \arguments{ \item{object}{The spatio-temporal sample variogram. Typically output from \code{\link{variogramST}}} \item{model}{The desired spatio-temporal model defined through \code{\link{vgmST}}.} \item{\dots}{further arguments passed to \code{\link{optim}}. \code{\link{extractParNames}} provides the parameter structure of spatio-temporal variogram models that help to provide sensible \code{upper} and \code{lower} limits.} \item{lower}{Lower limits used by optim. If missing, the smallest well defined values are used (mostly near 0).} \item{upper}{Upper limits used by optim. If missing, the largest well defined values are used (mostly \code{Inf}).} \item{method}{fit method, pass to \code{\link{optim}}} \item{fit.method}{an integer between 0 and 13 determine the fitting routine (i.e. weighting of the squared residuals in the LSE). Values 0 to 6 correspond with the pure spatial version (see \code{\link{fit.variogram}}). See the details section for the meaning of the other values (partly experimental).} \item{stAni}{The spatio-temporal anisotropy that is used in the weighting. Might be missing if the desired spatio-temporal variogram model does contain a spatio-temporal anisotropy parameter (this might cause bad convergence behaviour). The default is \code{NA} and will be understood as identity (1 temporal unit = 1 spatial unit). As this only in very few cases a valid assumption, a warning is issued.} \item{wles}{Should be missing; only for backwards compatibility, \code{wles = TRUE} corresponds to \code{fit.method = 1} and \code{wles = FALSE} corresponds to \code{fit.method = 6}.} } \details{ The following list summarizes the meaning of the \code{fit.method} argument which is essential a weighting of the squared residuals in the least-squares estimation. Please note, that weights based on the models gamma value might fail to converge properly due to the dependence of weights on the variogram estimate: \describe{ \item{\code{fit.method = 0}}{no fitting, however the MSE between the provided variogram model and sample variogram surface is calculated.} \item{\code{fit.method = 1}}{Number of pairs in the spatio-temporal bin: \eqn{N_j}{N[j]}} \item{\code{fit.method = 2}}{Number of pairs in the spatio-temporal bin divided by the square of the current variogram model's value: \eqn{N_j/\gamma(h_j, u_j)^2}{N[j]/gamma(h[j],u[j])^2}} \item{\code{fit.method = 3}}{Same as \code{fit.method = 1} for compatibility with \code{\link{fit.variogram}} but as well evaluated in R.} \item{\code{fit.method = 4}}{Same as \code{fit.method = 2} for compatibility with \code{\link{fit.variogram}} but as well evaluated in R.} \item{\code{fit.method = 5}}{Reserved for REML for compatibility with \code{\link{fit.variogram}}, not yet implemented.} \item{\code{fit.method = 6}}{No weights.} \item{\code{fit.method = 7}}{Number of pairs in the spatio-temporal bin divided by the square of the bin's metric distance. If \code{stAni} is not specified, the model's parameter is used to calculate the metric distance across space and time: \eqn{N_j/(h_j^2 + {\rm stAni}^2\cdot u_j^2)}{N[j]/(h[j]^2+ stAni^2*u[j]^2)}} \item{\code{fit.method = 8}}{Number of pairs in the spatio-temporal bin divided by the square of the bin's spatial distance. \eqn{N_j/h_j^2}{N[j]/h[j]^2}. Note that the 0 distances are replaced by the smallest non-zero distances to avoid division by zero.} \item{\code{fit.method = 9}}{Number of pairs in the spatio-temporal bin divided by the square of the bin's temporal distance. \eqn{N_j/u_j^2}{N[j]/u[j]^2}. Note that the 0 distances are replaced by the smallest non-zero distances to avoid division by zero.} \item{\code{fit.method = 10}}{Reciprocal of the square of the current variogram model's value: \eqn{1/\gamma(h_j,u_j)^2}{1/gamma(h[j],u[j])^2}} \item{\code{fit.method = 11}}{Reciprocal of the square of the bin's metric distance. If \code{stAni} is not specified, the model's parameter is used to calculate the metric distance across space and time: \eqn{1/(h_j^2 + {\rm stAni}^2\cdot u_j^2)}{1/(h[j]^2+ stAni^2*u[j]^2)}} \item{\code{fit.method = 12}}{Reciprocal of the square of the bin's spatial distance. \eqn{1/h_j^2}{1/h[j]^2}. Note that the 0 distances are replaced by the smallest non-zero distances to avoid division by zero.} \item{\code{fit.method = 13}}{Reciprocal of the square of the bin's temporal distance. \eqn{1/u_j^2}{1/u[j]^2}. Note that the 0 distances are replaced by the smallest non-zero distances to avoid division by zero.} } See also Table 4.2 in the gstat manual for the original spatial version. } \value{ Returns a spatio-temporal variogram model, as S3 class StVariogramModel. It carries the temporal and spatial unit as attributes \code{"temporal unit"} and \code{"spatial unit"} in order to allow \code{\link{krigeST}} to adjust for different units. The units are obtained from the provided empirical variogram. Further attributes are the optim output \code{"optim.output"} and the always not weighted mean squared error \code{"MSE"}. } \author{ Benedikt Graeler } \seealso{ \code{\link{fit.variogram}} for the pure spatial case. \code{\link{extractParNames}} helps to understand the parameter structure of spatio-temporal variogram models. } \examples{ # separable model: spatial and temporal sill will be ignored # and kept constant at 1-nugget respectively. A joint sill is used. \dontrun{ separableModel <- vgmST("separable", method = "Nelder-Mead", # no lower & upper needed space=vgm(0.9,"Exp", 123, 0.1), time =vgm(0.9,"Exp", 2.9, 0.1), sill=100) data(vv) separableModel <- fit.StVariogram(vv, separableModel, method="L-BFGS-B", lower=c(10,0,0.01,0,1), upper=c(500,1,20,1,200)) plot(vv, separableModel) } # dontrun } \keyword{models} gstat/DESCRIPTION0000644000176200001440000000252114750437062013112 0ustar liggesusersPackage: gstat Version: 2.1-3 Title: Spatial and Spatio-Temporal Geostatistical Modelling, Prediction and Simulation Authors@R: c(person(given = "Edzer", family = "Pebesma", role = c("aut", "cre"), email = "edzer.pebesma@uni-muenster.de", comment = c(ORCID = "0000-0001-8049-7069")), person("Benedikt", "Graeler", role = "aut")) Description: Variogram modelling; simple, ordinary and universal point or block (co)kriging; spatio-temporal kriging; sequential Gaussian or indicator (co)simulation; variogram and variogram map plotting utility functions; supports sf and stars. Depends: R (>= 2.10) Imports: utils, stats, graphics, methods, lattice, sp (>= 0.9-72), zoo, sf (>= 0.7-2), sftime, spacetime (>= 1.2-8), stars, FNN Suggests: fields, maps, mapdata, xts, raster, future, future.apply, RColorBrewer, geoR, ggplot2 License: GPL (>= 2.0) URL: https://github.com/r-spatial/gstat/, https://r-spatial.github.io/gstat/ Encoding: UTF-8 BugReports: https://github.com/r-spatial/gstat/issues/ NeedsCompilation: yes RoxygenNote: 6.1.1 Packaged: 2025-02-04 13:50:16 UTC; edzer Author: Edzer Pebesma [aut, cre] (), Benedikt Graeler [aut] Maintainer: Edzer Pebesma Repository: CRAN Date/Publication: 2025-02-04 16:20:02 UTC