From 9e4265522b5cf1769b401a0d622a5c2a648c48ce Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Mon, 19 May 2025 09:16:33 -0500 Subject: [PATCH 01/52] Update **GRASS GIS** to **GRASS** bc rebranding --- DESCRIPTION | 8 ++++---- R/fasterRaster.r | 4 ++-- README.md | 10 +++++----- _pkgdown.yml | 2 +- vignettes/addons.Rmd | 2 +- vignettes/fasterRaster.Rmd | 12 ++++++------ vignettes/hidden_functions.Rmd | 2 +- vignettes/projects_mapsets.Rmd | 2 +- 8 files changed, 21 insertions(+), 21 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 4ca22d3a..0fc0b038 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: fasterRaster Type: Package -Title: Faster Raster and Spatial Vector Processing Using 'GRASS GIS' +Title: Faster Raster and Spatial Vector Processing Using 'GRASS' Version: 8.4.0.7 Date: 2025-04-24 Authors@R: @@ -15,12 +15,12 @@ Authors@R: ) Maintainer: Adam B. Smith Description: Processing of large-in-memory/large-on disk rasters and spatial - vectors using 'GRASS GIS' . Most functions in - the 'terra' package are recreated. Processing of medium-sized and smaller + vectors using 'GRASS' . Most functions in the + 'terra' package are recreated. Processing of medium-sized and smaller spatial objects will nearly always be faster using 'terra' or 'sf', but for large-in-memory/large-on-disk objects, 'fasterRaster' may be faster. To use most of the functions, you must have the stand-alone version (not - the 'OSGeoW4' installer version) of 'GRASS GIS' 8.0 or higher. + the 'OSGeoW4' installer version) of 'GRASS' 8.0 or higher. Depends: R (>= 4.0.0) Imports: diff --git a/R/fasterRaster.r b/R/fasterRaster.r index a0649f5e..89a4383a 100644 --- a/R/fasterRaster.r +++ b/R/fasterRaster.r @@ -1,6 +1,6 @@ -#' "fasterRaster": Faster raster and spatial vector processing using "GRASS GIS" +#' "fasterRaster": Faster raster and spatial vector processing using "GRASS" #' -#' @description **fasterRaster**: Processing of large-in-memory/-on disk rasters and spatial vectors in using **GRASS GIS**. Most functions in the **terra** and **sf** packages are recreated. Processing of medium-sized and smaller spatial objects will nearly always be faster using **terra** or **sf**. To use most of the functions you must have the stand-alone version of **GRASS GIS** version 8.3 or higher (not the **OSGeoW4** installer version). Note that due to differences in how **GRASS**, **terra**, and **sf** were implemented, results will not always be strictly comparable between functions for the same operation. +#' @description **fasterRaster**: Processing of large-in-memory/-on disk rasters and spatial vectors in using **GRASS**. Most functions in the **terra** and **sf** packages are recreated. Processing of medium-sized and smaller spatial objects will nearly always be faster using **terra** or **sf**. To use most of the functions you must have the stand-alone version of **GRASS** version 8.3 or higher (not the **OSGeoW4** installer version). Note that due to differences in how **GRASS**, **terra**, and **sf** were implemented, results will not always be strictly comparable between functions for the same operation. #' #' ## Most useful tutorials and functions: #' * The quick-start guide to getting started with **fasterRaster**: `vignette("fasterRaster", package = "fasterRaster")`: diff --git a/README.md b/README.md index 5046512c..fe3678de 100644 --- a/README.md +++ b/README.md @@ -4,11 +4,11 @@ [![cran version](https://www.r-pkg.org/badges/version/fasterRaster)](https://cran.r-project.org/package=fasterRaster) [![R-CMD-check](https://github.com/adamlilith/fasterRaster/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/adamlilith/fasterRaster/actions/workflows/R-CMD-check.yaml) [![GPLv3 license](https://img.shields.io/badge/License-GPLv3-blue.svg)](http://perso.crans.org/besson/LICENSE.html) -Faster raster processing in `R` using `GRASS GIS` +Faster raster processing in `R` using `GRASS` fasterRaster website -`fasterRaster` is an **R** package designed specifically to handle large-in-memory/large-on-disk spatial rasters and vectors. `fasterRaster` does this using Open Source Geospatial's `GRASS GIS` +`fasterRaster` is an **R** package designed specifically to handle large-in-memory/large-on-disk spatial rasters and vectors. `fasterRaster` does this using Open Source Geospatial's `GRASS` `fasterRaster` was created with five design principles: @@ -18,7 +18,7 @@ Faster raster processing in `R` using `GRASS GIS` * **Simplicity**: `GRASS` requires users to track things like "locations" or "projects", "mapsets", and "regions" for which there is no comparable analog in the `terra` or `sf` packages. `fasterRaster` handles these behind the scenes so you don't need to. * **It's R**: The `rgrass` package provides a powerful conduit through which you can run `GRASS` modules from `R`. As such, it provides much more flexibility than `fasterRaster`. However, to use `rgrass`, you need to know what `GRASS` modules you want to use and be familiar with `GRASS` syntax. `fasterRaster` obviates this step but uses `rgrass` as a backend, allowing you to focus on `R` syntax and look up help for functions the normal way you do in `R`. You don't need to know `GRASS`! -`fasterRaster` makes heavy use of the `rgrass` package by Roger Bivand and others, the `terra` package by Robert Hijmans, the `sf` package by Edzer Pebesma, Roger Bivand, and others, and of course `GRASS GIS`, so is greatly indebted to all of these creators! +`fasterRaster` makes heavy use of the `rgrass` package by Roger Bivand and others, the `terra` package by Robert Hijmans, the `sf` package by Edzer Pebesma, Roger Bivand, and others, and of course `GRASS`, so is greatly indebted to all of these creators! # Vignettes & documentation **fasterRaster** comes with four user-oriented vignettes, plus a `pkgdown` site with full documentation: @@ -185,12 +185,12 @@ Note that the `M1.M2` and `S1.S2` increment independently. For example, if the v * Robert Hijman's [`terra`](https://cran.r-project.org/package=terra) package and Edzer Pebesma's [`sf`](https://cran.r-project.org/package=sf) package are good places to start if you are not familiar with doing GIS in `R`. * Roger Bivand's [`rgrass`](https://cran.r-project.org/package=rgrass) package allows users to call any `GRASS` function with all of its functionality, which in some cases is far beyond what is allowed by `fasterRaster`. -* The [GRASS GIS](https://grass.osgeo.org/) website is authoritative and contains the manual on all the `GRASS` functions used in this package and more. +* The [GRASS](https://grass.osgeo.org/) website is authoritative and contains the manual on all the `GRASS` functions used in this package and more. * The Wiki on [how to run `GRASS` in `R` or `R` in `GRASS`](https://grasswiki.osgeo.org/wiki/R_statistics/rgrass) will help you to become a power-user of `GRASS` in `R`. # Citation A publication is forthcoming! In the meantime, please cite: -Smith, A.B. 2024. `fasterRaster`: Faster raster processing in `R` using `GRASS GIS`. URL: https://cran.r-project.org/package=fasterRaster. +Smith, A.B. 2024. `fasterRaster`: Faster raster processing in `R` using `GRASS`. URL: https://cran.r-project.org/package=fasterRaster. ~ Adam diff --git a/_pkgdown.yml b/_pkgdown.yml index 5973d8db..4eaee501 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -1,5 +1,5 @@ home: - title: Faster Raster and Spatial Vector Processing Using 'GRASS GIS' + title: Faster Raster and Spatial Vector Processing Using 'GRASS' description: Processing of large-in-memory/large-on disk rasters. url: https://github.com/adamlilith/fasterRaster diff --git a/vignettes/addons.Rmd b/vignettes/addons.Rmd index 1e58fc2b..8ce859ad 100644 --- a/vignettes/addons.Rmd +++ b/vignettes/addons.Rmd @@ -16,7 +16,7 @@ knitr::opts_chunk$set( ) fig.path = 'man/figures/' ``` -**GRASS GIS** comes with a default set of modules (functions), but users can download and install "addon" modules to extend its capabilities. Some of the functions in **fasterRaster** rely on these addon modules. To make these functions work, you must find the folder in which addons are stored and install the desired module. +**GRASS** comes with a default set of modules (functions), but users can download and install "addon" modules to extend its capabilities. Some of the functions in **fasterRaster** rely on these addon modules. To make these functions work, you must find the folder in which addons are stored and install the desired module. 1. Installing modules: The easiest (only?) way to do this is to start **GRASS** (not in **R** through **fasterRaster**, but actually start **GRASS**), then use the `Settings` menu's `Addon extensions` option, then select `Install extensions from addons [g.extension]`. **GRASS** should display a list of addons you can install. diff --git a/vignettes/fasterRaster.Rmd b/vignettes/fasterRaster.Rmd index 0a707430..909a7333 100644 --- a/vignettes/fasterRaster.Rmd +++ b/vignettes/fasterRaster.Rmd @@ -19,7 +19,7 @@ knitr::opts_chunk$set( ) fig.path = 'man/figures/' ``` -**fasterRaster** interfaces with **GRASS GIS** to process rasters and spatial vector data. It is intended as an add-on to the **terra** and **sf** packages, and relies heavily upon them. For most rasters and vectors that are small or medium-sized in memory/disk, those packages will almost always be faster. They may also be faster for very large objects. But when they aren't, **fasterRaster** can step in. +**fasterRaster** interfaces with **GRASS** to process rasters and spatial vector data. It is intended as an add-on to the **terra** and **sf** packages, and relies heavily upon them. For most rasters and vectors that are small or medium-sized in memory/disk, those packages will almost always be faster. They may also be faster for very large objects. But when they aren't, **fasterRaster** can step in. ## Installing **fasterRaster** @@ -33,9 +33,9 @@ remotes::install_github("adamlilith/fasterRaster", dependencies = TRUE) ``` (You may need to install the `remotes` package first.) -## Installing **GRASS GIS** +## Installing **GRASS** -**fasterRaster** uses **GRASS** to do its operations. You will need to install **GRASS** using the "stand-alone" installer, available through the [GRASS GIS](https://grass.osgeo.org/). *Be sure to use the "stand-alone" installer, not the "OSGeo4W" installer!* +**fasterRaster** uses **GRASS** to do its operations. You will need to install **GRASS** using the "stand-alone" installer, available through the [GRASS](https://grass.osgeo.org/). *Be sure to use the "stand-alone" installer, not the "OSGeo4W" installer!* Optional: A few functions in **fasterRaster** require **GRASS** "addon" modules, which do not come bundled with **GRASS**. You do not need to install these addons if you do not use functions that call them. A list of functions that require addons can be seen in the "addons" vignette (in **R**, use `vignette("addons", package = "fasterRaster")`). This vignette also explains how to install addons. @@ -51,12 +51,12 @@ library(fasterRaster) To begin, you need to tell **fasterRaster** the full file path of the folder where **GRASS** is installed on your system. Where this is well depend on your operating system and the version of **GRASS** installed. Three examples below show you what this might look like, but you may need to change the file path to match your case: ```{r grassDir_examples, eval = FALSE} -grassDir <- "C:/Program Files/GRASS GIS 8.3" # Windows -grassDir <- "/Applications/GRASS-8.3.app/Contents/Resources" # Mac OS +grassDir <- "C:/Program Files/GRASS GIS 8.4" # Windows +grassDir <- "/Applications/GRASS-8.4.app/Contents/Resources" # Mac OS grassDir <- "/usr/local/grass" # Linux ``` ```{r grassDir, echo = FALSE} -grassDir <- "C:/Program Files/GRASS GIS 8.3" # Windows +grassDir <- "C:/Program Files/GRASS GIS 8.4" # Windows ``` To tell **fasterRaster** where **GRASS** is installed, use the `faster()` function: diff --git a/vignettes/hidden_functions.Rmd b/vignettes/hidden_functions.Rmd index 99c360f7..11025418 100644 --- a/vignettes/hidden_functions.Rmd +++ b/vignettes/hidden_functions.Rmd @@ -20,7 +20,7 @@ fig.path = 'man/figures/' **fasterRaster** contains a set of "private" functions that users can access using `fasterRaster:::functionName`. These functions are useful for power users and developers. Not all hidden functions are listed here. Often, a method will have a hidden function of the same name that starts with a period (e.g., `.plot()`). This "period" function is intended to be supplied the [`sources()`](https://adamlilith.github.io/fasterRaster/reference/sources.html) name of a `GRaster` or `GVector` from other functions so that the calling function does not need to spend the time creating the `GRaster` or `GVector` pointer before calling the function. "Period" functions will, though, often work on `GRaster`s or `GVector`s, though some error-checking and region re-definition is not conducted. ## General -* `.backdoor()`: Calls [faster()] and sets **GRASS** folder to "C:/Program Files/GRASS GIS X.Y", plus other options useful for development. +* `.backdoor()`: Calls [faster()] and sets **GRASS** folder to "`C:/Program Files/GRASS GIS X.Y`", plus other options useful for development. * `.fileExt()`: Get file extension * `.ls()`: Lists the `sources` of all objects in the active **GRASS** "project/location" * `.message()`: Display a warning or message if the given warning has not been displayed since **fasterRaster** was attached or if a given number of hours has passed diff --git a/vignettes/projects_mapsets.Rmd b/vignettes/projects_mapsets.Rmd index 02bfb51f..6ac73b48 100644 --- a/vignettes/projects_mapsets.Rmd +++ b/vignettes/projects_mapsets.Rmd @@ -17,7 +17,7 @@ knitr::opts_chunk$set( fig.path = 'man/figures/' ``` -**GRASS GIS** uses "projects" (which used to be called "locations" before **GRASS** 8.4), and "mapsets" to store files (rasters, vectors, etc.). **fasterRaster** uses projects and mapsets, too, but in a manner that is invisibly to most users. Thus, this tutorial is mostly of interest to developers and other curious people. +**GRASS** uses "projects" (which used to be called "locations" before **GRASS** 8.4), and "mapsets" to store files (rasters, vectors, etc.). **fasterRaster** uses projects and mapsets, too, but in a manner that is invisibly to most users. Thus, this tutorial is mostly of interest to developers and other curious people. ## **GRASS** locations/projects Upon starting, **GRASS** creates (or loads) a project, which corresponds to a folder on the user's system. Importantly, all rasters and vectors in a project must have the same coordinate reference system (CRS). Confusingly, rasters and vectors in the same **GRASS** location do not necessarily have to represent the same place on Earth (this the renaming to "project"). In general, rasters and vectors can only interact with one another if they are in the same project and mapset. **GRASS** can only have a connection to a single project at a time. From 1e0a429fa692be1d3aec6408438fc343b536e919 Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Mon, 19 May 2025 11:02:59 -0500 Subject: [PATCH 02/52] Change "module" to "tool" as per rebranding --- NEWS.md | 8 ++++---- R/00e_GVector_class.r | 2 +- R/05_GRaster_functions_by_layer.r | 8 ++++---- R/addons.r | 4 ++-- R/app.r | 4 ++-- R/as.contour.r | 2 +- R/as.lines.r | 2 +- R/as.polygons.r | 2 +- R/centroids.r | 2 +- R/cleanGeom.r | 2 +- R/clusterPoints.r | 4 ++-- R/compositeRGB.r | 2 +- R/concats.r | 2 +- R/connectors.r | 2 +- R/convHull.r | 2 +- R/delaunay.r | 2 +- R/denoise_noise.r | 2 +- R/fasterRaster.r | 4 ++-- R/fillHoles.r | 2 +- R/fillNAs.r | 2 +- R/flow.r | 6 +++--- R/flowPath.r | 2 +- R/focal.r | 8 ++++---- R/fractalRast.r | 2 +- R/fragmentation.r | 2 +- R/freq.r | 2 +- R/g.proj.r | 4 ++-- R/g.region.r | 4 ++-- R/geomorphons.r | 6 +++--- R/global.r | 2 +- R/grassHelp.r | 6 +++--- R/grid.r | 2 +- R/hexagons.r | 2 +- R/hillshade.r | 2 +- R/horizonHeight.r | 4 ++-- R/interpIDW.r | 2 +- R/interpSplines.r | 2 +- R/kernel.r | 2 +- R/makeSourceName.r | 2 +- R/mask.r | 2 +- R/merge.r | 2 +- R/princomp.r | 2 +- R/project.r | 2 +- R/rSpatialDepRast.r | 2 +- R/rasterize.r | 2 +- R/rnormRast.r | 2 +- R/runifRast.r | 2 +- R/sampleRast.r | 2 +- R/simplifyGeom.r | 2 +- R/smoothGeom.r | 2 +- R/spatSample.r | 2 +- R/streams.r | 4 ++-- R/stretch.r | 2 +- R/sun.r | 16 ++++++++-------- R/terrain.r | 2 +- R/thinLines.r | 2 +- R/trim.r | 2 +- R/vegIndex.r | 2 +- R/voronoi.r | 2 +- R/wetness.r | 2 +- R/writeRaster.r | 6 +++--- R/writeVector.r | 8 ++++---- man/examples/ex_addons.r | 2 +- man/fasterRaster.Rd | 4 ++-- vignettes/addons.Rmd | 4 ++-- vignettes/hidden_functions.Rmd | 4 ++-- vignettes/regions.Rmd | 2 +- 67 files changed, 105 insertions(+), 105 deletions(-) diff --git a/NEWS.md b/NEWS.md index 492a19cc..2e0e25cd 100644 --- a/NEWS.md +++ b/NEWS.md @@ -2,7 +2,7 @@ o Removed dependency on **rpanel** because its dependency on **tclk** did not work with **Docker** images. Replaced with version dependency on **omnibus**'s `screenRes()` function. # fasterRaster 8.4.0.6 (2025-03-26) -o `faster(debug = TRUE)` displays the **GRASS** command for each **GRASS** module called in a **fasterRaster** function. +o `faster(debug = TRUE)` displays the **GRASS** command for each **GRASS** tool called in a **fasterRaster** function. o `GVector[i]` works for cases with long `i`s. o Fixes to help pages. @@ -84,7 +84,7 @@ o `pca()` has been renamed `princomp()`. ### Enhanced functionality and new functions o `extract()` now automatically projects a `GVector` to match the CRS of a `GRaster` from which extraction is being made. o `grassGUI()` allows users to start the **GRASS** GUI. -o `grassHelp()` shows the manual page for a **GRASS** module. +o `grassHelp()` shows the manual page for a **GRASS** tool. o `layerIndex()` allows a `negate` argument to get the "opposite" indices of a `GRaster`. o `init()` assigns to `GRaster` cells the value of their coordinates, rows, columns, or values in a regular or chessboard-like pattern. o `regress()` replaces individual functions `intercept()`, `slope()`, `r2()`, and `tvalue()`. @@ -238,8 +238,8 @@ o `activeCat()`: Correct output when `names = TRUE`. o `expanse()`: Expanded list of units; correct assignation of units to **GRASS** unit format. o `extract()`: Extracting from a `GRaster` to a `lines` or `polygons` `GVector` works. o `fast()`: Fixed bug arising when reading vector saved by `writeRaster()`. -o + `global()`: Removed functions `"countNA"` and `"countNonNA"` from `global()` since **GRASS** module `r.report` can be mistaken. -o `nacell()` and `nonnacell()`: Correct (but slow~~~) reporting of `NA` and non-`NA` cells (workaround of error in **GRASS**'s `r.report` module). +o + `global()`: Removed functions `"countNA"` and `"countNonNA"` from `global()` since **GRASS** tool `r.report` can be mistaken. +o `nacell()` and `nonnacell()`: Correct (but slow~~~) reporting of `NA` and non-`NA` cells (workaround of error in **GRASS**'s `r.report` tool). # fasterRaster 8.3.0.7016 (2024-05-27) diff --git a/R/00e_GVector_class.r b/R/00e_GVector_class.r index 2ff4aef9..55470b72 100644 --- a/R/00e_GVector_class.r +++ b/R/00e_GVector_class.r @@ -54,7 +54,7 @@ methods::setValidity("GVector", #' #' @param table A `data.table`, `data.frame`, `GVector` with a table, or character. This can be `data.table(NULL)` or `data.frame(NULL)` if there is no table associated with the vector. If a character, this is interpreted as the name of the table in **GRASS**. #' -#' @param build Logical: If `TRUE` (default), build topology using **GRASS** module `v.build`. +#' @param build Logical: If `TRUE` (default), build topology using **GRASS** tool `v.build`. #' #' @param extensive Logical: If `TRUE`, do extensive topological checks using `v.build`. The default is `FALSE`. #' diff --git a/R/05_GRaster_functions_by_layer.r b/R/05_GRaster_functions_by_layer.r index d55f2c8e..36f1f9e1 100644 --- a/R/05_GRaster_functions_by_layer.r +++ b/R/05_GRaster_functions_by_layer.r @@ -383,7 +383,7 @@ setMethod( ) #' Generic trigonometry function -#' @param fx Character: Name of the function in **GRASS** module `r.series`. +#' @param fx Character: Name of the function in **GRASS** tool `r.series`. #' @param x A `GRaster`. #' @noRd .genericTrig <- function(fx, x) { @@ -409,7 +409,7 @@ setMethod( } #' Generic "arc"-trigonometry function -#' @param fx Character: Name of the function in **GRASS** module `r.series`. +#' @param fx Character: Name of the function in **GRASS** tool `r.series`. #' @param x A `GRaster`. #' @noRd .genericArcTrig <- function(fx, x) { @@ -435,7 +435,7 @@ setMethod( } #' Generic function with one input (the GRaster) -#' @param fx Character: Name of the function in **GRASS** module `r.series`. +#' @param fx Character: Name of the function in **GRASS** tool `r.series`. #' @param x A `GRaster`. #' @noRd .genericRastFx <- function(fx, x) { @@ -464,7 +464,7 @@ setMethod( } #' Generic function with two inputs (GRaster and a numeric) -#' @param fx Character: Name of the function in **GRASS** module `r.series`. +#' @param fx Character: Name of the function in **GRASS** tool `r.series`. #' @param x A `GRaster`. #' @param y A numeric. #' @noRd diff --git a/R/addons.r b/R/addons.r index 9812e358..ba6b3a1f 100644 --- a/R/addons.r +++ b/R/addons.r @@ -1,8 +1,8 @@ #' Test if addons directory exists and if an addon is installed #' -#' @description This function tests to see if the "addons" directory specified using [faster()] actually exists, and if a particular **GRASS** `addons module is available. The `addons` folder and module must exists for methods that rely on particular **GRASS** `addons` to work. See `vignette("addons", package = "fasterRaster")`. +#' @description This function tests to see if the "addons" directory specified using [faster()] actually exists, and if a particular **GRASS** `addons tool is available. The `addons` folder and tool must exists for methods that rely on particular **GRASS** `addons` to work. See `vignette("addons", package = "fasterRaster")`. #' -#' @param x Either `NULL` or a character specifying the name of a **GRASS** addons module. If `NULL`, the existence of the `addonsDir` (see [faster()]) will be tested. If the module name is provided, the existence of the folder and module will be tested. The "`/bin`" subfolder should not be included. +#' @param x Either `NULL` or a character specifying the name of a **GRASS** addons tool. If `NULL`, the existence of the `addonsDir` (see [faster()]) will be tested. If the tool name is provided, the existence of the folder and tool will be tested. The "`/bin`" subfolder should not be included. #' #' @param fail Logical: If `TRUE` (default), and the addons folder is not correctly specified, the exit the function with an error. If `FALSE`, then `NULL` will be returned with a warning. #' diff --git a/R/app.r b/R/app.r index 30eb0ca8..2edaaf57 100644 --- a/R/app.r +++ b/R/app.r @@ -24,7 +24,7 @@ #' * It must use typical arithmetic operators like `+`, `-`, `*`, `/` and/or functions that can be seen using `appFuns(TRUE)`. #' * The [names()] of the rasters do not match any of the functions in the `appFuns(TRUE)` table. Note that `x` and `y` are forbidden names :( #' -#' The help page for **GRASS** module `r.mapcalc` will be especially helpful. You can see this page using `grassHelp("r.mapcalc")`. +#' The help page for **GRASS** tool `r.mapcalc` will be especially helpful. You can see this page using `grassHelp("r.mapcalc")`. #' #' @param datatype Character: This ensures that rasters are treated as a certain type before they are operated on. This is useful when using rasters that have all integer values, which **GRASS** can assume represent integers, even if they are not supposed to. In this case, the output of operations on this raster might be an integer if otherwise not corrected. Partial matching is used, and options include: #' * `"integer"`: Force all rasters to integers by truncating their values. The output may still be of type `float` if the operation creates non-integer values. @@ -42,7 +42,7 @@ #' #' @returns A `GRaster`. #' -#' @seealso [terra::app()], [terra::lapp()], [subst()], [classify()], and especially the **GRASS** manual page for module `r.mapcalc` (see `grassHelp("r.mapcalc")`) +#' @seealso [terra::app()], [terra::lapp()], [subst()], [classify()], and especially the **GRASS** manual page for tool `r.mapcalc` (see `grassHelp("r.mapcalc")`) #' #' @example man/examples/ex_app.r #' diff --git a/R/as.contour.r b/R/as.contour.r index 30b8ca88..5f113745 100644 --- a/R/as.contour.r +++ b/R/as.contour.r @@ -9,7 +9,7 @@ #' #' @param levels Numeric vector: A numeric vector of values at which to calculate contour lines. Either `nlevels` or `levels` must be specified. #' -#' @seealso [terra::as.contour()], **GRASS** manual page for module `r.contour` (see `grassHelp("r.contour")`) +#' @seealso [terra::as.contour()], **GRASS** manual page for tool `r.contour` (see `grassHelp("r.contour")`) #' #' @returns A `GVector` representing contour lines. #' diff --git a/R/as.lines.r b/R/as.lines.r index 6c5ca388..b7698318 100644 --- a/R/as.lines.r +++ b/R/as.lines.r @@ -6,7 +6,7 @@ #' #' @returns A `GVector`. #' -#' @seealso [as.points()], [as.polygons()], [terra::as.lines()], [thinLines()], [geometry cleaning][breakPolys], and **GRASS** module `r.to.vect` +#' @seealso [as.points()], [as.polygons()], [terra::as.lines()], [thinLines()], [geometry cleaning][breakPolys], and **GRASS** tool `r.to.vect` #' #' @example man/examples/ex_asLines.r #' diff --git a/R/as.polygons.r b/R/as.polygons.r index 94ed9ab2..bc6a34fb 100644 --- a/R/as.polygons.r +++ b/R/as.polygons.r @@ -10,7 +10,7 @@ #' #' @returns A `GVector`. #' -#' @seealso [as.points()], [as.lines()], [terra::as.polygons()], [geometry cleaning][breakPolys], and **GRASS** module `r.to.vect` +#' @seealso [as.points()], [as.lines()], [terra::as.polygons()], [geometry cleaning][breakPolys], and **GRASS** tool `r.to.vect` #' #' @example man/examples/ex_asPolygons.r #' diff --git a/R/centroids.r b/R/centroids.r index b7b7a74c..6d6982cf 100644 --- a/R/centroids.r +++ b/R/centroids.r @@ -27,7 +27,7 @@ #' #' @example man/examples/ex_centroids.r #' -#' @seealso [terra::centroids()]; **GRASS** addon module `v.centerpoint`. +#' @seealso [terra::centroids()]; **GRASS** addon tool `v.centerpoint`. #' #' @aliases centroids #' @rdname centroids diff --git a/R/cleanGeom.r b/R/cleanGeom.r index cd7c2d83..eea39ecb 100644 --- a/R/cleanGeom.r +++ b/R/cleanGeom.r @@ -19,7 +19,7 @@ #' #' @param tolerance Numeric or `NULL` (default): Minimum distance in map units (degrees for unprojected, usually meters for projected) or minimum area (in meters-squared, regardless of projection). #' -#' @seealso [terra::topology()], [fillHoles()], [terra::removeDupNodes()], *Details* section in [fast()], [simplifyGeom()], [smoothGeom()], **GRASS** manual page for module `v.clean` (see `grassHelp("v.clean")`) +#' @seealso [terra::topology()], [fillHoles()], [terra::removeDupNodes()], *Details* section in [fast()], [simplifyGeom()], [smoothGeom()], **GRASS** manual page for tool `v.clean` (see `grassHelp("v.clean")`) #' #' @returns A `GVector`. #' diff --git a/R/clusterPoints.r b/R/clusterPoints.r index aea0eb67..578f22a0 100644 --- a/R/clusterPoints.r +++ b/R/clusterPoints.r @@ -4,7 +4,7 @@ #' #' @param x A "points" `GVector`. #' -#' @param method Character: Method used to identify clusters. Explanations of methods are provided in the help page for the **GRASS** module `v.cluster`, available using `grassHelp("v.cluster")`. +#' @param method Character: Method used to identify clusters. Explanations of methods are provided in the help page for the **GRASS** tool `v.cluster`, available using `grassHelp("v.cluster")`. #' * `"DBSCAN"` (default): Density-Based Spatial Clustering of Applications with Noise. #' * `"DBSCAN2"`: A modification of DBSCAN. #' * `"density"`: Cluster points by relative density. @@ -19,7 +19,7 @@ #' #' @returns A vector of integers indicating the cluster to which each point belongs. #' -#' @seealso **GRASS** manual page for module `v.cluster` (see `grassHelp("v.cluster")`) +#' @seealso **GRASS** manual page for tool `v.cluster` (see `grassHelp("v.cluster")`) #' #' @aliases clusterPoints #' @rdname clusterPoints diff --git a/R/compositeRGB.r b/R/compositeRGB.r index d753c54d..7bc746f8 100644 --- a/R/compositeRGB.r +++ b/R/compositeRGB.r @@ -14,7 +14,7 @@ #' #' @example man/examples/ex_plot.r #' -#' @seealso [plotRGB()], [terra::plotRGB()], **GRASS** manual page for module `r.composite` (see `grassHelp("r.composite")`) +#' @seealso [plotRGB()], [terra::plotRGB()], **GRASS** manual page for tool `r.composite` (see `grassHelp("r.composite")`) #' #' @aliases compositeRGB #' @rdname compositeRGB diff --git a/R/concats.r b/R/concats.r index ed7f2bc6..b3606f8d 100644 --- a/R/concats.r +++ b/R/concats.r @@ -25,7 +25,7 @@ #' #' @example man/examples/ex_GRaster_categorical.r #' -#' @seealso [combineLevels()], [terra::concats()], `vignette("GRasters", package = "fasterRaster")`, **GRASS** manual page for module `r.cross` (see `grassHelp("r.cross")`) +#' @seealso [combineLevels()], [terra::concats()], `vignette("GRasters", package = "fasterRaster")`, **GRASS** manual page for tool `r.cross` (see `grassHelp("r.cross")`) #' #' @aliases concats #' @rdname concats diff --git a/R/connectors.r b/R/connectors.r index 30d0c944..4f9a9194 100644 --- a/R/connectors.r +++ b/R/connectors.r @@ -7,7 +7,7 @@ #' #' @returns A `GVector` with a data table that has the length of each connecting line in meters. #' -#' @seealso **GRASS** manual for module `v.distance` (see `grassHelp("v.distance")`). +#' @seealso **GRASS** manual for tool `v.distance` (see `grassHelp("v.distance")`). #' #' @example man/examples/ex_connectors.r #' diff --git a/R/convHull.r b/R/convHull.r index 52b55f8b..92ce4fbf 100644 --- a/R/convHull.r +++ b/R/convHull.r @@ -7,7 +7,7 @@ #' #' @return A `GVector`. #' -#' @seealso \code{link[terra]{convHull}}, \code{link[sf]{st_convex_hull}}, module `v.hull` in **GRASS** (see `grassHelp("v.hull")`) +#' @seealso \code{link[terra]{convHull}}, \code{link[sf]{st_convex_hull}}, tool `v.hull` in **GRASS** (see `grassHelp("v.hull")`) #' #' @example man/examples/ex_convHull.r #' diff --git a/R/delaunay.r b/R/delaunay.r index 42d62aab..6502981e 100644 --- a/R/delaunay.r +++ b/R/delaunay.r @@ -6,7 +6,7 @@ #' #' @returns A `GVector`. #' -#' @seealso [terra::delaunay()], module `v.delaunay` in **GRASS** +#' @seealso [terra::delaunay()], tool `v.delaunay` in **GRASS** #' #' @example man/examples/ex_delaunay_voronoi.r #' diff --git a/R/denoise_noise.r b/R/denoise_noise.r index d7a7ef89..6b7b6322 100644 --- a/R/denoise_noise.r +++ b/R/denoise_noise.r @@ -12,7 +12,7 @@ #' #' @returns A multi-layer `GRaster` with one layer per input. #' -#' @seealso [princomp()], [stats::prcomp()], **GRASS** manual page for module `i.pca` (see `grassHelp("i.pca")`) +#' @seealso [princomp()], [stats::prcomp()], **GRASS** manual page for tool `i.pca` (see `grassHelp("i.pca")`) #' #' @example man/examples/ex_denoise_noise.r #' diff --git a/R/fasterRaster.r b/R/fasterRaster.r index 89a4383a..cae8ef50 100644 --- a/R/fasterRaster.r +++ b/R/fasterRaster.r @@ -11,7 +11,7 @@ #' * [fast()]: Convert a `SpatRaster`, `SpatVector`, or `sf` vector to **fasterRaster**'s raster format (`GRaster`s) or vector format (`GVector`s), or load one from a file #' * [rast()], [vect()], and [st_as_sf()]: Convert `GRaster`s and `GVector`s to `SpatRaster`s, `SpatVector`s, or `sf` vectors #' * [writeRaster()] and [writeVector()]: Save `GRaster`s or `GVector`s to disk -#' * [addons()]: Test if the `addons` directory is correct and if a particular addon **GRASS** module is installed. +#' * [addons()]: Test if the `addons` directory is correct and if a particular addon **GRASS** tool is installed. #' #' ## Properties of `GRasters` #' * [crs()]: Coordinate reference system @@ -286,7 +286,7 @@ #' * [compareGeom()]: Determine if geographic metadata is same between `GRaster`s and/or `GVector`s #' * [dropRows()]: Remove rows from a `data.frame` or `data.table` #' * [grassGUI()]: Start the **GRASS** GUI (not recommended for most users!!!) -#' * [grassHelp()]: Open the help page for a **GRASS** module. +#' * [grassHelp()]: Open the help page for a **GRASS** tool. #' * [grassInfo()]: **GRASS** version and citation #' * [grassStarted()]: Has a connection **GRASS** been made within the current **R** session? #' * [mow()]: Remove unused rasters and vectors from the **GRASS** cache diff --git a/R/fillHoles.r b/R/fillHoles.r index 54c9dcc5..8d893fbd 100644 --- a/R/fillHoles.r +++ b/R/fillHoles.r @@ -10,7 +10,7 @@ #' #' @example man/examples/ex_GVector.r #' -#' @seealso [terra::fillHoles()], **GRASS** manual page for module `v.fill.holes` (see `grassHelp("v.fill.holes")`) +#' @seealso [terra::fillHoles()], **GRASS** manual page for tool `v.fill.holes` (see `grassHelp("v.fill.holes")`) #' #' @aliases fillHoles #' @rdname fillHoles diff --git a/R/fillNAs.r b/R/fillNAs.r index c5d2f1a9..71269423 100644 --- a/R/fillNAs.r +++ b/R/fillNAs.r @@ -18,7 +18,7 @@ #' #' @example man/examples/ex_fillNAs.r #' -#' @seealso [terra::interpNear()], **GRASS** module `r.fillnulls` (see `grassHelp("r.fillnulls")`) +#' @seealso [terra::interpNear()], **GRASS** tool `r.fillnulls` (see `grassHelp("r.fillnulls")`) #' #' @aliases fillNAs #' @rdname fillNAs diff --git a/R/flow.r b/R/flow.r index e3c347a2..9120d01a 100644 --- a/R/flow.r +++ b/R/flow.r @@ -7,7 +7,7 @@ #' * Flooded areas; and/or #' * Topographic convergence (log of flow accumulation divided by local slope). #' -#' More details about the computations can be found at the help page for the **GRASS** module `r.terraflow`] (see `grassHelp("r.terraflow")`) +#' More details about the computations can be found at the help page for the **GRASS** tool `r.terraflow`] (see `grassHelp("r.terraflow")`) #' #' @param x A `GRaster` with a single layer, typically representing elevation. #' @@ -23,9 +23,9 @@ #' * `"TCI"`: Topographic convergence index #' * `"*"`: All of the above #' -#' @seealso [flowPath()], [streams()], the **GRASS** module `r.terraflow` (see `grassHelp("r.terraflow")`) +#' @seealso [flowPath()], [streams()], the **GRASS** tool `r.terraflow` (see `grassHelp("r.terraflow")`) #' -#' @param scratchDir Character or `NULL` (default): Directory in which to store temporary files. The **GRASS** module `r.terraflow` makes a lot of temporary files. If this is `NULL`, then a temporary folder in the user's working directory will be used (see [getwd()]). +#' @param scratchDir Character or `NULL` (default): Directory in which to store temporary files. The **GRASS** tool `r.terraflow` makes a lot of temporary files. If this is `NULL`, then a temporary folder in the user's working directory will be used (see [getwd()]). #' #' @returns A `GRaster`. #' diff --git a/R/flowPath.r b/R/flowPath.r index b9baeb27..35da5a3a 100644 --- a/R/flowPath.r +++ b/R/flowPath.r @@ -17,7 +17,7 @@ #' #' @example man/examples/ex_flowPath.r #' -#' @seealso [flow()], [streams()], the **GRASS** module `r.drain` (see `grassHelp("r.drain")`) +#' @seealso [flow()], [streams()], the **GRASS** tool `r.drain` (see `grassHelp("r.drain")`) #' #' @aliases flowPath #' @rdname flowPath diff --git a/R/focal.r b/R/focal.r index f7af1e9e..35efa11d 100644 --- a/R/focal.r +++ b/R/focal.r @@ -16,13 +16,13 @@ #' * "`min`" or "`max`": Minimum or maximum. Should not use a weights matrix. #' * "`range`": Difference between the maximum and minimum. Should not use a weights matrix. #' * "`sd`": Sample standard deviation. NB: This is the same as the [stats::sd()] function. -#' * "`sdpop`": Population standard deviation. NB: This is the same as the function "stddev" in the **GRASS** module `r.neighbors`. +#' * "`sdpop`": Population standard deviation. NB: This is the same as the function "stddev" in the **GRASS** tool `r.neighbors`. #' * "`sum`": Sum of non-`NA`` cells. #' * "`count`": Number of non-`NA cells. Should not use a weights matrix. #' * "`var`": Sample variance. NB: This is the same as the [stats::var()] function. -#' * "`varpop`": Population variance. NB: This is the same as the function "variance" in the **GRASS** module `r.neighbors`. +#' * "`varpop`": Population variance. NB: This is the same as the function "variance" in the **GRASS** tool `r.neighbors`. #' * "`nunique`": Number of unique values. Should not use a weights matrix. -#' * "`interspersion`": Proportion of cells with values different from focal cell (e.g., if 6 of 8 cells have different values, then the interspersion is 6/8 = 0.75). NB: This is slightly different from how it is defined in the **GRASS** module `r.neighbors`. Should not use a weights matrix. +#' * "`interspersion`": Proportion of cells with values different from focal cell (e.g., if 6 of 8 cells have different values, then the interspersion is 6/8 = 0.75). NB: This is slightly different from how it is defined in the **GRASS** tool `r.neighbors`. Should not use a weights matrix. #' * "`quantile`": Quantile of values. The value in argument `quantile` is used to specify the quantile. #' #' The center cell value is always included in the calculations, and all calculations ignore `NA` cells (i.e., they do not count as cells in the focal neighborhood). @@ -33,7 +33,7 @@ #' #' @returns A `GRaster`. #' -#' @seealso [terra::focal()], **GRASS** manual page for module `r.neighbors` (see `grassHelp("r.neighbors")`) +#' @seealso [terra::focal()], **GRASS** manual page for tool `r.neighbors` (see `grassHelp("r.neighbors")`) #' #' @example man/examples/ex_focal.r #' diff --git a/R/fractalRast.r b/R/fractalRast.r index fc3dd5e0..946a9644 100644 --- a/R/fractalRast.r +++ b/R/fractalRast.r @@ -14,7 +14,7 @@ #' #' @example man/examples/ex_randRast.r #' -#' @seealso [rSpatialDepRast()], [rnormRast()], [runifRast()], **GRASS** manual page for module `r.surf.fractal` (see `grassHelp("r.surf.fractal")`) +#' @seealso [rSpatialDepRast()], [rnormRast()], [runifRast()], **GRASS** manual page for tool `r.surf.fractal` (see `grassHelp("r.surf.fractal")`) #' #' @aliases fractalRast #' @rdname fractalRast diff --git a/R/fragmentation.r b/R/fragmentation.r index 7675248c..e351784f 100644 --- a/R/fragmentation.r +++ b/R/fragmentation.r @@ -2,7 +2,7 @@ #' #' @description Riitters et al. (2020) propose a classification scheme for forest fragmentation (which can be applied to any habitat type). The scheme relies on calculating density (e.g., number of forested cells in a window around a focal cell) and connectivity (number of cases where neighboring cells are both forested). This function calculates these classes from a `GRaster` or `SpatRaster` in which the focal habitat type has cell values of 1, and non-focal habitat type has cell values of 0 or `NA`. #' -#' Note that by default, the `SpatRaster` and `GRaster` versions will create different results around the border of the raster. The `SpatRaster` version uses the [terra::focal()] function, which will not return an `NA` value when its window overlaps the raster border if the `na.rm` argument is `TRUE`. However, the `GRaster` version uses the **GRASS** module `r.neighbors`, which does return `NA` values in these cases. +#' Note that by default, the `SpatRaster` and `GRaster` versions will create different results around the border of the raster. The `SpatRaster` version uses the [terra::focal()] function, which will not return an `NA` value when its window overlaps the raster border if the `na.rm` argument is `TRUE`. However, the `GRaster` version uses the **GRASS** tool `r.neighbors`, which does return `NA` values in these cases. #' #' The fragmentation classes are: #' * Value provided by `none`: None (i.e., no forest; default is `NA`). diff --git a/R/freq.r b/R/freq.r index 397504db..9476bf7d 100644 --- a/R/freq.r +++ b/R/freq.r @@ -12,7 +12,7 @@ #' #' @returns A `data.frame` or a named `list` of `data.frame`s, one per layer in `x`. #' -#' @seealso [terra::freq()], module `r.stats` in **GRASS** +#' @seealso [terra::freq()], tool `r.stats` in **GRASS** #' #' @example man/examples/ex_freq.r #' diff --git a/R/g.proj.r b/R/g.proj.r index 0de0962b..cb1683b9 100644 --- a/R/g.proj.r +++ b/R/g.proj.r @@ -1,6 +1,6 @@ -#' Call GRASS `g.proj` module +#' Call GRASS `g.proj` tool #' -#' This function calls the **GRASS** module `g.region` to display information on the projection of the current **GRASS** "project". +#' This function calls the **GRASS** tool `g.region` to display information on the projection of the current **GRASS** "project". #' #' @returns Displays current projection information for the active "project/location" in **GRASS**. #' diff --git a/R/g.region.r b/R/g.region.r index cfd7633f..e046ad0d 100644 --- a/R/g.region.r +++ b/R/g.region.r @@ -1,6 +1,6 @@ -#' Call GRASS `g.region` module +#' Call GRASS `g.region` tool #' -#' This function calls the **GRASS** module `g.region` to display information on the region of the current **GRASS** "project". +#' This function calls the **GRASS** tool `g.region` to display information on the region of the current **GRASS** "project". #' #' @returns Displays current region information for the active "project/location" in **GRASS**. #' diff --git a/R/geomorphons.r b/R/geomorphons.r index c502981b..56a68e39 100644 --- a/R/geomorphons.r +++ b/R/geomorphons.r @@ -1,6 +1,6 @@ #' Identify terrain feature types #' -#' @description Geomorphons are idealized terrain types calculated from an elevator raster based on a moving window of a given size. The window is a torus (which can have an inner radius of 0, so can also be a circle), which allows it to identify geomorphons of a given size while ignoring ones larger or smaller. There are 10 basic geomorphons. Consult the the manual for **GRASS** module `r.geomorphon` using `grassHelp("r.geomorphon")` for more details and diagrams of each type of geomorphon. Geomorphon types include: +#' @description Geomorphons are idealized terrain types calculated from an elevator raster based on a moving window of a given size. The window is a torus (which can have an inner radius of 0, so can also be a circle), which allows it to identify geomorphons of a given size while ignoring ones larger or smaller. There are 10 basic geomorphons. Consult the the manual for **GRASS** tool `r.geomorphon` using `grassHelp("r.geomorphon")` for more details and diagrams of each type of geomorphon. Geomorphon types include: #' 1. Flat areas: Focal area has approximately the same elevation as surrounding areas #' 2. Pits: An area is lower than all other surrounding areas #' 3. Valley: Focal area has elevation similar to two opposing side of the window but lower than the other two opposing sides @@ -23,13 +23,13 @@ #' @param flatDist Numeric: Distance (in meters) to correct for the effect of large distances on the diminished capacity to identify "flat" geomorphons. If the distance between the focal area and a surrounding area surpasses this distance, then the effective value of `flat` will be reduced #' #' @param mode Character: Method for implementing the zenith/line-of-site search. Partial matching is used: -#' * `"1"` (default): The "original" geomorphon mode (in **GRASS** module `r.geomorphon`, the "anglev1" method) +#' * `"1"` (default): The "original" geomorphon mode (in **GRASS** tool `r.geomorphon`, the "anglev1" method) #' * `"2"`: Better handling of cases with equal zenith/nadir angles (the "anglev2" method) #' * `"2d"`: As `"2"`, but takes into account zenith/nadir distance ("anglev2_distance" method) #' #' @returns A categorical `GRaster` where each geomorphon is a category (see `vignette("GRasters", package = "fasterRaster")`). #' -#' @seealso **GRASS** manual for module `r.geomorphon` (see `grassHelp("r.geomorphon")`) +#' @seealso **GRASS** manual for tool `r.geomorphon` (see `grassHelp("r.geomorphon")`) #' #' @example man/examples/ex_geomorphons.r #' diff --git a/R/global.r b/R/global.r index b8f64b14..a58173b5 100644 --- a/R/global.r +++ b/R/global.r @@ -26,7 +26,7 @@ #' #' @returns If `x` is missing, the function returns a character vector of all accepted function names. If `x` is a `GRaster`, a data frame with the specified statistics is returned. #' -#' @seealso [terra::global()] and **GRASS** module `r.univar` +#' @seealso [terra::global()] and **GRASS** tool `r.univar` #' #' @example man/examples/ex_global.r #' diff --git a/R/grassHelp.r b/R/grassHelp.r index 91d1fcd8..07e84482 100644 --- a/R/grassHelp.r +++ b/R/grassHelp.r @@ -1,9 +1,9 @@ -#' Open the help page for a GRASS module +#' Open the help page for a GRASS tool #' -#' @description This function opens the manual page for a **GRASS** module (function) in your browser. +#' @description This function opens the manual page for a **GRASS** tool (function) in your browser. #' #' @param x Character: Any of: -#' * The name of a **GRASS** module (e.g., `"r.mapcalc"`). +#' * The name of a **GRASS** tool (e.g., `"r.mapcalc"`). #' * `"toc"`: **GRASS** manual table of contents. #' * `"index"`: Display an index of topics. #' diff --git a/R/grid.r b/R/grid.r index 9fb06c51..60fe6f73 100644 --- a/R/grid.r +++ b/R/grid.r @@ -17,7 +17,7 @@ #' #' @example man/examples/ex_grid_hexagons.r #' -#' @seealso [hexagons()], module `v.mkgrid` in **GRASS** +#' @seealso [hexagons()], tool `v.mkgrid` in **GRASS** #' #' @aliases grid #' @rdname grid diff --git a/R/hexagons.r b/R/hexagons.r index f3f67bcb..437f572d 100644 --- a/R/hexagons.r +++ b/R/hexagons.r @@ -14,7 +14,7 @@ #' #' @example man/examples/ex_grid_hexagons.r #' -#' @seealso [grid()], module `v.mkgrid` in **GRASS** +#' @seealso [grid()], tool `v.mkgrid` in **GRASS** #' #' @aliases hexagons #' @rdname hexagons diff --git a/R/hillshade.r b/R/hillshade.r index 0d0f8ffc..f26517d4 100644 --- a/R/hillshade.r +++ b/R/hillshade.r @@ -6,7 +6,7 @@ #' #' @param angle Numeric: The altitude of the sun above the horizon in degrees. Valid values are in the range \[0, 90\], and the default value is 45 (half way from the horizon to overhead). #' -#' @param direction The direction (azimuth) in which the sun is shining in degrees. Valid values are in the range 0 to 360. The default is 0, meaning the sun is at due south (180 degrees) and shining due north (0 degrees). Note that in this function, 0 corresponds to north and 180 to south, but in the **GRASS** module `r.relief`, "east orientation" is used (0 is east, 90 is north, etc.). +#' @param direction The direction (azimuth) in which the sun is shining in degrees. Valid values are in the range 0 to 360. The default is 0, meaning the sun is at due south (180 degrees) and shining due north (0 degrees). Note that in this function, 0 corresponds to north and 180 to south, but in the **GRASS** tool `r.relief`, "east orientation" is used (0 is east, 90 is north, etc.). #' #' @param zscale Numeric: Value by which to exaggerate terrain. The default is 1. Numbers greater than this will increase apparent relief, and less than this (even negative) will diminish it. #' diff --git a/R/horizonHeight.r b/R/horizonHeight.r index 7f092f9d..288e32c0 100644 --- a/R/horizonHeight.r +++ b/R/horizonHeight.r @@ -8,7 +8,7 @@ #' #' @param step Numeric integer between 0 and 360, inclusive: Angle step size (in degrees) for calculating horizon height. The direction in which horizon height is calculated is incremented from 0 to 360, with the last value excluded. #' -#' @param northIs0 Logical: If `TRUE` (default), horizon height calculated in the 0-degree direction will be facing north, and proceed clockwise So, under "north orientation", 0 is north, 90 east, 180 south, and 270 west. If `FALSE`, angles are in "east orientation", and proceed counterclockwise from east. So, east is 0, north 90, west 180, and south 270. North orientation is the default for this function in **R**, but east orientation is the default in the **GRASS** module `r.horizon`. **Note:** The [sun()] function requires aspect to be in east orientation. +#' @param northIs0 Logical: If `TRUE` (default), horizon height calculated in the 0-degree direction will be facing north, and proceed clockwise So, under "north orientation", 0 is north, 90 east, 180 south, and 270 west. If `FALSE`, angles are in "east orientation", and proceed counterclockwise from east. So, east is 0, north 90, west 180, and south 270. North orientation is the default for this function in **R**, but east orientation is the default in the **GRASS** tool `r.horizon`. **Note:** The [sun()] function requires aspect to be in east orientation. #' #' @param bufferZone Numeric >= 0 (default is 0): A buffer of the specified width will be generated around the raster before calculation of horizon angle. If the coordinate system is in longitude/latitude (e.g., WGS84 or NAD83), then this is specified in degrees. Otherwise units are map units (usually meters). #' @@ -18,7 +18,7 @@ #' #' @returns A `GRaster` with one or more layers. The layers will be named `height_`*xyz*, where *xyz* is degrees from north or from east, depending on whether north or east orientation is used. #' -#' @seealso **GRASS** manual page for module `r.horizon` (see `grassHelp("r.horizon")`) +#' @seealso **GRASS** manual page for tool `r.horizon` (see `grassHelp("r.horizon")`) #' #' @example man/examples/ex_horizonHeight.r #' diff --git a/R/interpIDW.r b/R/interpIDW.r index dc671f49..efac9bef 100644 --- a/R/interpIDW.r +++ b/R/interpIDW.r @@ -14,7 +14,7 @@ #' #' @returns A `GRaster`. #' -#' @seealso [terra::interpIDW()], [interpSplines()], [fillNAs()], **GRASS** module `v.surf.idw` (se `grassHelp("v.surf.idw")`) +#' @seealso [terra::interpIDW()], [interpSplines()], [fillNAs()], **GRASS** tool `v.surf.idw` (se `grassHelp("v.surf.idw")`) #' #' @aliases interpIDW #' @rdname interpIDW diff --git a/R/interpSplines.r b/R/interpSplines.r index 6e4b3cc5..eff72675 100644 --- a/R/interpSplines.r +++ b/R/interpSplines.r @@ -29,7 +29,7 @@ #' * `lambda` is `NULL` and `interpolate` is `FALSE`: A `data.frame` with values of `lambdas` that were assessed, plus `mean` (mean residual value) and `rms` (root mean square error). You can see the table using `attr(output_raster, "lambdas", exact = TRUE)`. #' * `lambda` is a number (`interpolate` is ignored): A `GRaster`. #' -#' @seealso [interpIDW()], [fillNAs()], **GRASS** module `v.surf.bspline` (see `grassHelp("v.surf.bspline")`) +#' @seealso [interpIDW()], [fillNAs()], **GRASS** tool `v.surf.bspline` (see `grassHelp("v.surf.bspline")`) #' #' @aliases interpSplines #' @rdname interpSplines diff --git a/R/kernel.r b/R/kernel.r index 87d9823e..b2d69a8f 100644 --- a/R/kernel.r +++ b/R/kernel.r @@ -28,7 +28,7 @@ #' #' Otherwise, if `h` is `NULL`, then the value will be arbitrarily set at 1/5th of the shorter of the distance of the x- and y-extent of the points. #' -#' @seealso **GRASS** manual page for module `v.kernel` (see `grassHelp("v.kernel")`) +#' @seealso **GRASS** manual page for tool `v.kernel` (see `grassHelp("v.kernel")`) #' #' @returns A `GRaster`. #' diff --git a/R/makeSourceName.r b/R/makeSourceName.r index 5175783b..d8c7966a 100644 --- a/R/makeSourceName.r +++ b/R/makeSourceName.r @@ -1,6 +1,6 @@ #' Make unique GRASS name for rasters, vectors, etc. #' -#' @param x Character or `NULL`: Descriptive string. **Developers, please note**: To assist with debugging, **GRASS** objects created by a **GRASS** module have the module named in this argument (with underscores). Example: "v_in_ogr" or "r_resample". +#' @param x Character or `NULL`: Descriptive string. **Developers, please note**: To assist with debugging, **GRASS** objects created by a **GRASS** tool have the tool named in this argument (with underscores). Example: "v_in_ogr" or "r_resample". #' #' @param type Character: `raster`, `raster3D`, `vector`, or `table`. #' diff --git a/R/mask.r b/R/mask.r index f6f5c330..5fcccab4 100644 --- a/R/mask.r +++ b/R/mask.r @@ -14,7 +14,7 @@ #' #' @returns A `GRaster`. #' -#' @seealso [terra::mask()], **GRASS** module `r.mask` +#' @seealso [terra::mask()], **GRASS** tool `r.mask` #' #' @example man/examples/ex_mask.r #' diff --git a/R/merge.r b/R/merge.r index c7b549a7..46fe94cf 100644 --- a/R/merge.r +++ b/R/merge.r @@ -6,7 +6,7 @@ #' #' @returns A `GRaster`. #' -#' @seealso [terra::merge()], [terra::mosaic()], and **GRASS** module `r.patch` +#' @seealso [terra::merge()], [terra::mosaic()], and **GRASS** tool `r.patch` #' #' @example man/examples/ex_merge.r #' diff --git a/R/princomp.r b/R/princomp.r index a51486f4..f9fed336 100644 --- a/R/princomp.r +++ b/R/princomp.r @@ -125,7 +125,7 @@ methods::setMethod( #' #' @returns An object of class `prcomp`. #' -#' @seealso [princomp()], [terra::princomp()], module `i.pca` in **GRASS** +#' @seealso [princomp()], [terra::princomp()], tool `i.pca` in **GRASS** #' #' @example man/examples/ex_princomp.r #' diff --git a/R/project.r b/R/project.r index 5a915acc..ab2a0d2e 100644 --- a/R/project.r +++ b/R/project.r @@ -37,7 +37,7 @@ #' #' @param verbose Logical (for projecting `GRaster`s only): If `TRUE`, display progress. Default is `FALSE`. #' -#' @details When projecting a raster, the "fallback" methods in **GRASS** module `r.import` are actually used, even though the `method` argument takes the strings specifying non-fallback methods. See the manual page for the `r.import` **GRASS** module. +#' @details When projecting a raster, the "fallback" methods in **GRASS** tool `r.import` are actually used, even though the `method` argument takes the strings specifying non-fallback methods. See the manual page for the `r.import` **GRASS** tool. #' #' @returns A `GRaster` or `GVector`. #' diff --git a/R/rSpatialDepRast.r b/R/rSpatialDepRast.r index 7e30cd39..dd409054 100644 --- a/R/rSpatialDepRast.r +++ b/R/rSpatialDepRast.r @@ -20,7 +20,7 @@ #' #' @example man/examples/ex_randRast.r #' -#' @seealso [rnormRast()], [fractalRast()], [runifRast()], **GRASS** manual page for module `r.random.surface` (see `grassHelp("r.random.surface")`) +#' @seealso [rnormRast()], [fractalRast()], [runifRast()], **GRASS** manual page for tool `r.random.surface` (see `grassHelp("r.random.surface")`) #' #' @aliases rSpatialDepRast #' @rdname rSpatialDepRast diff --git a/R/rasterize.r b/R/rasterize.r index f6489792..5710b17d 100644 --- a/R/rasterize.r +++ b/R/rasterize.r @@ -16,7 +16,7 @@ #' #' @returns A `GRaster`. #' -#' @seealso [terra::rasterize()], **GRASS** module `v.to.rast` (see `grassHelp("v.to.rast")`) +#' @seealso [terra::rasterize()], **GRASS** tool `v.to.rast` (see `grassHelp("v.to.rast")`) #' #' @example man/examples/ex_rasterize.r #' diff --git a/R/rnormRast.r b/R/rnormRast.r index d2e76aed..a34b6def 100644 --- a/R/rnormRast.r +++ b/R/rnormRast.r @@ -14,7 +14,7 @@ #' #' @example man/examples/ex_randRast.r #' -#' @seealso [rSpatialDepRast()], [fractalRast()], [runifRast()], **GRASS** manual page for module `r.random.surface` (see `grassHelp("r.random.surface")`) +#' @seealso [rSpatialDepRast()], [fractalRast()], [runifRast()], **GRASS** manual page for tool `r.random.surface` (see `grassHelp("r.random.surface")`) #' #' @aliases rnormRast #' @rdname rnormRast diff --git a/R/runifRast.r b/R/runifRast.r index 5a5823f3..b5d21dac 100644 --- a/R/runifRast.r +++ b/R/runifRast.r @@ -14,7 +14,7 @@ #' #' @example man/examples/ex_randRast.r #' -#' @seealso [rnormRast()], [rSpatialDepRast()], [fractalRast()], **GRASS** manual page for module `r.random.surface` (see `grassHelp("r.random.surface")`) +#' @seealso [rnormRast()], [rSpatialDepRast()], [fractalRast()], **GRASS** manual page for tool `r.random.surface` (see `grassHelp("r.random.surface")`) #' #' @aliases runifRast #' @rdname runifRast diff --git a/R/sampleRast.r b/R/sampleRast.r index f16d319e..618c50d3 100644 --- a/R/sampleRast.r +++ b/R/sampleRast.r @@ -18,7 +18,7 @@ #' #' @returns A `GRaster`. #' -#' @seealso [spatSample()]; [terra::spatSample()], module `r.random` in **GRASS** +#' @seealso [spatSample()]; [terra::spatSample()], tool `r.random` in **GRASS** #' #' @example man/examples/ex_sampleRast_spatSample.r #' diff --git a/R/simplifyGeom.r b/R/simplifyGeom.r index e1c1b396..921318cd 100644 --- a/R/simplifyGeom.r +++ b/R/simplifyGeom.r @@ -15,7 +15,7 @@ #' #' @param prop Positive value between 0 and 1: Proportion of points that will be retained for each geometry when the Douglas-Peucker algorithm with reduction is applied (ignored otherwise). Default is 0.5 (retain 50% of vertices). #' -#' @seealso [smoothGeom()], [geometry cleaning][breakPolys], [terra::simplifyGeom()], **GRASS** manual page for module `v.generalize` (see `grassHelp("v.generalize")`) +#' @seealso [smoothGeom()], [geometry cleaning][breakPolys], [terra::simplifyGeom()], **GRASS** manual page for tool `v.generalize` (see `grassHelp("v.generalize")`) #' #' @returns A `GVector`. #' diff --git a/R/smoothGeom.r b/R/smoothGeom.r index b1baeac1..e830fd33 100644 --- a/R/smoothGeom.r +++ b/R/smoothGeom.r @@ -13,7 +13,7 @@ #' #' @param angle Numeric > 0: Maximum angle for the Hermite algorithm. Default is 3. #' -#' @seealso [simplifyGeom()], [terra::simplifyGeom()], [geometry cleaning][breakPolys], **GRASS** manual page for module `v.generalize` (see `grassHelp("v.generalize")`) +#' @seealso [simplifyGeom()], [terra::simplifyGeom()], [geometry cleaning][breakPolys], **GRASS** manual page for tool `v.generalize` (see `grassHelp("v.generalize")`) #' #' @returns A `GVector`. #' diff --git a/R/spatSample.r b/R/spatSample.r index 3bd1ff5d..dc66f7b4 100644 --- a/R/spatSample.r +++ b/R/spatSample.r @@ -26,7 +26,7 @@ #' #' @returns A `data.frame`, `data.table`, or `GVector`. #' -#' @seealso [sampleRast()], [terra::spatSample()], module `v.random` in **GRASS** +#' @seealso [sampleRast()], [terra::spatSample()], tool `v.random` in **GRASS** #' #' @example man/examples/ex_sampleRast_spatSample.r #' diff --git a/R/streams.r b/R/streams.r index 4e2dd226..5279183d 100644 --- a/R/streams.r +++ b/R/streams.r @@ -1,6 +1,6 @@ #' Create stream network #' -#' @description This function estimates the course of streams and rivers from an elevation raster. It is based on the **GRASS** module `r.stream.extract`, where more details can be found (see `grassHelp("r.stream.extract")`) +#' @description This function estimates the course of streams and rivers from an elevation raster. It is based on the **GRASS** tool `r.stream.extract`, where more details can be found (see `grassHelp("r.stream.extract")`) #' #' @param x A `GRaster` representing elevation. #' @@ -20,7 +20,7 @@ #' #' @example man/examples/ex_streams.r #' -#' @seealso [flow()], [flowPath()], **GRASS** manual for module `r.stream.extract` (see `grassHelp("r.stream.extract")`) +#' @seealso [flow()], [flowPath()], **GRASS** manual for tool `r.stream.extract` (see `grassHelp("r.stream.extract")`) #' #' @aliases streams #' @rdname streams diff --git a/R/stretch.r b/R/stretch.r index 2e361107..425687e2 100644 --- a/R/stretch.r +++ b/R/stretch.r @@ -12,7 +12,7 @@ #' #' @returns A `GRaster`. #' -#' @seealso [terra::stretch()] and module `r.rescale` in **GRASS** (not used on this function) +#' @seealso [terra::stretch()] and tool `r.rescale` in **GRASS** (not used on this function) #' #' @example man/examples/ex_stretch.r #' diff --git a/R/sun.r b/R/sun.r index b8de7b3c..32381211 100644 --- a/R/sun.r +++ b/R/sun.r @@ -1,6 +1,6 @@ #' Solar radiance and irradiance #' -#' The `sun()` function calculates beam (direct), diffuse and ground reflected solar irradiation for a given day and set of topographic and atmospheric conditions. The function relies on the **GRASS** module `r.sun`, the manual page for which contains a detailed explanation (see `grassHelp("r.sun")`) +#' The `sun()` function calculates beam (direct), diffuse and ground reflected solar irradiation for a given day and set of topographic and atmospheric conditions. The function relies on the **GRASS** tool `r.sun`, the manual page for which contains a detailed explanation (see `grassHelp("r.sun")`) #' #' @param elevation A `GRaster` with values representing elevation (typically in meters). #' @@ -18,7 +18,7 @@ #' #' @param albedo A `GRaster` or a numeric value: This is either a raster with values of ground albedo or a numeric value (in which case albedo is assumed to be the same everywhere). Albedo is unit-less, and the default value is 0.2. #' -#' @param linke A `GRaster` or a numeric value: This is either a raster with values of the Linke atmospheric turbidity coefficient or a numeric value (in which case the same value is assumed for all locations). The Linke coefficient is unit-less. The default value is 3, but see also the **GRASS** manual page for module `r.sun` (`grassHelp("r.sun")`). +#' @param linke A `GRaster` or a numeric value: This is either a raster with values of the Linke atmospheric turbidity coefficient or a numeric value (in which case the same value is assumed for all locations). The Linke coefficient is unit-less. The default value is 3, but see also the **GRASS** manual page for tool `r.sun` (`grassHelp("r.sun")`). #' #' @param day Positive integer between 1 to 365, inclusive: Day of year for which to calculate ir/radiation. Default is 1 (January 1st). #' @@ -32,17 +32,17 @@ #' #' @param npartitions Positive numeric. Number of chunks in which to read input files. Default is 1. #' -#' @param beam_rad Logical: If `TRUE` (default), generate a raster with beam irradiation with units of Wh / m^2 / day ("mode 2" of the `r.sun` **GRASS** module). +#' @param beam_rad Logical: If `TRUE` (default), generate a raster with beam irradiation with units of Wh / m^2 / day ("mode 2" of the `r.sun` **GRASS** tool). #' #' @param diff_rad Logical: If `TRUE` (default), generate a raster representing irradiation in Wh / m^2 /day #' -#' @param refl_rad Logical: If `TRUE` (default), generate a raster with ground-reflected irradiation with units of Wh / m^2 / day ("mode 2" of the `r.sun` **GRASS** module). +#' @param refl_rad Logical: If `TRUE` (default), generate a raster with ground-reflected irradiation with units of Wh / m^2 / day ("mode 2" of the `r.sun` **GRASS** tool). #' -#' @param glob_rad Logical:. If `TRUE` (default), generate a raster with total irradiance/irradiation with units of Wh / m^2 / day ("mode 2" of the `r.sun` **GRASS** module). +#' @param glob_rad Logical:. If `TRUE` (default), generate a raster with total irradiance/irradiation with units of Wh / m^2 / day ("mode 2" of the `r.sun` **GRASS** tool). #' -#' @param insol_time Logical: If `TRUE` (default), generate a raster with total insolation time in hours ("mode 2" of the `r.sun` **GRASS** module). +#' @param insol_time Logical: If `TRUE` (default), generate a raster with total insolation time in hours ("mode 2" of the `r.sun` **GRASS** tool). #' -#' @param lowMemory Logical: If `TRUE`, use the low-memory version of the `r.sun` **GRASS** module. The default is `FALSE`. +#' @param lowMemory Logical: If `TRUE`, use the low-memory version of the `r.sun` **GRASS** tool. The default is `FALSE`. #' #' @returns A raster or raster stack stack with the same extent, resolution, and coordinate reference system as `elevation`. Assuming all possible rasters are generated they represent: #' * `beam_rad`: Beam radiation (Watt-hours/m2/day) @@ -51,7 +51,7 @@ #' * `glob_rad`: Global radiation (Watt-hours/m2/day) #' * `insol_time`: Insolation duration (hours) #' -#' @seealso [terrain()], [horizonHeight()], **GRASS** manual page for module `r.sun` (see `grassHelp("r.sun")`) +#' @seealso [terrain()], [horizonHeight()], **GRASS** manual page for tool `r.sun` (see `grassHelp("r.sun")`) #' #' @example man/examples/ex_sun.r #' diff --git a/R/terrain.r b/R/terrain.r index c0b2a2cf..fb5f6f13 100644 --- a/R/terrain.r +++ b/R/terrain.r @@ -24,7 +24,7 @@ #' #' @returns A `GRaster` with one or more layers. #' -#' @seealso [terra::terrain()], [ruggedness()], [wetness()], [geomorphons()], module `r.slope.aspect` in **GRASS** +#' @seealso [terra::terrain()], [ruggedness()], [wetness()], [geomorphons()], tool `r.slope.aspect` in **GRASS** #' #' @example man/examples/ex_terrain.r #' diff --git a/R/thinLines.r b/R/thinLines.r index b31338f5..ca96a7f4 100644 --- a/R/thinLines.r +++ b/R/thinLines.r @@ -8,7 +8,7 @@ #' #' @returns A `GRaster`. #' -#' @seealso [as.lines()], **GRASS** manual page for module `r.thin` (see `grassHelp("r.thin")`) +#' @seealso [as.lines()], **GRASS** manual page for tool `r.thin` (see `grassHelp("r.thin")`) #' #' @example man/examples/ex_asLines.r #' diff --git a/R/trim.r b/R/trim.r index 358fa97b..8e1ff4c6 100644 --- a/R/trim.r +++ b/R/trim.r @@ -10,7 +10,7 @@ #' #' @returns A `GRaster`. #' -#' @seealso [terra::trim()], [extend()], and **GRASS** module `g.region` +#' @seealso [terra::trim()], [extend()], and **GRASS** tool `g.region` #' #' @example man/examples/ex_trim.r #' diff --git a/R/vegIndex.r b/R/vegIndex.r index 073ec781..ea303f25 100644 --- a/R/vegIndex.r +++ b/R/vegIndex.r @@ -21,7 +21,7 @@ #' #' @returns A `GRaster`. #' -#' @seealso **GRASS** manual page for module `i.vi` (see `grassHelp("i.vi")`) +#' @seealso **GRASS** manual page for tool `i.vi` (see `grassHelp("i.vi")`) #' #' @example man/examples/ex_vegIndex.r #' diff --git a/R/voronoi.r b/R/voronoi.r index ca08349a..1badcb84 100644 --- a/R/voronoi.r +++ b/R/voronoi.r @@ -7,7 +7,7 @@ #' #' @returns A `GVector`. #' -#' @seealso [terra::voronoi()], [sf::st_voronoi()], module `v.voronoi` in **GRASS** +#' @seealso [terra::voronoi()], [sf::st_voronoi()], tool `v.voronoi` in **GRASS** #' #' @example man/examples/ex_delaunay_voronoi.r #' diff --git a/R/wetness.r b/R/wetness.r index 3baa3ca6..eb9c84d8 100644 --- a/R/wetness.r +++ b/R/wetness.r @@ -6,7 +6,7 @@ #' #' @returns A `GRaster`. #' -#' @seealso [terrain()], [ruggedness()], [geomorphons()], **GRASS** manual for module `r.topidx` (see `grassHelp("r.topidx")`) +#' @seealso [terrain()], [ruggedness()], [geomorphons()], **GRASS** manual for tool `r.topidx` (see `grassHelp("r.topidx")`) #' #' @example man/examples/ex_ruggedness_wetness.r #' diff --git a/R/writeRaster.r b/R/writeRaster.r index 28abbbd4..809f655f 100644 --- a/R/writeRaster.r +++ b/R/writeRaster.r @@ -3,7 +3,7 @@ #' @description #' This function saves a `GRaster` to disk directly from a **GRASS** session. It is faster than using [rast()], then saving the output of that to disk (because `rast()` actually save the raster to disk, anyway). #' -#' The function will attempt to ascertain the file type to be ascertained from the file extension, but you can specify the format using the `format` argument (see entry for `...`). You can see a list of supported formats by simply using this function with no arguments, as in `writeRaster()`, or by consulting the online help page for the **GRASS** module `r.out.gdal` (see `grassHelp("r.out.gdal")`). Only the `GeoTIFF` file format is guaranteed to work for multi-layered rasters. +#' The function will attempt to ascertain the file type to be ascertained from the file extension, but you can specify the format using the `format` argument (see entry for `...`). You can see a list of supported formats by simply using this function with no arguments, as in `writeRaster()`, or by consulting the online help page for the **GRASS** tool `r.out.gdal` (see `grassHelp("r.out.gdal")`). Only the `GeoTIFF` file format is guaranteed to work for multi-layered rasters. #' #' The function will attempt to optimize the `datatype` argument, but this can take a long time. You can speed this up by setting `datatype` manually. Note that if you are saving a "stack" of `GRaster`s with different `datatype`s, the one with the highest information density will be used (e.g., low-bit integer < high-bit integer < floating-point < double-floating point). This can make rasters with lower datatypes much larger on disk. In these cases, it make be best to save rasters with similar `datatype`s together. #' @@ -45,7 +45,7 @@ #' #' @param ... Additional arguments. These can include: #' * `bigTiff`: Logical: If `TRUE`, and the file format is a GeoTIFF and would be larger than 4 GB (regardless of compression), then the file will be saved in BIGTIFF format. -#' * `format`: Character, indicating file format. This is usually ascertained from the file extension, but in case this fails, it can be stated explicitly. When using other formats, you may have to specify the `createopts` argument, too (see help page for **GRASS** module `r.out.gdal`). Two common formats include: +#' * `format`: Character, indicating file format. This is usually ascertained from the file extension, but in case this fails, it can be stated explicitly. When using other formats, you may have to specify the `createopts` argument, too (see help page for **GRASS** tool `r.out.gdal`). Two common formats include: #' * `"GTiff"` (default): GeoTIFF `filename` ends in `.tif`. #' * `"ASC"`: ASCII `filename` ends in `.asc` #' * Additional arguments to send to **GRASS** modules `r.out.gdal` and `r.out.ascii`. @@ -53,7 +53,7 @@ #' #' @returns A `GRaster` (invisibly). A raster is also saved to disk. #' -#' @seealso [terra::writeRaster()], **GRASS** module `r.out.gdal` (see `grassHelp("r.out.gdal")`) +#' @seealso [terra::writeRaster()], **GRASS** tool `r.out.gdal` (see `grassHelp("r.out.gdal")`) #' #' @example man/examples/ex_writeRaster.r #' diff --git a/R/writeVector.r b/R/writeVector.r index 2153d930..f67d8f63 100644 --- a/R/writeVector.r +++ b/R/writeVector.r @@ -2,7 +2,7 @@ #' #' @description This function saves a `GVector` to disk directly from a **GRASS** session. #' -#' By default, files will be of OGC GeoPackage format (extension "`.gpkg`"), but this can be changed with the `format` argument. You can see a list of supported formats by simply using this function with no arguments, as in `writeVector()`, or by consulting the online help page for **GRASS** module `v.out.ogr` (see `grassHelp("v.out.ogr")`). +#' By default, files will be of OGC GeoPackage format (extension "`.gpkg`"), but this can be changed with the `format` argument. You can see a list of supported formats by simply using this function with no arguments, as in `writeVector()`, or by consulting the online help page for **GRASS** tool `v.out.ogr` (see `grassHelp("v.out.ogr")`). #' #' Note that if the vector has a data table attached and at least one numeric or integer column has an `NA` or `NaN` value, the function will yield a warning like: #' ``` @@ -27,15 +27,15 @@ #' #' @param attachTable Logical: If `TRUE` (default), attach the attribute to table to the vector before saving it. If `FALSE`, the attribute table will not be attached. #' -#' @param ... Additional arguments to send to **GRASS** module `v.out.ogr` (see `grassHelp("v.out.ogr")`). +#' @param ... Additional arguments to send to **GRASS** tool `v.out.ogr` (see `grassHelp("v.out.ogr")`). #' #' @returns Invisibly returns a `GRaster` (the input, `x`). Also saves the vector to disk. #' -#' @seealso [terra::writeVector()], [sf::st_write()], **GRASS** module `v.out.ogr` (see `grassHelp("v.out.ogr")`) +#' @seealso [terra::writeVector()], [sf::st_write()], **GRASS** tool `v.out.ogr` (see `grassHelp("v.out.ogr")`) #' #' @example man/examples/ex_writeVector.r #' -#' @seealso [terra::writeVector()], the **GRASS** module manual page for `v.out.ogr` (see `grassHelp("v.out.ogr")`) +#' @seealso [terra::writeVector()], the **GRASS** tool manual page for `v.out.ogr` (see `grassHelp("v.out.ogr")`) #' #' @aliases writeVector #' @rdname writeVector diff --git a/man/examples/ex_addons.r b/man/examples/ex_addons.r index d261d32c..4d9412da 100644 --- a/man/examples/ex_addons.r +++ b/man/examples/ex_addons.r @@ -4,7 +4,7 @@ if (grassStarted()) { ao <- addons(fail = "warning") if (ao) print("Addons is folder is probably correctly specified.") -# Does this particular module exist? +# Does this particular tool exist? addon <- "v.centerpoint" exten <- addons(addon, fail = FALSE) diff --git a/man/fasterRaster.Rd b/man/fasterRaster.Rd index c0e85a21..19e0908f 100644 --- a/man/fasterRaster.Rd +++ b/man/fasterRaster.Rd @@ -4,9 +4,9 @@ \name{fasterRaster} \alias{fasterRaster-package} \alias{fasterRaster} -\title{"fasterRaster": Faster raster and spatial vector processing using "GRASS GIS"} +\title{"fasterRaster": Faster raster and spatial vector processing using "GRASS"} \description{ -\strong{fasterRaster}: Processing of large-in-memory/-on disk rasters and spatial vectors in using \strong{GRASS GIS}. Most functions in the \strong{terra} and \strong{sf} packages are recreated. Processing of medium-sized and smaller spatial objects will nearly always be faster using \strong{terra} or \strong{sf}. To use most of the functions you must have the stand-alone version of \strong{GRASS GIS} version 8.3 or higher (not the \strong{OSGeoW4} installer version). Note that due to differences in how \strong{GRASS}, \strong{terra}, and \strong{sf} were implemented, results will not always be strictly comparable between functions for the same operation. +\strong{fasterRaster}: Processing of large-in-memory/-on disk rasters and spatial vectors in using \strong{GRASS}. Most functions in the \strong{terra} and \strong{sf} packages are recreated. Processing of medium-sized and smaller spatial objects will nearly always be faster using \strong{terra} or \strong{sf}. To use most of the functions you must have the stand-alone version of \strong{GRASS} version 8.3 or higher (not the \strong{OSGeoW4} installer version). Note that due to differences in how \strong{GRASS}, \strong{terra}, and \strong{sf} were implemented, results will not always be strictly comparable between functions for the same operation. \subsection{Most useful tutorials and functions:}{ \itemize{ \item The quick-start guide to getting started with \strong{fasterRaster}: \code{vignette("fasterRaster", package = "fasterRaster")}: diff --git a/vignettes/addons.Rmd b/vignettes/addons.Rmd index 8ce859ad..24805420 100644 --- a/vignettes/addons.Rmd +++ b/vignettes/addons.Rmd @@ -16,7 +16,7 @@ knitr::opts_chunk$set( ) fig.path = 'man/figures/' ``` -**GRASS** comes with a default set of modules (functions), but users can download and install "addon" modules to extend its capabilities. Some of the functions in **fasterRaster** rely on these addon modules. To make these functions work, you must find the folder in which addons are stored and install the desired module. +**GRASS** comes with a default set of modules (functions), but users can download and install "addon" modules to extend its capabilities. Some of the functions in **fasterRaster** rely on these addon modules. To make these functions work, you must find the folder in which addons are stored and install the desired tool. 1. Installing modules: The easiest (only?) way to do this is to start **GRASS** (not in **R** through **fasterRaster**, but actually start **GRASS**), then use the `Settings` menu's `Addon extensions` option, then select `Install extensions from addons [g.extension]`. **GRASS** should display a list of addons you can install. @@ -29,7 +29,7 @@ C:/Users/your_windows_user_name/AppData/Roaming/GRASS8/addons You can set the addons folder using `faster(addonsDir = "C:/Users/your_windows_user_name/AppData/Roaming/GRASS8/addons")`. ## Validating addons -You can test to see if the `addons` folder is correct using `addons()`. You can also see if a particular addon module was installed correctly using the same function using, for example, `addons("v.centerpoint")`. +You can test to see if the `addons` folder is correct using `addons()`. You can also see if a particular addon tool was installed correctly using the same function using, for example, `addons("v.centerpoint")`. ## **fasterRaster** functions that need addons These functions must have the specified addon to work. diff --git a/vignettes/hidden_functions.Rmd b/vignettes/hidden_functions.Rmd index 11025418..8fb59dd2 100644 --- a/vignettes/hidden_functions.Rmd +++ b/vignettes/hidden_functions.Rmd @@ -64,8 +64,8 @@ fig.path = 'man/figures/' * `.locationFind()`: Find a specific **GRASS** "location" that already exists * `.locationRestore()` Reconnect **GRASS** to a previously-created **GRASS** "location" * `.locations()`: List of all available "locations" -* `.g.proj()`: Runs **GRASS** `g.proj` module to display projection of current "project" -* `.g.region()`: Runs **GRASS** `g.region` module to display region of current "project" +* `.g.proj()`: Runs **GRASS** `g.proj` tool to display projection of current "project" +* `.g.region()`: Runs **GRASS** `g.region` tool to display region of current "project" * `.mapset()`: **GRASS** "mapset" of an object or the active session ## **GRASS** "regions" diff --git a/vignettes/regions.Rmd b/vignettes/regions.Rmd index 03df0fbf..494a4779 100644 --- a/vignettes/regions.Rmd +++ b/vignettes/regions.Rmd @@ -16,7 +16,7 @@ knitr::opts_chunk$set( ) fig.path = 'man/figures/' ``` -A **GRASS** *region* is a data structure like a raster in that it is composed of a grid, but different in that "cells" in this grid do not contain values. Rather, their resolution and the extent of the region influence how rasters are imported, created, processed, and exported. In most cases, whenever a raster undergoes one of these processes using a **GRASS** module, the raster will be resampled and/or crop/extend it so that matches the region"s extent and resolution. If ignored, this can cause unintended side effects if the region's geometry doesn't match the raster being processed. +A **GRASS** *region* is a data structure like a raster in that it is composed of a grid, but different in that "cells" in this grid do not contain values. Rather, their resolution and the extent of the region influence how rasters are imported, created, processed, and exported. In most cases, whenever a raster undergoes one of these processes using a **GRASS** tool, the raster will be resampled and/or crop/extend it so that matches the region"s extent and resolution. If ignored, this can cause unintended side effects if the region's geometry doesn't match the raster being processed. Generally, most users of **fasterRaster** will not need to know how regions work because their management is handled automatically. This help page is provided to assist power users who may wish to use regions explicitly or develop their own applications based on **fasterRaster**. From bd1b376729fd954a60989c050a66c6bba116e50f Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Mon, 19 May 2025 13:15:35 -0500 Subject: [PATCH 03/52] Add message re order of output --- R/subset_single_bracket.r | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/R/subset_single_bracket.r b/R/subset_single_bracket.r index f2a30e22..74496cb3 100644 --- a/R/subset_single_bracket.r +++ b/R/subset_single_bracket.r @@ -39,6 +39,16 @@ methods::setMethod( out <- x } else if (!missing(i)) { + if (nrow(x) > 0 & ((is.numeric(i) | is.integer(i)) & any(i != order(i)))) { + + .message( + msg = "subset_square_bracket", + message = +"The GVector returned by `[` (subset_single_bracket) may have the order of items in\n its data table changed from the order they appear in the index used to select features.\n For example, if you use `vector[3:1]`, the results will be as per`vector[1:3]`. If this\n message appeared after you called a function other than `[`, you can probably ignore it." + ) + + } + if (is.logical(i)) { if (length(i) < nGeoms) i <- rep(i, length.out = nGeoms) i <- which(i) @@ -46,7 +56,7 @@ methods::setMethod( if (any(i > 0L) & any(i < 0L)) stop("Cannot mix positive and negative indices.") - # negative indices + # negative indices... removing features if (all(i < 0L)) { reverseRowSelect <- TRUE @@ -56,11 +66,12 @@ methods::setMethod( removeAll <- length(i) == 0L } else { + # positive indices... keeping features reverseRowSelect <- removeAll <- FALSE } if (any(i > nGeoms) | any(i == 0L)) stop("Index out of bounds.") - i <- sort(i) + i <- sort(i) # NB MUST have this, or data table will be mis-matched to features!!!!! if (removeAll) { out <- NULL # removed all @@ -167,7 +178,8 @@ methods::setMethod( input = sources(x), output = src, type = gtype, - flags = c(.quiet(), "overwrite") + # flags = c(.quiet(), "overwrite") + flags = c(.quiet(), "overwrite", "t") ) if (gtype == "point") { @@ -236,6 +248,7 @@ methods::setMethod( # select columns if (missing(j)) { + # not removing all columns removeAllCols <- FALSE } else { From eca844b34a4e42c66b4d72c8f79bf9b5a63a5db3 Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Mon, 19 May 2025 13:16:19 -0500 Subject: [PATCH 04/52] Add example demo'ing disrespect of index order Output of `vector[i]` is same regardless of order of `i`. Included message to this effect. --- man/examples/ex_GRaster_GVector_subset_assign.r | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/man/examples/ex_GRaster_GVector_subset_assign.r b/man/examples/ex_GRaster_GVector_subset_assign.r index 4773fab2..cbba1436 100644 --- a/man/examples/ex_GRaster_GVector_subset_assign.r +++ b/man/examples/ex_GRaster_GVector_subset_assign.r @@ -68,6 +68,7 @@ rasts # example data madDypsis <- fastData("madDypsis") # vector of points +madDypsis <- vect(madDypsis) # Convert SpatVector to GVector dypsis <- fast(madDypsis) @@ -76,14 +77,20 @@ dypsis <- fast(madDypsis) dypsis$species # Returns the column -dypsis[[c("year", "species")]] # Returns a GRaster with these columns +dypsis[[c("year", "species")]] # Returns a GVector with these columns dypsis[ , c("year", "species")] # Same as above ### Subsetting GVector geometries -# Subset first three geometries -dypsis[1:3] -dypsis[1:3, "species"] +# Subset three geometries +dypsis[c(1, 4, 10)] + +# Subset three geometries and one column. Note order will always be the same +# in the output and may differ in order from terra subsetting. +dypsis[c(1, 4, 10), "species"] +dypsis[c(10, 4, 1), "species"] # fasterRaster: Same order as previous. +madDypsis[c(1, 4, 10), "species"] +madDypsis[c(10, 4, 1), "species"] # terra: different order as previous. # Get geometries by data table condition dypsis[dypsis$species == "Dypsis betsimisarakae"] @@ -92,9 +99,11 @@ dypsis[dypsis$species == "Dypsis betsimisarakae"] # New column dypsis$pi <- pi +head(dypsis) # Re-assign values dypsis$pi <- "pie" +head(dypsis) # Re-assign specific values dypsis$institutionCode[dypsis$institutionCode == "MO"] <- From 605dc6772252c0ed7d0e4a1348a16b833e5c751b Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Mon, 19 May 2025 13:19:19 -0500 Subject: [PATCH 05/52] Increase display width of `data.table` columns in `GVector`s --- R/show_print.r | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/show_print.r b/R/show_print.r index c2a3744e..ac997455 100644 --- a/R/show_print.r +++ b/R/show_print.r @@ -333,7 +333,7 @@ methods::setMethod( # maximum number of fields to show maxFieldsToShow <- 8L - maxColWidth <- 15L + maxColWidth <- 17L maxDigits <- 5L debug <- faster("debug") From b6c50f7545a2362448377694fb43213647922e79 Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Mon, 19 May 2025 14:03:00 -0500 Subject: [PATCH 06/52] Update help --- R/fast.r | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/R/fast.r b/R/fast.r index a1128d24..00519d77 100644 --- a/R/fast.r +++ b/R/fast.r @@ -62,12 +62,12 @@ #' Issues can also arise due to: #' #' * **Data table-vector mismatching**: If your vector has a data table ("attribute table") associated with it, errors can occur if there are more/fewer geometries (or multi-geometries) per row in the table. If you do not really need the data table to do your analysis, you can remove it (and thus obviate this error) using `dropTable = TRUE`. -#' * **Dissolving or aggregating "invalid" geometries**: Using the `resolve` argument, you can create a topologically valid vector by either coercing all overlapping portions of polygons into their own geometries (`resolve = "disaggregate"`), or by coercing them into a single, combined geometry (`resolve = "aggregate"`). Aggregation/disaggregation will be implemented after loading the vector into **GRASS** using the settings given by `snap` and `area`. Aggregation/disaggregation will cause any associated data table to be dropped (it forces `dropTable` to be `TRUE`). The default action is to do neither aggregation nor disaggregation (`resolve = NA`). +#' * **Dissolving or aggregating "invalid" geometries**: Using the `resolve` argument, you can create a topologically valid vector by either coercing all overlapping portions of polygons into their own geometries (`resolve = "disaggregate"`), or by coercing them into a single, combined geometry (`resolve = "aggregate"`). Aggregation/disaggregation will be implemented after loading the vector into **GRASS** using the settings given by `snap` and `area`. Aggregation/disaggregation will cause any associated data table to be dropped (it forces `dropTable` to be `TRUE`). The default action is to do neither aggregation nor disaggregation (`resolve = NA`). You can also do this outside **fasterRaster** using [terra::aggregate()] or [terra::disaggregate()]. #' #' If none of these fixes work, you can try: #' -#' * **Correction outside of *fasterRaster***: Before you convert the vector into **fasterRaster**'s `GVector` format, you can also try using the [terra::makeValid()] or [sf::st_make_valid()] tools to fix issues, then use `fast()`. -#' * **Post-conversion to a `GVector`**: If you do get a vector loaded into `GVector` format, you can also use a set of **fasterRaster** vector-manipulation [tools][breakPolys] or [fillHoles()] to fix issues. +#' * **Correction outside of *fasterRaster***: Before you convert the vector into **fasterRaster**'s `GVector` format, you can also try using the [terra::makeValid()] or [sf::st_make_valid()] tools to fix issues, then use `fast()`. You can also use [terra::aggregate()] or [terra::disaggregate()] to combine/split problematic geometries. +#' * **Post-load correction**: If you do get a vector loaded into `GVector` format, you can also use a set of **fasterRaster** vector-manipulation [tools][breakPolys] or [fillHoles()] to fix issues. #' #' @seealso \code{\link[rgrass]{read_RAST}} and \code{\link[rgrass]{read_VECT}}, [vector cleaning][breakPolys], [fillHoles()], plus **GRASS** modules `v.in.ogr` (see `grassHelp("v.in.ogr")`) and `r.import` (`grassHelp("r.import")`) #' From 4a1840b74da0f3b7f81ae41d1c6f766d481b5591 Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Mon, 19 May 2025 14:03:35 -0500 Subject: [PATCH 07/52] Change "module" to "tool" as per new **GRASS** terminology --- man/add.Rd | 17 +++++++++++++---- man/addons.Rd | 6 +++--- man/app.Rd | 4 ++-- man/as.contour.Rd | 2 +- man/as.lines.Rd | 2 +- man/as.polygons.Rd | 2 +- man/breakPolys.Rd | 2 +- man/centroids.Rd | 2 +- man/clusterPoints.Rd | 4 ++-- man/compositeRGB.Rd | 2 +- man/concats.Rd | 2 +- man/connectors.Rd | 2 +- man/convHull.Rd | 2 +- man/delaunay.Rd | 2 +- man/denoise.Rd | 2 +- man/dot-g.proj.Rd | 4 ++-- man/dot-g.region.Rd | 4 ++-- man/dot-makeGVector.Rd | 2 +- man/dot-makeSourceName.Rd | 2 +- man/fasterRaster.Rd | 4 ++-- man/fillHoles.Rd | 2 +- man/fillNAs.Rd | 2 +- man/flow.Rd | 6 +++--- man/flowPath.Rd | 2 +- man/focal.Rd | 8 ++++---- man/fractalRast.Rd | 2 +- man/fragmentation.Rd | 2 +- man/freq.Rd | 2 +- man/geomorphons.Rd | 6 +++--- man/global.Rd | 2 +- man/grassHelp.Rd | 6 +++--- man/grid.Rd | 2 +- man/hexagons.Rd | 2 +- man/hillshade.Rd | 2 +- man/horizonHeight.Rd | 4 ++-- man/interpIDW.Rd | 2 +- man/interpSplines.Rd | 2 +- man/kernel.Rd | 2 +- man/mask.Rd | 2 +- man/merge.Rd | 2 +- man/pcs.Rd | 2 +- man/project.Rd | 2 +- man/rSpatialDepRast.Rd | 2 +- man/rasterize.Rd | 2 +- man/replace_dollar.Rd | 17 +++++++++++++---- man/replace_double_square_brackets.Rd | 17 +++++++++++++---- man/replace_single_square_bracket.Rd | 17 +++++++++++++---- man/rnormRast.Rd | 2 +- man/runifRast.Rd | 2 +- man/sampleRast.Rd | 2 +- man/simplifyGeom.Rd | 2 +- man/smoothGeom.Rd | 2 +- man/spatSample.Rd | 2 +- man/streams.Rd | 4 ++-- man/stretch.Rd | 2 +- man/subset.Rd | 17 +++++++++++++---- man/subset_dollar.Rd | 17 +++++++++++++---- man/subset_double_square_brackets.Rd | 17 +++++++++++++---- man/subset_single_bracket.Rd | 17 +++++++++++++---- man/sun.Rd | 16 ++++++++-------- man/terrain.Rd | 2 +- man/thinLines.Rd | 2 +- man/trim.Rd | 2 +- man/vegIndex.Rd | 2 +- man/voronoi.Rd | 2 +- man/wetness.Rd | 2 +- man/writeRaster.Rd | 6 +++--- man/writeVector.Rd | 8 ++++---- 68 files changed, 194 insertions(+), 122 deletions(-) diff --git a/man/add.Rd b/man/add.Rd index 43a410e8..c539ed2a 100644 --- a/man/add.Rd +++ b/man/add.Rd @@ -88,6 +88,7 @@ rasts # example data madDypsis <- fastData("madDypsis") # vector of points +madDypsis <- vect(madDypsis) # Convert SpatVector to GVector dypsis <- fast(madDypsis) @@ -96,14 +97,20 @@ dypsis <- fast(madDypsis) dypsis$species # Returns the column -dypsis[[c("year", "species")]] # Returns a GRaster with these columns +dypsis[[c("year", "species")]] # Returns a GVector with these columns dypsis[ , c("year", "species")] # Same as above ### Subsetting GVector geometries -# Subset first three geometries -dypsis[1:3] -dypsis[1:3, "species"] +# Subset three geometries +dypsis[c(1, 4, 10)] + +# Subset three geometries and one column. Note order will always be the same +# in the output and may differ in order from terra subsetting. +dypsis[c(1, 4, 10), "species"] +dypsis[c(10, 4, 1), "species"] # fasterRaster: Same order as previous. +madDypsis[c(1, 4, 10), "species"] +madDypsis[c(10, 4, 1), "species"] # terra: different order as previous. # Get geometries by data table condition dypsis[dypsis$species == "Dypsis betsimisarakae"] @@ -112,9 +119,11 @@ dypsis[dypsis$species == "Dypsis betsimisarakae"] # New column dypsis$pi <- pi +head(dypsis) # Re-assign values dypsis$pi <- "pie" +head(dypsis) # Re-assign specific values dypsis$institutionCode[dypsis$institutionCode == "MO"] <- diff --git a/man/addons.Rd b/man/addons.Rd index 8e22ba06..4e7c4ad3 100644 --- a/man/addons.Rd +++ b/man/addons.Rd @@ -7,7 +7,7 @@ addons(x = NULL, fail = TRUE, verbose = TRUE) } \arguments{ -\item{x}{Either \code{NULL} or a character specifying the name of a \strong{GRASS} addons module. If \code{NULL}, the existence of the \code{addonsDir} (see \code{\link[=faster]{faster()}}) will be tested. If the module name is provided, the existence of the folder and module will be tested. The "\verb{/bin}" subfolder should not be included.} +\item{x}{Either \code{NULL} or a character specifying the name of a \strong{GRASS} addons tool. If \code{NULL}, the existence of the \code{addonsDir} (see \code{\link[=faster]{faster()}}) will be tested. If the tool name is provided, the existence of the folder and tool will be tested. The "\verb{/bin}" subfolder should not be included.} \item{fail}{Logical: If \code{TRUE} (default), and the addons folder is not correctly specified, the exit the function with an error. If \code{FALSE}, then \code{NULL} will be returned with a warning.} @@ -17,7 +17,7 @@ addons(x = NULL, fail = TRUE, verbose = TRUE) Logical. } \description{ -This function tests to see if the "addons" directory specified using \code{\link[=faster]{faster()}} actually exists, and if a particular \strong{GRASS} \verb{addons module is available. The }addons\verb{folder and module must exists for methods that rely on particular **GRASS**}addons\verb{to work. See}vignette("addons", package = "fasterRaster")`. +This function tests to see if the "addons" directory specified using \code{\link[=faster]{faster()}} actually exists, and if a particular \strong{GRASS} \verb{addons tool is available. The }addons\verb{folder and tool must exists for methods that rely on particular **GRASS**}addons\verb{to work. See}vignette("addons", package = "fasterRaster")`. } \examples{ if (grassStarted()) { @@ -26,7 +26,7 @@ if (grassStarted()) { ao <- addons(fail = "warning") if (ao) print("Addons is folder is probably correctly specified.") -# Does this particular module exist? +# Does this particular tool exist? addon <- "v.centerpoint" exten <- addons(addon, fail = FALSE) diff --git a/man/app.Rd b/man/app.Rd index 7660694b..db5cd7f7 100644 --- a/man/app.Rd +++ b/man/app.Rd @@ -23,7 +23,7 @@ appFuns(warn = TRUE) \item The \code{\link[=names]{names()}} of the rasters do not match any of the functions in the \code{appFuns(TRUE)} table. Note that \code{x} and \code{y} are forbidden names :( } -The help page for \strong{GRASS} module \code{r.mapcalc} will be especially helpful. You can see this page using \code{grassHelp("r.mapcalc")}.} +The help page for \strong{GRASS} tool \code{r.mapcalc} will be especially helpful. You can see this page using \code{grassHelp("r.mapcalc")}.} \item{datatype}{Character: This ensures that rasters are treated as a certain type before they are operated on. This is useful when using rasters that have all integer values, which \strong{GRASS} can assume represent integers, even if they are not supposed to. In this case, the output of operations on this raster might be an integer if otherwise not corrected. Partial matching is used, and options include: \itemize{ @@ -126,5 +126,5 @@ print(freqs) } } \seealso{ -\code{\link[terra:app]{terra::app()}}, \code{\link[terra:lapp]{terra::lapp()}}, \code{\link[=subst]{subst()}}, \code{\link[=classify]{classify()}}, and especially the \strong{GRASS} manual page for module \code{r.mapcalc} (see \code{grassHelp("r.mapcalc")}) +\code{\link[terra:app]{terra::app()}}, \code{\link[terra:lapp]{terra::lapp()}}, \code{\link[=subst]{subst()}}, \code{\link[=classify]{classify()}}, and especially the \strong{GRASS} manual page for tool \code{r.mapcalc} (see \code{grassHelp("r.mapcalc")}) } diff --git a/man/as.contour.Rd b/man/as.contour.Rd index c29bd902..22c8e3cd 100644 --- a/man/as.contour.Rd +++ b/man/as.contour.Rd @@ -41,5 +41,5 @@ plot(conts, add = TRUE) } } \seealso{ -\code{\link[terra:contour]{terra::as.contour()}}, \strong{GRASS} manual page for module \code{r.contour} (see \code{grassHelp("r.contour")}) +\code{\link[terra:contour]{terra::as.contour()}}, \strong{GRASS} manual page for tool \code{r.contour} (see \code{grassHelp("r.contour")}) } diff --git a/man/as.lines.Rd b/man/as.lines.Rd index 6df4239b..3f950431 100644 --- a/man/as.lines.Rd +++ b/man/as.lines.Rd @@ -44,5 +44,5 @@ plot(cleanLines, add = TRUE) } } \seealso{ -\code{\link[=as.points]{as.points()}}, \code{\link[=as.polygons]{as.polygons()}}, \code{\link[terra:as.lines]{terra::as.lines()}}, \code{\link[=thinLines]{thinLines()}}, \link[=breakPolys]{geometry cleaning}, and \strong{GRASS} module \code{r.to.vect} +\code{\link[=as.points]{as.points()}}, \code{\link[=as.polygons]{as.polygons()}}, \code{\link[terra:as.lines]{terra::as.lines()}}, \code{\link[=thinLines]{thinLines()}}, \link[=breakPolys]{geometry cleaning}, and \strong{GRASS} tool \code{r.to.vect} } diff --git a/man/as.polygons.Rd b/man/as.polygons.Rd index cb1dc6d9..5a250122 100644 --- a/man/as.polygons.Rd +++ b/man/as.polygons.Rd @@ -42,5 +42,5 @@ plot(rastToPolys) } } \seealso{ -\code{\link[=as.points]{as.points()}}, \code{\link[=as.lines]{as.lines()}}, \code{\link[terra:as.polygons]{terra::as.polygons()}}, \link[=breakPolys]{geometry cleaning}, and \strong{GRASS} module \code{r.to.vect} +\code{\link[=as.points]{as.points()}}, \code{\link[=as.lines]{as.lines()}}, \code{\link[terra:as.polygons]{terra::as.polygons()}}, \link[=breakPolys]{geometry cleaning}, and \strong{GRASS} tool \code{r.to.vect} } diff --git a/man/breakPolys.Rd b/man/breakPolys.Rd index ce5113fb..2881f454 100644 --- a/man/breakPolys.Rd +++ b/man/breakPolys.Rd @@ -155,5 +155,5 @@ legend("bottom", } } \seealso{ -\code{\link[terra:topology]{terra::topology()}}, \code{\link[=fillHoles]{fillHoles()}}, \code{\link[terra:topology]{terra::removeDupNodes()}}, \emph{Details} section in \code{\link[=fast]{fast()}}, \code{\link[=simplifyGeom]{simplifyGeom()}}, \code{\link[=smoothGeom]{smoothGeom()}}, \strong{GRASS} manual page for module \code{v.clean} (see \code{grassHelp("v.clean")}) +\code{\link[terra:topology]{terra::topology()}}, \code{\link[=fillHoles]{fillHoles()}}, \code{\link[terra:topology]{terra::removeDupNodes()}}, \emph{Details} section in \code{\link[=fast]{fast()}}, \code{\link[=simplifyGeom]{simplifyGeom()}}, \code{\link[=smoothGeom]{smoothGeom()}}, \strong{GRASS} manual page for tool \code{v.clean} (see \code{grassHelp("v.clean")}) } diff --git a/man/centroids.Rd b/man/centroids.Rd index bc5306d0..9b1cb601 100644 --- a/man/centroids.Rd +++ b/man/centroids.Rd @@ -124,5 +124,5 @@ legend("bottomright", } } \seealso{ -\code{\link[terra:centroids]{terra::centroids()}}; \strong{GRASS} addon module \code{v.centerpoint}. +\code{\link[terra:centroids]{terra::centroids()}}; \strong{GRASS} addon tool \code{v.centerpoint}. } diff --git a/man/clusterPoints.Rd b/man/clusterPoints.Rd index fd1c8599..d645cfcd 100644 --- a/man/clusterPoints.Rd +++ b/man/clusterPoints.Rd @@ -10,7 +10,7 @@ \arguments{ \item{x}{A "points" \code{GVector}.} -\item{method}{Character: Method used to identify clusters. Explanations of methods are provided in the help page for the \strong{GRASS} module \code{v.cluster}, available using \code{grassHelp("v.cluster")}. +\item{method}{Character: Method used to identify clusters. Explanations of methods are provided in the help page for the \strong{GRASS} tool \code{v.cluster}, available using \code{grassHelp("v.cluster")}. \itemize{ \item \code{"DBSCAN"} (default): Density-Based Spatial Clustering of Applications with Noise. \item \code{"DBSCAN2"}: A modification of DBSCAN. @@ -32,5 +32,5 @@ A vector of integers indicating the cluster to which each point belongs. \code{clusterPoints()} partitions points in a "points" \code{GVector} into clusters. } \seealso{ -\strong{GRASS} manual page for module \code{v.cluster} (see \code{grassHelp("v.cluster")}) +\strong{GRASS} manual page for tool \code{v.cluster} (see \code{grassHelp("v.cluster")}) } diff --git a/man/compositeRGB.Rd b/man/compositeRGB.Rd index 3babfa56..ced9cb26 100644 --- a/man/compositeRGB.Rd +++ b/man/compositeRGB.Rd @@ -57,5 +57,5 @@ plot(comp, col = grays) } } \seealso{ -\code{\link[=plotRGB]{plotRGB()}}, \code{\link[terra:plotRGB]{terra::plotRGB()}}, \strong{GRASS} manual page for module \code{r.composite} (see \code{grassHelp("r.composite")}) +\code{\link[=plotRGB]{plotRGB()}}, \code{\link[terra:plotRGB]{terra::plotRGB()}}, \strong{GRASS} manual page for tool \code{r.composite} (see \code{grassHelp("r.composite")}) } diff --git a/man/concats.Rd b/man/concats.Rd index 716014b2..dfeaf901 100644 --- a/man/concats.Rd +++ b/man/concats.Rd @@ -152,5 +152,5 @@ levels(combinedNA) } } \seealso{ -\code{\link[=combineLevels]{combineLevels()}}, \code{\link[terra:concats]{terra::concats()}}, \code{vignette("GRasters", package = "fasterRaster")}, \strong{GRASS} manual page for module \code{r.cross} (see \code{grassHelp("r.cross")}) +\code{\link[=combineLevels]{combineLevels()}}, \code{\link[terra:concats]{terra::concats()}}, \code{vignette("GRasters", package = "fasterRaster")}, \strong{GRASS} manual page for tool \code{r.cross} (see \code{grassHelp("r.cross")}) } diff --git a/man/connectors.Rd b/man/connectors.Rd index 3c319b28..5891670e 100644 --- a/man/connectors.Rd +++ b/man/connectors.Rd @@ -49,5 +49,5 @@ plot(consFromRivers, col = "red", add = TRUE) } } \seealso{ -\strong{GRASS} manual for module \code{v.distance} (see \code{grassHelp("v.distance")}). +\strong{GRASS} manual for tool \code{v.distance} (see \code{grassHelp("v.distance")}). } diff --git a/man/convHull.Rd b/man/convHull.Rd index 154c53e7..ae98ffa8 100644 --- a/man/convHull.Rd +++ b/man/convHull.Rd @@ -48,5 +48,5 @@ for (i in 1:n) { } } \seealso{ -\code{link[terra]{convHull}}, \code{link[sf]{st_convex_hull}}, module \code{v.hull} in \strong{GRASS} (see \code{grassHelp("v.hull")}) +\code{link[terra]{convHull}}, \code{link[sf]{st_convex_hull}}, tool \code{v.hull} in \strong{GRASS} (see \code{grassHelp("v.hull")}) } diff --git a/man/delaunay.Rd b/man/delaunay.Rd index 34798fc2..c4a15e4c 100644 --- a/man/delaunay.Rd +++ b/man/delaunay.Rd @@ -48,5 +48,5 @@ plot(rand) } } \seealso{ -\code{\link[terra:voronoi]{terra::delaunay()}}, module \code{v.delaunay} in \strong{GRASS} +\code{\link[terra:voronoi]{terra::delaunay()}}, tool \code{v.delaunay} in \strong{GRASS} } diff --git a/man/denoise.Rd b/man/denoise.Rd index 4fe5d9bb..8a3f77f4 100644 --- a/man/denoise.Rd +++ b/man/denoise.Rd @@ -59,5 +59,5 @@ plot(compare2) } } \seealso{ -\code{\link[=princomp]{princomp()}}, \code{\link[stats:prcomp]{stats::prcomp()}}, \strong{GRASS} manual page for module \code{i.pca} (see \code{grassHelp("i.pca")}) +\code{\link[=princomp]{princomp()}}, \code{\link[stats:prcomp]{stats::prcomp()}}, \strong{GRASS} manual page for tool \code{i.pca} (see \code{grassHelp("i.pca")}) } diff --git a/man/dot-g.proj.Rd b/man/dot-g.proj.Rd index cb84e943..fc72156d 100644 --- a/man/dot-g.proj.Rd +++ b/man/dot-g.proj.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/g.proj.r \name{.g.proj} \alias{.g.proj} -\title{Call GRASS \code{g.proj} module} +\title{Call GRASS \code{g.proj} tool} \usage{ .g.proj() } @@ -10,6 +10,6 @@ Displays current projection information for the active "project/location" in \strong{GRASS}. } \description{ -This function calls the \strong{GRASS} module \code{g.region} to display information on the projection of the current \strong{GRASS} "project". +This function calls the \strong{GRASS} tool \code{g.region} to display information on the projection of the current \strong{GRASS} "project". } \keyword{internal} diff --git a/man/dot-g.region.Rd b/man/dot-g.region.Rd index 4ea84c2b..526fe786 100644 --- a/man/dot-g.region.Rd +++ b/man/dot-g.region.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/g.region.r \name{.g.region} \alias{.g.region} -\title{Call GRASS \code{g.region} module} +\title{Call GRASS \code{g.region} tool} \usage{ .g.region() } @@ -10,6 +10,6 @@ Displays current region information for the active "project/location" in \strong{GRASS}. } \description{ -This function calls the \strong{GRASS} module \code{g.region} to display information on the region of the current \strong{GRASS} "project". +This function calls the \strong{GRASS} tool \code{g.region} to display information on the region of the current \strong{GRASS} "project". } \keyword{internal} diff --git a/man/dot-makeGVector.Rd b/man/dot-makeGVector.Rd index cf02c482..35df7bb4 100644 --- a/man/dot-makeGVector.Rd +++ b/man/dot-makeGVector.Rd @@ -18,7 +18,7 @@ \item{table}{A \code{data.table}, \code{data.frame}, \code{GVector} with a table, or character. This can be \code{data.table(NULL)} or \code{data.frame(NULL)} if there is no table associated with the vector. If a character, this is interpreted as the name of the table in \strong{GRASS}.} -\item{build}{Logical: If \code{TRUE} (default), build topology using \strong{GRASS} module \code{v.build}.} +\item{build}{Logical: If \code{TRUE} (default), build topology using \strong{GRASS} tool \code{v.build}.} \item{extensive}{Logical: If \code{TRUE}, do extensive topological checks using \code{v.build}. The default is \code{FALSE}.} diff --git a/man/dot-makeSourceName.Rd b/man/dot-makeSourceName.Rd index ce4ff454..ac71fac8 100644 --- a/man/dot-makeSourceName.Rd +++ b/man/dot-makeSourceName.Rd @@ -7,7 +7,7 @@ .makeSourceName(x = NULL, type = NULL, n = 1L, name = NULL) } \arguments{ -\item{x}{Character or \code{NULL}: Descriptive string. \strong{Developers, please note}: To assist with debugging, \strong{GRASS} objects created by a \strong{GRASS} module have the module named in this argument (with underscores). Example: "v_in_ogr" or "r_resample".} +\item{x}{Character or \code{NULL}: Descriptive string. \strong{Developers, please note}: To assist with debugging, \strong{GRASS} objects created by a \strong{GRASS} tool have the tool named in this argument (with underscores). Example: "v_in_ogr" or "r_resample".} \item{type}{Character: \code{raster}, \code{raster3D}, \code{vector}, or \code{table}.} diff --git a/man/fasterRaster.Rd b/man/fasterRaster.Rd index 19e0908f..9af3f182 100644 --- a/man/fasterRaster.Rd +++ b/man/fasterRaster.Rd @@ -17,7 +17,7 @@ \item \code{\link[=fast]{fast()}}: Convert a \code{SpatRaster}, \code{SpatVector}, or \code{sf} vector to \strong{fasterRaster}'s raster format (\code{GRaster}s) or vector format (\code{GVector}s), or load one from a file \item \code{\link[=rast]{rast()}}, \code{\link[=vect]{vect()}}, and \code{\link[=st_as_sf]{st_as_sf()}}: Convert \code{GRaster}s and \code{GVector}s to \code{SpatRaster}s, \code{SpatVector}s, or \code{sf} vectors \item \code{\link[=writeRaster]{writeRaster()}} and \code{\link[=writeVector]{writeVector()}}: Save \code{GRaster}s or \code{GVector}s to disk -\item \code{\link[=addons]{addons()}}: Test if the \code{addons} directory is correct and if a particular addon \strong{GRASS} module is installed. +\item \code{\link[=addons]{addons()}}: Test if the \code{addons} directory is correct and if a particular addon \strong{GRASS} tool is installed. } } @@ -343,7 +343,7 @@ Operations on \code{GRaster}s \item \code{\link[=compareGeom]{compareGeom()}}: Determine if geographic metadata is same between \code{GRaster}s and/or \code{GVector}s \item \code{\link[=dropRows]{dropRows()}}: Remove rows from a \code{data.frame} or \code{data.table} \item \code{\link[=grassGUI]{grassGUI()}}: Start the \strong{GRASS} GUI (not recommended for most users!!!) -\item \code{\link[=grassHelp]{grassHelp()}}: Open the help page for a \strong{GRASS} module. +\item \code{\link[=grassHelp]{grassHelp()}}: Open the help page for a \strong{GRASS} tool. \item \code{\link[=grassInfo]{grassInfo()}}: \strong{GRASS} version and citation \item \code{\link[=grassStarted]{grassStarted()}}: Has a connection \strong{GRASS} been made within the current \strong{R} session? \item \code{\link[=mow]{mow()}}: Remove unused rasters and vectors from the \strong{GRASS} cache diff --git a/man/fillHoles.Rd b/man/fillHoles.Rd index b4b097af..2fbd5455 100644 --- a/man/fillHoles.Rd +++ b/man/fillHoles.Rd @@ -127,5 +127,5 @@ filled <- fillHoles(holes, fail = FALSE) } } \seealso{ -\code{\link[terra:fill]{terra::fillHoles()}}, \strong{GRASS} manual page for module \code{v.fill.holes} (see \code{grassHelp("v.fill.holes")}) +\code{\link[terra:fill]{terra::fillHoles()}}, \strong{GRASS} manual page for tool \code{v.fill.holes} (see \code{grassHelp("v.fill.holes")}) } diff --git a/man/fillNAs.Rd b/man/fillNAs.Rd index b2ddb748..e5346d85 100644 --- a/man/fillNAs.Rd +++ b/man/fillNAs.Rd @@ -71,5 +71,5 @@ plot(maps) } } \seealso{ -\code{\link[terra:interpNear]{terra::interpNear()}}, \strong{GRASS} module \code{r.fillnulls} (see \code{grassHelp("r.fillnulls")}) +\code{\link[terra:interpNear]{terra::interpNear()}}, \strong{GRASS} tool \code{r.fillnulls} (see \code{grassHelp("r.fillnulls")}) } diff --git a/man/flow.Rd b/man/flow.Rd index 1ed5194b..d8acec51 100644 --- a/man/flow.Rd +++ b/man/flow.Rd @@ -30,7 +30,7 @@ \item{dirThreshold}{Numeric (default is \code{Inf}): For the multi-direction flow model, this indicates the amount of accumulated flow above which the single-direction flow rule is used to locate the egress of water from a cell. This is the \code{d8cut} parameter in \code{r.stream.extract}.} -\item{scratchDir}{Character or \code{NULL} (default): Directory in which to store temporary files. The \strong{GRASS} module \code{r.terraflow} makes a lot of temporary files. If this is \code{NULL}, then a temporary folder in the user's working directory will be used (see \code{\link[=getwd]{getwd()}}).} +\item{scratchDir}{Character or \code{NULL} (default): Directory in which to store temporary files. The \strong{GRASS} tool \code{r.terraflow} makes a lot of temporary files. If this is \code{NULL}, then a temporary folder in the user's working directory will be used (see \code{\link[=getwd]{getwd()}}).} } \value{ A \code{GRaster}. @@ -45,7 +45,7 @@ The \code{flow()} function uses a raster representing elevation to compute other \item Topographic convergence (log of flow accumulation divided by local slope). } -More details about the computations can be found at the help page for the \strong{GRASS} module \code{r.terraflow}] (see \code{grassHelp("r.terraflow")}) +More details about the computations can be found at the help page for the \strong{GRASS} tool \code{r.terraflow}] (see \code{grassHelp("r.terraflow")}) } \examples{ if (grassStarted()) { @@ -67,5 +67,5 @@ plot(elevWater) } } \seealso{ -\code{\link[=flowPath]{flowPath()}}, \code{\link[=streams]{streams()}}, the \strong{GRASS} module \code{r.terraflow} (see \code{grassHelp("r.terraflow")}) +\code{\link[=flowPath]{flowPath()}}, \code{\link[=streams]{streams()}}, the \strong{GRASS} tool \code{r.terraflow} (see \code{grassHelp("r.terraflow")}) } diff --git a/man/flowPath.Rd b/man/flowPath.Rd index 3f7838a8..61736696 100644 --- a/man/flowPath.Rd +++ b/man/flowPath.Rd @@ -72,5 +72,5 @@ seqLines } } \seealso{ -\code{\link[=flow]{flow()}}, \code{\link[=streams]{streams()}}, the \strong{GRASS} module \code{r.drain} (see \code{grassHelp("r.drain")}) +\code{\link[=flow]{flow()}}, \code{\link[=streams]{streams()}}, the \strong{GRASS} tool \code{r.drain} (see \code{grassHelp("r.drain")}) } diff --git a/man/focal.Rd b/man/focal.Rd index ea0284b2..e2243308 100644 --- a/man/focal.Rd +++ b/man/focal.Rd @@ -25,13 +25,13 @@ \item "\code{min}" or "\code{max}": Minimum or maximum. Should not use a weights matrix. \item "\code{range}": Difference between the maximum and minimum. Should not use a weights matrix. \item "\code{sd}": Sample standard deviation. NB: This is the same as the \code{\link[stats:sd]{stats::sd()}} function. -\item "\code{sdpop}": Population standard deviation. NB: This is the same as the function "stddev" in the \strong{GRASS} module \code{r.neighbors}. +\item "\code{sdpop}": Population standard deviation. NB: This is the same as the function "stddev" in the \strong{GRASS} tool \code{r.neighbors}. \item "\code{sum}": Sum of non-`NA`` cells. \item "\code{count}": Number of non-`NA cells. Should not use a weights matrix. \item "\code{var}": Sample variance. NB: This is the same as the \code{\link[stats:cor]{stats::var()}} function. -\item "\code{varpop}": Population variance. NB: This is the same as the function "variance" in the \strong{GRASS} module \code{r.neighbors}. +\item "\code{varpop}": Population variance. NB: This is the same as the function "variance" in the \strong{GRASS} tool \code{r.neighbors}. \item "\code{nunique}": Number of unique values. Should not use a weights matrix. -\item "\code{interspersion}": Proportion of cells with values different from focal cell (e.g., if 6 of 8 cells have different values, then the interspersion is 6/8 = 0.75). NB: This is slightly different from how it is defined in the \strong{GRASS} module \code{r.neighbors}. Should not use a weights matrix. +\item "\code{interspersion}": Proportion of cells with values different from focal cell (e.g., if 6 of 8 cells have different values, then the interspersion is 6/8 = 0.75). NB: This is slightly different from how it is defined in the \strong{GRASS} tool \code{r.neighbors}. Should not use a weights matrix. \item "\code{quantile}": Quantile of values. The value in argument \code{quantile} is used to specify the quantile. } @@ -83,5 +83,5 @@ minmax(s) } } \seealso{ -\code{\link[terra:focal]{terra::focal()}}, \strong{GRASS} manual page for module \code{r.neighbors} (see \code{grassHelp("r.neighbors")}) +\code{\link[terra:focal]{terra::focal()}}, \strong{GRASS} manual page for tool \code{r.neighbors} (see \code{grassHelp("r.neighbors")}) } diff --git a/man/fractalRast.Rd b/man/fractalRast.Rd index 95d3316c..7adb9b1e 100644 --- a/man/fractalRast.Rd +++ b/man/fractalRast.Rd @@ -62,5 +62,5 @@ hist(fractal) } } \seealso{ -\code{\link[=rSpatialDepRast]{rSpatialDepRast()}}, \code{\link[=rnormRast]{rnormRast()}}, \code{\link[=runifRast]{runifRast()}}, \strong{GRASS} manual page for module \code{r.surf.fractal} (see \code{grassHelp("r.surf.fractal")}) +\code{\link[=rSpatialDepRast]{rSpatialDepRast()}}, \code{\link[=rnormRast]{rnormRast()}}, \code{\link[=runifRast]{runifRast()}}, \strong{GRASS} manual page for tool \code{r.surf.fractal} (see \code{grassHelp("r.surf.fractal")}) } diff --git a/man/fragmentation.Rd b/man/fragmentation.Rd index 38572108..ebc26a02 100644 --- a/man/fragmentation.Rd +++ b/man/fragmentation.Rd @@ -39,7 +39,7 @@ A categorical \code{SpatRaster} or \code{GRaster}. The values assigned to each c \description{ Riitters et al. (2020) propose a classification scheme for forest fragmentation (which can be applied to any habitat type). The scheme relies on calculating density (e.g., number of forested cells in a window around a focal cell) and connectivity (number of cases where neighboring cells are both forested). This function calculates these classes from a \code{GRaster} or \code{SpatRaster} in which the focal habitat type has cell values of 1, and non-focal habitat type has cell values of 0 or \code{NA}. -Note that by default, the \code{SpatRaster} and \code{GRaster} versions will create different results around the border of the raster. The \code{SpatRaster} version uses the \code{\link[terra:focal]{terra::focal()}} function, which will not return an \code{NA} value when its window overlaps the raster border if the \code{na.rm} argument is \code{TRUE}. However, the \code{GRaster} version uses the \strong{GRASS} module \code{r.neighbors}, which does return \code{NA} values in these cases. +Note that by default, the \code{SpatRaster} and \code{GRaster} versions will create different results around the border of the raster. The \code{SpatRaster} version uses the \code{\link[terra:focal]{terra::focal()}} function, which will not return an \code{NA} value when its window overlaps the raster border if the \code{na.rm} argument is \code{TRUE}. However, the \code{GRaster} version uses the \strong{GRASS} tool \code{r.neighbors}, which does return \code{NA} values in these cases. The fragmentation classes are: \itemize{ diff --git a/man/freq.Rd b/man/freq.Rd index 06e12cbd..8f51e09f 100644 --- a/man/freq.Rd +++ b/man/freq.Rd @@ -55,5 +55,5 @@ print(f) } } \seealso{ -\code{\link[terra:freq]{terra::freq()}}, module \code{r.stats} in \strong{GRASS} +\code{\link[terra:freq]{terra::freq()}}, tool \code{r.stats} in \strong{GRASS} } diff --git a/man/geomorphons.Rd b/man/geomorphons.Rd index 7dc8c6eb..6f790288 100644 --- a/man/geomorphons.Rd +++ b/man/geomorphons.Rd @@ -28,7 +28,7 @@ \item{mode}{Character: Method for implementing the zenith/line-of-site search. Partial matching is used: \itemize{ -\item \code{"1"} (default): The "original" geomorphon mode (in \strong{GRASS} module \code{r.geomorphon}, the "anglev1" method) +\item \code{"1"} (default): The "original" geomorphon mode (in \strong{GRASS} tool \code{r.geomorphon}, the "anglev1" method) \item \code{"2"}: Better handling of cases with equal zenith/nadir angles (the "anglev2" method) \item \code{"2d"}: As \code{"2"}, but takes into account zenith/nadir distance ("anglev2_distance" method) }} @@ -37,7 +37,7 @@ A categorical \code{GRaster} where each geomorphon is a category (see \code{vignette("GRasters", package = "fasterRaster")}). } \description{ -Geomorphons are idealized terrain types calculated from an elevator raster based on a moving window of a given size. The window is a torus (which can have an inner radius of 0, so can also be a circle), which allows it to identify geomorphons of a given size while ignoring ones larger or smaller. There are 10 basic geomorphons. Consult the the manual for \strong{GRASS} module \code{r.geomorphon} using \code{grassHelp("r.geomorphon")} for more details and diagrams of each type of geomorphon. Geomorphon types include: +Geomorphons are idealized terrain types calculated from an elevator raster based on a moving window of a given size. The window is a torus (which can have an inner radius of 0, so can also be a circle), which allows it to identify geomorphons of a given size while ignoring ones larger or smaller. There are 10 basic geomorphons. Consult the the manual for \strong{GRASS} tool \code{r.geomorphon} using \code{grassHelp("r.geomorphon")} for more details and diagrams of each type of geomorphon. Geomorphon types include: \enumerate{ \item Flat areas: Focal area has approximately the same elevation as surrounding areas \item Pits: An area is lower than all other surrounding areas @@ -76,5 +76,5 @@ plot(geos, col = col) } } \seealso{ -\strong{GRASS} manual for module \code{r.geomorphon} (see \code{grassHelp("r.geomorphon")}) +\strong{GRASS} manual for tool \code{r.geomorphon} (see \code{grassHelp("r.geomorphon")}) } diff --git a/man/global.Rd b/man/global.Rd index b61c4f5b..ee567d6c 100644 --- a/man/global.Rd +++ b/man/global.Rd @@ -65,5 +65,5 @@ global(elev, "*") # calculate all available functions } } \seealso{ -\code{\link[terra:global]{terra::global()}} and \strong{GRASS} module \code{r.univar} +\code{\link[terra:global]{terra::global()}} and \strong{GRASS} tool \code{r.univar} } diff --git a/man/grassHelp.Rd b/man/grassHelp.Rd index 75dfe366..db9478c5 100644 --- a/man/grassHelp.Rd +++ b/man/grassHelp.Rd @@ -2,14 +2,14 @@ % Please edit documentation in R/grassHelp.r \name{grassHelp} \alias{grassHelp} -\title{Open the help page for a GRASS module} +\title{Open the help page for a GRASS tool} \usage{ grassHelp(x, online = FALSE) } \arguments{ \item{x}{Character: Any of: \itemize{ -\item The name of a \strong{GRASS} module (e.g., \code{"r.mapcalc"}). +\item The name of a \strong{GRASS} tool (e.g., \code{"r.mapcalc"}). \item \code{"toc"}: \strong{GRASS} manual table of contents. \item \code{"index"}: Display an index of topics. }} @@ -20,7 +20,7 @@ grassHelp(x, online = FALSE) Nothing (opens a web page). } \description{ -This function opens the manual page for a \strong{GRASS} module (function) in your browser. +This function opens the manual page for a \strong{GRASS} tool (function) in your browser. } \examples{ if (grassStarted() & interactive()) { diff --git a/man/grid.Rd b/man/grid.Rd index bdd89b51..1a66a328 100644 --- a/man/grid.Rd +++ b/man/grid.Rd @@ -71,5 +71,5 @@ plot(coast, lwd = 2, add = TRUE) } } \seealso{ -\code{\link[=hexagons]{hexagons()}}, module \code{v.mkgrid} in \strong{GRASS} +\code{\link[=hexagons]{hexagons()}}, tool \code{v.mkgrid} in \strong{GRASS} } diff --git a/man/hexagons.Rd b/man/hexagons.Rd index 6a192065..d5a4ee12 100644 --- a/man/hexagons.Rd +++ b/man/hexagons.Rd @@ -67,5 +67,5 @@ plot(coast, lwd = 2, add = TRUE) } } \seealso{ -\code{\link[=grid]{grid()}}, module \code{v.mkgrid} in \strong{GRASS} +\code{\link[=grid]{grid()}}, tool \code{v.mkgrid} in \strong{GRASS} } diff --git a/man/hillshade.Rd b/man/hillshade.Rd index ade4ad40..cbbba2b1 100644 --- a/man/hillshade.Rd +++ b/man/hillshade.Rd @@ -12,7 +12,7 @@ \item{angle}{Numeric: The altitude of the sun above the horizon in degrees. Valid values are in the range [0, 90], and the default value is 45 (half way from the horizon to overhead).} -\item{direction}{The direction (azimuth) in which the sun is shining in degrees. Valid values are in the range 0 to 360. The default is 0, meaning the sun is at due south (180 degrees) and shining due north (0 degrees). Note that in this function, 0 corresponds to north and 180 to south, but in the \strong{GRASS} module \code{r.relief}, "east orientation" is used (0 is east, 90 is north, etc.).} +\item{direction}{The direction (azimuth) in which the sun is shining in degrees. Valid values are in the range 0 to 360. The default is 0, meaning the sun is at due south (180 degrees) and shining due north (0 degrees). Note that in this function, 0 corresponds to north and 180 to south, but in the \strong{GRASS} tool \code{r.relief}, "east orientation" is used (0 is east, 90 is north, etc.).} \item{zscale}{Numeric: Value by which to exaggerate terrain. The default is 1. Numbers greater than this will increase apparent relief, and less than this (even negative) will diminish it.} } diff --git a/man/horizonHeight.Rd b/man/horizonHeight.Rd index b3bfc516..aa301f24 100644 --- a/man/horizonHeight.Rd +++ b/man/horizonHeight.Rd @@ -22,7 +22,7 @@ \item{step}{Numeric integer between 0 and 360, inclusive: Angle step size (in degrees) for calculating horizon height. The direction in which horizon height is calculated is incremented from 0 to 360, with the last value excluded.} -\item{northIs0}{Logical: If \code{TRUE} (default), horizon height calculated in the 0-degree direction will be facing north, and proceed clockwise So, under "north orientation", 0 is north, 90 east, 180 south, and 270 west. If \code{FALSE}, angles are in "east orientation", and proceed counterclockwise from east. So, east is 0, north 90, west 180, and south 270. North orientation is the default for this function in \strong{R}, but east orientation is the default in the \strong{GRASS} module \code{r.horizon}. \strong{Note:} The \code{\link[=sun]{sun()}} function requires aspect to be in east orientation.} +\item{northIs0}{Logical: If \code{TRUE} (default), horizon height calculated in the 0-degree direction will be facing north, and proceed clockwise So, under "north orientation", 0 is north, 90 east, 180 south, and 270 west. If \code{FALSE}, angles are in "east orientation", and proceed counterclockwise from east. So, east is 0, north 90, west 180, and south 270. North orientation is the default for this function in \strong{R}, but east orientation is the default in the \strong{GRASS} tool \code{r.horizon}. \strong{Note:} The \code{\link[=sun]{sun()}} function requires aspect to be in east orientation.} \item{bufferZone}{Numeric >= 0 (default is 0): A buffer of the specified width will be generated around the raster before calculation of horizon angle. If the coordinate system is in longitude/latitude (e.g., WGS84 or NAD83), then this is specified in degrees. Otherwise units are map units (usually meters).} @@ -61,5 +61,5 @@ plot(hhEast) } } \seealso{ -\strong{GRASS} manual page for module \code{r.horizon} (see \code{grassHelp("r.horizon")}) +\strong{GRASS} manual page for tool \code{r.horizon} (see \code{grassHelp("r.horizon")}) } diff --git a/man/interpIDW.Rd b/man/interpIDW.Rd index 7415fc1b..86069a5d 100644 --- a/man/interpIDW.Rd +++ b/man/interpIDW.Rd @@ -25,5 +25,5 @@ A \code{GRaster}. This function interpolates values from a set of points to a raster using inverse distance weighting (IDW). } \seealso{ -\code{\link[terra:interpIDW]{terra::interpIDW()}}, \code{\link[=interpSplines]{interpSplines()}}, \code{\link[=fillNAs]{fillNAs()}}, \strong{GRASS} module \code{v.surf.idw} (se \code{grassHelp("v.surf.idw")}) +\code{\link[terra:interpIDW]{terra::interpIDW()}}, \code{\link[=interpSplines]{interpSplines()}}, \code{\link[=fillNAs]{fillNAs()}}, \strong{GRASS} tool \code{v.surf.idw} (se \code{grassHelp("v.surf.idw")}) } diff --git a/man/interpSplines.Rd b/man/interpSplines.Rd index c0214592..485b7565 100644 --- a/man/interpSplines.Rd +++ b/man/interpSplines.Rd @@ -54,5 +54,5 @@ If you receive the error, "No data within this subregion. Consider increasing sp If cross-validation takes too long, or other warnings/errors persist, you can randomly subsample \code{x} to ~100 points to get an optimum value of \code{lambda} (using \code{interpolate = FALSE}), then use this value in the same function again without cross-validation (setting \code{lambda} equal to this value and \code{interpolate = TRUE}). } \seealso{ -\code{\link[=interpIDW]{interpIDW()}}, \code{\link[=fillNAs]{fillNAs()}}, \strong{GRASS} module \code{v.surf.bspline} (see \code{grassHelp("v.surf.bspline")}) +\code{\link[=interpIDW]{interpIDW()}}, \code{\link[=fillNAs]{fillNAs()}}, \strong{GRASS} tool \code{v.surf.bspline} (see \code{grassHelp("v.surf.bspline")}) } diff --git a/man/kernel.Rd b/man/kernel.Rd index 764592d2..eb1c46d9 100644 --- a/man/kernel.Rd +++ b/man/kernel.Rd @@ -66,5 +66,5 @@ plot(dypsis, add = TRUE, pch = 1) } } \seealso{ -\strong{GRASS} manual page for module \code{v.kernel} (see \code{grassHelp("v.kernel")}) +\strong{GRASS} manual page for tool \code{v.kernel} (see \code{grassHelp("v.kernel")}) } diff --git a/man/mask.Rd b/man/mask.Rd index e683fdac..cd159acc 100644 --- a/man/mask.Rd +++ b/man/mask.Rd @@ -82,5 +82,5 @@ plot(c(elev, byRastAll)) } } \seealso{ -\code{\link[terra:mask]{terra::mask()}}, \strong{GRASS} module \code{r.mask} +\code{\link[terra:mask]{terra::mask()}}, \strong{GRASS} tool \code{r.mask} } diff --git a/man/merge.Rd b/man/merge.Rd index 24fc6e50..67a7a631 100644 --- a/man/merge.Rd +++ b/man/merge.Rd @@ -50,5 +50,5 @@ plot(antMan, main = "Antman!") } } \seealso{ -\code{\link[terra:merge]{terra::merge()}}, \code{\link[terra:mosaic]{terra::mosaic()}}, and \strong{GRASS} module \code{r.patch} +\code{\link[terra:merge]{terra::merge()}}, \code{\link[terra:mosaic]{terra::mosaic()}}, and \strong{GRASS} tool \code{r.patch} } diff --git a/man/pcs.Rd b/man/pcs.Rd index bfedd09c..f1322378 100644 --- a/man/pcs.Rd +++ b/man/pcs.Rd @@ -41,5 +41,5 @@ plot(prinComp) } } \seealso{ -\code{\link[=princomp]{princomp()}}, \code{\link[terra:princomp]{terra::princomp()}}, module \code{i.pca} in \strong{GRASS} +\code{\link[=princomp]{princomp()}}, \code{\link[terra:princomp]{terra::princomp()}}, tool \code{i.pca} in \strong{GRASS} } diff --git a/man/project.Rd b/man/project.Rd index 60d34177..b9066e1a 100644 --- a/man/project.Rd +++ b/man/project.Rd @@ -70,7 +70,7 @@ A \code{GRaster} or \code{GVector}. } } \details{ -When projecting a raster, the "fallback" methods in \strong{GRASS} module \code{r.import} are actually used, even though the \code{method} argument takes the strings specifying non-fallback methods. See the manual page for the \code{r.import} \strong{GRASS} module. +When projecting a raster, the "fallback" methods in \strong{GRASS} tool \code{r.import} are actually used, even though the \code{method} argument takes the strings specifying non-fallback methods. See the manual page for the \code{r.import} \strong{GRASS} tool. } \examples{ if (grassStarted()) { diff --git a/man/rSpatialDepRast.Rd b/man/rSpatialDepRast.Rd index 5d5b044d..9fb3d86e 100644 --- a/man/rSpatialDepRast.Rd +++ b/man/rSpatialDepRast.Rd @@ -77,5 +77,5 @@ hist(fractal) } } \seealso{ -\code{\link[=rnormRast]{rnormRast()}}, \code{\link[=fractalRast]{fractalRast()}}, \code{\link[=runifRast]{runifRast()}}, \strong{GRASS} manual page for module \code{r.random.surface} (see \code{grassHelp("r.random.surface")}) +\code{\link[=rnormRast]{rnormRast()}}, \code{\link[=fractalRast]{fractalRast()}}, \code{\link[=runifRast]{runifRast()}}, \strong{GRASS} manual page for tool \code{r.random.surface} (see \code{grassHelp("r.random.surface")}) } diff --git a/man/rasterize.Rd b/man/rasterize.Rd index 483cbd8a..c5ddae59 100644 --- a/man/rasterize.Rd +++ b/man/rasterize.Rd @@ -69,5 +69,5 @@ plot(byRiver) } } \seealso{ -\code{\link[terra:rasterize]{terra::rasterize()}}, \strong{GRASS} module \code{v.to.rast} (see \code{grassHelp("v.to.rast")}) +\code{\link[terra:rasterize]{terra::rasterize()}}, \strong{GRASS} tool \code{v.to.rast} (see \code{grassHelp("v.to.rast")}) } diff --git a/man/replace_dollar.Rd b/man/replace_dollar.Rd index 165aeb9e..8accab7a 100644 --- a/man/replace_dollar.Rd +++ b/man/replace_dollar.Rd @@ -95,6 +95,7 @@ rasts # example data madDypsis <- fastData("madDypsis") # vector of points +madDypsis <- vect(madDypsis) # Convert SpatVector to GVector dypsis <- fast(madDypsis) @@ -103,14 +104,20 @@ dypsis <- fast(madDypsis) dypsis$species # Returns the column -dypsis[[c("year", "species")]] # Returns a GRaster with these columns +dypsis[[c("year", "species")]] # Returns a GVector with these columns dypsis[ , c("year", "species")] # Same as above ### Subsetting GVector geometries -# Subset first three geometries -dypsis[1:3] -dypsis[1:3, "species"] +# Subset three geometries +dypsis[c(1, 4, 10)] + +# Subset three geometries and one column. Note order will always be the same +# in the output and may differ in order from terra subsetting. +dypsis[c(1, 4, 10), "species"] +dypsis[c(10, 4, 1), "species"] # fasterRaster: Same order as previous. +madDypsis[c(1, 4, 10), "species"] +madDypsis[c(10, 4, 1), "species"] # terra: different order as previous. # Get geometries by data table condition dypsis[dypsis$species == "Dypsis betsimisarakae"] @@ -119,9 +126,11 @@ dypsis[dypsis$species == "Dypsis betsimisarakae"] # New column dypsis$pi <- pi +head(dypsis) # Re-assign values dypsis$pi <- "pie" +head(dypsis) # Re-assign specific values dypsis$institutionCode[dypsis$institutionCode == "MO"] <- diff --git a/man/replace_double_square_brackets.Rd b/man/replace_double_square_brackets.Rd index 1b9ebff8..8ffc6b9a 100644 --- a/man/replace_double_square_brackets.Rd +++ b/man/replace_double_square_brackets.Rd @@ -89,6 +89,7 @@ rasts # example data madDypsis <- fastData("madDypsis") # vector of points +madDypsis <- vect(madDypsis) # Convert SpatVector to GVector dypsis <- fast(madDypsis) @@ -97,14 +98,20 @@ dypsis <- fast(madDypsis) dypsis$species # Returns the column -dypsis[[c("year", "species")]] # Returns a GRaster with these columns +dypsis[[c("year", "species")]] # Returns a GVector with these columns dypsis[ , c("year", "species")] # Same as above ### Subsetting GVector geometries -# Subset first three geometries -dypsis[1:3] -dypsis[1:3, "species"] +# Subset three geometries +dypsis[c(1, 4, 10)] + +# Subset three geometries and one column. Note order will always be the same +# in the output and may differ in order from terra subsetting. +dypsis[c(1, 4, 10), "species"] +dypsis[c(10, 4, 1), "species"] # fasterRaster: Same order as previous. +madDypsis[c(1, 4, 10), "species"] +madDypsis[c(10, 4, 1), "species"] # terra: different order as previous. # Get geometries by data table condition dypsis[dypsis$species == "Dypsis betsimisarakae"] @@ -113,9 +120,11 @@ dypsis[dypsis$species == "Dypsis betsimisarakae"] # New column dypsis$pi <- pi +head(dypsis) # Re-assign values dypsis$pi <- "pie" +head(dypsis) # Re-assign specific values dypsis$institutionCode[dypsis$institutionCode == "MO"] <- diff --git a/man/replace_single_square_bracket.Rd b/man/replace_single_square_bracket.Rd index 0f7410c2..545be31b 100644 --- a/man/replace_single_square_bracket.Rd +++ b/man/replace_single_square_bracket.Rd @@ -97,6 +97,7 @@ rasts # example data madDypsis <- fastData("madDypsis") # vector of points +madDypsis <- vect(madDypsis) # Convert SpatVector to GVector dypsis <- fast(madDypsis) @@ -105,14 +106,20 @@ dypsis <- fast(madDypsis) dypsis$species # Returns the column -dypsis[[c("year", "species")]] # Returns a GRaster with these columns +dypsis[[c("year", "species")]] # Returns a GVector with these columns dypsis[ , c("year", "species")] # Same as above ### Subsetting GVector geometries -# Subset first three geometries -dypsis[1:3] -dypsis[1:3, "species"] +# Subset three geometries +dypsis[c(1, 4, 10)] + +# Subset three geometries and one column. Note order will always be the same +# in the output and may differ in order from terra subsetting. +dypsis[c(1, 4, 10), "species"] +dypsis[c(10, 4, 1), "species"] # fasterRaster: Same order as previous. +madDypsis[c(1, 4, 10), "species"] +madDypsis[c(10, 4, 1), "species"] # terra: different order as previous. # Get geometries by data table condition dypsis[dypsis$species == "Dypsis betsimisarakae"] @@ -121,9 +128,11 @@ dypsis[dypsis$species == "Dypsis betsimisarakae"] # New column dypsis$pi <- pi +head(dypsis) # Re-assign values dypsis$pi <- "pie" +head(dypsis) # Re-assign specific values dypsis$institutionCode[dypsis$institutionCode == "MO"] <- diff --git a/man/rnormRast.Rd b/man/rnormRast.Rd index f6833eab..8d6ff036 100644 --- a/man/rnormRast.Rd +++ b/man/rnormRast.Rd @@ -62,5 +62,5 @@ hist(fractal) } } \seealso{ -\code{\link[=rSpatialDepRast]{rSpatialDepRast()}}, \code{\link[=fractalRast]{fractalRast()}}, \code{\link[=runifRast]{runifRast()}}, \strong{GRASS} manual page for module \code{r.random.surface} (see \code{grassHelp("r.random.surface")}) +\code{\link[=rSpatialDepRast]{rSpatialDepRast()}}, \code{\link[=fractalRast]{fractalRast()}}, \code{\link[=runifRast]{runifRast()}}, \strong{GRASS} manual page for tool \code{r.random.surface} (see \code{grassHelp("r.random.surface")}) } diff --git a/man/runifRast.Rd b/man/runifRast.Rd index 8d7d58ec..d99fc85e 100644 --- a/man/runifRast.Rd +++ b/man/runifRast.Rd @@ -62,5 +62,5 @@ hist(fractal) } } \seealso{ -\code{\link[=rnormRast]{rnormRast()}}, \code{\link[=rSpatialDepRast]{rSpatialDepRast()}}, \code{\link[=fractalRast]{fractalRast()}}, \strong{GRASS} manual page for module \code{r.random.surface} (see \code{grassHelp("r.random.surface")}) +\code{\link[=rnormRast]{rnormRast()}}, \code{\link[=rSpatialDepRast]{rSpatialDepRast()}}, \code{\link[=fractalRast]{fractalRast()}}, \strong{GRASS} manual page for tool \code{r.random.surface} (see \code{grassHelp("r.random.surface")}) } diff --git a/man/sampleRast.Rd b/man/sampleRast.Rd index 3a9c1731..3e14c583 100644 --- a/man/sampleRast.Rd +++ b/man/sampleRast.Rd @@ -111,5 +111,5 @@ plot(randAll) } } \seealso{ -\code{\link[=spatSample]{spatSample()}}; \code{\link[terra:sample]{terra::spatSample()}}, module \code{r.random} in \strong{GRASS} +\code{\link[=spatSample]{spatSample()}}; \code{\link[terra:sample]{terra::spatSample()}}, tool \code{r.random} in \strong{GRASS} } diff --git a/man/simplifyGeom.Rd b/man/simplifyGeom.Rd index 13d109ed..12d316d4 100644 --- a/man/simplifyGeom.Rd +++ b/man/simplifyGeom.Rd @@ -107,5 +107,5 @@ legend("bottom", } } \seealso{ -\code{\link[=smoothGeom]{smoothGeom()}}, \link[=breakPolys]{geometry cleaning}, \code{\link[terra:simplify]{terra::simplifyGeom()}}, \strong{GRASS} manual page for module \code{v.generalize} (see \code{grassHelp("v.generalize")}) +\code{\link[=smoothGeom]{smoothGeom()}}, \link[=breakPolys]{geometry cleaning}, \code{\link[terra:simplify]{terra::simplifyGeom()}}, \strong{GRASS} manual page for tool \code{v.generalize} (see \code{grassHelp("v.generalize")}) } diff --git a/man/smoothGeom.Rd b/man/smoothGeom.Rd index 5f4bf076..3b42f25a 100644 --- a/man/smoothGeom.Rd +++ b/man/smoothGeom.Rd @@ -105,5 +105,5 @@ legend("bottom", } } \seealso{ -\code{\link[=simplifyGeom]{simplifyGeom()}}, \code{\link[terra:simplify]{terra::simplifyGeom()}}, \link[=breakPolys]{geometry cleaning}, \strong{GRASS} manual page for module \code{v.generalize} (see \code{grassHelp("v.generalize")}) +\code{\link[=simplifyGeom]{simplifyGeom()}}, \code{\link[terra:simplify]{terra::simplifyGeom()}}, \link[=breakPolys]{geometry cleaning}, \strong{GRASS} manual page for tool \code{v.generalize} (see \code{grassHelp("v.generalize")}) } diff --git a/man/spatSample.Rd b/man/spatSample.Rd index 523531fe..31ec807b 100644 --- a/man/spatSample.Rd +++ b/man/spatSample.Rd @@ -135,5 +135,5 @@ plot(randAll) } } \seealso{ -\code{\link[=sampleRast]{sampleRast()}}, \code{\link[terra:sample]{terra::spatSample()}}, module \code{v.random} in \strong{GRASS} +\code{\link[=sampleRast]{sampleRast()}}, \code{\link[terra:sample]{terra::spatSample()}}, tool \code{v.random} in \strong{GRASS} } diff --git a/man/streams.Rd b/man/streams.Rd index 24421c40..fd47c51a 100644 --- a/man/streams.Rd +++ b/man/streams.Rd @@ -34,7 +34,7 @@ A \code{GRaster}. } \description{ -This function estimates the course of streams and rivers from an elevation raster. It is based on the \strong{GRASS} module \code{r.stream.extract}, where more details can be found (see \code{grassHelp("r.stream.extract")}) +This function estimates the course of streams and rivers from an elevation raster. It is based on the \strong{GRASS} tool \code{r.stream.extract}, where more details can be found (see \code{grassHelp("r.stream.extract")}) } \examples{ if (grassStarted()) { @@ -55,5 +55,5 @@ plot(streams) } } \seealso{ -\code{\link[=flow]{flow()}}, \code{\link[=flowPath]{flowPath()}}, \strong{GRASS} manual for module \code{r.stream.extract} (see \code{grassHelp("r.stream.extract")}) +\code{\link[=flow]{flow()}}, \code{\link[=flowPath]{flowPath()}}, \strong{GRASS} manual for tool \code{r.stream.extract} (see \code{grassHelp("r.stream.extract")}) } diff --git a/man/stretch.Rd b/man/stretch.Rd index 3392e5c8..a81d31f1 100644 --- a/man/stretch.Rd +++ b/man/stretch.Rd @@ -67,5 +67,5 @@ fr - tr } } \seealso{ -\code{\link[terra:stretch]{terra::stretch()}} and module \code{r.rescale} in \strong{GRASS} (not used on this function) +\code{\link[terra:stretch]{terra::stretch()}} and tool \code{r.rescale} in \strong{GRASS} (not used on this function) } diff --git a/man/subset.Rd b/man/subset.Rd index 85787a87..abc6e733 100644 --- a/man/subset.Rd +++ b/man/subset.Rd @@ -95,6 +95,7 @@ rasts # example data madDypsis <- fastData("madDypsis") # vector of points +madDypsis <- vect(madDypsis) # Convert SpatVector to GVector dypsis <- fast(madDypsis) @@ -103,14 +104,20 @@ dypsis <- fast(madDypsis) dypsis$species # Returns the column -dypsis[[c("year", "species")]] # Returns a GRaster with these columns +dypsis[[c("year", "species")]] # Returns a GVector with these columns dypsis[ , c("year", "species")] # Same as above ### Subsetting GVector geometries -# Subset first three geometries -dypsis[1:3] -dypsis[1:3, "species"] +# Subset three geometries +dypsis[c(1, 4, 10)] + +# Subset three geometries and one column. Note order will always be the same +# in the output and may differ in order from terra subsetting. +dypsis[c(1, 4, 10), "species"] +dypsis[c(10, 4, 1), "species"] # fasterRaster: Same order as previous. +madDypsis[c(1, 4, 10), "species"] +madDypsis[c(10, 4, 1), "species"] # terra: different order as previous. # Get geometries by data table condition dypsis[dypsis$species == "Dypsis betsimisarakae"] @@ -119,9 +126,11 @@ dypsis[dypsis$species == "Dypsis betsimisarakae"] # New column dypsis$pi <- pi +head(dypsis) # Re-assign values dypsis$pi <- "pie" +head(dypsis) # Re-assign specific values dypsis$institutionCode[dypsis$institutionCode == "MO"] <- diff --git a/man/subset_dollar.Rd b/man/subset_dollar.Rd index fdfb4a24..90c7ae3a 100644 --- a/man/subset_dollar.Rd +++ b/man/subset_dollar.Rd @@ -93,6 +93,7 @@ rasts # example data madDypsis <- fastData("madDypsis") # vector of points +madDypsis <- vect(madDypsis) # Convert SpatVector to GVector dypsis <- fast(madDypsis) @@ -101,14 +102,20 @@ dypsis <- fast(madDypsis) dypsis$species # Returns the column -dypsis[[c("year", "species")]] # Returns a GRaster with these columns +dypsis[[c("year", "species")]] # Returns a GVector with these columns dypsis[ , c("year", "species")] # Same as above ### Subsetting GVector geometries -# Subset first three geometries -dypsis[1:3] -dypsis[1:3, "species"] +# Subset three geometries +dypsis[c(1, 4, 10)] + +# Subset three geometries and one column. Note order will always be the same +# in the output and may differ in order from terra subsetting. +dypsis[c(1, 4, 10), "species"] +dypsis[c(10, 4, 1), "species"] # fasterRaster: Same order as previous. +madDypsis[c(1, 4, 10), "species"] +madDypsis[c(10, 4, 1), "species"] # terra: different order as previous. # Get geometries by data table condition dypsis[dypsis$species == "Dypsis betsimisarakae"] @@ -117,9 +124,11 @@ dypsis[dypsis$species == "Dypsis betsimisarakae"] # New column dypsis$pi <- pi +head(dypsis) # Re-assign values dypsis$pi <- "pie" +head(dypsis) # Re-assign specific values dypsis$institutionCode[dypsis$institutionCode == "MO"] <- diff --git a/man/subset_double_square_brackets.Rd b/man/subset_double_square_brackets.Rd index e3a3352f..607c470f 100644 --- a/man/subset_double_square_brackets.Rd +++ b/man/subset_double_square_brackets.Rd @@ -95,6 +95,7 @@ rasts # example data madDypsis <- fastData("madDypsis") # vector of points +madDypsis <- vect(madDypsis) # Convert SpatVector to GVector dypsis <- fast(madDypsis) @@ -103,14 +104,20 @@ dypsis <- fast(madDypsis) dypsis$species # Returns the column -dypsis[[c("year", "species")]] # Returns a GRaster with these columns +dypsis[[c("year", "species")]] # Returns a GVector with these columns dypsis[ , c("year", "species")] # Same as above ### Subsetting GVector geometries -# Subset first three geometries -dypsis[1:3] -dypsis[1:3, "species"] +# Subset three geometries +dypsis[c(1, 4, 10)] + +# Subset three geometries and one column. Note order will always be the same +# in the output and may differ in order from terra subsetting. +dypsis[c(1, 4, 10), "species"] +dypsis[c(10, 4, 1), "species"] # fasterRaster: Same order as previous. +madDypsis[c(1, 4, 10), "species"] +madDypsis[c(10, 4, 1), "species"] # terra: different order as previous. # Get geometries by data table condition dypsis[dypsis$species == "Dypsis betsimisarakae"] @@ -119,9 +126,11 @@ dypsis[dypsis$species == "Dypsis betsimisarakae"] # New column dypsis$pi <- pi +head(dypsis) # Re-assign values dypsis$pi <- "pie" +head(dypsis) # Re-assign specific values dypsis$institutionCode[dypsis$institutionCode == "MO"] <- diff --git a/man/subset_single_bracket.Rd b/man/subset_single_bracket.Rd index a18be8fb..31f7bd15 100644 --- a/man/subset_single_bracket.Rd +++ b/man/subset_single_bracket.Rd @@ -97,6 +97,7 @@ rasts # example data madDypsis <- fastData("madDypsis") # vector of points +madDypsis <- vect(madDypsis) # Convert SpatVector to GVector dypsis <- fast(madDypsis) @@ -105,14 +106,20 @@ dypsis <- fast(madDypsis) dypsis$species # Returns the column -dypsis[[c("year", "species")]] # Returns a GRaster with these columns +dypsis[[c("year", "species")]] # Returns a GVector with these columns dypsis[ , c("year", "species")] # Same as above ### Subsetting GVector geometries -# Subset first three geometries -dypsis[1:3] -dypsis[1:3, "species"] +# Subset three geometries +dypsis[c(1, 4, 10)] + +# Subset three geometries and one column. Note order will always be the same +# in the output and may differ in order from terra subsetting. +dypsis[c(1, 4, 10), "species"] +dypsis[c(10, 4, 1), "species"] # fasterRaster: Same order as previous. +madDypsis[c(1, 4, 10), "species"] +madDypsis[c(10, 4, 1), "species"] # terra: different order as previous. # Get geometries by data table condition dypsis[dypsis$species == "Dypsis betsimisarakae"] @@ -121,9 +128,11 @@ dypsis[dypsis$species == "Dypsis betsimisarakae"] # New column dypsis$pi <- pi +head(dypsis) # Re-assign values dypsis$pi <- "pie" +head(dypsis) # Re-assign specific values dypsis$institutionCode[dypsis$institutionCode == "MO"] <- diff --git a/man/sun.Rd b/man/sun.Rd index 6135cb90..223ea8f6 100644 --- a/man/sun.Rd +++ b/man/sun.Rd @@ -46,7 +46,7 @@ sun( \item{albedo}{A \code{GRaster} or a numeric value: This is either a raster with values of ground albedo or a numeric value (in which case albedo is assumed to be the same everywhere). Albedo is unit-less, and the default value is 0.2.} -\item{linke}{A \code{GRaster} or a numeric value: This is either a raster with values of the Linke atmospheric turbidity coefficient or a numeric value (in which case the same value is assumed for all locations). The Linke coefficient is unit-less. The default value is 3, but see also the \strong{GRASS} manual page for module \code{r.sun} (\code{grassHelp("r.sun")}).} +\item{linke}{A \code{GRaster} or a numeric value: This is either a raster with values of the Linke atmospheric turbidity coefficient or a numeric value (in which case the same value is assumed for all locations). The Linke coefficient is unit-less. The default value is 3, but see also the \strong{GRASS} manual page for tool \code{r.sun} (\code{grassHelp("r.sun")}).} \item{day}{Positive integer between 1 to 365, inclusive: Day of year for which to calculate ir/radiation. Default is 1 (January 1st).} @@ -60,17 +60,17 @@ sun( \item{npartitions}{Positive numeric. Number of chunks in which to read input files. Default is 1.} -\item{beam_rad}{Logical: If \code{TRUE} (default), generate a raster with beam irradiation with units of Wh / m^2 / day ("mode 2" of the \code{r.sun} \strong{GRASS} module).} +\item{beam_rad}{Logical: If \code{TRUE} (default), generate a raster with beam irradiation with units of Wh / m^2 / day ("mode 2" of the \code{r.sun} \strong{GRASS} tool).} \item{diff_rad}{Logical: If \code{TRUE} (default), generate a raster representing irradiation in Wh / m^2 /day} -\item{refl_rad}{Logical: If \code{TRUE} (default), generate a raster with ground-reflected irradiation with units of Wh / m^2 / day ("mode 2" of the \code{r.sun} \strong{GRASS} module).} +\item{refl_rad}{Logical: If \code{TRUE} (default), generate a raster with ground-reflected irradiation with units of Wh / m^2 / day ("mode 2" of the \code{r.sun} \strong{GRASS} tool).} -\item{glob_rad}{Logical:. If \code{TRUE} (default), generate a raster with total irradiance/irradiation with units of Wh / m^2 / day ("mode 2" of the \code{r.sun} \strong{GRASS} module).} +\item{glob_rad}{Logical:. If \code{TRUE} (default), generate a raster with total irradiance/irradiation with units of Wh / m^2 / day ("mode 2" of the \code{r.sun} \strong{GRASS} tool).} -\item{insol_time}{Logical: If \code{TRUE} (default), generate a raster with total insolation time in hours ("mode 2" of the \code{r.sun} \strong{GRASS} module).} +\item{insol_time}{Logical: If \code{TRUE} (default), generate a raster with total insolation time in hours ("mode 2" of the \code{r.sun} \strong{GRASS} tool).} -\item{lowMemory}{Logical: If \code{TRUE}, use the low-memory version of the \code{r.sun} \strong{GRASS} module. The default is \code{FALSE}.} +\item{lowMemory}{Logical: If \code{TRUE}, use the low-memory version of the \code{r.sun} \strong{GRASS} tool. The default is \code{FALSE}.} } \value{ A raster or raster stack stack with the same extent, resolution, and coordinate reference system as \code{elevation}. Assuming all possible rasters are generated they represent: @@ -83,7 +83,7 @@ A raster or raster stack stack with the same extent, resolution, and coordinate } } \description{ -The \code{sun()} function calculates beam (direct), diffuse and ground reflected solar irradiation for a given day and set of topographic and atmospheric conditions. The function relies on the \strong{GRASS} module \code{r.sun}, the manual page for which contains a detailed explanation (see \code{grassHelp("r.sun")}) +The \code{sun()} function calculates beam (direct), diffuse and ground reflected solar irradiation for a given day and set of topographic and atmospheric conditions. The function relies on the \strong{GRASS} tool \code{r.sun}, the manual page for which contains a detailed explanation (see \code{grassHelp("r.sun")}) } \examples{ if (grassStarted()) { @@ -144,5 +144,5 @@ solar } } \seealso{ -\code{\link[=terrain]{terrain()}}, \code{\link[=horizonHeight]{horizonHeight()}}, \strong{GRASS} manual page for module \code{r.sun} (see \code{grassHelp("r.sun")}) +\code{\link[=terrain]{terrain()}}, \code{\link[=horizonHeight]{horizonHeight()}}, \strong{GRASS} manual page for tool \code{r.sun} (see \code{grassHelp("r.sun")}) } diff --git a/man/terrain.Rd b/man/terrain.Rd index 8e73a9bb..e8ea9b66 100644 --- a/man/terrain.Rd +++ b/man/terrain.Rd @@ -67,5 +67,5 @@ plot(hs) } } \seealso{ -\code{\link[terra:terrain]{terra::terrain()}}, \code{\link[=ruggedness]{ruggedness()}}, \code{\link[=wetness]{wetness()}}, \code{\link[=geomorphons]{geomorphons()}}, module \code{r.slope.aspect} in \strong{GRASS} +\code{\link[terra:terrain]{terra::terrain()}}, \code{\link[=ruggedness]{ruggedness()}}, \code{\link[=wetness]{wetness()}}, \code{\link[=geomorphons]{geomorphons()}}, tool \code{r.slope.aspect} in \strong{GRASS} } diff --git a/man/thinLines.Rd b/man/thinLines.Rd index a9ba0fd8..cb32b3c8 100644 --- a/man/thinLines.Rd +++ b/man/thinLines.Rd @@ -46,5 +46,5 @@ plot(cleanLines, add = TRUE) } } \seealso{ -\code{\link[=as.lines]{as.lines()}}, \strong{GRASS} manual page for module \code{r.thin} (see \code{grassHelp("r.thin")}) +\code{\link[=as.lines]{as.lines()}}, \strong{GRASS} manual page for tool \code{r.thin} (see \code{grassHelp("r.thin")}) } diff --git a/man/trim.Rd b/man/trim.Rd index 7b39d4c9..877a8221 100644 --- a/man/trim.Rd +++ b/man/trim.Rd @@ -59,5 +59,5 @@ dim(trimmedElevs) } } \seealso{ -\code{\link[terra:trim]{terra::trim()}}, \code{\link[=extend]{extend()}}, and \strong{GRASS} module \code{g.region} +\code{\link[terra:trim]{terra::trim()}}, \code{\link[=extend]{extend()}}, and \strong{GRASS} tool \code{g.region} } diff --git a/man/vegIndex.Rd b/man/vegIndex.Rd index 15b2d4c2..567c0ba8 100644 --- a/man/vegIndex.Rd +++ b/man/vegIndex.Rd @@ -75,5 +75,5 @@ plot(rnir) } } \seealso{ -\strong{GRASS} manual page for module \code{i.vi} (see \code{grassHelp("i.vi")}) +\strong{GRASS} manual page for tool \code{i.vi} (see \code{grassHelp("i.vi")}) } diff --git a/man/voronoi.Rd b/man/voronoi.Rd index 91a28f0c..4e9dc059 100644 --- a/man/voronoi.Rd +++ b/man/voronoi.Rd @@ -50,5 +50,5 @@ plot(rand) } } \seealso{ -\code{\link[terra:voronoi]{terra::voronoi()}}, \code{\link[sf:geos_unary]{sf::st_voronoi()}}, module \code{v.voronoi} in \strong{GRASS} +\code{\link[terra:voronoi]{terra::voronoi()}}, \code{\link[sf:geos_unary]{sf::st_voronoi()}}, tool \code{v.voronoi} in \strong{GRASS} } diff --git a/man/wetness.Rd b/man/wetness.Rd index 6c550b58..767a58a5 100644 --- a/man/wetness.Rd +++ b/man/wetness.Rd @@ -39,5 +39,5 @@ plot(c(elev, twi)) } } \seealso{ -\code{\link[=terrain]{terrain()}}, \code{\link[=ruggedness]{ruggedness()}}, \code{\link[=geomorphons]{geomorphons()}}, \strong{GRASS} manual for module \code{r.topidx} (see \code{grassHelp("r.topidx")}) +\code{\link[=terrain]{terrain()}}, \code{\link[=ruggedness]{ruggedness()}}, \code{\link[=geomorphons]{geomorphons()}}, \strong{GRASS} manual for tool \code{r.topidx} (see \code{grassHelp("r.topidx")}) } diff --git a/man/writeRaster.Rd b/man/writeRaster.Rd index 54d79c23..f972d0ab 100644 --- a/man/writeRaster.Rd +++ b/man/writeRaster.Rd @@ -68,7 +68,7 @@ \item{...}{Additional arguments. These can include: \itemize{ \item \code{bigTiff}: Logical: If \code{TRUE}, and the file format is a GeoTIFF and would be larger than 4 GB (regardless of compression), then the file will be saved in BIGTIFF format. -\item \code{format}: Character, indicating file format. This is usually ascertained from the file extension, but in case this fails, it can be stated explicitly. When using other formats, you may have to specify the \code{createopts} argument, too (see help page for \strong{GRASS} module \code{r.out.gdal}). Two common formats include: +\item \code{format}: Character, indicating file format. This is usually ascertained from the file extension, but in case this fails, it can be stated explicitly. When using other formats, you may have to specify the \code{createopts} argument, too (see help page for \strong{GRASS} tool \code{r.out.gdal}). Two common formats include: \itemize{ \item \code{"GTiff"} (default): GeoTIFF \code{filename} ends in \code{.tif}. \item \code{"ASC"}: ASCII \code{filename} ends in \code{.asc} @@ -83,7 +83,7 @@ A \code{GRaster} (invisibly). A raster is also saved to disk. \description{ This function saves a \code{GRaster} to disk directly from a \strong{GRASS} session. It is faster than using \code{\link[=rast]{rast()}}, then saving the output of that to disk (because \code{rast()} actually save the raster to disk, anyway). -The function will attempt to ascertain the file type to be ascertained from the file extension, but you can specify the format using the \code{format} argument (see entry for \code{...}). You can see a list of supported formats by simply using this function with no arguments, as in \code{writeRaster()}, or by consulting the online help page for the \strong{GRASS} module \code{r.out.gdal} (see \code{grassHelp("r.out.gdal")}). Only the \code{GeoTIFF} file format is guaranteed to work for multi-layered rasters. +The function will attempt to ascertain the file type to be ascertained from the file extension, but you can specify the format using the \code{format} argument (see entry for \code{...}). You can see a list of supported formats by simply using this function with no arguments, as in \code{writeRaster()}, or by consulting the online help page for the \strong{GRASS} tool \code{r.out.gdal} (see \code{grassHelp("r.out.gdal")}). Only the \code{GeoTIFF} file format is guaranteed to work for multi-layered rasters. The function will attempt to optimize the \code{datatype} argument, but this can take a long time. You can speed this up by setting \code{datatype} manually. Note that if you are saving a "stack" of \code{GRaster}s with different \code{datatype}s, the one with the highest information density will be used (e.g., low-bit integer < high-bit integer < floating-point < double-floating point). This can make rasters with lower datatypes much larger on disk. In these cases, it make be best to save rasters with similar \code{datatype}s together. } @@ -131,5 +131,5 @@ chelsaBio1 } } \seealso{ -\code{\link[terra:writeRaster]{terra::writeRaster()}}, \strong{GRASS} module \code{r.out.gdal} (see \code{grassHelp("r.out.gdal")}) +\code{\link[terra:writeRaster]{terra::writeRaster()}}, \strong{GRASS} tool \code{r.out.gdal} (see \code{grassHelp("r.out.gdal")}) } diff --git a/man/writeVector.Rd b/man/writeVector.Rd index 8d7fecbb..0816f4bc 100644 --- a/man/writeVector.Rd +++ b/man/writeVector.Rd @@ -37,7 +37,7 @@ \item{attachTable}{Logical: If \code{TRUE} (default), attach the attribute to table to the vector before saving it. If \code{FALSE}, the attribute table will not be attached.} -\item{...}{Additional arguments to send to \strong{GRASS} module \code{v.out.ogr} (see \code{grassHelp("v.out.ogr")}).} +\item{...}{Additional arguments to send to \strong{GRASS} tool \code{v.out.ogr} (see \code{grassHelp("v.out.ogr")}).} } \value{ Invisibly returns a \code{GRaster} (the input, \code{x}). Also saves the vector to disk. @@ -45,7 +45,7 @@ Invisibly returns a \code{GRaster} (the input, \code{x}). Also saves the vector \description{ This function saves a \code{GVector} to disk directly from a \strong{GRASS} session. -By default, files will be of OGC GeoPackage format (extension "\code{.gpkg}"), but this can be changed with the \code{format} argument. You can see a list of supported formats by simply using this function with no arguments, as in \code{writeVector()}, or by consulting the online help page for \strong{GRASS} module \code{v.out.ogr} (see \code{grassHelp("v.out.ogr")}). +By default, files will be of OGC GeoPackage format (extension "\code{.gpkg}"), but this can be changed with the \code{format} argument. You can see a list of supported formats by simply using this function with no arguments, as in \code{writeVector()}, or by consulting the online help page for \strong{GRASS} tool \code{v.out.ogr} (see \code{grassHelp("v.out.ogr")}). Note that if the vector has a data table attached and at least one numeric or integer column has an \code{NA} or \code{NaN} value, the function will yield a warning like: @@ -97,7 +97,7 @@ writeVector(rivers, filename) } } \seealso{ -\code{\link[terra:writeVector]{terra::writeVector()}}, \code{\link[sf:st_write]{sf::st_write()}}, \strong{GRASS} module \code{v.out.ogr} (see \code{grassHelp("v.out.ogr")}) +\code{\link[terra:writeVector]{terra::writeVector()}}, \code{\link[sf:st_write]{sf::st_write()}}, \strong{GRASS} tool \code{v.out.ogr} (see \code{grassHelp("v.out.ogr")}) -\code{\link[terra:writeVector]{terra::writeVector()}}, the \strong{GRASS} module manual page for \code{v.out.ogr} (see \code{grassHelp("v.out.ogr")}) +\code{\link[terra:writeVector]{terra::writeVector()}}, the \strong{GRASS} tool manual page for \code{v.out.ogr} (see \code{grassHelp("v.out.ogr")}) } From d44fe1967f2bd17a8dc8b19589505a06161f26f6 Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Tue, 20 May 2025 13:50:40 -0500 Subject: [PATCH 08/52] Update logo.png --- man/figures/logo.png | Bin 113693 -> 374670 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/man/figures/logo.png b/man/figures/logo.png index 2f40d4273a4d1b93c741fd77b999b543a2907e73..b9e421145511574dcfef941ea1100b614de36b96 100644 GIT binary patch literal 374670 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�?<6?-6d@cq`fPuZe9j;xw%HhRBf)}>w*>cHak3G)W z$qIMSaByKE#)h^76^RImxlV9wKSNosMy7=phnDU@lbV26YaDeC$UPHJnY8`uQ}EM* zn1nzGk_7DRSmyJFo!wSEdQysYb%-9-s_h#(u%?Qckqo3A9QbJ75Wm;u(@PbJ7_saP{2tDZB=cMO*h_UitvGo=$lqb zY|wpT7$dEPdDGIUhW-p5|M(fp<2d#DWx1t^4-k?k>om19b*;op`%i0wu|?4|$ss-= zap%{ts(VJtY~$qlM-O92XeB(alwdw z>&eW-;n7;quWcJaiqTXwO{&#_F$$A4&M0(-^;u@s1$K5FUDJsBsVTACZ_yO_jOWo6 znGliDa6!alj77U>yPl@Uuj*DWG0fzmd|SlCibR3%#pN?=rAR)BhgH&o1eceeK2H{( z8vt`llaK<1$I-|mBD`UPs%1Cl`>drEjKaP>(TgQ@=CyBA!o&Kd?FWBp( zlF903lKWGSmHJQ;xd9p?9k!v;ET)U@BVmjcC=!6orisLgp=o zQxkCr2?|o73aUXWqnkks`cc+Hn%X2x=1sK*J)encC4xq|NCIljL?DdyyVNg^kgj%S z4OcH;q>;7Aj0$ z3rezZm7~DIt;Pp02s}j=S8snQBjP~a?wmwq7<=xzc8RAR9q{W^#G~StL0!nP%4C$2 zO4D`*+i7&CP>q9U5$*VU@j(4uBsqcCI%qju3OutR9Q>B=VgWa7SuHJQpOP4Q_ z$rx+6b#%m|pLvv{n@5bnvp?Ts|H2+2EhVYT36-F&XxH?H<75x~IIESV!9I@wc1S%3a1^RN3Tf?O0te~K~!ZEAAw3gPSQ4&A;lf>#Q zus-w5=5rKgYPrXtw$HI94dwa8D5PPdbD26bMW;>9n)=b6o0H{IOqc|=u_!IZW=Tnl zMv~n!SdkTRjKyKrkfWTf)%30=-j!#SgCrUuMEoYw%vyAm|DS^(S({}~>?0OM2zk3U zLKc@^&Ga761Jr#{*9+!o8a9Ta`Ci5*Q!Y9j z8LKqTwv1sEvQLKW!J3ws11UvpS?{SN8ZtrQ=MIKf+S3yo)lYY*c~l1wPK`Ns)7c_=H0x)oFyToiS@?G_D~c>T9>2z0D^-{#kB5 zc}8;p7w=iHceP`=I>XK^+8W}R*sMp|Rufu7e-?S-vm+NS^;}q3jB7BAtd?HH!#YWx zAT#S6jnOPmdyHxDC=r)&at~b#vjdpz7#?`-i?D4X4Uq$Tm0Q=3`P91S`yWE-JLxK7c`Eq1O^E#yYD7gDJ}VsY4PoR&=(r4KA~@)E>DkluVZYnXK{$-#O( zPHu)1{5Vwz8fy*CX+bfp9KK=%C!Q-Zfm1ef@RK>zytNop6~S zPC1C>wU3cpnEKXfbW$*8R_imgX=vseyMVZ2nhcqADKZlj&3QznlEYL@)B*AxiAw$R z>5mn>>=iHL)vtLq_rCZ(tZ_X4*i(GqgCFE0AO0{WM<7ci$NvSU$pk#6v*e&<#2e%=QVN?zNGWGXQB3=i z2fvOe96D*@nD8+%YENp6j6ExZMQ9sJ$yNy|(<-r$?@0uoiJQQ%N^F+B$j@sgB(fqx zTUc7qF38{%y&o97I9nznV+bTN#u>V1&U#$R_-cmMiMUf%f?AD(>|=B$5*dTXHM+zE zEj}x?%&kGNKATiOk34&I{&38K_zGHER3w369k~A$j%#;o=5v_O9Nt=K?F5f=7N4Wg zeIz@eA9}nGf=Gmbvkn))tH`B;Jxp{EM8@4%q`eWdm}NOoGqG-8>|{`parAgU%6@TT zl@McMvl&^fMb+0?OQ%~*a-cjzZL?7ieR)1@W3Wwwv5_$bf`|E{DDZm4e7+zJ0?ReV zF^tmE4CBbUAHgCbhYC;`UkI8L=~0!l#wc`IlQl8VCEiZ!0)tXY)G#Z=tSRDt35}z1 z4rhCYK5}x~vv(kKFVQ8k5i>*^0y&9+TMpaj>3!n*^(9xX%@NV-gemjxO6!6|ZIP{9 zmq-%FSf#-!iS;TAr!iH;Fv_4n45j!j>dkfXWhxR1IxWXtiJ1Xb$7^oi&|JCa0xBu8 z2fxWEJusXNa+)8NrL-m9?ha zuz-qLNMG?BWci#A9ivDuM;*npsBFsmXECJWwkjn-ibcaAmct!GPI9=60lLN!^GJ@8 zL5C=RSLs~F6h$b-HkxtprROMzPOU`pRC!jKUPc#EsB=atq$oYjwsQNh52lUVIAn2j*mV32_FCSGo0L91K`)tuRNVMH1mcbdbBoJ+oByrn^0PG zxn+FQpm0DYMPXnkvY0GIXsm)_r!2P0AR|(CTJ5fd3l}?H@!-9nMgXV2qGEF%Yw-u`Q~BY!j%eP%4R@EAr{p>9Mh5RAh{Sq&YoXGmeQ(KeBEm zLEPD0Fb;wBx|hk407e_Ebs|1i$Yv=g@(@K}t3Zy*Xu3{FUE?T7MQxF7d%H|6vFgKM z5Jbc^8fA)3N}}`Y|BFrJ;=pN7g=pq?Cl(I>-H^f-MlHpX#;V9v)gC1w=?_K z=3Kw2!DyO2!#Jj`=SGG<|L4AsH-GKdPVe>RulZWu`#0Z>b{?;!G9n}qSyR$;mq`ds z4lwp{5;aOg#&3#p=BUU)kPsakRIum(XornL;8kQ&9BGWjCr!u+l@cdMr>HQevkNZl z@8jGdn__8}I195S}e+Td;-Gun`;e?5$OS?G6q47I_C<% zN7K--9zChgsNgVI2EQifED2rPfX*@jq7_ngJc`a&_@{$r?eE=j@W9giCL3l5~=Yrj8K8elwo!1Il3`$ z?aLg|D^el&R}Bs!oHHpxi`Pn-WAt8hQ|grB3rsTL1t%JkDQjb-_p3!9Wt(!z21%-z z59K6DMQJZ&%9xS&*d$7gnJB!poKQ+K(HJXwP;P48{;EiXjM9p|a!!`4WfV`B-hZNK z5#(a)tTiZ+THZpM@|&zm=2680l)!H>%ebyoig_B@QdXm#9CUun6Qt{`;b3o%gS`W+ zw)ox?`pD6Z+nnBB;(IawNih+<5U)&DbWO`$doSjmy?ePhzewX9XD1t$CmWtQx=wpx zP0tNN90AdE$jA)5bfF?DOQKOB+sd*yUnOe;`}=cfAr7Zxmq}(|3=y9p8+m4`up=|M z=m;Q-HD|Jla(Fh13x^kZ;O+-G+`Y)|Y?mQyxV3tgn`ck*=(7)#2-pJ43d`N&gJkJ_ zpBM*eH4VKltr1(~x&?-hF$pu?mJ&({=O-o+*=kxt*EEnN8B!{4c|1x@MA2NpkOap8@s)^?ol@}0jF3SAOc9}|8|q!AjUWg;sTC?EPjmg` z5pJD5PDqM&X1RKI%koSnxr`FCsvPrlfTiaPx~djm1#Yh&@q7|l+bT%};PwwKhnEa( zm+*cqJRzmFF;MGs#g3>04`V^>ln@0s>j7&Ot#O1t(xjGgIdXDiLtY7A4K3}Fopy)C z#TkbOGiGzckdKSkhG+#z`$W~R1DVpEE4EE=H zy!_IabI@F2&t7D+@;rI{CXYV$Bp-X`VaDu>`mdmkF$&SuT8lBdm?1KKD%sO=stRgU zNdGFcKi}tT9{39GzIv4lyZb~uw^p}!=JYxbKlMqHi!!hfBzCx>sgrzW>@(}-h@0(T zv!15AtZ6XXOYDp?Y3CY^)#4PK)W~ed(siA*IBGki>fV$OF9nDyask_QkqgNrr(zpM zNmMgp)L4?1L?XoJ>|3=xrYJ31G~_yPkcvN5Ig`SKelWGMD;KhqU{b(Q{z6S)%nQpl zUNEAOQx*-1I&KsTflf=HPAL&p!jzj^4|aJ0NF$7c5M7LtMG69Y2VpSD!pl_%jIyCA z0x^J+sw9k=<(U_KfrZ7mOw9fC^P;&AF&bimSO{dF^Svm7JO#5hMo(~iEZ!}t9O{&Q zwQUr(RrG_%-AdnIW0Yt@41UAe$&%G_;Phxs=o3UlqaL_+>2BWfmOsUtzv3Hs@a|V) zjeFjEf4scKA3X7XKJdi*_}wS|11H062~x;s$|+5K*9@gP5V#f%Uv~GG@xT4upXbWq zH2^~L{QHmobAIdN@1~hM+PP)33?xs1E9Eti;#U4m=JMfH-uc$=<=emNPjb(N7k$Cc zyB?Q(=!xIqJs*2FzxC<&GK7GSsm$2Rzylea(X5suv(7M|TTwA|PMlE3fapsgo3HfJ z{V30{X%*JE;(w7bIv0bjEr_PICdRNuGK#dhb7fLx+E1z+^i}*vNE|VFIT)>$(L*0F zA#NetbCr*9QfjiA@4!$WddUO)?Z5OBQ+52}yI#!eANX=U_=msG#~%6k9rw-{f!cR= zcX{xkhtS5*j|09BJoD7kJo3mR93LNV0|O#rw^@s0YSU3E; zy0>ue#aGbU_6x2{fYorqA3puteDv|(|P@je&b20cv|DAbngR090> zfA^o^ul&GYWy=vhAV)JHiDALXe3ZG2eMI)_q*m;|+LT!YV| z9;S`M$F1DC^!gR+RnM$zX}Xp?YKA_uK9(scMo^vNwXb>&|MY+Q$6UU6dHO6VMSlPB z-{5ck;tx@ssOv zJn*@QQ+=<{^RcHs#J_s~zv7pE>laDE)3grj0;5m(F|#_0%y)A^HZ3Yg*8RZX1GZVP*l7d-gozNkZSOH9pw!}{OeabfAc=*{Ku9Ja37#fJ5$J+c2>;dV zg^6>c&b>!H(-e@CXp}4#7HbrnrKsfA^RptGwGyg>5tHvr1>XKBl|ic%u~J3TUdatg z1?#Ouv0C{jnDp@h`I1o*gkq{nN@+qZR1#?Wxv+ADz+-(*WzlUmfyX{`n|ofo;7U8A z={o$_%gnfv11*HeW{AXO#5SID1!yjZXv|acqLgUf=PVN6rn;M+FH*FT&7U+m4CrJ~ zUV2`e)xgu6r#ZfL!ZX*8IK5pQA{W*9ZS0j~#zzn_M9L7YQI{lHgVb?!D)pDain_1iowkr5vB$;N=e;Ks0=8 zd5hI;AjC37QpB3HyzXCk`+vcYe9w>2y5|q%0P|*tH@)PWc+*S1i5q86^G|;5@9_UV z{9a=6EZ4FuX067#7NxvYr#{nfJhQIBXlYy2*>iG0<%Bg>q}R&_iy@-5rELvl!*aF3 zd%*}Z!t$12kS4RU(g~0ezAVCI6G=EG>8BcjQ)7&!;*g3f2YH`y80j~0Te;M-%AMx7@OgM<*PLy*9wlZ>Al8pdU&KS~TY z%ROrX8Y3iMgsbuFV{6WCthsyzzVZz(VrS7YCQ-r-Br#vincev=`@5R6BRD;c(62eT zyoV2-J|wg?QtxF7{OyQ{ocUds@8SpE{+IZ!w|p0kZNBgqe9pCK_xZ|uzlE>7_gnb> zKbH8dul@~w=3o9aANcqm5F#vEOVhMi)sXyHimD>&6u~LS-~O@xzDy8&G1n`BZv^0U z{R|)Y)X(#KpZIxV7$reHuRN>`Mz>g6auTsRG&GII`$*6UMZ|2uO{T}Id>O!Eb&_A+fQ3{QWKvLQXlXEL||73Cw ze9gnGuqTBxhP{PhNRjAA)~j;=D22D$PU~fA;*lnl zBW3X)F-C+2m6DdWHgznw6uq_ZEr?l$?eyRs&r@XQdoMgEUnDU0_d0fW9XT6r-|TtD zuj$7)sV-NPwN^^GaG{|5x%neTG@xh(6ww#5^sTfmqCO;X1(X>hjM2>JEn_p1h62Ht zHCtUeV-|Nqqcu5X3Gx-|rM7ECj(PfTgwzrPoZN=lV#A_9SzwBffY^=$tb5T_h=mYX zd+{0BR58n@Fat5oZ6^c#&wF|IF8=19{AqspUGL;~PyPU7 zz-f!MjUZIfuv|s@ek7;N(ynn%)3%QJ%;AhfX@j;I;}k0Q#2D~HW@pxjz60QlqOp+_ zeUXnwcoJG5OzD^AviTD+DU?dZjZ`wz7=-si8X+m764gkj#h5Kc@EcFRjw18~Y?~A1 zs)u?>taHq4v+X;t>O4B3Fd6Q@|9a79{cQLJo4$!a(e58d+&P@x1K#> zxmj%yjj97u0u)L#XhKX_+;%^Gfn}FVPuP^UoYIg}lLc-g%2-ptSb($Dcz@A`X$O(J>`N?WZ4 z!X}c(JfTzj2m4<_l5yv?H^0g^zV@&3x|h72UwGe-a^vJ-w3dk};~GL#!Y9+aWThsb zi*XQi6{jI-hNT2B9f2quhuxh8fBfsd@e989TONEHzy9g>P*0tl0}3PSyCAowyr0pA zDl%8ER3^5RQM~<4Kg74a?$3Tn_h4tX!+-nEzrnM|&+yB?|0|F+vso*OyXRSzNHOr^ zZ~yQ3-mm|2U($Q+&G-4SKm8M2zx_17dHfsf>~^$W=IpE|jTuIZoz2jIZ5LQGN|BJH zT|W$-xQ?h!rW$ifjQuDCPv@}8l_I=+=#n&4#RgNjUol6Fwsi9b*J-p1sH_;v-c@D# zQWYYGfb3~X1PW+P6>{x;#LYl=;5wPUTI|lqM1qISEaIGI)S~vfZSy?O&9a{#`TSz8 z7q&YJ1SBYgDMBn_Mi#RO`e?1EaVcXpyL$^(vq;zks&MEQ@-2sB86i!Xt=B<)%S@Re zmqdVk$6tjEr^kugyCdC9`mRbB1w(YP{}r4&r|mdVz3RG{5G}0fjJx*k=4F>(iP3j1HLVTz9p1|a)E|^Fy^J4I z89`PAp9zKU(hm`D6JZp!NY}{duGSir6s?_!?g$E{9HFrCB?;CzBP@RD|3)!f(vnmF zQ_xm5AXK865}4LmQwlgCJ7+C@@0?^bcfINvM?Vpa-`T+8v%G3%2R|LiCK$+Qka2>jq*{VV*t_x?L9@sEq{gd| zQ5=dP)oo8ZGuXNCvMBdHW=~23Z3nYm#d@6?*KqrEiJlo2`*ZpbXy+a6W@NqWIanO> zzx?%oz*jx=RiAe~Ztrd2WOK}|@ALk=Qi?zS9sfBuPoCyo|IfQ{ zxg!q9My{1$4baaQq`%1P!p@8NzHj;G{Gadni#&b&5rNW+`C-nM)!H)-iQo%$Dai<^ zR+=0Y{U)+L$@r0Jr2kKS>$lUkUl?_K7I<2W}iyCvqTzd^ZxDv0LJ-hxY4 z4Js@-?KjhFoDW&`-`gJR3%_2lsoHt;SAHMST1~wqvEx=Hi_`4v&2im|-h}N9tFNP~ z3(2-UlF}qEKkaQOmAVt=tva{Sje+$FPL4V+ z4?oH8J@MPjis>Cu5``VN;F})&6MWmN-^t6byyo27MHX|%unaOWGiHo(k}zb2Rg!4t zBA49zz-Aek%?;hm(sqWnHMHFfV;eC}3bNUUVH8>4k`XGIH1 z-~Q&eaktZINTT@yC3dPN5Z}E8h1b!1ZJ6>{Oe&LQ}(^|{R?z^8~ zd!H7MiR4kLIzwi13gjHn%A$=T<#U=UpYKxJe^nYnxf>9bj7j#IxY8Uyy-JH}U`e@y9r7=cIrR!0a0Zc*&DSP%T((Ac8&tW0LP@F`E_r7wIT=bnDv$V-aR z^crGPxs{wg&Zst8-c@KAOznRvAB5MSckz^||4bDF189eiZ-{jQ8 z&#dQ6n`lg?D9VzeEHGNr?>hXj&#;@5CKjt4oq3rDP338VkO9gZNjwsH#(5rSW-?w> zT+am0u10OuSj`Ye)+nK^L(TM4T69aS4NHUzee}N>-Sg_d)67a+*@90>CRQ{V_#wF; zkh=lK3Y$;sgvqH%Twl|j$yo^fu@-8G|2I}Vl3eRi#~Y8jbz+Q`JB?8FT%;vA9}Ulp z$kXC9MnSWg#?mySj36KgVxzG-#rd)hG)(m7s5cEtYmy}Tc|?&Uyky1RK^dSJdh(%% z5JgVBkB1U|k*#d{Vo+3xhb2h_zIY>)DB;>lsa}DuTnnKVP0@NJ3g&z{0^=+x0UHg+ zZ`#B^fA~|Zm|7lWY~H?w_y6;Id9ZUkx&=-t)~=f(6q=ds^9=K70A(H9X1B2St_S(* zU7uv_%8gul%J1>)lYbkl1wfkGhEy+9qz(s-4v`TQWZ_<17%V#n=V4ell17`URTv4|z}g9Bed$%X8?KB2JWL&~6(N-Naan zr=+vcmjF^3f-lJPqV8{M6DtfM)adQ3DTCTXM_KP&&5V*NogvRfS<;0-38YCX=Q<21 zpVFO&-W-))7o+B9R3lts1uf3N0StWormOkd&0m+#MkQPwdw7bfqM=z_=<<{MAK<|s z|BPXG$T^Qcclkh6Vm4>AMY&P}q(qUV(#+MtqOqVtZ3lkvj3tU+#c`#Tfc%WoxZI&i z1Gyz%guUDQgn6Kd_tphMB3V|FNFQ4TMJOEQFwo6m-`+l}4@p^V8#pt-xdP{XY*{)c zrY5AqQ4W~vc4$s0bm}O*BWYx4WmvanJs)}b2RL%wascwo;w=Aq-4*<3*X`eY+P3IYJe!@KsCh zI|pce=6S)Ety@Qx&-z|(!>hm#ANW2u{P3$>^4ur$;%EFJhpc|g*!QO=4&{tvU&yUL zz5*9C+9V8f#pYk^qhBofU=Z4^(FQjN%*}KudQJ*2-gDSthjQi_(-7bl7rt^C z2Ir?c9^l0vdJ&z$0@Eu}>J>6#vkEuh<_E9gh97^6_03~=%>{qNIme&JBXip+L&30g zxBwFq35$8bu;R7S&fLN*lbOS`9ecXl_|$Fh z;mUjdotHi7&75=0)7d`1xt<|PR}g||ZiFgA3M|1BjJ6OI$}|`ZN*240-k^|YlmZ^s zuU*U8r=2za>|Mc!u74LgmHuOz5|uTn7tF{&Ln*lTk=uCdmu_O?^bzbE>|lCo6=|Zd zM&U{&fsU4nlGU1aOIj!(!A8CHp7?DcLmN<(@%{t zs4Dmkvd;=p?Q2X%hy&ZBl@?tAqe!g*FTYdTAckAEelHYYl4!bDbEd1CAU`rDM!i=e zcnlRrWy{z&4WR-(LaW(gvNcK3Dnt}$*~62d#3UBw#RkBYo}$Pp$;A{*L0a7|R#LAQgts>p1givVu9Y=4bAS?hwP(cDUOfCVogTe<;1=dK$r6N!~I73+|^4#Nm zL4m`j(&8#h!{TCx+$kC@&0$AOP&iMgKVYH1hv_w|NE6H3pZ6yR3^IOj{||Wchu=tZ zMaH^ARx>OM0wT)hLxC%E(PS|mqdW#rBgyd2(H-pL+Pgo(_a6EWp8nX^bM~>9vVGsr zF-ANzh#CYKxi>Wf>L6Q)L5ASK)aZ9mV`O&CZR6A5{9|5!$tPIZK5Xp!k3a5rxb-Jj zV3cKcuEVxR`YbHMid7S!1O1^e9tbjCwAT1CN{K6Jg+A{$o->vh42AeW_mls-=ZifiV+@71C?sxVl}%vyHKgZCI)4S=k zRThFgn=DHtp-_%ilF57>Jho{`nwB#66fTeEhmJv>O9ffTTj*-4k`W)*=~{34(U&v$ z<g;=mg*FQxMve1d0C@XoX`cxq73L%k+m|iW)ou!&WWxCDr)RUj`PxtpvF*8 z&+kArAmYRH(C-E2=REyhAwBnaZ0DqxuHs~_l}OQ69zoJt7*UUmR&{^ORCp6rO&-)Q zw9>u?&b8VZ&2~oC5Dfr~;;payqXS|x{^g6G<1O#}69$7JA<8zJB_?k+vjnZMsU~Y0 zl!lpoeR};8o0vNA+&;gRzrE(I{NCp;=BoR?jHothkoT@81Dn6%5V%#QzXy3W;FlhoBPbW|NU`ki zCG${0q{x#bRlT@{~1(#4#5|vT*J>7jnx_fhUFyO7|b~}W(AFoZvieFLqXf!8R zw=iEYH`^CMHWi(Lg8;$HP~Z^3IGZUNEtr^Uk|dhJu+QwiS)P5$MVxi)8OzT5#yfA~ z<$v`m_Rh~h0Hegni&9e#JiYk=bNfWU#+Pczn2;ZZCruQ+VlQ94~ib<|FZ1sQ>_iGS+R*uKWFFeKD+l8 zOinjwPqk3SQaVupZZluWin10YBm&~sty#;V>kb*)-@;&q`*z*|%1{&{x~Ky9LV{8i zE6aqa1=20)bxL;6?p)%W?V^tkG4Ku?w(2lePplq0)+009`O)S(1?;YfFYI`3s+7!c z#)wc?lEALTZRB16oN1;>8;a7EHFiprU`N$yrNw(iTVe8vDWnKC8f$B57w_ag4F?6o ze!vx@;y{2}2Sce?$gC_D2+;~-bPn~J7uTzLFV#E_U=&Wv*a^mi5q#t@_w;%_fi0K> zf@aXqYY(YP52@~iRqtz6gQ+lP7M6M&{W{yD3N%8DC@O%AjugNu3aTZ!gJf-W5CW1F zB$~9Dk!C3-qPAU>ajZ;)d|(WiB0=GZ0PJJtSTFoa;XL#Q(CK&veG!0>KA0m=Mw74r z-pBUX5({rfZQ3OYeh#fXhJc*C83h}0plL0-4GM>IIoc}HhQ&4w-gu5V`Y2xZg5OGtVSzHtfHA(n$|*DGS#*;Gx3v1GA-puE&8}7)ikFvvUY+>v{ZT$F^EeNnY;xY z7r-lu0rVDgy7L1Dog7sfOt2`Y@p&NcmjWP7jL>PViW$==&{k*vt@204rISHqq)^8F6QH2JMn)pmgAO0Kn@q?njA%o>%d^78_Cq zi;mt*&S0Ued(qO83sGrM_HANisw_Q440!R1&O*Wb+<<<6h_+T7UwvSZmlVOt++cwu zpp1CQG@BL^JahxEeCqPC^z%o4!D~PG20E^bZCFey>~1zJmqnx za@?j(WBa@Aj&IPM41DjQZ!bI6GahqE-5T*hTx(^KQdlimw*DZG&ePO$!@5<==Y?Gh z+X!0Y(G2qf??hvz%!$?SQHEdUj$XH<-*Z^4F%?UyaJVwm88*P0sWr=vwRPVXNffKw ztSVhrHQwfpb9Rzw5$97P8mJhVGY$(+;l%(kDDgI`wJ@}bV_QdaHIFvXXrvfxVxSSl z)(THKaFqR+T!hhDg(iwzild$+GSN8Bi$GkB>x<_-7NGbgMWq0xa+KOp8i!aXN~OQI zSh92bJbA}se1`E&x(g-6Fm?i}WUww$Nu^cCgrKTKV_1&$`xUoGZ>okSgpv>h4^d6X z)sV4TCQNy`Y)$W}PTPfm3m$6>#-0!a35DxpLWxcSNiY<7%<7ba(oznEZG7jo&ic}R;`+ZL7SbM zw?YPu>6DeLRxJC@MAjZ*4;+9-tAwDUuvwf8vqWK4pv;F%G!s&7v9gM>a=J-(F)+VS z;6ot*O$$CKx~@;Vq0udAeJEw*I=l#M;h@Mx2K}T>Co<7!GAR3O-}4B&J9|m9l;DL% z8I%);#7Rpl)0ouYbso#w@{S%leGIFoHZUxP{9^YnnD5Vl3fMSH83)!|RGz>h^ml?P zHAbgs5=uOW9eOD1*Q_ROShnog&O@6Yj?XvFbRiJRK%x?kJK`8tuUySScaDd)J;ZP@ zzyw*~eGr9B9Sn!8-w?r=uwmW0WzS)H^%RF3zMf#A?}v~$CZ-eCtz5yLxg8AiA=)Q2 zlWFvDkuc0_uZsPKG){}>L`V(AupkYVBd3nziAOwz_02<3XJ_o(zK89bcW~W}H?Z~L z?UJomvnayRFC!~Q78KFuP!WS7EGC697U#wFGIt)6O0bkukcX0_-2_*l5EH0ZJoTll zY>&4eOYiv8PyQJ$8Pb|e*|2dP&1RE9uMc^k-I$=?%bDMqvv;m!)yfnV60|AMwxlQq zq&kq=1eZ%TnOcKRJT714up_4E&cgieIRHrnLcr@%l8%FFG|LBniWEh}Stu8Yqh)zGw+6Nhfu{r-J7Bms~cs zuWql)!?SnLTwStx=5BV(Z)W54k@deHz4|d6v-$+KFZ=?*3`i`M_!5J-dv>~lS6~Sn zu#qljbF{K43Ie{!nM^0dr8&}-y>|#WJ1!L7NSiVyK}yL&>w^TG-bYtu1C0YP?k1a) z(%M5w1v4gs!X8T~LVBbR_XIKf7lEPf_UND@QtinxCH8i;O{#Rn|`N4%^E6(qGr z3@8FMauwg@!Mlwl%K4*TPW6&G5(QEc65WEw7 z39>d5F_L=!VEI?v9wqBUQ8*vb`XaERV^u*{hyX8I6k6$;^J`LBt9|Jye2&k-3}clb zF32uY5rttm%KSzpvG`VMP|;h`Xwk434jrX~PS3GxcZY0JlLi$_&XUeciBMif6%;D! zyayzL4TQSvJ#q(=tjv!Au>)_w9z|HMLn z0cF6X7ViSRZq9>0+0LpX8e}UP1n=3lV;<{Dym1sE2NN(^kp898lr9$!gBTU75Tat8 zqqkU+YS0e4i(MA>4r1km15)y&#Q`R00Wwu$Qwi9nrB^I2`_A#}P9{yH90?+GT?aCe zF{DF?ejg4U0ycUeSS29cMk8U>D#I|>?3)ppT~YECknPY3pwlalLAc^pTN+7<*Matg z=Fea9=e+0{FRIV0^o|$3Lm`UAiQR;>xOq2H^X^#5?lDI?0< zupIEp&p(gt3!CNpL9%u261sCkW*+IoqGUcg6I<`+J?mM#`+vQ2>>fS$b{R95n zPqy99oBrW7gj~@b^a)N{Ne3&3DpM_viqkfp$?Kl@R!-h{`Z5qOz+e5@JGlMMAMmcf zemD32_&$6+GL(R+HFe2%Ne2mQGpuQ{xX{HmMbXvig52c) z2D-!9Wr4=97}6aC&>1#M*fTpL#*U@KTFdIyE0}1un0=(jmY>hp-WnRkb1xpBcfNhw zx9AshG)#&zitqmX8(e<+AB=tGnI~M%XKw#6;#nlp{>^3zg<(*Nqcc|gT6Daq-e7jw zrLUhnlXB#FhQT3QCqqpWD$sOZECb$5$>^UIHQ%(_iX zG^SV>ED)hn)JA);O<1+=D<2xID!&~i?KK@M)270ssOZTgYQRQIl~8#_&?2biU5I{9 z6>~(`e5G+{XX>g%_3U-T7NSJ$nmiD7*CfgHPFRY%YFk9FrfT_t8lF*`O&YO27GXu&64}*yE^{#GjYZaG<;39}!BF(A8GEDmDP!^98 zqd|>E6}L_&UI;MiA$hP?#7n$)ls=Cv4{DooWu&cv_9TfBxnBh;1S&|t(n(5evt_Z@ zTA{62Je$OjH4_m&u~53eVyDFW=oc9b!OII*30Vc?B~iM1A!Xk#>P=K2F6#1DltYKA zlQrsZ#qZlxqHnJ}&pP{J5<4y@-tBk!&l|3c23s*ma2{WJx(fre*BB+)Nl_FcKWhTP zI7(g6noKaMW>|<4Wm%SjA21PA>%o^X8}^`sr5FST-MktP2Q2p1*HM*NY7i`F3p?f? zS@xX`(}!`Ptwsyr$a@kk^iZnyJE~U*AD7|~0;{IS zl@r&lTpNRsimd_|IPIiU5Ad}9=iBjzoWJ-Dy{eI52&AZtA^GDeE$P9}!1G@W$ zEY9{A_6vNWSX>bABBjLnx6=KAAPXM_6O$>c)}~CalCpSkact;HKxz5CkzdDDbo|mm zL3<))#mWYy8%9IGz(lrs*?#7GGbn_@oF*wEC|50(hKbfB#%J^w1BjhKk zs5yaPe=0z0RXM2ib0m22F~CsRL<^X`3UcF5MFp3xu>1}!I76F=nBmf(y=p&cHNqEa z12!?FiH!_5Y5P`qDs8m5xN0Tqq$@?A%9te>#b`EHKLn}#N%i>fi8j2PI z@$ZU&xVd^GQ?1vatRiWssECHRW?FgZ6)lk_p-qT^hO}*jiWp1XRY+Yo*sCmUbgl{+l&z+v(a>n4c-ra9 zg{{7J!D^< zb_Q(OvV)zE%rL*NOLun2%#IH8`+Af^Pa{ofHx1T^DVO(^OKXKElc1;7wya*CvTB2^ zD-tRWdPznObVn+0p_r0X?cIovvQ{MZohwKZ!}^s+G0_|k3<80Ncitz#H$oL|W(m#A zlBE`_4caRPUB|HFMHn#d|MLAnptEyx-1fs;A`?dDWho8O%-X=MCtWd$y10Lb_8Wt^Q?+MRAVCOyAll?-OgB2uD(<0 zhAdeKLx@SGv`w^ytf8Z|MD!T*q9vq)!KxHDgxS44c5a(x*VY*p_IAXAp}r^49adEU zP!T4SiawDQs^Y!-^|wb&Z>^~?v9A%FMEXLDlgdC*6lm|UWV9wSk|~Ypg31FbahS~D z6OU8EWfr=hM54Zw#jzT*9%?f+WhC;dR?ZMSxf`O57K)!(;W0noCu?R*Ojz;BK!TYh zsVF=_Xs$uU-g2a?s!&Vrs+fh!pU5=_s11MO#GpyPYy&EBI28y+t}#Pnt(Crako#Wx5~Bs>AG`u@>CG4P^^l@p z)MiNGAgzU+L~cO}X@ zlnx}ylBoF5s%IO#fWeYjees}_kHOw3d+|X;ag4S2AnvvE+D zPMHg?U~%sv3p0I+A=0Zh5Q5{0r=Cuhjw>*J>$dBoaM~!T5B2{o-;^>D-7bp@TJhzp zzCvbG0g45fXisqTkw=YvZ`a;k%*@Y>r1C3?;s7_@c?*lP1tFgA5-7#;ZS%Rj*} z>yI7#{oN1U#VvQ-%Hp0r8`p2(>E}O!f9D#KwrAz4jI?10Rw{ZoJ$NO@E)~%OEAEQBhqESQERZKXI}NELvpz!`8jVa+&jh2U|5 zazc^y9uqWH38kxW0s19gm82G0%?yVn?-t~PKG-_n#TVkyq>Tgs&31yaT9S7!-ZZXs z6i!n(M|Zx%;zFRTG++u)N$f9G`AY=u3r;<*Lm^gG+t6Os#MtFZ(!a{~s7=-KJSRy_ zq!0R7-jT(x!fMoYQ4Nk#q@@kmb`UBXWt>=IxhrBaDq)i<@`^Qs(IONVXBScZl_Xci zQLorJ^K+hdThVR{!aY!8t-&Ui+?4Ti8s`-rK|A{ZkU($0xB!|UJ^ZTD;j0pFbq|Pt z2@+@+li-~&7LHkWJjs5-GTwXc`0<@mI*k1_V)R(iuF9f74MhB`*_7*W%A;*Sr4n&E zuP|QM*$%|d1xKqn$#AhCAM{A9V$d5>EPC7kEF($iWzQ24q%q16jChG)Vb!{f>9q~o zD=q(Z=V!U_)Qed+IljoGw!s^o`VKBW>9_dgjql;!&EF+aiqwc4ukwN)k?Mw2NWAy8 z)VI-!W>d3z6)bk49LieRXv!cT4n1Y*V!-L^fW#mJH)#0I-PiNt3tu*NUKc*$X?*sY ze;HXKN2O6^gh}BBn)c)*Pu#RTTLuZDPC4WW{9yC#0&>kQi?ca{ZYl49iIbs*3(j7? zk8j`d?fqO5*U&)uQ{3^rVkdOzSeD-<#+b6FW`|jty_IW<@ zwa+r&>tGrY!4*8I6{9(F@B_K-FbFZoI6%o?sj(pA7rP(ky`Ot8*Wd6R@>z%P14H;r z{)Rt(!<%@+YsP#0t5&Y$cYpiEeB@IfJK+7SkE6jm$Nb(t$&^8-78eRa5TUOSjiFG| zPj59RIBd<)%l7lVJHAVQp@&vY8fivqGdhbsnz~79GofXc5h8AZ63Q;*i;gh#Os$v% zI)DfUI+u${V!RhxgUw)iWy+wduvv$qNA29~TuItGnA39gz=Z`-J#m|e({R>Mw3>z! zH$H{akGg!>w{N-s3Sn)C|)}qmxgd*dChqus~8OXvB;GzqkNpnAG@2kIa zCCv%L^oj|z=~LoRDsbyVSMu_6{&cKzb>6Yhq?!IDMbVe**IKCKGdX_fp{hXPv55i| z_{Oc*aQjcb&zUET>+C3{xcJl;an{jK=e?hNA7A{!*QH{rpklbcuix=Ce*3%^aqMnX~%6nr6L)B;AF%Y6*&Z32x{(P$;4K0_BdjTKOI zh1r-`OOhm_Kx)O31Fg}CBW-BXOvF0+`G9<&7`T9H#O1RpY^b=dX{bal$Eqfg*ihsi zHwbj+0Lu#(I4|cD+5~IijtOU~eV= ztrU3<&Kb1MNRm`0kl0_dNg%O7G!?88_KVVyDkT#|>||j^Rc*m}sOm?fw2m2!sDqZy zbJ*G=m)*06AKA?8!VLZ4ki0Buv@)8L2{zL)P#_w9>6%TVjPwUpH84>)r*JuFp9pm^ z=m-!}6otp?lx8*oUXiF2?X9TW`B3XMEPI|x#cPlEIgV@>Jjw);MAI)iyywa{Gc5WC z*aIB1_A$KoH$TJQzTgT@Kk{6x5-IV-YSKi?)OcaXcvod9q5#`!TGp>?v1WD3s#TU% zt5a65ZqsTRY$DIA*|c?U(}?J03={+3x#zlN=X1g7PpSQELI^TJx`4|AgRWz4WHq&w%xJ3%bC17ex(JQtjO-q`oH?AXdrANnbw9F?@|7x;io zg~+3?O3U){%VZk`y+&<`W#7bkhtl#sYQ$mH1Wgzy$U%E0i&10^9IUERZMWTj8!vq4 z?{MR7x8N4RcZsY3jVlB1`@0YG?_c`zvhO|jS^I&X<9no*{0RI+;d6sg89KHKr40#`jaH2|9_-A;fCPfu5#!cqi|mUGxqr*I(OP4bBGHCSr(~)@LpLe=o_#y#+49gn=JpE38Yk?p z=Up=1HrcgjH$VLG?PN_wl3BSXFXheI-fr&O`Teoaw~{vJAAh05yINswig${^z{Lql zMXH^uu|&;w!n?olcJ_959q?YPnOevHe(MLh_TT=COP}=|N%&%AqnhYdoJT7?Bw;H_ zViYQ^2_-nEKl$97*>`|8F2IKAL-_OG_#hvA-sgGpre{e-tipsSnOhU9u~yZu1_(hQ zO>M-?#Cg{!&>oCOCy=%hY{Otujj}4Ld5#ikFPR@E)g(sx5dREPO5QQRL&9tnRELjUQZk`3r6NXE#^6Z1npvR;1TC3$ z#UoZrs7t~#R*|Auova%Dn;#91qAYQ)N>bCHV1TMJ zc@C7zj&5yLPONkhdcA^)p~VM-_azVSdw_Rd^%~yx8y{gJJFsWVsYg7CQ;&EO5AV5` zZ`}1U9@ue{^d|`vE|!p0q~^x^Z;WEaiVT}72Dzv78f_aaE)K{Gx#x{Ep>%R?N=J5z zz{L5{Lw7RYoo9Lp{qf8b&Z6CHve*&TK<_00b{+;^l>5#+;W4z*)>n;b+95PL8Ha{{r~&J zJpa;5NYhc}?!?EO!1UBKi{1GV7A5{vSFJoyDsTw~j}K#K^G$E zrbXs?u{TG*=n|9|jb*JCn~q<@uALng=L@+XN>LQcdBRhZll;!}Uw{u)HZ1{EyWQl7 zqgQdpDW`M7k*8zzay$E9?7WSye)rEKTt}$k-UmYNF=+}47WU4wWAhvfdx^oLOokiQ ztm8>fJbP?^U;ozCWG%zgiYD61V&{W|vr5A)4_(E{8^^zM(Mgwb^<7tCv_;3>&seY= zCu<+1B0MpfqSHR_x$;f?uZ!Q$hN&YC_+FiO+zEW-J%7(zU;h?9`sq*bM6&s4C{7?O~;YUEwPXlnB?>T8nL3RFqLrMwB*%OaM5@OVNS~R$3f36AXtZ zh(=V9)&?4aQK&>{^*XK{N-0zXfGXo_6=SW1;pCFYii{N+7o6bfA|}#@fKe9jl?a7J z?5KiTf1|=tR=C0{st++p3I>w4rnNd_YE>JO;!%bf|33s8iB3e+BnBEGf(=FHTZu)t z5BN}$8n8*i#^c%y=N!F#Lrfw%QZ5J{BheC-hcYrJJfKBbXKV(pN*-P!+{$jC^cClM z2^Pmd@LKleTzr8?^g)PasU?7=5L-4ikSS*QwO&A^nAD$-e~Q9siSwSxiRI3aGYhk# z=V3%6y%Q_VSi5zM7xxdziVIoRw2+ zaGfD#UP2HSM-f{?2Ys&IN0(7wGlyiI5O9?8fqNghgExNh`Ml+6@8#q}4_*y8YVAq9 z_URwv7rTGNwRim=ezx;A!8&*W`w@hymk&LK3nZDSGb$6vog;TWZ0c!EfGy-1RDEMl z)yk6eBln7%?!A%cK5=9sl_nWaI_Ye#yW=_u=F3oPi6|u%w=<4DbL^aVFYI95)TlLd z*ovb$YUL)jZQDhEp@-`R>G_wEp<>|~=Ra-PwSW888^w?=Vq@yj?W;QIe)k>fNu&ZG z*PmL79zDpY_ugZy#ybJJW{D-y30d3IE&FtO1F38zq5~jV?eg=u{oXrx^WVOe#l=2! z!MUipp#Uds4ap7^Gc&W?bjxi#{b?7B?c?}O$8yJAKd7snOFO6padI7W1HHw9=ITH& zqw5mJmqsf~8DP*aX(!7yTo$_>$?%5YdR`o%3rBA-z=Q-p6m5jy0`L3Fzu^U!FK{OFn!5z>+YA5p7(y+y0vS0_g}p0S2~^#CEt7CpSj`gkK#gJ zs~NAHGVI&iXYWqO>eZ|1_Xq6Tmb0)O33j!qUK%cc?j@N0G<&YP@$0PFFvTH$muQ{};7a62MuhS%G}{gC-xF?4h1cY3nCYUq}W#aOIc_ClkL&bTLbvq*E$(cE!YyZxkCEbjVz&&B`9FA z(_xqo>Gy~9`UNJjB&k#bTY0?k(RFfjr^bx|&QXLl=qcIEH#!5jXRT?^ZO>3JQ!?lk`38K36m z7kq>j?R7CQ6ok17!uM`8;-I6zlcP*Y*3e8&Hkh1jk!2}^!LSZ2>ppL&p0DTnA1zlr zJnxhXu!#{YksdvF@1e*8k3W9AuYARg|FDcgciP6Y8FmWtuFzzalGaT{u6Xhj$BoWr z7v{M0-XATK`BinVM=fig$h)YiTwAMmbG+qpkQ=P!y=*oz)~{X7k%u3_DJPx6rO&y9 z-+KNFIpwjZV1g#G8L9#VSLMScTL^*IyzRC0=K3R(xE!?8SS;jT+KACON~ypP@49>0 z=^TE@p|D?&vH!XEdpY;tx1ELAE-Lo0andePXvz}GGEfwtS&oC4UznHsYZT5q`rQGY zxek;8mpl5MK7LrBbjo8-JnGSg`YvlI@!dW_FYe<{i7Xc39Xq7`1|8Vikho^8MN- zTefcHo(JzCX&P*%SnSSA#!bYTXy^{-_|dkT$G&Hk;pvZiwj=~P#cEr@hDKr&IBW`2 z)6i%Z5c*hCFwAH9=(qovzy12}v1R7|UwZ9FAAS@cdB@-Jxp)5yM;&quCQU|_M-(c5NUPK*> zm=QQ6I50+$riNxKBW>8oc5~vjL`jH7A;uap5RC0@sYV2p4Rz}SIenqh#`Vn;7!C^| zODIj6WmseA_PWe1&a>F-K?HtQx-uxKLfJ%-H7!Y_a%7e{&|1-XD)NGSkV6?FvB1=G zm5Nn)xl$({PqDRE1^mrs%H(v5pgi-PMT+u3>VE(8?NMSh6gpT^ona!fr;4US?5io1 z=qP9rMZyTGVwgJyeUC@SQkmSqqKJj`D0ZWDj5I==e3#${Dhb%S>8s@h^^y8oOL}ujyYB#lOsc6)++kTd8GDTb~_Mvqpo z@hu=h89}qS&}VLTo~acnD_6B?HnUg}k&rhKdwbe*{e%C-D?j%v{^5qdV&6e}wAFUf z;m_btF8fc8Tz6sw*{XeUk4SUS4QBL`)(sI z^RZ)|f9g{NIc^n6sxcLc8)!EsIAzlaR93ixZ~fq#Jn+bUWBWMk=ySvoj~9kgHv4sidy3$er*zu_6Hw8cKt0UutYnUZFf z!w)}<$3FH%jym#478e#MhB+!IthO>~`zTU(0Gvn&fra@+j5kABpTD|abnUEkPVl9Mb9JuXg zH}djNU&dd2~*g!QNM!54giGmk!x==d(aLcxnFW{53u!$|8QF7_1`utEol z(3ez-t8tl^IeD4mwWra}uuUzMPev^oU7b5Bu9I5Er;;j3UOEcrv5Cbd!idpYN1TR| zfWX97$0&l3YA=!idl%%SBalWd!8umdoT@Th;Xv@vo^H{YXb_ZVSPbZN`!zx1*WDf+ z>%=P(GPHMi#8bf-MJT15qlls;u?2w&*i@rpb)hIkJ*=$}qm*0j!)_DSg{`wxthv9q<-(Q?qh?i(nl?S8~n$U*YVd z&mUcflMGx|B-z2#l8Or&RFdV5;RvE#8H;dK@^K%_`?OGtq zQnX4b3t(8%%mnl*i(e(sCPFe_yX&)Dd-vzL=y8|vyeGVxjVq2i;1MR9Yk9+Oe2$M^ z`$BeiHshU^V9SYCeINh(1sO5VXIo$@5?5~H{~e|jf-_I9}S$2W80p(EPgsYg8?<5LEmg&IgH zk6Urx6VF{H%J!{Wuam_sR`{e`sYHg@9>g6Z2z^c2h_688tw#n+3Jx;hvqs9Hhi|~E zz~M(8%GyFitJ2jBl8Q_X4i?bwG33g^O-3dw=@Wr7B!39&s`=p0u#f(s(2%xJOF z+R*JTSBz~nTNVBeh?SohoT@m%5hRee+Qfjr66#a3s0Bq40f@cca`5qr$rYfa{^Ome z9F`RQ0)xeBUANTmp08eg)e`6ASdp@dW;2Pc5RWw(lly5|5UJks7(I?5Yu8P%XO(BW z%~8v&rDa=KT;R%UuZ|ZFSuh?L}YY-)?>*TW7zI%S)UO zc&AZhG!jo@9Q~nVX4j%rqoQ4XJw1lN<(E8n*?Iiex36M)Wk#c=aAAl|jF`~IWK5L1 z13%bu1B0?h!;Y{@CmwP#N3S`Ctvk1)oI-gG!3$+KQcbOf)vHrht~4~8QuQ%jk)hGr zlGubhAG(SEyyoj1+CG_=Jm>d${1P?XrCXL}eBd?jXOQ=}{;um{Wjq24h!O*eS{P80 zT2Zj|K2UhiHTPV}b@yG(MWr_Tb+r-1< ziU}I+OoYRNumc}0>*P@d8m@Gtq;z}pm~bah9z{{7||Muiu0n6F)6_)=6iF??%7mpT1sEhq-bug z%fu>6Fo9l?(<^!y15OouGde8&*>>JRW zh7}tuX?p^cAw)}cuf^5YMz{1(6ny7_|KQHeS90!g&*I`!U(1H+qn914kxcT63qH<= zu6-W;P)NpHJ+Bxz>Ik?s%3_p52ZJxA?7P&fs&d98Rtc`Z`}(m!1K`|~&gZAw?nfI# zl4(q$ai!wPr;Ky|Z@&9B7Ul}B{_pE})ze>B|30-DXB_)@ety@rHC~}A<39B%A)s+F$a$ z$|Nxa!Id^rqLGw>>Pgj^9On0;Rkr^ znXAZ}nxIO_c0<6$c|ZqHIxx(;+`jobp1f&1Sow|9F6C3-_(yqfBe2ky1xo*4*4{f@ zva34t{_VX_sBlBy+d&=F>Xw8O0)a%7P(UCM$VS2loN&N#1}Db$j05)g^E1XCdp!1x zZE(V2Fks_^0V7OQL|GstltU|Y?tA;@3g?_1zCYGJRdu_rJb-5Fsi)P|Rp*>KVehrx z^}g?dybU`~hUr;F)(9wV3C_{T6ROx!Jbc4Ow5j6KSc7;d9Jj=*3kEdcXBX;Hf*2nWIowzcv zJhw`wa#EEEl7ZA%jTypgA!4UBe`Dx6sRoPUppMIM!Kp`JR7+jE%BcZ!SjmS(7u^?_ zxF+=282KAChJ;Wi^w%6^&&$IaC1Hf91uBK>kL?11 z!RUQwD}$8vc8JZmefq#7YTMxz&zMT(6(F=H`GdOe7oP#DsQl1>`; zJaHYr_R(+WOAr3}fL}8@Hc#x~;xpeVEci&y9bS8l3Ms)0d|vbd!5fT*EY?F!&9~42 zV!aXI#`|v^k`Uv#C=-i zl$hbU{Nl^jeeSle+{S8WRn!v>8dDjjp|Q@3)$mYLw|>aa7)Uf-<#E>2@AfHrB_VjS ziA1uG6UMgfTgh4}S<`UWS8nH~n{VN<$DfA!cq5w}oFFQCWO6z2FhYptU_P?y)3x}-2OgGGxqL0 z8Rseq>VUHAD7!*_R?5(9wImBPYTfUs3Yb6AdJNA8o-}}rvIJUeV;?I&MZ+*r4 z&^o88G%L%FqlY@IE;(_bwSd+5ifDr#&uj=>_{vwZ9MhJ@W z!YD1yyGa76(Im!j+rH0^{e~-E_-1Tn>8+L&s}7}v8<00OX(pZ^6O$Qv4j~jMRS|+E zOEMZ+n_kz_>q*HIEe$L0xc?5m`{&=ud;jpi(ksS;)QLu$pMS^C4{QW#wV!50F;|m* zYE(O}pY@~RoFqc`AH0?S?=#=ahwl1KtQ$v|C!5o}`-=ZWmT8hy8kRL%4f2MlfkH%8 ztd(cc*TRQ5YJ5T~Lz*N)U(pCrR(XOEYk*M)&?HI7)08ZcvW6`JWiMb$DZ$k4$4Me| zggU9KY=!kU%B3U0R1M2H1Jz1RF^CIe7%=)bPyh@P{`hAtk5{r{8Z<^F8zZpa#CTp| zimw8TN4m5oXVICW@};!KuBD$b`EmpA28{|%YQ#ivAR;{Lwi|{QbKoH#KkP^9i*iDT z-y5h2LZ}5P=!j?(y+C)>(_QgwnrV=v4s?Z1o%s6e*q%3dyz|k?EoRF~ubXBif(-+C zQH&V{X)$q;N3rkNlVj(snKwD_^p|kYgZH46nBkPAM)e{Ml?h?U%`NAX*6gp*TCA6&)@$?%&$JqcfRU(#{2?adHQ$rx%>Ze5MdPht;i!4V8CPJxqc2rBWB6YNA0kR&-5tAM^5?Jvs;fLo%O^o z5Q%*9ZodO_$2zoTr=*K-SrQE7sixIT=ygQCy8r0YRJIx`QC)b!E7|w#lY^2>sGtg# zL|b$t&}cQNdL>>g85zjcfvWV(9qF)eyh++JBpW;wN(o8T$8(h=3VcQ0(oAnQhRRNO*nyrN0d#1_rfHppsmFu!_f~^em$CjC!@6#_GI*Xj0 z7$E$^7ygllo_>gryzfIyv?kUa`@=N{r$uKWw~WWAZ$o6dVHe|p3Jps;7}x^jzF)J zltN>57i}a+NaKncg7ji?%8}%nBvaTpCu)WGh-k4TC`%79aT4DUhqY4T5bvbgUR?Ma z)SfyTF%1inNNa6|W#xDe*4c6G;CRN_u2d*~qi}t&Qg=Z}qTt z+|oO#qLpY=E+0my(O!4nUiG3^anA$yh%2UrvL`(jf`Q8SI4NzACDKDh4@yn7&N}|? z5NoCz$y5Wl($eo(x~m;A6pG#iBwC>R4FU}UwDM{Co#XUY9InT}O%bcm&R~2N8P`hc zym7Kiv>2WlFaMutMM5CYB7aJ`e{Olv16Z90>EM;;aKM9t2^K+sgB zXKArduP5(mtw~Id@M5IivVOgkJ}o!gcm29R!)U{W=U&1WzVc~8tZBab-1Xi8cRhAD z+CZ)ovrT!->nt9B{7ICulqzufrLSGL4d)zRy!A_%T+^OtFgeqt>^L%V zj7?ZQw#wQ{_c_UlAwKLjO0bn@kjv@B&}uZ9nVlK?UbpD-^r5GD^67oj^*D!QLeXw# z_z)DlkS)H~)96h{BduC$eKqCYinW6Fl>m8VY3nfXOFgcU3Xh4=r$AFSJ_(T2;;yNv7Z`ZS>8y%+uas6OEBpuV!8#8?e0o9%JbdUb{_@t};3qEot#$iKO~xxuyO`Ua{32S1 zLC>u;RaDhTqsTb_*2%A`k;xzdPHiISeC)-ALn}|Col>*{_#*B929bu}40P{2A}9?n)0#h3;A^ z)nk)Z8zx2H%y?d<69D=!e`t~3T0x#lp9iS}y4dP{6oJsFU?S^Xv9dxCSZ-7`bhZk-7zrAX66y3U%~3`b!6pe%PkddJu)yY}^OBhe|^YdXuG zP=WReS14BIK--L5XC&y@+Fr<8&ij!{(+GL##1Ry>u=LmZR2}g=5RfSh8m?`$&M9R` zLW{(ws7gT*leLQIrYOzXd>II}8BFv$AqYB?riRpLGOcN(n#l=`QIfuY`O&|o+Mw36 zxxEJ;>bt-Y(DDk3vUGGifzFzz->WG4LaI_;4LZ@*?y*LzK~?Dbd&gz2m%RA3gZidU z6t6yaJwM~N2X6u8kPexOJ08759`?~~y!;Y$OJUj?-PFAHlJ#Yi`yRfR3og2s$A%&0ti8L%6(}Dkc zBMcWsneW!`C<0<=Bc2+z)M!%L%?TQL&O|F`cBaLiQ)XzlMA>!A*ST)A;H{@BEk(bSfCb0o zWX7)DQ|vu`isr;~_dPzyzcc(OiXNW0RL~s6)$}giOxikhNm$BJ9alYW$z>|6qw9lk`yo) zo#C9uR+?VdaOjYuD23wDw-8bw(}bk%Qw5*7{omMk=&7;&?%r~Wm|F#6KPN=B73b+u zcjiPv8Xc8udxPNB;C`*o+09S>3-g`BWBb}QdkV?~QMhTyb4{x)l2)VR+@{mPI#d5g z4F1AMLRd@fgOakz#8iv+WKNRF$E(Ux^ooHRY(S~-0b5y=HnD4~ipr2k8}MHK9B?$k zpuw9qYEVg7HwG@Zo?5*&05|I3qCPC~Q8JdKI5F!7_q{mD2=A4aT?r`EAuz97oxHO|tCoo?}PFTG?oRH~4 zv_B6nax{EGYBCH7YfG^2@imSg71Efq4qH|PCsB5i8oUb>g`?Z8=ye@s;czZ6VxJV1 zFVgX`u6274m94#<1IB2+{OEdpI>4Uor*P#(S5j4hiHU?nC-_ofykgr-Mj8~pki|ST zskpBy2KsKu&&%Km1%}7$=IlS`B^@zspk9=9o zsbVYcZn47sPkwFvHeUJ~oT>1sW7Fm-E_m_!=1#ZXdkd$&U>m#k%+Q+3F-^_3lTTvP zwi(h^&gAq2W<=#Ob`1gyro~!*6JYnQ-CX>di+SzqE@$)XcsudMl_hkl@g_j3$R;%H zO)0JECX-tx$@3hX!c3-sI9)zh=|rarl`3>@$XYoji@cB%*WnY;#pnJ_BQsn4PF-g6 zeKCy+&eQKX2!>|fATbK1D(QrrNt4De-8~*Wwi-=-@U7n`9xrJk?EE-s<3%MlIoW1% zdV+kSAJhfViRx^>VuNxeDS(W(cdDCn*08hVMqtjhvb!{2z#ytiUk`XIl za=O99R7RQ$D&>Qyb<)gG*fs8a;-h2Vzw||KV|ls9;C5hG;?T;VBT>i$-*L_V8|31- z#$;=n%g?`DxFJD;hNa~m$L5!CSbW5;eeAOVDNDq4QZZYt(3sLBPM7bTLxSe#GM#M)*v-p@S;$`BkM!G7P=AS&00@cmJplBd8jkCu^mwF+=@{u5S!bG3*L; zun`k6k-)|;2k|-6N=K{mcoTSqw@Ma5>#01HrKRkHQ3;7k(*fStuoPEFKPSf@A(O?zwL`uuEbXwZ4$Io zgu=4A(8uVUiK(2j>Y|JRB|aoUDhk63u)*~YE>LzYW!DXFsQLuQH#QO+C=@G;J^EeY zbSM9(kzQp=j0>bK=~j=#ah2j7Ij4RXW%U*h{;|E|G)X4*5nXzxq-`u?wR`t~!J zoft0I2ag}%;KDO<4BAPy=mWRhe-js+F_hz7aK;6+rdq7}4ws&Pv8XFX#=}qF$Mzkw zs0l-r1eSZtv{Hp3rRr83Jv@(f)y9Tt^$&+(X+uMrCv4fWjh!c-OryDRC&kj1IPC`Z z%B~U~i8G$G)u1)gr0hES%avTunvlKG{bOQ-LM;Yu!3KdIv}0&a!|=X(u4p4LEO(Cn zJVCtCK$=0(g@w5;?ac|ZyHcvMi=|IMx+hOgHdt!~9(eL=Joe0^oVn+$b-VeYYkz=` z{o6mXbbJA-Fq|(4l(uAQYLX-si}TgqDrilJB>uK!W`XctJ zJK{Nu^QTvX;|v65H_h zf$lFjHi)Iasqy>+4JWqYI>fH6i5kMOQI}gsmmzp+=R<+I<6Nq>kXp3V{DUCHgj%mW zz;|LaH+aQhWi(ognKY3wXRWaJL#4q9%hy+qqVFjBo{7l@%^Xk#4v$GQl*&kyrsF)F zwT`p}jxd&r451onlHgOLlpjJ;M3%8ubjuF^aPvR&!&km*-Kjg{lrwnmkN*-|ZRwG5XGtq91EWQKy`h=Thbhye>bsVm!zoMdzc!(SbCqdDPm(xSh zV^Er?Q3CI!JmN}E(WzKlEhu$CHl>(~7P?uYNfU!H0yFC9IH!Ue$kIZ9$;Q^P{VuE? zCm=49XvuDsl59jKkUG;JX8htrD~3k3)K7w07v+A6o9?@QU7!K*nsYDZz5`$5RcEhn zfOgm8w_#F|I@caBsK8BMzmfM``*VZOr6%RV7rmM<-gP~fzv{Ae+j#20KKh|cbE1LG z0~HlTw?O$GRpnVbvc{qPN6`On2_jBdu}&C#pxJISwP~7GyT$72DrSR=ZW0N)FcOeT zBPvHpfz}Dhl%dhf=q~i3jyL_r$KkY>`nFbrk|ZGpyYY+PK*4r!dyaNd8^QhSM>fr& z*MY_3eWn);+jeiEU-t2)L?s6A3!2S@W;113SA6i}f6edy>~F8z*QTjy{?~hdhadaJ zcMGXI8l8CW>2uUMO5dZ)uCJxEfls|JXc0*p?@hr)U) z=XiGE*|9+5l9yh_=9y`Z9F#?R)222%cFf?^QhZhn&cRy8vandNwBqO%8dOS9m6%+~ zBa2F6xu9OWlw#Y=_`Gm*@fgJNkcxqV4}xq~g~OH>0jN|&RN@*l0(*=STV+vJ%(S+R z?Q4GRsE{z7BpPyydy*7pQgNl!1iOeQgL?h8~^AWMJ{ND}GT>wCks zgdk`|nhvLUtuzWhB;1d@Z(??0YU9CFfp!rgm3wq(#5eN02QM`UfCv9v|2aT5%m5+r zL6W%Ms@qVJ_05duRXU0Hd+ZLcNiakpLLjISPDKcw;C+r5?mFH&LXEKvcGFvz3KKYwoL6^w@)8DPc1x!Q<`9Ol&mm<_lm>TVeP3mzvp#!y%{iChz30_uT)6K2yB@nuoCb{`WiALG=ILWkaCC9K zO!?9mUy3%0OJ2G@Sh@AyTc~_RQIxpSlk1#q(_5IC*hFu&%b|mZ1o5jNRO9DAPE|2u z)zN&@(`q)P`CekMRmFo3joUiUOwHhpr@~SxPtt_ew1&*mb8D2LL&z*lGJNWz>F$Zc z>F9ch$Eis08PtDI{K9igKng)XqI)5+Ck(Z`x?VKOI&P7yI7u>$k#^cymddrZLj3g} z{^^UK;Hd*ojqUEDmtM%v{_uN5%8J0;zI5~#yOf=R;KVnf4nj?C(5a^CK_i7!`wc5e zE_kZ4pe#$gv$Pt~G%#3{vSfK|lkgm)F(GZ{O%m|lv9i>q+bsljO*CsoAEyj=J@u)v z?_PEJm294v9Z1uI59_V*!^UcpPkrXPfplL~W3oWj{F0$zlOVJvG0}liqZ4@G@Et66 z=hkgAF)3GGc+~*Ok_1somCjqNt?2bDjvenZzv$>ynzWVC-ZYI#6HKZ|^Ln8)=)^RaCL3m5v=t>sr7Ny^xODvAm)nOES(mX}mYn zzPZN+WKXSR9x$nAa#GqaBvAq^w)<-Er0Q6P@R6*U<{8>335NO#gCa{)+7lU*(!nzM`cVwmK57VT8=2>)afb4g@8d5v|2=3k`i+#S0N=Pv%T-YU4u*1Ujp5{CI+Q zlR$$+x5-Q!Ri@BS=q!{h9A2Zh0T5d438P%A zuq#%Gnhr|XSJS=#03ZNKL_t(%1uiw}tG{VRbJBLh^cIEA10gZwtqEqgY?pFE>`E&Wk4#8qS#isQH?7;>Sv${W z_tsN5|I}eQ#0Sq^PuwO>v<8%s?ww^7=oXfn@4s=~HZFV7WxQzbxon%qrBZLeFSadP3l!Af1Nh ztf93j!6Y7xud!WG!i;|Yxymm}+-@<@+6I%m6z%PX#%wAakmzL+g+pkSqEt?|UkGd8 zYpP0Nt)g_6(mA|>EO-3oU;fsH#$`YHT|dNc{^GCGY_&*q5)Gy_Ys&@wHAkWw%x>92 z+RTvl?~ZgLUJCEg8~6-prOAvTjZ*V4)K+4HrPo_y%hvIpMkq*{hQ>rLh=vIyi6&1H zOfYnNj^k@3r7@H$;lV@qFu%H^G0jFe6 zbSRwG=uDF~McET-^fD?pLybxX&_>!x1muAXO4d>z+LHu^x6l8mYuOzA*_PdSsJG zG~exZSzTViS&K1&>FIVP)itO}10g3jlVnV=G}q7>8jXZB(UE*pzoH{t zEX3Avw~%{lK1IMZG^MNfha3Kxf4ONqYf(z^^FR0={_NL2zza@(L99VSuj^Qv?{nn9 zGNH=QKF5{dN(S9P6^b1v?HJpp>w8=;3_5HEb>AGVt>A zU&h<7x|R?A<_G!f|Na-8z57gD;h8^L(p{7EJk1SWOM7Ic70w5W(ovM2SD*P#UUB+( z_sr|Q`p?WQ^jYbaVnZH6R5(bG({3khKPjg@X$VR&wW%Skz+*6=bV7S#f;`Iz-qn>x z@fZPay#M;K^Zk=o{tS(5sHK1G(8H{BSLC}o>d|%N#Spmpf%U=4wwaUo(W`!J-FwFt zj&c9K`&jFCIevVR<@puX=GQp(>>Nj*KE~SdHR*b4W#WHMLa2*=F400$D@9e6%+JsB z^ixl<|Cwib_SyYoUwic#7txxWz~qT!>$ym`L+S~sh0LOxfyQ(~b8}8(CMBCq(dqaU zpmIf{osi{H`>d)0Ybzlkh0(02{=x>oLj`mbvKg4%kuh^}i`m_i%547MqC(gc`K1f9qSuyQ5zBZ=VrAiy%Qa z0g7HRKr`#M5I%@YFghV9C0VxhSSLZqE&Dz_w(XandjY3x-OY||TiH6hnN(#=Wm~!Q z%pc@CU;gX->RbMvmz;VL&8eKmWR5qm+Fb!{Nm8OJFOV2RmZc(D)*#|frl}PxC|%K z2gM_#`k>U12X?|-KLjRYhwhP1lRgIEzD6Q7@D8YoL5 zhF$-!JgXr_PJ&t(Em2i0b&2Aje$|`|Eg7mrVhp3!K$QIWL64{4KnH`03#y6R?W}d_ zTF4_Kd3JV!9XmJUgT_Zc3hx4)l|BcaUf{@)HEe)gyC%s}N5IC2Fy6%jXfE!zzH{PD z5#j@#WCrU?tn>WB``^p<)tsXl#9>5n9tw&Sw4UF7rFJmn^|65#xHki zO->T5qqEv4l%iUB<7;2fcU}8-&U(R_W83l;G24;|BQCllrHB(3ih2wPO$^W@Z#}vJ z6H~)1;Ida<%B8Qkgs(h&Hy^*{pZV&+&jJ>cXaW|Uh`Ob;j+3U&;LR8O6fZsXjbppJ z@0qXiPq+O8{VFgW5*n?HfQscV>6qJUB{Ul;Vct@%I$G@pXpOC6Ko=m-a|+YLIkE2! zG0;#NZhi2}l(r;Gh8_uTc=TB19)!2A2674OQ0^R5SyM=w4OX*hX97RN(mHaW>Bk z5tVk<=3N*5Fdw|_&!aQ1n0@6syMZFZ_j9_PK1H`Al;VG&1N6I=)x|DVDUw1T z#0Mcs#Ys_VQ~Pbv@AvtmkNhz^Ht*maSH5j*-{+n4V*dVvALi!UZsoc!e2(jHzKMmE zWt7%znwgGsQoy8|Q?~Eq+G}3Nx4r&qPCxl2<3A+S&$)_@#x?M)BJtMKnjG&eD;cpN z%@cGQu&%;(OY%k=lSF7jB`B3smVv4d*WdRU-g3bY#m0p)_MChQm%REl+=hnb7GC{hGWR(gaXQzpbDM&J&!N zhgD8+G_8UJY?%ffa9-Mds8Ll{tthG2q>bj8xNZex{S-c!pmoYb*|7nYgK0o(+6*Ma z-|BdtfC%8B=vjK5lA=h-+X7)o%s2GY3`CY~5E$0S2u?*ZPwnL{#`PNIBcNj>GOV{z z53Ph9t9)$86v;Ee%6lppX;$L{S(@Tfk%MZjDf=EpO4djzs**;QQWh0+M;3YF;ip(w z5U6N&Th8QE8>iQz4tc@rVFpadB>sogUl_>(=As~Xqst@)3(2WP1Dn3-yI!?4;~rRtJb+Q))0~3 zxE?()Sc*Ljlmb$D7?zjU_ia&1@$whGl9#{mm00&1Jahap=GLB}ZLCX%l_?FmELNC`S+ty@6I$g?JSl2dm2 zRFxG$gcjnf(Ng;96+P~H^bRgQ_tJIu&gi)F;oFc>v568nqRE`Vp#7@LSD(0tSD!uf z-8ivh=MDE>kH=%3Bh?8@E30%@mhl$oGbni_tpwY(>lo#u+cb@aRJL5a-=eR^aLx$$ zqU1}r-^h1fb?v(E|HP#~#mi551@}CC7Xi=S&3m}?jLWH9#T$R;!Z?9=LMB0#_fcke z!tmDPbwE2UCSMf;hu9hzt6g|Ku#st;$raPv4DGEM$)v`oE)s(S&e+%xDsD5^6dlLX zp@Ons(rRk*EC*}p^?LX!l@hC$=dvm--f4dEfBp(9t1JA-+ut>Q0Klaey@pFK5>n&A z!-tq(T%g9$>(MFa$+ArPgg6UElf=%O&Xttif<|+kf2Fjd zy*a~5n?Q63l!fKU+%miOOfoTz}R1pLl}%zy1(uR{Nefa4^xDpxJN~VFha)rE}54MDF#(B!YrO z6Fg@Ft-c{UqUHa z1AUB5vmDx+GSZeIBpx3sY*i7wlv|X|(0*X?2ggCO5T&+xI-i^H-gC@I5Fyj-p@D5KRdK28*g2|4>_9$nT5VY7sX0p`~_RyN)+m zV$47*Tu)53B`e5olviK_t{1S&uxOW2S%^?LWNAv3T5R9Z>pP}4WlU|#NYez1lR9u8 zx@&NJPITf^?VK!cu(GmBGF4&{C(=o?-dq_Nw&WdQ@zL%MtC1!oi53zdlGS=;SnHOgSp%bTl-CqRDdnA5_5g4(N>5?~qMIJLVO^jxI{Iaw zTfcrcE?5$y(8dS>(E5mw2!eRa*Kb-EXpD|dZ;d-2x`W8wq_9r1koqQ(hQaZ9aH0p_ zNaYYGraGJP)=B`4nAS-PaR`0SUw-66yzRP644YHVu>8+T=4Dn^@VWSD2)UZYoSe zP&Ze~Nec;h?dfz1vdK&m3?MZLJuh(OAn_d`ng6#B{1*2`+7&##YkXB{8AcI;%= zj-Ai>?;DNE_IUWfXNTopk4UIPh`bd=-bhH(4Y(Z!vWAfvRx3)YSnET#fNrOx*=S-^ z%G{AP)|M-j&q!3x$FKi~u|VUB*S?;uo3}E5>^LB0kE`GE?PL4=*Ux>1BsYWp7fM6Y zhQbzyy`y1sbRBK9%j$C-dZEkFaoD6SU)s z^KRuOr@dzEc#Jljx$8{M+%=B6Zg{?3#jpJBd%5$8TLsm!kSIYdoew;FQ<0wMsUgWSOjf&?A~$$#Ar(vEsSzKIV5G~lb#gE1_|ekBgi)YH72L(F_jH!tlKIQA~)F1(I&DjV9g0heYvbJJ!Ys%JLo6zlzIep*Ec>WxX zSUPZ}!<7yl5;Q5A1f>#C8l4C+Nf{-2YK`cr>kAlJ&^oq!RwLyT9qF=E@}Bn| z?}7vwmB#nM_M!p?Lzd<=(gwi?Y&3mQ5kc9$a|_d(CL^I!arn?YPd#~rgHJEeTa@kC zGEh~5REVRwKp3@k?jSmhQK&*-J`g!vnkE>d0Z*D5k|d%9K}cbL^~t~D4L^AmpS4HRz^f#U~EuD!i-2F*i;=Ix3w|(#Q@44?X%Y zzw_t6_YIx%)&7d083}|uK*JMqN67uK&G^XB!Qcu{xmF3+Cvt)Yw@@@i(6x>72K5u& zQ0O+;ti+`iKB@4jl~?VM86tY7YF9%cC>H$+TRBmf8AFmJq`4+Zp{zzYQb?1!&)oc3 z-tfb3=EI-($cCL{zuD2RR=D$t5A(;L`*sc-zn{w5Sb8uRorvm8NfKjHg=5_9RvU%N zJV|bF1PbS|0VXCj)?13c#}x+cTJ%<7X})Cnc)>0AT+ia_`pi8shHt;}%?zFc1#iA` zycGGbpS=zd_YNql@*HU)EcSbHUh8`bYC}916$eouqzpzS96Y|CCyzchwx26reFby- zyFC5K8c#jm<=6h`XZYl8|A&6{t)Kgc4m`;B{{DAz(?eezCZ@wm?|`%PQ@{Vy{LSb7 z5B+k(Zj#^7c>LJC{PL%+=4<lo;1Op*>cfdD!ho<$E9?;R=xvLrzVP1UvZ zmo3F=N!7ROB&l^pW!;FSBCXWGkk6K$d_uG7q$V@lC&?y^^x=B0TJJYFo)@B_U=XT! z8&9;;=rlnoKj2tsE#@#nl0-V&=^*S|CzFOzMCqlM1tKO}b&FsW(*B~3*1aBhya(s; z1^C!ttl4PNY~@&A(Ov7}Y()stsZgh|X=ai}qY)YJhJ*W$bM(Lxy+u#xLTEs5)sp0p zPUM(+v5SF*3$Y8L8r++bJ)~mplI1CAG5Z2yHYzn;=L3yIpzFhP2l?sW{#pL_-~0jB zzW%Me@!~gd=ALgX`Ug00@E~8j@p`^+;|<(?#~oC@Vqi{Evu_!CevDqZ#f2rDbC?lr z-rU?mEVr1bvu7YjbgJU`+A-ey{$J$JKK=o||LPy$;`1+K&q;g#ug7U!$$ig!fg2wF zM;FhxlZOs{o@b8Vimz6|iX6Yr^tISVMyE%4FW{*BDy8j_jWp|8UYm!+ z5=?@NBxh}))s{Bg-WqH$B%z7zt+71cr|MTELGj5ieS&wr^@r9S->#iIsek#@^yFCi z^tQY1;EAXA$#sg^vPm_qc21UOC{+lFwX|Yb$5P}pSk+K ztlQVAC!bDtInZ4J8nFMVRsQ5-f50d1_!zIf;M;iBS+C=alg|Ek9dJSJ%{w2zgTKG+ zZ@K>dFXEl2(U6402T2;mG)iQ+3Qc7ze)sQwk3ak52YLJJ-oX_wyMlA~zHq}b%({Jf z#{-9Mp_bo zZhB|N&NDWlCp^|zN=hshD)EuMt0AO>QnNf?vbrFXYMvSLEX9}^%Olz;>ExQ9oW2e6E8XYCG6S0hi#j;F*7~G#N-6s zZjZxkOz}0tG?ZIDLsMpi9XWO^)@W9}ej)bh{R&PyYYUB*rmTAO`>Wt$lQwP8WN6)B zd9`41xkpeL)0?(oRF10xSjEx(hpGCd)Xi~JUKZ0dQ>1AsahHd^+fHTM^cFORvMhP} z@Y5`I7DYb(mKlTB?b&if0ZV;P5kt>CIJCi$Ma7nxo-Gu4kfWj#7#;Se*9k+PjN0&N-F#)&{+F zjYHLwFj3MEYv@dxM`@Rn*cQ*+f1J*~615~A1C^`rNnrA%gmYg#&Fqc_J}K#!Jy4q9 zQx=c+IeMtW@-YY%*g|@ws37GPqcqBa?UhtrnPl6|7B4yXJWk!cmz_IzFf+Re9mJ-+ z>w0u;m-*g7=F6w3(xbE|N{n7%D%T`s$Mi_iFN=JGY!su*={Dc z_erLDxTHs6OPms)7#}3a$TDdI9z61F^gXW1aQ&R_JY;j5nMpT8P*@LNd+$GgUMDK?;Q(k%PjX6c=*tReC?TgS?;Y4 zTz@r?rwLWh(eDUBHr2w_GAcnUg>x3~9a$qG$qj40K2z-(-f-b1yzulFuz6~hcB4gQ zD^_~Ttn}tNxb!g3EPkERuZkI0jYtPgAfeZVPDje>&PzaPjC`o<2bPX`iZzkVPfVmZ zYr!dk)%40rcx(oerelph{TUzsCGi9aayQq{dJhhiU}! z3B$yuHbqsCnG~ZEjvZSPnW>ifS7oqydy_1eva)lIOlNeKEX#)r>_V*8c|i*Y9X{$3 z&FIpgh5?64g!rjiu;cV8rnWcGEl;Oh#f88}e&Msc=G^s(+BY+vU-#C)pw?{r&|C8q zy^<``gq$IlCPcZO@&v3zc`-)P34_|JKzNpVrI*e7b?CW5;3n-3vsEFb9MRv96X$WTF(>Za6dLTzmBiFP+J z3owJ7Yb_3qwfxA3Kx!aK3|SVinIjmFbC%#n5D#L%4i#8hS>ndKZ;JI`Kr2o;Z9Bbg zpSfoj=^sHdy&ze42q7wYBK#1$Y_7-3BAc8Tc1VSRxw$!x9h)00kYF&TC8kxXBxpxS zVEe9V+FK$7+!pvg$subhd{%Me!=E8}%F}EofT!q|@zpbwg&=a`=_v6UNS z$4LrRRiaBRI`Nk~E>{mlQ=s2*RPzT4O6qRX8S_)8L>gtQ@xqBCjP56`rbeq=_at6(LHgSB|11C>7yNMdciiJo`{Qmyz)7>plZ=4po54 zT67TQRqzF9L)K2Dw?+V+W?&3m*W;`E?n5c?m8GgmK}BM-vrr#I-3wdAl*9WtlgI^L zTUzCwhwtRR{dZB(#T$oDG~O73R+uz{;8D&JuqZDU#&|`)Q}Wfv??rn>78*=tn@MR< zF7kcf001BWNklQ1?U8NUh$-^xUp>$pTl+Q9domUDjYUyq@Zoiyoj`$wk z%^5MC#S$}-#ORgLZ148gNjZ~JHXekCt006@;N#^p|MCC)kNowQ|ATA)M9O1t%jE#4 zV`9nQ8moyT)I%XJnRpeOYHTN)eMJc53^^$+nt@>{)u*HyvXMe?j-j1%t#lj27G>YZ zhrzHS88jtFoBdHuB-iU+70jftHW#`soZh=p0L2-A#wL^rPRUKPtQOl zcBKa)-yh87Pn1%c9nxLVAgBatn+(~&(7^L^nRW~yu&ywAW!rEAG>?~R=3N@0RC}=N zvOrwuwWGtlD0=Hg{EP{Lvh~Jtuml#DADS(FBp}qyo$vhe%Qn#72vN-BDHt3+y30SK znx(z6^L5NZ+$GlGwnS}xTK|4@;}DJ3%=tA0!fO59v_v#T<1Q_h#P$Gf^Rmv@l6Vi* z>}LJh>A3x{0aWGXYcYR}Hw&admCgumx-$amu(IrMY@aunB%mt9k&q@lK0Z-i8oF^a z7t{I65;2?CF>V!6!aOq`BB$>Ta4L-4A$Few5eOQHBaz8_kziA5m2ik?Q0lew@rM`g z-W#VWx|fPwzO`NRs$9!v(^I`jOo z@%Y1)Qab%=tzVgYvVn9V#<(jX_GQ3SK^WgfgDC_wLcelzd`%D*Blsx|d@Av4`8e3m zn5I`z62wRt3#BMO{rE(yo*w8hGs0o9!it)KmO%-F%cW84Ag&ptQET0cO;!7roP$Yg z1J+V|H7rfUTB71fqpHmwneB>hZi&QXe5_WgwZj)c8r!y+Ex6dc5lvo{hHtINEd;th zM(@P9n$ly&C1&f?rg$GufnF+GACyfw9o&7^JwfI?tT{6zriDSH_vVCAANh{3EDK># zLN*j(IFyreBrln3y`rkr)+j@Enwny=)`zzTvk`DbVG7YFYb#nkq4!^-s}-xWI(Xe( zQV_NCIAn+`EGIEV%bgd+(ip)wKff%^_}54@{6jN9-L_hrZLWY4w3(5TKkzAg4FQ%l za99(gPg52rU&`1sv0X;$>v|`jsq;c=r(XwSb7Ujp#Fjy)GNhB1#Qnp8_wVjGoeuOi z`1p^X`NQA*h4V*eKv^>!nwndhs0|t_HlEnXNxGlY-~>J9B39R6yDZ5^ri;j=CEIl; zQ?<KBy&|*#XhwI)`=d+n5^XGVCF&U>566(tK(y3QI)Okd$|%Yq1!~8n zc3bD=rz_(e=$C<3+$w6$NYK5q_CdQ72qP>)zKOm&p5-4c-)$V=e*JV1k)CrKh_>;3lu zB1(>#8LnIDjBDV_PZxgt!-eh9y?>GEv*zd@zf}R4=^dS{t5p#vBR3JVByFwik1- zBtSX|%Q1MOVO47qu_1Z>esNAZ9R{(7mk(mN9h58R5_T!7NZ7A2sE|S? zMx{)0ZNl75vlSR=3B*N^MIhRlAraPN=5$)w9xonB{H#ZK#y*1Z{w-HvGFXTQ%_CWEvZnsIuwkd7eBKo%vSrk?wySqA?a@>b!tK~#_) z3+ zXU`x6AtrMwG!5j=+PigwJSn*mr|e%we+7z*TA3SQIR<|FZx-^&NP?fgoQbOyv-fWn z-o8H&^DxL?JBqg;M&P;`vFYxRSYoC(t7P&LDAhJ$kieTaN5W$8W2tbt6jJs9YlB_Y zGaMOS4hxXcX5)-Uv*AiX;BZ{HJ4R%I(l<)o%rZDzaytCyw^DCD7J=Qxw3lkE2(eaH zigQMU1(XzJy)~@j^V)b z^-8}Er1@+ihpbzxUM#3B=~+3e-^T?;GWo7zh+2{aMF=gUFT$Vx=FilpZk?ZCz3txW z?n3zd8Op`n95vbD*1HnI;Bbf>mODQG^u+b4q0RPB46b`oESZ|?*a!ObZg()ae15uS zYE|lG(5{1Ceadqcq#0?ui?YN(ikYFp@Zli?kYNeOXv6IHRVbSehU``-91g;=E^Mu` zEDJH%H015vxI7KEC)-P7l5JmAqW~c&y|tYbIDGyN0Z6diC4Tq&_k4c&%(5m1rj6+ts(!`M0yu#^W;mx}fkLNG6OIxv~y#q5=JCTpsDcn%Oj)Ov`kg| zo>EO7n3Aw%RxvPE*+K}U?`

_PaaMD)cMVZfH#M1TbZxw2fs6^kEXZ7~}5BhXf=fN>QGl3!gtV$~LIo22DLY z1dhj*s@8IWK}yzh7Y|(JdSwhD#zah+6eF#98>6d9swJ917m*YLAq`?)$vLpq3+rkl z!dp|q5-Fw8s_xZcZJiV%(WhXx+Q~~IhQQ@|*`e2)tT7lar>=Gxvn?SulxQ9p`-7Ud zUooAAa4l!rxpDXQ9u3NRp9tf`m%o33)jq>$kbHEwb-;G0#rZ+P7{-r!{&FF`>3sOr zTVBR9O&f?++0{v)Nh9m=fqveI!_0s#Up8b@a*wnsygXfL+b{xN3Z}>Rb2|i?;t>}$ zsRcprv#Si+ur^naWTV(C#4VG@ind6&M*5dwsKy>greU8i)*TiONECj0dFFgARy|AO z!-s{?;pvkl8!<(qyZhQ*k=sq@+dt|o5naxQ!^^EqdE$ada`#rTp?%S=b()*a1KWN| zKztz6M8SUhyAM2HUwHZBGe7?D1NmS@)(|lSu4L%;dF7kdl%r+-Yi`^zj2|`+9I#&f z-9zU4-@IqN25kB@G_Jfqteh{Et#w|mU%5LOd6GEz`dqnxb0noeADz)V=ZldWk7?n! z+!N!G%cF96ezxSXzWSW=GrUsb*#hW0(qhu^SI-xRzr>Xn9^PiFLe;Gb)CO#(oZuLt z7Pgm03O2Yh5V&4VTG*Z7xST-6#?ebtV#6&25-}!9siY`|_=M!6;4NvFAm~2PtUChW z?V4z96;wFg9nn^4+eS=w$rCMz(F(&};quZUJahLx6O+yKD&0eBzzEqv`R=zTLKS`* z8|Saq4d2?vki_qP|AA6EPmdcfFK6!GTFayhXd2Xhb*Zh=W(;iVaonDV$}RT11~qI0 zcvAkVjnYtL39NUCacE`)7A?l)i~-#8^EdkEy?$Zq#LcVJq;kC|UwcNo*E(80JdV8G98J!84*cQo{=z^0@iQ-9w;OcpmA?6Q1S19cp^Rsc6IvVGpf}aoyShya99>DX zHGxfR6j4$VVlt?HS;QyXssSFu>oB#&xhI@h0F1To(_{BLFBnrennEI_xFZ_Dk(CJ@ z&r8`6W*z&p1LwRrB)szg0)$mq?gA_zRnTBL-ossFJqjUo#LcnBFln##&8=sdg8A;Z zKDb;vm+RPplNfCg#{jK=3+1+|CS4YjmRcYaH+v%<(SE;m_e6~X9x8_EI}+t@5zQ& zhS;He*`5i@Vvy@m`R?DIc>KpJ_0dp~5eB+z$Zw~S_!<+jglszxUY;s6=n} zg$6I53YW*a7e>2F@6YO(xkJ0&e(r2XAP};!+-2_815FF17K)nsiaa0=s$QIUIUJFB zb(e;qg^lCZ8j2(0B-(-NdJz@XX37qcFZ_oSo3BdZw z^v(CujKyNs`!PgPid;ssWxuyte94I=w`l=_5%jww7Aaa$Fhkk!#7GD(SGSAV<=FmN zX1l@uJWU}3d5wf@L;VEX6TKVK8T@&4m&Uf*iQzzqP_;VG3tI!dSrNSk-ux<&W1yY` zwO8^w(0FBC4umM2&$ck`?-L}kWH*7NzJFdtZ4&OQVt=CM2>U&Ky`uJ&<-{0OZ%AYz z9RoEfBh0p^O<1r0l#TR1^Yx248uMWiOiTRowNcLseQ>FjaBke)2SSV_C+%G>?z~vk zNM~>hoQ!>HrK&m*DxT%rUDT?KsyM&t<|c}Lj>BOk-$fSfynFvZ>XFgl{9O3Ezxgxg zug!ufx5{Mh3_+X>qG(W>7P^HZ3sSFc`h3{?`vi9Kj|B#MpvpjkaTS#AaE>^egf>-lA4!iNY!%u04Lp8p%v<0PySKuyc04f(DG5TizYsN8UQM=z zdeJF9Ajl1?_8zKQQg=CDDO;snE2S1>U6GiHt1s}FsI4PGZNMJFdNilFUMt&XKX)`k zjs){T8E*2n9O6Fjzb&E z(#`|z*rs>1Z?7a(Z|Z`1FB;U%2$h`*XA^S#NEuJsI{$uxH4= zW&`9U(yKks`90GQBDjiRU-xs(<7>#@+wF*<89zWqFh#-ExLj=T)kr>%N#vEz>~_8i zGagO0p5rJYoS&cBE|n;WHLYB0;dLHPyAx&aoi;j4o)S?bSC(QEl219a<`bl!g3H76BvP% zVD0OigQMfh5)#7X{wYxmQ=A`a;?$FS_3g5D@xrvjo%h~R5sTw;tIZTIGW~kOye@yY zF=%5DRmi8vVaY^IJfCeQic(yKI*`!F3oL7-2NN`eHK5s^+fE&b$<7hKPdSK7j$cJ6 zWq%kmfuGOBj~JDxd%KiBcOeCsJIgF7=TpMw-jPv&P1n-67On)1=#7mFAiDxSf*<&|pmq zAHI7-4@b6gL5MtlKJ)R9PdtCE2D|z9#3WXQ4SzVv$cUN+jh!+s3=T7$0Old?3)O>H z2trgC$*i=Akq{!wlIX?93$Ky9c3K%E6><=o2iYJl`TZt{D^)w8Hm~eG*bjD>Q<<)- z0T6e3l>hc1+&4WlNa{`+l3~nsn_C=U8QguReD|Bc@$G>Zt`G(>!QlW8Z&nU@822Wc z;8#RFyEhhlik38%YATcvZ6xwmowJ)GheJZbAfWEhEzaG*9bI)#t|SJBLnB3P66X2& z%8x((#JDJPFMR&-iUj5EU1m8g98%_7Ud+5pl%bU+Cl05?XvPWY{dSOEuZ^LDbD7_By;*DM>H%!^-ewh37=^K=1=r5h+enBKt&KqBUdg1FoRO+LeCr5#* zX706{70pCruWCIJ!48;Kl~N%kVLe37&sQ`w(!uFS+E5ZUH(H#J@@oC>4?yPsJyC_a z4a&7pOQcpfUzH_BN-#1YDH*aP-{vn`@z~PI||hc1&EjS2Pym<>LH)1vwaBWlkWN)qx>nl#EbCe+FL|$S0 zTsYnd_xFjzF*DQ*cy4Hoa=crq*THtF#!XGhL|3?$PR_Vpcp@JIZ{IJRpDXoZpFb~lqiU&i5z>+fG47;P^ad;lK=%rK+(^K4 z4NkIK-!XFg_aTs$!10(!5uUdzk_O9Nrd$i@E|N}4eYA{t`1czn!k+I$kN{JV7q~n& z{`7Z0a{MlnA0q1-7@;$?)6DULS_`#U0ur;Z#)T9XS}nBEY%6*4GOHc!!}o=L+w+~z ztOFO=ero)sf8oRL?>XJANXeA1o$*!SY==)=%*$ej&cRQmS5@%-KezQ4doJt2)_os+ zuW%(yq{;SAz=&}DRrNosQDssLggNxTV0=l$3Zhi|s9-2TG%;mw0W z88m9^G@!II>uDk9K!|FUa4_d(x>B~zvM#hXs9PlkINTjM!~=l4gzPazR7(*LP}Nz>rgE zcK8lEGfHhN$*k+=vziEpG`}FZc@U|-y5RybMn_j~1e)a#xO>PvUn(HPm`Muf^R|10 zSh5s}5(qgGRv;>utx!fI#(^xEPA44_Q6txvEAb#ZIeFA>DjAILr|023na%NzpjtZ2N&pc@p273^~v&A(sa{(WM-6Gmv}+TF~nNrvpU>OXsI|LoT< zGwk9POi|ehjo0V4GhGFtd>IrSyNqfcD(yPBY9$?_!F$>)a5Oi-5=%@15orQVj09Tk zfEi`b%diTs!*WP`_}v33253TvnG`aY=SQA@+PHkKL=CT?JbW0MeIV-r`oW(do&tx5 zY;r*v-yC$@-eSKSBF20T&<-wfZ@{c zdBTeIpSyM_(4Gh9FO}onfpkiUcI*G zZXBi8nT8MuBly1!^sH>7@m0@UmI_VTUItQSKabQCu`wB?f|K(6UhS<==b;24CAiBg zr@IxCY1&%t-I9!;w|ffvIr6RbvTrPXy{T09!)lHPxYWivA{lE#%4})wF#AjjNhH30eT4R^c6pUUe6v)zZDDhSbsmZ%345CYBcCtFV9#4C z$Gn(FgLL{B#GnK<4pk|xmJ&m*QcNszBI|*A9sKNGKTI+ zhABzLEAE;lBQg_{d1CFA)F8ZiKBEtG4EOagIcsm0OqmQHQ0a8_UzaTP?HfahlpB0ASavSw(<(c001BWNkl{&GdFq_9vK|u>ERLm^OkD`{(Fn=bQ5_vwB8s z!H1ELuh;IAU44E{e3gk!gR&v)59xL51dt4;H!I62TAOx$S+~|{xtJZm4e$Avz5Z1= z8ao8#16q3V1?4><-TEy+^;=c0RoT=HjTR?Ubz3$P-LT3HrL>9LJD6w2xEf2mmCh&@ zL6#-)``>>c1wk8VPrSS|zWi|E{G}je_RV}!>_iJ-9|=BWn3CfF%R}JsuoALWmbXOX zcH?y(*8UPqkyusg@$JHTS_sLmJuku?kyQ-R3vMv6EP-VgY4(SUVZyPDLP@< z`8B#f$JftRhtgVOyPgSm*1DRA!muDDNu6BfsCa`YA2SEbw! z)}yd2ff2l|=Mv0*ZDx+=o)D!s)&Ths$%jZeTkFWCYeCp0HVkP$jf>!cJprA)&lxdY?5geN(OQY+M`v;>S!Sgjxt zGFz#>M_=FZTddlXDUbJ-WZDhiePh&kUFK5k$=HBaV5^Pef8oc!f1*5@>twwSf)3)e zj+~21ureb8Cs^JDj&CAi33jMsi^fb^U|&UebvCOhk0Qp~n3=P>y=~`kfcj#}kl;^m zbm(Hn?6(Tcev1=$~Kw@y^h7&?H*a3asI6rSxA8nta8Df=lfg^095S7#0Os$n=G1t_W>jgr!-P;rI z-aqi^her@$J*+U``D+1HQnYHK*LIT&Cy+3R0yzrHng|l9TW9O0vl6{cG_}BF>tj}_ zT_$;R5Vk=+KsuP!`K1oZD1><6@b9FepU>bRm&Y zNp!6YDU9ToTz$LG#T66|{zq?h4PTqD-CFnR$rFb$69|mZdpNEfkFczTHvRU75vhAK zS63s?`uogo;ta&LX%Q6;hs^u$-m^Y*O8iP4aIT$v2rMyDy^yf>foCpz24gA{tDdZd zSS#E=M2?5ZGVenVrpRxdem36(nEB5w0iAWhH~nx=Cij!j+ZAbnE)}7`hdJ5e{qM@NiEp%Jq7smBtbv#?0t}^JC%TAI%juNg~B;#6udg6Jqx?i5(hE zCRbk$zRHIU6T4ye^MVwJo}0LqD%!Hx`M_#CrK(2G1|z*siFu6nwYL6+kP?x_O!CzB zb#HJ!7e;HmdpMeGA2Z(yVct)6)swt(4xOQVB32<9iqwbk<;}bvr-4pfNZ*bDEgI#xG(cfw78Bi3|dRLDz2Z zes?!b-~Zq2?OW;XiO21)W&p8N?+GG2J)LR&nNp@*^DWt!WWV`brYAv=z;RtrD(x~DqAWQY0?;8G0_%F><>`rb zsk?h*9|kj{)l?C3gFNTM4VbfL@5K^${2q@$NM<|SJMO(u=o+YMts5GqKp7BHxK*yN zAPwWlIBzAyiJV(oK-d$rAVN&$bR?^g-}tHDgi!|NQW(wO-wACwuB4zeE@*nR1rrvx+NO%mTC;&hXMrY^wDjWlUUn!NpQ%v(EAWt?Hra& zc^Q2A^ul<#FiJO13`fD&Lt?YTuOyF$H(WGdMfA|F0bcmSm_Czjj^v z2qujiie^a11a#{u*G|23MggtXhH-AWOOG)4=RR|Kb3kO_<#FTF=O=#p_(*v)B;zLQ z(S37kP$!QoEQ&aiari!v-v#8T^wK_O-R4lM@~yq(|E@C$RfbsAtm3T&nL)^`lG6xg1~fB@Nf+1s^7o2jPLvn0 zxd5lY+uyD%_rTI^5^6CrVZi)Bf)i!~7~wKOhzVk#Heqz@SFheS+v z$ZNOp!yy}gV4y6kdu9+p#cj0BOF{@Xuc8g6zqa<2oykbSJR z3?vE5Df9MM4<=u3LV4+Im-0W0>5 zWRh2```4$3eW>C4X<4IjK6Yfq?rUvu-UcaV8qE+{zd1pJ^EVtp2^QyuKZ7ygcv^Y? zKJf9+XGR~iVsfh_=Hs9$5N<8p`5B!av=;&r4GkT;1l|7aaE!eDkYTO7JXIS;X*Z7$ zhI#7bfQCRDbKfZ1Dl%+p?wVGP@t!~Zmq-5ipT6?>A2#e!PAAgt)qeC=;_%|YKMTMD z=^paEkWNNE?hH?UrvuEbnP_n=cq{HE8=k5O2?L3d5CbVhWKE`s8HUU_HOU{BuS0bP zjmlo!1T{PPvPJR|3`JER*REhIG(*pxu-az}0=1Y+s6=_y9y7%Ja9XLQ&_*R{A}@(j zn<0yFo-YFlofHM6A=%Z0s$?;=2sfWhk|c14%u5GEXM zmF4WkO1wc;7Ic0lycA5=Uk0O?>Ld-dp;qJh; zDW86P=BJO3ynMZy?9tI8)Ma9Gfd_2b=K;c~#Vh3$-N4F5YHtO?Wv&wr{Hds~$qF9~bn|2O$!zvJM zUMWqqdsY-XqG8`Ramv@vC7l9y-!HuX&53Yq^ib*Axw>Im3f6zt;a2KF5CSm+V$Ay# z!d~%f5P$ZDwrrb0hj;f2)=Dxrz&?}|bPuj^vCO;=t74QX=dwO$?}FBW*6svQzZUNi z=haNk#u(57wOTK_wvLw0`}Ig^XKJ5><6y~6!_47QASRP*w(4-BXYCiNCUo0e3hM+)=b8lZX|B$WS1e(;J~i?&kW`QebySo_S{jlY8Vhf}Gl@|jgVI3@ zmUx*#!d?MuXD5L5-f5+>-iZ(7i^vFU=gq3Kx&8yU1f$sB$tpWK;oD~4Ly9kbo#aO& zaZm4rxzvIurJYXqeGrz+{hOmrg{>f?zS_%v4GrsAS4%)g=%j2d79EOoB}*nz5#8K% zQD8VxaKH}l&%r@E>T9RLKz5Wy2$XUqHbJs5dN7$}A6zROhLD1{dPHCtjd#MMtqpQE zlo9WfL*(J%$gh9B@?ZYb*^t+PC(efEzV?MtCR*_N5Vb#uU`d8kBUCMkxqq{AdIOb8 z|5DHa%aS1$Vi*J`h__+tnKp#plq|xUGwZUl%1S7SKmW}ae)#(r>Q{^C*8UtbV|+yd z75}^2`jHbHKP1*S5mvRqZgv9PT2_0Qxg{Dyp?k459Nmzps5H!()m&|9iLULID~{Ve zLak-m<&`srLKrq@iXnXdY2&+JMN;lJ89PSug^X%6?;;;67X)ibh$$~Zw0j>U5K z6Z&|yA_d4fvPq+h7tvy^Z0L@jc00HF%n5`z?C6gQkw~ePu?_lWv2(bZXeRg?hS>m! zCA5J+)aaZJQ*aIKe$EV%SPTtJ%Y93fRdh#Oc$H`b=Wz`YTD3JD#9XF_VsZbQe%?R- z^$X>#CYPI5#41pS%^nC*5Qoc07ds#(T-IJ)tl*HY_hC27x~Ci84ymR&}A;NK>*~pfI z&bBplKu+fKkle*|KeP8$E;cvBdq}|-wOR7o;WHSt0i~LvVM_CEi2w#k3!W(WLFZL# z_s*{Pp&ml;Ox`A7PT27_)L}j=_CHT(yF1Z}1Kj^=<@^8fj=T4nbQ)-CwB`mlaV|Dj zAWVn98F+_zE{xV#50RkdWITafQ+tZi+bq_)mtG{W2UeB~IAC^qK(@yiPu8^JAhUtTKtArh0#cKI$I zc==lC*S1&0t@J%9vre1RN@KfhPFNT6vT^`kE@xVEe-br4KI&WuH^howy^W!~e6768 zcjyM!w()%J9PU8dnXxq9zIkB1KNt*KDnC5~*~nVfwh$k@=Fjp~>r97wQV|#`)S^5; zUiY?;>djfva%6=CLieG9s-z`4zh<_79`qdinYZu1XF+JK+L-lQCg%jzN%UvuxeiaX!T37nr4wyfV6==@ z#Qc#$5^AwEsTm}i$zLlrKBLq@jDcl|b_U^%w=o#K?Ne8i7fUgQo25UH#O7WNaff41 zwxUacZ5yg5Ieve<5Z~qS=)R^jU?;!R6hn+GIng6LKAQzVYn}7iT2*Vz{LNPB4}qPFKKYby1i#` zBr*5_G`f+}VhGHst;VhvBw5cahFdORx68k7U*x-Aoh?b#>F&(z6ogmob77kLn56c0 zDEyO;%s#g}eKt$%kwuUUr4}DP2FoE+doh3ic{ut>qGEzAo0lMzW+~9ScMp{9YzK5T zMNRWbog#2O50-p@0j(En!%Q=>DJ#>#@C6_eSaL+G*@EkU7?QcHrbtU5+KF-aCKcWs z4qUdzb*to{lI2jeQ#His{cf>m()*y+!PC=~^Q9mu z+#EA~AKb{ezMdOaF}V~|{NA(zB>R0?R*q}tx_x0(C|wz?667m~@7{5De`0$OKFJH} zZ4h&cPpHFbUfA>D!#!^v7PJq(etsb=iI_93S#p_DCd9$;K~X7Lzd9!6;oXt(40Y>_ zJXmC5Y*&-p%|qfF-RSFubvq#KV3{p23s?b69pi(Yq9=}HCP$vT{^c)Uxcki=cfZNE z7J{1f^ZDgWYk8jOyLv>4ggC1hy_L69d-y8R220emn__FbLM_H?S#ks~ifU<$rks|< zF`EIONVJ)QLt%7+SP{{xWtK5xghm;xIdZy#_Kb0NS|_iTWZ6go*$4FPd6D{IlWa`6 zB)ETfqEUH1U+EQ8jGNQ7aIIH+mc3GnvYf0HwArP$#(Z}LA8dwh57bU7XN z{OtLgM^fub6q|xuXCd2~DTIV?Mp4WIR-E%Od1_st7NtDd&-wJ}3z8G3`vW2Ra7sGC zjQSa2SYay`oA*)ceYSK5V-Y*>cS5}-Hz`Dpr-cwZTdh+8Q zEz(5-oj_iMWmVcXC{6wD-11}NG!Jwbx2<<80?khbM^Nnfgh?oLe#elTdPTi3o^+eT zlKK7r{2j+rr<9GJ3J-6N)Yj=Q4OQikGry3Y0sL$DXm}R2Urk_#XcQaOJ%XBD_8N$X zNH3js8T6~}mDdbVGFd0D`j!)sFa?Vf%wi-jk@dJ3{B*6nd_A*0HtXiks=Ye=7vz=> zC&>4Kvh2;T1s~ zb|1LC@0bQyI`4s3@y$ra=09RpRtUxmlBo1n40dGfP_s=eUC1eNJr|CrdCzUYo%Uh# zB${%)RCL$_k|}v^199l8dtmHh1J$I$94a<{S+804vu^ikb=YA(&sq7GOJ!MB^12X+ zHq)G57b%=3*5K3u0JvFqLr-=v@_c2MqB(G*0{Ijg$n-BOZ=MW>2i&!GqYo`Z8 zyL9h+E8Dem0ppJ`j36rxujd3Vwf65oX|%qP^O67cfB8Lsb@`D`=grqO%--fuF&@Ok zVLU{|99a(w%OMexa(Yto~i5INmv8&eR#m}b`U8)8GtI$j%!$4Rw`&l0V|5_c|*(XOSBfoLP81FB}sH@Xco zob8_^O3v2Wu~}56qHC>Fwr;9Q%v^A`;iGt>x!BsytE*qUAUE51rA-8ECSL(p1cLVA z=*Fys*=OX;mR1OX)BOSDg;K3$yDTehYi=*#&vJOX;upMrA);YO#W#$1aiB)$##2*; z93tz(!ts8kwaWSP#&tBbvcqE284jx*@kqwlJj277w3g*rpZxA{Pq}u^morbF&gceV z!C_AC>!w%DLX>zCjvq1)-!Ck065#|rRyvig#jy(uax>CS8Rxv=f~US-Exqnz&i!Su zv3<>Lh|PRIKa|{JeI^<@r+@Ahq3mSSpSQ_WO?@!sZ#t~EJPWwn2eHrnda2C6P6xRE zu(I4Idgy2vq&S1@JY`__3h@6{Rfoc7M8N}9WLXo}t#P?DT8GndaR*1CY>n+|3~(LR zhfkfI_W_vs*H9xdc_KPG#*xrKZ-Z?!4;AAoI42+sx>l<$QBs`5JGK8?|;r#h5!ZETB; zmDd*0XpH^2hH5RWhlTa9a5!boFTYH5_K1+P&emy12uyhPUJ$n|9=e6YE>zH}h)!c1?P6jJh66jg)5zv>7RV{c>jX&XNv<5p5j6 z>%KdNx~N7%$f){MToq~^oX?GVg{|2AY26c|;6_H?X1uL(xh-~PY?(Qq5z0*zQy+3Myw zuwK1I-f*6T4NN<%{yot+o@F#tw`0Wi(^oeB;kqi%Ps;th6*TkgTs?2AsTaq`G6CPe z;-AB;8Z71uF&PqUh({wuHQVwUj8yLPW6(qhFiq{SMF=TCgzeI}Jn!Tbh&mrdjfx@} z@)DR&fgUPxj)WwP!G5)M-y?Qke7>Zi)Irb!Em-l_X--_`D7?mEQ}CgQ9&5aaE~U}> zZH@~%oWK73>*pgHLssqCE}d8N7c2=0Gvvp_`R&5PyR&830cx%E3$!b@!`e6evF#jZ z3&{qE<(S<&p%aLlmJ^?zKlAkQh3glal-8==2CYpXS)5dBNzdt<%-y#$r+1lfYP8ho z6uS3ZCAxE>GxsAPDR}$FvTn1=9olU@c2SI(-s_Q6wAQ?`6;$hi03aiI3BH&;8H!NH ztayi3e>wwYC|Rv7q%^meRvm+=#>4UZIFOcCi;UaxjJ z8lu*-?I}{qh3j>ruF7dTIZ|W+XPM8aHd?RH3Z+!S1ZCZ!SKhuo5xN=vG)FXyM`H)Y zl!dZcD}@}mt~*n*Dr2fQxc9Y0D z8FTE#x-0c_fdX5+8Zy>6CSVR^BcEZK6DdtlMm(^SrYSrMrY{`+3 zg{F<``i1pU>D7h^0_<+a6mmE`cwQGL-LtungtP=!y|A_&a^jos9$D@)U9LP`E`0y} z#`VQM);tLzO!U6nY{X!8?|pX^I7jok>4|cwynO7eKiJP&+tw5=VNMvD+38y&ES|q* zxce4<`ETDb-OsGLa&0fnCn2VcRH0rxQTHUHITG8o`%UwWMuFY4 ztEPrfsJv=TgOe?-Wu_`NR--`>Lus2Q8-^O#o2x54e_mPc0_TSltrezaVcj>@ZRKH} zQ4EQ@ZXnVRG$!UioI828!H@GP(L;b_YZ1S7BTq9A4QqW$uyrHdIBnGp1`kg)d0imb z2kfDW*g+r@n^_poOCk3nOGht@OPoH1d)*TU(hW6%!vj7?$ zC5R9o0(alcJp5v2c@vPO(PCj|r)V`}p>V7jyE^2_Sj-`c*OiLmy69Fdz zi;+k_zQ3A%`lRF;v~)*>gfUt^CYwDl*#3?@+wJW5FjF}ax0r1JS5AQ`XOwC!ENx!B zTE*10QCla)aJ0yBgr-91i9{yHnNn6%EJ$2m;O=abH-mK2>^1oi(2q?wo^{6tQniS* zMAvi}cwMWGBx8x3PBZ&f z41O(o9AY5=L2QqSp;lVdor0~MIEID^&}yR=L##ULtwQ_0Qq4|Vu>BrWGO2L)IYqC# z%45?Unm*sw-TL%2Q@L!HLfbOuc_B=dN~L&vMhSEcDCP+w;tOKDG|F($1WcYBCh`>N z8u{D*?j50j=8wO-kdw82Roq{v-zxr*ZPeP?TV>Kfj>(cz5knMaVXIeKu~v*1^WM@6 zO!>rGtlbdBWo*sl%}EoP6Xl|O|1TH*@Y@&WbEfR(JZqjO$t3Nf9wWq^K4D72{o4t0 ziqQ-P5t}hWHwnLrwUUi9U@>nz>+`%&c58vAn22OPzg)OpcC*}0 zLe9xKQXUNbXS*j;5+hAIwHLNlS(b%NM7N4aPPDOj)0@qU3YNS^ z58mpKL2u0m(J2ud_-SX7#R8Mc3);Im6L%;+9wW{ZDNe*_M9$i|xg;m7P{Z~>o+78S zlBYr>t`hzF$GTd3)dH)fH^X)5X}547=kd}C-QxSrBm}x(@H)Ixy{Jl zxjr@6^k_I~hl5V*0o8mFjKHRzscqMdPkd&5G0EOxQ421&dvzF`;q*=9&94`x`$$+C zJynYAlwK)1f*DRuyj96D2`QTaRjJLi`oT61j9#~Aw0$_6GOP#~A`R4_$>p3Vb7Ot> znG*CvVG&}u`TxVAEcmIsNF2TB?m&+Bl>gQKh&P==5F?@{MU!o;9-&G#qHOYj6>Q

Oq!@xtChgLs@HvcyPKh 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

%_gKvo;F1JR%`Rz(E$pB)@*w1 zWGT<<)F%A!oVK5-daI;zqR*{pgD0mV>NBysH(XhG6^OrEhe?F zP+)^(AX|MzNnkU^O=Nn8X+yVgESFw&bU9%J;wbd%sMPR$cw(l9bM6!n1f$mrJkxG30wTx>PgVyYW z$^+Fm!y2R3+{PkV)M~s>jJ>{259C3(a@UAV9*ftXvl+44_Z{|x<_Ov&Lvv{Gdj=XI z+KDKUh|&cW7821--3NoQ6V?tK95gsrVt26xZqu1vxwXZ@ad6g{0jzrNz*dDyE9LDBn*>hHV!O=WlIkT02kV8mcB)H8U1ZwZ9dq z1YlW3L@kQX92oW&;3Q#kn)~l#6o#RM@W^(8SrLqAtBwP{_H)01|MBy_o<*~`rs;RR z$D?k4Vo9~sO(mtwPyWVh|C==NYJG!6jh?i~sBm2Q2F1E{BPq1s{mroJt?zoXc1%%< zj1m$k8k~g57Kg)$VW_=~_mR%`aR8FTqy~~J0(U*( z$37#278-^UBOzI%&<(Tge334YByzer=Hiw2v*}L}88Aj$R8ov3E?pSMJR_)EYJmBk z%hX;w4C)oIl^!nnKl_4EiPF)ALzWBJ6-Cwn2j*Xh+kN`{Xnzlu${pK0Vi`jNA031 zn9Yo!>mE@$E^W0DF9?Xp96YDLWZR`v)gH5*p4sZFD5$$WcL48jZ@M0kfU9T4-mWn3&i=e>^bunaxH&{I<1P4UWQ8_%E9&>aq+r)2%Xx=OL{W zj&;t`?Kudd7P?6J)&!z{5eCmRjVu;kZN1IJnWF{$spd5_ZNL~q)0TjmA|!P#(=Hpl zcaSne+#uO842jcIt#m_hm>7^glg3CMGZKw1tkxnnAx`iMxb*>tH2aZJPDoS22Q4JV zRGPh!xzKRVqZud@Y07L)dkv*BloUY9Bv9V8LRbbh+0i0PEumAnyT-Bd#WK6Vc^_zf z%OVJEH!-e@b8FtJxkZ4eZLwMx7+mo4ghhlDCqg4Cgv(k4O`_c|<0!;}Xh503S@R)G znbEI#(YNr5&-q%K&|b^byCLHvANVBNu+NnAbZU&{H~-`p_z(Z(7kT>Qo_~|C?#7Os z(tL=}p(~*g(Vby-56l=W&wTP{@KF!Fe}$>N^<8f+>s>u2mV&$x;$jS4>%rV3S@S+J zf@^ruQ(pzy@XvnnyExc)oLm{n6XYo~k!jn2l>kV|@X$gdIZIQ#d8X1H3Yrd!Da8W1 zUiHJoI7}EcC#fG!@Y$7vilgr*Qqny_vMv(y`UA6$&6b0E5_O-h;g2~9rcfBM2a|wF z&7W;bxVkn{yH-lYA%(mZT{FS3?$<1=Wp!jZy2W#H=cttNB*a)+UqbCN5p0XL?c!K< z3w#sVJJXWw#ObhRT&L}O;wTwf8h97So^h=LQ&Y5X6#0R3PIIOTrD5#W!(#WotB3e3 z8dWcGd#KdUKxSH`?#-17nO#RsJxI#-v#UswDJN9}b)H*$lM9VfF9Nw}Ma-<=ovZ!~ zn~fA}Z1rVmyFet-=SV-mm6KDJzM)wKoHs;C_|~yH=*X?1KOMCa@rJ~t6}dACHwjEr z#7e?h{eV)`h+9p@6ILtB=}Ba>9`QB+4(m#fvCSp8ENQiF4ShecKJ7UeV^VdP-5$ z6nL!0mYbb-U#k9RE(CUmbB3k~xbiur9P!R`?wluW5?3}ElX9t&E!ilXXpJG2xZr6T z6s!pj-_++;#kO%u;RGM(tfg%;DgEV>T&2G7HtlZExb^T3p8mM! z@=I^}X`s}I#_$ur`Yk;1p`Xmzz5Ac@S@rd|_ye}Pg+5u9v95vx}xoq*K#gsH8-qLu_#te*;nq1@zViLxI z3xQP8yhXe7`tg?@YjT`}hv}xJFKdVLDOGN)fkOYgjI|aNC&3dNa+cj8c=L{2(Jgb6J)|`@> z&}XeD=AGANEFrX4L1N64ptdNfGipqE=GU4=Q5)+F)#WbdsI8|da&WMq>)JU)s8-39 zLJ>r@FE%p_16PhGHhn6Ek;X-P=XJtIU5(U|SO4xTD%5S9S`0h*#xMO&UjF=7e%KTl zbv)srpHTSt?c*(X{t>VLy?=SLFYSho+s{1k1AMg{GqidRT*Hmac<^fOQ=U@FNJm+J+sJ;S3492Lb%QR&+YkfCVed}>vH(QM0 z8$;Vwy2T+_#%WTYb_d1_;v=RNYzHO?(Ika;j9gXmIa?xhafM?-CyI%*t)c52!5gL_ zlO{`=4C5fIPph?eQQS%q#bn*YSIbt5sVIz_k#VCYECz7i=rxuJ+8sDmD+-)Kv+EP@ag`F#lQ{l^$)^Jq+`E7w==SNk%=OX3=Xj)4X6mA=biI_AD zEoXfM?-i=6<_IO4SVgEANtq@XmJ3UqCN`VMG-ZX#ZHXH;^=E)85}Xni2;Q>j0;@$! z*LlA6rQgd}e)iW8{DZ@j73b|c4=AMpwEyHFR# zif~kKf@+TRxQ9IceurlK;hW#YIE{s-)Ix(I+LoQ&GDX!jth)P-C(H*L-UVLt%&+F# zzU+rJt^gnlQ$H20m??&PK+#mhF%hSP!s%6iw;R5uRIGCif}tNH{WxieS!r({V`hkn zDdt(^UX=!O>;DeSF|YAOEvkn_6{zMB(xCK7o|rW<8dc%uPK&ysQV?J=+TxirIY(kn zxW=(O=xFy1gnBJmgD^{wim{rUy;?OamI3b#Qd}T?2rQNh_V-t`jVE|Z@Fi%}M0^ms zg=4YQuQ{{LmZ=$48a!#r!E~3Tv_*qBe}T$a&hHVs@0osoMUrR4f}#SM)!SE(tF6uz zt@_l*ekMQn>ObHkANZsXeX?;c75>1DshqwaVDrbI4DHcX?iUY8=k zmT;bwh&dK@veFuDtF4uYVHhTbs+>T`n2@opD6-KM5lyj_oy9a|Qiuq~1-x%m?2{v| zB8Im-5C zGN?z1HJWg{*+hn6ge)}PTo9Vp(KHRtIZ`fG z!AV1qybqfE?zoT?S}VY9SH+gyGY{PU9w%f>hG&@7HX+&ON%W9$$&g* z>#0m2BQRNPcGzqQMnlaimA_lSxPn9}imQfsHEIu&nG-}#;ErMng!d!i* zoXth*C=|)I$Y7@hwTMdD{)hll+RErn`3;32m@njio2|C1kn$s7b1AL|_VT{2SH@%oL{br)yOr!|G zcjaWSHr-+6Rg7Z=v0E4mt8Z{MB&jjO21*n?Aeo#ZIZdh~XqJovT)KPY^2L!H;nrJM z?C&jU8in-7A+bKypfQZ-wVjR(r-`XAPhDF2#wbh)vWM=VVee=GK53pw12$;r5;h~H zLu9pTiAhCDmBx+LJEKgLdP0&cOjFz{rgs6bok{1MBLq)Vtk}mfmY>UbU%FUCk)x(* z)N`ZHjJ=+|auVe^vsTZNwRgM;4I;9gBt~%77GDof@VXeKDRFXT;`nkTc(g4xN514) zuiy)x@iM%-@50D`(^xbsp8e#{2bgcodXoRuKloStyFdK-n|5tCayaYw^d~)U=HzEF z89S%WQfSpufCd#$JI98*c~q#zwi-R^aJoISel7a9Q0dcNc{ zzmive@oV&8GiIhyJ$c4WRy%?T92RfA9w@RcEwFlcvZW=o?=zP#4@^-?G(@X0ZN*mkxcj?2FG-r#qPCFRILNb`_$s@!~QnRqC(ZE9zrB`Yp$o6Pf z^>D>T2x|;o+hVL?N_zM`ICDr?cr7%lG(kZe+EvSgKjMKbRt?^3j?`+km^UI@I@62@ z&Zthrd&n}8@&HUMR}FhBOIIiqhj#KgTfHvwyxD6JUkfJ6E3ta8+|iuWf7hhjR1QNG zG1?wTKd=_&>i<97JI~j>@CW$$fAj}@@?)NLug$Z2tgb=2&P*1kf zC5npd@_H1w%{g0Mixfeup=ngmlT)5m_^Ao=01eD9gdk{%H@nKKlC74T#<6ET(4 z*QA<^aT3NUmw(&6pR`IU{1{@ITG{Uy#r%p+48ly)*;OVq|V zMD2K#j4@ete6B#pCebvOy}iI<>C_Z#2ML4{alb=dfOdT4vNu@c=GRr7QD?~oT$MXE zM_jPGr_55%`L!Y7o#%y5{qOjt@AzZB=&7%`*EL4>YN1ib!SaaLeBM9d-+uS+^URNV z_BI@+zHuV+|L5Wx(Vr$xkEeOVGp4w~nT%^Ra=nIeN!11vIzdm?ZmtNm(8ybA1<%-L zPEST8nK_rl6rM~|Q-wHXHtSgI)77xWn1+5683*m(GqprErLgp{*t2vihifg_M2$eF z`neU(&4G29&>0R68@h#-%j&6hb>SdIjDr})Ar^>i>yNMBvvpwI{;V+jv20noQp{}I zo-FEUM=IZ&4Mr?hoWA#Bh*M&mCcJaBt(l?Kt&^S3aJzFFnd7r1^U}|JCHu?!MnKxN zj>kRtV_7x()H`}xYzXhZ_;!B!w|@Mu?#Q?wjlIPIuthMexrfk9^kjeg*$3RLOS~@Q z|N6aO*Lx4B1i2O(DwNcR79AwR-+98vWA0gj-N(n_-Vv{Q@vHUz#$rW1GkiH!B*>8-BQ#%9{i({+xfQ452sri!U+|8~uuV$ziEEVC|8 znSxq7)mQ+#)nCYVzpVw+R7V#4{_T&wk#BnO4{~Pj{JlT9xK4#e9glp# zNAlCJc|AY#b-%!)AM}y4U`*A=+9lC6&^3lU3hT?6u~%ah?;Oq<)pO)r+z6E>aMt6j zS1ke>;FPCKifN`~C_e7a8R7(&FZI0d&J#|LBXJVi1{Mop95=f88V|W)v&rg=nJqEG zG;Se3U~c&mqdZ$^V6hhnodcV(&Ju#hIZI0Fh3}kN&RUldM$X@|WdEQm!DZlGG0>_s zg;eT9Ep4|hp|#S@WfJOXD#l2R6Vnt)Nz?}1>B*z-YgdaYNQUUCM9i#ww#AT3vg$QV zY14~SqHS74AWjo0Y9LcRafp=2;Tpb!o@!Rzil;p0ldtF0x}oFT{so@>q%SB%oqlZ_ zS|t4QU-=&1_~w6qb1(7+jJLnNq&s z!#W6!qgynDCNRc0i(;o?B28&7!g5m4XA=~;$T^eph%rK_U3rzBDF;MbbU+4!Bqauq|(MZoKCEd2c}*H zlEzq?uBCEf#;7mI-rj-`JmWaAUiak+9S%bm!YueSCeySa3}7a77#da|gf6ilH@$^top$qJFiF){QbaZsNC zZ!IZl08rNj_V+rR$)(`P#dbW=gcfH*(RRQ??|9TTw?p06#*-fQNi!U&$+HgQ9mZR- z5nlJNzmd!987XX_S_aQ|5F%aPi^^!!Y5TWw8i!T|?6ZmJ83`$`PE!S)mJ_y;a9*>F17|Z6Q$U z6OFtG-px5;rijwD0FhF_q;gocrO2s=>_VHD_qie)hkFNn^FRC+{_vOokQYAth1YLF z?Ti~zXaEEk_=@Mgg5Uk8Z{cOn`6`@sP`Ir^IVlu3WhAPgN8i-ls;tr;rS(c|(G)OO zs+H@i{_WF{RjpZkJ=SYDJX&yg)DRklvJ93uz~(fwIT5BoN{_bT_|m3$-Kz*k-8r`v zyfMsFgvo|HX7U6w8BBBp)8LI)fvPoN5@IHNNHi@a(1tn4Y>pFVd(&x!TF?h8+ecCR z&y)o_bW}MV)HvYEp{kIt@RwQnO^r4d;*gNB!i)MnQylS51Da!u*dpXr^Qw$ zRDHf}SiAp>$3OVv@V2?yMK5nT&^NsKH~ByQ@1MFM*YfVW-p;%4ddCfUt~&0#_-=mg zxBnL^OuHL%4a^AJ$3F7oZ|HSh&vEzVyZC26_oF*7wxU>Z(vZlw;~|lwkdpA(pYc2% z{*Z^?>`VWU#}o?(~QgUY8l}%suTnd+)W^`V^@O>1psElUBP@@|>UWh`-^ilehEYXTF$D zxq0f$8d%x1vjN-Y_T!aLeiL7M!)e^{=66S1(*jdM@Ql_*_}aJqUYJfG*yH6f=(c>6 zIluy_32pVmHKF~$lE)YeTf5B6TC~oJG(y{|$1oa5b%lhi9*Wbp=yWwRGlnVY3@LYk^xv3(mU2HX4`R|F%GSh^ zXk<=*S_mV_BOvEtS#WAXm6gO!lvG{q@pS+v6%%6(N-Ml~6h%ZUPjF3A{8OlubsJ+C zS2cC*2oV|wmo5L_vj;zPzr(oa%^u$3jhqWD)ivWYUh}Ev^RwUnaKo>~Xv1f|d;Er< zXF6KUPsTTq1>+!Zm2P(ZTXL71-E&i~3uNrCuCBjR?B~C85@-Kr`|q5~C4s@#iaY=A zBlo@gegEX}8Pl5!I+ihHB?mM4^u;!cAHBM zgfR#cGDeS9k+M+qx|&W`rRs#t+Y>=X(z6zdZwMkT>6*Mo%2!N=hSM9%97@4mZ+ADo z^NG_r_UQL<;QpJ=3R}^@4S=_h9K<&(ZhnJX@u^pToe#X^1g>|`4btv9u(EqVJ+4!> zmXZ*av$IsXjzS@7A8?qmy-iMf@~&yDEomB0?L4Lf2VF-oyP)XwG`5r%+q+0pi|~wq zBZWqVOAM!!F>7roZI{w^Fh~h+v<9QqhI;7Hu3)y@N+-@z_!&&o#Sg)az*R8;#sbDD z`uz^`^Ic~9in1dEE)v`72Bg~#$o-}&jZsPSKUFx2){>nB5=v-}RK4(76eoR&9dK+* zX@ZnbKrbg*Nm*Dror0pYX##;>4|-itB+76I(wkI@)ztxO!wQ!`Vauc4oOj9DoB29z zcqpZ~%T4Y_h@uDMd`!Dp8PQQe<;J|}voB**Z>)1?VGG{&=~r^@MVt4GueJ3M?sw~l zi_VG*ZQBG$yDr6ZAN>;M_W=O-f(tL?tnEKv*JCa&@8S&~dMz-)H)*4>R?vIXNxsbj zOiFY6+uU(ouVXXg{7cWl^wzM2%pqFKf|)_^p$QDvhO)_1BJx#Ojq@@$_WK3aYP|O} zb%U#GX(u@^^Uf44I)fICVq#~WE7eRkTzSP5TD^rJjKQX+#ePWSDuzmc$_Ya-Z#qrR zatjP4MFfc8hD zhN^OmMiK8c;{IBoRe{2$O`tF)bxN{)sOk1K^K+J7S8ylZN%Gb08qq6Ca?vWaPwFZp zuNm5ke~#(oKSsFrwGQRIul)dD{=nDy^PB9Q=+-re2pk6-p@Ch%KLfV|zPZ^~a-Z8i zkkdYJCa-?hYnbiLF&=`7CW+#td@bhsED$|0>EmXRu6FTk(Y0DCe;#_>ne>B!{!GdB zZ*UNuF8DCUxrX3jWo69r?waAM;1=ppV6a@Vwmb$e)KHj|_}U(2191)3c8*xObd9Bp zS6RGZnOzqwvHPMmRxYa;EH?PDqKF-Owoj+%2rpbKI%UDa!aV(6A(|qMn3DMfESrp? zl-0M?r#)Y;+MxRH(1$g5L|9Q<{ia*l0^FGol6*HMHSU6s*z)5X~d3;R~ZjI1dY*!h#MM%;PM=0A!c>f zD6Gv&*|ZAH#+bHcm#a#xX{Db0S!*p-=yc!xZlC8o>3RI*#Gmu{hyKmJsIr|3+!^>= z;F4*K#t(tJ0S^U!y_r|k>-2ce-#(w8pRk>$Jp5@Cra&j*sN6)DP&=honJsSv0UyOi zT_G=gZXd)T_<^F-%*-oh7b2!~m?AsqX;1~OL7Yd0RFQ;XNQPsRtXLsRaoz=@0~(-) z(Q;trl7?Ns8MAm^#m;jocAhh4*DotBJGW->qA{Z-N30blTA~xNABc3j9gNW}CqJJj zBbTNBnIw-B)hl0*$t}sW;N>z}&O+LrXwKJS6s?ZD6V<7blElLDs~D0;y_8QQg_Xo8 zljlt`+X*3}v_Ts|rTPH16Q;{2zHvO?I`iur`{HbJT>rqsx&JL6jY3pVBe_LITSiw( z@rsZCE9YLa{YsB_O{26Ox<#M2fBJQtcgeXMcAm?}oo@P<{Ox_7(NgKMw#)wW*W#HE z`S*S1$a~iIpKz8QkTH47Qjyt-=g~gbYbE!JY0;y8TU$tPq2jBN0X%YF;i!*-p zO}_S%6Yy~?z8?T7(I95kN(eqO9Mm+mfWc$*^m>Z25SECrIfM<^mhaOdskLrFv|0&} z)*6M?g85QcKoQSO3aw_J@o>`0$TUe}_h=obg z<1r>OGuPqZYad8=rbJoU@A@E~FfnMf>7Z4~s1=+HxLU9q-U;S!b=fl-cv)M5p>-Np z(ngQbp;g2fg)KBiLDI*V+Bv4gD@sqnIUi&4 zj6GV3PKk9$5M*c>=*EEiV0VWiDYYob1y4^1Kyvyd}Q`RFc*mVy7 z@sY<9VuR8SQ$*QSr@znTc_a9J>PlF6)@V?XZdYS%B>1LHN+7qj6Wc8&^_dvk<5>%Z z(NlUXdujz`P`cpjOaj!W6+g2mrgrx-9@`_e2}YY}O#O)Xmq-gmD0rc*QWX|@earlo zK3n#ilWK=XytI^QjpTe28LW+QjYu^#O`xt^0)QHtT8z)eBTrL{tbq4vRZ}v9HqH?V zSgR=ui?vgj#C9_$SMR-0T_H+RQW~_$&nt4vBX7+Y-u)Fm^!nqu?jhIPn3v`E#|StY zI1=~((_JloKkH=rhmO1a4{dbZ{06t;JzSR`%*`u89OL{L?>%)D*tKh!l@*6eMrp1RtcVJU&m0A4nSq$m z2SVe;;jjVaK{Y@Hs+I&m<+r&8)?l~;mM^VYTdFX0C~b$rl=4CXO%sI{rZv58i8YC9 zo?0jwRZW!9lugYpUoqUXIyOnjChUNTuSyonX*E0YCv0f38A^jKl3aX@MCX(0UX*fX zQmGpZYldSd!aZSPu(UK-;z7^52iwnIzeQkQ$E^;#LwdJ_)il2v zi7$MdAD#Up2E)N#AMes#m++cnUoQWX#*;CrEN%3p4UhoSHYpPS-T(JQ4!_~ydwu@R zj^FJ31F>2i6u08u!3v=!9{QJwi)}D=AJ~8NKyFq{ngx;Ct(OX;%_TDeimANARiV{(z(I`|otho@92D zjr|m(f&|dYX{{kfEuvIP5vfq7!gf8qS&Ivv+C`jG3Zl-_L+3mn4qm zdM1?LEYyilVS6A}0MA zMGH>S%HVyZZsa;cOl3a>D1*@jyH*!@_zUmNS?8U(S+CB9#`O=p5f8l8UrE(0y^JAF zsCyyHGY5FZ$DYH58zfJ@&^?Ip2rgaR#n*pw@`jw_io$!x(%N!j-9!%FdL8UObZY&< z_V2Uh5OLkyxqIhcAMcZ2{ut+9bY235OJ7VDP0?|vs*1)35fKcs8};7vz(nZlB1o5MC-qG#KMpgt78@k;NMWF~$Xw*evrYz&r ze4U|mxWz-b61c@x)zLT=xD(QQxnysy?CM6ZoZ+bZ z{69YTyr1&0+dQEyeI+j=l1LpuT4arALbz;9Bl6!W+4cnj+C-F+x40-vX;s9GiLh8x zq|7-NP&6?a4ppOotD>Nk1Ig@1)JaV=bW9f$3zV0i5p*O19BmXP0ZH*HeQ)yjt`>v2 z;6jr1)~T(M%8h8WvJ;`3sL;wLjMTJvig+{~NaI_qf>u zL|rwg7Kq&HDTGK&6XkDrp3iaLcn6{FORZlVxNrz6TCC~tk*|G#s@WVD*>N*sR82N5 z`!dM@IPIKoanSYlW9zl%SX^1$t7HB8!t;3bF)srqRmm6_3ApWnm6Pl!0E~P!y?+9b*FR z$J8dtm5Z3hznn{_YHF^WS}QwoqjNPwd_kmYJP|{a`I4feu%)mPLkwsm^JmjEGUsAxs=#1%Og$1M z(86d+ZSb|n)d8an-LeD})fg5R8+PriAPQS2GXR}SnmjRkl!QIx*kcTdB^cWqRtoNW zhX--WyMN59p7jRiX685WO}WC@1^f$FgFte11iK>Ad$|$tGN8J;SGPBD(3V4anVysEvO@+?>#9k5>lQ9%gNg`4yMoVLwLBNk8RPt|w zi>=zJxFUMIlO!d2C0`-8QuHKK2ZD-IuJPhw(y}7}7b8)FF2EF%ezQu}&4DNu$fW?J z2qfiD(GZDBb`3!Vf(j^|6-~748Ukn!%0~#E7(7u$mPSkb)r;@X>D#}*nXk=;#2pU5 z8*|;Qtutbbszrl`kP}~-6yAOE8~OJ3^{+V0cjvKMVYTMFXMKn7Z~yL<|Ij)_-PDZ6 z!#05}i*i%Wdqwe^%g*ETr+tdfd_g&DSRF3!)$u-j(s3-V?4n&417bdyRCK*hj4*N! zJ)(5v$&Y;+3v+)uzCPz%_yeB*{s*u++Kp>sn#Tkb7D7W%4aJP2zh6l)uTfoyMMM>m z&Wu4PR*GuHv}D4`Mr*QI#+F%<)_NeeCSn;#9759U&;hMtOVQ68r$8WT2c`yFp*tSk z0kZy3vSOVGs-=@oVKnj%Xlhud`7uIp#L!S!O|MsC3Po?GL)k09XqhjQDO;xWYh@V^ zYL<4a;6{K)^sJ+%89RIvFbL*CA@9v_;8|H|@GeTV9l^AT=vz#)ivcplbIoAb+=_I`fv3(V>rBr&;5p5!!PC>ulqbxct zt#%>=reuM21%7OBV=yV9&K&I!r85|`$7_f4((lVcG#RvHHCXMbsv+Kc3aiD9Q($earf$IK5?2R;Q>bWB*w$1n#E1*xp6F9+M3nOq@Du@Z z1Ov8H(&<||eMvad*e2*m6Ffdv*aEtp4tRy7L z!XDQVqXH-=`X?r`INHraUveM5b>=rV`?XouIAGyg{PkU*)Z$dK7*LEt?F~^tW=d(i z3mpBa7qD~X(sjLt*-j4~8=|k!D86|5XV>-kzb|T6Gp?$X)kaZ@+(+@ssp-1^8b)!+=mD%qab9{kxZh+ zFib09Wg*yyUf-l@vO-bdYL6yh4QLgUDH-zjCeN=8*b38a=*}w2Eeg{~^Kdb7K!r&~ zajI*K5{+`%U}lf_D4tH;!h(0i*bwmy>x$W}b9CqWG{{9a-nDI_=w;(MTCG{yv5Fr+ z7=jxG+$f;E!UQEPx1>!Z>>9bgrk;3dWm8U{)+MyY7>l)%X1MH26$0C4_v4jMc_ZI@ z*O}b=wh!2hSLO0?GH^>o3gc>L^w%WO$ni_yF~GfmO>MwyrFr;mpTOr|bQVv(*9+;D zJyA__iq+*Yu2Nif$&mBUU#3%bDNKn`2BV;3(*)v#GNiRIQ|h`Ft}=nDuBfUe39=MP zo;wg~>DQ<*p-oLHb@DQ6Yfx5+$=SG~EG^0^Y6q?<*tTsy!A4X8oI!bu4hj>bC+uq1 z^7OM(=uEN{7HX5Q4vZ-hqFdTOy`H7pO<<=CS_2PuSlYthcxC@#-UGv zt|O1W|Kqsnjc>m9H?#?H=C4oTh3|U+!)m3aPj)+o!hlsI8SFsgYaBHc9^H#{W-OhV zWHgql2Qemh>eMFnP83r^rku9mxr8auQoKk1R5&0 z#@7A2Y&)b!xmBtH^IKrcewzNQkv8xYz%-EB>mYNVQ3CGO8Wq4*j+oR7BazyJ3sSDO zg~kWh`i!_*+9bPn>|)oBMMi^4SdKL`gFrKK(gJTh(MM@rtEpB^jJP^d*dErF(t345 zmko$kh)RAE`SF!S$=^TVA35dCXY!;69JMcegnj`$2)GY$)-^rI-Xt11z6#tL_y=Ie zIvnpR$3lNA&%EEu_{hKgh&vzgFk;=ok4tu(8(6%cp{YFGvP306pH^ z0|DxU=B&PlM05?_Gqfe^5THe zAkb8?1ujJ|c5EhTMw_q6Y!YXUwe8|l35rpbVAlK=#ij$lF} zsT%7@En$Ou6@`nH~O<#ZhEV29C)Y&I{?!V@U0d|rlL;d z;#HcXbi#v3xaX|M-c3j{XtprL1h1Nvh z5QA@lic;XS_(rj^G-fpPBIz1K0!oIYxvyzzNiv*s_>^T#@7O1kj!M~cf?1}Lhj#&M z3|r=B*|M;Jt0P8r7!5o-cC4|s5@;$Q3cZz}F$s(sgIL^GW09QIIxprjjB>K$gP8o} zX);Cu8%>*?L54)7ibt+4#st4el^JcKxa$^TZ6A~e>+v+yp&=@Z3nf)ku(AT@pTEl5 z&)J=W0kK?@K9sm3G9jW%FAftdxx0oU$ugPZob{t+|G?dPfD5|~Ej z@C3llII3w;z2Hc!KZCUbW)`($Prq*{OP%l{g5QWfpwlEdSRJywdxg>3nAilOpXi1- z2i4f)()S4(gOxF!VE_HM&^3zaY6uNR z1v&-HbQMNfR4nmL!LD5m)i{BWlmMBeY*wI+WjL&oF`JxYQpr%n#CsC=5&6C;Me8FV z14t{FnJGE+kV81^&>Ik)p&3V3mmRxzI!0>{YB1=epJC8h0WapN3pBM%a-B{GTM8~E z`6HvX*wuGBlZi3-kXk{hY7sMFDlyGdGSXH%40!Ds)oTPiwlLVj(D(*bC{&>cO5s(3 z(tTD}BNtyXV0Bdn*tiZ1t0{zR=H0fFhM-@J63}Syj!`w>Nw0VUpE>1(&3;wZCGL5P z`%&nwl#jFLNlXc$Ra5ra9_Jk2+5Qzy`oV|R<=iv9*@;5GkSsap;_aM%_Qry3tGb#f z?;@H3n;n-fUCi;PypL|TOJQZ4IOiGHS0A7LweNnF|2niz>?V~xgI(aX>#S1{zk zNP-dCxyC2EhB%dEghT|%8@E=FO9{vl65J<)s55^x2GeBxaG>9Nme zJY2(?K&Q|YT0=B=XQ(U9XaH-glQl6X6Cxw5Xc`!g5_g$ooJ1~GBu7_-(IQ!?!d1Q% zj#Y@b(qOe>=VeRm-nB~4&NEYN!75pxARQ15L5zCv!r?Gluo(*rhN5tcMgzw6n5Y6i z1ghFGZbYywGP(YV*iBme$Ssom_o6J6IRrWjigVNBiwBRAwJuY3X@{=(*1tgmO>@ZiJw zo4jxW6Y7d+!3FQK%XF6I9lM7rXhz}`V9}w=Xb@Rm8si(1kB5Mdj8PaPLR3xd_H2_dy?~O+dD0e8+O&dV zDg&OhYIhBbJ6AaGmlyJ@b1vXl=UmL<&NX>KQw2b&Y*iduv~utf6`|KF>2yo9HN>O^ z5|tP{wdKopG0#cR<=~ik_Zy|eX^f`ZE9rDe+WPX3Y*`S}4$=FFQ5K>mMneb%O`sLNGsv+ z%)fp%`)@s9-R^6><1^p=F#qzlzo8mCsj#?(F%9Eiv)=p;uDOS>I|K_CRpO|E-e-t(`g z@T$Lm9|tTPwDB*-o-shADvm&;D>f`PI?({(-o6>(-fp@b{b2{+f>%H3tGwiKpW(oT z8=zGet@>0$#p-gM2ANJ;2&$F4^;zW=BXe z=BYh|XnqtWt*?P3_?m#idqr>>6-qQEDs~C3WHeALEe2MW0`*8!*dAr4EB4t5OqR>} z?T#@0r}aKaZK^EW9fGHE4M)A=sT}jscWm6tumN$qBksf<4!?T>u_XXui^5NzUAqv< zJMzUJeS)w5bnob>TjsV+?YQMLRw}Z4bqA-Oy?&t6%g1OuN{f>M^rj1To%)M!@snSl zjx~u^taQuHx;piY9lLh$>UX?)PatO+G-~QA5BU5?1@wv@_rBvFZ#CoiZyw8Y-~B|X zashP(O{2(awz++wNY)DJ`DLTCP9cd#w-kIv?HWd-nsFuOOEPZLT$7DT;-1gHogI}( zxC=I8QWlCx640bXW4cvd4b`ZosU5*bTpjRrWVkYBW!D;^MpiVRw34(KV#bh# z$z-U49sTW(crfpJ=1+LieP2nxyFYbp8I43*+k06gv{nSKAY=ii39>rJ1mGu&yMQ0F zzP?0O5)=)bC@*-__zDI)p&3EUhG|(aD@pGf4BmNM?c^o*u(UK{uvUpmoz}@*C(ty| zxJcswrLl!=cVsHT<3pmNk&=-tF6D!?Us_B>39*2xc7&*ju^_qvS6ia%f$QVOT~-zY zzxmY)ON(R5PC=(Llls((x^DKMlf@)BGA(hQpPf%CrPeChIaz?fbB=x%@A%)hZOlus z0nsVCJpP_fmP8}z6vq(T>QYua%sa^}kNnzCKA#JBoqvtbJ3qUHUOAH(FX>H8Qi!Mg zbmQ13!|@R31URWsSiQN4#(w-Gc8B&U;KlYj2_?|9 zz?v+kB`qN5T&g}x<-@s1Q;9alXtiQxagCMTYm+{7Tj5Fx2dTAgpl%wfx)u^aB`xTP zBwTYdeV+UG&*zk5e#%4d^tgS&SUQa<`}WN`>1HMxIrfy0tV^rqCfBwY;hchSqFRdf|) z*UF$W+22Hqaa-1C0Jbjl=yVKqRZ~?B+6Yk7q|&C*n&2Z<<h;Jf--u|it4os5S8Rr7zhI{^Oa@7Q- zFxv2ldp&w%Zg4N-*e}11mwf1`R<7D;D|!u4;a#dy`Z!56w5HqXBy9$jOwWYcYK@{S zG%6-&KyE&fAkg|(KD zSRuw(=I7>^n_HmU>0?w$VS5Z#$E@uhbY*D2CmYFp%efl%fV)1J z(?0ey{^RMdVWzv!?Ave8lzsbV#lA>1a-0bK8T-JF{(yypc>Obu;T!M%9(TFTT|`eJ zh}oFdI+eX5X6o@|$U~eep~~j;atlS6{JWT8&eK`2hE7*wOPL&dy@HvUE=6I8!Q-1o z`g?)wUW{u*R7NX>kD`31wSYxqP_4)f=t;jcPO(nf2^G<^h#FT1M#F}tmUBq9U*J3h zXK-W9+HTKp&RORCpI4lJR>MW-G^||aC{>5K?hL)MB>Dy&Mct1meahex081JuMCFon zxwtDzOq$+pJBlcr_5d$`>wog%|N4I$^$M(OY@OZ4Q||XnTrFBF)8MeeN*~y{AOPw> z6~Cp}MnGyxDc*bXTRHXYYgXJd+Hm7*--MWGce1OJp7FRIaq8LMUe|lfQP*R12KdHE zVK=X$@%1x5Pp4Z#jO}8P@jh2a)8p8W9Lw(I-2h2*CZzV0?8=>wqFs~dmPFcO@1?4C-$3g1@`Tm75g&L02s0l?dWfP#BKS)TfV}3{`37DeBiZ! zKv`I#55%PE*kUNu)R$J1-eh*}xm;@?#EA1#cm!nU)#+Qd?BAz1TcV7j(<>-CMv|Q@ z9iDo6*`s82t)UwG#Bx!s%&rK{B#t?vQ<3YyqTCnT{ALfq8V60~ldud4KVVU+fM6h$ zRD;Okr6Vr-)f$(b?^(P6RxgD(fFcxhO-aXE@C{lCa4T~jTNF1W;T%uE5u#6%QhF#U z+UigqrD>P*hGXBr|9kxlHufc0r?}r=JeYnlE3LAS44s1P)131OTq~41={ZO0rs0jB zd^yX5-Ph=x*WUlSM5iFN`=ooKh#~T&AD(!Pt0jLZYF8(De)+sMOR#I#>ScWV+s8_x zp<=2&1bpk*8LtvvTbCtQGYFdPL21CLUs#cE`;u&i*~wnP$uJ;s>u6}naRbUuKZ#vJ7o zLVjsIHB~0MYzEpYR14V6;QZ`b9aHjcl2WK55`v7INN!(=5~x&2h2>W_Fc>zhtW_*6 zkJ+_2q^cs`O9iKCV!}*>Hlgv($yZVUrM(ByFd`aU6B({m?Ao!++R7N`LXusN?K6Ui zv8lzTC(lnAh&r-$VJokB!GH0!4}OO`-D;nh?w!PBGrzhoE+EIgPBe1tQ#<;{-tP&V zdBQooNOM{!+r(fFFiRiFaaT6E%l<(=_h6^29E6=xMYarz_4Ku_FejY=i-L@~`=_EuZN2VCuC z=bbF#%YI3x*P}39jOw5%87w#Kyl|Cj5#ksDKvlp9s=igZZJFNCdEYO zCp5qylEdS1&0sj@^zGl_GvEH`H9F@)e;ctTIRM8AI3~d7PW>e3U2@KP-XZ|wYD7q) zGinpTpkMpRiL6$;g_>;(ibCwWLy+BR6B}lGbARv{jca(cuko;qH!hF z8l`mF40(((Q>|S|1gff`t{bUP=AmDSh+luoh(QO084u;ps2 ztApHQR~n zj8fsqVp7^DI-MlF4Lt6_Py8Kl_`Zr5Bd<9A*}V7UH$pXd zT$4n(l*NURR45}Z*^=jKr%=u(iNAo)Wqj)i3_;LeG2nuqY`&r}LyUoLS2NQu=ypm` z7bWQnBJzEO)%3cCURP6Eg;ue(fAGn~3}o(Y90V_IENwtp=yWZ!a~(Q8F_LVYZ0VFS zxDcosN7eX*Mf0tWjXXQZlTlqcl+yJ2eR};qE2{&BBk{UwT&{Q^?*x9*1y3-ONW|fA z!QrFlUVnLSet7ba`LCC}iTT-mX5W5W;FQfi`5%fuj#0B`1f-XAL-v6k{q+yM0mr@Z zc)s|duW+*?Zy{OxleS&6X5hg((6- z)k(u&qm)!Ch%tE&NU~Cm19cTrPtXc?JBeOpFAb&C6gV{vrc~L;tsIfXl@hyAio&R= zTT&QZ(C^Mr4;$)XLu^1fjdB*{3se+Vi?5={@~VhZUb6fc_ZYxT9)rYG783LGNo8H{ z@-=4wUiu11B_+TIPkIk8ddJi8VN=!ZuT~s>ottpfL;tP4AD~_Mfp&J19b|0PS_k7b z-g5lwsII26iC(DG^M>E+Rf!M-FZ#e!dH+}5Ds6{c5sZS}Q7G!MV|Asbs*=S)5SB^PII$&1sMvx% z5Fer}Qf3Q{DWoJCqb$^U6QieqkRfCii-5lK=E_(o(wt_r+N1gbB-w67VJ)4)(kTlH zD}Z>>G>S>mTySM&VX=jk>PiCH>(s{Rc1z|Ldi48+h>LX#jMa%AJ7Lr0?siCW0p3OG zIxrlL8LT;)MykVQr;FB_y7r8Q4az{#)iPgqMA*=jU_0_IMA?8J2LsS^0>GwKGkKeS3iyS(m z2oNwQ8Yp2qXe~x(O%tfciQnzPps)$&<{F2JqN-Y$61*4)5rIY}&bY7)WV9yyfl_2$ z-JIkIUgURc8@cV&mN=r|3UYrovorS)--s~@V9Af1^zD!G!goLAk2=|S#9bdtVY*XH z%hve>(yp^s<5wEi}V`8%2Cuh8AEbC{FnH|8nWl#p`;1 zqw!b(t;sxaqiy2PyL3BmJ@KXDhMXLhbCMAV495djR+lMs$#o9A-tRrm2`7J?v(Eh~ z-uom=EgJ}9HT~Hxy_qhZZb`4-qbLh(VbDes(| zC!|8Vk;)Rs+%eVr-Ea;a%tq&YNbf`{?QF&qWf)*41*M_Gz0X9!{*S9TQL8AEs0 z(4A3~GtilZ?yRCaqqx?=+j!IK-olT+{Zk%r?+5OSS7NX1+czuzm=ld0*^d6+Y_=V} z);#W!f5XpC+0JwS>G>38cT(LzvjcUkrkkw(T4rDEpX_e+t{{ES{uV*MF>6_tSP*!aIS(FWH->BT&&%-w&IsE zjtqyMdR*fhFZ9`j^p4(Rl%~*@dRU>N_>$luHc|-@R6bH>$*rW+Q_4l0ypU$lh0Hhm!9JU2lIvRe~cF#`-D_F|Kp1zuX9tL@$l!g6&vxEkv36g zoiw%FSYeY(iFZKYWyidL3opIkDxYg%c7f4KO}*yuqaZkq&}KLc#{S>W2$B>8w5n)tk>%>KR?I({4D*MKHXl2nYkX_eutuCi3%QY*N1Y~Ti;{D z?(?dK4~`eS?@4^>yB|a=osx=-0}3>?qiGtHk`2a0_8YV=Fs75FxV^MYpv5?3!NL$| zwI-C(tgclw$*@tL8VRG5rNkj)uQHw07KXwav}xoz8IPOfYHEch8pY$uC~2LD zk=ewYEjXD&tGdSdh_MCMlr&BlB(909t&JHD$E++n78fIHgNotUQM-_yOO_g!@~%Q! zNY+{k+Y!r$s2GkMyLXRpuBNJoXyce$FwD*s^kxmcIZb~-GrL7GyP%lgTJqEI7lgD8VISC&^84o7GW{eFS9 zlF>USJA0!bMsfZVEs8Ap9a712s*H#d1FDf{G=S)!-|JBphH5nAvP&;!w0n&(bSST| z+N5MEwMg1}O1jOQN~Ds7z${V&6VpDItX>LJUNMMUq+FYBSv5pifTIe6>55|BPnim+Nb?Hm=6FBor4y*if&N?`;1v$A9ykvS5XV(P+qMJY;Ek ziKXR5R@YXjsu7K=xx=5`{R)o}W8~c*{cm>c+L>IKy|hb8%k10?GqW?;vY_mwgdebl zZP_T@Zo$+4>KRvAqhq6@aW(&P>|;6c)DJTmJt@)m0bBE)I@(MPR0Q! zOmcHpQeqHbZ*aKA(KNyw5jI^((*y>CiWn7xHP5b{H9Ib=Sz3Z_xxm(i8TQ}LaGmSU zbLe&Y9DMK$+xDBGD5T0lh=j%q_1;5M2kP3RO~JPP=DGGE+c@yRc~Ib*2Bjn2UP;l_ z=ptY`flgo1pEKO^9{1wpPn^!{UiuF9+qUU4^x3}s=D^;`3vXilDJ2>(v7MRasHAP{u){>>jg+?i2WJO`YZp%Bf3{CyGm$vkwK zZxW*>fz?`N(F6|Fsek^>pM8#JzxR<;&1f@UfvXfpUgxI#^CO<0tgkavPbE;Wp|G~4 z24-5NF@m*u{d-=;>1STGD#ZTV_NRyi(IM?E^i*q2s#PEV=7(4vt)I=%^4e0{&?v)=s}zVxF{ z?a`9UdK7ui$R>?h<<5LZGgNc@n3RgOppe zhGY|e5}7B;LecM+Xd{Z7jcW+eQy|4a=*T3@3EG*1VS}6&9nKSqhvx%7ee`*D`6NO#vBy>_ zf#lNSrj1Ysb>ib!P0j0%J(_WK<<*)44>*v+u6tN2FD2Yd%==v_6JNOVH~i#RKUlZ> zT3X%RR@#UgXR7w;?|*%>4aB{$W!^$$sY^>LLH|j)(Bo zGfzz4$!X*i&Zz}BG9~aAvBpxA7Go982L{82s&3@7%K%L^8BajMKR{hOs;Z$Z)25}Z zSeTY!B69?3jEWnyEljG;24eJWf@iG~;jSde=W0(qZp2$;>~T%@3y~!$#AJvTY3aAl zgLevzv|e=jwX|!<+G>T?ve_y-mQKfDt z+OvfDk>DBvSd&qxO9NJkY*lbL@96amvoj^VUO}g0sA^B$B=$-gz&dIS1|4CzHfB6( z08LpIZFR#t+KE{FPa0{bC@G1Sg_TL6@q{{vEN(QdvZIeu(O6j=FkY*%s=!2>M4u8p zHnl6%n1pBT001BWNklsHX4;xv3JTzEV3SN`j$MHWTq+64J9hMkF}7 zx4eVu_B3VJ2!KzCDxgp5jo<&}DLnn%4`FS*sph~}8aF)T#yscI|Bg`_qh(jAbi^p} zZcs)NMr{ zSHhnttnOg-`uC>KJpVM_@aY$(BzjWGlPZm)EEUE=h(Zm2(Cw~x^8e!ZPUP!9_yUFC z8VL%N)pTcil->WIz4MNfq$>CR_k^nIo|#P~$(T_wU`~Ldh`>d~?DdKnvtW*hnDBxL zjHtY#*Mx~{Kmh|@b3#Bx1r!uPBrdxTPC%k_==T!GBD7)MEHV(b_CJus?tG^q!lTvDSfB&0-2(+aL@sxK8%$xQ^? zAc^z%IIWQuQ@>Z?y*OSMR#BCjB3Df7nx<}uK~a?zg|_%6(2N|zL0~ZO3`dT-4YVN= z6lkj{$^z#iqhVw;gt~V0s)~NEqN*%Qmy`nj)S9v~LXE|DY@tYM=cMrpw3uf`i=n`` zpeZ0|+Qu=MpQj#qjIs2mN*?u)$MfBf|BgeS@&>B1x7fG9C2V5*_Qi^S_CzDcO=d^G z#fmL?$J>tO$KUxm58h+XgiJ`71EcY&Zl{%$#toLzR;h<-nO;(`)z*eBwy;d~ZR)W@ zWh(l`G+_j@D+9whAc!b>)@U#$(ahS!IM4=dEdhnYHx;4 zK}!+6!q?zi#3j+CYK_%GXG@a>MkSeFIi_Fy@drHpgAZfX{56Yr;nyJ^^S~!@i)GtE z6l!2$6(~oDjhw%7w7$hu8e3^}5wSfvuh$>_dM>@}k{jH|&O7eh0Z+Y)_y#J|$EZ?N zU!&%XU!5ii;|7Kgo|UUsp%sKSfGajS7<5q2@&2#Bk=oUX{)rvNIx6S~NK3YeySFmzJV0j?hJEn4YefnW~ZpRW`l@ zA8TwcQ1n3CKtRC4Av!{I(#GjpOHqLEZAx(FYucd)Z%|(2N1l4%usX8)9qz$NM}Lc> zU-nV9T5*fTzWmv~{q}5P`}W0(f0aZ7#&+~~KyVz3$|b)0-R{A6PW?V#`O??eWtUqL zqm&LIfQ6_WzG5Z+vXO)lR(hv4Fj#=yZ3eI8YD-IeBNPCJncFZm;oTr-!=u;tcUQuQjSAlcNiGKR7$ zrNxkNGQ`M1dp(i6?|QF|dT#3)YX;Zy?DrkWumAKjlv1K7>jl(ZR$^`zgD{wc25(SN zNrK*jZz4ni8!IE~!@ViP)J%!71yxaDv_%E5+EDcr#!AIC29YG!%23#X(I`_=lk9uf zVgYNRstiS8J8u;=VU`v%NHn$fyo0&bHO(kM)Rd;8S5_Ep@Ig_#NE-xEY6^p~2GuF; z0wFLO)U-`Qj9%JdB@{g{WgsZAI0y-_>U_vK50G$lL2z?T-B6Djnz~^)7%`X|G8)xv zyXE$L=!pN})DQlId)(=Mi+$-MBIR%=7RkPSvEpAT(a7;Pgqd<*;D?L7^Z(fYKz?)9 zZ#n8MZ)bXXO0X0aR8y8-zf9_OI!WCcW@e^YzHBMIUaw=1W_x+>Vv-e44{+4Uf_#jH zP)eh8dL@iT2B>zj-9f0MDriDy7d>&%S_wa08KEu4ak_Gy7oIdx4&sb_4;7z2`UATe)JO6%udd=^i7&x5#f^=0dO*)~}maGytW zt6SVInMLWY9Z(dCsxtJaEJdj(N~op`Gs}9+tf=TOu^e;!QJnSbe~ho#_7>Yhlxl`^ z0ivQFH3T0iY>8HK&zyVlIU9T~f{PfWzByRk+o%|g^Dp}~@A&d77nJ4W#Q#AmTqdo; z?|Hii@Zh`df1T}|eg4mR$0y#LsGCsrE0(WV!4_L?fi{Nj4oYB1Yc0mu&K^F5$m1UJ zqy-{Vixn$pujFa(ekkW&{PQGGH6Eh1QS^F(gNTR&Gf`0%1sa2Iqf|4RKulHC5CYa} zs-C4P#iiAl5~FN~`;wwfVs&9?8o`xWYjF*oQfLTc{FPE7>@_`IbmCb+8k-a$s1DRF zOb-EZu3ptLKikmO5ko<*oW|OU5cRlaV#E|qE1|xcs8GpywP{*>bYO!BXQh{j9mdYi zAarJvSz9B&vL%4D%0{Ch^RsjKHgL#6FX4wDKaa=lbMQ@Z?SBF6fk-+0WwCd@spDTU z(a7;j#E$+6z{QKX<9@%-t6%;q&O7Hkp8Djc(wot2x$P3R-gY^oW|*)P9`6ufW-vlg zOXfzdi5-I6x3F^Mkm0~#jioHhWLvGVR+5XRZE2b&N%v;VLvFEjJX}b$Hev>ll7Lt|guK~fGxKGzA1(s)iS+wc5)7l#GcOpW#BRqLD@jGFXtcGXsassr;@g0=h3M%7lHZOZ zDnme1H;$%>I4`9lr7d+GsB6)&NX*kD3`PfT7wm(g*DujJdoKy?)%%R^N^F&&@xjnI z!AjYV*;^@>Zw7g z0#Z(C{4_$cnGZ7Y=NJ?{EY&N%)YUjMAOGu>Zw`}WI_h4KA>A20UK7c2gi z6Af5cidu9#`W?34flnO&34VI&FWKk8`%qL?jC^cKznZ476@$4ER+m&oU&`Jigl6X& z>cI${BpU=lSbG;~>PQF*Yb;e&bgT_&q{x4QNQX>;6A+kVG-`-3CjAQel(mKs1H<8n z`S}5@6S|pN&$~mQR&?dlaRL$-BqP8?WkijSI=O<1&rC`*6ys_@N}4*jNSqjC;#eN} zqASkhiSOQvORxU(`klZgiih3fk=%RNJ(J@k$yhDYG%fS<^VIbKV*}GOhTfE7MZ6V_N% zc&}+36h#kX3Q0p@ZqzcGbqr?Zcmjc_15roNF#%N##ug|nF&Kguplrq}XBNwteh+uK z?cMp(QD^YUH+_YjZgI=Sy3{$ceS2>8hkyL`fA08KPc(95JNi3v6WGz;b=TcF{)m%! z?K6*ItL586EQ!IQqZPns11cDiuJ(ELAiYLBSOqb7+Qt!l=;&i2?b{+rfegl4Nv||y zx?AF(H=~xp{E+!MS@CvMQwvL$Ow+F_VhDs*6hjG;0%Tg-4MnzoS88nR1rs7w9kyfQ z6_ofixa7kU)8{9IN#y%b6M|o=OJuU1M|RRBO+ui!^y)wJpYMJsf4=gM8{rCWSWH#Z zJo{lU6@7*f$8ybD%%^%iMNtN{b!gjC^dr3)c~#SJ zE!4xnaIR%EY^7D2#silO%0e_mEG}rA*Enx*!Qj2nKbson=N!J3&ndJpj3V74MJdFc zHQ}*B6k4bcQIeTx2r<#$14I>>o-srPgHd43Y|HA^^VDrX87n>`ra&o+)dhtv&|dD} zkXkU=pT;LJc~M!ER?-ZM5Tdkx2E&%&sO|2fPVY#=@+DjH)m%QM2P(|R?mf8lnhPOmPKXen zfThJXGi$ z)}1h+(omEIha7kqKmX8$9CF}IV&8raH#7V8#fpEoL?g$~fCq3B*wOc@KF@f>3pw!( zUuDm`?#Cbjqb|SfTK@c}zlkk1Nf9UYBAOb!(`a2#*dEpt=qPg2je}7eXj+GJ4)47n zuG^4SFfzcnR#VrqqDjSoZZJ2={WVM=LaOhP9MX9OlhT+K3G+so4N-t8!OD$8&OUfmNspX1eK6V6WpL_kl&^zC8H%hB0 z3lRaEUDZ<0N31HuU&Tr9`m8_xWP{G3ZflGk<0Y0&Z@3Ni>1TbFFZ}T1W1%_dwolC3 zEOdfr#K?c`^`h%AO@4LZnH=+(Hv{sSvMiaNp6-CeS{tk_yTmnD^{g$aM-8*HbG+;+ zuV(vgcG%!^TGzPfit~8-d-vvwRhK60Qp98{_Qc9s5K&Y=hr!BKAK78}P&*4o^ zJC>z?#}j80Mz(Li7dJEe_Qi^S*F*#8?C5XHO<+gA<2E~U#3AqG*jN4!ONuSI`ig65 zM=+X8DA1&Bfs;~YX$!0>agC=Qw&F8UYNn=)2ofpjZF=VjE=Z}-3%+C0;7ph;Iw^_D z1l_up)(M!DC?KyqsOK*Bbs{GeOtwbG6_^F4Xn*JPQne9mM)YD~UDvg=h(g3z#q?A` zSr$S&MB$=V^uX%K`o_DtX0_5>t(xvl|KktbKwNyqMI8C*m!+#;Fu#>fmPl@i~5cYh4` zz5U(`w$rpV??3q%8rNW~rs`Gnr>3Z?9?p5OPFE@=p+axWpvDja^K*0TcFQ~ShzB3E zLFcnRao%6g;i<pl>LFEep%2fD|%%~VI-kw>p)uvO539< zN-A4YsAA%G5#K6Y8)+IC4LpN+N7I7V6;RUDFgM>Y97?~mD4=b?IYrwmJKi7!dboxH-R1f?svF1Cx7@1-g(3a*lPLKsnU>vkO_wnp&7M| z1~uM+HDy{&#KbTVdRHW|Rq`Ys6HcQ8G2{VjoB`y2YdxmYMMyp=ldP5T$GV7<-E)=R zB3O%V7afQ~C%p}MuTnx|jXu)Wj(XHk4_o{wVMGvcXJIW>)uSjXDXj(>kULNpYT`V` zhoVygB7sC%YTIMq;2 z8+uC$PX6v^_|8wheVy%YyY;q$&`(N{T0`5k4ChB=dvJwjel*Vof4%WWkE42ocxZ?j zUaSZWhP0i7lFJMnxUf}wD?xh)-W7;=4M-F*T7&9X??XRnrcSV zn>HAuhz`Oi5Nm}Wfg43!8&QapY*APUn!&8>TX~(Tx>0;eN&^~PQt?|hvjs1E^xOIB z5$CY?-EK1b_PcX4w{Ksp*qmsL;}4AO=ohulZjI$xPk9c%Kl6MJec@pg#tP&yjkKYK z;e5mV?6A}MSI9#qz6FePff&a~ee!^nL6qZ|9KiAqvKgDuFXLE;0~RJ3O8%#ELeT*| z$1Rgdj7F|-$Zp06&ghk>^wo}f4al7sA#Pc8aIut3<$kmOB?vv7hi9{U;#)~M?l%>D4 z;@D3f!iccoq(&Ny3yPE)-S)o z38%ha?z08>n;hw$RpSKY=?{H5yWi^m3*L3bwSVR4lU^tHvyqH*YHA8w6nHN)V2n~7 z^gdykg3wzB^8>D3c`f@r;6V1d|HE(exvWo|d+{$gY!xXg@sy#Bgi%C| z6pS=}6lq6+h{hI1%p#-34Izvav>F{`p`wk#R#5h&;`7M+J&jY2_&v{j*ef@g7tcS4 z3lI#(!+;G#U;him=0xMV@f{=+eJ-%5GLtKoui)KBAIq z7T!GK??T565uhiXW2;U8Pn`x;-+J1*rEO$Tiw+qibFW6pV7g}Yh*j6FVQy}YrfIwV zW&MoFYRh;Pm<{McQhyXbk+NqPxLKa?wukeBbI;hQ*KU2{zkXnC4Gcp3iAN_{M_m?Xu%8A|dZRg#l`klzYTAF4=J#VuWA+ z>C78_+>L8e0w)*f##*QU_3BG_!-=mDEr>>J!LzgG7zmoDSgAfNpWcecKk!-Cq0@fu z`zLVGWfuT4$&_VD*{iTcnW`2|Cp48YJZ;-D91IxF&r@j2OP>1jMX`ZD>%t#!$ouwX z&0ysM%#n!lDYS|-&UKXwX{X42u9e7;XGdm9&ZS~OVr~V8D1^&-M$0a{J0HL+20j=@t_ z@Sxov%2(fbHvj#!kF#QC(e2w;F}80%WwCdDbC1o5#`Qa>`+wIENzVtP| z^0}{Yn_J!nkO9dz($lxPq_m=+;hc!k#3V&tRRx6=yLg*`d%=(8cturFC;tRRRf+SW z(R!RcbYpp5WvW#1m^jF8LP)F85QyGO66C@H<IIlWbqpr&JkE(g)#+z`nXA{_IQ(<#M8hH93st%P6^#%BANl(Gx%kRIQI%y< z2-DbhI&c5&`y#FglCCaKK8OxR}qiLGXAkA74QjoTt zq8`6!tN6xLT>|K;kBU9YFVn=d=RyHy<-J?(j?KG;GNG9ycKcRj5 zV#Ve};~&SQ9sOyGz4HV2`wxD9=I=S~zmH?-^wLxom6e7<QqUc4AjP zc)Sm(&#f`mppC5bt6qUEbO+)>kxHN$jHVW_NJ;yVKhpb>z)mNPo+>d?!AS4zO0NOe zCa;y0V2I))()-UZo2xH*@)68POh{0p#h0Qm;t!L1`6|s;DzC!GEtJ&jSD>_FRL}F| zqaMN6fBNM`xRTe6hu!s2+N+ zw$<Ld;)bjx13{#AhQp8YL8_~rK` zAB?z=x}2(MV!|c&sZ1+bk*v_Dy;{#uN3r*7qz}Z;JqN21V3Po@p?>xpB z+O}nGZjRa6Sz?Idb5Yl9vtk<#e#Fym)OWEy@x$Mp%8QQw4@PbP7V=6^a2@gHug`3U<>>@54_$FggN_-Ng0b|I> zWMM=^m~uZ}ekKWqq9{Zg#F*?op|DoTprpsEp)oc?7z$!mmV4aLIn-y+9I0)SB&_ps zW{_>;YMyz_6ZzVYPTmAp?jOg}sTDlqAusJ#w=x(T@n}d=%B^#>Z6k?>4n*xyCZJ5< zZ6A0O=bSs%#kkF_ZVw@Y0!0~C7)mw43vS0~!Ty|oBdNZPYr5sEQfj>`8keuUjKlxm zD?5s*$W^CgBaSCkof2e8It__Uc?;!x zFc>gDH^*Qwz4khQCjd^$)FJjI3>wOEy;#!6m1=GEf6(jSx{9K zRj;Dgub7&aM58Qq=g(7Em6ChavD-SowTXd1O^gKMUab=|D!&XWXzF>#{Hm6@l?`*( zj+kFLWH?(V@TmaYwYC&RMQJK51^@Z*r}2a1&*jCBdHwa8>TTl4_U(HEzgp~_|1-ws zL}UHpCbOg8a>Z7>>9BWj;v2rs-EZ?i5$16L(aTXC?ji(-_hOZ-w89o63X4+WO<}F2C=5zN)E>0M6w*#=T+Mq=cyC8{-D!ti663^D zlm*7fO4heNwH9phyf8OfxT|i3-kO2ARkiK|e2kG3zWyQ3`^)b;&4ud=NkGQ;&0`<% z4DNr2hb(x{pRc%pcYf*BV|JEK3A8piClqPdil)q(HEWn%y(U#Y6m?V6wvGqgYi|yG z@FQ=;x3KPU+Sy;=u#Y{K#$^-Eg%4NP;_Lp+ga!p&`!P&Ze@OJ!sxp+7N{P7d^mE$m zccdg~*V+gaI3Nj!)8I6|mINa>MR1B3M5m`Jr|9*1>6z3Nr4hrw9`t$&YYe3opn6D3 zquwh?2wZ@uQ_CjzRVCRs#!%RjvaG~|$4b)Rn@BT&b^v|^s)bmC9|e3HvD&68s7EQy z{qA;uPXF+CIqsFmv-R?AHtF@do*3{iX5YS8u{qIL|7cifN57~V^}FtJXFm9{ukh~Y zeTkj6xs9|8d?dQmE>I*&nM$Q+i#Db+Ndxc`Obm=j`a0j@!$K&Ej2Dyalj~$5^3#bV zLu91GLeGlSg3;PwwWTzM!iy5=YXN zs6!Zk20+D5&RJ{lq2w}MY0Xrk95y49#;z@~^P z(U4>#Kf@8{Tbj0}ZAU<$*V9Z-OBJFhDvT}xi=xEn60HlA5~a<_MM-X7TCFLqrZB>R ziVf6j99R8ymbq&jZXT2a9YwL#jU4q{O>}|MT6WlK2j2Jc4{+)SPUl{WfT>w4A|ico zNB+g^+ZQV~CmJ_CvK{?>fFCXP&L6njethoLzvd;6JcgOx66w!+Ki0|U`oOtQk$VXU z$gCUK=sXHy9vSi=rN)(kuH3t@XaU4At2MPRCI>#oo04}&CK8vi&V>jO$tpesaajyW z6Qb&As>&t_X=$Hm#8j>*Ob4WlQ3f@w#?;%)IOuR71r*jKb1l`aDxGUN^j**9g#Z2E z#=J~7827r}o;-1n=L-X)jR`F4Xd3}6wrxv@4y6K01)6q*EfuzuFZC_&cnho7tY+sO zcg7f-7z?T06=PD4ba>~8Nql70>?;0nBlI+yRu~B&*Kl21Co5;K;m!Z^I)aEYbgh$2 zHI>%MSfDCni(dbPcX9h2?z~`I-#_;>KKp;ickKpgpCw(1C|ViB432adt*OciYmA(K zfEPaLh1~CM_rLyw-3W2=Pfq0ZpMEAGCGPTUr1L{1T6sSI$xlvJdd3;E);jrl1gTgC zhf)!f!AXpP(^9<}8w{!t(NUoS#5Uk+sQ^Z=z$bb7att!Yn6!9;*hZ$SX%2nj zOZe%Dzu<}cKIuBFqeX}_`4_ftU#!@iXl!`=64;ZQz>dCGPI2&qUdfkU^Lq}w*TF!l zK!B`(qYO+jh6&>_8I+VlR>q7m9q~Gegc>IWlUc?@){t=*V=ayG@pZe*Rn+9nn)M81 z6O!CWPu?Uw)3_lx=9 zNyo0=h1h`5O7ow4J&)3+HbhinHWxC^pp^(2Xf;C-I7U^~~Wxq^3{{MuAC8z&}t=|2gujHx127A1u($jYEQ-C}2+`Izg{ zWH(lP@%tz8*3Z9KD549h6VeVeiS4D-_}*W*IGB8x7T&{>oCIRxm3#=_f)shLEixSnvUaz7*Q&RM$_4S%Jy@o5Ux`GGX>jB+1Rhqt~74nu{(!f4z^h^-Txh)ml-mgJ9RM{&*H||J0F^07MaPk_p!&TB}ZOvnqpU zsEUfi9{DC_dJDZ&zVzc0`Qv5hc9XB%cPZ6OKQumU5CX4#_UqVg z>+RS3+}9;O@Y#3s_Rqco5L|-l?C4cud&&K0QY#ZR09HY%zIJLA?TLy0$V9S{t=Drx zu2S`{-?LPuOzJVUoC2Vw=Y&~PBb=d43Hk)?YRl;=y%)sUi{C?f56et_$0SjvAuBZ z(_oiZH$M7~nc`hqiFk#I7EO|NUaNW=^M831$rav?7atdXF0nr{5Sa9+`$ z?tzN*rYe>%Ujh#PdikY%`U{`t);r&trmhLjK|tJFJv2iY&bJJQwK)C8$ajBrS_kf2 z*APHuGSoufpvcu=G|$^V^+racQA(ENJ`mH)DEc0)qisEHE7}i4c=hAn!QF0k-v!(H z)t`RG2Tpl&_wSC8F|p#$IkMK85CW}h$sQ>x!c!mdH1^wb|MfcOb&cab{!Whj+*>hP zK&gU>${wcU2PPoGY7kSk4vHeNtgMox!w7vihtbmRE0QKi@Gey~6sAMV9>#$L#}X0;u5?7K7FI8=N-c}4eeZHaIIr-ZOhGAvZi)hB6_^MHq7Eplh+06cfsl;VWQC}V5-X<|@TrF%Q|Uzk zg%;n2;A6+cG1hb|z?c@6Ax7SL!qFW5?pH6$b=zUfTk_&Zycx72;PJT^uM_(~YfNGA zA>auZ3)PgSTBb04c*{H9#MWDFO=vxS>saD!QNo&$2=En)*ZmQu5skCZ{#f>egn3rz$RdH z%;zT(**S?oN1~2hB3xLoR$5w0MYN6>qf)ytgRANA6DDCX0)fUknjosNM}&+>@KYj=o<`^Su2I=c{ixhXd~YSOG@@ zXz*!em9;pc)3n1tJ>QHc1hV%@>@Xc;h&;pvKj=yy*FnLn+&PYMY!4r@;F!V4sEKbq zuJ&n_s=8{3(i&S9qW4i~Y4_xnp$Y_*k{pF397arGb0t7cU@?qJN|8y2!x}B>nM7Le zXk9UFL~Wzgf`L+9d6{M7w^HObJxmr+9EMV{j zwGgwX%Q)E}N}JB8>x_l6?I$SaR}Id6Xdn+ZCA3F$Pu-cE;A&<2zd%!8Vw zcw0RIOpXcUnT4(Leptxj&>~Uact`C)l?vO}6jO$xuTX^|sx0>nQca9Wa|V3d($)>_ zs3o)!#zE*^hCJYsBE;6{L!OunFTqLduFb8oBFsEQ>QEh?p28}@* zLr`EkrCNiD;!)BLJcCsu9(3P_aQ64k;n<^(W!ch2w{KsGNEO@#IDN5q{_hl<6OBzD z0pVQV0gAri(~8FZ9igdnXN-+Fv2Du(zVJ>pLICjmdLLTUL-Rh9Io`xI3{?HUH7 zhSq!OdmD|5QMx!2*g`NR-Uo_afiA#Qn%+#w%<{fa0)aJyHDY)* z3baFyYouv!P@Q;_P8Mr~z#lI=Z@rFhZZOvY3l-|`8df>)c;89y;fianCPs}>!We?Q zLiZ@-JC^qg9r`WLIF@_d?tTllb^c#}%{xzi4O&a$pp{O7WY^wx z#_))}9>oEBJYv1h^@bwG$gBVRWgPplcc=R-5_BrJq=!hSs)ZVt_BtoiqJXN@o&3MF z62Yk0RUk5K!>A<4rxg&A4^A9+KcXk7fG!lhDT6IVRyV|i+nAts%VVL4K1lnp5xQ+| zleBfjH;Uji!6{rLpwD&?Xy!bAfS?#0lFN0TT;C9njHG78Nc6N@296Fcm#J zg$^Y5)`r#svv_U+kX;@{f7eX(M5qOo`}X}YuMcJzDh{t$kA;#nN~ zst>dE7F%c8Oq4O58QVf^MwI%r(YQoE1iFDG_|Pd3W*O=0&chSP{uqfq5R>6kGjfau z4THHM!@-DlVgnRb(W@*wZofVEy2rhE(4Kp+^_E-miIYy?g|B(;CQml@+U)@Lx$8l6 ziCQP)oWZoxPH96;?FaN{EZf{_nwc#tBH|UJJ0^mFMU4@+U!Nx9whg!j&c5L1>ve2b zU%PTbann=%9gM~|e|#Dr`O@*Y#-$-VsaGUL+fL;*wb(S8NAK|jp0M}AmdU6ca{M=r zVo=WkVl6LJ=*&>E^4*{@rl6{N^!rm(Rga=5G1{nla2R(-~KYt$2|IfoHY|-^Y7qkWv2|!v8X_AHot&`jbABzknY{R5TSIl}A+3!G& zX|6uf)}G;@p{X;4Gi^WPL{Jn(L9ZtUaWVCojnT3yOLM+4attAix6wJ+XUb!)sAO;) zBr2up+B-SFa&4fgJ@ueres-SVA_~R-eD-5J^@ab{sc~+KC~d`4AMz43CRLq6C%%>0 zL_RuvY>3KXD~0NLRL`TUbnP_V#HX~hkBl}L63YXbn7((;x43Hcx_9(e&#uP%NYi?n z#$7M#pSMU4|>!JbUK$duV^z_u2S1CpOlPG|(v zftqLu=I`GJT;1YYC*CMQixaGu=Tq2XpfJQBRnGIS(-LUei)eyvE1s^DN zL7^;_>2uJ1pTWs*`W4T7#7ij_!7X>K_ye2m+i$YioM_y1ag$}%E0%7-(Jw!ipM3FG z?6b$iSpeOK4geZE)E(VGg#ukDOfjY>LLMa3=OYs{{q?-k0G7-At`R0gCn%Oyy16es zGt;Bjv$EoHevBW1PD>%{Ms&wd9#Dl68k46)NUEqNi5g|wZDLH?1BT!tv#VzL>!p`* z;U6z%es(}eDy5(Q-;+4_`A?>8$CmXQJMMAo2lAhLK0g_ch4g(0@K(y^4s<{l5mf=D zM^6RJ6j|$2-6DnsJhmDqK$CX8|9+yY-evlxBnoS>OtKhEn%VRD8!gVd z88e|(?Ak0H%atT#=EwK(c#ic74U(PeU@Dn=Ah}6K2Y8ZrX z;$7%Ke?T{=PKq~WR!o;<7(uu;jjZU15vvte6%k_SNc-GsW%%@KIL`M&eK4R2Fr;+p*#?s<)zA@{qW!O-s z-lKt$x|aJ9(=cl z@vH-1a2=J-Z=LluPX5s+C-5+;tL}IYS{D?yqAL4X+e7Pu%x)=cg;9pr9(*{r+2J-D zd>!(+Kl`0e=G32jP43a$ddT-ZxtbBWmY*E8>JqE2nxQ}wP~A%^8Y0%F((fmpAF|4) zN(qN1L_~k2X}kL}wyOQe#?31- zpL_A`=&jh%pLf=IJm;CuNh_WVUeifPNG7?WEW4FgULEDZQ09yYkVmc}Ctru)qo@&1 zNKUKCtU=2@Y^l)&1PuWZCn^$FLADi8N>LUDn;0q?i!s?pj%fuymRHZx(6U4CgS16L z>U)z)#i?JdCptP^-#ne#soyz`{U5tOvvZq9+vlMBJ%t^%*hOF~fh4vCb?fmlpbNml zzzwi{SiVgk)03YCEy)HYnDku=y;7mGrUUSk-~OMt_TE4=u3^*+J3wK->@5)N`tmpb zm#=>FD+}bTRm>_G;v^edapd%EWTslm8=ig?%V!qazh8XCMZEcwFHg?IA+;!^9~6U# zg;hn5UNucw^wAWEGsGOP#u*HMq+^q-&7Rf8t)YwzT*}zKeNpv`Hpf4X&56d%GbZim7geEdyKT4Q!|(ktKmY#E+2a9wbU)9y zh>V6u2~bffDfy}-SDtYdF#a?Dyt8o6RgCn@wUZ5H6sAzvo~E4A^rkgMp*oDl_=qIY zF?Q@7alLXEX-v#cv{|7t|J{2@G?EyHOq7mp!i4cL=E*{*%JcVr{5=kM!U3$AU9)j6 zz(j1be0yGU(3?QXVDFPublZx0Xr>(3zD8GpnH2@q5{2o3DnONBdQkK=rcfdlg$PLL zRP+DUg=ca3wU^%Du{hV#x>S9R&@cO4qH)P(m+<;yUN6@+F%_Z*6_seEpix0uAg&c` z&btmhp1a&;_XYd#!Sm5m-oqtVULs1N9mr9ml%=p0y>gmfHJz#%l>kB!Ra>nrD`vLf zkVidtqqIy0qj{e4wny>(Uw?-@qmDgt6fp|bHsdO!K_w-Ru87vP71vHQCK3*W&Pu`( zWw&8ssya-xMq(-{iFN#V+oTH1_&8GAQ-iV^U1)St>6GU&w-Qq;#s%8i;ax~=%&|0l z3{t5qih{B%QQD6Clj%9U_dV{-4^R6cCw=tuY`@J;8~oj`XP!-*2mk;e07*naRIF{^ zeto0B=C}!CbE0wcjhobt{+@TgC*S|}_xSv$PGZL$cIs^3Gq^I-9CLYl+(uEkuAB*b z-8Qe2h=lQko_`i%l=8lc6s2Z*Y030Vg;Igx{5#fqOjqI{Wy} zFHhyu-#I}{yIM&wI(k093^`k6!D^oP z<^%Y_ug_os<|3?~S3i>UeoDxVR+(9j)r?yuISI~G@vJKo!6&?i z_Zf{TNpU2#RaB-x=U=C)h!!BIR0s{a(xR@b#>ocBWDg$*ttYg;(@9a%cT3NBL>rB@ z$&gS@l@D);%^S8aMyA$y@}LQat{# zkK=b||Bg2uekA>VPr#Typq0j&f*8g0EQIl7zjjqY7!Lw;D@#k&E2%0=QH<$dcMZsasdiJUXi@>nn>=rJHJ8?#NY4rPY{+B%?6RHa}5 zoRjxYP4`*0Vkyg(FJtM_r7T^#ge6O7=uKG^ieH@lOZI*IK3u(W;}VEw`b&Aif4nZ8 zqhU0Rv`(}U+5p3m$3@XjQY9?iqR%aMTEeoedzggRzl!lA1T!%!% zH&Tkv$2C1eVGDlp%b#-e2ait4UaAO%v5!e`0-O}Wqv7s%xCbvk_%#%^Sg`%euD+Dl zf8>=kji)Ls8ii{-Ru}YpGfY)86t<621xi`8Dln?RVlmpHb-{l;;6NUHue~?;J6|<- zEsr~5KYo7RkFjNu1hrCC$@xTO9akkFX}Uxw)gl5Roj)+~Tm*~~yo~~aBY6?2?)lI< zWdTYI1&cz?U(_rKSj_vI1yd16<_ zo@7sktWTi@gMoFFGm4oNmL*$SdNT^F$K#UpJamfSX&V>)?SdOThPtiAC@cY1vRw3u zpFfe{GpJE$o7wAwgr&)1P*z)xe(8JIZmWgvsWC=A^5qZkhl|gL@c-F+?>I@Sa{vE* zLREK9*hrEfDk6d+UJRfpIk|vjF%Se51qD&eqF}s63|Cb2cTvD_4PO%?22c=Dl9D8< zh-86XSeVdVb;9qD=bY*uc0uB-LVtMmi=COCs_N>RK2JT*C+IX@Qz#0GVuVh6jCN~` zvKUFyRZEuF#At|7Gv1lYs}~*cfTQd03%B2O8@s%FYyR}t^Ajzizo-ijNhgV~r%GhZ zqJYjwL8sH{k1U#go)9UuN^BLSW-3tf&(k$MID*Vwx5l$3`Nj0xE4hg26SnJGj@JiI zT{|KHZ4Jt5&|+QR{C*naBqlUO>1w#z5o#}8sniL~=Rg_7E-zWc<$t)4&wl*VjE{{! ztn>X4a0_zd^?cx*+1~jO4-LaY<39_zRk%JflYDgamG^-)*I1JizkDKReDBvhdxMRe zpr^q_edf{jztOiVm*PRE0F^<4rP83S!j_hz6j@#lJ&Q5mYKPGVYpi@Ahh$?;Y(@&u z{}Aunq9@ztB(3fLJ7TO!90<9MEDD2GMrPKP6UnVMcn`f^O;uG)P4(z@dw3rxi;}Wc zNHG-Ps%x%f(JQy(=6~M&h@E$93J%)-2&^s|^#aQ|-%$l>DuSsgM-^l93RFFPF{?w=4^`&uNJa=Mr|XC4<{aS31h?upF;sa5ioXcoYbMp82O|L|cS zXS4s>e3@;Z^`|rV{QrFlt#sqBVpK_|J953;qp#L|c@&ymnb!<9!&U-vT_!)&pS%odNbPO}Y z8TtF@6RN~D)H#<@X8V7}&s_hR{P^qNV4D@;x zO2PE>G)wQio4c0Wom@;~QdPtxSrj9z2;ku_f4Q3N_Su5#ZoKXhJLmtk&hvTmZb$W9 zBO|CJ3l2V+k`V~n;ph>K6R(W|q7Gn0@)(hszj!UkwyylgW!!Yf{db>hSD~#qO)3rJ zW8<9sgOiA9td(6db2wOTxny$V4x7D%{dYZZne8rKdIul)%6p{Sr46nM#GvW4##k_C zCFYK=gjH<_78NWy782NnNf|1ZMVq{Yt)KJoMkY7jb^|Xtatki|`z7f$>BezZ4P3G_ z6irD+D%{9Oh@KdHzn>8YTstEJGTuQa-7F7JW2fw(n|KW?hVi@!%mxK1c#&5?%v;EZ-}&GC@>{=T(~Y11 zu+H;C#9(~;BhR`X;!(%2(D={B4fNyaFPY69Ypr?NqF3;z?_J3|U;Tbsw$*%~#;oXQ zTpfKHT?`OMQ<3pK%TgQ`(>NdosJb;(&!MAb&iGu$Mn@>if*7FJtrBk~ zHVc3BaQ$`vV8@ql&9&G6YyQIn#mip&YM#3K(}j=`RbzY=>LBip-easz=dQxVs^8v8 z=foHq$*4(@>5;&7|AG)&`wCl_B$I_-{r*?{&q-fMO+z4rQl> zEewIkWVZqnMBY4OzS-YS@DA^!dwB4xUd#EXUcl>Kac~oiH;cFmcnQP!_WyVc3ysGH z&IC3_G~~C<=8i`@W4zGSa<>&! zz=c5NY_$KU_KR=aM_m4CV75joeZ&R?B(?ekGo z>eOf@G3)q1aDm`s@;lK@Vr@|tDPEprcGb6&Vjzp=hCBX#zx%FT4{a4D6&gz??~=Ra zhFhajta*L|(zqc8{^$K)`yIbn5ktcY{+J1SuK?Ip^fDH44iemmt!jmOQ+Mq z7(<92jG}CplpWjW`Xuu8;3G!>Z1tioIr~Sy;R8n=!T9PiKlWvBNG%lwk_tTqhxS8$t+?qdMb=f0wp0|6>&g}J~ebFea z5+_L&6X7zCbeg~ng|!7*>txlQ$%kpZ9C(fYa&+RQJEF3(F?m7^5_F=9WVUMl_N(`L zExT^F$1>Y<-tpO!KgHemOi&gD<74B@o4bIq(YcI{j0^Eol^9*3$eawF45Sn)YPNmu zc5J@Uiy!j2{LA%Mv-4ZF;55@*Vn zNdagx3XD7tN#7Xk${8a?wNB%%kUE9UaVaV8jMcv77rPvIBeIgRz#edNOE9v~bu=qZAZWHGrlp z3zSk=n_UW9lx2}->FF+z{$2Wv(RyxMXCH)yNT(1c|C zHP)HKE4O?340qB8gRB2>B`bOBQAJ)uEGV!$Y>kWHs}_ZLZv(u%ff{#@v);n&LzLQl%03j`5~Rthlw*7#vdy`b}U)UrRp2Zu2l=RH&1F2*EVX~YT9Xp1chw9$kR z=}uIH5HW?JEDG?7x*PB{vVeQZXu*SxmO@z!hQ)W>!M3|?$$5V~?_r>1^(J{+tDT;;o#cAM;&;^AY;7NIZyQ%XKCQ@0_1Ap1lV z&24(6q%g?j!_50IIz`s!TfYHS%RtCU>Qbkfc3K4TD5kE3jOeTUtI`@b#u8m3@@ds@ zH+1@4QNWP8>#RA>a3SzR;r0x&#VDbOMbGNyx;Lj?Q67F7^^5sP1!P%3|gj~o2FwW=i*HVyp?S? zTYlci4^RIAm;dE*in7I%p0qX#7cQh#b}-s9GBSqMErM4BuV|GcC}kmPajcArZ8zSU z7jLxLLppC4UG+!yc-tZt-?KOsPO3i&fhI*&h``A$){81cYm>TM1O6^~bYe8d7NEsv z!^enAL{J|*K6so@arf!Ej>!WhqMG8wCACQ|M0^s30DY46fSRi>C8qJB$@?+dP*_8! zUD7TK6p`tvDPr^}4O_f$3(h*_T)zD2|7GQsR(?q5^I>2Dk?3!TNcM+#3}aYmJU&n( zGtYHcA#wCi=LerVmG2$qG8*y0HF8&Z^ph%8 zDpZxrDQP}r8nl%Q?I6e@W;WPS{+z50`R!@h57g7*e- zR4M=O*H#F(5vRq7%bONfRLH6bdo z(~k}xohU_!jp8Q;)f5rZJ(1B%{$6OhBJ__gsu?!qnPjbWoH1hY>6fh0bXp~yvY<2? zV7$r2$ zfsYoHAu2^3171axl~ILoO$;Gud`$6Y(c`?May32xN=ui6*m#{}d-u9>k{zQgK17_a zu{I(#ogyfOE)3dgl!|f<1V^m8w6*2EuYVtZ{^ixYYWEcq-+mtOLWc3}k2?$tjmIZ0 z2DU)r=MI7S;E(TffB3ySrnI|sP*wQdM+99CuF%ngvay?ONXfbto^J|V|`z>Cw+-+R( z*US0n@gHSmbd-7X=QD5q0!By1C~^vGl*F$brY6;Zq3ZSs&a=()wqdhpJ@}EyFU~oQ z-QT*1uA7jgU#*(9)eISGzD`n0LBio8q{#Gapw)0JeEOA03X@Y9Ew3d+-HiU43^J_% zBZSs;Jvi@iUOISMCGv4{0F~?55~7S(wANT#NYGhI9Ja>NDoP4#unW3AZnD~)pw zqcuBiz6WQ1<09U9$opxx+7J31K1}5J_7@<<#t@G)3=56NH%>t;eP=(8e$^-N#bb}> z55GR2&0es%WSs_?n4Ii!z>)iK z>RCU2=;v|4TD)hUk7JF&rs66aNlCVhR2e=-vCZ}YpJw=R;NT+g`zwD7B*?iK>lcRE zrd~5=bPjuMwbz3-<~sGPpYrl|>_HuR6or}Tm648r&}${DO&XtQD0MYxRX^0l7FE93}(Y)h_b zifpA68$9{heCLy=bKLvC!5XU#Qc7MUXfGjwf zWGHvQvfzXmlRrozBr>xb1aSTB*K*69H!gP{&ew@(8t9BzT5Xf8w@L4q=TqPgOH*X%JV`EZeq_o$(*rqwg4EIfA46onqV4k?@gEQv({%POk zWpCbt+EudnrXW9HfS+-%f@|P?%dzeG2f@#LGb4Fnmu)&1=vAJ&4$}Du`O1?bBZL&{ zmk2e&uTg1CsG3ejNU`u)p`y}w(fOIgUt)@nPo&eq_jI*|Yw)o*eu1BU?ssgw{w5FV zygdSl4CC8}7{IX57$PIb(QnEMh@;h>yLFZ~y$nhjjj|DL81mBQO-ywWD^v z;T{-c(r81D-z2hVR*Lj1Fe%b*ybp)afTJi3wor_WwCIc!6eW#|>l^kxlpVI%ak;-+ zyP7YY`~?)2l~-Dcl@>0Lq|*rA1$4Q2a-#O)59Psv6 zQHQ$WV5p|D%E}GDT<;JyP?_daB#E+FB}F4CHC8-eP#RYUrl)#LcWWs&(zW255Vk<= zgAkUL#-s2d%7`VAPGeMfmpgHxIi47!kc(3{#Aq>I^Da==t|_QnMagS-I+Qa%e<82j z{yAd$CqbQ03Yb-`-T4mX+t@%SZlTwX_qOe$7h#8X>Ql7R#uG0fP z1gO4g6-b-g%AzVMLF-P70HkVAKRmuxq$ zhFYVnNvXMNM)zV6F?DyMha2xhdD87pe$mE3Yew72?wI43JrbCqz zd?PfZm3~L;Uv%^bf3Et4hEWnsCuzb4=b<|t=ye^vo}=zL>RO6{!R)dSBDM2WwWD$} z(yBwi1&?|ICM9^9jZ}V-NUzJwh0a zZ~xtF?|g`VZww2KA(n^1*5?P9?Kt{X*W@ejJCPrL^4C25NgGOmkso?sFb*^{$K*ij z(jBsM^2i8Hdl|U{^m1qDy#!1tBPtbBn7-swNjMoM5)C+ls00*!Ic?Kk&kKQS{2uan zCJsmzn>9-#N(2KC8%4@dUp|84zW>>Wbl!G*!G5g1V2#8@80-$n&$CxUJ`bpwnHw>} z_4m=yaG}BnPq$m+yrU>1^A{LaU$eup@BS=Ld-C$_s;9ft9Q)Nz(&@CBH*YQ@qn!aB zNs`4j4BFJ8@}c3{9K7oRthve>5BMB>SXe|A(x->XRSvxq5_9GmLK^;$L7`Xbf?G zm}CXU(QmrJi}}%q&f$}s?SDkH<$x9csJ^1RV%E5)6`d zT8$!7mWFmmGdiZ&X0sQv(~Ebz&tp3M?9(~tqTe$%K8Lw;=ZdYi>aW(>hC9amzWK(m z?Zq2y$_qAp;QWHmo^ULO9es$5jbyVaRW=n{>CNc-unfF@buXR<`61P!qHjyzY&*S- z5NWQvIKaQDdeG~Ng?l&R(py#zsUJ@O4eytB5|JQQ{Ax4P{}Q)X$8(;Qr}vf8frEWuqo) z?-(0tGjDFmytyT!a3;mq~NGM_$UT)A^T^bh`O&l2|hO0ZZ<%RgVky3t{7Et zzzzp<{#UQ&H9H@+qT<^ZArS}nt%)9Dh=gIGF~ozxZxB241DNGF`Z=9>9J%Yq`0;x# zWBX_C-6%JJ)Z(VOL-eT~Ek#D(&j1B3hGfO44{G{miPgUm2||GxEQ;`Xt{$4s2+9l(>G@W50iA35#=yyuhe#JL)6 z6)O3yCaQ&@0{gZ#>*f$=}!Z|BFp!4$xVlck_wAtSI z5dXOt78*l5Sll~~zM9RQKWXK4`P^&1%hwP473)6X8RRgpyjX;&n?=CKnA{h$kA#>b zNiQSdqL*lI6Dc~H&Uk@pK}_CJSYQ-7D_Q2Q-eKWdb6Mqy3mILxjTzN4J}JQGq9p~w zFy?ixG{YUAE}7ErpR)@r2Vp%YT3So&TD!IDpMJ+=0zD*cR`k zb?+U?Gek_B#787i3uE%|B25oscSZ14*pAt2Xi5R1pKfZvMZ}rCeR5jGD=HwrK zgOyiVg^{r_w6TN;MN#5I5EoUS6ep3!zd|d;rW-t$7j5*wR3^uK?kGNT+%aT3dWcQH z7%7)TseV3)HcE=j7?W*#pWrJ}+JUx4;&Q|o&_+`fwkcwoF&m_kCG$T_Q&{##AhNND zrm8)$DIUbQD;I$=<|0Nl1YMQJVCy_#J-+&;AMy1ge#X<*e8vMhH;*8O@$ExAEDQ^c zAs#An9Q}sCsk6QF7p}K0KYG_ieBk9@V*aSy*~P@uP$}=kC*OkXui?BG0-j0)K@GZ4 zMD0;!q!`iI4iux%nxh$6P%vke4)fO-W&Y~p%v*Jwv4tayE@)GZ8&nI#P&9cl$8gStzvr~y{+#&> z7Se9FQOQ=@SS#em5ECas{5^8adaEdT<@S5gF7MyHGRDX|KK2$qar{U6yq6TA-gFz% zxm8WI7nAQt|GLN>rM?H;z*qVZUHanPKy#I3c-|8?-vVLwt)1r7)WI13XF;!r!rf6BT1&k*ek17JK zQ5aunSg?A@Dr=9j=2I53V70l7&hMZ*iYYfqF=FY=DX^nTx*E;Gma{8Dv!7gi#H2DQ zTAH$DQAXjTC#aD8Ir@K!qRKFMADEb!#?^suo^d?y{o3mvaIvw;`kS-Yi}n}q3uDmo zLJ2-%lt@XlLgwDSAGa)7wxiK=lf)RPdJdyBFIa#1o*5uT-AVuNq?C5re<-D;tDp?l zlo(_2UVI=jcjMJNy^5!6>3@3WG*bVm0W&U_EKsXsgjii*BfK zj!i{IpyB;wlPq8cmm^nVYG7m%leKs*I+Tip;2OUR5MD>CWw3=#@2w?}OtvCKO!{TH zkn(6pMa6EL?8j;EyNuUv|8`2-dO+{{BZ$A!k8i(hws$_nV++GVV~9rzrvuMs1;o+M z9bLeC_xdzHJ?c+vzQOj%{3yFIlJ1rh9|4j9Qo#9&fWs7;vQy9*FBzX-GCsdeXS~FA z6u~;2uBk$o>E0wuCzeunEOQskVb1(9RDl#5WIu+15l7=fnK~JzrZw84Xcv^7l2)g{ z7DjwJv~(A|_b8xMTE<4&jE=TwcM3Y4k{_LW5=VYzKYaMtook~F2QE64LbcIYF%omJ zStV6e=t1R2q)F4g>iT8*zIRV7p{^=ogjO*^tLWV4zR$n(JWe_56vpR{(eAV)K3yri z3rtVf)U_95v1BwAqwM&<)_WG)Ja>!xeO=yr4nFENeCeCV;eB$>OeD?h`k6-?d4!^} zS}7?@;=s>mkTDXPvDb{RRg;iA*ww&DimkH32N6g`s}M43Q50w`MV2ypfXqC|D(xT0 z^Vi*iAH3@VKDOTpEF53;e$U6FfJsEs{!E7P?L$057#12sJd#+UarEn~_H@2}_)j_E zuphJ5N>5217J;;mkw4mnlqj=t$)`xfz$7`fErV&9W~}0)qjD9~y)M(;8s|MIi4$+4 z?vah_Xc$}-Lqo)qypV9L* z)4eXesz>t}{%mj`re7dZ+5L{(m+zeVe~kx7AF8k3i7^#{QfOqCSa~nx+%`dHS(!5MfILo# zsT!#0Y)pzvS>PJanO%`U|)r8bLfumUdya{zY3`nwfya>NTs>($lJ?z$Y);qGYa)t4ytQMRXMudimB-yb?v3d2!W?Pab0%Y^u7(JdR32C9Px5~_{$%lk~+s|jWP02 zhzEra{q6(0FKf*%u6jTT1pS2HL1Z##h<(nA&!Y~duw{WMY~q4|P%L6!^`ZjWNEV4T zns%!|kvk)S5PUKLlYMRf>^(U(U1eC5ZPO;C1!6Gs7?iMAaK^mlcfdwT5q`SMj zJEcLIrF-e-U7qjw__aScu9$nS$#Z6|i$pIA(qjsIMZra~D7=&!*UEt|Z@DiaKXxdG zCZngp3BjuukJ*qsmt5-X;UM`&Wcr^Q@%aAx_GuCL_sENu&bFXX*zIEsD3F;=sr-_{ z=~NRZ@L(8NiD$ozNPr@&>I$3N@5FgP@>nBdF8EKPwA|W_S$Z%>K@HmQZ^p)OVAo(^ zFQHC>(qBbIprFuu)-8QI&iVFCXjY|7;P9WOc7}OXc3CDj5LvwM=67@I||4&=1f+?y#3^LKSb80!f8g)P7(Fv-SX`-Vo z7Oq=#G}KhXCymT`m*213)aji zd9LE*zsWkQdI+jN+gtV4Vh@#@$^0*DqyH8tGi_jx_Gv2rITmDj-D{s)D3p{*;>%+q z{M1@j{ly*>hr7^YrH_k4SUbG&*MJWPRl%0NJXO~FjS^uBC zbV}=da|WBv<@m;RQBioaLfBwT27p#BPhj94&)H*F?xutJuytHHEko(Z*%>HChKfk? zFd5pjb@oI}3O`0TF!xp@uEug$6IXSlp2&d&GvBCDM4xqltq5i_)7!IL(HBy z8y{+$&GKGd71AGSfe>Qg6)uH|PVL5fs_D^=hPED9JtF_MK za$?2XVI>+4@)u~$`)qqP>*4O36%m4Gm-T0D_Z4mXONLRT?!4GWc0%0Fu^fEp&8PF7 zJg+z1o4%{Aa55thiw2X{NXM6BDT5Pyi_*~f7Rql59&+zzOo7ps1OG}Z`cDlzT$|03 z^KY3grfl6eKrSlbfEnoIcQtDP;#)?di_Us1`O=X<8xGNj&@VDZ6S(xPfeP8b1SoxB zIhW!kQv)Z$Ba^j`0lC%lm_bNz`3zoj_>Q}?xfNR$Y(k#WeT}auo*bsce*Z?g zZcHXr0*ZHa@BxOFE`#aw$g-#Retx&bOp9inpM0V;#W%bqx6f9RYt2vwkK|BUq-DYBj%B7kGD|pgs zm|9e71-N>;A02<0vwhZ%!GtGxy_WdwG)slgX53LYEoYfPed{k6ibx7Abipuan>VY? z!H)LvdimXH*20Sb94%BZP&?DBsJrfAn%MF17l@CYax$PMRZ=fd7|p4}g6GbBqHYVu zgTHh5?s^CwigJMp%cBao3X&A_bvP^PyORX5MI%tcEe@P#>K-xCrRb=Up)GA4L) z_ulMe=O>U%dL>Y9A{^>Xm9f8hQ#v$MpQ!y9nJ8lXqC;&Vp^_@wucU5>#6l4L98@4M zB@d1<)E&Qth?lVV3=+Zs6z;MtW`2if(cXXwTDfGTrjDPg#;U6x2Ficc62DSY)>Tq< zhlqqu5@)HYF;-=vZF-o48P2){qt#j7vuKU6W`4>!pK@ASXWPn`wHq(@SgBcAXx)Kk zxH_dP`;;ZPv7C%mi+n{jR_RHwVcd`644Y0=mQ+q`H>;$iTe*YgMimVG-EV$UFh=Ht z>L9R+O?ttlB)esCY#cGT7A-jrwlA6Y?y=OSFDI=`#8j>YqOo;g9^hDOf$I{Fr|Yle zjWlZL?P*Gc@xHaZGrr32=V*4f$*n94n{ab1yfegr1 z`-h{9`7t)JM`phm|0AV90>UEI#r9n0NYdIBwaDuOdChK5p-`IQbvDIdV`Z@1gr&BP zNFQeKo8|c=NHI87`DQWsch59#B#}4&Vk3EQ(@Cj~V+M$0r3V>kD$ib>78ez^;ZkJy z(Wc1h16#;Hs>TX)qT0prDtt+iQ!?HuvW0+=_2E*{3!F#S56z2Nq!jX*Ir7^P3W4gm z?9pd3WD8Hv^PM%9Sj*0rC%i0|0%*__auRtA3jV_NtnklB+E``kdew_b*TPJc?1_at z`jDj-jG`}=cDG^vp9f!`pWev`*n>Ev@`2XwG}U`KSLz(5rsn0pbfYQ1EqD=dvWP5wADV^rt#$*$R zNJaiU_>8kTY03lXW2rlhtPF!5pC#;>cYpQMxiCS^5~85cSm`C@SHQYRUnkz%+kRDP z%D@B2cHZtjI!)}ojHSAZ#!2AaDd2-owUoI}P~7Z>G9tx4i)E~QNO94RtP#u4_I)3? z;mgQF((Qd8tyMI{;{LAy>l32_or;X}D{{(yc7<>S#zn1I%ViS6QetA~sx$X8*@bCE ztCzks#3i#HMYiLHw8!4RuNt*q`~%k?eN;eoaW@C;q3@u(+~W_oGL)MB|zMQEPziN(dpUlxVknwL8Y03VQB{1i677{ zx$1HSg#kAf93m24=XpBC>Cdh^J_|0B)!;3x)gAx1O!39|_Oe)_#ERa;h}ll{q)Q-rr8`1E5=0nEhAcjE3y;&{Ux*uInuO}@O zj7#}~{^qRQdGw=3=bBiKyWOu9`u9x6yy8t7oe}CWUHV3l>W-Jto!niy*{m=3px$ey z5_-%&*UfjB1alOyjVh^5?CR(Ir3j6=r_JltR#Wc2dZ(l!=J5|~tb-<)fQ5ES?C^>t z*yhCa;x1_-4tL(iJ-?ewEef1c7|QC#Y^QAkR<@hxz%;Hhgoa(#uN=@xSd|_V5G9#B z(!G4YujI(Lh8uV&pwdW3IHQ!(N$#+JuAP8F?l(>hu6S1 zKc4mZnc&kxLjO_P1o*t@?tE*u5zo4tEx)F8dGqlTJ1xY7OUF9^X0QvAd0eq^ z=8q!Kf(^T+eRnz=BzanEL!F!ou_|+O0{MVyhi;Tzm3n$+xgw5*j9dR^=$;7 zEttq&4O>zpyUo%^i)WjTltwspodp^F!AeNL&ACvEer|NQV`0Q|F4=T3??5Ono#Ki& zJtdMhh0YM@09<-A0FFSAQ{SJP9+{n>bl#=Q*p?Nt_kPNv9lkoPev!Rj2%E@ut*#Kr$av6t^vLdie+z!4w@?%?54{m6ZvHaK}jtU6bjy0w~eF z9=p%J9+HJ0NxO0ZEFR4gkdvNIOlb?wvP*0a88=9w-FPWW;#=v?w!JNVqig1Ra2qBw z)rxH~&2Z=&c3gNZNB8X4j$cbUjr&z9*Z!nBbVO_jbt9Z>m=7@}{T7{rALH9RSeM_1 z704;ip+}bKXI1!gts+IFWR-Gl|Y3sV1REyIN8IhxN{j z30*Q}{j#dN8+$19^8! zUf0JdDbW^0<9*mMtm96Chi$eVqF`}5%*V-(oA>v;-ttFDk2dyh0h}JfRA4Ff#Bf7G z#G;0J-FxX`j!;vGaAP%C+|c<&dXIZ~)^BdcEhq` z|3b!wd7WvTy21O{UwlNqR93xhCrEkdpwhaz#l(EOq-1FIQsRVyK<9W<$Re)0av`-x zY7i*Kh&0dh66?%|D!<2NemTU%Z}-;c-kz>zXc80n{B+fo}77?!qgyYH4C z6)VMPwf$IuI!!nPr-UcwT`jbLWyT%f?(KOHDER%9y#H4{J?h%aLnG%}Mrs3Ayn>Y7 zVl>B!`vMEJ3a3NCC?*R^4D!mCcF&MJI5BiwIKnmlwWi5#A#gD<%=f7sg4)qilM&L! z^}tf!+!T&~$WHhaIJQWV)5-D$BxVg8J7#tQwdn`?M*K2k4>U z@I%S~k63MjvWcX%8*V?R<1^3G8D1~kilRqpDVlXvi#G-CPye3+A0BeLnnaq&I7vUN z>zy$2>elwT0cV=61>Glre76WKo6xutNzu<$=&#wA9@$!kw~xyxli3MaoesaO)Djj z%U2^GwEEKF6Zk#2`GghD`UK6%M>2!uIv|s?bNP4TZAb#0P=s-V-n*`Q0+X(sXZ-5z zijU?VEaf!Hi3L%cQwH3L=alaf%tvrc`*yhI0{7iFhenQ~|9sDWxTpSOhxW{&l;@T5 zT@>+-of6NP`UGput&8Ica-@4%V}D~@q5Y5xx(pb;ji}#^GN|a1W^MgnQbi2EFp0$p0XcH&txboukK@H8 z--^>@YD_uhIf8w3wU|qW4b%}K*YtUde-R5>;*Z_CSkqpXO<=1gb9}v^pW-)_4B@74 zQ$Q)SrKuB|wl;U3+#XfFz0>eI>qbNCON2(jWPx0bM*g;5@Fhw0S*o5_w*qtu$^G&D zLz2_2u*WDp)%FS&;oQ*e^ghz>1l~WjRKQ^_W*7BO*^&gP_S%&nV4L?xGV{OlU$^zQ4#(7v0Yn+(Msc zT%I*6@b(d=x@ij~DcbLL^7mN3r25yToiUsvrVFu-Ax&?KGMsONBos4^mXsxc~0a4hQ8tGz++A`O7vn`-208&QEhC@YE zcLJ&fbqlagASVo^ORI5ktb@Q?q!9=Yt_Ng+&M?l*b7zjuS4|r6XgX3qT)H_ z{S`TH(9Fbhtn0g!s(LYFc^Cu7mcg_M0Me-+jAgn%&tvC~SmIiH0w(pUgRUnd`~d!K z1I#2D3CI2SSrKgY1dHw=D|vN;zl_nUdA4R~%3q_OVnz~+IpG(Hg6k=sKsoI6dA|&; z?X*Q)`XFh~bC+J5wV$u(KU3aDWYz?c6-{)&z~H{hONnbmZbO-)?!Pc{8P)&8uDnXq z`N7+qUZa7s8Vv^g=Fy%ds+3VgQH#npSSFyLv3pT*}k%BpT2o3X>)4w~|KQ zqAE$qp{K!AVt_`EF6fCF{)JUH+yA2`N-b-VEb|-}yagk5KCo7Ubea?d{vx!;sK$xT2PEb=X}83_ZTfuSNQMJ{m}j9)VFBXYbnhMA=> z0$D7$q>|ocS^MLVsu7ZZ5wiUKY zIftHwnmC8BzUDRDM84GgezC;(}UoCN%f5v&F&L zh|}ttv0uyZZEvT8@Ex)1ei=nIWJB}95`j0*RkdYY@*xIr8(&ws7xtnY`D3YX`6Io+ zmzGDLhKd5g0jq(vfD868PZBZo6gYH_KJYtL1QFC@;blP#j`Mg<|FJ=pCw32|wMd3; zB-y#6>Czu}fZ`G&Or%kOyoM$v8-7dH;ry__gnW;cfttNx?Uy->{vwG+D%_X=NqGDy zNFsZFvXK#oQ=yr&b=E?#RkoF+trn-i+7`Mu`2q&d1MVOSjND#gIIMt%o1 z45sI5jIr_fggzrwVHrv+sn-c0F2iX{B}5k^XWv_#nOz_SdZi<@fp=tG{^m$lf18ij z79ZPP8)Ft+#^C6S9C*uqKtSbzlW@cnH!(>n%sZo^PjGZ;Hx@tUxY|D_m7HSz?%_uo zw&!|>@`$REm!w0`G=gO$7x!0&QgLc}%&=M6c1#Tf7g~5RLyw?CXjjE<4-_6<^|)%X zbA1?EB?J=K*L^I^d{iW?)FV`f2JTN2;)IB)P$gSQvh8Ife#VZkBd9}%gr-1$r2h~LXH{L| zUEzWHCZQGW_l`arA-CTT`9-r!ewe1Gn~sTNN#Giu(y-LGbj@LyM0oFiK`v&%O@{w?6DpaOal99{&imHP;g+SCy5Zc{e6>?Rd!N2UtB1f??7&ys3 zde94Xn$G?M6JZA31N$$t$Ef_N!DFJ&Db%9=0RLurY)zLg17wLTE%n@>A{C#L;uh|T z3q7=}Xg)|+iERU+@t42p0fjw_6xMm%MH$^8_&AC}9;@o=*M0V!QdOa*6HgK{1RQG6 zVazM)2{BE2U>}x|pTFd@uuQsx_?f0ONK51=(;L^M9jAkJldYuCankQ1t)zjl>E`X| zg5vjAn4$9VT{d_lL~xN=xkGx2!MQR?f%8RQT~*LPl7!)(va=gSo$?DWZiGcgCMGkl z4*+tjH_97wVZ$Yo@89$kVC%Eq2R?i~u4TarM;!2Z9mb}!j zsLE5H?l$PrQnya~m1hT2N-F-GqKHbR38M3jd)l&IyPBKICmrPDRm;|VB3Mu*x1hmB zlFQJ4&Q5^pJ8RBG7=L~CRal1pM(Q@^${hs^s-uk)f4ncXLs%x zs|Usj?r$$}Yk3{csD;WM8kKyF0gM=i159ZV!TXhI))8|dC76Zv${za`y8NpjKu z0U;1-uhzm; zDSS7*t07jT95Y;tn(32;7y-8Qx(%Vh37l3|h4)nntJ}$WF%FIo?(H}&7QPk;fGa@d ztot!<;rM~jj4V}-&p?Y(m`WX~D$uH{j!W7QCwfr&Cr?U}{fmv?Bc#)*uR^vGNCkGh zf~KOS2QVeyzadmO`YxOVs<5`)zTZM?-MZ64pKgg`b{1Y;SlN8$qf(LGe-<$g6==!y zEI9wNp1?`XDErj;WBMg*|2SFPVW8E>-t(d(t+`u2Z?{Ci(jK< zrX^0C9hIJ%Lr}SC@!#pFA&LoHh3+3_ZP}c-QqoxOK2gRYHiM{c#kfHNVs);E^hF4T zP6PNBc`+U&EI}-woZ+nIs?=5AjJ;dIq!%Z@)=x8997*erZ0ie3FNzs1?wo&~chfGP z{SKe-%a2Oq1u8#cc78U_Y~kBl2GQu!{OK{{zZn8I-$sTvZKeql8d5<{B*wU%-KhG` zco56rSt&ALxoj>Q$v5JDwrA2c2#M20>(gkjgApOt!5FC81lSmIsCxHL(D|V|$3(|{ zxI{{%)u(X!)8b1BFCmtrn(@h){$07*&Q-3`Dr<^=t-D&j3O^}i9|0a`X{_FNGnRA| zrqvz)JKg^&nT`D&C42U+M#Wj%Nkpb=!I%<~U1~}jz}nEjh{Mj1%skMZDSp=TxQXt-ijAa8tJF64(YwiVm8ikzc|xS zpSJc|<>0ox6jJE4DspBjsNubFCC zS;$vCqvZfEy=%xyh9d=Xh@%2dxvbdx^*frbRAOvWUlHxAuf&+8h81$PrA)vrtS(IS zYvV)fPv7tlE1s0=4^#dUc&R+!G>nxI50G6yurr&?^?&LsMa88N=uX5aqg@Pf-Z)TA z;6t*CzK&7hEvB=V5Q&S;+i36iQq+)L1H+1tV}y2W zV+IdB>;*szD9ouG<#aVj>MQhN4T3IG?}sxx z+jO|j`k6x4P-cUJqc|lV}(S+IF6w7JOfOz5H*FUqWLPuYfmz5E?W{3lbrcPK_y@d<$Tqe8rREYhBBrnIdIVic{6>tTaj1#1ruj9MQE$0##e^(>jDA-Q_46ANuci_d@AsuiX1LXnbmJ7kZnU# zcXfO>`gMYw?BP>buo%CqXK5F4kZu#B+V8-UtHo(`ZG35Av)+M84n$DJ%vWDvbdfKydv@NC1}$yDIV_0B6Rp)U8zf<$AT$Yd^MzEiKzfi^)_Ns< zdHz0OVuhSsq$hXW?vDmx?cxA+1_w;!{4hpJE&k<3l~47xIccbOjBAqh5*EbnLUKu>`-_=lY>D~voY=8;k)t}DSj3mb7Bkcih% zay}n#$pAyi=Zei9YHD7b%~{e7{T;7WA68OgdQ`?upA;8{bqv$snEvf?X69X?=kkH2 z%ZbH;)5ZvV>I*h(29=8A>g>Rl1TvI>$!Ho|+9TRx;9zR9`-5A3m*sq+r(kHYn0obP zpP*`I**2IamD4~#P5_lex!GU4yay3yY+CZwx=;PW{KI2idd(LF&jd7nRu zgB&|y?~vK8ph6WW2bEvDF~I>$ft`h+d=LKKccW$PC)gSPE@)(!+QK7-VcYSl%)Ml$ z6j55`ocels_|^h$AtE_qI}FJ(28d zyKHBFxQG{_=+hD}M>7@qRDwGY&8cRuTDBvt-mxtd{8Om@JY-(i_^(V2BlP5GvF6&8yFzcD&*ZcG z`)7fMgHXChoF}j^`2fIk;ZM@c5!V_8{5iZSYXnUxDu?QSTjWO25tAciEL?m}sUdA5 zY9f`_!883F3+3zkQdv8&5q#Yzhgw*?bEggR07&93RmdXz+kIY1rAaLPek>C&4U)l# zzzD6~$b?{et3bakevBsYlK1n!8=0GFF!WfD%WFVP)3bvHUW$-K%MR2hlH0%A?VGNX(TYFo>mw*q85AANr@9v4E zPiGnD7nLMXT2X~71QQdyue;DG;C-+Eu__i|&jz)FnVq2&q0F#%1n-~GeU2Z?#~`4T zih}Z^#PNiDpVRIncg%~rsqEy^WRir8;z6AXbIHFyk literal 113693 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

Ni&I7lH8SK38b@_;(~*; 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 Date: Tue, 20 May 2025 13:51:20 -0500 Subject: [PATCH 09/52] Add `reload` option for polygon `GVector`s --- R/fast.r | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 76 insertions(+), 8 deletions(-) diff --git a/R/fast.r b/R/fast.r index 00519d77..c8d1727c 100644 --- a/R/fast.r +++ b/R/fast.r @@ -116,6 +116,9 @@ methods::setMethod( if (is.na(faster("grassDir"))) stop("You must specify the folder in which GRASS is installed using faster().") + # Error for cases where there are fewer geometries than rows in the data table. Topology correction using `snap` or `area` can only the number of geometries, so if the number of geometries is larger than the number of table rows, then iteratively trying larger values of `snap` or `area` will continue to create a mismatch between the number of geometries and table rows. In this case, just throw an error to obviate wasting time. + nGeometriesVsTableRowsError <- "Since the data table has more rows than there are vector geometries,\n increasing `snap` and/or `area` can only decrease the number of geometries.\n Try smaller values of `snap` and/or `area`, or remove the table using\n `dropTable = TRUE`." + ### dots ######## @@ -329,16 +332,14 @@ methods::setMethod( if ((verbose | faster("verbose")) & gtype == "area") { omnibus::say("Creating GVector with ", thisSnapNice, " snapping and ", thisAreaNice, "...") - }# else if (verbose | faster("verbose")) { - # omnibus::say("Creating GVector with ", thisSnapNice, " snapping of vertices/points...") - #} + } src <- .makeSourceName("fast_v_in_ogr", "vector") if (is.null(snap) & (is.null(area) || area == 0)) { # slower if we need to record messages suppressMessages( - run <- rgrass::execGRASS( + assessment <- rgrass::execGRASS( cmd = "v.in.ogr", input = x, output = src, @@ -353,9 +354,9 @@ methods::setMethod( ) valid <- !any(c( - grepl(run, pattern = "WARNING: The output contains topological errors"), - grepl(run, pattern = "Invalid argument"), - run == "1" + grepl(assessment, pattern = "WARNING: The output contains topological errors"), + grepl(assessment, pattern = "Invalid argument"), + assessment == "1" )) if (valid) { # more thorough test... slower @@ -376,6 +377,9 @@ methods::setMethod( if (!valid & verbose & !dropTable) { omnibus::say(" Vector has ", info$nGeometries, " valid geometries, ", sum(is.na(info$cats)), " invalid geometries, and ", nrow(table), " rows in its data table.") + if (info$nGeometries < nrow(table)) { + stop(nGeometriesVsTableRowsError) + } } else if (!valid & verbose) { omnibus::say(" Vector has ", info$nGeometries, " valid geometries and ", sum(is.na(info$cats)), " invalid geometries.") } @@ -411,6 +415,9 @@ methods::setMethod( if (!valid & verbose & !dropTable) { omnibus::say(" Vector has ", info$nGeometries, " valid geometries, ", sum(is.na(info$cats)), " invalid geometries, and ", nrow(table), " rows in its data table.") + if (info$nGeometries < nrow(table)) { + stop(nGeometriesVsTableRowsError) + } } else if (!valid & verbose) { omnibus::say(" Vector has ", info$nGeometries, " valid geometries and ", sum(is.na(info$cats)), " invalid geometries.") } @@ -420,8 +427,27 @@ methods::setMethod( ### automated vector topology correction if (!valid & (is.null(snap) | is.null(area))) { + if (!exists("assessment", inherits = FALSE)) { + + suppressMessages( + assessment <- rgrass::execGRASS( + cmd = "v.in.ogr", + input = x, + output = src, + snap = thisSnap, + min_area = thisArea, + flags = c("verbose", "overwrite", "t", "o", correctTopoFlag), + ignore.stderr = FALSE, + Sys_show.output.on.console = FALSE, + echoCmd = FALSE, # displays GRASS command + intern = TRUE + ) + ) + + } + stepsMinus1 <- steps - 1L - snapRange <- run[grepl(run, pattern = "Estimated range of snapping threshold:")] + snapRange <- assessment[grepl(assessment, pattern = "Estimated range of snapping threshold:")] # generic snap range if (length(snapRange) == 0L) { @@ -496,6 +522,9 @@ methods::setMethod( if (made & !valid & verbose & !dropTable) { omnibus::say(" Vector has ", info$nGeometries, " valid geometries, ", sum(is.na(info$cats)), " invalid geometries, and ", nrow(table), " rows in its data table.") + if (info$nGeometries < nrow(table)) { + stop(nGeometriesVsTableRowsError) + } } else if (made & !valid & verbose) { omnibus::say(" Vector has ", info$nGeometries, " valid geometries and ", sum(is.na(info$cats)), " invalid geometries.") } else if (!made) { @@ -554,6 +583,9 @@ methods::setMethod( if (made & !valid & verbose & !dropTable) { omnibus::say(" Vector has ", info$nGeometries, " valid geometries, ", sum(is.na(info$cats)), " invalid geometries, and ", nrow(table), " rows in its data table.") + if (info$nGeometries < nrow(table)) { + stop(nGeometriesVsTableRowsError) + } } else if (made & !valid & verbose) { omnibus::say(" Vector has ", info$nGeometries, " valid geometries and ", sum(is.na(info$cats)), " invalid geometries.") } else if (!made) { @@ -615,6 +647,9 @@ methods::setMethod( if (made & !valid & verbose & !dropTable) { omnibus::say(" Vector has ", info$nGeometries, " valid geometries, ", sum(is.na(info$cats)), " invalid geometries, and ", nrow(table), " rows in its data table.") + if (info$nGeometries < nrow(table)) { + stop(nGeometriesVsTableRowsError) + } } else if (made & !valid & verbose) { omnibus::say(" Vector has ", info$nGeometries, " valid geometries and ", sum(is.na(info$cats)), " invalid geometries.") } else if (!made) { @@ -635,7 +670,40 @@ methods::setMethod( stop(msg) } + out <- .makeGVector(src = src, table = table) + + # # save/reload vector... seems to fix errors with subset_single_bracket on polygon vectors later on + # if (reload & geomtype(out) == "polygons") { + + # if (verbose | faster("verbose")) omnibus::say('Reloading GVector...') + # tempVect <- tempfile(fileext = ".gpkg") + + # args <- list( + # cmd = "v.out.ogr", + # input = sources(out), + # output = tempVect, + # format = "GPKG", + # flags = c(.quiet(), "s", "overwrite") + # # flags = c(.quiet(), "s", "c") # "c" ==> save geometries lacking a cat number + # ) + # do.call(rgrass::execGRASS, args) + + # Sys.sleep(0.5) + # src <- .makeSourceName("v_in_ogr", "vector") + # rgrass::execGRASS( + # cmd = "v.in.ogr", + # input = tempVect, + # output = src, + # flags = c(.quiet(), "overwrite", "t", "c") + # ) + # out <- .makeGVector(src, table = table) + + # # writeVector(out, filename = tempVect, overwrite = TRUE) + # # out <- fast(tempVect, reload = FALSE, table = table) # cannot use vect() on this... weird! + + # } + if ((verbose | faster("verbose")) & geomtype(out) == "polygons") omnibus::say("Topologically valid vector created.") } # x is a filename and xVect supplied From 84f105162d6d63210fa9b907361afe602960d0f2 Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Tue, 20 May 2025 13:51:32 -0500 Subject: [PATCH 10/52] Update help --- R/spatSample.r | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/R/spatSample.r b/R/spatSample.r index dc66f7b4..d9eaf45c 100644 --- a/R/spatSample.r +++ b/R/spatSample.r @@ -26,7 +26,7 @@ #' #' @returns A `data.frame`, `data.table`, or `GVector`. #' -#' @seealso [sampleRast()], [terra::spatSample()], tool `v.random` in **GRASS** +#' @seealso [sampleRast()], [terra::spatSample()], tool `v.random` in **GRASS** (see `grassHelp("v.random")`) #' #' @example man/examples/ex_sampleRast_spatSample.r #' @@ -267,6 +267,7 @@ methods::setMethod( # args$flags <- c(args$flags, "b") ### do not create topology... problems? YES! do.call(rgrass::execGRASS, args = args) + ### not loacting by stratum } else { if (verbose | faster("verbose")) omnibus::say("Placing points...") @@ -282,7 +283,6 @@ methods::setMethod( if (!xy & !(values | cats)) args$flags <- c(args$flags, "b") if (!is.null(seed)) args$seed <- round(seed) - do.call(rgrass::execGRASS, args = args) } From 736a7e74cd2a7d911b88e3c7371f02c07fd8b9f4 Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Tue, 20 May 2025 13:51:46 -0500 Subject: [PATCH 11/52] Comment --- R/subset_single_bracket.r | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/subset_single_bracket.r b/R/subset_single_bracket.r index 74496cb3..01756314 100644 --- a/R/subset_single_bracket.r +++ b/R/subset_single_bracket.r @@ -179,7 +179,7 @@ methods::setMethod( output = src, type = gtype, # flags = c(.quiet(), "overwrite") - flags = c(.quiet(), "overwrite", "t") + flags = c(.quiet(), "overwrite", "t") # "t" ==> Do not copy attributes ) if (gtype == "point") { From 701dab529393bcb7c92fd0e455445da9dc083200 Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Tue, 20 May 2025 13:52:00 -0500 Subject: [PATCH 12/52] Add method for `workDir(missing)` --- R/workDir.r | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/R/workDir.r b/R/workDir.r index 2b791f64..7cb54387 100644 --- a/R/workDir.r +++ b/R/workDir.r @@ -2,7 +2,7 @@ #' #' @description This function returns the working directory of a `GLocation` object. #' -#' @param x A `GLocation` object. +#' @param x A `GLocation` object or missing. If an object, returns the working folder in which the object is saved by **GRASS**. If missing, then just returns the working folder (same as `faster("workDir")`). #' #' @returns Character. #' @@ -15,3 +15,13 @@ methods::setMethod( signature = c(x = "GLocation"), function(x) x@workDir ) + +#' @aliases .workDir +#' @rdname workDir +#' @exportMethod .workDir +#' @keywords internal +methods::setMethod( + f = ".workDir", + signature = c(x = "missing"), + function(x) faster("workDir") +) From dbd485d088119c9c29dafb02e2b820fef5030e26 Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Tue, 20 May 2025 13:52:08 -0500 Subject: [PATCH 13/52] Update fasterRaster.Rmd --- vignettes/fasterRaster.Rmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vignettes/fasterRaster.Rmd b/vignettes/fasterRaster.Rmd index 909a7333..696ac135 100644 --- a/vignettes/fasterRaster.Rmd +++ b/vignettes/fasterRaster.Rmd @@ -27,7 +27,7 @@ You probably already have **fasterRaster** installed on your computer, but if no ```{r install, eval = FALSE} install.packages("fasterRaster") ``` -and the latest development version using: +or the latest development version using: ```{r install_dev, eval = FALSE} remotes::install_github("adamlilith/fasterRaster", dependencies = TRUE) ``` From fefe9fa2e162c27b28b9c319f0ec4963cfafe724 Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Tue, 20 May 2025 13:52:12 -0500 Subject: [PATCH 14/52] Update hidden_functions.Rmd --- vignettes/hidden_functions.Rmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vignettes/hidden_functions.Rmd b/vignettes/hidden_functions.Rmd index 8fb59dd2..4c88b325 100644 --- a/vignettes/hidden_functions.Rmd +++ b/vignettes/hidden_functions.Rmd @@ -58,7 +58,7 @@ fig.path = 'man/figures/' * `.minVal()` and `.maxVal()`: Values in the `@minVal` and `@maxVal` slots in a `GRaster` * `.nlevels()`: Number of levels in a `SpatVector`, `data.frame`, `data.table`, empty string, or a list of `data.frame`s, `data.table`s, and/or empty strings. -## **GRASS** "Projects/locations" and "mapsets" +## **GRASS** "projects/locations" and "mapsets" * `.locationCreate()` Make a connection to **GRASS** (i.e., start **GRASS** from within **R**) and create a location * `.locationDelete()` Deletes all files associated with a **GRASS** "location" and mapset * `.locationFind()`: Find a specific **GRASS** "location" that already exists From 54f2f124be93821c8cdbd2ff2a6486ca40898a9e Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Tue, 20 May 2025 16:38:40 -0500 Subject: [PATCH 15/52] `addons()` lists installed; add other `*Addon()`s Change `addon()` now lists installed addon or verifies if an addon is installed. Create `installAddon()` and `removeAddon()`. --- R/addons.r | 142 +++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 99 insertions(+), 43 deletions(-) diff --git a/R/addons.r b/R/addons.r index ba6b3a1f..fb0b0257 100644 --- a/R/addons.r +++ b/R/addons.r @@ -1,14 +1,16 @@ #' Test if addons directory exists and if an addon is installed #' -#' @description This function tests to see if the "addons" directory specified using [faster()] actually exists, and if a particular **GRASS** `addons tool is available. The `addons` folder and tool must exists for methods that rely on particular **GRASS** `addons` to work. See `vignette("addons", package = "fasterRaster")`. +#' @description These functions handle **GRASS** addons, which are optional tools that can be installed. Most functions in **fasterRaster** rely on "base" **GRASS** tools (not addons), but a few do. #' -#' @param x Either `NULL` or a character specifying the name of a **GRASS** addons tool. If `NULL`, the existence of the `addonsDir` (see [faster()]) will be tested. If the tool name is provided, the existence of the folder and tool will be tested. The "`/bin`" subfolder should not be included. +#' * `addons()`: Either lists all installed addons or verifies if one or more specific addons are installed. +#' * `installAddon()`: Installs a **GRASS** addon. An addon typically only needs installed once. You can install an addon, quit and restart **R**, attach **fasterRaster**, and any installed addons can be used without using this function again. +#' * `removeAddon()`: Delete an installed addon from your system. #' -#' @param fail Logical: If `TRUE` (default), and the addons folder is not correctly specified, the exit the function with an error. If `FALSE`, then `NULL` will be returned with a warning. +#' @param x Either `NULL` or a character specifying the name of a **GRASS** addons tool. If `NULL`, a vector of installed addons is returned. If a character vector is provided, a logical vector is returned, one per value in `x` that indicates if the respective addon is installed. #' -#' @param verbose Logical: If `TRUE` (default), display a message on success or warning (the `fail` option always displays a message). +#' @param check Logical: If `TRUE`, check to see if the addon is available (`installAddon()`)or if it is installed (`removeAddon()`). #' -#' @returns Logical. +#' @returns `addons()`: Logical. The other functions invisibly return a logical value indicating if the operation succeeded or not. #' #' @seealso `vignette("addons", package = "fasterRaster")` #' @@ -17,56 +19,110 @@ #' @aliases addons #' @rdname addons #' @export -addons <- function(x = NULL, fail = TRUE, verbose = TRUE) { +addons <- function(x = NULL) { - out <- TRUE + if (!grassStarted()) { + warning("GRASS has not been started. Use fast() to create a GRaster or GVector to start GRASS.") + out <- NULL + } else { - ao <- faster("addonsDir") - if (is.null(ao) || !file.exists(ao)) { - - msg <- paste0("The `addons` folder is incorrect. See `faster()` and `vignette(", dQuote("addons", q = FALSE), ", package = ", dQuote("fasterRaster", q = FALSE), ").") + out <- rgrass::execGRASS("g.extension", flags = c("a", .quiet()), intern = TRUE) + if (is.null(x)) { + out <- sort(out) + } else if (!is.null(x)) { + out <- x %in% out + names(out) <- x + } + } + out + +} + +#' @aliases installAddon +#' @rdname addons +#' @export +installAddon <- function(x, check = TRUE) { - if (fail) { - stop(msg) - } else if (!fail & verbose) { - warning(msg) + if (check) { + avails <- rgrass::execGRASS("g.extension", flags = c("l", .quiet())) + if (!(x %in% avails)) { + warning("The addon is not available on the official GRASS addon repository.") + return(invisible(FALSE)) } + } + + rgrass::execGRASS("g.extension", operation = "add", extension = x, flags = .quiet()) + invisible(TRUE) + +} - out <- FALSE +#' @aliases removeAddon +#' @rdname addons +#' @export +removeAddon <- function(x, check = TRUE) { + if (check) { + avails <- rgrass::execGRASS("g.extension", flags = c("a", .quiet())) + if (!(x %in% avails)) warning("The addon is not installed.") + return(invisible(FALSE)) } + + rgrass::execGRASS("g.extension", operation = "removeadd", extension = x, flags = c(.quiet(), "f")) + invisible(TRUE) + +} + +# # Tests if addons folder is installed +# addons <- function(xx = NULL, fail = TRUE, verbose = TRUE) { + +# out <- TRUE + +# ao <- faster("addonsDir") +# if (is.null(ao) || !file.exists(ao)) { + +# msg <- paste0("The `addons` folder is incorrect. See `faster()` and `vignette(", dQuote("addons", q = FALSE), ", package = ", dQuote("fasterRaster", q = FALSE), ").") + +# if (fail) { +# stop(msg) +# } else if (!fail & verbose) { +# warning(msg) +# } + +# out <- FALSE + +# } - if (!is.null(x)) { +# if (!is.null(x)) { - extensions <- list.files(paste0(faster("addonsDir"), "/bin")) - exts <- .fileExt(extensions) - extensions <- substr(extensions, 1L, nchar(extensions) - nchar(exts) - 1L) +# extensions <- list.files(paste0(faster("addonsDir"), "/bin")) +# exts <- .fileExt(extensions) +# extensions <- substr(extensions, 1L, nchar(extensions) - nchar(exts) - 1L) - if (!(x %in% extensions)) { +# if (!(x %in% extensions)) { - msg <- paste0("The addon extension `", x, "` cannot be found. See `vignette(", dQuote("addons", q = FALSE), ", package = ", dQuote("fasterRaster", q = FALSE), ").") - if (fail) { - stop(msg) - } else if (!fail & verbose) { - warning(msg) - } +# msg <- paste0("The addon extension `", x, "` cannot be found. See `vignette(", dQuote("addons", q = FALSE), ", package = ", dQuote("fasterRaster", q = FALSE), ").") +# if (fail) { +# stop(msg) +# } else if (!fail & verbose) { +# warning(msg) +# } - out <- FALSE +# out <- FALSE - } - } +# } +# } - if (verbose) { - if (is.null(x)) { - omnibus::say("Addons directory exists.") - } else { - if (out) { - omnibus::say("Addon `", x, "` is installed.") - } else { - omnibus::say("Addon `", x, "` cannot be found.") - } - } - } - invisible(out) +# if (verbose) { +# if (is.null(x)) { +# omnibus::say("Addons directory exists.") +# } else { +# if (out) { +# omnibus::say("Addon `", x, "` is installed.") +# } else { +# omnibus::say("Addon `", x, "` cannot be found.") +# } +# } +# } +# invisible(out) -} +# } From e4780a0bbe302a38690d5325613b7c3683a7662b Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Tue, 20 May 2025 16:39:00 -0500 Subject: [PATCH 16/52] Revamp for new `addons()` which checks if addon installed --- R/centroids.r | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/R/centroids.r b/R/centroids.r index 6d6982cf..a7ff1689 100644 --- a/R/centroids.r +++ b/R/centroids.r @@ -2,7 +2,7 @@ #' #' @description This function locates the centroid of each geometry of a `GVector`. #' -#' **To use this function**, you must a) have correctly specified the `addonsDir` option using [faster()], and b) installed the **GRASS** addon `v.centerpoint`. See [addons()] and `vignette("addons", package = "fasterRaster")`. +#' **To use this function**, you must have installed the `v.centerpoint` addon using `installAddons("v.centerpoint")`. If you are not sure if this is already installed, you can use `addons("v.centerpoint")`. This should be all you need to do, but see [installAddons()] and [addons()] for more details are needed. #' #' @param x A `GVector`. #' @param method Character or `NULL` (default): Method used for calculating centroids. The method of calculation depends on whether the input is a `points`, `lines`, or `polygons` `GVector`. If the value is `NULL`, then the default method will be chosen, depending on the geometry type of the `GVector`: @@ -21,7 +21,7 @@ #' #' Partial matching is used and case is ignored. #' -#' @param fail Logical: If `TRUE` (default), and the addons folder is not correctly specified, the exit the function with an error. If `FALSE`, then `NULL` will be returned with a warning. +#' @param check Logical: If `TRUE` (default), check to see if the `v.centerpoint` addon is installed. #' #' @returns A points `GVector`. #' @@ -35,10 +35,14 @@ methods::setMethod( f = "centroids", signature = c(x = "GVector"), - function(x, method = NULL, fail = TRUE) { + function(x, method = NULL, check = TRUE) { - ok <- addons("v.centerpoint", verbose = TRUE, fail = fail) - if (!ok) return(NULL) + if (check) { + + ok <- addons("v.centerpoint") + if (!ok) stop("The `v.centerpoint` addon is not installed. You can install it using `installAddon()`.") + + } gtype <- geomtype(x) From 069c659e7067d6e5ecc74618e799374f559dbabb Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Tue, 20 May 2025 16:39:08 -0500 Subject: [PATCH 17/52] Fix help --- R/fast.r | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/R/fast.r b/R/fast.r index c8d1727c..7a09fa81 100644 --- a/R/fast.r +++ b/R/fast.r @@ -62,11 +62,11 @@ #' Issues can also arise due to: #' #' * **Data table-vector mismatching**: If your vector has a data table ("attribute table") associated with it, errors can occur if there are more/fewer geometries (or multi-geometries) per row in the table. If you do not really need the data table to do your analysis, you can remove it (and thus obviate this error) using `dropTable = TRUE`. -#' * **Dissolving or aggregating "invalid" geometries**: Using the `resolve` argument, you can create a topologically valid vector by either coercing all overlapping portions of polygons into their own geometries (`resolve = "disaggregate"`), or by coercing them into a single, combined geometry (`resolve = "aggregate"`). Aggregation/disaggregation will be implemented after loading the vector into **GRASS** using the settings given by `snap` and `area`. Aggregation/disaggregation will cause any associated data table to be dropped (it forces `dropTable` to be `TRUE`). The default action is to do neither aggregation nor disaggregation (`resolve = NA`). You can also do this outside **fasterRaster** using [terra::aggregate()] or [terra::disaggregate()]. +#' * **Dissolving or aggregating "invalid" geometries**: Using the `resolve` argument, you can create a topologically valid vector by either coercing all overlapping portions of polygons into their own geometries (`resolve = "disaggregate"`), or by coercing them into a single, combined geometry (`resolve = "aggregate"`). Aggregation/disaggregation will be implemented after loading the vector into **GRASS** using the settings given by `snap` and `area`. Aggregation/disaggregation will cause any associated data table to be dropped (it forces `dropTable` to be `TRUE`). The default action is to do neither aggregation nor disaggregation (`resolve = NA`). You can also do this outside **fasterRaster** using [terra::aggregate()] or [terra::disagg()]. #' #' If none of these fixes work, you can try: #' -#' * **Correction outside of *fasterRaster***: Before you convert the vector into **fasterRaster**'s `GVector` format, you can also try using the [terra::makeValid()] or [sf::st_make_valid()] tools to fix issues, then use `fast()`. You can also use [terra::aggregate()] or [terra::disaggregate()] to combine/split problematic geometries. +#' * **Correction outside of *fasterRaster***: Before you convert the vector into **fasterRaster**'s `GVector` format, you can also try using the [terra::makeValid()] or [sf::st_make_valid()] tools to fix issues, then use `fast()`. You can also use [terra::aggregate()] or [terra::disagg()] to combine/split problematic geometries. #' * **Post-load correction**: If you do get a vector loaded into `GVector` format, you can also use a set of **fasterRaster** vector-manipulation [tools][breakPolys] or [fillHoles()] to fix issues. #' #' @seealso \code{\link[rgrass]{read_RAST}} and \code{\link[rgrass]{read_VECT}}, [vector cleaning][breakPolys], [fillHoles()], plus **GRASS** modules `v.in.ogr` (see `grassHelp("v.in.ogr")`) and `r.import` (`grassHelp("r.import")`) From ab0603f600f2dff11176525efa8376c2957c7a5a Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Tue, 20 May 2025 16:39:30 -0500 Subject: [PATCH 18/52] Remove `addons` vignette; add new `*Addons()` functions --- R/fasterRaster.r | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/R/fasterRaster.r b/R/fasterRaster.r index cae8ef50..3732331f 100644 --- a/R/fasterRaster.r +++ b/R/fasterRaster.r @@ -6,12 +6,10 @@ #' * The quick-start guide to getting started with **fasterRaster**: `vignette("fasterRaster", package = "fasterRaster")`: #' * Types of `GRaster`s: `vignette("GRasters", package = "fasterRaster")` #' * How to speed up **fasterRaster**: `vignette("faster_fasterRaster", package = "fasterRaster")` -#' * Using functions that depend on **GRASS** addons: `vignette("addons", package = "fasterRaster")` #' * [faster()]: Set the directory where **GRASS** is installed on your system, and set or get other package-wide options. This function must be run once before using most **fasterRaster** functions. #' * [fast()]: Convert a `SpatRaster`, `SpatVector`, or `sf` vector to **fasterRaster**'s raster format (`GRaster`s) or vector format (`GVector`s), or load one from a file #' * [rast()], [vect()], and [st_as_sf()]: Convert `GRaster`s and `GVector`s to `SpatRaster`s, `SpatVector`s, or `sf` vectors #' * [writeRaster()] and [writeVector()]: Save `GRaster`s or `GVector`s to disk -#' * [addons()]: Test if the `addons` directory is correct and if a particular addon **GRASS** tool is installed. #' #' ## Properties of `GRasters` #' * [crs()]: Coordinate reference system @@ -283,15 +281,18 @@ #' * [vect()]: Convert a `GVector` to a `SpatVector` #' #' ## General purpose functions +#' * [addon()]: Show installed **GRASS** addons #' * [compareGeom()]: Determine if geographic metadata is same between `GRaster`s and/or `GVector`s #' * [dropRows()]: Remove rows from a `data.frame` or `data.table` #' * [grassGUI()]: Start the **GRASS** GUI (not recommended for most users!!!) #' * [grassHelp()]: Open the help page for a **GRASS** tool. #' * [grassInfo()]: **GRASS** version and citation #' * [grassStarted()]: Has a connection **GRASS** been made within the current **R** session? +#' * [installAddon()]: Install a **GRASS** addon #' * [mow()]: Remove unused rasters and vectors from the **GRASS** cache #' * [reorient()]: Convert degrees between 'north-orientation' and 'east orientation' #' * [replaceNAs()]: Replace `NA`s in columns of a `data.table` or `data.frame`, or in a vector +#' * [removeAddon()]: Delete **GRASS** addon from your system #' * [seqToSQL()]: Format a numeric series into an SQL value call #' * [update()]: Refresh metadata in a `GRaster` or `GVector` object #' From 5dbb553a185e42ce9db7d68f2bea10ed3da09b41 Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Tue, 20 May 2025 16:39:46 -0500 Subject: [PATCH 19/52] Remove `addons` argument from `initGRASS()` --- R/locationCreate.r | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/locationCreate.r b/R/locationCreate.r index 330e4c63..e8052a74 100644 --- a/R/locationCreate.r +++ b/R/locationCreate.r @@ -144,7 +144,7 @@ methods::setMethod( suppressWarnings( session <- rgrass::initGRASS( gisBase = grassDir, - addon_base = addonsDir, + # addon_base = addonsDir, home = workDir, gisDbase = workDir, # ? SG = emptyRast, From 2dd2cc5dff2ab4cbcabdab1d9bc7455822ac8350 Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Tue, 20 May 2025 16:39:51 -0500 Subject: [PATCH 20/52] Remove `addons` argument from `initGRASS()` --- R/locationRestore.r | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/locationRestore.r b/R/locationRestore.r index 79a2fde2..f38134b5 100644 --- a/R/locationRestore.r +++ b/R/locationRestore.r @@ -80,7 +80,7 @@ methods::setMethod( # suppressWarnings( # session <- rgrass::initGRASS( # gisBase = grassDir, - # addon_base = addonsDir, + # # addon_base = addonsDir, # home = workDir, # gisDbase = workDir, # ? # SG = emptyRast, From e116cf3dd2275c49b993263c7a1716a70c763f44 Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Tue, 20 May 2025 16:40:25 -0500 Subject: [PATCH 21/52] Delete addons.Rmd --- vignettes/addons.Rmd | 43 ------------------------------------------- 1 file changed, 43 deletions(-) delete mode 100644 vignettes/addons.Rmd diff --git a/vignettes/addons.Rmd b/vignettes/addons.Rmd deleted file mode 100644 index 24805420..00000000 --- a/vignettes/addons.Rmd +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: "fasterRaster addons" -output: rmarkdown::html_vignette -author: "Adam B. Smith" -date: "`r Sys.Date()`" -vignette: > - %\VignetteIndexEntry{fasterRaster addons} - %\VignetteEngine{knitr::rmarkdown} - %\VignetteEncoding{UTF-8} ---- - -```{r, include = FALSE} -knitr::opts_chunk$set( - collapse = TRUE, - comment = "#>" -) -fig.path = 'man/figures/' -``` -**GRASS** comes with a default set of modules (functions), but users can download and install "addon" modules to extend its capabilities. Some of the functions in **fasterRaster** rely on these addon modules. To make these functions work, you must find the folder in which addons are stored and install the desired tool. - -1. Installing modules: The easiest (only?) way to do this is to start **GRASS** (not in **R** through **fasterRaster**, but actually start **GRASS**), then use the `Settings` menu's `Addon extensions` option, then select `Install extensions from addons [g.extension]`. **GRASS** should display a list of addons you can install. - -2. Once you have the desired extension(s) installed, you can use **fasterRaster** functions that call them. To do this, you need to specify the `addons` folder *before* starting **GRASS** (i.e., before the first time you use the `fast()` function to load a raster or vector). Use `faster()` to tell **fasterRaster** where this folder is. The folder will vary by operating system. On a Windows machine, it will be something like: - -``` -C:/Users/your_windows_user_name/AppData/Roaming/GRASS8/addons -``` - -You can set the addons folder using `faster(addonsDir = "C:/Users/your_windows_user_name/AppData/Roaming/GRASS8/addons")`. - -## Validating addons -You can test to see if the `addons` folder is correct using `addons()`. You can also see if a particular addon tool was installed correctly using the same function using, for example, `addons("v.centerpoint")`. - -## **fasterRaster** functions that need addons -These functions must have the specified addon to work. - - | **Function** | **addon** | - | --------------------------|--------------------| - | `centroids()` | `v.centerpoint` | - - - -~ FINIS ~ From 151c0749fa8e19dd2828258b6e3a324c26e4c6ef Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Tue, 20 May 2025 16:40:47 -0500 Subject: [PATCH 22/52] Remove `addons` vignette; add `*Addon()` fxs --- _pkgdown.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/_pkgdown.yml b/_pkgdown.yml index 4eaee501..93c3178c 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -19,7 +19,6 @@ articles: contents: - GRasters - faster_fasterRaster - - addons - three_d_objects - title: For Developers @@ -40,7 +39,6 @@ reference: - st_as_sf - writeRaster - writeVector - - addons - title: GRaster properties - contents: - crs @@ -381,13 +379,16 @@ reference: - vect - title: General functions - contents: + - addons - compareGeom - dropRows - grassGUI - grassHelp - grassInfo - grassStarted + - installAddon - mow + - removeAddon - replaceNAs - seqToSQL - update From d3fa0126e56dd5b2b8da2353c33e21e952d02acf Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Tue, 20 May 2025 16:41:21 -0500 Subject: [PATCH 23/52] Update --- NAMESPACE | 2 ++ man/addons.Rd | 35 ++++++++++++--------- man/centroids.Rd | 63 +++++++++++++++---------------------- man/examples/ex_addons.r | 12 +++---- man/examples/ex_centroids.r | 57 ++++++++++++++------------------- man/fast.Rd | 6 ++-- man/fasterRaster.Rd | 5 +-- man/spatSample.Rd | 2 +- man/workDir.Rd | 5 ++- 9 files changed, 86 insertions(+), 101 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index 13966d0c..8ff1ebd2 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -9,10 +9,12 @@ export(faster) export(grassHelp) export(grassInfo) export(grassStarted) +export(installAddon) export(is.polygons) export(mow) export(pcs) export(print) +export(removeAddon) export(seqToSQL) export(st_coordinates) export(st_crs) diff --git a/man/addons.Rd b/man/addons.Rd index 4e7c4ad3..924831cd 100644 --- a/man/addons.Rd +++ b/man/addons.Rd @@ -2,35 +2,40 @@ % Please edit documentation in R/addons.r \name{addons} \alias{addons} +\alias{installAddon} +\alias{removeAddon} \title{Test if addons directory exists and if an addon is installed} \usage{ -addons(x = NULL, fail = TRUE, verbose = TRUE) +addons(x = NULL) + +installAddon(x, check = TRUE) + +removeAddon(x, check = TRUE) } \arguments{ -\item{x}{Either \code{NULL} or a character specifying the name of a \strong{GRASS} addons tool. If \code{NULL}, the existence of the \code{addonsDir} (see \code{\link[=faster]{faster()}}) will be tested. If the tool name is provided, the existence of the folder and tool will be tested. The "\verb{/bin}" subfolder should not be included.} - -\item{fail}{Logical: If \code{TRUE} (default), and the addons folder is not correctly specified, the exit the function with an error. If \code{FALSE}, then \code{NULL} will be returned with a warning.} +\item{x}{Either \code{NULL} or a character specifying the name of a \strong{GRASS} addons tool. If \code{NULL}, a vector of installed addons is returned. If a character vector is provided, a logical vector is returned, one per value in \code{x} that indicates if the respective addon is installed.} -\item{verbose}{Logical: If \code{TRUE} (default), display a message on success or warning (the \code{fail} option always displays a message).} +\item{check}{Logical: If \code{TRUE}, check to see if the addon is available (\code{installAddon()})or if it is installed (\code{removeAddon()}).} } \value{ -Logical. +\code{addons()}: Logical. The other functions invisibly return a logical value indicating if the operation succeeded or not. } \description{ -This function tests to see if the "addons" directory specified using \code{\link[=faster]{faster()}} actually exists, and if a particular \strong{GRASS} \verb{addons tool is available. The }addons\verb{folder and tool must exists for methods that rely on particular **GRASS**}addons\verb{to work. See}vignette("addons", package = "fasterRaster")`. +These functions handle \strong{GRASS} addons, which are optional tools that can be installed. Most functions in \strong{fasterRaster} rely on "base" \strong{GRASS} tools (not addons), but a few do. +\itemize{ +\item \code{addons()}: Either lists all installed addons or verifies if one or more specific addons are installed. +\item \code{installAddon()}: Installs a \strong{GRASS} addon. An addon typically only needs installed once. You can install an addon, quit and restart \strong{R}, attach \strong{fasterRaster}, and any installed addons can be used without using this function again. +\item \code{removeAddon()}: Delete an installed addon from your system. +} } \examples{ if (grassStarted()) { -# Does the addons folder exist? -ao <- addons(fail = "warning") -if (ao) print("Addons is folder is probably correctly specified.") - -# Does this particular tool exist? -addon <- "v.centerpoint" -exten <- addons(addon, fail = FALSE) +# What addons are installed? +addons() -if (exten) print("Extension `v.centerpoints` is installed.") +# Is a specific addon installed? +addons(c("v.centerpoint", "fake.addon")) } } diff --git a/man/centroids.Rd b/man/centroids.Rd index 9b1cb601..4c27300a 100644 --- a/man/centroids.Rd +++ b/man/centroids.Rd @@ -5,7 +5,7 @@ \alias{centroids} \title{Centroid(s) of a vector} \usage{ -\S4method{centroids}{GVector}(x, method = NULL, fail = TRUE) +\S4method{centroids}{GVector}(x, method = NULL, check = TRUE) } \arguments{ \item{x}{A \code{GVector}.} @@ -34,7 +34,7 @@ Partial matching is used and case is ignored.} -\item{fail}{Logical: If \code{TRUE} (default), and the addons folder is not correctly specified, the exit the function with an error. If \code{FALSE}, then \code{NULL} will be returned with a warning.} +\item{check}{Logical: If \code{TRUE} (default), check to see if the \code{v.centerpoint} addon is installed.} } \value{ A points \code{GVector}. @@ -42,7 +42,7 @@ A points \code{GVector}. \description{ This function locates the centroid of each geometry of a \code{GVector}. -\strong{To use this function}, you must a) have correctly specified the \code{addonsDir} option using \code{\link[=faster]{faster()}}, and b) installed the \strong{GRASS} addon \code{v.centerpoint}. See \code{\link[=addons]{addons()}} and \code{vignette("addons", package = "fasterRaster")}. +\strong{To use this function}, you must have installed the \code{v.centerpoint} addon using \code{installAddons("v.centerpoint")}. If you are not sure if this is already installed, you can use \code{addons("v.centerpoint")}. This should be all you need to do, but see \code{\link[=installAddons]{installAddons()}} and \code{\link[=addons]{addons()}} for more details are needed. } \examples{ if (grassStarted()) { @@ -52,75 +52,64 @@ library(sf) library(terra) # Points, lines, and polygons -madDypsis <- fastData("madDypsis") -madRivers <- fastData("madRivers") -madCoast4 <- fastData("madCoast4") - -# Convert to GVectors: -dypsis <- fast(madDypsis) -rivers <- fast(madRivers) -coast4 <- fast(madCoast4) # Point centroids: -dypMean <- centroids(dypsis, fail = FALSE) -dypMedian <- centroids(dypsis, method = "median", fail = FALSE) -dypPMedian <- centroids(dypsis, method = "pmedian", fail = FALSE) +madDypsis <- fastData("madDypsis") +dypsis <- fast(madDypsis) -if (!is.null(dypMean)) { +dypMean <- centroids(dypsis) +dypMedian <- centroids(dypsis, method = "median") +dypPMedian <- centroids(dypsis, method = "pmedian") plot(dypsis) plot(dypMean, col = "red", add = TRUE) plot(dypMedian, col = "green", pch = 2, add = TRUE) -plot(dypPMedian, col = "orange", pch = 1, add = TRUE) +plot(dypPMedian, col = "blue", pch = 3, add = TRUE) legend("bottomright", legend = c("mean", "median", "pmedian"), - col = c("red", "green", "orange"), - pch = c(16, 2, 1), + col = c("red", "green", "blue"), + pch = c(16, 2, 3), xpd = NA ) -} - # Line centroids: -riversMid <- centroids(rivers, fail = FALSE) -riversMean <- centroids(rivers, method = "mean", fail = FALSE) -riversMedian <- centroids(rivers, method = "median", fail = FALSE) +madRivers <- fastData("madRivers") +rivers <- fast(madRivers) -if (!is.null(riversMid)) { +riversMid <- centroids(rivers) +riversMean <- centroids(rivers, method = "mean") +riversMedian <- centroids(rivers, method = "median") plot(rivers) plot(riversMid, col = "red", add = TRUE) plot(riversMean, col = "green", pch = 2, add = TRUE) -plot(riversMedian, col = "orange", pch = 1, add = TRUE) +plot(riversMedian, col = "blue", pch = 3, add = TRUE) legend("bottomright", legend = c("mid", "mean", "median"), - col = c("red", "green", "orange"), - pch = c(16, 2, 1), + col = c("red", "green", "blue"), + pch = c(16, 2, 3), xpd = NA ) -} - # Polygon centroids: -coastMean <- centroids(coast4, fail = FALSE) -coastMedian <- centroids(coast4, method = "median", fail = FALSE) -coastBMedian <- centroids(coast4, method = "bmedian", fail = FALSE) +madCoast4 <- fastData("madCoast4") +coast4 <- fast(madCoast4) -if (!is.null(coastMean)) { +coastMean <- centroids(coast4) +coastMedian <- centroids(coast4, method = "median") +coastBMedian <- centroids(coast4, method = "bmedian") plot(coast4) plot(coastMean, col = "red", add = TRUE) plot(coastMedian, col = "green", pch = 2, add = TRUE) -plot(coastBMedian, col = "orange", pch = 1, add = TRUE) +plot(coastBMedian, col = "blue", pch = 3, add = TRUE) legend("bottomright", legend = c("mean", "median", "bmedian"), - col = c("red", "green", "orange"), + col = c("red", "green", "blue"), pch = c(16, 2, 1), xpd = NA ) -} - } } \seealso{ diff --git a/man/examples/ex_addons.r b/man/examples/ex_addons.r index 4d9412da..9ef1e703 100644 --- a/man/examples/ex_addons.r +++ b/man/examples/ex_addons.r @@ -1,13 +1,9 @@ if (grassStarted()) { -# Does the addons folder exist? -ao <- addons(fail = "warning") -if (ao) print("Addons is folder is probably correctly specified.") +# What addons are installed? +addons() -# Does this particular tool exist? -addon <- "v.centerpoint" -exten <- addons(addon, fail = FALSE) - -if (exten) print("Extension `v.centerpoints` is installed.") +# Is a specific addon installed? +addons(c("v.centerpoint", "fake.addon")) } diff --git a/man/examples/ex_centroids.r b/man/examples/ex_centroids.r index 77a283f3..d9f1f589 100644 --- a/man/examples/ex_centroids.r +++ b/man/examples/ex_centroids.r @@ -5,73 +5,62 @@ library(sf) library(terra) # Points, lines, and polygons -madDypsis <- fastData("madDypsis") -madRivers <- fastData("madRivers") -madCoast4 <- fastData("madCoast4") - -# Convert to GVectors: -dypsis <- fast(madDypsis) -rivers <- fast(madRivers) -coast4 <- fast(madCoast4) # Point centroids: -dypMean <- centroids(dypsis, fail = FALSE) -dypMedian <- centroids(dypsis, method = "median", fail = FALSE) -dypPMedian <- centroids(dypsis, method = "pmedian", fail = FALSE) +madDypsis <- fastData("madDypsis") +dypsis <- fast(madDypsis) -if (!is.null(dypMean)) { +dypMean <- centroids(dypsis) +dypMedian <- centroids(dypsis, method = "median") +dypPMedian <- centroids(dypsis, method = "pmedian") plot(dypsis) plot(dypMean, col = "red", add = TRUE) plot(dypMedian, col = "green", pch = 2, add = TRUE) -plot(dypPMedian, col = "orange", pch = 1, add = TRUE) +plot(dypPMedian, col = "blue", pch = 3, add = TRUE) legend("bottomright", legend = c("mean", "median", "pmedian"), - col = c("red", "green", "orange"), - pch = c(16, 2, 1), + col = c("red", "green", "blue"), + pch = c(16, 2, 3), xpd = NA ) -} - # Line centroids: -riversMid <- centroids(rivers, fail = FALSE) -riversMean <- centroids(rivers, method = "mean", fail = FALSE) -riversMedian <- centroids(rivers, method = "median", fail = FALSE) +madRivers <- fastData("madRivers") +rivers <- fast(madRivers) -if (!is.null(riversMid)) { +riversMid <- centroids(rivers) +riversMean <- centroids(rivers, method = "mean") +riversMedian <- centroids(rivers, method = "median") plot(rivers) plot(riversMid, col = "red", add = TRUE) plot(riversMean, col = "green", pch = 2, add = TRUE) -plot(riversMedian, col = "orange", pch = 1, add = TRUE) +plot(riversMedian, col = "blue", pch = 3, add = TRUE) legend("bottomright", legend = c("mid", "mean", "median"), - col = c("red", "green", "orange"), - pch = c(16, 2, 1), + col = c("red", "green", "blue"), + pch = c(16, 2, 3), xpd = NA ) -} - # Polygon centroids: -coastMean <- centroids(coast4, fail = FALSE) -coastMedian <- centroids(coast4, method = "median", fail = FALSE) -coastBMedian <- centroids(coast4, method = "bmedian", fail = FALSE) +madCoast4 <- fastData("madCoast4") +coast4 <- fast(madCoast4) -if (!is.null(coastMean)) { +coastMean <- centroids(coast4) +coastMedian <- centroids(coast4, method = "median") +coastBMedian <- centroids(coast4, method = "bmedian") plot(coast4) plot(coastMean, col = "red", add = TRUE) plot(coastMedian, col = "green", pch = 2, add = TRUE) -plot(coastBMedian, col = "orange", pch = 1, add = TRUE) +plot(coastBMedian, col = "blue", pch = 3, add = TRUE) legend("bottomright", legend = c("mean", "median", "bmedian"), - col = c("red", "green", "orange"), + col = c("red", "green", "blue"), pch = c(16, 2, 1), xpd = NA ) } - -} diff --git a/man/fast.Rd b/man/fast.Rd index 35cb4571..7d512906 100644 --- a/man/fast.Rd +++ b/man/fast.Rd @@ -143,13 +143,13 @@ By default, \code{fast()} will try to correct topological errors in vectors. The Issues can also arise due to: \itemize{ \item \strong{Data table-vector mismatching}: If your vector has a data table ("attribute table") associated with it, errors can occur if there are more/fewer geometries (or multi-geometries) per row in the table. If you do not really need the data table to do your analysis, you can remove it (and thus obviate this error) using \code{dropTable = TRUE}. -\item \strong{Dissolving or aggregating "invalid" geometries}: Using the \code{resolve} argument, you can create a topologically valid vector by either coercing all overlapping portions of polygons into their own geometries (\code{resolve = "disaggregate"}), or by coercing them into a single, combined geometry (\code{resolve = "aggregate"}). Aggregation/disaggregation will be implemented after loading the vector into \strong{GRASS} using the settings given by \code{snap} and \code{area}. Aggregation/disaggregation will cause any associated data table to be dropped (it forces \code{dropTable} to be \code{TRUE}). The default action is to do neither aggregation nor disaggregation (\code{resolve = NA}). +\item \strong{Dissolving or aggregating "invalid" geometries}: Using the \code{resolve} argument, you can create a topologically valid vector by either coercing all overlapping portions of polygons into their own geometries (\code{resolve = "disaggregate"}), or by coercing them into a single, combined geometry (\code{resolve = "aggregate"}). Aggregation/disaggregation will be implemented after loading the vector into \strong{GRASS} using the settings given by \code{snap} and \code{area}. Aggregation/disaggregation will cause any associated data table to be dropped (it forces \code{dropTable} to be \code{TRUE}). The default action is to do neither aggregation nor disaggregation (\code{resolve = NA}). You can also do this outside \strong{fasterRaster} using \code{\link[terra:aggregate]{terra::aggregate()}} or \code{\link[terra:disaggregate]{terra::disagg()}}. } If none of these fixes work, you can try: \itemize{ -\item \strong{Correction outside of \emph{fasterRaster}}: Before you convert the vector into \strong{fasterRaster}'s \code{GVector} format, you can also try using the \code{\link[terra:is.valid]{terra::makeValid()}} or \code{\link[sf:valid]{sf::st_make_valid()}} tools to fix issues, then use \code{fast()}. -\item \strong{Post-conversion to a \code{GVector}}: If you do get a vector loaded into \code{GVector} format, you can also use a set of \strong{fasterRaster} vector-manipulation \link[=breakPolys]{tools} or \code{\link[=fillHoles]{fillHoles()}} to fix issues. +\item \strong{Correction outside of \emph{fasterRaster}}: Before you convert the vector into \strong{fasterRaster}'s \code{GVector} format, you can also try using the \code{\link[terra:is.valid]{terra::makeValid()}} or \code{\link[sf:valid]{sf::st_make_valid()}} tools to fix issues, then use \code{fast()}. You can also use \code{\link[terra:aggregate]{terra::aggregate()}} or \code{\link[terra:disaggregate]{terra::disagg()}} to combine/split problematic geometries. +\item \strong{Post-load correction}: If you do get a vector loaded into \code{GVector} format, you can also use a set of \strong{fasterRaster} vector-manipulation \link[=breakPolys]{tools} or \code{\link[=fillHoles]{fillHoles()}} to fix issues. } } \examples{ diff --git a/man/fasterRaster.Rd b/man/fasterRaster.Rd index 9af3f182..7beb1d13 100644 --- a/man/fasterRaster.Rd +++ b/man/fasterRaster.Rd @@ -12,12 +12,10 @@ \item The quick-start guide to getting started with \strong{fasterRaster}: \code{vignette("fasterRaster", package = "fasterRaster")}: \item Types of \code{GRaster}s: \code{vignette("GRasters", package = "fasterRaster")} \item How to speed up \strong{fasterRaster}: \code{vignette("faster_fasterRaster", package = "fasterRaster")} -\item Using functions that depend on \strong{GRASS} addons: \code{vignette("addons", package = "fasterRaster")} \item \code{\link[=faster]{faster()}}: Set the directory where \strong{GRASS} is installed on your system, and set or get other package-wide options. This function must be run once before using most \strong{fasterRaster} functions. \item \code{\link[=fast]{fast()}}: Convert a \code{SpatRaster}, \code{SpatVector}, or \code{sf} vector to \strong{fasterRaster}'s raster format (\code{GRaster}s) or vector format (\code{GVector}s), or load one from a file \item \code{\link[=rast]{rast()}}, \code{\link[=vect]{vect()}}, and \code{\link[=st_as_sf]{st_as_sf()}}: Convert \code{GRaster}s and \code{GVector}s to \code{SpatRaster}s, \code{SpatVector}s, or \code{sf} vectors \item \code{\link[=writeRaster]{writeRaster()}} and \code{\link[=writeVector]{writeVector()}}: Save \code{GRaster}s or \code{GVector}s to disk -\item \code{\link[=addons]{addons()}}: Test if the \code{addons} directory is correct and if a particular addon \strong{GRASS} tool is installed. } } @@ -340,15 +338,18 @@ Operations on \code{GRaster}s \subsection{General purpose functions}{ \itemize{ +\item \code{\link[=addon]{addon()}}: Show installed \strong{GRASS} addons \item \code{\link[=compareGeom]{compareGeom()}}: Determine if geographic metadata is same between \code{GRaster}s and/or \code{GVector}s \item \code{\link[=dropRows]{dropRows()}}: Remove rows from a \code{data.frame} or \code{data.table} \item \code{\link[=grassGUI]{grassGUI()}}: Start the \strong{GRASS} GUI (not recommended for most users!!!) \item \code{\link[=grassHelp]{grassHelp()}}: Open the help page for a \strong{GRASS} tool. \item \code{\link[=grassInfo]{grassInfo()}}: \strong{GRASS} version and citation \item \code{\link[=grassStarted]{grassStarted()}}: Has a connection \strong{GRASS} been made within the current \strong{R} session? +\item \code{\link[=installAddon]{installAddon()}}: Install a \strong{GRASS} addon \item \code{\link[=mow]{mow()}}: Remove unused rasters and vectors from the \strong{GRASS} cache \item \code{\link[=reorient]{reorient()}}: Convert degrees between 'north-orientation' and 'east orientation' \item \code{\link[=replaceNAs]{replaceNAs()}}: Replace \code{NA}s in columns of a \code{data.table} or \code{data.frame}, or in a vector +\item \code{\link[=removeAddon]{removeAddon()}}: Delete \strong{GRASS} addon from your system \item \code{\link[=seqToSQL]{seqToSQL()}}: Format a numeric series into an SQL value call \item \code{\link[=update]{update()}}: Refresh metadata in a \code{GRaster} or \code{GVector} object } diff --git a/man/spatSample.Rd b/man/spatSample.Rd index 31ec807b..77ea5115 100644 --- a/man/spatSample.Rd +++ b/man/spatSample.Rd @@ -135,5 +135,5 @@ plot(randAll) } } \seealso{ -\code{\link[=sampleRast]{sampleRast()}}, \code{\link[terra:sample]{terra::spatSample()}}, tool \code{v.random} in \strong{GRASS} +\code{\link[=sampleRast]{sampleRast()}}, \code{\link[terra:sample]{terra::spatSample()}}, tool \code{v.random} in \strong{GRASS} (see \code{grassHelp("v.random")}) } diff --git a/man/workDir.Rd b/man/workDir.Rd index 113e9550..8f1e95d7 100644 --- a/man/workDir.Rd +++ b/man/workDir.Rd @@ -3,12 +3,15 @@ \name{.workDir,GLocation-method} \alias{.workDir,GLocation-method} \alias{.workDir} +\alias{.workDir,missing-method} \title{Get a GLocation's working directory} \usage{ \S4method{.workDir}{GLocation}(x) + +\S4method{.workDir}{missing}(x) } \arguments{ -\item{x}{A \code{GLocation} object.} +\item{x}{A \code{GLocation} object or missing. If an object, returns the working folder in which the object is saved by \strong{GRASS}. If missing, then just returns the working folder (same as \code{faster("workDir")}).} } \value{ Character. From 69de4848d8c5eef5554a95dee0d6d5d650b6d243 Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Tue, 20 May 2025 22:09:59 -0500 Subject: [PATCH 24/52] Add `.addons()` --- R/addons.r | 20 +++++++++++++++++--- man/addons.Rd | 7 ++++--- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/R/addons.r b/R/addons.r index fb0b0257..8bb8058c 100644 --- a/R/addons.r +++ b/R/addons.r @@ -12,8 +12,6 @@ #' #' @returns `addons()`: Logical. The other functions invisibly return a logical value indicating if the operation succeeded or not. #' -#' @seealso `vignette("addons", package = "fasterRaster")` -#' #' @example man/examples/ex_addons.r #' #' @aliases addons @@ -26,7 +24,7 @@ addons <- function(x = NULL) { out <- NULL } else { - out <- rgrass::execGRASS("g.extension", flags = c("a", .quiet()), intern = TRUE) + out <- rgrass::execGRASS("g.extension", flags = c("a"), intern = TRUE) if (is.null(x)) { out <- sort(out) } else if (!is.null(x)) { @@ -72,6 +70,22 @@ removeAddon <- function(x, check = TRUE) { } +#' Test to see if a given addon is installed, and if not, installs it. +#' +#' @aliases .addons +#' @rdname addons +#' @keywords internal +.addons <- function(x) { + + installed <- addons(x) + if (!installed) { + installAddon(x, check = FALSE) + } + +} + + + # # Tests if addons folder is installed # addons <- function(xx = NULL, fail = TRUE, verbose = TRUE) { diff --git a/man/addons.Rd b/man/addons.Rd index 924831cd..904b9bc6 100644 --- a/man/addons.Rd +++ b/man/addons.Rd @@ -4,6 +4,7 @@ \alias{addons} \alias{installAddon} \alias{removeAddon} +\alias{.addons} \title{Test if addons directory exists and if an addon is installed} \usage{ addons(x = NULL) @@ -11,6 +12,8 @@ addons(x = NULL) installAddon(x, check = TRUE) removeAddon(x, check = TRUE) + +.addons(x) } \arguments{ \item{x}{Either \code{NULL} or a character specifying the name of a \strong{GRASS} addons tool. If \code{NULL}, a vector of installed addons is returned. If a character vector is provided, a logical vector is returned, one per value in \code{x} that indicates if the respective addon is installed.} @@ -39,6 +42,4 @@ addons(c("v.centerpoint", "fake.addon")) } } -\seealso{ -\code{vignette("addons", package = "fasterRaster")} -} +\keyword{internal} From 70657e84bd2a36b8562fb930da2b964dc5a8f2f5 Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Tue, 20 May 2025 22:10:18 -0500 Subject: [PATCH 25/52] Update with `.addons()` --- R/centroids.r | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/R/centroids.r b/R/centroids.r index a7ff1689..51eb21fc 100644 --- a/R/centroids.r +++ b/R/centroids.r @@ -2,7 +2,7 @@ #' #' @description This function locates the centroid of each geometry of a `GVector`. #' -#' **To use this function**, you must have installed the `v.centerpoint` addon using `installAddons("v.centerpoint")`. If you are not sure if this is already installed, you can use `addons("v.centerpoint")`. This should be all you need to do, but see [installAddons()] and [addons()] for more details are needed. +#' **Note**: To use this function, you must have installed the `v.centerpoint` addon using `installAddons("v.centerpoint")`. If you are not sure if this is already installed, the function will try to do this. You can also do it manually using `addons("v.centerpoint")`. #' #' @param x A `GVector`. #' @param method Character or `NULL` (default): Method used for calculating centroids. The method of calculation depends on whether the input is a `points`, `lines`, or `polygons` `GVector`. If the value is `NULL`, then the default method will be chosen, depending on the geometry type of the `GVector`: @@ -37,12 +37,7 @@ methods::setMethod( signature = c(x = "GVector"), function(x, method = NULL, check = TRUE) { - if (check) { - - ok <- addons("v.centerpoint") - if (!ok) stop("The `v.centerpoint` addon is not installed. You can install it using `installAddon()`.") - - } + if (check) .addons("v.centerpoint") gtype <- geomtype(x) From 3682d785b34638a1c5e5b0c9d6b58897e0a51066 Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Tue, 20 May 2025 22:10:45 -0500 Subject: [PATCH 26/52] Add `rRandWalk()` --- NAMESPACE | 1 + NEWS.md | 9 +++++ R/01_generics.r | 1 + R/fasterRaster.r | 1 + R/rRandWalk.r | 75 +++++++++++++++++++++++++++++++++++++ _pkgdown.yml | 1 + man/examples/ex_rWalkRast.r | 29 ++++++++++++++ man/fasterRaster.Rd | 1 + man/rRandWalk.Rd | 48 ++++++++++++++++++++++++ 9 files changed, 166 insertions(+) create mode 100644 R/rRandWalk.r create mode 100644 man/examples/ex_rWalkRast.r create mode 100644 man/rRandWalk.Rd diff --git a/NAMESPACE b/NAMESPACE index 8ff1ebd2..3ca1abf2 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -196,6 +196,7 @@ exportMethods(predict) exportMethods(princomp) exportMethods(project) exportMethods(quantile) +exportMethods(rRandWalk) exportMethods(rSpatialDepRast) exportMethods(range) exportMethods(rast) diff --git a/NEWS.md b/NEWS.md index 2e0e25cd..d4690fbb 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,12 @@ +# fasterRaster 8.4.0.8 (2025-XX-XX) +o `addons()` now reports whether a given addon is installed or the names of all installed addons. +o `installAddon()` installs an addon. +o `removeAddon()` deletes an addon. +o `rRandWalk()` creates a raster with the path of random walkers. +o Minor fixes to help. +o Rebranding as per **GRASS** re-brand (haromonized logo with **GRASS** April 2025 branding guidelines, "GRASS GIS" --> just "GRASS", "modules" --> "tools). + + # fasterRaster 8.4.0.7 (2025-04-24) o Removed dependency on **rpanel** because its dependency on **tclk** did not work with **Docker** images. Replaced with version dependency on **omnibus**'s `screenRes()` function. diff --git a/R/01_generics.r b/R/01_generics.r index aee8e02c..5704d204 100644 --- a/R/01_generics.r +++ b/R/01_generics.r @@ -231,6 +231,7 @@ methods::setGeneric(name = "project", package = "terra") methods::setGeneric(name = "quantile", package = "terra") +methods::setGeneric(name = "rRandWalk", def = function(x, ...) standardGeneric("rRandWalk")) methods::setGeneric(name = "rast", package = "terra") methods::setGeneric(name = "rasterize", package = "terra") # methods::setGeneric(name = "rbind") diff --git a/R/fasterRaster.r b/R/fasterRaster.r index 3732331f..69629e93 100644 --- a/R/fasterRaster.r +++ b/R/fasterRaster.r @@ -125,6 +125,7 @@ #' * [init()]: GRaster with values equal to row, column, coordinate, regular, or "chess" #' * [longlat()]: Create longitude/latitude rasters #' * [rnormRast()]: A random `GRaster` with values drawn from a normal distribution +#' * [rRandWalk()]: Paths of random walker #' * [rSpatialDepRast()]: Create a random `GRaster` with or without spatial dependence #' * [runifRast()]: A random `GRaster` with values drawn from a uniform distribution #' * [sineRast()]: Sine wave rasters diff --git a/R/rRandWalk.r b/R/rRandWalk.r new file mode 100644 index 00000000..3a08ae51 --- /dev/null +++ b/R/rRandWalk.r @@ -0,0 +1,75 @@ +#' Create raster representing one or more random walks +#' +#' This function creates a raster where the cell values represent the number of times one or more random "walkers" traverse the cell. +#' +#' **Note**: To use this function, you must have installed the `r.random.walk` addon using `installAddons("r.random.walk")`. If you are not sure if this is already installed, the function will try to do this. You can also do it manually using `addons("r.random.walk")`. +#' +#' @param x A `GRaster` to serve as a template. +#' +#' @param n Numeric: Number of walkers. Default is 1. +#' +#' @param steps Numeric: Number of steps taken by each walker. Default is 100000. +#' +#' @param directions Either 4 or 8: Directions in which a walker can turn at any point. If 4, then walks are confined to north/south/east/west directions (Rook's case). If 8, then the cardinal and subcardinal directions are allowed (Queen's case). +#' +#' @param avoid Logical: If `FALSE` (default), then walkers can traverse their own walks. If `TRUE`, walkers avoid their own trails. A self-avoiding random walk can take much longer to compute. +#' +#' @param sameStart Logical: If `FALSE` (default), walkers can begin anywhere. If `TRUE`, then walkers start from the same place. +#' +#' @param seed Integer or `NULL` (default): If `NULL`, then a random seed is generated by the function. If numeric, results will be deterministic. In either case, the value will be rounded to the nearest integer. +#' +#' @param check Logical: If `TRUE` (default), function will check to see if the addon `r.random.walk` has been installed. If it has not, it will attempt to install it. +#' +#' @returns A `GRaster` with cell values representing the number of times one or more walkers traversed the cell. +#' +#' @examples man/examples/ex_rRandWalk/r +#' +#' @aliases rRandWalk +#' @rdname rRandWalk +#' @exportMethod rRandWalk +methods::setMethod( + f = "rRandWalk", + signature = c(x = "GRaster"), + function(x, n = 1, steps = 100000, directions = 8, avoid = FALSE, sameStart = FALSE, seed = NULL, check = TRUE) { + + if (!(directions %in% c(4, 8))) stop("The `directions` argument must be 4 or 8.") + directions <- as.character(directions) + + if (!is.null(seed)) seed <- round(seed) + + if (check) .addons("r.random.walk") + + .locationRestore(x) + .region(x) + + src <- .makeSourceName("rRandWalk_r_random_walk", "raster") + args <- list( + cmd = "r.random.walk", + output = src, + steps = steps, + directions = directions, + memory = faster("memory"), + nprocs = faster("cores"), + nwalkers = n, + flags = c(.quiet(), "overwrite") + ) + + if (!is.null(seed)) { + args <- c(args, seed = seed) + } else if (is.null(seed)) { + args$flags <- c(args$flags, "s") + } + if (avoid) args$flags <- c(args$flags, "a") + if (sameStart) args$flags <- c(args$flags, "t") + + do.call(rgrass::execGRASS, args = args) + + srcIn <- src + src <- .makeSourceName("rRandWalk_r_mapcalc", "raster") + ex <- paste0(src, " = int(", srcIn, ")") + rgrass::execGRASS("r.mapcalc", expression = ex, flags = c(.quiet(), "overwrite")) + + .makeGRaster(src, "randomWalk") + + } # EOF +) diff --git a/_pkgdown.yml b/_pkgdown.yml index 93c3178c..b7df593c 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -207,6 +207,7 @@ reference: - init - longlat - rnormRast + - rRandWalk - rSpatialDepRast - runifRast - sineRast diff --git a/man/examples/ex_rWalkRast.r b/man/examples/ex_rWalkRast.r new file mode 100644 index 00000000..c2d92273 --- /dev/null +++ b/man/examples/ex_rWalkRast.r @@ -0,0 +1,29 @@ +if (grassStarted()) { + +# Setup +library(terra) + +# Elevation raster +madElev <- fastData("madElev") + +# Convert a SpatRaster to a GRaster: +elev <- fast(madElev) + +# Random walker: +walk <- rRandWalk(elev) +plot(walk) + +# Random walker with self-avoidance: +walkAvoid <- rRandWalk(elev, steps = 1000, avoid = TRUE, seed = 1) +plot(walkAvoid) + +# 10 random walkers: +walk10 <- rRandWalk(elev, n = 10) +plot(walk10) + +# 10 random walkers starting in same place: +walkSame10 <- rRandWalk(elev, n = 10, sameStart = TRUE) +plot(walkSame10) + + +} diff --git a/man/fasterRaster.Rd b/man/fasterRaster.Rd index 7beb1d13..8c258092 100644 --- a/man/fasterRaster.Rd +++ b/man/fasterRaster.Rd @@ -148,6 +148,7 @@ Operations on \code{GRaster}s \item \code{\link[=init]{init()}}: GRaster with values equal to row, column, coordinate, regular, or "chess" \item \code{\link[=longlat]{longlat()}}: Create longitude/latitude rasters \item \code{\link[=rnormRast]{rnormRast()}}: A random \code{GRaster} with values drawn from a normal distribution +\item \code{\link[=rRandWalk]{rRandWalk()}}: Paths of random walker \item \code{\link[=rSpatialDepRast]{rSpatialDepRast()}}: Create a random \code{GRaster} with or without spatial dependence \item \code{\link[=runifRast]{runifRast()}}: A random \code{GRaster} with values drawn from a uniform distribution \item \code{\link[=sineRast]{sineRast()}}: Sine wave rasters diff --git a/man/rRandWalk.Rd b/man/rRandWalk.Rd new file mode 100644 index 00000000..d65580e0 --- /dev/null +++ b/man/rRandWalk.Rd @@ -0,0 +1,48 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/rRandWalk.r +\name{rRandWalk,GRaster-method} +\alias{rRandWalk,GRaster-method} +\alias{rRandWalk} +\title{Create raster representing one or more random walks} +\usage{ +\S4method{rRandWalk}{GRaster}( + x, + n = 1, + steps = 1e+05, + directions = 8, + avoid = FALSE, + sameStart = FALSE, + seed = NULL, + check = TRUE +) +} +\arguments{ +\item{x}{A \code{GRaster} to serve as a template.} + +\item{n}{Numeric: Number of walkers. Default is 1.} + +\item{steps}{Numeric: Number of steps taken by each walker. Default is 100000.} + +\item{directions}{Either 4 or 8: Directions in which a walker can turn at any point. If 4, then walks are confined to north/south/east/west directions (Rook's case). If 8, then the cardinal and subcardinal directions are allowed (Queen's case).} + +\item{avoid}{Logical: If \code{FALSE} (default), then walkers can traverse their own walks. If \code{TRUE}, walkers avoid their own trails. A self-avoiding random walk can take much longer to compute.} + +\item{sameStart}{Logical: If \code{FALSE} (default), walkers can begin anywhere. If \code{TRUE}, then walkers start from the same place.} + +\item{seed}{Integer or \code{NULL} (default): If \code{NULL}, then a random seed is generated by the function. If numeric, results will be deterministic. In either case, the value will be rounded to the nearest integer.} + +\item{check}{Logical: If \code{TRUE} (default), function will check to see if the addon \code{r.random.walk} has been installed. If it has not, it will attempt to install it.} +} +\value{ +A \code{GRaster} with cell values representing the number of times one or more walkers traversed the cell. +} +\description{ +This function creates a raster where the cell values represent the number of times one or more random "walkers" traverse the cell. +} +\details{ +\strong{Note}: To use this function, you must have installed the \code{r.random.walk} addon using \code{installAddons("r.random.walk")}. If you are not sure if this is already installed, the function will try to do this. You can also do it manually using \code{addons("r.random.walk")}. +} +\examples{ +man/examples/ex_rRandWalk/r + +} From 3d98eebd63921b6b2120b797c33b33d8177c9c75 Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Tue, 20 May 2025 22:10:49 -0500 Subject: [PATCH 27/52] Update centroids.Rd --- man/centroids.Rd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/man/centroids.Rd b/man/centroids.Rd index 4c27300a..3cfa0edd 100644 --- a/man/centroids.Rd +++ b/man/centroids.Rd @@ -42,7 +42,7 @@ A points \code{GVector}. \description{ This function locates the centroid of each geometry of a \code{GVector}. -\strong{To use this function}, you must have installed the \code{v.centerpoint} addon using \code{installAddons("v.centerpoint")}. If you are not sure if this is already installed, you can use \code{addons("v.centerpoint")}. This should be all you need to do, but see \code{\link[=installAddons]{installAddons()}} and \code{\link[=addons]{addons()}} for more details are needed. +\strong{Note}: To use this function, you must have installed the \code{v.centerpoint} addon using \code{installAddons("v.centerpoint")}. If you are not sure if this is already installed, the function will try to do this. You can also do it manually using \code{addons("v.centerpoint")}. } \examples{ if (grassStarted()) { From e16a1c7d935d2c816647ee99411a60876dcb0d09 Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Tue, 20 May 2025 22:10:57 -0500 Subject: [PATCH 28/52] Add `.addons()` --- vignettes/hidden_functions.Rmd | 1 + 1 file changed, 1 insertion(+) diff --git a/vignettes/hidden_functions.Rmd b/vignettes/hidden_functions.Rmd index 4c88b325..66832b7d 100644 --- a/vignettes/hidden_functions.Rmd +++ b/vignettes/hidden_functions.Rmd @@ -20,6 +20,7 @@ fig.path = 'man/figures/' **fasterRaster** contains a set of "private" functions that users can access using `fasterRaster:::functionName`. These functions are useful for power users and developers. Not all hidden functions are listed here. Often, a method will have a hidden function of the same name that starts with a period (e.g., `.plot()`). This "period" function is intended to be supplied the [`sources()`](https://adamlilith.github.io/fasterRaster/reference/sources.html) name of a `GRaster` or `GVector` from other functions so that the calling function does not need to spend the time creating the `GRaster` or `GVector` pointer before calling the function. "Period" functions will, though, often work on `GRaster`s or `GVector`s, though some error-checking and region re-definition is not conducted. ## General +* `.addons()`: Tests if an addon is installed, and if not, attempts to install it. * `.backdoor()`: Calls [faster()] and sets **GRASS** folder to "`C:/Program Files/GRASS GIS X.Y`", plus other options useful for development. * `.fileExt()`: Get file extension * `.ls()`: Lists the `sources` of all objects in the active **GRASS** "project/location" From 65dab33a1da3c87b392d132b68ea353bc9a951e3 Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Wed, 21 May 2025 09:45:02 -0500 Subject: [PATCH 29/52] Update help re `addons()` --- R/centroids.r | 2 +- R/rRandWalk.r | 13 ++++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/R/centroids.r b/R/centroids.r index 51eb21fc..37ef8c1b 100644 --- a/R/centroids.r +++ b/R/centroids.r @@ -2,7 +2,7 @@ #' #' @description This function locates the centroid of each geometry of a `GVector`. #' -#' **Note**: To use this function, you must have installed the `v.centerpoint` addon using `installAddons("v.centerpoint")`. If you are not sure if this is already installed, the function will try to do this. You can also do it manually using `addons("v.centerpoint")`. +#' This function needs the **GRASS** addon `v.centerpoint`. If it is not installed, it will try to install it. #' #' @param x A `GVector`. #' @param method Character or `NULL` (default): Method used for calculating centroids. The method of calculation depends on whether the input is a `points`, `lines`, or `polygons` `GVector`. If the value is `NULL`, then the default method will be chosen, depending on the geometry type of the `GVector`: diff --git a/R/rRandWalk.r b/R/rRandWalk.r index 3a08ae51..25f8870c 100644 --- a/R/rRandWalk.r +++ b/R/rRandWalk.r @@ -1,9 +1,8 @@ #' Create raster representing one or more random walks #' -#' This function creates a raster where the cell values represent the number of times one or more random "walkers" traverse the cell. -#' -#' **Note**: To use this function, you must have installed the `r.random.walk` addon using `installAddons("r.random.walk")`. If you are not sure if this is already installed, the function will try to do this. You can also do it manually using `addons("r.random.walk")`. +#' This function creates a raster where the cell values represent the number of times one or more random "walkers" traverse the cell. If you simulate multiple random walkers, you can do computation in parallel, which can be controlled by allowing **fasterRaster** to use multiple cores and more memory, which are options set by the [faster()] function. #' +#' This function needs the **GRASS** addon `r.random.walk`. If it is not installed, it will try to install it.#' #' @param x A `GRaster` to serve as a template. #' #' @param n Numeric: Number of walkers. Default is 1. @@ -64,10 +63,10 @@ methods::setMethod( do.call(rgrass::execGRASS, args = args) - srcIn <- src - src <- .makeSourceName("rRandWalk_r_mapcalc", "raster") - ex <- paste0(src, " = int(", srcIn, ")") - rgrass::execGRASS("r.mapcalc", expression = ex, flags = c(.quiet(), "overwrite")) + # srcIn <- src + # src <- .makeSourceName("rRandWalk_r_mapcalc", "raster") + # ex <- paste0(src, " = int(", srcIn, ")") + # rgrass::execGRASS("r.mapcalc", expression = ex, flags = c(.quiet(), "overwrite")) .makeGRaster(src, "randomWalk") From 0797ed8c51a8d33242546d2b77ecef09210d5c1e Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Wed, 21 May 2025 09:45:12 -0500 Subject: [PATCH 30/52] Update NEWS.md --- NEWS.md | 1 - 1 file changed, 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index d4690fbb..18a6ea09 100644 --- a/NEWS.md +++ b/NEWS.md @@ -6,7 +6,6 @@ o `rRandWalk()` creates a raster with the path of random walkers. o Minor fixes to help. o Rebranding as per **GRASS** re-brand (haromonized logo with **GRASS** April 2025 branding guidelines, "GRASS GIS" --> just "GRASS", "modules" --> "tools). - # fasterRaster 8.4.0.7 (2025-04-24) o Removed dependency on **rpanel** because its dependency on **tclk** did not work with **Docker** images. Replaced with version dependency on **omnibus**'s `screenRes()` function. From f4b02316247fedd1d5c85f8cdee23f6680327cd7 Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Wed, 21 May 2025 22:36:46 -0500 Subject: [PATCH 31/52] Rename `rUnifRast()` and `rNormRast()` --- R/fractalRast.r | 2 +- R/{rRandWalk.r => rRandWalkRast.r} | 14 ++++++++------ R/rSpatialDepRast.r | 4 ++-- R/rnormRast.r | 12 ++++++------ R/runifRast.r | 12 ++++++------ 5 files changed, 23 insertions(+), 21 deletions(-) rename R/{rRandWalk.r => rRandWalkRast.r} (89%) diff --git a/R/fractalRast.r b/R/fractalRast.r index 946a9644..cccc23eb 100644 --- a/R/fractalRast.r +++ b/R/fractalRast.r @@ -14,7 +14,7 @@ #' #' @example man/examples/ex_randRast.r #' -#' @seealso [rSpatialDepRast()], [rnormRast()], [runifRast()], **GRASS** manual page for tool `r.surf.fractal` (see `grassHelp("r.surf.fractal")`) +#' @seealso [rSpatialDepRast()], [rNormRast()], [rUnifRast()], [rRandWalkRast()], **GRASS** manual page for tool `r.surf.fractal` (see `grassHelp("r.surf.fractal")`) #' #' @aliases fractalRast #' @rdname fractalRast diff --git a/R/rRandWalk.r b/R/rRandWalkRast.r similarity index 89% rename from R/rRandWalk.r rename to R/rRandWalkRast.r index 25f8870c..a5575664 100644 --- a/R/rRandWalk.r +++ b/R/rRandWalkRast.r @@ -1,6 +1,6 @@ #' Create raster representing one or more random walks #' -#' This function creates a raster where the cell values represent the number of times one or more random "walkers" traverse the cell. If you simulate multiple random walkers, you can do computation in parallel, which can be controlled by allowing **fasterRaster** to use multiple cores and more memory, which are options set by the [faster()] function. +#' This function creates a raster where the cell values represent the number of times one or more random "walkers" traverse the cell. If you simulate multiple random walkers, you can do computation in parallel, which can be controlled by allowing **fasterRaster** to use multiple cores and more memory using the "cores" and "memory" arguments in the [faster()] function. #' #' This function needs the **GRASS** addon `r.random.walk`. If it is not installed, it will try to install it.#' #' @param x A `GRaster` to serve as a template. @@ -21,13 +21,15 @@ #' #' @returns A `GRaster` with cell values representing the number of times one or more walkers traversed the cell. #' -#' @examples man/examples/ex_rRandWalk/r +#' @seealso [rNormRast()], [rUnifRast()], [rSpatialDepRast()], [fractalRast()] + +#' @example man/examples/ex_randRast.r #' -#' @aliases rRandWalk -#' @rdname rRandWalk -#' @exportMethod rRandWalk +#' @aliases rRandWalkRast +#' @rdname rRandWalkRast +#' @exportMethod rRandWalkRast methods::setMethod( - f = "rRandWalk", + f = "rRandWalkRast", signature = c(x = "GRaster"), function(x, n = 1, steps = 100000, directions = 8, avoid = FALSE, sameStart = FALSE, seed = NULL, check = TRUE) { diff --git a/R/rSpatialDepRast.r b/R/rSpatialDepRast.r index dd409054..d340973d 100644 --- a/R/rSpatialDepRast.r +++ b/R/rSpatialDepRast.r @@ -1,6 +1,6 @@ #' Create a random raster with or without spatial dependence #' -#' @description `rSpatialDepRast()` creates a raster with random values in cells. Across the raster, values are approximately normally distributed, though a raster with a "true" normal distribution can be made with [rnormRast()]. Spatial dependence can be introduced, though all together the values will still be approximately normally distributed. +#' @description `rSpatialDepRast()` creates a raster with random values in cells. Across the raster, values are approximately normally distributed, though a raster with a "true" normal distribution can be made with [rNormRast()]. Spatial dependence can be introduced, though all together the values will still be approximately normally distributed. #' #' @param x A `GRaster`: The output will have the same extent and dimensions as this raster. #' @@ -20,7 +20,7 @@ #' #' @example man/examples/ex_randRast.r #' -#' @seealso [rnormRast()], [fractalRast()], [runifRast()], **GRASS** manual page for tool `r.random.surface` (see `grassHelp("r.random.surface")`) +#' @seealso [rNormRast()], [fractalRast()], [rUnifRast()], [rRandWalkRast()], **GRASS** manual page for tool `r.random.surface` (see `grassHelp("r.random.surface")`) #' #' @aliases rSpatialDepRast #' @rdname rSpatialDepRast diff --git a/R/rnormRast.r b/R/rnormRast.r index a34b6def..710459fa 100644 --- a/R/rnormRast.r +++ b/R/rnormRast.r @@ -1,6 +1,6 @@ #' Create a raster with random values drawn from a normal distribution #' -#' @description `rnormRast()` creates a raster with values drawn from a normal distribution. +#' @description `rNormRast()` creates a raster with values drawn from a normal distribution. #' #' @param x A `GRaster`: The output will have the same extent and dimensions as this raster. #' @@ -14,13 +14,13 @@ #' #' @example man/examples/ex_randRast.r #' -#' @seealso [rSpatialDepRast()], [fractalRast()], [runifRast()], **GRASS** manual page for tool `r.random.surface` (see `grassHelp("r.random.surface")`) +#' @seealso [rSpatialDepRast()], [fractalRast()], [rUnifRast()], [rRandWalkRast()], **GRASS** manual page for tool `r.random.surface` (see `grassHelp("r.random.surface")`) #' -#' @aliases rnormRast -#' @rdname rnormRast -#' @exportMethod rnormRast +#' @aliases rNormRast +#' @rdname rNormRast +#' @exportMethod rNormRast methods::setMethod( - f = "rnormRast", + f = "rNormRast", signature = c(x = "GRaster"), function(x, n = 1, diff --git a/R/runifRast.r b/R/runifRast.r index b5d21dac..65a96c03 100644 --- a/R/runifRast.r +++ b/R/runifRast.r @@ -1,6 +1,6 @@ #' Create a raster with random values drawn from a uniform distribution #' -#' @description `runifRast()` creates a raster with values drawn from a uniform (flat) distribution. +#' @description `rUnifRast()` creates a raster with values drawn from a uniform (flat) distribution. #' #' @param x A `GRaster`. The output will have the same extent and dimensions as this raster. #' @@ -14,13 +14,13 @@ #' #' @example man/examples/ex_randRast.r #' -#' @seealso [rnormRast()], [rSpatialDepRast()], [fractalRast()], **GRASS** manual page for tool `r.random.surface` (see `grassHelp("r.random.surface")`) +#' @seealso [rNormRast()], [rSpatialDepRast()], [fractalRast()], [rRandWalkRast()], **GRASS** manual page for tool `r.random.surface` (see `grassHelp("r.random.surface")`) #' -#' @aliases runifRast -#' @rdname runifRast -#' @exportMethod runifRast +#' @aliases rUnifRast +#' @rdname rUnifRast +#' @exportMethod rUnifRast methods::setMethod( - f = "runifRast", + f = "rUnifRast", signature = c(x = "GRaster"), function( x, From e17b385541b2e8a9ea98a20d7c181a493d29a7ca Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Wed, 21 May 2025 22:37:06 -0500 Subject: [PATCH 32/52] Allow calculation in user-defined window w/ addon --- R/ruggedness.r | 48 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/R/ruggedness.r b/R/ruggedness.r index 60523c96..ae901491 100644 --- a/R/ruggedness.r +++ b/R/ruggedness.r @@ -1,8 +1,12 @@ #' Terrain ruggedness index #' -#' @description For a given focal grid cell, the terrain ruggedness index (TRI) is calculated by taking the square root of the average of the squared difference between the focal cell's elevation and the elevations of the 8 surrounding cells, or \deqn{\sqrt(\sum_{i = 1}^{8}(m_i - m_0)^2 / 8)} where \eqn{m_0} is the elevation of the focal cell and \eqn{m_i} is the elevation of the *i*th grid cell. +#' @description For a given focal grid cell, the terrain ruggedness index (TRI) is calculated by taking the square root of the average of the squared difference between the focal cell's elevation and the elevations of the 8 surrounding cells, or \deqn{\sqrt(\sum_{i = 1}^{8}(m_i - m_0)^2 / 8)} where \eqn{m_0} is the elevation of the focal cell and \eqn{m_i} is the elevation of the *i*th grid cell. Areas that are entirely flat will have a value of `NA` assigned to them. +#' +#' By default, TRI is calculated for a 3x3 moving window around each focal cell. However, you can use a larger-sized window. In this case, the window size must be an odd number >= 3, and you must have the `r.tri` **GRASS** addon installed. If it is not installed, the function will try to install it. #' #' @param x A `GRaster`. +#' @param size Integer (default is 3): Size of the moving window. Must be an odd integer >= 3. +#' @param exponent Numeric >= 0 and <= 4. Used to reduce the influence of cells farther from the focal cell (larger areas can yield noisier results if the exponent small). All cells are weighted equally when `exponent = 0`. #' #' @returns A `GRaster`. #' @@ -18,7 +22,11 @@ methods::setMethod( f = "ruggedness", signature = c(x = "GRaster"), - function(x) { + function(x, size = 3, exponent = 0) { + + if (size %% 2 != 1) stop("Argument `size` must be an odd integer >= 3.") + if (exponent < 0 | exponent > 4) stop("Argument `exponent` must in the range [0, 4].") + if (size > 3) .addons("r.tri") .locationRestore(x) .region(x) @@ -27,17 +35,33 @@ methods::setMethod( srcs <- .makeSourceName("terrainRuggednessIndex_r_mapcalc", "raster", n = nLayers) for (i in seq_len(nLayers)) { - ex <- paste0(srcs[i], " = sqrt((", - "(", sources(x)[i], "[-1, -1] - ", sources(x), ")^2 + ", - "(", sources(x)[i], "[-1, 0] - ", sources(x), ")^2 + ", - "(", sources(x)[i], "[-1, 1] - ", sources(x), ")^2 + ", - "(", sources(x)[i], "[0, -1] - ", sources(x), ")^2 + ", - "(", sources(x)[i], "[0, 1] - ", sources(x), ")^2 + ", - "(", sources(x)[i], "[1, -1] - ", sources(x), ")^2 + ", - "(", sources(x)[i], "[1, 0] - ", sources(x), ")^2 + ", - "(", sources(x)[i], "[1, 1] - ", sources(x), ")^2) / 8)") + if (size == 3) { + + ex <- paste0(srcs[i], " = sqrt((", + "(", sources(x)[i], "[-1, -1] - ", sources(x), ")^2 + ", + "(", sources(x)[i], "[-1, 0] - ", sources(x), ")^2 + ", + "(", sources(x)[i], "[-1, 1] - ", sources(x), ")^2 + ", + "(", sources(x)[i], "[0, -1] - ", sources(x), ")^2 + ", + "(", sources(x)[i], "[0, 1] - ", sources(x), ")^2 + ", + "(", sources(x)[i], "[1, -1] - ", sources(x), ")^2 + ", + "(", sources(x)[i], "[1, 0] - ", sources(x), ")^2 + ", + "(", sources(x)[i], "[1, 1] - ", sources(x), ")^2) / 8)") + + rgrass::execGRASS("r.mapcalc", expression = ex, flags = c(.quiet(), "overwrite")) + + } else { + + rgrass::execGRASS( + cmd = "r.tri", + input = sources(x)[i], + output = srcs[i], + size = size, + exponent = exponent, + # processes = faster("cores"), # does not create raster + flags = c(.quiet(), "overwrite") + ) - rgrass::execGRASS("r.mapcalc", expression = ex, flags = c(.quiet(), "overwrite")) + } } # next layer .makeGRaster(srcs, names = paste0(names(x), "_TRI")) From 8faa78fccb9eb0dfef63b6fd5d283668fca503ab Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Wed, 21 May 2025 22:37:10 -0500 Subject: [PATCH 33/52] Create neighborhoodMatrix.r --- R/neighborhoodMatrix.r | 60 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 R/neighborhoodMatrix.r diff --git a/R/neighborhoodMatrix.r b/R/neighborhoodMatrix.r new file mode 100644 index 00000000..37146308 --- /dev/null +++ b/R/neighborhoodMatrix.r @@ -0,0 +1,60 @@ +#' Neighborhood matrix from a polygons GVector +#' +#' @description This function returns a neighborhood matrix from a polygons `GVector`, which represents which geometries touch one another. It is useful for implementing geostatistical analyses that require indicators about which area features are next to one another. +#' +#' Polygons must share more than one point for them to be considered a neighbors (i.e., same as `spdep::poly2nb(x, queen = FALSE)`). +#' +#' This function needs the **GRASS** addon `v.neighborhoodmatrix`. If it is not installed, it will try to install it. +#' +#' @param x A polygons `GVector. +#' +#' @returns A `list`. Each element represents a polygon. If an element is empty, it has no neighbors. Otherwise, it is a vector of integers, which represent the indices of the polygon(s) to which it is a neighbor. +#' +#' @example man/examples/ex_neighborhoodMatrix.r +#' +#' @aliases neighborhoodMatrix +#' @rdname neighborhoodMatrix +#' @exportMethod neighborhoodMatrix +methods::setMethod( + f = "neighborhoodMatrix", + signature = c(x = "GVector"), + definition = function(x) { + + if (geomtype(x) != "polygons") stop("The input must be a GVector representing polygons.") + + .addons('v.neighborhoodmatrix') + + neighs <- rgrass::execGRASS( + cmd = "v.neighborhoodmatrix", + input = sources(x), + separator = 'pipe', + flags = c(.quiet(), "b"), + intern = TRUE + ) + + out <- vector(mode = "list", length = ngeom(x)) + for (i in seq_along(out)) out[[i]] <- numeric() + + neighs <- strsplit(neighs, split = "\\|") + neighs <- lapply(neighs, as.integer) + + for (i in seq_along(neighs)) { + + first <- neighs[[i]][1L] + remainder <- neighs[[i]][2L:length(neighs[[i]])] + + remainder <- remainder[remainder != first] + + out[[first]] <- c(out[[first]], remainder) + + } + out + + + } # EOF +) + +#' @aliases neighbourhoodMatrix +#' @rdname dim +#' @exportMethod neighbourhoodMatrix +neighbourhoodMatrix <- function(x) neighborhoodMatrix(x) \ No newline at end of file From 2e396432a110288531daa8aaf7c73464be7c90e3 Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Wed, 21 May 2025 22:37:14 -0500 Subject: [PATCH 34/52] Create multivarEnvSim.r --- R/multivarEnvSim.r | 95 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 R/multivarEnvSim.r diff --git a/R/multivarEnvSim.r b/R/multivarEnvSim.r new file mode 100644 index 00000000..bf687304 --- /dev/null +++ b/R/multivarEnvSim.r @@ -0,0 +1,95 @@ +#' Multivariate environmental similarity surface (MESS) +#' +#' @description The multivariate environmental similarity surface (MESS) indicates the degree to which a set of "projection" environmental conditions fall inside or outside a set of "reference" conditions. Values of 1 indicate a location falls at the exact median of all variables. Values of 0 indicate that the location has at least one environmental covariate that is at the upper or lower end of the range of reference conditions, and values <1 indicate that at least one variable falls above or below the reference conditions. MESS can be used, for example, to indicate the degree to which a model constructed in one time period and/or location must extrapolate when projected to another time period and/or location. +#' +#' @param ref A `data.frame`, `data.table`, a points `GVector`, or "stack" of `GRasters`: This represents the set of "reference" environmental conditions: +#' * `data.frame` or `data.table`: There must be one column per layer in `proj`, and the columns must have the same names as the layers in `proj`. +#' * `GRaster` with one or more layers: Must have the same [names()] as the `GRaster`s in `proj`. Values are assumed to be continuous (not categorical/factors). +#' +#' @param proj A `GRaster` with one or more layers. Values are assumed to be continuous (not categorical/factors). +#' +#' @returns A `GRaster` "stack". There will be one layer per layer in `ref`, indicating the MESS score for that variable. There will also be an layer named "MESS" which represents the MESS value across all variables (the minimum value of each of the individual MESS rasters). A final layer represents the layer which is most different (has the lowest MESS value). +#' +#' @references Elith, J, Kearney, M, and Phillips, S. 2010. The art of modelling range-shifting species. *Methods in Ecology and Evolution* 1:330-342. \doi{10.1111/j.2041-210X.2010.00036.x} (see especially the Supplement) +#' +#' @example man/examples/ex_multivarEnvSim.r +#' +#' @aliases multivarEnvSim +#' @rdname multivarEnvSim +#' @exportMethod multivarEnvSim +methods::setMethod( + f = "multivarEnvSim", + signature = c(ref = "GRaster", proj = "GRaster"), + definition = function( + ref, + proj + ) { + + lyrs <- nlyr(ref) == nlyr(proj) + names1 <- names(ref) %in% names(proj) + names2 <- names(proj) %in% names(ref) + + if (!all(lyrs, names1, names2)) stop("The `ref` and `proj` set of GRasters must have the same number of layers with the same names.") + + ref <- ref[[names(proj)]] + + medians <- global(ref, "median") + mm <- minmax(ref) + + .locationRestore(proj) + .region(proj) + + ### MESS values for each variable + nLayers <- nlyr(proj) + srcs <- .makeSourceName("mess_r_mapcalc", "raster", nLayers) + for (i in seq_len(nLayers)) { + + layer <- names(proj)[i] + x <- ref[[i]] + y <- proj[[names(x)]] + ySrc <- sources(y) + + thisMedian <- medians[layer, "median"] + thisMin <- mm["min", layer] + thisMax <- mm["max", layer] + + medianToMax <- thisMax - thisMedian + medianToMin <- thisMedian - thisMin + + ex <- paste0(srcs[i], " = if(", ySrc," >= ", thisMedian, ", 1 - ((", ySrc, " - ", thisMedian, ") / ", medianToMax, "), 1 - ((", thisMedian, " - ", ySrc, ") / ", medianToMin, "))") + + rgrass::execGRASS("r.mapcalc", expression = ex, flags = c(.quiet(), "overwrite")) + + } + + ### MESS values across all variables + srcOverall <- .makeSourceName("mess_r_mapcalc", "raster") + ex <- paste0(srcOverall, " = min(", paste(srcs, collapse = ","),")") + rgrass::execGRASS("r.mapcalc", expression = ex, flags = c(.quiet(), "overwrite")) + + ### most different variable + srcMostDiffFrom0 <- .makeSourceName("mess_r_series", "raster") + rgrass::execGRASS( + cmd = "r.series", + input = paste(srcs, collapse=","), + output = srcMostDiffFrom0, + method = "min_raster", + nprocs = faster("cores"), + memory = faster("memory"), + flags = c(.quiet(), "overwrite") + ) + + srcMostDiffFrom1 <- .makeSourceName("mess_r_mapcalc", "raster") + ex <- paste0(srcMostDiffFrom1, " = int(", srcMostDiffFrom0, " + 1)") + rgrass::execGRASS("r.mapcalc", expression = ex, flags = c(.quiet(), "overwrite")) + + mostDiffLevels <- data.table::data.table(value = 1L:nLayers, layer = names(proj)) + levs <- vector(mode = "list", length = nLayers + 2) + levs[[length(levs)]] <- mostDiffLevels + + srcsAll <- c(srcs, srcOverall, srcMostDiffFrom1) + outNames <- c(names(proj), "MESS", "mostDifferent") + .makeGRaster(srcsAll, names = outNames) + + } # EOF +) From 1cd30df0789294ee73bef86491eff4f5c931faa9 Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Wed, 21 May 2025 22:37:17 -0500 Subject: [PATCH 35/52] Update fasterRaster.r --- R/fasterRaster.r | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/R/fasterRaster.r b/R/fasterRaster.r index 69629e93..2e264ee7 100644 --- a/R/fasterRaster.r +++ b/R/fasterRaster.r @@ -97,6 +97,7 @@ #' * [maskNA()]: Mask all non-NA cells or all NA cells #' * [match()], \code{\link[fasterRaster]{%in%}}, and \code{\link[fasterRaster]{%notin%}}: Find which cells of a `GRaster` match or do not match certain values #' * [merge()]: Combine two or more rasters with different extents and fill in `NA`s +#' * [multivarEnvSim()]: Multivariate environmental similarity surface (MESS) #' * \code{\link[fasterRaster]{names<-}}: Assign names to a `GRaster` #' * [noise()]: Remove coarse-scale trends from a `GRaster`, leaving just fine-scale "noise" #' * [pairs()]: Plot correlations between `GRaster` layers @@ -124,10 +125,10 @@ #' * [fractalRast()]: Create a fractal `GRaster` #' * [init()]: GRaster with values equal to row, column, coordinate, regular, or "chess" #' * [longlat()]: Create longitude/latitude rasters -#' * [rnormRast()]: A random `GRaster` with values drawn from a normal distribution -#' * [rRandWalk()]: Paths of random walker +#' * [rNormRast()]: A random `GRaster` with values drawn from a normal distribution +#' * [rRandWalkRast()]: Paths of random walkers #' * [rSpatialDepRast()]: Create a random `GRaster` with or without spatial dependence -#' * [runifRast()]: A random `GRaster` with values drawn from a uniform distribution +#' * [rUnifRast()]: A random `GRaster` with values drawn from a uniform distribution #' * [sineRast()]: Sine wave rasters #' #' ## Analysis of terrain and hydrology @@ -234,6 +235,7 @@ #' * [kernel()]: Kernel density estimator of points #' * [missing.cases()]: Find rows of a `GVector`'s data table that have at least `NA` in them #' * \code{\link[fasterRaster]{names<-}}: Assign names to columns of a `GVector`s data table +#' * [neighborhoodMatrix()] and [neighbourhoodMatrix()]: Neighborhood matrix of a polygons `GVector` #' * [project()]: Change coordinate reference system #' * [rasterize()]: Convert a `GVector` to a `GRaster` #' * [rbind()]: Combine `GVectors` From 3ff81b2e62cc7a1ee1cc97b06ad7c7def6d2d6a9 Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Wed, 21 May 2025 22:37:25 -0500 Subject: [PATCH 36/52] Update compareGeom.r --- R/compareGeom.r | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/compareGeom.r b/R/compareGeom.r index f47ea40b..7bdcd0cb 100644 --- a/R/compareGeom.r +++ b/R/compareGeom.r @@ -28,7 +28,7 @@ #' #' @param stopOnError Logical: If `TRUE` (default), throw an error with an explanation if the objects are not comparable. If `FALSE` (default), return `TRUE` or `FALSE`. #' -#' @param messages Logical: If `TRUE (default), display a warning if a condition is not met. This only comes into effect if `stopOnError` is `FALSE`. +#' @param messages Logical: If `TRUE` (default), display a warning if a condition is not met. This only comes into effect if `stopOnError` is `FALSE`. #' #' @returns Logical (invisibly): `TRUE` for no mismatches detected, `FALSE` for incompatibility), or side effect of throwing an error. #' From c7653930264f9328c8966ae3230370e80d7a4499 Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Wed, 21 May 2025 22:37:43 -0500 Subject: [PATCH 37/52] Remove test to see if GRASS started --- R/addons.r | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/R/addons.r b/R/addons.r index 8bb8058c..5dbb362c 100644 --- a/R/addons.r +++ b/R/addons.r @@ -19,18 +19,12 @@ #' @export addons <- function(x = NULL) { - if (!grassStarted()) { - warning("GRASS has not been started. Use fast() to create a GRaster or GVector to start GRASS.") - out <- NULL - } else { - - out <- rgrass::execGRASS("g.extension", flags = c("a"), intern = TRUE) - if (is.null(x)) { - out <- sort(out) - } else if (!is.null(x)) { - out <- x %in% out - names(out) <- x - } + out <- rgrass::execGRASS("g.extension", flags = "a", intern = TRUE) + if (is.null(x)) { + out <- sort(out) + } else if (!is.null(x)) { + out <- x %in% out + names(out) <- x } out @@ -42,7 +36,7 @@ addons <- function(x = NULL) { installAddon <- function(x, check = TRUE) { if (check) { - avails <- rgrass::execGRASS("g.extension", flags = c("l", .quiet())) + avails <- rgrass::execGRASS("g.extension", flags = c("l", .quiet()), intern = TRUE) if (!(x %in% avails)) { warning("The addon is not available on the official GRASS addon repository.") return(invisible(FALSE)) From 01a060f12fae43ba83be88fb7dac9cec233d51d8 Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Wed, 21 May 2025 22:37:58 -0500 Subject: [PATCH 38/52] Updates --- .vscode/settings.json | 1 + NAMESPACE | 9 ++- NEWS.md | 14 +++- R/01_generics.r | 10 ++- _pkgdown.yml | 9 ++- man/centroids.Rd | 2 +- man/compareGeom.Rd | 2 +- man/dim.Rd | 5 +- man/examples/ex_multivarEnvSim.r | 22 ++++++ man/examples/ex_neighborhoodMatrix.r | 13 ++++ man/examples/ex_rWalkRast.r | 29 -------- man/examples/ex_randRast.r | 23 +++++- man/examples/ex_ruggedness_wetness.r | 14 +++- man/fasterRaster.Rd | 8 +- man/fractalRast.Rd | 25 ++++++- man/multivarEnvSim.Rd | 51 +++++++++++++ man/neighborhoodMatrix.Rd | 37 ++++++++++ man/rRandWalk.Rd | 48 ------------ man/rRandWalkRast.Rd | 105 +++++++++++++++++++++++++++ man/rSpatialDepRast.Rd | 27 ++++++- man/rnormRast.Rd | 37 +++++++--- man/ruggedness.Rd | 24 ++++-- man/runifRast.Rd | 35 +++++++-- man/wetness.Rd | 14 +++- 24 files changed, 429 insertions(+), 135 deletions(-) create mode 100644 man/examples/ex_multivarEnvSim.r create mode 100644 man/examples/ex_neighborhoodMatrix.r delete mode 100644 man/examples/ex_rWalkRast.r create mode 100644 man/multivarEnvSim.Rd create mode 100644 man/neighborhoodMatrix.Rd delete mode 100644 man/rRandWalk.Rd create mode 100644 man/rRandWalkRast.Rd diff --git a/.vscode/settings.json b/.vscode/settings.json index b37744ca..4cf0f82a 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,6 +4,7 @@ "CRS", "Dypsis", "Epanechnikov", + "geostatistical", "mapset", "unprojected" ] diff --git a/NAMESPACE b/NAMESPACE index 3ca1abf2..986bb7a0 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -174,12 +174,15 @@ exportMethods(minmax) exportMethods(missing.cases) exportMethods(missingCats) exportMethods(mmode) +exportMethods(multivarEnvSim) exportMethods(nacell) exportMethods(names) exportMethods(ncell) exportMethods(ncell3d) exportMethods(ncol) exportMethods(ndepth) +exportMethods(neighborhoodMatrix) +exportMethods(neighbourhoodMatrix) exportMethods(ngeom) exportMethods(nlevels) exportMethods(nlyr) @@ -196,8 +199,10 @@ exportMethods(predict) exportMethods(princomp) exportMethods(project) exportMethods(quantile) -exportMethods(rRandWalk) +exportMethods(rNormRast) +exportMethods(rRandWalkRast) exportMethods(rSpatialDepRast) +exportMethods(rUnifRast) exportMethods(range) exportMethods(rast) exportMethods(rasterize) @@ -215,10 +220,8 @@ exportMethods(replaceNAs) exportMethods(res) exportMethods(res3d) exportMethods(resample) -exportMethods(rnormRast) exportMethods(round) exportMethods(ruggedness) -exportMethods(runifRast) exportMethods(rvoronoi) exportMethods(sampleRast) exportMethods(scale) diff --git a/NEWS.md b/NEWS.md index 18a6ea09..6a9d2f72 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,9 +1,19 @@ # fasterRaster 8.4.0.8 (2025-XX-XX) + +### Code-breaking changes +o `rnormRast()` is now `rNormRast()`. +o `runifRast()` is now `rUnifRast()`. + +### New functions and functionality o `addons()` now reports whether a given addon is installed or the names of all installed addons. o `installAddon()` installs an addon. o `removeAddon()` deletes an addon. -o `rRandWalk()` creates a raster with the path of random walkers. -o Minor fixes to help. +o `multivarEnvSim()` calculates multivariate environmental similarity (MESS). +o `neighborhoodMatrix()` calculates a neighborhood matrix from a polygons `GVector`. +o `rRandWalkRast()` creates a raster with the path of random walkers. +o `ruggedness()` now allows for calculation of the terrain ruggedness index across user-defined windows with distance-based weighting. + +### Minor fixes o Rebranding as per **GRASS** re-brand (haromonized logo with **GRASS** April 2025 branding guidelines, "GRASS GIS" --> just "GRASS", "modules" --> "tools). # fasterRaster 8.4.0.7 (2025-04-24) diff --git a/R/01_generics.r b/R/01_generics.r index 5704d204..acda8d26 100644 --- a/R/01_generics.r +++ b/R/01_generics.r @@ -199,6 +199,7 @@ methods::setGeneric(name = "merge", package = "terra") #' @importFrom terra median methods::setGeneric(name = "median", def = function(x, na.rm) standardGeneric("median")) methods::setGeneric(name = "mmode", def = function(x, ...) package = "omnibus") +methods::setGeneric(name = "multivarEnvSim", def = function(ref, proj, ...) standardGeneric("multivarEnvSim")) # "names" (in base) is primitive methods::setGeneric(name = "N", def = function(x, ...) standardGeneric("N")) @@ -206,6 +207,8 @@ methods::setGeneric(name = "ncell", package = "terra") methods::setGeneric(name = "ncell3d", def = function(x) standardGeneric("ncell3d")) methods::setGeneric(name = "ncol", def = function(x) standardGeneric("ncol")) # in base methods::setGeneric(name = "ndepth", def = function(x) standardGeneric("ndepth")) +methods::setGeneric(name = "neighborhoodMatrix", def = function(x, ...) standardGeneric("neighborhoodMatrix")) +methods::setGeneric(name = "neighbourhoodMatrix", def = function(x, ...) standardGeneric("neighbourhoodMatrix")) methods::setGeneric(name = "new", package = "methods") methods::setGeneric(name = "nlyr", package = "terra") methods::setGeneric(name = "nacell", def = function(x, ...) standardGeneric("nacell")) @@ -231,7 +234,6 @@ methods::setGeneric(name = "project", package = "terra") methods::setGeneric(name = "quantile", package = "terra") -methods::setGeneric(name = "rRandWalk", def = function(x, ...) standardGeneric("rRandWalk")) methods::setGeneric(name = "rast", package = "terra") methods::setGeneric(name = "rasterize", package = "terra") # methods::setGeneric(name = "rbind") @@ -239,7 +241,6 @@ methods::setGeneric(name = "rasterize", package = "terra") # from https://stackoverflow.com/questions/27886535/proper-way-to-use-cbind-rbind-with-s4-classes-in-package methods::getGeneric("rbind") methods::setGeneric(name = "rbind", signature = "...") - methods::setGeneric(name = "regress", package = "terra") methods::setGeneric(name = "remove0", def = function(x, ...) standardGeneric("remove0")) methods::setGeneric(name = "removeAngles", def = function(x, ...) standardGeneric("removeAngles")) @@ -252,9 +253,10 @@ methods::setGeneric(name = "replaceNAs", def = function(x, ...) standardGeneric( methods::setGeneric(name = "res", package = "terra") methods::setGeneric(name = "res3d", def = function(x) standardGeneric("res3d")) methods::setGeneric(name = "resample", package = "terra") -methods::setGeneric(name = "rnormRast", def = function(x, ...) standardGeneric("rnormRast")) +methods::setGeneric(name = "rNormRast", def = function(x, ...) standardGeneric("rNormRast")) +methods::setGeneric(name = "rRandWalkRast", def = function(x, ...) standardGeneric("rRandWalkRast")) methods::setGeneric(name = "ruggedness", def = function(x, ...) standardGeneric("ruggedness")) -methods::setGeneric(name = "runifRast", def = function(x, ...) standardGeneric("runifRast")) +methods::setGeneric(name = "rUnifRast", def = function(x, ...) standardGeneric("rUnifRast")) methods::setGeneric(name = "rvoronoi", def = function(x, ...) standardGeneric("rvoronoi")) methods::setGeneric(name = "S", def = function(x, ...) standardGeneric("S")) diff --git a/_pkgdown.yml b/_pkgdown.yml index b7df593c..ae2c8566 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -175,6 +175,7 @@ reference: - maskNA - match - merge + - multivarEnvSim - names<- - noise - pairs @@ -206,10 +207,10 @@ reference: - fractalRast - init - longlat - - rnormRast - - rRandWalk + - rNormRast + - rRandWalkRast - rSpatialDepRast - - runifRast + - rUnifRast - sineRast - title: Terrain and hydrology - contents: @@ -330,6 +331,8 @@ reference: - kernel - missing.cases - names<- + - neighborhoodMatrix + - neighbourhoodMatrix - project - rasterize - rbind diff --git a/man/centroids.Rd b/man/centroids.Rd index 3cfa0edd..2b6377f2 100644 --- a/man/centroids.Rd +++ b/man/centroids.Rd @@ -42,7 +42,7 @@ A points \code{GVector}. \description{ This function locates the centroid of each geometry of a \code{GVector}. -\strong{Note}: To use this function, you must have installed the \code{v.centerpoint} addon using \code{installAddons("v.centerpoint")}. If you are not sure if this is already installed, the function will try to do this. You can also do it manually using \code{addons("v.centerpoint")}. +This function needs the \strong{GRASS} addon \code{v.centerpoint}. If it is not installed, it will try to install it. } \examples{ if (grassStarted()) { diff --git a/man/compareGeom.Rd b/man/compareGeom.Rd index 9625185d..40b7a5ca 100644 --- a/man/compareGeom.Rd +++ b/man/compareGeom.Rd @@ -95,7 +95,7 @@ \item{stopOnError}{Logical: If \code{TRUE} (default), throw an error with an explanation if the objects are not comparable. If \code{FALSE} (default), return \code{TRUE} or \code{FALSE}.} -\item{messages}{Logical: If \verb{TRUE (default), display a warning if a condition is not met. This only comes into effect if }stopOnError\code{is}FALSE`.} +\item{messages}{Logical: If \code{TRUE} (default), display a warning if a condition is not met. This only comes into effect if \code{stopOnError} is \code{FALSE}.} \item{geometry}{Logical (vector-vector comparison only): Compare geometry. Default is \code{FALSE}.} } diff --git a/man/dim.Rd b/man/dim.Rd index bb1163a5..c679e719 100644 --- a/man/dim.Rd +++ b/man/dim.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/dim.r +% Please edit documentation in R/dim.r, R/neighborhoodMatrix.r \name{dim,GRegion-method} \alias{dim,GRegion-method} \alias{dim} @@ -27,6 +27,7 @@ \alias{nlyr,missing-method} \alias{nlyr} \alias{nlyr,GRaster-method} +\alias{neighbourhoodMatrix} \title{Number of rows, columns, depths, cells, and layers} \usage{ \S4method{dim}{GRegion}(x) @@ -64,6 +65,8 @@ \S4method{nlyr}{missing}(x) \S4method{nlyr}{GRaster}(x) + +neighbourhoodMatrix(x) } \arguments{ \item{x}{A \code{GRegion}, \code{GRaster}, \code{GVector}, or missing. If missing, then the dimensions of the currently active "region" are returned (see \code{vignette("regions", package = "fasterRaster")}).} diff --git a/man/examples/ex_multivarEnvSim.r b/man/examples/ex_multivarEnvSim.r new file mode 100644 index 00000000..daeaec52 --- /dev/null +++ b/man/examples/ex_multivarEnvSim.r @@ -0,0 +1,22 @@ +if (grassStarted()) { + +# Setup +library(terra) + +# Climatic conditions with 4 variables +madChelsa <- fastData("madChelsa") +chelsa <- fast(madChelsa) + +# Simulate new conditions by multiplying values by (1 + small number) +proj <- 1.05 * chelsa +names(proj) <- names(chelsa) # proj must have same names as ref + +messes <- multivarEnvSim(ref = chelsa, proj = proj) +plot(messes) + +# Where is at least one variable outside the reference range? +extrap <- messes[["MESS"]] < 0 +names(extrap) <- "outside" +plot(extrap) + +} diff --git a/man/examples/ex_neighborhoodMatrix.r b/man/examples/ex_neighborhoodMatrix.r new file mode 100644 index 00000000..5c760cc2 --- /dev/null +++ b/man/examples/ex_neighborhoodMatrix.r @@ -0,0 +1,13 @@ +if (grassStarted()) { + +# Setup +library(sf) + +# Polygons vector: +madCoast4 <- fastData(madCoast4) +mc4 <- fast(madCoast4) + +neighs <- neighborhoodMatrix(mc4) +neighs + +} diff --git a/man/examples/ex_rWalkRast.r b/man/examples/ex_rWalkRast.r deleted file mode 100644 index c2d92273..00000000 --- a/man/examples/ex_rWalkRast.r +++ /dev/null @@ -1,29 +0,0 @@ -if (grassStarted()) { - -# Setup -library(terra) - -# Elevation raster -madElev <- fastData("madElev") - -# Convert a SpatRaster to a GRaster: -elev <- fast(madElev) - -# Random walker: -walk <- rRandWalk(elev) -plot(walk) - -# Random walker with self-avoidance: -walkAvoid <- rRandWalk(elev, steps = 1000, avoid = TRUE, seed = 1) -plot(walkAvoid) - -# 10 random walkers: -walk10 <- rRandWalk(elev, n = 10) -plot(walk10) - -# 10 random walkers starting in same place: -walkSame10 <- rRandWalk(elev, n = 10, sameStart = TRUE) -plot(walkSame10) - - -} diff --git a/man/examples/ex_randRast.r b/man/examples/ex_randRast.r index 3df33205..a6c845da 100644 --- a/man/examples/ex_randRast.r +++ b/man/examples/ex_randRast.r @@ -11,11 +11,11 @@ madElev <- fastData("madElev") elev <- fast(madElev) ### Create a raster with values drawn from a uniform distribution: -unif <- runifRast(elev) +unif <- rUnifRast(elev) plot(unif) ### Create a raster with values drawn from a normal distribution: -norms <- rnormRast(elev, n = 2, mu = c(5, 10), sigma = c(2, 1)) +norms <- rNormRast(elev, n = 2, mu = c(5, 10), sigma = c(2, 1)) plot(norms) hist(norms, bins = 100) @@ -34,4 +34,23 @@ fractal <- fractalRast(elev, n = 2, dimension = c(2.1, 2.8)) plot(fractal) hist(fractal) +### Random walker rasters + +# One random walker +walk <- rRandWalkRast(elev) +plot(walk) + +# Random walker with self-avoidance: +walkAvoid <- rRandWalkRast(elev, steps = 1000, avoid = TRUE, seed = 1) +plot(walkAvoid) + +# 10 random walkers: +walk10 <- rRandWalkRast(elev, n = 10) +plot(walk10) + +# 10 random walkers starting in same place: +walkSame10 <- rRandWalkRast(elev, n = 10, sameStart = TRUE) +plot(walkSame10) + + } diff --git a/man/examples/ex_ruggedness_wetness.r b/man/examples/ex_ruggedness_wetness.r index ca6ccba9..d6b6a3df 100644 --- a/man/examples/ex_ruggedness_wetness.r +++ b/man/examples/ex_ruggedness_wetness.r @@ -9,12 +9,18 @@ madElev <- fastData("madElev") # Convert to GRaster: elev <- fast(madElev) -# Terrain ruggedness index: -tri <- ruggedness(elev) -plot(c(elev, tri)) - # Topographic wetness index: twi <- wetness(elev) +names(twi) <- 'TWI' plot(c(elev, twi)) +# Terrain ruggedness index: +tri <- ruggedness(elev) +tri7 <- ruggedness(elev, size = 7) +triSmooth7 <- ruggedness(elev, size = 7, exponent = 4) + +tris <- c(elev, tri, tri7, triSmooth7) +names(tris) <- c("elevation", "TRI in 3x3", "TRI in 7x7", "Smoothed TRIin 7x7") +plot(tris) + } diff --git a/man/fasterRaster.Rd b/man/fasterRaster.Rd index 8c258092..bbaf7fef 100644 --- a/man/fasterRaster.Rd +++ b/man/fasterRaster.Rd @@ -117,6 +117,7 @@ Operations on \code{GRaster}s \item \code{\link[=maskNA]{maskNA()}}: Mask all non-NA cells or all NA cells \item \code{\link[=match]{match()}}, \code{\link[fasterRaster]{\%in\%}}, and \code{\link[fasterRaster]{\%notin\%}}: Find which cells of a \code{GRaster} match or do not match certain values \item \code{\link[=merge]{merge()}}: Combine two or more rasters with different extents and fill in \code{NA}s +\item \code{\link[=multivarEnvSim]{multivarEnvSim()}}: Multivariate environmental similarity surface (MESS) \item \code{\link[fasterRaster]{names<-}}: Assign names to a \code{GRaster} \item \code{\link[=noise]{noise()}}: Remove coarse-scale trends from a \code{GRaster}, leaving just fine-scale "noise" \item \code{\link[=pairs]{pairs()}}: Plot correlations between \code{GRaster} layers @@ -147,10 +148,10 @@ Operations on \code{GRaster}s \item \code{\link[=fractalRast]{fractalRast()}}: Create a fractal \code{GRaster} \item \code{\link[=init]{init()}}: GRaster with values equal to row, column, coordinate, regular, or "chess" \item \code{\link[=longlat]{longlat()}}: Create longitude/latitude rasters -\item \code{\link[=rnormRast]{rnormRast()}}: A random \code{GRaster} with values drawn from a normal distribution -\item \code{\link[=rRandWalk]{rRandWalk()}}: Paths of random walker +\item \code{\link[=rNormRast]{rNormRast()}}: A random \code{GRaster} with values drawn from a normal distribution +\item \code{\link[=rRandWalkRast]{rRandWalkRast()}}: Paths of random walkers \item \code{\link[=rSpatialDepRast]{rSpatialDepRast()}}: Create a random \code{GRaster} with or without spatial dependence -\item \code{\link[=runifRast]{runifRast()}}: A random \code{GRaster} with values drawn from a uniform distribution +\item \code{\link[=rUnifRast]{rUnifRast()}}: A random \code{GRaster} with values drawn from a uniform distribution \item \code{\link[=sineRast]{sineRast()}}: Sine wave rasters } } @@ -278,6 +279,7 @@ Operations on \code{GRaster}s \item \code{\link[=kernel]{kernel()}}: Kernel density estimator of points \item \code{\link[=missing.cases]{missing.cases()}}: Find rows of a \code{GVector}'s data table that have at least \code{NA} in them \item \code{\link[fasterRaster]{names<-}}: Assign names to columns of a \code{GVector}s data table +\item \code{\link[=neighborhoodMatrix]{neighborhoodMatrix()}} and \code{\link[=neighbourhoodMatrix]{neighbourhoodMatrix()}}: Neighborhood matrix of a polygons \code{GVector} \item \code{\link[=project]{project()}}: Change coordinate reference system \item \code{\link[=rasterize]{rasterize()}}: Convert a \code{GVector} to a \code{GRaster} \item \code{\link[=rbind]{rbind()}}: Combine \code{GVectors} diff --git a/man/fractalRast.Rd b/man/fractalRast.Rd index 7adb9b1e..f8c241d8 100644 --- a/man/fractalRast.Rd +++ b/man/fractalRast.Rd @@ -36,11 +36,11 @@ madElev <- fastData("madElev") elev <- fast(madElev) ### Create a raster with values drawn from a uniform distribution: -unif <- runifRast(elev) +unif <- rUnifRast(elev) plot(unif) ### Create a raster with values drawn from a normal distribution: -norms <- rnormRast(elev, n = 2, mu = c(5, 10), sigma = c(2, 1)) +norms <- rNormRast(elev, n = 2, mu = c(5, 10), sigma = c(2, 1)) plot(norms) hist(norms, bins = 100) @@ -59,8 +59,27 @@ fractal <- fractalRast(elev, n = 2, dimension = c(2.1, 2.8)) plot(fractal) hist(fractal) +### Random walker rasters + +# One random walker +walk <- rRandWalkRast(elev) +plot(walk) + +# Random walker with self-avoidance: +walkAvoid <- rRandWalkRast(elev, steps = 1000, avoid = TRUE, seed = 1) +plot(walkAvoid) + +# 10 random walkers: +walk10 <- rRandWalkRast(elev, n = 10) +plot(walk10) + +# 10 random walkers starting in same place: +walkSame10 <- rRandWalkRast(elev, n = 10, sameStart = TRUE) +plot(walkSame10) + + } } \seealso{ -\code{\link[=rSpatialDepRast]{rSpatialDepRast()}}, \code{\link[=rnormRast]{rnormRast()}}, \code{\link[=runifRast]{runifRast()}}, \strong{GRASS} manual page for tool \code{r.surf.fractal} (see \code{grassHelp("r.surf.fractal")}) +\code{\link[=rSpatialDepRast]{rSpatialDepRast()}}, \code{\link[=rNormRast]{rNormRast()}}, \code{\link[=rUnifRast]{rUnifRast()}}, \code{\link[=rRandWalkRast]{rRandWalkRast()}}, \strong{GRASS} manual page for tool \code{r.surf.fractal} (see \code{grassHelp("r.surf.fractal")}) } diff --git a/man/multivarEnvSim.Rd b/man/multivarEnvSim.Rd new file mode 100644 index 00000000..5c6ed39b --- /dev/null +++ b/man/multivarEnvSim.Rd @@ -0,0 +1,51 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/multivarEnvSim.r +\name{multivarEnvSim,GRaster,GRaster-method} +\alias{multivarEnvSim,GRaster,GRaster-method} +\alias{multivarEnvSim} +\title{Multivariate environmental similarity surface (MESS)} +\usage{ +\S4method{multivarEnvSim}{GRaster,GRaster}(ref, proj) +} +\arguments{ +\item{ref}{A \code{data.frame}, \code{data.table}, a points \code{GVector}, or "stack" of \code{GRasters}: This represents the set of "reference" environmental conditions: +\itemize{ +\item \code{data.frame} or \code{data.table}: There must be one column per layer in \code{proj}, and the columns must have the same names as the layers in \code{proj}. +\item \code{GRaster} with one or more layers: Must have the same \code{\link[=names]{names()}} as the \code{GRaster}s in \code{proj}. Values are assumed to be continuous (not categorical/factors). +}} + +\item{proj}{A \code{GRaster} with one or more layers. Values are assumed to be continuous (not categorical/factors).} +} +\value{ +A \code{GRaster} "stack". There will be one layer per layer in \code{ref}, indicating the MESS score for that variable. There will also be an layer named "MESS" which represents the MESS value across all variables (the minimum value of each of the individual MESS rasters). A final layer represents the layer which is most different (has the lowest MESS value). +} +\description{ +The multivariate environmental similarity surface (MESS) indicates the degree to which a set of "projection" environmental conditions fall inside or outside a set of "reference" conditions. Values of 1 indicate a location falls at the exact median of all variables. Values of 0 indicate that the location has at least one environmental covariate that is at the upper or lower end of the range of reference conditions, and values <1 indicate that at least one variable falls above or below the reference conditions. MESS can be used, for example, to indicate the degree to which a model constructed in one time period and/or location must extrapolate when projected to another time period and/or location. +} +\examples{ +if (grassStarted()) { + +# Setup +library(terra) + +# Climatic conditions with 4 variables +madChelsa <- fastData("madChelsa") +chelsa <- fast(madChelsa) + +# Simulate new conditions by multiplying values by (1 + small number) +proj <- 1.05 * chelsa +names(proj) <- names(chelsa) # proj must have same names as ref + +messes <- multivarEnvSim(ref = chelsa, proj = proj) +plot(messes) + +# Where is at least one variable outside the reference range? +extrap <- messes[["MESS"]] < 0 +names(extrap) <- "outside" +plot(extrap) + +} +} +\references{ +Elith, J, Kearney, M, and Phillips, S. 2010. The art of modelling range-shifting species. \emph{Methods in Ecology and Evolution} 1:330-342. \doi{10.1111/j.2041-210X.2010.00036.x} (see especially the Supplement) +} diff --git a/man/neighborhoodMatrix.Rd b/man/neighborhoodMatrix.Rd new file mode 100644 index 00000000..f6c05eb5 --- /dev/null +++ b/man/neighborhoodMatrix.Rd @@ -0,0 +1,37 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/neighborhoodMatrix.r +\name{neighborhoodMatrix,GVector-method} +\alias{neighborhoodMatrix,GVector-method} +\alias{neighborhoodMatrix} +\title{Neighborhood matrix from a polygons GVector} +\usage{ +\S4method{neighborhoodMatrix}{GVector}(x) +} +\arguments{ +\item{x}{A polygons `GVector.} +} +\value{ +A \code{list}. Each element represents a polygon. If an element is empty, it has no neighbors. Otherwise, it is a vector of integers, which represent the indices of the polygon(s) to which it is a neighbor. +} +\description{ +This function returns a neighborhood matrix from a polygons \code{GVector}, which represents which geometries touch one another. It is useful for implementing geostatistical analyses that require indicators about which area features are next to one another. + +Polygons must share more than one point for them to be considered a neighbors (i.e., same as \code{spdep::poly2nb(x, queen = FALSE)}). + +This function needs the \strong{GRASS} addon \code{v.neighborhoodmatrix}. If it is not installed, it will try to install it. +} +\examples{ +if (grassStarted()) { + +# Setup +library(sf) + +# Polygons vector: +madCoast4 <- fastData(madCoast4) +mc4 <- fast(madCoast4) + +neighs <- neighborhoodMatrix(mc4) +neighs + +} +} diff --git a/man/rRandWalk.Rd b/man/rRandWalk.Rd deleted file mode 100644 index d65580e0..00000000 --- a/man/rRandWalk.Rd +++ /dev/null @@ -1,48 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/rRandWalk.r -\name{rRandWalk,GRaster-method} -\alias{rRandWalk,GRaster-method} -\alias{rRandWalk} -\title{Create raster representing one or more random walks} -\usage{ -\S4method{rRandWalk}{GRaster}( - x, - n = 1, - steps = 1e+05, - directions = 8, - avoid = FALSE, - sameStart = FALSE, - seed = NULL, - check = TRUE -) -} -\arguments{ -\item{x}{A \code{GRaster} to serve as a template.} - -\item{n}{Numeric: Number of walkers. Default is 1.} - -\item{steps}{Numeric: Number of steps taken by each walker. Default is 100000.} - -\item{directions}{Either 4 or 8: Directions in which a walker can turn at any point. If 4, then walks are confined to north/south/east/west directions (Rook's case). If 8, then the cardinal and subcardinal directions are allowed (Queen's case).} - -\item{avoid}{Logical: If \code{FALSE} (default), then walkers can traverse their own walks. If \code{TRUE}, walkers avoid their own trails. A self-avoiding random walk can take much longer to compute.} - -\item{sameStart}{Logical: If \code{FALSE} (default), walkers can begin anywhere. If \code{TRUE}, then walkers start from the same place.} - -\item{seed}{Integer or \code{NULL} (default): If \code{NULL}, then a random seed is generated by the function. If numeric, results will be deterministic. In either case, the value will be rounded to the nearest integer.} - -\item{check}{Logical: If \code{TRUE} (default), function will check to see if the addon \code{r.random.walk} has been installed. If it has not, it will attempt to install it.} -} -\value{ -A \code{GRaster} with cell values representing the number of times one or more walkers traversed the cell. -} -\description{ -This function creates a raster where the cell values represent the number of times one or more random "walkers" traverse the cell. -} -\details{ -\strong{Note}: To use this function, you must have installed the \code{r.random.walk} addon using \code{installAddons("r.random.walk")}. If you are not sure if this is already installed, the function will try to do this. You can also do it manually using \code{addons("r.random.walk")}. -} -\examples{ -man/examples/ex_rRandWalk/r - -} diff --git a/man/rRandWalkRast.Rd b/man/rRandWalkRast.Rd new file mode 100644 index 00000000..373aa9b8 --- /dev/null +++ b/man/rRandWalkRast.Rd @@ -0,0 +1,105 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/rRandWalk.r +\name{rRandWalkRast,GRaster-method} +\alias{rRandWalkRast,GRaster-method} +\alias{rRandWalkRast} +\title{Create raster representing one or more random walks} +\usage{ +\S4method{rRandWalkRast}{GRaster}( + x, + n = 1, + steps = 1e+05, + directions = 8, + avoid = FALSE, + sameStart = FALSE, + seed = NULL, + check = TRUE +) +} +\arguments{ +\item{x}{A \code{GRaster} to serve as a template.} + +\item{n}{Numeric: Number of walkers. Default is 1.} + +\item{steps}{Numeric: Number of steps taken by each walker. Default is 100000.} + +\item{directions}{Either 4 or 8: Directions in which a walker can turn at any point. If 4, then walks are confined to north/south/east/west directions (Rook's case). If 8, then the cardinal and subcardinal directions are allowed (Queen's case).} + +\item{avoid}{Logical: If \code{FALSE} (default), then walkers can traverse their own walks. If \code{TRUE}, walkers avoid their own trails. A self-avoiding random walk can take much longer to compute.} + +\item{sameStart}{Logical: If \code{FALSE} (default), walkers can begin anywhere. If \code{TRUE}, then walkers start from the same place.} + +\item{seed}{Integer or \code{NULL} (default): If \code{NULL}, then a random seed is generated by the function. If numeric, results will be deterministic. In either case, the value will be rounded to the nearest integer.} + +\item{check}{Logical: If \code{TRUE} (default), function will check to see if the addon \code{r.random.walk} has been installed. If it has not, it will attempt to install it.} +} +\value{ +A \code{GRaster} with cell values representing the number of times one or more walkers traversed the cell. +} +\description{ +This function creates a raster where the cell values represent the number of times one or more random "walkers" traverse the cell. If you simulate multiple random walkers, you can do computation in parallel, which can be controlled by allowing \strong{fasterRaster} to use multiple cores and more memory using the "cores" and "memory" arguments in the \code{\link[=faster]{faster()}} function. +} +\details{ +This function needs the \strong{GRASS} addon \code{r.random.walk}. If it is not installed, it will try to install it.#' +} +\examples{ +if (grassStarted()) { + +# Setup +library(sf) +library(terra) + +# Elevation raster +madElev <- fastData("madElev") + +# Convert a SpatRaster to a GRaster: +elev <- fast(madElev) + +### Create a raster with values drawn from a uniform distribution: +unif <- rUnifRast(elev) +plot(unif) + +### Create a raster with values drawn from a normal distribution: +norms <- rNormRast(elev, n = 2, mu = c(5, 10), sigma = c(2, 1)) +plot(norms) +hist(norms, bins = 100) + +# Create a raster with random, seemingly normally-distributed values: +rand <- rSpatialDepRast(elev, dist = 1000) +plot(rand) + +# Values appear normal on first inspection: +hist(rand) + +# ... but actually are patterned: +hist(rand, bins = 100) + +# Create a fractal raster: +fractal <- fractalRast(elev, n = 2, dimension = c(2.1, 2.8)) +plot(fractal) +hist(fractal) + +### Random walker rasters + +# One random walker +walk <- rRandWalkRast(elev) +plot(walk) + +# Random walker with self-avoidance: +walkAvoid <- rRandWalkRast(elev, steps = 1000, avoid = TRUE, seed = 1) +plot(walkAvoid) + +# 10 random walkers: +walk10 <- rRandWalkRast(elev, n = 10) +plot(walk10) + +# 10 random walkers starting in same place: +walkSame10 <- rRandWalkRast(elev, n = 10, sameStart = TRUE) +plot(walkSame10) + + +} +} +\seealso{ +\code{\link[=rNormRast]{rNormRast()}}, \code{\link[=rUnifRast]{rUnifRast()}}, \code{\link[=rSpatialDepRast]{rSpatialDepRast()}}, \code{\link[=fractalRast]{fractalRast()}} +} diff --git a/man/rSpatialDepRast.Rd b/man/rSpatialDepRast.Rd index 9fb3d86e..e24279a8 100644 --- a/man/rSpatialDepRast.Rd +++ b/man/rSpatialDepRast.Rd @@ -35,7 +35,7 @@ A \code{GRaster}. } \description{ -\code{rSpatialDepRast()} creates a raster with random values in cells. Across the raster, values are approximately normally distributed, though a raster with a "true" normal distribution can be made with \code{\link[=rnormRast]{rnormRast()}}. Spatial dependence can be introduced, though all together the values will still be approximately normally distributed. +\code{rSpatialDepRast()} creates a raster with random values in cells. Across the raster, values are approximately normally distributed, though a raster with a "true" normal distribution can be made with \code{\link[=rNormRast]{rNormRast()}}. Spatial dependence can be introduced, though all together the values will still be approximately normally distributed. } \examples{ if (grassStarted()) { @@ -51,11 +51,11 @@ madElev <- fastData("madElev") elev <- fast(madElev) ### Create a raster with values drawn from a uniform distribution: -unif <- runifRast(elev) +unif <- rUnifRast(elev) plot(unif) ### Create a raster with values drawn from a normal distribution: -norms <- rnormRast(elev, n = 2, mu = c(5, 10), sigma = c(2, 1)) +norms <- rNormRast(elev, n = 2, mu = c(5, 10), sigma = c(2, 1)) plot(norms) hist(norms, bins = 100) @@ -74,8 +74,27 @@ fractal <- fractalRast(elev, n = 2, dimension = c(2.1, 2.8)) plot(fractal) hist(fractal) +### Random walker rasters + +# One random walker +walk <- rRandWalkRast(elev) +plot(walk) + +# Random walker with self-avoidance: +walkAvoid <- rRandWalkRast(elev, steps = 1000, avoid = TRUE, seed = 1) +plot(walkAvoid) + +# 10 random walkers: +walk10 <- rRandWalkRast(elev, n = 10) +plot(walk10) + +# 10 random walkers starting in same place: +walkSame10 <- rRandWalkRast(elev, n = 10, sameStart = TRUE) +plot(walkSame10) + + } } \seealso{ -\code{\link[=rnormRast]{rnormRast()}}, \code{\link[=fractalRast]{fractalRast()}}, \code{\link[=runifRast]{runifRast()}}, \strong{GRASS} manual page for tool \code{r.random.surface} (see \code{grassHelp("r.random.surface")}) +\code{\link[=rNormRast]{rNormRast()}}, \code{\link[=fractalRast]{fractalRast()}}, \code{\link[=rUnifRast]{rUnifRast()}}, \code{\link[=rRandWalkRast]{rRandWalkRast()}}, \strong{GRASS} manual page for tool \code{r.random.surface} (see \code{grassHelp("r.random.surface")}) } diff --git a/man/rnormRast.Rd b/man/rnormRast.Rd index 8d6ff036..ccb41d58 100644 --- a/man/rnormRast.Rd +++ b/man/rnormRast.Rd @@ -1,11 +1,11 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/rnormRast.r -\name{rnormRast,GRaster-method} -\alias{rnormRast,GRaster-method} -\alias{rnormRast} +% Please edit documentation in R/rNormRast.r +\name{rNormRast,GRaster-method} +\alias{rNormRast,GRaster-method} +\alias{rNormRast} \title{Create a raster with random values drawn from a normal distribution} \usage{ -\S4method{rnormRast}{GRaster}(x, n = 1, mu = 0, sigma = 1, seed = NULL) +\S4method{rNormRast}{GRaster}(x, n = 1, mu = 0, sigma = 1, seed = NULL) } \arguments{ \item{x}{A \code{GRaster}: The output will have the same extent and dimensions as this raster.} @@ -20,7 +20,7 @@ A \code{GRaster}. } \description{ -\code{rnormRast()} creates a raster with values drawn from a normal distribution. +\code{rNormRast()} creates a raster with values drawn from a normal distribution. } \examples{ if (grassStarted()) { @@ -36,11 +36,11 @@ madElev <- fastData("madElev") elev <- fast(madElev) ### Create a raster with values drawn from a uniform distribution: -unif <- runifRast(elev) +unif <- rUnifRast(elev) plot(unif) ### Create a raster with values drawn from a normal distribution: -norms <- rnormRast(elev, n = 2, mu = c(5, 10), sigma = c(2, 1)) +norms <- rNormRast(elev, n = 2, mu = c(5, 10), sigma = c(2, 1)) plot(norms) hist(norms, bins = 100) @@ -59,8 +59,27 @@ fractal <- fractalRast(elev, n = 2, dimension = c(2.1, 2.8)) plot(fractal) hist(fractal) +### Random walker rasters + +# One random walker +walk <- rRandWalkRast(elev) +plot(walk) + +# Random walker with self-avoidance: +walkAvoid <- rRandWalkRast(elev, steps = 1000, avoid = TRUE, seed = 1) +plot(walkAvoid) + +# 10 random walkers: +walk10 <- rRandWalkRast(elev, n = 10) +plot(walk10) + +# 10 random walkers starting in same place: +walkSame10 <- rRandWalkRast(elev, n = 10, sameStart = TRUE) +plot(walkSame10) + + } } \seealso{ -\code{\link[=rSpatialDepRast]{rSpatialDepRast()}}, \code{\link[=fractalRast]{fractalRast()}}, \code{\link[=runifRast]{runifRast()}}, \strong{GRASS} manual page for tool \code{r.random.surface} (see \code{grassHelp("r.random.surface")}) +\code{\link[=rSpatialDepRast]{rSpatialDepRast()}}, \code{\link[=fractalRast]{fractalRast()}}, \code{\link[=rUnifRast]{rUnifRast()}}, \code{\link[=rRandWalkRast]{rRandWalkRast()}}, \strong{GRASS} manual page for tool \code{r.random.surface} (see \code{grassHelp("r.random.surface")}) } diff --git a/man/ruggedness.Rd b/man/ruggedness.Rd index 51e3ceac..6969e063 100644 --- a/man/ruggedness.Rd +++ b/man/ruggedness.Rd @@ -5,16 +5,22 @@ \alias{ruggedness} \title{Terrain ruggedness index} \usage{ -\S4method{ruggedness}{GRaster}(x) +\S4method{ruggedness}{GRaster}(x, size = 3, exponent = 0) } \arguments{ \item{x}{A \code{GRaster}.} + +\item{size}{Integer (default is 3): Size of the moving window. Must be an odd integer >= 3.} + +\item{exponent}{Numeric >= 0 and <= 4. Used to reduce the influence of cells farther from the focal cell (larger areas can yield noisier results if the exponent small). All cells are weighted equally when \code{exponent = 0}.} } \value{ A \code{GRaster}. } \description{ -For a given focal grid cell, the terrain ruggedness index (TRI) is calculated by taking the square root of the average of the squared difference between the focal cell's elevation and the elevations of the 8 surrounding cells, or \deqn{\sqrt(\sum_{i = 1}^{8}(m_i - m_0)^2 / 8)} where \eqn{m_0} is the elevation of the focal cell and \eqn{m_i} is the elevation of the \emph{i}th grid cell. +For a given focal grid cell, the terrain ruggedness index (TRI) is calculated by taking the square root of the average of the squared difference between the focal cell's elevation and the elevations of the 8 surrounding cells, or \deqn{\sqrt(\sum_{i = 1}^{8}(m_i - m_0)^2 / 8)} where \eqn{m_0} is the elevation of the focal cell and \eqn{m_i} is the elevation of the \emph{i}th grid cell. Areas that are entirely flat will have a value of \code{NA} assigned to them. + +By default, TRI is calculated for a 3x3 moving window around each focal cell. However, you can use a larger-sized window. In this case, the window size must be an odd number >= 3, and you must have the \code{r.tri} \strong{GRASS} addon installed. If it is not installed, the function will try to install it. } \examples{ if (grassStarted()) { @@ -28,14 +34,20 @@ madElev <- fastData("madElev") # Convert to GRaster: elev <- fast(madElev) -# Terrain ruggedness index: -tri <- ruggedness(elev) -plot(c(elev, tri)) - # Topographic wetness index: twi <- wetness(elev) +names(twi) <- 'TWI' plot(c(elev, twi)) +# Terrain ruggedness index: +tri <- ruggedness(elev) +tri7 <- ruggedness(elev, size = 7) +triSmooth7 <- ruggedness(elev, size = 7, exponent = 4) + +tris <- c(elev, tri, tri7, triSmooth7) +names(tris) <- c("elevation", "TRI in 3x3", "TRI in 7x7", "Smoothed TRIin 7x7") +plot(tris) + } } \references{ diff --git a/man/runifRast.Rd b/man/runifRast.Rd index d99fc85e..09790d81 100644 --- a/man/runifRast.Rd +++ b/man/runifRast.Rd @@ -1,11 +1,11 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/runifRast.r -\name{runifRast,GRaster-method} -\alias{runifRast,GRaster-method} -\alias{runifRast} +\name{rUnifRast,GRaster-method} +\alias{rUnifRast,GRaster-method} +\alias{rUnifRast} \title{Create a raster with random values drawn from a uniform distribution} \usage{ -\S4method{runifRast}{GRaster}(x, n = 1, low = 0, high = 1, seed = NULL) +\S4method{rUnifRast}{GRaster}(x, n = 1, low = 0, high = 1, seed = NULL) } \arguments{ \item{x}{A \code{GRaster}. The output will have the same extent and dimensions as this raster.} @@ -20,7 +20,7 @@ A \code{GRaster}. } \description{ -\code{runifRast()} creates a raster with values drawn from a uniform (flat) distribution. +\code{rUnifRast()} creates a raster with values drawn from a uniform (flat) distribution. } \examples{ if (grassStarted()) { @@ -36,11 +36,11 @@ madElev <- fastData("madElev") elev <- fast(madElev) ### Create a raster with values drawn from a uniform distribution: -unif <- runifRast(elev) +unif <- rUnifRast(elev) plot(unif) ### Create a raster with values drawn from a normal distribution: -norms <- rnormRast(elev, n = 2, mu = c(5, 10), sigma = c(2, 1)) +norms <- rNormRast(elev, n = 2, mu = c(5, 10), sigma = c(2, 1)) plot(norms) hist(norms, bins = 100) @@ -59,8 +59,27 @@ fractal <- fractalRast(elev, n = 2, dimension = c(2.1, 2.8)) plot(fractal) hist(fractal) +### Random walker rasters + +# One random walker +walk <- rRandWalkRast(elev) +plot(walk) + +# Random walker with self-avoidance: +walkAvoid <- rRandWalkRast(elev, steps = 1000, avoid = TRUE, seed = 1) +plot(walkAvoid) + +# 10 random walkers: +walk10 <- rRandWalkRast(elev, n = 10) +plot(walk10) + +# 10 random walkers starting in same place: +walkSame10 <- rRandWalkRast(elev, n = 10, sameStart = TRUE) +plot(walkSame10) + + } } \seealso{ -\code{\link[=rnormRast]{rnormRast()}}, \code{\link[=rSpatialDepRast]{rSpatialDepRast()}}, \code{\link[=fractalRast]{fractalRast()}}, \strong{GRASS} manual page for tool \code{r.random.surface} (see \code{grassHelp("r.random.surface")}) +\code{\link[=rNormRast]{rNormRast()}}, \code{\link[=rSpatialDepRast]{rSpatialDepRast()}}, \code{\link[=fractalRast]{fractalRast()}}, \code{\link[=rRandWalkRast]{rRandWalkRast()}}, \strong{GRASS} manual page for tool \code{r.random.surface} (see \code{grassHelp("r.random.surface")}) } diff --git a/man/wetness.Rd b/man/wetness.Rd index 767a58a5..385ccda3 100644 --- a/man/wetness.Rd +++ b/man/wetness.Rd @@ -28,14 +28,20 @@ madElev <- fastData("madElev") # Convert to GRaster: elev <- fast(madElev) -# Terrain ruggedness index: -tri <- ruggedness(elev) -plot(c(elev, tri)) - # Topographic wetness index: twi <- wetness(elev) +names(twi) <- 'TWI' plot(c(elev, twi)) +# Terrain ruggedness index: +tri <- ruggedness(elev) +tri7 <- ruggedness(elev, size = 7) +triSmooth7 <- ruggedness(elev, size = 7, exponent = 4) + +tris <- c(elev, tri, tri7, triSmooth7) +names(tris) <- c("elevation", "TRI in 3x3", "TRI in 7x7", "Smoothed TRIin 7x7") +plot(tris) + } } \seealso{ From 4e0319d313ef795f432553f036ea4414e700d07a Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Wed, 21 May 2025 22:38:30 -0500 Subject: [PATCH 39/52] Update NEWS.md --- NEWS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index 6a9d2f72..b1ed5b0d 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# fasterRaster 8.4.0.8 (2025-XX-XX) +# fasterRaster 8.4.1.0 (2025-XX-XX) ### Code-breaking changes o `rnormRast()` is now `rNormRast()`. From 4d40076ff22de52f912dc94b1dcf0380540238b9 Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Fri, 23 May 2025 00:42:47 -0500 Subject: [PATCH 40/52] Method for `proj` if missing --- R/multivarEnvSim.r | 16 ++++++++++++++-- man/multivarEnvSim.Rd | 7 +++++-- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/R/multivarEnvSim.r b/R/multivarEnvSim.r index bf687304..1ad84572 100644 --- a/R/multivarEnvSim.r +++ b/R/multivarEnvSim.r @@ -6,9 +6,9 @@ #' * `data.frame` or `data.table`: There must be one column per layer in `proj`, and the columns must have the same names as the layers in `proj`. #' * `GRaster` with one or more layers: Must have the same [names()] as the `GRaster`s in `proj`. Values are assumed to be continuous (not categorical/factors). #' -#' @param proj A `GRaster` with one or more layers. Values are assumed to be continuous (not categorical/factors). +#' @param proj A `GRaster` or missing. If a `GRaster`, it must have the same layers as can have with one or more layers as `ref`. Values are assumed to be continuous (not categorical/factors). If missing, then `ref` is used, in which case the output represents the relative difference of each cell from the overall layer median. #' -#' @returns A `GRaster` "stack". There will be one layer per layer in `ref`, indicating the MESS score for that variable. There will also be an layer named "MESS" which represents the MESS value across all variables (the minimum value of each of the individual MESS rasters). A final layer represents the layer which is most different (has the lowest MESS value). +#' @returns A `GRaster` "stack". There will be one layer per layer in `ref`, indicating the MESS score for that variable. There will also be a layer named "MESS" which represents the MESS value across all variables (the minimum value of each of the individual MESS rasters). A final layer represents the layer which is most different (has the lowest MESS value). #' #' @references Elith, J, Kearney, M, and Phillips, S. 2010. The art of modelling range-shifting species. *Methods in Ecology and Evolution* 1:330-342. \doi{10.1111/j.2041-210X.2010.00036.x} (see especially the Supplement) #' @@ -79,6 +79,7 @@ methods::setMethod( flags = c(.quiet(), "overwrite") ) + # add 1 bc "r.series::min_raster" returns 0 for the first raster srcMostDiffFrom1 <- .makeSourceName("mess_r_mapcalc", "raster") ex <- paste0(srcMostDiffFrom1, " = int(", srcMostDiffFrom0, " + 1)") rgrass::execGRASS("r.mapcalc", expression = ex, flags = c(.quiet(), "overwrite")) @@ -93,3 +94,14 @@ methods::setMethod( } # EOF ) + +#' @aliases multivarEnvSim +#' @rdname multivarEnvSim +#' @exportMethod multivarEnvSim +methods::setMethod( + f = "multivarEnvSim", + signature = c(ref = "GRaster", proj = "missing"), + definition = function(ref, proj) multivarEnvSim(ref = ref, proj = ref) +) + + diff --git a/man/multivarEnvSim.Rd b/man/multivarEnvSim.Rd index 5c6ed39b..5fdb4506 100644 --- a/man/multivarEnvSim.Rd +++ b/man/multivarEnvSim.Rd @@ -3,9 +3,12 @@ \name{multivarEnvSim,GRaster,GRaster-method} \alias{multivarEnvSim,GRaster,GRaster-method} \alias{multivarEnvSim} +\alias{multivarEnvSim,GRaster,missing-method} \title{Multivariate environmental similarity surface (MESS)} \usage{ \S4method{multivarEnvSim}{GRaster,GRaster}(ref, proj) + +\S4method{multivarEnvSim}{GRaster,missing}(ref, proj) } \arguments{ \item{ref}{A \code{data.frame}, \code{data.table}, a points \code{GVector}, or "stack" of \code{GRasters}: This represents the set of "reference" environmental conditions: @@ -14,10 +17,10 @@ \item \code{GRaster} with one or more layers: Must have the same \code{\link[=names]{names()}} as the \code{GRaster}s in \code{proj}. Values are assumed to be continuous (not categorical/factors). }} -\item{proj}{A \code{GRaster} with one or more layers. Values are assumed to be continuous (not categorical/factors).} +\item{proj}{A \code{GRaster} or missing. If a \code{GRaster}, it must have the same layers as can have with one or more layers as \code{ref}. Values are assumed to be continuous (not categorical/factors). If missing, then \code{ref} is used, in which case the output represents the relative difference of each cell from the overall layer median.} } \value{ -A \code{GRaster} "stack". There will be one layer per layer in \code{ref}, indicating the MESS score for that variable. There will also be an layer named "MESS" which represents the MESS value across all variables (the minimum value of each of the individual MESS rasters). A final layer represents the layer which is most different (has the lowest MESS value). +A \code{GRaster} "stack". There will be one layer per layer in \code{ref}, indicating the MESS score for that variable. There will also be a layer named "MESS" which represents the MESS value across all variables (the minimum value of each of the individual MESS rasters). A final layer represents the layer which is most different (has the lowest MESS value). } \description{ The multivariate environmental similarity surface (MESS) indicates the degree to which a set of "projection" environmental conditions fall inside or outside a set of "reference" conditions. Values of 1 indicate a location falls at the exact median of all variables. Values of 0 indicate that the location has at least one environmental covariate that is at the upper or lower end of the range of reference conditions, and values <1 indicate that at least one variable falls above or below the reference conditions. MESS can be used, for example, to indicate the degree to which a model constructed in one time period and/or location must extrapolate when projected to another time period and/or location. From 01f850a2f76589d2f05ee3cff8b6953cd3d24568 Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Fri, 23 May 2025 00:42:52 -0500 Subject: [PATCH 41/52] Update rRandWalkRast.Rd --- man/rRandWalkRast.Rd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/man/rRandWalkRast.Rd b/man/rRandWalkRast.Rd index 373aa9b8..0b9f6e15 100644 --- a/man/rRandWalkRast.Rd +++ b/man/rRandWalkRast.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/rRandWalk.r +% Please edit documentation in R/rRandWalkRast.r \name{rRandWalkRast,GRaster-method} \alias{rRandWalkRast,GRaster-method} \alias{rRandWalkRast} From eed6ad02074521e53807dcbcd72f57bd0882f6e8 Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Fri, 23 May 2025 00:42:59 -0500 Subject: [PATCH 42/52] Update NEWS.md --- NEWS.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NEWS.md b/NEWS.md index b1ed5b0d..b085960c 100644 --- a/NEWS.md +++ b/NEWS.md @@ -5,11 +5,11 @@ o `rnormRast()` is now `rNormRast()`. o `runifRast()` is now `rUnifRast()`. ### New functions and functionality -o `addons()` now reports whether a given addon is installed or the names of all installed addons. +o `addons()` now reports the names of all installed addons or whether a given addon is installed. o `installAddon()` installs an addon. o `removeAddon()` deletes an addon. o `multivarEnvSim()` calculates multivariate environmental similarity (MESS). -o `neighborhoodMatrix()` calculates a neighborhood matrix from a polygons `GVector`. +o `neighborhoodMatrix()` generates a neighborhood matrix from a polygons `GVector`. o `rRandWalkRast()` creates a raster with the path of random walkers. o `ruggedness()` now allows for calculation of the terrain ruggedness index across user-defined windows with distance-based weighting. From b4323e2b75caec99a64c054265ac281fdbb1e367 Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Thu, 19 Jun 2025 16:03:23 -0500 Subject: [PATCH 43/52] Update README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index fe3678de..0b6d4d95 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Faster raster processing in `R` using `GRASS` -fasterRaster website +fasterRaster website `fasterRaster` is an **R** package designed specifically to handle large-in-memory/large-on-disk spatial rasters and vectors. `fasterRaster` does this using Open Source Geospatial's `GRASS` @@ -16,12 +16,12 @@ Faster raster processing in `R` using `GRASS` * **Familiarity**: If you know how to use `terra`, you basically know how to use `fasterRaster`! That's because most of the functions have the same name and almost the same arguments as `terra` functions. * **Comparability**: To the degree possible, outputs from `fasterRaster` are the same as those from functions in `terra` with the same name. * **Simplicity**: `GRASS` requires users to track things like "locations" or "projects", "mapsets", and "regions" for which there is no comparable analog in the `terra` or `sf` packages. `fasterRaster` handles these behind the scenes so you don't need to. -* **It's R**: The `rgrass` package provides a powerful conduit through which you can run `GRASS` modules from `R`. As such, it provides much more flexibility than `fasterRaster`. However, to use `rgrass`, you need to know what `GRASS` modules you want to use and be familiar with `GRASS` syntax. `fasterRaster` obviates this step but uses `rgrass` as a backend, allowing you to focus on `R` syntax and look up help for functions the normal way you do in `R`. You don't need to know `GRASS`! +* **It's R**: The `rgrass` package provides a powerful conduit through which you can run `GRASS` tools from `R`. As such, it provides much more flexibility than `fasterRaster`. However, to use `rgrass`, you need to know what `GRASS` tools you want to use and be familiar with `GRASS` syntax. `fasterRaster` obviates this step but uses `rgrass` as a backend, allowing you to focus on `R` syntax and look up help for functions the normal way you do in `R`. You don't need to know `GRASS`! `fasterRaster` makes heavy use of the `rgrass` package by Roger Bivand and others, the `terra` package by Robert Hijmans, the `sf` package by Edzer Pebesma, Roger Bivand, and others, and of course `GRASS`, so is greatly indebted to all of these creators! # Vignettes & documentation -**fasterRaster** comes with four user-oriented vignettes, plus a `pkgdown` site with full documentation: +**fasterRaster** comes with four user-oriented vignettes, plus a `pkgdown` site with full documentation: o Getting started (also reproduced below) o Types of `GRaster`s @@ -44,7 +44,7 @@ You can get the latest stable release using: To use `fasterRaster` you must install [GRASS version 8.3+](https://grass.osgeo.org/) on your operating system. **You will need to use the stand-alone installer, not the Open Source Geospatial (OS Geo) installer.** -**Optional**: A few functions in **fasterRaster** require **GRASS** "addon" modules, which do not come bundled with **GRASS**. You do not need to install these addons if you do not use functions that call them. A list of functions that require addons can be seen in the "addons" vignette (in **R**, use `vignette("addons", package = "fasterRaster")`). This vignette also explains how to install addons. +**Optional**: A few functions in **fasterRaster** require **GRASS** "addon" tools, which do not come bundled with **GRASS**. You do not need to install these addons if you do not use functions that call them. A list of functions that require addons can be seen in the "addons" vignette (in **R**, use `vignette("addons", package = "fasterRaster")`). This vignette also explains how to install addons. # An example From 189b0c3be05cf63ffc1a444a7327abbee4ad42a5 Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Thu, 19 Jun 2025 16:04:24 -0500 Subject: [PATCH 44/52] Fix `@rdname` tag --- R/neighborhoodMatrix.r | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/R/neighborhoodMatrix.r b/R/neighborhoodMatrix.r index 37146308..d422d987 100644 --- a/R/neighborhoodMatrix.r +++ b/R/neighborhoodMatrix.r @@ -55,6 +55,10 @@ methods::setMethod( ) #' @aliases neighbourhoodMatrix -#' @rdname dim +#' @rdname neighborhoodMatrix #' @exportMethod neighbourhoodMatrix -neighbourhoodMatrix <- function(x) neighborhoodMatrix(x) \ No newline at end of file +methods::setMethod( + f = "neighbourhoodMatrix", + signature = c(x = "GVector"), + definition = function(x) neighborhoodMatrix(x) +) From 2422ea7eed7e2f1513f7a12f6289e315e5bb3852 Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Thu, 19 Jun 2025 16:04:59 -0500 Subject: [PATCH 45/52] Create `multivarEnvSim()` --- R/multivarEnvSim.r | 122 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 106 insertions(+), 16 deletions(-) diff --git a/R/multivarEnvSim.r b/R/multivarEnvSim.r index 1ad84572..76e1e90d 100644 --- a/R/multivarEnvSim.r +++ b/R/multivarEnvSim.r @@ -8,6 +8,8 @@ #' #' @param proj A `GRaster` or missing. If a `GRaster`, it must have the same layers as can have with one or more layers as `ref`. Values are assumed to be continuous (not categorical/factors). If missing, then `ref` is used, in which case the output represents the relative difference of each cell from the overall layer median. #' +#' @param na.rm Logical: If `FALSE` (default), and `ref` is a `data.frame`, `data.table`, or `matrix`, and has `NA`s in it, then the function will likely fail. +#' #' @returns A `GRaster` "stack". There will be one layer per layer in `ref`, indicating the MESS score for that variable. There will also be a layer named "MESS" which represents the MESS value across all variables (the minimum value of each of the individual MESS rasters). A final layer represents the layer which is most different (has the lowest MESS value). #' #' @references Elith, J, Kearney, M, and Phillips, S. 2010. The art of modelling range-shifting species. *Methods in Ecology and Evolution* 1:330-342. \doi{10.1111/j.2041-210X.2010.00036.x} (see especially the Supplement) @@ -39,15 +41,114 @@ methods::setMethod( .locationRestore(proj) .region(proj) + .multivarEnvSim(ref = ref, proj = proj, medians = medians, mm = mm) + + } # EOF +) + +#' @aliases multivarEnvSim +#' @rdname multivarEnvSim +#' @exportMethod multivarEnvSim +methods::setMethod( + f = "multivarEnvSim", + signature = c(ref = "GRaster", proj = "missing"), + definition = function(ref, proj) multivarEnvSim(ref = ref, proj = ref) +) + +#' @aliases multivarEnvSim +#' @rdname multivarEnvSim +#' @exportMethod multivarEnvSim +methods::setMethod( + f = "multivarEnvSim", + signature = c(ref = "data.frame", proj = "GRaster"), + definition = function(ref, proj, na.rm = FALSE) { + + names2 <- names(proj) %in% names(ref) + if (!all(names2)) stop("Not all layer names in `proj` appear in `ref.") + + .locationRestore(proj) + .region(proj) + + ref <- ref[ , names(proj), drop = FALSE] + + medians <- matrix(apply(ref, 2, "median", na.rm = na.rm), ncol = 1) + rownames(medians) <- colnames(ref) + colnames(medians) <- "median" + + mins <- apply(ref, 2, "min", na.rm = na.rm) + maxs <- apply(ref, 2, "max", na.rm = na.rm) + + mm <- matrix(c(mins, maxs), nrow = 2, byrow = TRUE) + rownames(mm) <- c("min", "max") + colnames(mm) <- names(ref) + + .multivarEnvSim(ref = ref, proj = proj, medians = medians, mm = mm) + + } # EOF +) + +#' @aliases multivarEnvSim +#' @rdname multivarEnvSim +#' @exportMethod multivarEnvSim +methods::setMethod( + f = "multivarEnvSim", + signature = c(ref = "data.table", proj = "GRaster"), + definition = function(ref, proj, na.rm = FALSE) { + + names2 <- names(proj) %in% names(ref) + if (!all(names2)) stop("Not all layer names in `proj` appear in `ref.") + + .locationRestore(proj) + .region(proj) + + cols <- names(proj) + ref <- ref[ , ..cols] + + medians <- matrix(apply(ref, 2, "median", na.rm = na.rm), ncol = 1) + rownames(medians) <- colnames(ref) + colnames(medians) <- "median" + + mins <- apply(ref, 2, "min", na.rm = na.rm) + maxs <- apply(ref, 2, "max", na.rm = na.rm) + + mm <- matrix(c(mins, maxs), nrow = 2, byrow = TRUE) + rownames(mm) <- c("min", "max") + colnames(mm) <- names(ref) + + .multivarEnvSim(ref = ref, proj = proj, medians = medians, mm = mm) + + } # EOF +) + +#' @aliases multivarEnvSim +#' @rdname multivarEnvSim +#' @exportMethod multivarEnvSim +methods::setMethod( + f = "multivarEnvSim", + signature = c(ref = "matrix", proj = "GRaster"), + definition = function(ref, proj, na.rm = FALSE) { + + ref <- data.table::as.data.table(ref) + multivarEnvSim(ref = ref, proj = proj, na.rm = na.rm) + + } # EOF +) + +# Hidden function for multivariate environmental similarity surface (MESS) +# +# ref `GRaster`, `data.frame`, `data.table`, or `matrix` +# proj `GRaster` +# medians Numeric: Vector of median values of `ref` +# mm Numeric matrix of minium/maximum values of `ref`. Top rows is miniums and bottom is maximums. Columns must have same names as `ref`. +.multivarEnvSim <- function(ref, proj, medians, mm) { + ### MESS values for each variable nLayers <- nlyr(proj) srcs <- .makeSourceName("mess_r_mapcalc", "raster", nLayers) for (i in seq_len(nLayers)) { layer <- names(proj)[i] - x <- ref[[i]] - y <- proj[[names(x)]] - ySrc <- sources(y) + ySrc <- sources(proj)[i] thisMedian <- medians[layer, "median"] thisMin <- mm["min", layer] @@ -90,18 +191,7 @@ methods::setMethod( srcsAll <- c(srcs, srcOverall, srcMostDiffFrom1) outNames <- c(names(proj), "MESS", "mostDifferent") - .makeGRaster(srcsAll, names = outNames) - - } # EOF -) - -#' @aliases multivarEnvSim -#' @rdname multivarEnvSim -#' @exportMethod multivarEnvSim -methods::setMethod( - f = "multivarEnvSim", - signature = c(ref = "GRaster", proj = "missing"), - definition = function(ref, proj) multivarEnvSim(ref = ref, proj = ref) -) + .makeGRaster(srcsAll, names = outNames, levels = levs) +} From 7d795618ae1ad70f15f51e1c52d8cb950caa217b Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Thu, 19 Jun 2025 16:05:02 -0500 Subject: [PATCH 46/52] Update fasterRaster.r --- R/fasterRaster.r | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/fasterRaster.r b/R/fasterRaster.r index 2e264ee7..00197cda 100644 --- a/R/fasterRaster.r +++ b/R/fasterRaster.r @@ -284,7 +284,7 @@ #' * [vect()]: Convert a `GVector` to a `SpatVector` #' #' ## General purpose functions -#' * [addon()]: Show installed **GRASS** addons +#' * [addons()]: Show installed **GRASS** addons #' * [compareGeom()]: Determine if geographic metadata is same between `GRaster`s and/or `GVector`s #' * [dropRows()]: Remove rows from a `data.frame` or `data.table` #' * [grassGUI()]: Start the **GRASS** GUI (not recommended for most users!!!) From 56c5533ec545c5722556920473b6bf2f297e9286 Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Thu, 19 Jun 2025 16:05:13 -0500 Subject: [PATCH 47/52] Add method for `GRaster` --- R/centroids.r | 80 ++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 69 insertions(+), 11 deletions(-) diff --git a/R/centroids.r b/R/centroids.r index 37ef8c1b..674597a2 100644 --- a/R/centroids.r +++ b/R/centroids.r @@ -1,11 +1,12 @@ -#' Centroid(s) of a vector +#' Centroid(s) of a vector or clumps in a raster #' -#' @description This function locates the centroid of each geometry of a `GVector`. +#' @description This function locates the centroid of each geometry of a `GVector`, or the centroid of each "clump" of same-valued cells in an integer/categorical raster (for information on types of `GRaster`s, see `vignette("GRasters", package = "fasterRaster")`). #' -#' This function needs the **GRASS** addon `v.centerpoint`. If it is not installed, it will try to install it. +#' To use this function with a `GVector`, you need the **GRASS** `v.centerpoint` addon. To use the function with a `GRaster`, you need the addon `r.centroids`. In either case, the function will try to install the respective addon (i.e., you need to have an internet connection). Once installed, a tool will not need to be installed again. #' -#' @param x A `GVector`. -#' @param method Character or `NULL` (default): Method used for calculating centroids. The method of calculation depends on whether the input is a `points`, `lines`, or `polygons` `GVector`. If the value is `NULL`, then the default method will be chosen, depending on the geometry type of the `GVector`: +#' @param x A `GVector` or `GRaster`. +#' +#' @param method `GVector`s: Character or `NULL` (default): Method used for calculating centroids. The method of calculation depends on whether the input is a `points`, `lines`, or `polygons` `GVector`. If the value is `NULL`, then the default method will be chosen, depending on the geometry type of the `GVector`: #' * `points`: #' * `"mean"` (default for `points`): Mean of coordinates. #' * `"median"`: Geometric median; more robust to outliers. @@ -21,13 +22,11 @@ #' #' Partial matching is used and case is ignored. #' -#' @param check Logical: If `TRUE` (default), check to see if the `v.centerpoint` addon is installed. -#' -#' @returns A points `GVector`. +#' @returns If the input is a `GVector`, the output will be a "points" `GVector`. If the input is a `GRaster`, the output will be a "points" `GVector` with a table with statistics on each clump. If the input is a `GRaster` with more than one layer, the output will be a `list` of `GVector`s, with one `GVector` per layer. #' #' @example man/examples/ex_centroids.r #' -#' @seealso [terra::centroids()]; **GRASS** addon tool `v.centerpoint`. +#' @seealso [terra::centroids()]; **GRASS** addon tools `v.centerpoint` and `r.centroids`. #' #' @aliases centroids #' @rdname centroids @@ -35,9 +34,9 @@ methods::setMethod( f = "centroids", signature = c(x = "GVector"), - function(x, method = NULL, check = TRUE) { + function(x, method = NULL) { - if (check) .addons("v.centerpoint") + .addons("v.centerpoint") gtype <- geomtype(x) @@ -91,3 +90,62 @@ methods::setMethod( } # EOF ) + +#' @aliases centroids +#' @rdname centroids +#' @exportMethod centroids +methods::setMethod( + f = "centroids", + signature = c(x = "GRaster"), + function(x) { + + .addons("r.centroids") + + .locationRestore(x) + .region(x) + + nLayers <- nlyr(x) + out <- list() + srcs <- .makeSourceName("r_centroids", "vector", n = nLayers) + for (i in 1:nLayers) { + + rawTable <- rgrass::execGRASS( + cmd = "r.centroids", + input = sources(x)[[i]], + output = srcs[i], + flags = c(.quiet(), "overwrite"), + intern = TRUE + ) + + # parse table + rawTable <- rawTable[7:(length(rawTable) - 2)] + lines <- strsplit(rawTable, split = " ") + table <- data.table::data.table() + for (j in seq_along(rawTable)) { + + line <- lines[[j]] + line <- line[line != ""] + line <- as.numeric(line) + table <- rbind( + table, + data.table::data.table( + clump = line[1L], + x = line[5L], + y = line[7L], + numberOfCells = line[4L], + meanCellValue = line[2L], + clumpSum = line[3L] + ) + ) + + } + + out[[i]] <- .makeGVector(srcs[i], table = table) + + } + + if (nLayers == 1) out <- out[[1]] + out + + } # EOF +) From 71b3968b2d5de6ffd56072e5e395440e7daa6001 Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Thu, 19 Jun 2025 16:05:16 -0500 Subject: [PATCH 48/52] Update NEWS.md --- NEWS.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index b085960c..9fe06fae 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# fasterRaster 8.4.1.0 (2025-XX-XX) +# fasterRaster 8.4.1.0 (2025-06-17) ### Code-breaking changes o `rnormRast()` is now `rNormRast()`. @@ -8,6 +8,7 @@ o `runifRast()` is now `rUnifRast()`. o `addons()` now reports the names of all installed addons or whether a given addon is installed. o `installAddon()` installs an addon. o `removeAddon()` deletes an addon. +o `centroids()` now calculates centroids of clumps in a `GRaster`. o `multivarEnvSim()` calculates multivariate environmental similarity (MESS). o `neighborhoodMatrix()` generates a neighborhood matrix from a polygons `GVector`. o `rRandWalkRast()` creates a raster with the path of random walkers. From 3a634f6d738ff058228de372d9689b53476c745c Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Thu, 19 Jun 2025 16:05:26 -0500 Subject: [PATCH 49/52] Updates --- DESCRIPTION | 4 ++-- _pkgdown.yml | 1 + inst/pkgdown.yml | 5 ++-- man/centroids.Rd | 40 +++++++++++++++++++++++--------- man/dim.Rd | 5 +--- man/examples/ex_centroids.r | 19 ++++++++++++++- man/examples/ex_multivarEnvSim.r | 11 ++++++++- man/fasterRaster.Rd | 2 +- man/multivarEnvSim.Rd | 22 +++++++++++++++++- man/neighborhoodMatrix.Rd | 4 ++++ man/wetness.Rd | 2 +- 11 files changed, 90 insertions(+), 25 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 0fc0b038..f57c234c 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,8 +1,8 @@ Package: fasterRaster Type: Package Title: Faster Raster and Spatial Vector Processing Using 'GRASS' -Version: 8.4.0.7 -Date: 2025-04-24 +Version: 8.4.1.0 +Date: 2025-06-19 Authors@R: c( person( diff --git a/_pkgdown.yml b/_pkgdown.yml index ae2c8566..062bc4f5 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -154,6 +154,7 @@ reference: - app - c - cellSize + - centroids - classify - clump - combineLevels diff --git a/inst/pkgdown.yml b/inst/pkgdown.yml index 9503be36..623aa5e9 100644 --- a/inst/pkgdown.yml +++ b/inst/pkgdown.yml @@ -1,8 +1,7 @@ pandoc: 3.6.2 -pkgdown: 2.1.1 +pkgdown: 2.1.3 pkgdown_sha: ~ articles: - addons: addons.html faster_fasterRaster: faster_fasterRaster.html fasterRaster: fasterRaster.html GRasters: GRasters.html @@ -10,7 +9,7 @@ articles: projects_mapsets: projects_mapsets.html regions: regions.html three_d_objects: three_d_objects.html -last_built: 2025-04-25T13:52Z +last_built: 2025-06-19T19:19Z urls: reference: https://github.com/adamlilith/fasterRaster/reference article: https://github.com/adamlilith/fasterRaster/articles diff --git a/man/centroids.Rd b/man/centroids.Rd index 2b6377f2..133a0a6d 100644 --- a/man/centroids.Rd +++ b/man/centroids.Rd @@ -3,14 +3,17 @@ \name{centroids,GVector-method} \alias{centroids,GVector-method} \alias{centroids} -\title{Centroid(s) of a vector} +\alias{centroids,GRaster-method} +\title{Centroid(s) of a vector or clumps in a raster} \usage{ -\S4method{centroids}{GVector}(x, method = NULL, check = TRUE) +\S4method{centroids}{GVector}(x, method = NULL) + +\S4method{centroids}{GRaster}(x) } \arguments{ -\item{x}{A \code{GVector}.} +\item{x}{A \code{GVector} or \code{GRaster}.} -\item{method}{Character or \code{NULL} (default): Method used for calculating centroids. The method of calculation depends on whether the input is a \code{points}, \code{lines}, or \code{polygons} \code{GVector}. If the value is \code{NULL}, then the default method will be chosen, depending on the geometry type of the \code{GVector}: +\item{method}{\code{GVector}s: Character or \code{NULL} (default): Method used for calculating centroids. The method of calculation depends on whether the input is a \code{points}, \code{lines}, or \code{polygons} \code{GVector}. If the value is \code{NULL}, then the default method will be chosen, depending on the geometry type of the \code{GVector}: \itemize{ \item \code{points}: \itemize{ @@ -33,16 +36,14 @@ } Partial matching is used and case is ignored.} - -\item{check}{Logical: If \code{TRUE} (default), check to see if the \code{v.centerpoint} addon is installed.} } \value{ -A points \code{GVector}. +If the input is a \code{GVector}, the output will be a "points" \code{GVector}. If the input is a \code{GRaster}, the output will be a "points" \code{GVector} with a table with statistics on each clump. If the input is a \code{GRaster} with more than one layer, the output will be a \code{list} of \code{GVector}s, with one \code{GVector} per layer. } \description{ -This function locates the centroid of each geometry of a \code{GVector}. +This function locates the centroid of each geometry of a \code{GVector}, or the centroid of each "clump" of same-valued cells in an integer/categorical raster (for information on types of \code{GRaster}s, see \code{vignette("GRasters", package = "fasterRaster")}). -This function needs the \strong{GRASS} addon \code{v.centerpoint}. If it is not installed, it will try to install it. +To use this function with a \code{GVector}, you need the \strong{GRASS} \code{v.centerpoint} addon. To use the function with a \code{GRaster}, you need the addon \code{r.centroids}. In either case, the function will try to install the respective addon (i.e., you need to have an internet connection). Once installed, a tool will not need to be installed again. } \examples{ if (grassStarted()) { @@ -51,7 +52,7 @@ if (grassStarted()) { library(sf) library(terra) -# Points, lines, and polygons +### Points, line, and polygon centroids # Point centroids: madDypsis <- fastData("madDypsis") @@ -110,8 +111,25 @@ legend("bottomright", xpd = NA ) +### Centroids of integer GRaster "clumps" + +# Load elevation raster +madElev <- fastData("madElev") +elev <- fast(madElev) + +# Create clumps of similarly-valued cells +clumps <- clump(elev, minDiff = 0.01, minClumpSize = 1000) + +# Centroids: +clumpCents <- centroids(clumps) +clumpCents + +plot(clumps) +plot(clumpCents, add = TRUE) + + } } \seealso{ -\code{\link[terra:centroids]{terra::centroids()}}; \strong{GRASS} addon tool \code{v.centerpoint}. +\code{\link[terra:centroids]{terra::centroids()}}; \strong{GRASS} addon tools \code{v.centerpoint} and \code{r.centroids}. } diff --git a/man/dim.Rd b/man/dim.Rd index c679e719..bb1163a5 100644 --- a/man/dim.Rd +++ b/man/dim.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/dim.r, R/neighborhoodMatrix.r +% Please edit documentation in R/dim.r \name{dim,GRegion-method} \alias{dim,GRegion-method} \alias{dim} @@ -27,7 +27,6 @@ \alias{nlyr,missing-method} \alias{nlyr} \alias{nlyr,GRaster-method} -\alias{neighbourhoodMatrix} \title{Number of rows, columns, depths, cells, and layers} \usage{ \S4method{dim}{GRegion}(x) @@ -65,8 +64,6 @@ \S4method{nlyr}{missing}(x) \S4method{nlyr}{GRaster}(x) - -neighbourhoodMatrix(x) } \arguments{ \item{x}{A \code{GRegion}, \code{GRaster}, \code{GVector}, or missing. If missing, then the dimensions of the currently active "region" are returned (see \code{vignette("regions", package = "fasterRaster")}).} diff --git a/man/examples/ex_centroids.r b/man/examples/ex_centroids.r index d9f1f589..900f1f96 100644 --- a/man/examples/ex_centroids.r +++ b/man/examples/ex_centroids.r @@ -4,7 +4,7 @@ if (grassStarted()) { library(sf) library(terra) -# Points, lines, and polygons +### Points, line, and polygon centroids # Point centroids: madDypsis <- fastData("madDypsis") @@ -63,4 +63,21 @@ legend("bottomright", xpd = NA ) +### Centroids of integer GRaster "clumps" + +# Load elevation raster +madElev <- fastData("madElev") +elev <- fast(madElev) + +# Create clumps of similarly-valued cells +clumps <- clump(elev, minDiff = 0.01, minClumpSize = 1000) + +# Centroids: +clumpCents <- centroids(clumps) +clumpCents + +plot(clumps) +plot(clumpCents, add = TRUE) + + } diff --git a/man/examples/ex_multivarEnvSim.r b/man/examples/ex_multivarEnvSim.r index daeaec52..0053a9ba 100644 --- a/man/examples/ex_multivarEnvSim.r +++ b/man/examples/ex_multivarEnvSim.r @@ -16,7 +16,16 @@ plot(messes) # Where is at least one variable outside the reference range? extrap <- messes[["MESS"]] < 0 -names(extrap) <- "outside" +levs <- data.frame(value = 0:1, labels = c('no extrapolation', 'extrapolation')) +levels(extrap) <- levs plot(extrap) +# Using a data frame as "reference" conditions: +madDypsis <- fastData("madDypsis") # Dypsis occurrences +dypsis <- fast(madDypsis) + +dypEnv <- extract(chelsa, dypsis) +dypMess <- multivarEnvSim(ref = dypEnv, proj = proj) +plot(dypMess) + } diff --git a/man/fasterRaster.Rd b/man/fasterRaster.Rd index bbaf7fef..d42a3fed 100644 --- a/man/fasterRaster.Rd +++ b/man/fasterRaster.Rd @@ -341,7 +341,7 @@ Operations on \code{GRaster}s \subsection{General purpose functions}{ \itemize{ -\item \code{\link[=addon]{addon()}}: Show installed \strong{GRASS} addons +\item \code{\link[=addons]{addons()}}: Show installed \strong{GRASS} addons \item \code{\link[=compareGeom]{compareGeom()}}: Determine if geographic metadata is same between \code{GRaster}s and/or \code{GVector}s \item \code{\link[=dropRows]{dropRows()}}: Remove rows from a \code{data.frame} or \code{data.table} \item \code{\link[=grassGUI]{grassGUI()}}: Start the \strong{GRASS} GUI (not recommended for most users!!!) diff --git a/man/multivarEnvSim.Rd b/man/multivarEnvSim.Rd index 5fdb4506..d522c209 100644 --- a/man/multivarEnvSim.Rd +++ b/man/multivarEnvSim.Rd @@ -4,11 +4,20 @@ \alias{multivarEnvSim,GRaster,GRaster-method} \alias{multivarEnvSim} \alias{multivarEnvSim,GRaster,missing-method} +\alias{multivarEnvSim,data.frame,GRaster-method} +\alias{multivarEnvSim,data.table,GRaster-method} +\alias{multivarEnvSim,matrix,GRaster-method} \title{Multivariate environmental similarity surface (MESS)} \usage{ \S4method{multivarEnvSim}{GRaster,GRaster}(ref, proj) \S4method{multivarEnvSim}{GRaster,missing}(ref, proj) + +\S4method{multivarEnvSim}{data.frame,GRaster}(ref, proj, na.rm = FALSE) + +\S4method{multivarEnvSim}{data.table,GRaster}(ref, proj, na.rm = FALSE) + +\S4method{multivarEnvSim}{matrix,GRaster}(ref, proj, na.rm = FALSE) } \arguments{ \item{ref}{A \code{data.frame}, \code{data.table}, a points \code{GVector}, or "stack" of \code{GRasters}: This represents the set of "reference" environmental conditions: @@ -18,6 +27,8 @@ }} \item{proj}{A \code{GRaster} or missing. If a \code{GRaster}, it must have the same layers as can have with one or more layers as \code{ref}. Values are assumed to be continuous (not categorical/factors). If missing, then \code{ref} is used, in which case the output represents the relative difference of each cell from the overall layer median.} + +\item{na.rm}{Logical: If \code{FALSE} (default), and \code{ref} is a \code{data.frame}, \code{data.table}, or \code{matrix}, and has \code{NA}s in it, then the function will likely fail.} } \value{ A \code{GRaster} "stack". There will be one layer per layer in \code{ref}, indicating the MESS score for that variable. There will also be a layer named "MESS" which represents the MESS value across all variables (the minimum value of each of the individual MESS rasters). A final layer represents the layer which is most different (has the lowest MESS value). @@ -44,9 +55,18 @@ plot(messes) # Where is at least one variable outside the reference range? extrap <- messes[["MESS"]] < 0 -names(extrap) <- "outside" +levs <- data.frame(value = 0:1, labels = c('no extrapolation', 'extrapolation')) +levels(extrap) <- levs plot(extrap) +# Using a data frame as "reference" conditions: +madDypsis <- fastData("madDypsis") # Dypsis occurrences +dypsis <- fast(madDypsis) + +dypEnv <- extract(chelsa, dypsis) +dypMess <- multivarEnvSim(ref = dypEnv, proj = proj) +plot(dypMess) + } } \references{ diff --git a/man/neighborhoodMatrix.Rd b/man/neighborhoodMatrix.Rd index f6c05eb5..0cf563d4 100644 --- a/man/neighborhoodMatrix.Rd +++ b/man/neighborhoodMatrix.Rd @@ -3,9 +3,13 @@ \name{neighborhoodMatrix,GVector-method} \alias{neighborhoodMatrix,GVector-method} \alias{neighborhoodMatrix} +\alias{neighbourhoodMatrix,GVector-method} +\alias{neighbourhoodMatrix} \title{Neighborhood matrix from a polygons GVector} \usage{ \S4method{neighborhoodMatrix}{GVector}(x) + +\S4method{neighbourhoodMatrix}{GVector}(x) } \arguments{ \item{x}{A polygons `GVector.} diff --git a/man/wetness.Rd b/man/wetness.Rd index 385ccda3..010836d0 100644 --- a/man/wetness.Rd +++ b/man/wetness.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/wetness.r +% Please edit documentation in R/topoWetness.r \name{wetness,GRaster-method} \alias{wetness,GRaster-method} \alias{wetness} From 00e40d94e4ce7260359f6c40da4b6ff4049579ea Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Thu, 19 Jun 2025 16:14:38 -0500 Subject: [PATCH 50/52] Change `rRandWalkRast()` to `rWalkRast()` --- NAMESPACE | 2 +- NEWS.md | 2 +- R/01_generics.r | 8 ++++---- R/fasterRaster.r | 2 +- R/rSpatialDepRast.r | 2 +- R/{rRandWalkRast.r => rWalkRast.r} | 8 ++++---- R/rnormRast.r | 2 +- R/runifRast.r | 2 +- _pkgdown.yml | 2 +- man/examples/ex_randRast.r | 8 ++++---- man/fasterRaster.Rd | 2 +- man/fractalRast.Rd | 8 ++++---- man/rSpatialDepRast.Rd | 10 +++++----- man/{rRandWalkRast.Rd => rWalkRast.Rd} | 18 +++++++++--------- man/rnormRast.Rd | 10 +++++----- man/runifRast.Rd | 12 ++++++------ man/wetness.Rd | 2 +- 17 files changed, 50 insertions(+), 50 deletions(-) rename R/{rRandWalkRast.r => rWalkRast.r} (96%) rename man/{rRandWalkRast.Rd => rWalkRast.Rd} (89%) diff --git a/NAMESPACE b/NAMESPACE index 986bb7a0..5de4e956 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -200,9 +200,9 @@ exportMethods(princomp) exportMethods(project) exportMethods(quantile) exportMethods(rNormRast) -exportMethods(rRandWalkRast) exportMethods(rSpatialDepRast) exportMethods(rUnifRast) +exportMethods(rWalkRast) exportMethods(range) exportMethods(rast) exportMethods(rasterize) diff --git a/NEWS.md b/NEWS.md index 9fe06fae..4c0fd09e 100644 --- a/NEWS.md +++ b/NEWS.md @@ -11,7 +11,7 @@ o `removeAddon()` deletes an addon. o `centroids()` now calculates centroids of clumps in a `GRaster`. o `multivarEnvSim()` calculates multivariate environmental similarity (MESS). o `neighborhoodMatrix()` generates a neighborhood matrix from a polygons `GVector`. -o `rRandWalkRast()` creates a raster with the path of random walkers. +o `rWalkRast()` creates a raster with the path of random walkers. o `ruggedness()` now allows for calculation of the terrain ruggedness index across user-defined windows with distance-based weighting. ### Minor fixes diff --git a/R/01_generics.r b/R/01_generics.r index acda8d26..fcac7d7a 100644 --- a/R/01_generics.r +++ b/R/01_generics.r @@ -128,8 +128,8 @@ methods::setGeneric(name = "dropTable", def = function(x, ...) standardGeneric(" methods::setGeneric(name = "E", def = function(x, ...) standardGeneric("E")) # methods::setGeneric(name = "elide", def = function(x, ...) standardGeneric("elide")) -methods::setGeneric(name = "erase", package = "terra") -methods::setGeneric(name = "ext", package = "terra") +methods::setGeneric(name = "erase", package = "terra") +methods::setGeneric(name = "ext", package = "terra") methods::setGeneric(name = "extend", package = "terra") methods::setGeneric(name = "expanse", package = "terra") methods::setGeneric(name = "extract", package = "terra") @@ -209,7 +209,7 @@ methods::setGeneric(name = "ncol", def = function(x) standardGeneric("ncol")) # methods::setGeneric(name = "ndepth", def = function(x) standardGeneric("ndepth")) methods::setGeneric(name = "neighborhoodMatrix", def = function(x, ...) standardGeneric("neighborhoodMatrix")) methods::setGeneric(name = "neighbourhoodMatrix", def = function(x, ...) standardGeneric("neighbourhoodMatrix")) -methods::setGeneric(name = "new", package = "methods") +methods::setGeneric(name = "new", package = "methods") methods::setGeneric(name = "nlyr", package = "terra") methods::setGeneric(name = "nacell", def = function(x, ...) standardGeneric("nacell")) methods::setGeneric(name = "ngeom", def = function(x, ...) standardGeneric("ngeom")) @@ -254,10 +254,10 @@ methods::setGeneric(name = "res", package = "terra") methods::setGeneric(name = "res3d", def = function(x) standardGeneric("res3d")) methods::setGeneric(name = "resample", package = "terra") methods::setGeneric(name = "rNormRast", def = function(x, ...) standardGeneric("rNormRast")) -methods::setGeneric(name = "rRandWalkRast", def = function(x, ...) standardGeneric("rRandWalkRast")) methods::setGeneric(name = "ruggedness", def = function(x, ...) standardGeneric("ruggedness")) methods::setGeneric(name = "rUnifRast", def = function(x, ...) standardGeneric("rUnifRast")) methods::setGeneric(name = "rvoronoi", def = function(x, ...) standardGeneric("rvoronoi")) +methods::setGeneric(name = "rWalkRast", def = function(x, ...) standardGeneric("rWalkRast")) methods::setGeneric(name = "S", def = function(x, ...) standardGeneric("S")) methods::setGeneric(name = "sampleRast", def = function(x, ...) standardGeneric("sampleRast")) diff --git a/R/fasterRaster.r b/R/fasterRaster.r index 00197cda..f8754c95 100644 --- a/R/fasterRaster.r +++ b/R/fasterRaster.r @@ -126,9 +126,9 @@ #' * [init()]: GRaster with values equal to row, column, coordinate, regular, or "chess" #' * [longlat()]: Create longitude/latitude rasters #' * [rNormRast()]: A random `GRaster` with values drawn from a normal distribution -#' * [rRandWalkRast()]: Paths of random walkers #' * [rSpatialDepRast()]: Create a random `GRaster` with or without spatial dependence #' * [rUnifRast()]: A random `GRaster` with values drawn from a uniform distribution +#' * [rWalkRast()]: Paths of random walkers #' * [sineRast()]: Sine wave rasters #' #' ## Analysis of terrain and hydrology diff --git a/R/rSpatialDepRast.r b/R/rSpatialDepRast.r index d340973d..cc08b4e7 100644 --- a/R/rSpatialDepRast.r +++ b/R/rSpatialDepRast.r @@ -20,7 +20,7 @@ #' #' @example man/examples/ex_randRast.r #' -#' @seealso [rNormRast()], [fractalRast()], [rUnifRast()], [rRandWalkRast()], **GRASS** manual page for tool `r.random.surface` (see `grassHelp("r.random.surface")`) +#' @seealso [rNormRast()], [fractalRast()], [rUnifRast()], [rWalkRast()], **GRASS** manual page for tool `r.random.surface` (see `grassHelp("r.random.surface")`) #' #' @aliases rSpatialDepRast #' @rdname rSpatialDepRast diff --git a/R/rRandWalkRast.r b/R/rWalkRast.r similarity index 96% rename from R/rRandWalkRast.r rename to R/rWalkRast.r index a5575664..586534ae 100644 --- a/R/rRandWalkRast.r +++ b/R/rWalkRast.r @@ -25,11 +25,11 @@ #' @example man/examples/ex_randRast.r #' -#' @aliases rRandWalkRast -#' @rdname rRandWalkRast -#' @exportMethod rRandWalkRast +#' @aliases rWalkRast +#' @rdname rWalkRast +#' @exportMethod rWalkRast methods::setMethod( - f = "rRandWalkRast", + f = "rWalkRast", signature = c(x = "GRaster"), function(x, n = 1, steps = 100000, directions = 8, avoid = FALSE, sameStart = FALSE, seed = NULL, check = TRUE) { diff --git a/R/rnormRast.r b/R/rnormRast.r index 710459fa..aa92a2e3 100644 --- a/R/rnormRast.r +++ b/R/rnormRast.r @@ -14,7 +14,7 @@ #' #' @example man/examples/ex_randRast.r #' -#' @seealso [rSpatialDepRast()], [fractalRast()], [rUnifRast()], [rRandWalkRast()], **GRASS** manual page for tool `r.random.surface` (see `grassHelp("r.random.surface")`) +#' @seealso [rSpatialDepRast()], [fractalRast()], [rUnifRast()], [rWalkRast()], **GRASS** manual page for tool `r.random.surface` (see `grassHelp("r.random.surface")`) #' #' @aliases rNormRast #' @rdname rNormRast diff --git a/R/runifRast.r b/R/runifRast.r index 65a96c03..c2119499 100644 --- a/R/runifRast.r +++ b/R/runifRast.r @@ -14,7 +14,7 @@ #' #' @example man/examples/ex_randRast.r #' -#' @seealso [rNormRast()], [rSpatialDepRast()], [fractalRast()], [rRandWalkRast()], **GRASS** manual page for tool `r.random.surface` (see `grassHelp("r.random.surface")`) +#' @seealso [rNormRast()], [rSpatialDepRast()], [fractalRast()], [rWalkRast()], **GRASS** manual page for tool `r.random.surface` (see `grassHelp("r.random.surface")`) #' #' @aliases rUnifRast #' @rdname rUnifRast diff --git a/_pkgdown.yml b/_pkgdown.yml index 062bc4f5..911e2a36 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -209,9 +209,9 @@ reference: - init - longlat - rNormRast - - rRandWalkRast - rSpatialDepRast - rUnifRast + - rWalkRast - sineRast - title: Terrain and hydrology - contents: diff --git a/man/examples/ex_randRast.r b/man/examples/ex_randRast.r index a6c845da..71d0e68a 100644 --- a/man/examples/ex_randRast.r +++ b/man/examples/ex_randRast.r @@ -37,19 +37,19 @@ hist(fractal) ### Random walker rasters # One random walker -walk <- rRandWalkRast(elev) +walk <- rWalkRast(elev) plot(walk) # Random walker with self-avoidance: -walkAvoid <- rRandWalkRast(elev, steps = 1000, avoid = TRUE, seed = 1) +walkAvoid <- rWalkRast(elev, steps = 1000, avoid = TRUE, seed = 1) plot(walkAvoid) # 10 random walkers: -walk10 <- rRandWalkRast(elev, n = 10) +walk10 <- rWalkRast(elev, n = 10) plot(walk10) # 10 random walkers starting in same place: -walkSame10 <- rRandWalkRast(elev, n = 10, sameStart = TRUE) +walkSame10 <- rWalkRast(elev, n = 10, sameStart = TRUE) plot(walkSame10) diff --git a/man/fasterRaster.Rd b/man/fasterRaster.Rd index d42a3fed..13bee210 100644 --- a/man/fasterRaster.Rd +++ b/man/fasterRaster.Rd @@ -149,9 +149,9 @@ Operations on \code{GRaster}s \item \code{\link[=init]{init()}}: GRaster with values equal to row, column, coordinate, regular, or "chess" \item \code{\link[=longlat]{longlat()}}: Create longitude/latitude rasters \item \code{\link[=rNormRast]{rNormRast()}}: A random \code{GRaster} with values drawn from a normal distribution -\item \code{\link[=rRandWalkRast]{rRandWalkRast()}}: Paths of random walkers \item \code{\link[=rSpatialDepRast]{rSpatialDepRast()}}: Create a random \code{GRaster} with or without spatial dependence \item \code{\link[=rUnifRast]{rUnifRast()}}: A random \code{GRaster} with values drawn from a uniform distribution +\item \code{\link[=rWalkRast]{rWalkRast()}}: Paths of random walkers \item \code{\link[=sineRast]{sineRast()}}: Sine wave rasters } } diff --git a/man/fractalRast.Rd b/man/fractalRast.Rd index f8c241d8..2c0726eb 100644 --- a/man/fractalRast.Rd +++ b/man/fractalRast.Rd @@ -62,19 +62,19 @@ hist(fractal) ### Random walker rasters # One random walker -walk <- rRandWalkRast(elev) +walk <- rWalkRast(elev) plot(walk) # Random walker with self-avoidance: -walkAvoid <- rRandWalkRast(elev, steps = 1000, avoid = TRUE, seed = 1) +walkAvoid <- rWalkRast(elev, steps = 1000, avoid = TRUE, seed = 1) plot(walkAvoid) # 10 random walkers: -walk10 <- rRandWalkRast(elev, n = 10) +walk10 <- rWalkRast(elev, n = 10) plot(walk10) # 10 random walkers starting in same place: -walkSame10 <- rRandWalkRast(elev, n = 10, sameStart = TRUE) +walkSame10 <- rWalkRast(elev, n = 10, sameStart = TRUE) plot(walkSame10) diff --git a/man/rSpatialDepRast.Rd b/man/rSpatialDepRast.Rd index e24279a8..2b0d4c6e 100644 --- a/man/rSpatialDepRast.Rd +++ b/man/rSpatialDepRast.Rd @@ -77,24 +77,24 @@ hist(fractal) ### Random walker rasters # One random walker -walk <- rRandWalkRast(elev) +walk <- rWalkRast(elev) plot(walk) # Random walker with self-avoidance: -walkAvoid <- rRandWalkRast(elev, steps = 1000, avoid = TRUE, seed = 1) +walkAvoid <- rWalkRast(elev, steps = 1000, avoid = TRUE, seed = 1) plot(walkAvoid) # 10 random walkers: -walk10 <- rRandWalkRast(elev, n = 10) +walk10 <- rWalkRast(elev, n = 10) plot(walk10) # 10 random walkers starting in same place: -walkSame10 <- rRandWalkRast(elev, n = 10, sameStart = TRUE) +walkSame10 <- rWalkRast(elev, n = 10, sameStart = TRUE) plot(walkSame10) } } \seealso{ -\code{\link[=rNormRast]{rNormRast()}}, \code{\link[=fractalRast]{fractalRast()}}, \code{\link[=rUnifRast]{rUnifRast()}}, \code{\link[=rRandWalkRast]{rRandWalkRast()}}, \strong{GRASS} manual page for tool \code{r.random.surface} (see \code{grassHelp("r.random.surface")}) +\code{\link[=rNormRast]{rNormRast()}}, \code{\link[=fractalRast]{fractalRast()}}, \code{\link[=rUnifRast]{rUnifRast()}}, \code{\link[=rWalkRast]{rWalkRast()}}, \strong{GRASS} manual page for tool \code{r.random.surface} (see \code{grassHelp("r.random.surface")}) } diff --git a/man/rRandWalkRast.Rd b/man/rWalkRast.Rd similarity index 89% rename from man/rRandWalkRast.Rd rename to man/rWalkRast.Rd index 0b9f6e15..8cf93f69 100644 --- a/man/rRandWalkRast.Rd +++ b/man/rWalkRast.Rd @@ -1,11 +1,11 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/rRandWalkRast.r -\name{rRandWalkRast,GRaster-method} -\alias{rRandWalkRast,GRaster-method} -\alias{rRandWalkRast} +% Please edit documentation in R/rWalkRast.r +\name{rWalkRast,GRaster-method} +\alias{rWalkRast,GRaster-method} +\alias{rWalkRast} \title{Create raster representing one or more random walks} \usage{ -\S4method{rRandWalkRast}{GRaster}( +\S4method{rWalkRast}{GRaster}( x, n = 1, steps = 1e+05, @@ -82,19 +82,19 @@ hist(fractal) ### Random walker rasters # One random walker -walk <- rRandWalkRast(elev) +walk <- rWalkRast(elev) plot(walk) # Random walker with self-avoidance: -walkAvoid <- rRandWalkRast(elev, steps = 1000, avoid = TRUE, seed = 1) +walkAvoid <- rWalkRast(elev, steps = 1000, avoid = TRUE, seed = 1) plot(walkAvoid) # 10 random walkers: -walk10 <- rRandWalkRast(elev, n = 10) +walk10 <- rWalkRast(elev, n = 10) plot(walk10) # 10 random walkers starting in same place: -walkSame10 <- rRandWalkRast(elev, n = 10, sameStart = TRUE) +walkSame10 <- rWalkRast(elev, n = 10, sameStart = TRUE) plot(walkSame10) diff --git a/man/rnormRast.Rd b/man/rnormRast.Rd index ccb41d58..7479ec0c 100644 --- a/man/rnormRast.Rd +++ b/man/rnormRast.Rd @@ -62,24 +62,24 @@ hist(fractal) ### Random walker rasters # One random walker -walk <- rRandWalkRast(elev) +walk <- rWalkRast(elev) plot(walk) # Random walker with self-avoidance: -walkAvoid <- rRandWalkRast(elev, steps = 1000, avoid = TRUE, seed = 1) +walkAvoid <- rWalkRast(elev, steps = 1000, avoid = TRUE, seed = 1) plot(walkAvoid) # 10 random walkers: -walk10 <- rRandWalkRast(elev, n = 10) +walk10 <- rWalkRast(elev, n = 10) plot(walk10) # 10 random walkers starting in same place: -walkSame10 <- rRandWalkRast(elev, n = 10, sameStart = TRUE) +walkSame10 <- rWalkRast(elev, n = 10, sameStart = TRUE) plot(walkSame10) } } \seealso{ -\code{\link[=rSpatialDepRast]{rSpatialDepRast()}}, \code{\link[=fractalRast]{fractalRast()}}, \code{\link[=rUnifRast]{rUnifRast()}}, \code{\link[=rRandWalkRast]{rRandWalkRast()}}, \strong{GRASS} manual page for tool \code{r.random.surface} (see \code{grassHelp("r.random.surface")}) +\code{\link[=rSpatialDepRast]{rSpatialDepRast()}}, \code{\link[=fractalRast]{fractalRast()}}, \code{\link[=rUnifRast]{rUnifRast()}}, \code{\link[=rWalkRast]{rWalkRast()}}, \strong{GRASS} manual page for tool \code{r.random.surface} (see \code{grassHelp("r.random.surface")}) } diff --git a/man/runifRast.Rd b/man/runifRast.Rd index 09790d81..02063c84 100644 --- a/man/runifRast.Rd +++ b/man/runifRast.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/runifRast.r +% Please edit documentation in R/rUnifRast.r \name{rUnifRast,GRaster-method} \alias{rUnifRast,GRaster-method} \alias{rUnifRast} @@ -62,24 +62,24 @@ hist(fractal) ### Random walker rasters # One random walker -walk <- rRandWalkRast(elev) +walk <- rWalkRast(elev) plot(walk) # Random walker with self-avoidance: -walkAvoid <- rRandWalkRast(elev, steps = 1000, avoid = TRUE, seed = 1) +walkAvoid <- rWalkRast(elev, steps = 1000, avoid = TRUE, seed = 1) plot(walkAvoid) # 10 random walkers: -walk10 <- rRandWalkRast(elev, n = 10) +walk10 <- rWalkRast(elev, n = 10) plot(walk10) # 10 random walkers starting in same place: -walkSame10 <- rRandWalkRast(elev, n = 10, sameStart = TRUE) +walkSame10 <- rWalkRast(elev, n = 10, sameStart = TRUE) plot(walkSame10) } } \seealso{ -\code{\link[=rNormRast]{rNormRast()}}, \code{\link[=rSpatialDepRast]{rSpatialDepRast()}}, \code{\link[=fractalRast]{fractalRast()}}, \code{\link[=rRandWalkRast]{rRandWalkRast()}}, \strong{GRASS} manual page for tool \code{r.random.surface} (see \code{grassHelp("r.random.surface")}) +\code{\link[=rNormRast]{rNormRast()}}, \code{\link[=rSpatialDepRast]{rSpatialDepRast()}}, \code{\link[=fractalRast]{fractalRast()}}, \code{\link[=rWalkRast]{rWalkRast()}}, \strong{GRASS} manual page for tool \code{r.random.surface} (see \code{grassHelp("r.random.surface")}) } diff --git a/man/wetness.Rd b/man/wetness.Rd index 010836d0..385ccda3 100644 --- a/man/wetness.Rd +++ b/man/wetness.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/topoWetness.r +% Please edit documentation in R/wetness.r \name{wetness,GRaster-method} \alias{wetness,GRaster-method} \alias{wetness} From ad1ad777c566b654c39ff793d84dd52a6b226765 Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Thu, 19 Jun 2025 16:36:15 -0500 Subject: [PATCH 51/52] Update pkgdown.yml --- inst/pkgdown.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inst/pkgdown.yml b/inst/pkgdown.yml index 623aa5e9..fe10e104 100644 --- a/inst/pkgdown.yml +++ b/inst/pkgdown.yml @@ -9,7 +9,7 @@ articles: projects_mapsets: projects_mapsets.html regions: regions.html three_d_objects: three_d_objects.html -last_built: 2025-06-19T19:19Z +last_built: 2025-06-19T21:18Z urls: reference: https://github.com/adamlilith/fasterRaster/reference article: https://github.com/adamlilith/fasterRaster/articles From 28b8cead6d9761f2a397e769f1ff81e6d05cd444 Mon Sep 17 00:00:00 2001 From: "Adam B. Smith" Date: Thu, 19 Jun 2025 16:59:44 -0500 Subject: [PATCH 52/52] Fix link to `rWalkRast()` --- R/fractalRast.r | 2 +- inst/pkgdown.yml | 2 +- man/fractalRast.Rd | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/R/fractalRast.r b/R/fractalRast.r index cccc23eb..08f29be6 100644 --- a/R/fractalRast.r +++ b/R/fractalRast.r @@ -14,7 +14,7 @@ #' #' @example man/examples/ex_randRast.r #' -#' @seealso [rSpatialDepRast()], [rNormRast()], [rUnifRast()], [rRandWalkRast()], **GRASS** manual page for tool `r.surf.fractal` (see `grassHelp("r.surf.fractal")`) +#' @seealso [rSpatialDepRast()], [rNormRast()], [rUnifRast()], [rWalkRast()], **GRASS** manual page for tool `r.surf.fractal` (see `grassHelp("r.surf.fractal")`) #' #' @aliases fractalRast #' @rdname fractalRast diff --git a/inst/pkgdown.yml b/inst/pkgdown.yml index fe10e104..a0dc858b 100644 --- a/inst/pkgdown.yml +++ b/inst/pkgdown.yml @@ -9,7 +9,7 @@ articles: projects_mapsets: projects_mapsets.html regions: regions.html three_d_objects: three_d_objects.html -last_built: 2025-06-19T21:18Z +last_built: 2025-06-19T21:54Z urls: reference: https://github.com/adamlilith/fasterRaster/reference article: https://github.com/adamlilith/fasterRaster/articles diff --git a/man/fractalRast.Rd b/man/fractalRast.Rd index 2c0726eb..03918d7b 100644 --- a/man/fractalRast.Rd +++ b/man/fractalRast.Rd @@ -81,5 +81,5 @@ plot(walkSame10) } } \seealso{ -\code{\link[=rSpatialDepRast]{rSpatialDepRast()}}, \code{\link[=rNormRast]{rNormRast()}}, \code{\link[=rUnifRast]{rUnifRast()}}, \code{\link[=rRandWalkRast]{rRandWalkRast()}}, \strong{GRASS} manual page for tool \code{r.surf.fractal} (see \code{grassHelp("r.surf.fractal")}) +\code{\link[=rSpatialDepRast]{rSpatialDepRast()}}, \code{\link[=rNormRast]{rNormRast()}}, \code{\link[=rUnifRast]{rUnifRast()}}, \code{\link[=rWalkRast]{rWalkRast()}}, \strong{GRASS} manual page for tool \code{r.surf.fractal} (see \code{grassHelp("r.surf.fractal")}) }

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