From c6cc2ba5536eaa63a377da738336dbe2ad85fe8e Mon Sep 17 00:00:00 2001 From: gmillot <gael.millot@pasteur.fr> Date: Tue, 22 Oct 2019 18:08:29 +0200 Subject: [PATCH] tempo saving --- cute_little_R_functions.R | 16412 +++++++++++++++++---------------- cute_little_R_functions.docx | Bin 806266 -> 808440 bytes 2 files changed, 8210 insertions(+), 8202 deletions(-) diff --git a/cute_little_R_functions.R b/cute_little_R_functions.R index bd679fb..24b6e60 100644 --- a/cute_little_R_functions.R +++ b/cute_little_R_functions.R @@ -14,6 +14,7 @@ # add print warning argument using warning(warnings) # update graphic examples with good comment, as in barplot # Templates: https://prettydoc.statr.me/themes.html +# # package: http://r-pkgs.had.co.nz/ # https://pkgdown.r-lib.org/ # https://rdrr.io/github/gastonstat/cointoss/ # doc:https://www.sphinx-doc.org/en/master/man/sphinx-autogen.html considering that https://www.ericholscher.com/blog/2014/feb/11/sphinx-isnt-just-for-python/ @@ -83,192 +84,196 @@ # Check OK: clear to go Apollo fun_check <- function(data, data.name = NULL, class = NULL, typeof = NULL, mode = NULL, length = NULL, prop = NULL, double.as.integer.allowed = FALSE, options = NULL, all.options.in.data = FALSE, na.contain = FALSE, neg.values = TRUE, print = TRUE, fun.name = NULL){ - # AIM - # check the class, type, mode and length of the data argument - # mainly used to check the arguments of other functions - # check also other kind of data parameters, is it a proportion? Is it type double but numbers without decimal part? - # if options = NULL, then at least class, type, mode or length must be non null - # if options is non null, then class, type and mode must be NULL, and length can be NULL or specified - # REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION - # none - # ARGUMENTS - # data: object to test - # data.name: name of the object to test. If NULL, use the name of the object assigned to the data argument - # class: one of the class() result or "vector" - # typeof: one of the typeof() result - # mode: one of the mode() result (for non vector object) - # length: length of the object - # prop: logical, are the numeric values between 0 and 1 (proportion)? - # double.as.integer.allowed: logical. If TRUE, no error is reported if argument is set to typeof = "integer" or class = "integer", while the reality is typeof = "double" or class = "numeric" but the numbers have a zero as modulo (remainder of a division). This means that i<-1 , which is typeof(i) -> "double" is considered as integer with double.as.integer.allowed = TRUE - # options: a vector of possible values for data - # all.options.in.data: If TRUE, all of the options must be present at least once in data, and nothing else. If FALSE, some of the options must be present in data, and nothing else - # na.contain: can data contains NA? - # neg.values: are negative numeric values authorized? BEWARE: only considered if set to FALSE, to check for non negative values when class is set to "numeric", "matrix", "array", "data.frame", "table", or typeof is set to "double", "integer", or mode is set to "numeric" - # print: print the error message if $problem is TRUE? - # fun.name: name of the function when fun_check() is used to check its argument. If non NULL, name will be added into the error message returned by fun_check() - # RETURN - # a list containing: - # $problem: logical. Is there any problem detected ? - # $text: the problem detected - # $param.name: name of the checked parameter - # EXAMPLES - # test <- 1:3 ; fun_check(data = test, data.name = NULL, print = TRUE, options = NULL, all.options.in.data = FALSE, class = NULL, typeof = NULL, mode = NULL, prop = TRUE, double.as.integer.allowed = FALSE, length = NULL) - # test <- 1:3 ; fun_check(data = test, print = TRUE, class = "numeric", typeof = NULL, double.as.integer.allowed = FALSE) - # test <- 1:3 ; fun_check(data = test, print = TRUE, class = "vector", mode = "numeric") - # test <- matrix(1:3) ; fun_check(data = test, print = TRUE, class = "vector", mode = "numeric") - # DEBUGGING - # data = expression(TEST) ; data.name = NULL ; class = "vector" ; typeof = NULL ; mode = NULL ; length = 1 ; prop = NULL ; double.as.integer.allowed = FALSE ; options = NULL ; all.options.in.data = FALSE ; na.contain = FALSE ; neg.values = TRUE ; print = TRUE ; fun.name = NULL - # function name: no used in this function for the error message, to avoid env colliding - # argument checking - if( ! is.null(data.name)){ - if( ! (length(data.name) == 1 & class(data.name) == "character")){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): data.name ARGUMENT MUST BE A SINGLE CHARACTER ELEMENT AND NOT ", paste(data.name, collapse = " "), "\n\n================\n\n") - stop(tempo.cat) - } - } - if(is.null(options) & is.null(class) & is.null(typeof) & is.null(mode) & is.null(prop) & is.null(length)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): AT LEAST ONE OF THE options, class, typeof, mode, prop, OR length ARGUMENT MUST BE SPECIFIED\n\n================\n\n") - stop(tempo.cat) - } - if( ! is.null(options) & ( ! is.null(class) | ! is.null(typeof) | ! is.null(mode) | ! is.null(prop))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): THE class, typeof, mode AND prop ARGUMENTS MUST BE NULL IF THE option ARGUMENT IS SPECIFIED\nTHE option ARGUMENT MUST BE NULL IF THE class AND/OR typeof AND/OR mode AND/OR prop ARGUMENT IS SPECIFIED\n\n================\n\n") - stop(tempo.cat) - } - if( ! (all(class(neg.values) == "logical") & length(neg.values) == 1 & any(is.na(neg.values)) != TRUE)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): THE neg.values ARGUMENT MUST BE TRUE OR FALSE ONLY\n\n================\n\n") - stop(tempo.cat) - } - if(neg.values == FALSE & is.null(class) & is.null(typeof) & is.null(mode)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): THE neg.values ARGUMENT CANNOT BE SWITCHED TO FALSE IF class, typeof AND mode ARGUMENTS ARE NULL\n\n================\n\n") - stop(tempo.cat) - } - if( ! is.null(class)){ - if( ! all(class %in% c("vector", "logical", "integer", "numeric", "complex", "character", "matrix", "array", "data.frame", "list", "factor", "table", "expression", "name", "symbol", "function", "uneval") & any(is.na(class)) != TRUE)){ # not length == 1 here because ordered factors are class "factor" "ordered" (length == 2) - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): class ARGUMENT MUST BE ONE OF THESE VALUE:\n\"vector\", \"logical\", \"integer\", \"numeric\", \"complex\", \"character\", \"matrix\", \"array\", \"data.frame\", \"list\", \"factor\", \"table\", \"expression\", \"name\", \"symbol\", \"function\" \n\n================\n\n") - stop(tempo.cat) - } - if(neg.values == FALSE & ! any(class %in% c("vector", "numeric", "integer", "matrix", "array", "data.frame", "table"))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): class ARGUMENT CANNOT BE OTHER THAN \"vector\", \"numeric\", \"integer\", \"matrix\", \"array\", \"data.frame\", \"table\" IF neg.values ARGUMENT IS SWITCHED TO FALSE\n\n================\n\n") - stop(tempo.cat) - } - } - if( ! is.null(typeof)){ - if( ! (all(typeof %in% c("logical", "integer", "double", "complex", "character", "list", "expression", "name", "symbol", "closure", "special", "builtin")) & length(typeof) == 1 & any(is.na(typeof)) != TRUE)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): typeof ARGUMENT MUST BE ONE OF THESE VALUE:\n\"logical\", \"integer\", \"double\", \"complex\", \"character\", \"list\", \"expression\", \"name\", \"symbol\", \"closure\", \"special\", \"builtin\" \n\n================\n\n") - stop(tempo.cat) - } - if(neg.values == FALSE & ! typeof %in% c("double", "integer")){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): typeof ARGUMENT CANNOT BE OTHER THAN \"double\" OR \"integer\" IF neg.values ARGUMENT IS SWITCHED TO FALSE\n\n================\n\n") - stop(tempo.cat) - } - } - if( ! is.null(mode)){ - if( ! (all(mode %in% c("logical", "numeric", "complex", "character", "list", "expression", "name", "symbol", "function")) & length(mode) == 1 & any(is.na(mode)) != TRUE)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): mode ARGUMENT MUST BE ONE OF THESE VALUE:\n\"logical\", \"numeric\", \"complex\", \"character\", \"list\", \"expression\", \"name\", \"symbol\", \"function\"\n\n================\n\n") - stop(tempo.cat) - } - if(neg.values == FALSE & mode != "numeric"){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): mode ARGUMENT CANNOT BE OTHER THAN \"numeric\" IF neg.values ARGUMENT IS SWITCHED TO FALSE\n\n================\n\n") - stop(tempo.cat) - } - } - if( ! is.null(length)){ - if( ! (is.numeric(length) & length(length) == 1 & ! grepl(length, pattern = "\\.") & any(is.na(length)) != TRUE)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): length ARGUMENT MUST BE A SINGLE INTEGER VALUE\n\n================\n\n") - stop(tempo.cat) - } - } - if( ! is.null(prop)){ - if( ! (is.logical(prop) | length(prop) == 1 & any(is.na(prop)) != TRUE)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): prop ARGUMENT MUST BE TRUE OR FALSE ONLY\n\n================\n\n") - stop(tempo.cat) - }else if(prop == TRUE){ - if( ! is.null(class)){ - if( ! any(class %in% c("vector", "numeric", "integer", "matrix", "array", "data.frame", "table"))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): class ARGUMENT CANNOT BE OTHER THAN \"vector\", \"numeric\", \"integer\", \"matrix\", \"array\", \"data.frame\", \"table\" IF prop ARGUMENT IS TRUE\n\n================\n\n") - stop(tempo.cat) - } - } - if( ! is.null(mode)){ - if(mode != "numeric"){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): mode ARGUMENT CANNOT BE OTHER THAN \"numeric\" IF prop ARGUMENT IS TRUE\n\n================\n\n") - stop(tempo.cat) - } - } - if( ! is.null(typeof)){ - if(typeof != "double"){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): typeof ARGUMENT CANNOT BE OTHER THAN \"double\" IF prop ARGUMENT IS TRUE\n\n================\n\n") - stop(tempo.cat) - } - } - } - } - if( ! (all(class(double.as.integer.allowed) == "logical") & length(double.as.integer.allowed) == 1 & any(is.na(double.as.integer.allowed)) != TRUE)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): THE double.as.integer.allowed ARGUMENT MUST BE TRUE OR FALSE ONLY: ", paste(double.as.integer.allowed, collapse = " "), "\n\n================\n\n") - stop(tempo.cat) - } - if( ! (is.logical(all.options.in.data) & length(all.options.in.data) == 1 & any(is.na(all.options.in.data)) != TRUE)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): all.options.in.data ARGUMENT MUST BE A SINGLE LOGICAL VALUE (TRUE OR FALSE ONLY): ", paste(all.options.in.data, collapse = " "), "\n\n================\n\n") - stop(tempo.cat) - } - if( ! (all(class(na.contain) == "logical") & length(na.contain) == 1 & any(is.na(na.contain)) != TRUE)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): THE na.contain ARGUMENT MUST BE TRUE OR FALSE ONLY: ", paste(na.contain, collapse = " "), "\n\n================\n\n") - stop(tempo.cat) - } - if( ! (all(class(print) == "logical") & length(print) == 1 & any(is.na(print)) != TRUE)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): THE print ARGUMENT MUST BE TRUE OR FALSE ONLY: ", paste(print, collapse = " "), "\n\n================\n\n") - stop(tempo.cat) - } - if( ! is.null(fun.name)){ - if( ! (class(fun.name) == "character" & length(fun.name) == 1)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): THE fun.name ARGUMENT MUST BE A CHARACTER VECTOR OF LENGTH 1: ", paste(fun.name, collapse = " "), "\n\n================\n\n") - stop(tempo.cat) - } - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) # activate this line and use the function to check arguments status - # end argument checking - # main code - if(is.null(data.name)){ - data.name <- deparse(substitute(data)) - } - problem <- FALSE - text <- paste0(ifelse(is.null(fun.name), "", paste0("IN ", fun.name, ": ")), "NO PROBLEM DETECTED FOR THE ", data.name, " PARAMETER") - if( ! is.null(options)){ - text <- "" - if( ! all(data %in% options)){ - problem <- TRUE - text <- paste0(ifelse(is.null(fun.name), "ERROR", paste0("ERROR IN ", fun.name)), ": THE ", data.name, " PARAMETER MUST BE SOME OF THESE OPTIONS: ", paste(options, collapse = " "), "\nTHE PROBLEMATIC ELEMENTS OF ", data.name, " ARE: ", paste(unique(data[ ! (data %in% options)]), collapse = " ")) - } - if(all.options.in.data == TRUE){ - if( ! all(options %in% data)){ - problem <- TRUE - if(text == ""){ - text <- paste0(ifelse(is.null(fun.name), "ERROR", paste0("ERROR IN ", fun.name)), ": THE ", data.name, " PARAMETER MUST BE SOME OF THESE OPTIONS: ", paste(options, collapse = " "), "\nTHE PROBLEMATIC ELEMENTS OF ", data.name, " ARE: ", unique(data[ ! (data %in% options)])) - }else{ - text <- paste0(text, "\n", ifelse(is.null(fun.name), "ERROR", paste0("ERROR IN ", fun.name)), ": THE ", data.name, " PARAMETER MUST BE SOME OF THESE OPTIONS: ", paste(options, collapse = " "), "\nTHE PROBLEMATIC ELEMENTS OF ", data.name, " ARE: ", unique(data[ ! (data %in% options)])) - } - } - } - if( ! is.null(length)){ - if(length(data) != length){ - problem <- TRUE - if(text == ""){ - text <- paste0(ifelse(is.null(fun.name), "ERROR", paste0("ERROR IN ", fun.name)), ": THE LENGTH OF ", data.name, " MUST BE ", length, " AND NOT ", length(data)) - }else{ - text <- paste0(text, "\n", ifelse(is.null(fun.name), "ERROR", paste0("ERROR IN ", fun.name)), ": THE LENGTH OF ", data.name, " MUST BE ", length, " AND NOT ", length(data)) - } - } - } - if(text == ""){ - text <- paste0(ifelse(is.null(fun.name), "", paste0("IN ", fun.name, ": ")), "NO PROBLEM DETECTED FOR THE ", data.name, " PARAMETER") - } - } - arg.names <- c("class", "typeof", "mode", "length") - if(is.null(options)){ - for(i2 in 1:length(arg.names)){ - if( ! is.null(get(arg.names[i2]))){ - # script to execute - tempo.script <- ' +# AIM +# check the class, type, mode and length of the data argument +# mainly used to check the arguments of other functions +# check also other kind of data parameters, is it a proportion? Is it type double but numbers without decimal part? +# if options = NULL, then at least class, type, mode or length must be non null +# if options is non null, then class, type and mode must be NULL, and length can be NULL or specified +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# none +# ARGUMENTS +# data: object to test +# data.name: name of the object to test. If NULL, use the name of the object assigned to the data argument +# class: one of the class() result or "vector" +# typeof: one of the typeof() result +# mode: one of the mode() result (for non vector object) +# length: length of the object +# prop: logical, are the numeric values between 0 and 1 (proportion)? +# double.as.integer.allowed: logical. If TRUE, no error is reported if argument is set to typeof = "integer" or class = "integer", while the reality is typeof = "double" or class = "numeric" but the numbers have a zero as modulo (remainder of a division). This means that i<-1 , which is typeof(i) -> "double" is considered as integer with double.as.integer.allowed = TRUE +# options: a vector of possible values for data +# all.options.in.data: If TRUE, all of the options must be present at least once in data, and nothing else. If FALSE, some of the options must be present in data, and nothing else +# na.contain: can data contains NA? +# neg.values: are negative numeric values authorized? BEWARE: only considered if set to FALSE, to check for non negative values when class is set to "numeric", "matrix", "array", "data.frame", "table", or typeof is set to "double", "integer", or mode is set to "numeric" +# print: print the error message if $problem is TRUE? See the example section +# fun.name: name of the function when fun_check() is used to check its argument. If non NULL, name will be added into the error message returned by fun_check() +# RETURN +# a list containing: +# $problem: logical. Is there any problem detected ? +# $text: the problem detected +# $param.name: name of the checked parameter +# EXAMPLES +# test <- 1:3 ; fun_check(data = test, data.name = NULL, print = TRUE, options = NULL, all.options.in.data = FALSE, class = NULL, typeof = NULL, mode = NULL, prop = TRUE, double.as.integer.allowed = FALSE, length = NULL) +# test <- 1:3 ; fun_check(data = test, print = TRUE, class = "numeric", typeof = NULL, double.as.integer.allowed = FALSE) +# test <- 1:3 ; fun_check(data = test, print = TRUE, class = "vector", mode = "numeric") +# argument print with and without assignation +# test <- 1:3 ; tempo <- fun_check(data = test, print = TRUE, class = "vector", mode = "character") +# test <- 1:3 ; tempo <- fun_check(data = test, print = FALSE, class = "vector", mode = "character") # the assignation allows to recover a problem without printing it +# test <- 1:3 ; fun_check(data = test, print = TRUE, class = "vector", mode = "character") +# test <- matrix(1:3) ; fun_check(data = test, print = TRUE, class = "vector", mode = "numeric") +# DEBUGGING +# data = expression(TEST) ; data.name = NULL ; class = "vector" ; typeof = NULL ; mode = NULL ; length = 1 ; prop = NULL ; double.as.integer.allowed = FALSE ; options = NULL ; all.options.in.data = FALSE ; na.contain = FALSE ; neg.values = TRUE ; print = TRUE ; fun.name = NULL +# function name: no used in this function for the error message, to avoid env colliding +# argument checking +if( ! is.null(data.name)){ +if( ! (length(data.name) == 1 & class(data.name) == "character")){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): data.name ARGUMENT MUST BE A SINGLE CHARACTER ELEMENT AND NOT ", paste(data.name, collapse = " "), "\n\n================\n\n") +stop(tempo.cat) +} +} +if(is.null(options) & is.null(class) & is.null(typeof) & is.null(mode) & is.null(prop) & is.null(length)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): AT LEAST ONE OF THE options, class, typeof, mode, prop, OR length ARGUMENT MUST BE SPECIFIED\n\n================\n\n") +stop(tempo.cat) +} +if( ! is.null(options) & ( ! is.null(class) | ! is.null(typeof) | ! is.null(mode) | ! is.null(prop))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): THE class, typeof, mode AND prop ARGUMENTS MUST BE NULL IF THE option ARGUMENT IS SPECIFIED\nTHE option ARGUMENT MUST BE NULL IF THE class AND/OR typeof AND/OR mode AND/OR prop ARGUMENT IS SPECIFIED\n\n================\n\n") +stop(tempo.cat) +} +if( ! (all(class(neg.values) == "logical") & length(neg.values) == 1 & any(is.na(neg.values)) != TRUE)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): THE neg.values ARGUMENT MUST BE TRUE OR FALSE ONLY\n\n================\n\n") +stop(tempo.cat) +} +if(neg.values == FALSE & is.null(class) & is.null(typeof) & is.null(mode)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): THE neg.values ARGUMENT CANNOT BE SWITCHED TO FALSE IF class, typeof AND mode ARGUMENTS ARE NULL\n\n================\n\n") +stop(tempo.cat) +} +if( ! is.null(class)){ +if( ! all(class %in% c("vector", "logical", "integer", "numeric", "complex", "character", "matrix", "array", "data.frame", "list", "factor", "table", "expression", "name", "symbol", "function", "uneval") & any(is.na(class)) != TRUE)){ # not length == 1 here because ordered factors are class "factor" "ordered" (length == 2) +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): class ARGUMENT MUST BE ONE OF THESE VALUE:\n\"vector\", \"logical\", \"integer\", \"numeric\", \"complex\", \"character\", \"matrix\", \"array\", \"data.frame\", \"list\", \"factor\", \"table\", \"expression\", \"name\", \"symbol\", \"function\" \n\n================\n\n") +stop(tempo.cat) +} +if(neg.values == FALSE & ! any(class %in% c("vector", "numeric", "integer", "matrix", "array", "data.frame", "table"))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): class ARGUMENT CANNOT BE OTHER THAN \"vector\", \"numeric\", \"integer\", \"matrix\", \"array\", \"data.frame\", \"table\" IF neg.values ARGUMENT IS SWITCHED TO FALSE\n\n================\n\n") +stop(tempo.cat) +} +} +if( ! is.null(typeof)){ +if( ! (all(typeof %in% c("logical", "integer", "double", "complex", "character", "list", "expression", "name", "symbol", "closure", "special", "builtin")) & length(typeof) == 1 & any(is.na(typeof)) != TRUE)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): typeof ARGUMENT MUST BE ONE OF THESE VALUE:\n\"logical\", \"integer\", \"double\", \"complex\", \"character\", \"list\", \"expression\", \"name\", \"symbol\", \"closure\", \"special\", \"builtin\" \n\n================\n\n") +stop(tempo.cat) +} +if(neg.values == FALSE & ! typeof %in% c("double", "integer")){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): typeof ARGUMENT CANNOT BE OTHER THAN \"double\" OR \"integer\" IF neg.values ARGUMENT IS SWITCHED TO FALSE\n\n================\n\n") +stop(tempo.cat) +} +} +if( ! is.null(mode)){ +if( ! (all(mode %in% c("logical", "numeric", "complex", "character", "list", "expression", "name", "symbol", "function")) & length(mode) == 1 & any(is.na(mode)) != TRUE)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): mode ARGUMENT MUST BE ONE OF THESE VALUE:\n\"logical\", \"numeric\", \"complex\", \"character\", \"list\", \"expression\", \"name\", \"symbol\", \"function\"\n\n================\n\n") +stop(tempo.cat) +} +if(neg.values == FALSE & mode != "numeric"){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): mode ARGUMENT CANNOT BE OTHER THAN \"numeric\" IF neg.values ARGUMENT IS SWITCHED TO FALSE\n\n================\n\n") +stop(tempo.cat) +} +} +if( ! is.null(length)){ +if( ! (is.numeric(length) & length(length) == 1 & ! grepl(length, pattern = "\\.") & any(is.na(length)) != TRUE)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): length ARGUMENT MUST BE A SINGLE INTEGER VALUE\n\n================\n\n") +stop(tempo.cat) +} +} +if( ! is.null(prop)){ +if( ! (is.logical(prop) | length(prop) == 1 & any(is.na(prop)) != TRUE)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): prop ARGUMENT MUST BE TRUE OR FALSE ONLY\n\n================\n\n") +stop(tempo.cat) +}else if(prop == TRUE){ +if( ! is.null(class)){ +if( ! any(class %in% c("vector", "numeric", "integer", "matrix", "array", "data.frame", "table"))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): class ARGUMENT CANNOT BE OTHER THAN \"vector\", \"numeric\", \"integer\", \"matrix\", \"array\", \"data.frame\", \"table\" IF prop ARGUMENT IS TRUE\n\n================\n\n") +stop(tempo.cat) +} +} +if( ! is.null(mode)){ +if(mode != "numeric"){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): mode ARGUMENT CANNOT BE OTHER THAN \"numeric\" IF prop ARGUMENT IS TRUE\n\n================\n\n") +stop(tempo.cat) +} +} +if( ! is.null(typeof)){ +if(typeof != "double"){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): typeof ARGUMENT CANNOT BE OTHER THAN \"double\" IF prop ARGUMENT IS TRUE\n\n================\n\n") +stop(tempo.cat) +} +} +} +} +if( ! (all(class(double.as.integer.allowed) == "logical") & length(double.as.integer.allowed) == 1 & any(is.na(double.as.integer.allowed)) != TRUE)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): THE double.as.integer.allowed ARGUMENT MUST BE TRUE OR FALSE ONLY: ", paste(double.as.integer.allowed, collapse = " "), "\n\n================\n\n") +stop(tempo.cat) +} +if( ! (is.logical(all.options.in.data) & length(all.options.in.data) == 1 & any(is.na(all.options.in.data)) != TRUE)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): all.options.in.data ARGUMENT MUST BE A SINGLE LOGICAL VALUE (TRUE OR FALSE ONLY): ", paste(all.options.in.data, collapse = " "), "\n\n================\n\n") +stop(tempo.cat) +} +if( ! (all(class(na.contain) == "logical") & length(na.contain) == 1 & any(is.na(na.contain)) != TRUE)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): THE na.contain ARGUMENT MUST BE TRUE OR FALSE ONLY: ", paste(na.contain, collapse = " "), "\n\n================\n\n") +stop(tempo.cat) +} +if( ! (all(class(print) == "logical") & length(print) == 1 & any(is.na(print)) != TRUE)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): THE print ARGUMENT MUST BE TRUE OR FALSE ONLY: ", paste(print, collapse = " "), "\n\n================\n\n") +stop(tempo.cat) +} +if( ! is.null(fun.name)){ +if( ! (class(fun.name) == "character" & length(fun.name) == 1)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_check(): THE fun.name ARGUMENT MUST BE A CHARACTER VECTOR OF LENGTH 1: ", paste(fun.name, collapse = " "), "\n\n================\n\n") +stop(tempo.cat) +} +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) # activate this line and use the function to check arguments status +# end argument checking +# main code +if(is.null(data.name)){ +data.name <- deparse(substitute(data)) +} +problem <- FALSE +text <- paste0(ifelse(is.null(fun.name), "", paste0("IN ", fun.name, ": ")), "NO PROBLEM DETECTED FOR THE ", data.name, " PARAMETER") +if( ! is.null(options)){ +text <- "" +if( ! all(data %in% options)){ +problem <- TRUE +text <- paste0(ifelse(is.null(fun.name), "ERROR", paste0("ERROR IN ", fun.name)), ": THE ", data.name, " PARAMETER MUST BE SOME OF THESE OPTIONS: ", paste(options, collapse = " "), "\nTHE PROBLEMATIC ELEMENTS OF ", data.name, " ARE: ", paste(unique(data[ ! (data %in% options)]), collapse = " ")) +} +if(all.options.in.data == TRUE){ +if( ! all(options %in% data)){ +problem <- TRUE +if(text == ""){ +text <- paste0(ifelse(is.null(fun.name), "ERROR", paste0("ERROR IN ", fun.name)), ": THE ", data.name, " PARAMETER MUST BE SOME OF THESE OPTIONS: ", paste(options, collapse = " "), "\nTHE PROBLEMATIC ELEMENTS OF ", data.name, " ARE: ", unique(data[ ! (data %in% options)])) +}else{ +text <- paste0(text, "\n", ifelse(is.null(fun.name), "ERROR", paste0("ERROR IN ", fun.name)), ": THE ", data.name, " PARAMETER MUST BE SOME OF THESE OPTIONS: ", paste(options, collapse = " "), "\nTHE PROBLEMATIC ELEMENTS OF ", data.name, " ARE: ", unique(data[ ! (data %in% options)])) +} +} +} +if( ! is.null(length)){ +if(length(data) != length){ +problem <- TRUE +if(text == ""){ +text <- paste0(ifelse(is.null(fun.name), "ERROR", paste0("ERROR IN ", fun.name)), ": THE LENGTH OF ", data.name, " MUST BE ", length, " AND NOT ", length(data)) +}else{ +text <- paste0(text, "\n", ifelse(is.null(fun.name), "ERROR", paste0("ERROR IN ", fun.name)), ": THE LENGTH OF ", data.name, " MUST BE ", length, " AND NOT ", length(data)) +} +} +} +if(text == ""){ +text <- paste0(ifelse(is.null(fun.name), "", paste0("IN ", fun.name, ": ")), "NO PROBLEM DETECTED FOR THE ", data.name, " PARAMETER") +} +} +arg.names <- c("class", "typeof", "mode", "length") +if(is.null(options)){ +for(i2 in 1:length(arg.names)){ +if( ! is.null(get(arg.names[i2]))){ +# script to execute +tempo.script <- ' problem <- TRUE ; if(identical(text, paste0(ifelse(is.null(fun.name), "", paste0("IN ", fun.name, ": ")), "NO PROBLEM DETECTED FOR THE ", data.name, " PARAMETER"))){ text <- paste0(ifelse(is.null(fun.name), "ERROR", paste0("ERROR IN ", fun.name)), ": THE ", data.name, " PARAMETER MUST BE ") ; @@ -277,57 +282,57 @@ text <- paste0(text, " AND "); } text <- paste0(text, toupper(arg.names[i2]), " ", get(arg.names[i2])) ' - # end script to execute - if(typeof(data) == "double" & double.as.integer.allowed == TRUE & ((arg.names[i2] == "class" & get(arg.names[i2]) == "integer") | (arg.names[i2] == "typeof" & get(arg.names[i2]) == "integer"))){ - if(! all(data%%1 == 0)){ # to check integers (use %%, meaning the remaining of a division): see the precedent line - eval(parse(text = tempo.script)) # execute tempo.script - } - }else if(get(arg.names[i2]) != "vector" & eval(parse(text = paste0(arg.names[i2], "(data)"))) != get(arg.names[i2])){ - eval(parse(text = tempo.script)) # execute tempo.script - }else if(arg.names[i2] == "class" & get(arg.names[i2]) == "vector" & ! (class(data) == "numeric" | class(data) == "integer" | class(data) == "character" | class(data) == "logical")){ - eval(parse(text = tempo.script)) # execute tempo.script - } - } - } - } +# end script to execute +if(typeof(data) == "double" & double.as.integer.allowed == TRUE & ((arg.names[i2] == "class" & get(arg.names[i2]) == "integer") | (arg.names[i2] == "typeof" & get(arg.names[i2]) == "integer"))){ +if(! all(data%%1 == 0)){ # to check integers (use %%, meaning the remaining of a division): see the precedent line +eval(parse(text = tempo.script)) # execute tempo.script +} +}else if(get(arg.names[i2]) != "vector" & eval(parse(text = paste0(arg.names[i2], "(data)"))) != get(arg.names[i2])){ +eval(parse(text = tempo.script)) # execute tempo.script +}else if(arg.names[i2] == "class" & get(arg.names[i2]) == "vector" & ! (class(data) == "numeric" | class(data) == "integer" | class(data) == "character" | class(data) == "logical")){ +eval(parse(text = tempo.script)) # execute tempo.script +} +} +} +} if( ! is.null(prop)){ - if(prop == TRUE){ - if(any(data < 0 | data > 1, na.rm = TRUE)){ - problem <- TRUE - if(identical(text, paste0(ifelse(is.null(fun.name), "", paste0("IN ", fun.name, ": ")), "NO PROBLEM DETECTED FOR THE ", data.name, " PARAMETER"))){ - text <- paste0(ifelse(is.null(fun.name), "ERROR", paste0("ERROR IN ", fun.name)), ": ") - }else{ - text <- paste0(text, " AND ") - } - text <- paste0(text, "THE ", data.name, " PARAMETER MUST BE DECIMAL VALUES BETWEEN 0 AND 1") - } - } +if(prop == TRUE){ +if(any(data < 0 | data > 1, na.rm = TRUE)){ +problem <- TRUE +if(identical(text, paste0(ifelse(is.null(fun.name), "", paste0("IN ", fun.name, ": ")), "NO PROBLEM DETECTED FOR THE ", data.name, " PARAMETER"))){ +text <- paste0(ifelse(is.null(fun.name), "ERROR", paste0("ERROR IN ", fun.name)), ": ") +}else{ +text <- paste0(text, " AND ") +} +text <- paste0(text, "THE ", data.name, " PARAMETER MUST BE DECIMAL VALUES BETWEEN 0 AND 1") +} +} } if(all(class(data) %in% "expression")){ - data <- as.character(data) # to evaluate the presence of NA +data <- as.character(data) # to evaluate the presence of NA } if(na.contain == FALSE & any(is.na(data)) == TRUE){ - problem <- TRUE - if(identical(text, paste0(ifelse(is.null(fun.name), "", paste0("IN ", fun.name, ": ")), "NO PROBLEM DETECTED FOR THE ", data.name, " PARAMETER"))){ - text <- paste0(ifelse(is.null(fun.name), "ERROR", paste0("ERROR IN ", fun.name)), ": ") - }else{ - text <- paste0(text, " AND ") - } - text <- paste0(text, "THE ", data.name, " PARAMETER CONTAINS NA WHILE NOT AUTHORIZED (na.contain ARGUMENT SET TO FALSE)") +problem <- TRUE +if(identical(text, paste0(ifelse(is.null(fun.name), "", paste0("IN ", fun.name, ": ")), "NO PROBLEM DETECTED FOR THE ", data.name, " PARAMETER"))){ +text <- paste0(ifelse(is.null(fun.name), "ERROR", paste0("ERROR IN ", fun.name)), ": ") +}else{ +text <- paste0(text, " AND ") +} +text <- paste0(text, "THE ", data.name, " PARAMETER CONTAINS NA WHILE NOT AUTHORIZED (na.contain ARGUMENT SET TO FALSE)") } if(neg.values == FALSE){ - if(any(data < 0, na.rm = TRUE)){ - problem <- TRUE - if(identical(text, paste0(ifelse(is.null(fun.name), "", paste0("IN ", fun.name, ": ")), "NO PROBLEM DETECTED FOR THE ", data.name, " PARAMETER"))){ - text <- paste0(ifelse(is.null(fun.name), "ERROR", paste0("ERROR IN ", fun.name)), ": ") - }else{ - text <- paste0(text, " AND ") - } - text <- paste0(text, "THE ", data.name, " PARAMETER MUST BE NON NEGATIVE NUMERIC VALUES") - } +if(any(data < 0, na.rm = TRUE)){ +problem <- TRUE +if(identical(text, paste0(ifelse(is.null(fun.name), "", paste0("IN ", fun.name, ": ")), "NO PROBLEM DETECTED FOR THE ", data.name, " PARAMETER"))){ +text <- paste0(ifelse(is.null(fun.name), "ERROR", paste0("ERROR IN ", fun.name)), ": ") +}else{ +text <- paste0(text, " AND ") +} +text <- paste0(text, "THE ", data.name, " PARAMETER MUST BE NON NEGATIVE NUMERIC VALUES") +} } if(print == TRUE & problem == TRUE){ - cat(paste0("\n\n================\n\n", text, "\n\n================\n\n")) +cat(paste0("\n\n================\n\n", text, "\n\n================\n\n")) } output <- list(problem = problem, text = text, param.name = data.name) return(output) @@ -339,89 +344,89 @@ return(output) # Check OK: clear to go Apollo fun_info <- function(data){ - # AIM - # provide a full description of an object - # REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION - # none - # ARGUMENTS - # data: object to test - # RETURN - # a list containing the info - # please, use names(fun_info()) and remove what can be too big for easy analysis - # EXAMPLES - # fun_info(data = 1:3) - # fun_info(data.frame(a = 1:2, b = ordered(factor(c("A", "B"))))) - # fun_info(list(a = 1:3, b = ordered(factor(c("A", "B"))))) - # DEBUGGING - # data = NULL # for function debugging - # data = 1:3 # for function debugging - # data = matrix(1:3) # for function debugging - # data = data.frame(a = 1:2, b = c("A", "B")) # for function debugging - # data = factor(c("b", "a")) # for function debugging - # data = ordered(factor(c("b", "a"))) # for function debugging - # data = list(a = 1:3, b = factor(c("A", "B"))) # for function debugging - # data = list(a = 1:3, b = ordered(factor(c("A", "B")))) # for function debugging - # function name: no need because no check and no message - # argument checking - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) # activate this line and use the function to check arguments status - # end argument checking - # main code - data.name <- deparse(substitute(data)) - output <- list("NAME" = data.name) - tempo <- list("CLASS" = class(data)) - output <- c(output, tempo) - tempo <- list("TYPE" = typeof(data)) - output <- c(output, tempo) - tempo <- list("HEAD" = head(data)) - output <- c(output, tempo) - if( ! is.null(data)){ - tempo <- list("TAIL" = tail(data)) - output <- c(output, tempo) - if( ! is.null(dim(data))){ - tempo <- list("DIMENSION" = dim(data)) - names(tempo[[1]]) <- c("NROW", "NCOL") - output <- c(output, tempo) - } - tempo <- list("SUMMARY" = summary(data)) - output <- c(output, tempo) - } - if(all(class(data) == "data.frame" | class(data) == "matrix")){ - tempo <- list("ROW_NAMES" = dimnames(data)[[1]]) - output <- c(output, tempo) - tempo <- list("COLUM_NAMES" = dimnames(data)[[2]]) - output <- c(output, tempo) - } - if(all(class(data) == "data.frame")){ - tempo <- list("STRUCTURE" = ls.str(data)) - output <- c(output, tempo) - tempo <- list("COLUMN_TYPE" = sapply(data, FUN = "typeof")) - if(any(sapply(data, FUN = "class") %in% "factor")){ # if an ordered factor is present, then sapply(data, FUN = "class") return a list but works with any(sapply(data, FUN = "class") %in% "factor") - tempo.class <- sapply(data, FUN = "class") - if(any(unlist(tempo.class) %in% "ordered")){ - tempo2 <- sapply(tempo.class, paste, collapse = " ") # paste the "ordered" factor" in "ordered factor" - }else{ - tempo2 <- unlist(tempo.class) - } - tempo[["COLUMN_TYPE"]][grepl(x = tempo2, pattern = "factor")] <- tempo2[grepl(x = tempo2, pattern = "factor")] - } - output <- c(output, tempo) - } - if(all(class(data) == "list")){ - tempo <- list("COMPARTMENT_NAMES" = names(data)) - output <- c(output, tempo) - tempo <- list("COMPARTMENT_TYPE" = sapply(data, FUN = "typeof")) - if(any(unlist(sapply(data, FUN = "class")) %in% "factor")){ # if an ordered factor is present, then sapply(data, FUN = "class") return a list but works with any(sapply(data, FUN = "class") %in% "factor") - tempo.class <- sapply(data, FUN = "class") - if(any(unlist(tempo.class) %in% "ordered")){ - tempo2 <- sapply(tempo.class, paste, collapse = " ") # paste the "ordered" factor" in "ordered factor" - }else{ - tempo2 <- unlist(tempo.class) - } - tempo[["COMPARTMENT_TYPE"]][grepl(x = tempo2, pattern = "factor")] <- tempo2[grepl(x = tempo2, pattern = "factor")] - } - output <- c(output, tempo) - } - return(output) +# AIM +# provide a full description of an object +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# none +# ARGUMENTS +# data: object to test +# RETURN +# a list containing the info +# please, use names(fun_info()) and remove what can be too big for easy analysis +# EXAMPLES +# fun_info(data = 1:3) +# fun_info(data.frame(a = 1:2, b = ordered(factor(c("A", "B"))))) +# fun_info(list(a = 1:3, b = ordered(factor(c("A", "B"))))) +# DEBUGGING +# data = NULL # for function debugging +# data = 1:3 # for function debugging +# data = matrix(1:3) # for function debugging +# data = data.frame(a = 1:2, b = c("A", "B")) # for function debugging +# data = factor(c("b", "a")) # for function debugging +# data = ordered(factor(c("b", "a"))) # for function debugging +# data = list(a = 1:3, b = factor(c("A", "B"))) # for function debugging +# data = list(a = 1:3, b = ordered(factor(c("A", "B")))) # for function debugging +# function name: no need because no check and no message +# argument checking +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) # activate this line and use the function to check arguments status +# end argument checking +# main code +data.name <- deparse(substitute(data)) +output <- list("NAME" = data.name) +tempo <- list("CLASS" = class(data)) +output <- c(output, tempo) +tempo <- list("TYPE" = typeof(data)) +output <- c(output, tempo) +tempo <- list("HEAD" = head(data)) +output <- c(output, tempo) +if( ! is.null(data)){ +tempo <- list("TAIL" = tail(data)) +output <- c(output, tempo) +if( ! is.null(dim(data))){ +tempo <- list("DIMENSION" = dim(data)) +names(tempo[[1]]) <- c("NROW", "NCOL") +output <- c(output, tempo) +} +tempo <- list("SUMMARY" = summary(data)) +output <- c(output, tempo) +} +if(all(class(data) == "data.frame" | class(data) == "matrix")){ +tempo <- list("ROW_NAMES" = dimnames(data)[[1]]) +output <- c(output, tempo) +tempo <- list("COLUM_NAMES" = dimnames(data)[[2]]) +output <- c(output, tempo) +} +if(all(class(data) == "data.frame")){ +tempo <- list("STRUCTURE" = ls.str(data)) +output <- c(output, tempo) +tempo <- list("COLUMN_TYPE" = sapply(data, FUN = "typeof")) +if(any(sapply(data, FUN = "class") %in% "factor")){ # if an ordered factor is present, then sapply(data, FUN = "class") return a list but works with any(sapply(data, FUN = "class") %in% "factor") +tempo.class <- sapply(data, FUN = "class") +if(any(unlist(tempo.class) %in% "ordered")){ +tempo2 <- sapply(tempo.class, paste, collapse = " ") # paste the "ordered" factor" in "ordered factor" +}else{ +tempo2 <- unlist(tempo.class) +} +tempo[["COLUMN_TYPE"]][grepl(x = tempo2, pattern = "factor")] <- tempo2[grepl(x = tempo2, pattern = "factor")] +} +output <- c(output, tempo) +} +if(all(class(data) == "list")){ +tempo <- list("COMPARTMENT_NAMES" = names(data)) +output <- c(output, tempo) +tempo <- list("COMPARTMENT_TYPE" = sapply(data, FUN = "typeof")) +if(any(unlist(sapply(data, FUN = "class")) %in% "factor")){ # if an ordered factor is present, then sapply(data, FUN = "class") return a list but works with any(sapply(data, FUN = "class") %in% "factor") +tempo.class <- sapply(data, FUN = "class") +if(any(unlist(tempo.class) %in% "ordered")){ +tempo2 <- sapply(tempo.class, paste, collapse = " ") # paste the "ordered" factor" in "ordered factor" +}else{ +tempo2 <- unlist(tempo.class) +} +tempo[["COMPARTMENT_TYPE"]][grepl(x = tempo2, pattern = "factor")] <- tempo2[grepl(x = tempo2, pattern = "factor")] +} +output <- c(output, tempo) +} +return(output) } @@ -430,214 +435,214 @@ fun_info <- function(data){ # Check OK: clear to go Apollo fun_1d_comp <- function(data1, data2){ - # AIM - # compare two 1D datasets (vector of factor or 1D table) of the same class or not. Check and report in a list if the 2 datasets have: - # same class - # common elements - # common element names (except factors) - # common levels (factors only) - # REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION - # none - # ARGUMENTS - # data1: vector or factor or 1D table - # data2: vector or factor or 1D table - # RETURN - # a list containing: - # $same.class: logical. Are class identical? - # $class: class of the 2 datasets (NULL otherwise) - # $same.length: logical. Are number of elements identical? - # $length: number of elements in the 2 datasets (NULL otherwise) - # $same.levels: logical. Are levels identical? (NULL if data1 and data2 are not factors) - # $levels: levels of the 2 datasets if identical (NULL otherwise or NULL if data1 and data2 are not factors) - # $any.id.levels: logical. Is there any identical levels? (NULL if data1 and data2 are not factors) - # $same.levels.pos1: position, in data1, of the levels identical in data2 (NULL if data1 and data2 are not factors) - # $same.levels.pos2: position, in data2, of the levels identical in data1 (NULL if data1 and data2 are not factors) - # $common.levels: common levels between data1 and data2 (can be a subset of $levels or not). NULL if no common levels or if data1 and data2 are not factors - # $same.name: logical. Are element names identical ? - # $name: name of elements of the 2 datasets if identical (NULL otherwise) - # $any.id.name: logical. Is there any element names identical ? - # $same.name.pos1: position, in data1, of the element names identical in data2 - # $same.name.pos2: position, in data2, of the elements names identical in data1 - # $common.names: common element names between data1 and data2 (can be a subset of $name or not). NULL if no common element names - # $any.id.element: logical. is there any identical elements ? - # $same.element.pos1: position, in data1, of the elements identical in data2 - # $same.element.pos2: position, in data2, of the elements identical in data1 - # $common.elements: common elements between data1 and data2. NULL if no common elements - # $identical.object: logical. Are objects identical (kind of object, element names and content)? - # $identical.content: logical. Are content objects identical (identical elements excluding kind of object and element names)? - # EXAMPLES - # obs1 = 1:5 ; obs2 = 1:5 ; names(obs1) <- LETTERS[1:5] ; names(obs2) <- LETTERS[1:5] ; fun_1d_comp(obs1, obs2) - # obs1 = 1:5 ; obs2 = 1:5 ; names(obs1) <- LETTERS[1:5] ; fun_1d_comp(obs1, obs2) - # obs1 = 1:5 ; obs2 = 3:6 ; names(obs1) <- LETTERS[1:5] ; names(obs2) <- LETTERS[1:4] ; fun_1d_comp(obs1, obs2) - # obs1 = factor(LETTERS[1:5]) ; obs2 = factor(LETTERS[1:5]) ; fun_1d_comp(obs1, obs2) - # obs1 = factor(LETTERS[1:5]) ; obs2 = factor(LETTERS[10:11]) ; fun_1d_comp(obs1, obs2) - # obs1 = factor(LETTERS[1:5]) ; obs2 = factor(LETTERS[4:7]) ; fun_1d_comp(obs1, obs2) - # obs1 = 1:5 ; obs2 = factor(LETTERS[1:5]) ; fun_1d_comp(obs1, obs2) - # obs1 = 1:5 ; obs2 = 1.1:6.1 ; fun_1d_comp(obs1, obs2) - # obs1 = as.table(1:5); obs2 = as.table(1:5) ; fun_1d_comp(obs1, obs2) - # obs1 = as.table(1:5); obs2 = 1:5 ; fun_1d_comp(obs1, obs2) - # DEBUGGING - # data1 = 1:5 ; data2 = 1:5 ; names(data1) <- LETTERS[1:5] ; names(data2) <- LETTERS[1:5] # for function debugging - # function name - function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") - # end function name - # argument checking - if( ! any(class(data1) %in% c("logical", "integer", "numeric", "character", "factor", "table"))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data1 ARGUMENT MUST BE A NON NULL VECTOR, FACTOR OR 1D TABLE\n\n================\n\n") - stop(tempo.cat) - }else if(all(class(data1) %in% "table")){ - if(length(dim(data1)) > 1){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data1 ARGUMENT MUST BE A 1D TABLE\n\n================\n\n") - stop(tempo.cat) - } - } - if( ! any(class(data2) %in% c("logical", "integer", "numeric", "character", "factor", "table"))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data2 ARGUMENT MUST BE A NON NULL VECTOR, FACTOR OR 1D TABLE\n\n================\n\n") - stop(tempo.cat) - }else if(all(class(data2) %in% "table")){ - if(length(dim(data2)) > 1){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data2 ARGUMENT MUST BE A 1D TABLE\n\n================\n\n") - stop(tempo.cat) - } - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) # activate this line and use the function to check arguments status - # end argument checking - # main code - same.class <- NULL - class <- NULL - same.length <- NULL - length <- NULL - same.levels <- NULL - levels <- NULL - any.id.levels <- NULL - same.levels.pos1 <- NULL - same.levels.pos2 <- NULL - common.levels <- NULL - same.name <- NULL - name <- NULL - any.id.name <- NULL - same.name.pos1 <- NULL - same.name.pos2 <- NULL - common.names <- NULL - any.id.element <- NULL - same.element.pos1 <- NULL - same.element.pos2 <- NULL - common.elements <- NULL - identical.object <- NULL - identical.content <- NULL - if(identical(data1, data2)){ - same.class <- TRUE - class <- class(data1) - same.length <- TRUE - length <- length(data1) - if(any(class(data1) %in% "factor")){ - same.levels <- TRUE - levels <- levels(data1) - any.id.levels <- TRUE - same.levels.pos1 <- 1:length(levels(data1)) - same.levels.pos2 <- 1:length(levels(data2)) - common.levels <- levels(data1) - } - if( ! is.null(names(data1))){ - same.name <- TRUE - name <- names(data1) - any.id.name <- TRUE - same.name.pos1 <- 1:length(data1) - same.name.pos2 <- 1:length(data2) - common.names <- names(data1) - } - any.id.element <- TRUE - same.element.pos1 <- 1:length(data1) - same.element.pos2 <- 1:length(data2) - common.elements <- data1 - identical.object <- TRUE - identical.content <- TRUE - }else{ - identical.object <- FALSE - if( ! identical(class(data1), class(data2))){ - same.class <- FALSE - }else{ - same.class <- TRUE - class <- class(data1) - } - if( ! identical(length(data1), length(data2))){ - same.length<- FALSE - }else{ - same.length<- TRUE - length <- length(data1) - } - if(any(class(data1) %in% "factor") & any(class(data2) %in% "factor")){ - if( ! identical(levels(data1), levels(data2))){ - same.levels <- FALSE - }else{ - same.levels <- TRUE - levels <- levels(data1) - } - any.id.levels <- FALSE - if(any(levels(data1) %in% levels(data2))){ - any.id.levels <- TRUE - same.levels.pos1 <- which(levels(data1) %in% levels(data2)) - } - if(any(levels(data2) %in% levels(data1))){ - any.id.levels <- TRUE - same.levels.pos2 <- which(levels(data2) %in% levels(data1)) - } - if(any.id.levels == TRUE){ - common.levels <- unique(c(levels(data1)[same.levels.pos1], levels(data2)[same.levels.pos2])) - } - } - if(any(class(data1) %in% "factor")){ # to compare content - data1 <- as.character(data1) - } - if(any(class(data2) %in% "factor")){ # to compare content - data2 <- as.character(data2) - } - if( ! (is.null(names(data1)) & is.null(names(data2)))){ - if( ! identical(names(data1), names(data2))){ - same.name <- FALSE - }else{ - same.name <- TRUE - name <- names(data1) - } - any.id.name <- FALSE - if(any(names(data1) %in% names(data2))){ - any.id.name <- TRUE - same.name.pos1 <- which(names(data1) %in% names(data2)) - } - if(any(names(data2) %in% names(data1))){ - any.id.name <- TRUE - same.name.pos2 <- which(names(data2) %in% names(data1)) - } - if(any.id.name == TRUE){ - common.names <- unique(c(names(data1)[same.name.pos1], names(data2)[same.name.pos2])) - } - } - any.id.element <- FALSE - if(any(data1 %in% data2)){ - any.id.element <- TRUE - same.element.pos1 <- which(data1 %in% data2) - } - if(any(data2 %in% data1)){ - any.id.element <- TRUE - same.element.pos2 <- which(data2 %in% data1) - } - if(any.id.element == TRUE){ - common.elements <- unique(c(data1[same.element.pos1], data2[same.element.pos2])) - } - if(same.length == TRUE & ! all(is.null(same.element.pos1), is.null(same.element.pos2))){ - names(same.element.pos1) <- NULL - names(same.element.pos2) <- NULL - if(identical(same.element.pos1, same.element.pos2)){ - identical.content <- TRUE - }else{ - identical.content <- FALSE - } - }else{ - identical.content <- FALSE - } - } - output <- list(same.class = same.class, class = class, same.length = same.length, length = length, same.levels = same.levels, levels = levels, any.id.levels = any.id.levels, same.levels.pos1 = same.levels.pos1, same.levels.pos2 = same.levels.pos2, common.levels = common.levels, same.name = same.name, name = name, any.id.name = any.id.name, same.name.pos1 = same.name.pos1, same.name.pos2 = same.name.pos2, common.names = common.names, any.id.element = any.id.element, same.element.pos1 = same.element.pos1, same.element.pos2 = same.element.pos2, common.elements = common.elements, identical.object = identical.object, identical.content = identical.content) - return(output) +# AIM +# compare two 1D datasets (vector of factor or 1D table) of the same class or not. Check and report in a list if the 2 datasets have: +# same class +# common elements +# common element names (except factors) +# common levels (factors only) +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# none +# ARGUMENTS +# data1: vector or factor or 1D table +# data2: vector or factor or 1D table +# RETURN +# a list containing: +# $same.class: logical. Are class identical? +# $class: class of the 2 datasets (NULL otherwise) +# $same.length: logical. Are number of elements identical? +# $length: number of elements in the 2 datasets (NULL otherwise) +# $same.levels: logical. Are levels identical? (NULL if data1 and data2 are not factors) +# $levels: levels of the 2 datasets if identical (NULL otherwise or NULL if data1 and data2 are not factors) +# $any.id.levels: logical. Is there any identical levels? (NULL if data1 and data2 are not factors) +# $same.levels.pos1: position, in data1, of the levels identical in data2 (NULL if data1 and data2 are not factors) +# $same.levels.pos2: position, in data2, of the levels identical in data1 (NULL if data1 and data2 are not factors) +# $common.levels: common levels between data1 and data2 (can be a subset of $levels or not). NULL if no common levels or if data1 and data2 are not factors +# $same.name: logical. Are element names identical ? +# $name: name of elements of the 2 datasets if identical (NULL otherwise) +# $any.id.name: logical. Is there any element names identical ? +# $same.name.pos1: position, in data1, of the element names identical in data2 +# $same.name.pos2: position, in data2, of the elements names identical in data1 +# $common.names: common element names between data1 and data2 (can be a subset of $name or not). NULL if no common element names +# $any.id.element: logical. is there any identical elements ? +# $same.element.pos1: position, in data1, of the elements identical in data2 +# $same.element.pos2: position, in data2, of the elements identical in data1 +# $common.elements: common elements between data1 and data2. NULL if no common elements +# $identical.object: logical. Are objects identical (kind of object, element names and content)? +# $identical.content: logical. Are content objects identical (identical elements excluding kind of object and element names)? +# EXAMPLES +# obs1 = 1:5 ; obs2 = 1:5 ; names(obs1) <- LETTERS[1:5] ; names(obs2) <- LETTERS[1:5] ; fun_1d_comp(obs1, obs2) +# obs1 = 1:5 ; obs2 = 1:5 ; names(obs1) <- LETTERS[1:5] ; fun_1d_comp(obs1, obs2) +# obs1 = 1:5 ; obs2 = 3:6 ; names(obs1) <- LETTERS[1:5] ; names(obs2) <- LETTERS[1:4] ; fun_1d_comp(obs1, obs2) +# obs1 = factor(LETTERS[1:5]) ; obs2 = factor(LETTERS[1:5]) ; fun_1d_comp(obs1, obs2) +# obs1 = factor(LETTERS[1:5]) ; obs2 = factor(LETTERS[10:11]) ; fun_1d_comp(obs1, obs2) +# obs1 = factor(LETTERS[1:5]) ; obs2 = factor(LETTERS[4:7]) ; fun_1d_comp(obs1, obs2) +# obs1 = 1:5 ; obs2 = factor(LETTERS[1:5]) ; fun_1d_comp(obs1, obs2) +# obs1 = 1:5 ; obs2 = 1.1:6.1 ; fun_1d_comp(obs1, obs2) +# obs1 = as.table(1:5); obs2 = as.table(1:5) ; fun_1d_comp(obs1, obs2) +# obs1 = as.table(1:5); obs2 = 1:5 ; fun_1d_comp(obs1, obs2) +# DEBUGGING +# data1 = 1:5 ; data2 = 1:5 ; names(data1) <- LETTERS[1:5] ; names(data2) <- LETTERS[1:5] # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# argument checking +if( ! any(class(data1) %in% c("logical", "integer", "numeric", "character", "factor", "table"))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data1 ARGUMENT MUST BE A NON NULL VECTOR, FACTOR OR 1D TABLE\n\n================\n\n") +stop(tempo.cat) +}else if(all(class(data1) %in% "table")){ +if(length(dim(data1)) > 1){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data1 ARGUMENT MUST BE A 1D TABLE\n\n================\n\n") +stop(tempo.cat) +} +} +if( ! any(class(data2) %in% c("logical", "integer", "numeric", "character", "factor", "table"))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data2 ARGUMENT MUST BE A NON NULL VECTOR, FACTOR OR 1D TABLE\n\n================\n\n") +stop(tempo.cat) +}else if(all(class(data2) %in% "table")){ +if(length(dim(data2)) > 1){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data2 ARGUMENT MUST BE A 1D TABLE\n\n================\n\n") +stop(tempo.cat) +} +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) # activate this line and use the function to check arguments status +# end argument checking +# main code +same.class <- NULL +class <- NULL +same.length <- NULL +length <- NULL +same.levels <- NULL +levels <- NULL +any.id.levels <- NULL +same.levels.pos1 <- NULL +same.levels.pos2 <- NULL +common.levels <- NULL +same.name <- NULL +name <- NULL +any.id.name <- NULL +same.name.pos1 <- NULL +same.name.pos2 <- NULL +common.names <- NULL +any.id.element <- NULL +same.element.pos1 <- NULL +same.element.pos2 <- NULL +common.elements <- NULL +identical.object <- NULL +identical.content <- NULL +if(identical(data1, data2)){ +same.class <- TRUE +class <- class(data1) +same.length <- TRUE +length <- length(data1) +if(any(class(data1) %in% "factor")){ +same.levels <- TRUE +levels <- levels(data1) +any.id.levels <- TRUE +same.levels.pos1 <- 1:length(levels(data1)) +same.levels.pos2 <- 1:length(levels(data2)) +common.levels <- levels(data1) +} +if( ! is.null(names(data1))){ +same.name <- TRUE +name <- names(data1) +any.id.name <- TRUE +same.name.pos1 <- 1:length(data1) +same.name.pos2 <- 1:length(data2) +common.names <- names(data1) +} +any.id.element <- TRUE +same.element.pos1 <- 1:length(data1) +same.element.pos2 <- 1:length(data2) +common.elements <- data1 +identical.object <- TRUE +identical.content <- TRUE +}else{ +identical.object <- FALSE +if( ! identical(class(data1), class(data2))){ +same.class <- FALSE +}else{ +same.class <- TRUE +class <- class(data1) +} +if( ! identical(length(data1), length(data2))){ +same.length<- FALSE +}else{ +same.length<- TRUE +length <- length(data1) +} +if(any(class(data1) %in% "factor") & any(class(data2) %in% "factor")){ +if( ! identical(levels(data1), levels(data2))){ +same.levels <- FALSE +}else{ +same.levels <- TRUE +levels <- levels(data1) +} +any.id.levels <- FALSE +if(any(levels(data1) %in% levels(data2))){ +any.id.levels <- TRUE +same.levels.pos1 <- which(levels(data1) %in% levels(data2)) +} +if(any(levels(data2) %in% levels(data1))){ +any.id.levels <- TRUE +same.levels.pos2 <- which(levels(data2) %in% levels(data1)) +} +if(any.id.levels == TRUE){ +common.levels <- unique(c(levels(data1)[same.levels.pos1], levels(data2)[same.levels.pos2])) +} +} +if(any(class(data1) %in% "factor")){ # to compare content +data1 <- as.character(data1) +} +if(any(class(data2) %in% "factor")){ # to compare content +data2 <- as.character(data2) +} +if( ! (is.null(names(data1)) & is.null(names(data2)))){ +if( ! identical(names(data1), names(data2))){ +same.name <- FALSE +}else{ +same.name <- TRUE +name <- names(data1) +} +any.id.name <- FALSE +if(any(names(data1) %in% names(data2))){ +any.id.name <- TRUE +same.name.pos1 <- which(names(data1) %in% names(data2)) +} +if(any(names(data2) %in% names(data1))){ +any.id.name <- TRUE +same.name.pos2 <- which(names(data2) %in% names(data1)) +} +if(any.id.name == TRUE){ +common.names <- unique(c(names(data1)[same.name.pos1], names(data2)[same.name.pos2])) +} +} +any.id.element <- FALSE +if(any(data1 %in% data2)){ +any.id.element <- TRUE +same.element.pos1 <- which(data1 %in% data2) +} +if(any(data2 %in% data1)){ +any.id.element <- TRUE +same.element.pos2 <- which(data2 %in% data1) +} +if(any.id.element == TRUE){ +common.elements <- unique(c(data1[same.element.pos1], data2[same.element.pos2])) +} +if(same.length == TRUE & ! all(is.null(same.element.pos1), is.null(same.element.pos2))){ +names(same.element.pos1) <- NULL +names(same.element.pos2) <- NULL +if(identical(same.element.pos1, same.element.pos2)){ +identical.content <- TRUE +}else{ +identical.content <- FALSE +} +}else{ +identical.content <- FALSE +} +} +output <- list(same.class = same.class, class = class, same.length = same.length, length = length, same.levels = same.levels, levels = levels, any.id.levels = any.id.levels, same.levels.pos1 = same.levels.pos1, same.levels.pos2 = same.levels.pos2, common.levels = common.levels, same.name = same.name, name = name, any.id.name = any.id.name, same.name.pos1 = same.name.pos1, same.name.pos2 = same.name.pos2, common.names = common.names, any.id.element = any.id.element, same.element.pos1 = same.element.pos1, same.element.pos2 = same.element.pos2, common.elements = common.elements, identical.object = identical.object, identical.content = identical.content) +return(output) } @@ -646,305 +651,305 @@ fun_1d_comp <- function(data1, data2){ # Check OK: clear to go Apollo fun_2d_comp <- function(data1, data2){ - # AIM - # compare two 2D datasets of the same class or not. Check and report in a list if the 2 datasets have: - # same class - # common row names - # common column names - # same row number - # same column number - # potential identical rows between the 2 datasets - # potential identical columns between the 2 datasets - # REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION - # none - # ARGUMENTS - # data1: matrix, data frame or table - # data2: matrix, data frame or table - # RETURN - # a list containing: - # $same.class: logical. Are class identical ? - # $class: classes of the 2 datasets (NULL otherwise) - # $same.dim: logical. Are dimension identical ? - # $dim: dimension of the 2 datasets (NULL otherwise) - # $same.row.nb: logical. Are number of rows identical ? - # $row.nb: nb of rows of the 2 datasets if identical (NULL otherwise) - # $same.col.nb: logical. Are number of columns identical ? - # $col.nb: nb of columns of the 2 datasets if identical (NULL otherwise) - # $same.row.name: logical. Are row names identical ? NULL if no row names in the two 2D datasets - # $row.name: name of rows of the 2 datasets if identical (NULL otherwise) - # $any.id.row.name: logical. Is there any row names identical ? NULL if no row names in the two 2D datasets - # $same.row.name.pos1: position, in data1, of the row names identical in data2 - # $same.row.name.pos2: position, in data2, of the row names identical in data1 - # $common.row.names: common row names between data1 and data2 (can be a subset of $name or not). NULL if no common row names - # $same.col.name: logical. Are column names identical ? NULL if no col names in the two 2D datasets - # $col.name: name of columns of the 2 datasets if identical (NULL otherwise) - # $any.id.col.name: logical. Is there any column names identical ? NULL if no col names in the two 2D datasets - # $same.col.name.pos1: position, in data1, of the column names identical in data2 - # $same.col.name.pos2: position, in data2, of the column names identical in data1 - # $common.col.names: common column names between data1 and data2 (can be a subset of $name or not). NULL if no common column names - # $any.id.row: logical. is there identical rows (not considering row names) ? - # $same.row.pos1: position, in data1, of the rows identical in data2 (not considering row names) - # $same.row.pos2: position, in data2, of the rows identical in data1 (not considering row names) - # $any.id.col: logical. is there identical columns (not considering column names)? - # $same.col.pos1: position in data1 of the cols identical in data2 (not considering column names) - # $same.col.pos2: position in data2 of the cols identical in data1 (not considering column names) - # $identical.object: logical. Are objects identical (including row & column names)? - # $identical.content: logical. Are content objects identical (identical excluding row & column names)? - # EXAMPLES - # obs1 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; obs2 = as.data.frame(matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5]))) ; obs1 ; obs2 ; fun_2d_comp(obs1, obs2) - # obs1 = matrix(101:110, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; obs2 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; obs1 ; obs2 ; fun_2d_comp(obs1, obs2) - # obs1 = matrix(1:10, byrow = TRUE, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; obs2 = matrix(c(1:5, 101:105, 6:10), byrow = TRUE, ncol = 5, dimnames = list(c("a", "z", "b"), c(LETTERS[1:2], "k", LETTERS[5:4]))) ; obs1 ; obs2 ; fun_2d_comp(obs1, obs2) - # obs1 = t(matrix(1:10, byrow = TRUE, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5]))) ; obs2 = t(matrix(c(1:5, 101:105, 6:10), byrow = TRUE, ncol = 5, dimnames = list(c("a", "z", "b"), c(LETTERS[1:2], "k", LETTERS[5:4])))) ; obs1 ; obs2 ; fun_2d_comp(obs1, obs2) - # DEBUGGING - # data1 = matrix(1:10, ncol = 5) ; data2 = matrix(1:10, ncol = 5) # for function debugging - # data1 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; data2 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) # for function debugging - # data1 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; data2 = matrix(1:10, ncol = 5) # for function debugging - # data1 = matrix(1:15, byrow = TRUE, ncol = 5, dimnames = list(letters[1:3], LETTERS[1:5])) ; data2 = matrix(1:10, byrow = TRUE, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) # for function debugging - # data1 = matrix(1:15, ncol = 5, dimnames = list(letters[1:3], LETTERS[1:5])) ; data2 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) # for function debugging - # data1 = matrix(1:15, ncol = 5, dimnames = list(paste0("A", letters[1:3]), LETTERS[1:5])) ; data2 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) # for function debugging - # data1 = matrix(1:15, ncol = 5, dimnames = list(letters[1:3], LETTERS[1:5])) ; data2 = matrix(1:12, ncol = 4, dimnames = list(letters[1:3], LETTERS[1:4])) # for function debugging - # data1 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; data2 = matrix(101:110, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) # for function debugging - # data1 = data.frame(a = 1:3, b= letters[1:3], row.names = LETTERS[1:3]) ; data2 = data.frame(A = 1:3, B= letters[1:3]) # for function debugging - # data1 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; data2 = as.data.frame(matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5]))) # for function debugging - # data1 = matrix(1:10, byrow = TRUE, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; data2 = matrix(c(1:5, 101:105, 6:10), byrow = TRUE, ncol = 5, dimnames = list(c("a", "z", "b"), c(LETTERS[1:2], "k", LETTERS[5:4]))) # for function debugging - # data1 = table(Exp1 = c("A", "A", "A", "B", "B", "B"), Exp2 = c("A1", "B1", "A1", "C1", "C1", "B1")) ; data2 = data.frame(A = 1:3, B= letters[1:3]) # for function debugging - # function name - function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") - # end function name - # argument checking - if( ! any(class(data1) %in% c("matrix", "data.frame", "table"))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data1 ARGUMENT MUST BE A MATRIX, DATA FRAME OR TABLE\n\n================\n\n") - stop(tempo.cat) - } - if( ! any(class(data2) %in% c("matrix", "data.frame", "table"))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data2 ARGUMENT MUST BE A MATRIX, DATA FRAME OR TABLE\n\n================\n\n") - stop(tempo.cat) - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) # activate this line and use the function to check arguments status - # end argument checking - # main code - same.class <- NULL - class <- NULL - same.dim <- NULL - dim <- NULL - same.row.nb <- NULL - row.nb <- NULL - same.col.nb <- NULL - col.nb <- NULL - same.row.name <- NULL - row.name <- NULL - any.id.row.name <- NULL - same.row.name.pos1 <- NULL - same.row.name.pos2 <- NULL - common.row.names <- NULL - same.col.name <- NULL - any.id.col.name <- NULL - same.col.name.pos1 <- NULL - same.col.name.pos2 <- NULL - common.col.names <- NULL - col.name <- NULL - any.id.row <- NULL - same.row.pos1 <- NULL - same.row.pos2 <- NULL - any.id.col <- NULL - same.col.pos1 <- NULL - same.col.pos2 <- NULL - identical.object <- NULL - identical.content <- NULL - if(identical(data1, data2) & any(class(data1) %in% c("matrix", "data.frame", "table"))){ - same.class <- TRUE - class <- class(data1) - same.dim <- TRUE - dim <- dim(data1) - same.row.nb <- TRUE - row.nb <- nrow(data1) - same.col.nb <- TRUE - col.nb <- ncol(data1) - same.row.name <- TRUE - row.name <- dimnames(data1)[[1]] - any.id.row.name <- TRUE - same.row.name.pos1 <- 1:row.nb - same.row.name.pos2 <- 1:row.nb - common.row.names <- dimnames(data1)[[1]] - same.col.name <- TRUE - col.name <- dimnames(data1)[[2]] - any.id.col.name <- TRUE - same.col.name.pos1 <- 1:col.nb - same.col.name.pos2 <- 1:col.nb - common.col.names <- dimnames(data1)[[2]] - any.id.row <- TRUE - same.row.pos1 <- 1:row.nb - same.row.pos2 <- 1:row.nb - any.id.col <- TRUE - same.col.pos1 <- 1:col.nb - same.col.pos2 <- 1:col.nb - identical.object <- TRUE - identical.content <- TRUE - }else{ - identical.object <- FALSE - if(all(class(data1) == "table") & length(dim(data1)) == 1){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data1 ARGUMENT IS A 1D TABLE. USE THE info_1D_dataset_fun FUNCTION\n\n================\n\n") - stop(tempo.cat) - } - if(all(class(data2) == "table") & length(dim(data2)) == 1){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data2 ARGUMENT IS A 1D TABLE. USE THE info_1D_dataset_fun FUNCTION\n\n================\n\n") - stop(tempo.cat) - } - if( ! identical(class(data1), class(data2))){ - same.class <- FALSE - }else if( ! any(class(data1) %in% c("matrix", "data.frame", "table"))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data1 AND data2 ARGUMENTS MUST BE EITHER MATRIX, DATA FRAME OR TABLE\n\n================\n\n") - stop(tempo.cat) - }else{ - same.class <- TRUE - class <- class(data1) - } - if( ! identical(dim(data1), dim(data2))){ - same.dim <- FALSE - }else{ - same.dim <- TRUE - dim <- dim(data1) - } - if( ! identical(nrow(data1), nrow(data2))){ - same.row.nb <- FALSE - }else{ - same.row.nb <- TRUE - row.nb <- nrow(data1) - } - if( ! identical(ncol(data1), ncol(data2))){ - same.col.nb <- FALSE - }else{ - same.col.nb <- TRUE - col.nb <- ncol(data1) - } - # row and col names - if(is.null(dimnames(data1)) & is.null(dimnames(data2))){ - same.row.name <- NULL - same.col.name <- NULL - # row and col names remain NULL - }else if((is.null(dimnames(data1)) & ! is.null(dimnames(data2))) | ( ! is.null(dimnames(data1)) & is.null(dimnames(data2)))){ - same.row.name <- FALSE - same.col.name <- FALSE - # row and col names remain NULL - }else{ - if( ! identical(dimnames(data1)[[1]], dimnames(data2)[[1]])){ - same.row.name <- FALSE - # row names remain NULL - }else{ - same.row.name <- TRUE - row.name <- dimnames(data1)[[1]] - } - # row names - any.id.row.name <- FALSE - if(any(dimnames(data1)[[1]] %in% dimnames(data2)[[1]])){ - any.id.row.name <- TRUE - same.row.name.pos1 <- which(dimnames(data1)[[1]] %in% dimnames(data2)[[1]]) - } - if(any(dimnames(data2)[[1]] %in% dimnames(data1)[[1]])){ - any.id.row.name <- TRUE - same.row.name.pos2 <- which(dimnames(data2)[[1]] %in% dimnames(data1)[[1]]) - } - if(any.id.row.name == TRUE){ - common.row.names <- unique(c(dimnames(data1)[[1]][same.row.name.pos1], dimnames(data2)[[1]][same.row.name.pos2])) - } - # col names - any.id.col.name <- FALSE - if(any(dimnames(data1)[[2]] %in% dimnames(data2)[[2]])){ - any.id.col.name <- TRUE - same.col.name.pos1 <- which(dimnames(data1)[[2]] %in% dimnames(data2)[[2]]) - } - if(any(dimnames(data2)[[2]] %in% dimnames(data1)[[2]])){ - any.id.col.name <- TRUE - same.col.name.pos2 <- which(dimnames(data2)[[2]] %in% dimnames(data1)[[2]]) - } - if(any.id.col.name == TRUE){ - common.col.names <- unique(c(dimnames(data1)[[2]][same.col.name.pos1], dimnames(data2)[[2]][same.col.name.pos2])) - } - if( ! identical(dimnames(data1)[[2]], dimnames(data2)[[2]])){ - same.col.name <- FALSE - # col names remain NULL - }else{ - same.col.name <- TRUE - col.name <- dimnames(data1)[[2]] - } - } - # identical row and col content - if(all(class(data1) == "table")){ - as.data.frame(matrix(data1, ncol = ncol(data1)), stringsAsFactors = FALSE) - }else if(all(class(data1) == "matrix")){ - data1 <- as.data.frame(data1, stringsAsFactors = FALSE) - }else if(all(class(data1) == "data.frame")){ - data1 <- data.frame(lapply(data1, as.character), stringsAsFactors=FALSE) - } - if(all(class(data2) == "table")){ - as.data.frame(matrix(data2, ncol = ncol(data2)), stringsAsFactors = FALSE) - }else if(all(class(data2) == "matrix")){ - data2 <- as.data.frame(data2, stringsAsFactors = FALSE) - }else if(all(class(data2) == "data.frame")){ - data2 <- data.frame(lapply(data2, as.character), stringsAsFactors=FALSE) - } - row.names(data1) <- paste0("A", 1:nrow(data1)) - row.names(data2) <- paste0("A", 1:nrow(data2)) - if(same.col.nb == TRUE){ # because if not the same col nb, the row cannot be identical - same.row.pos1 <- which(c(as.data.frame(t(data1), stringsAsFactors = FALSE)) %in% c(as.data.frame(t(data2), stringsAsFactors = FALSE))) - same.row.pos2 <- which(c(as.data.frame(t(data2), stringsAsFactors = FALSE)) %in% c(as.data.frame(t(data1), stringsAsFactors = FALSE))) - names(same.row.pos1) <- NULL - names(same.row.pos2) <- NULL - if(all(is.na(same.row.pos1))){ - same.row.pos1 <- NULL - }else{ - same.row.pos1 <- same.row.pos1[ ! is.na(same.row.pos1)] - any.id.row <- TRUE - } - if(all(is.na(same.row.pos2))){ - same.row.pos2 <- NULL - }else{ - same.row.pos2 <- same.row.pos2[ ! is.na(same.row.pos2)] - any.id.row <- TRUE - } - if(is.null(same.row.pos1) & is.null(same.row.pos2)){ - any.id.row <- FALSE - } - }else{ - any.id.row <- FALSE - # same.row.pos1 and 2 remain NULL - } - if(same.row.nb == TRUE){ # because if not the same row nb, the col cannot be identical - same.col.pos1 <- which(c(data1) %in% c(data2)) - same.col.pos2 <- which(c(data2) %in% c(data1)) - names(same.col.pos1) <- NULL - names(same.col.pos2) <- NULL - if(all(is.na(same.col.pos1))){ - same.col.pos1 <- NULL - }else{ - same.col.pos1 <- same.col.pos1[ ! is.na(same.col.pos1)] - any.id.col <- TRUE - } - if(all(is.na(same.col.pos2))){ - same.col.pos2 <- NULL - }else{ - same.col.pos2 <- same.col.pos2[ ! is.na(same.col.pos2)] - any.id.col <- TRUE - } - if(is.null(same.col.pos1) & is.null(same.col.pos2)){ - any.id.col <- FALSE - } - }else{ - any.id.col <- FALSE - # same.col.pos1 and 2 remain NULL - } - if(same.dim == TRUE & ! all(is.null(same.row.pos1), is.null(same.row.pos2), is.null(same.col.pos1), is.null(same.col.pos2))){ # same.dim == TRUE means that same.row.nb == TRUE and same.col.nb == TRUE, meaning that row.nb != NULL and col.nb != NULL. Thus, no need to include these checkings - if(identical(same.row.pos1, 1:row.nb) & identical(same.row.pos2, 1:row.nb) & identical(same.col.pos1, 1:col.nb) & identical(same.col.pos2, 1:col.nb)){ - identical.content <- TRUE - }else{ - identical.content <- FALSE - } - }else{ - identical.content <- FALSE - } - } - output <- list(same.class = same.class, class = class, same.dim = same.dim, dim = dim, same.row.nb = same.row.nb, row.nb = row.nb, same.col.nb = same.col.nb , col.nb = col.nb, same.row.name = same.row.name, row.name = row.name, any.id.row.name = any.id.row.name, same.row.name.pos1 = same.row.name.pos1, same.row.name.pos2 = same.row.name.pos2, common.row.names = common.row.names, same.col.name = same.col.name, col.name = col.name,any.id.col.name = any.id.col.name, same.col.name.pos1 = same.col.name.pos1, same.col.name.pos2 = same.col.name.pos2, common.col.names = common.col.names, any.id.row = any.id.row, same.row.pos1 = same.row.pos1, same.row.pos2 = same.row.pos2, any.id.col = any.id.col, same.col.pos1 = same.col.pos1, same.col.pos2 = same.col.pos2, identical.object = identical.object, identical.content = identical.content) - return(output) +# AIM +# compare two 2D datasets of the same class or not. Check and report in a list if the 2 datasets have: +# same class +# common row names +# common column names +# same row number +# same column number +# potential identical rows between the 2 datasets +# potential identical columns between the 2 datasets +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# none +# ARGUMENTS +# data1: matrix, data frame or table +# data2: matrix, data frame or table +# RETURN +# a list containing: +# $same.class: logical. Are class identical ? +# $class: classes of the 2 datasets (NULL otherwise) +# $same.dim: logical. Are dimension identical ? +# $dim: dimension of the 2 datasets (NULL otherwise) +# $same.row.nb: logical. Are number of rows identical ? +# $row.nb: nb of rows of the 2 datasets if identical (NULL otherwise) +# $same.col.nb: logical. Are number of columns identical ? +# $col.nb: nb of columns of the 2 datasets if identical (NULL otherwise) +# $same.row.name: logical. Are row names identical ? NULL if no row names in the two 2D datasets +# $row.name: name of rows of the 2 datasets if identical (NULL otherwise) +# $any.id.row.name: logical. Is there any row names identical ? NULL if no row names in the two 2D datasets +# $same.row.name.pos1: position, in data1, of the row names identical in data2 +# $same.row.name.pos2: position, in data2, of the row names identical in data1 +# $common.row.names: common row names between data1 and data2 (can be a subset of $name or not). NULL if no common row names +# $same.col.name: logical. Are column names identical ? NULL if no col names in the two 2D datasets +# $col.name: name of columns of the 2 datasets if identical (NULL otherwise) +# $any.id.col.name: logical. Is there any column names identical ? NULL if no col names in the two 2D datasets +# $same.col.name.pos1: position, in data1, of the column names identical in data2 +# $same.col.name.pos2: position, in data2, of the column names identical in data1 +# $common.col.names: common column names between data1 and data2 (can be a subset of $name or not). NULL if no common column names +# $any.id.row: logical. is there identical rows (not considering row names) ? +# $same.row.pos1: position, in data1, of the rows identical in data2 (not considering row names) +# $same.row.pos2: position, in data2, of the rows identical in data1 (not considering row names) +# $any.id.col: logical. is there identical columns (not considering column names)? +# $same.col.pos1: position in data1 of the cols identical in data2 (not considering column names) +# $same.col.pos2: position in data2 of the cols identical in data1 (not considering column names) +# $identical.object: logical. Are objects identical (including row & column names)? +# $identical.content: logical. Are content objects identical (identical excluding row & column names)? +# EXAMPLES +# obs1 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; obs2 = as.data.frame(matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5]))) ; obs1 ; obs2 ; fun_2d_comp(obs1, obs2) +# obs1 = matrix(101:110, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; obs2 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; obs1 ; obs2 ; fun_2d_comp(obs1, obs2) +# obs1 = matrix(1:10, byrow = TRUE, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; obs2 = matrix(c(1:5, 101:105, 6:10), byrow = TRUE, ncol = 5, dimnames = list(c("a", "z", "b"), c(LETTERS[1:2], "k", LETTERS[5:4]))) ; obs1 ; obs2 ; fun_2d_comp(obs1, obs2) +# obs1 = t(matrix(1:10, byrow = TRUE, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5]))) ; obs2 = t(matrix(c(1:5, 101:105, 6:10), byrow = TRUE, ncol = 5, dimnames = list(c("a", "z", "b"), c(LETTERS[1:2], "k", LETTERS[5:4])))) ; obs1 ; obs2 ; fun_2d_comp(obs1, obs2) +# DEBUGGING +# data1 = matrix(1:10, ncol = 5) ; data2 = matrix(1:10, ncol = 5) # for function debugging +# data1 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; data2 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) # for function debugging +# data1 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; data2 = matrix(1:10, ncol = 5) # for function debugging +# data1 = matrix(1:15, byrow = TRUE, ncol = 5, dimnames = list(letters[1:3], LETTERS[1:5])) ; data2 = matrix(1:10, byrow = TRUE, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) # for function debugging +# data1 = matrix(1:15, ncol = 5, dimnames = list(letters[1:3], LETTERS[1:5])) ; data2 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) # for function debugging +# data1 = matrix(1:15, ncol = 5, dimnames = list(paste0("A", letters[1:3]), LETTERS[1:5])) ; data2 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) # for function debugging +# data1 = matrix(1:15, ncol = 5, dimnames = list(letters[1:3], LETTERS[1:5])) ; data2 = matrix(1:12, ncol = 4, dimnames = list(letters[1:3], LETTERS[1:4])) # for function debugging +# data1 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; data2 = matrix(101:110, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) # for function debugging +# data1 = data.frame(a = 1:3, b= letters[1:3], row.names = LETTERS[1:3]) ; data2 = data.frame(A = 1:3, B= letters[1:3]) # for function debugging +# data1 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; data2 = as.data.frame(matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5]))) # for function debugging +# data1 = matrix(1:10, byrow = TRUE, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; data2 = matrix(c(1:5, 101:105, 6:10), byrow = TRUE, ncol = 5, dimnames = list(c("a", "z", "b"), c(LETTERS[1:2], "k", LETTERS[5:4]))) # for function debugging +# data1 = table(Exp1 = c("A", "A", "A", "B", "B", "B"), Exp2 = c("A1", "B1", "A1", "C1", "C1", "B1")) ; data2 = data.frame(A = 1:3, B= letters[1:3]) # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# argument checking +if( ! any(class(data1) %in% c("matrix", "data.frame", "table"))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data1 ARGUMENT MUST BE A MATRIX, DATA FRAME OR TABLE\n\n================\n\n") +stop(tempo.cat) +} +if( ! any(class(data2) %in% c("matrix", "data.frame", "table"))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data2 ARGUMENT MUST BE A MATRIX, DATA FRAME OR TABLE\n\n================\n\n") +stop(tempo.cat) +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) # activate this line and use the function to check arguments status +# end argument checking +# main code +same.class <- NULL +class <- NULL +same.dim <- NULL +dim <- NULL +same.row.nb <- NULL +row.nb <- NULL +same.col.nb <- NULL +col.nb <- NULL +same.row.name <- NULL +row.name <- NULL +any.id.row.name <- NULL +same.row.name.pos1 <- NULL +same.row.name.pos2 <- NULL +common.row.names <- NULL +same.col.name <- NULL +any.id.col.name <- NULL +same.col.name.pos1 <- NULL +same.col.name.pos2 <- NULL +common.col.names <- NULL +col.name <- NULL +any.id.row <- NULL +same.row.pos1 <- NULL +same.row.pos2 <- NULL +any.id.col <- NULL +same.col.pos1 <- NULL +same.col.pos2 <- NULL +identical.object <- NULL +identical.content <- NULL +if(identical(data1, data2) & any(class(data1) %in% c("matrix", "data.frame", "table"))){ +same.class <- TRUE +class <- class(data1) +same.dim <- TRUE +dim <- dim(data1) +same.row.nb <- TRUE +row.nb <- nrow(data1) +same.col.nb <- TRUE +col.nb <- ncol(data1) +same.row.name <- TRUE +row.name <- dimnames(data1)[[1]] +any.id.row.name <- TRUE +same.row.name.pos1 <- 1:row.nb +same.row.name.pos2 <- 1:row.nb +common.row.names <- dimnames(data1)[[1]] +same.col.name <- TRUE +col.name <- dimnames(data1)[[2]] +any.id.col.name <- TRUE +same.col.name.pos1 <- 1:col.nb +same.col.name.pos2 <- 1:col.nb +common.col.names <- dimnames(data1)[[2]] +any.id.row <- TRUE +same.row.pos1 <- 1:row.nb +same.row.pos2 <- 1:row.nb +any.id.col <- TRUE +same.col.pos1 <- 1:col.nb +same.col.pos2 <- 1:col.nb +identical.object <- TRUE +identical.content <- TRUE +}else{ +identical.object <- FALSE +if(all(class(data1) == "table") & length(dim(data1)) == 1){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data1 ARGUMENT IS A 1D TABLE. USE THE info_1D_dataset_fun FUNCTION\n\n================\n\n") +stop(tempo.cat) +} +if(all(class(data2) == "table") & length(dim(data2)) == 1){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data2 ARGUMENT IS A 1D TABLE. USE THE info_1D_dataset_fun FUNCTION\n\n================\n\n") +stop(tempo.cat) +} +if( ! identical(class(data1), class(data2))){ +same.class <- FALSE +}else if( ! any(class(data1) %in% c("matrix", "data.frame", "table"))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data1 AND data2 ARGUMENTS MUST BE EITHER MATRIX, DATA FRAME OR TABLE\n\n================\n\n") +stop(tempo.cat) +}else{ +same.class <- TRUE +class <- class(data1) +} +if( ! identical(dim(data1), dim(data2))){ +same.dim <- FALSE +}else{ +same.dim <- TRUE +dim <- dim(data1) +} +if( ! identical(nrow(data1), nrow(data2))){ +same.row.nb <- FALSE +}else{ +same.row.nb <- TRUE +row.nb <- nrow(data1) +} +if( ! identical(ncol(data1), ncol(data2))){ +same.col.nb <- FALSE +}else{ +same.col.nb <- TRUE +col.nb <- ncol(data1) +} +# row and col names +if(is.null(dimnames(data1)) & is.null(dimnames(data2))){ +same.row.name <- NULL +same.col.name <- NULL +# row and col names remain NULL +}else if((is.null(dimnames(data1)) & ! is.null(dimnames(data2))) | ( ! is.null(dimnames(data1)) & is.null(dimnames(data2)))){ +same.row.name <- FALSE +same.col.name <- FALSE +# row and col names remain NULL +}else{ +if( ! identical(dimnames(data1)[[1]], dimnames(data2)[[1]])){ +same.row.name <- FALSE +# row names remain NULL +}else{ +same.row.name <- TRUE +row.name <- dimnames(data1)[[1]] +} +# row names +any.id.row.name <- FALSE +if(any(dimnames(data1)[[1]] %in% dimnames(data2)[[1]])){ +any.id.row.name <- TRUE +same.row.name.pos1 <- which(dimnames(data1)[[1]] %in% dimnames(data2)[[1]]) +} +if(any(dimnames(data2)[[1]] %in% dimnames(data1)[[1]])){ +any.id.row.name <- TRUE +same.row.name.pos2 <- which(dimnames(data2)[[1]] %in% dimnames(data1)[[1]]) +} +if(any.id.row.name == TRUE){ +common.row.names <- unique(c(dimnames(data1)[[1]][same.row.name.pos1], dimnames(data2)[[1]][same.row.name.pos2])) +} +# col names +any.id.col.name <- FALSE +if(any(dimnames(data1)[[2]] %in% dimnames(data2)[[2]])){ +any.id.col.name <- TRUE +same.col.name.pos1 <- which(dimnames(data1)[[2]] %in% dimnames(data2)[[2]]) +} +if(any(dimnames(data2)[[2]] %in% dimnames(data1)[[2]])){ +any.id.col.name <- TRUE +same.col.name.pos2 <- which(dimnames(data2)[[2]] %in% dimnames(data1)[[2]]) +} +if(any.id.col.name == TRUE){ +common.col.names <- unique(c(dimnames(data1)[[2]][same.col.name.pos1], dimnames(data2)[[2]][same.col.name.pos2])) +} +if( ! identical(dimnames(data1)[[2]], dimnames(data2)[[2]])){ +same.col.name <- FALSE +# col names remain NULL +}else{ +same.col.name <- TRUE +col.name <- dimnames(data1)[[2]] +} +} +# identical row and col content +if(all(class(data1) == "table")){ +as.data.frame(matrix(data1, ncol = ncol(data1)), stringsAsFactors = FALSE) +}else if(all(class(data1) == "matrix")){ +data1 <- as.data.frame(data1, stringsAsFactors = FALSE) +}else if(all(class(data1) == "data.frame")){ +data1 <- data.frame(lapply(data1, as.character), stringsAsFactors=FALSE) +} +if(all(class(data2) == "table")){ +as.data.frame(matrix(data2, ncol = ncol(data2)), stringsAsFactors = FALSE) +}else if(all(class(data2) == "matrix")){ +data2 <- as.data.frame(data2, stringsAsFactors = FALSE) +}else if(all(class(data2) == "data.frame")){ +data2 <- data.frame(lapply(data2, as.character), stringsAsFactors=FALSE) +} +row.names(data1) <- paste0("A", 1:nrow(data1)) +row.names(data2) <- paste0("A", 1:nrow(data2)) +if(same.col.nb == TRUE){ # because if not the same col nb, the row cannot be identical +same.row.pos1 <- which(c(as.data.frame(t(data1), stringsAsFactors = FALSE)) %in% c(as.data.frame(t(data2), stringsAsFactors = FALSE))) +same.row.pos2 <- which(c(as.data.frame(t(data2), stringsAsFactors = FALSE)) %in% c(as.data.frame(t(data1), stringsAsFactors = FALSE))) +names(same.row.pos1) <- NULL +names(same.row.pos2) <- NULL +if(all(is.na(same.row.pos1))){ +same.row.pos1 <- NULL +}else{ +same.row.pos1 <- same.row.pos1[ ! is.na(same.row.pos1)] +any.id.row <- TRUE +} +if(all(is.na(same.row.pos2))){ +same.row.pos2 <- NULL +}else{ +same.row.pos2 <- same.row.pos2[ ! is.na(same.row.pos2)] +any.id.row <- TRUE +} +if(is.null(same.row.pos1) & is.null(same.row.pos2)){ +any.id.row <- FALSE +} +}else{ +any.id.row <- FALSE +# same.row.pos1 and 2 remain NULL +} +if(same.row.nb == TRUE){ # because if not the same row nb, the col cannot be identical +same.col.pos1 <- which(c(data1) %in% c(data2)) +same.col.pos2 <- which(c(data2) %in% c(data1)) +names(same.col.pos1) <- NULL +names(same.col.pos2) <- NULL +if(all(is.na(same.col.pos1))){ +same.col.pos1 <- NULL +}else{ +same.col.pos1 <- same.col.pos1[ ! is.na(same.col.pos1)] +any.id.col <- TRUE +} +if(all(is.na(same.col.pos2))){ +same.col.pos2 <- NULL +}else{ +same.col.pos2 <- same.col.pos2[ ! is.na(same.col.pos2)] +any.id.col <- TRUE +} +if(is.null(same.col.pos1) & is.null(same.col.pos2)){ +any.id.col <- FALSE +} +}else{ +any.id.col <- FALSE +# same.col.pos1 and 2 remain NULL +} +if(same.dim == TRUE & ! all(is.null(same.row.pos1), is.null(same.row.pos2), is.null(same.col.pos1), is.null(same.col.pos2))){ # same.dim == TRUE means that same.row.nb == TRUE and same.col.nb == TRUE, meaning that row.nb != NULL and col.nb != NULL. Thus, no need to include these checkings +if(identical(same.row.pos1, 1:row.nb) & identical(same.row.pos2, 1:row.nb) & identical(same.col.pos1, 1:col.nb) & identical(same.col.pos2, 1:col.nb)){ +identical.content <- TRUE +}else{ +identical.content <- FALSE +} +}else{ +identical.content <- FALSE +} +} +output <- list(same.class = same.class, class = class, same.dim = same.dim, dim = dim, same.row.nb = same.row.nb, row.nb = row.nb, same.col.nb = same.col.nb , col.nb = col.nb, same.row.name = same.row.name, row.name = row.name, any.id.row.name = any.id.row.name, same.row.name.pos1 = same.row.name.pos1, same.row.name.pos2 = same.row.name.pos2, common.row.names = common.row.names, same.col.name = same.col.name, col.name = col.name,any.id.col.name = any.id.col.name, same.col.name.pos1 = same.col.name.pos1, same.col.name.pos2 = same.col.name.pos2, common.col.names = common.col.names, any.id.row = any.id.row, same.row.pos1 = same.row.pos1, same.row.pos2 = same.row.pos2, any.id.col = any.id.col, same.col.pos1 = same.col.pos1, same.col.pos2 = same.col.pos2, identical.object = identical.object, identical.content = identical.content) +return(output) } @@ -953,60 +958,60 @@ fun_2d_comp <- function(data1, data2){ # Check OK: clear to go Apollo fun_2d_head <- function(data1, n = 10, side = "l"){ - # AIM - # display the head of the left or right of big 2D objects - # REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION - # fun_check() - # ARGUMENTS - # data1: matrix, data frame or table - # n: number of dimension to print (10 means 10 rows and columns) - # side: either "l" or "r" for the left or right side of the 2D object - # RETURN - # the head - # EXAMPLES - # obs1 = matrix(1:30, ncol = 5, dimnames = list(letters[1:6], LETTERS[1:5])) ; obs1 ; fun_2d_head(obs1, 3) - # obs1 = matrix(1:30, ncol = 5, dimnames = list(letters[1:6], LETTERS[1:5])) ; obs1 ; fun_2d_head(obs1, 3, "right") - # DEBUGGING - # data1 = matrix(1:30, ncol = 5) # for function debugging - # data1 = matrix(1:30, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) # for function debugging - # function name - function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") - # end function name - # required function checking - if(length(find("fun_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - # argument checking without fun_check() - if( ! any(class(data1) %in% c("matrix", "data.frame", "table"))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data1 ARGUMENT MUST BE A MATRIX, DATA FRAME OR TABLE\n\n================\n\n") - stop(tempo.cat) - } - # end argument checking without fun_check() - # argument checking with fun_check() - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_check(data = n, class = "vector", typeof = "integer", double.as.integer.allowed = TRUE, length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = side, options = c("l", "r"), length = 1, fun.name = function.name) ; eval(ee) - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_check() - } - # end argument checking with fun_check() - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() - # end argument checking - # main code - obs.dim <- dim(data1) - row <- 1:ifelse(obs.dim[1] < n, obs.dim[1], n) - if(side == "l"){ - col <- 1:ifelse(obs.dim[2] < n, obs.dim[2], n) - } - if(side == "r"){ - col <- ifelse(obs.dim[2] < n, 1, obs.dim[2] - n + 1):obs.dim[2] - } - return(data1[row, col]) +# AIM +# display the head of the left or right of big 2D objects +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_check() +# ARGUMENTS +# data1: matrix, data frame or table +# n: number of dimension to print (10 means 10 rows and columns) +# side: either "l" or "r" for the left or right side of the 2D object +# RETURN +# the head +# EXAMPLES +# obs1 = matrix(1:30, ncol = 5, dimnames = list(letters[1:6], LETTERS[1:5])) ; obs1 ; fun_2d_head(obs1, 3) +# obs1 = matrix(1:30, ncol = 5, dimnames = list(letters[1:6], LETTERS[1:5])) ; obs1 ; fun_2d_head(obs1, 3, "right") +# DEBUGGING +# data1 = matrix(1:30, ncol = 5) # for function debugging +# data1 = matrix(1:30, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +# argument checking without fun_check() +if( ! any(class(data1) %in% c("matrix", "data.frame", "table"))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data1 ARGUMENT MUST BE A MATRIX, DATA FRAME OR TABLE\n\n================\n\n") +stop(tempo.cat) +} +# end argument checking without fun_check() +# argument checking with fun_check() +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_check(data = n, class = "vector", typeof = "integer", double.as.integer.allowed = TRUE, length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = side, options = c("l", "r"), length = 1, fun.name = function.name) ; eval(ee) +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_check() +} +# end argument checking with fun_check() +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() +# end argument checking +# main code +obs.dim <- dim(data1) +row <- 1:ifelse(obs.dim[1] < n, obs.dim[1], n) +if(side == "l"){ +col <- 1:ifelse(obs.dim[2] < n, obs.dim[2], n) +} +if(side == "r"){ +col <- ifelse(obs.dim[2] < n, 1, obs.dim[2] - n + 1):obs.dim[2] +} +return(data1[row, col]) } @@ -1015,60 +1020,60 @@ fun_2d_head <- function(data1, n = 10, side = "l"){ # Check OK: clear to go Apollo fun_2d_tail <- function(data1, n = 10, side = "l"){ - # AIM - # display the tail of the left or right of big 2D objects - # REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION - # fun_check() - # ARGUMENTS - # data1: matrix, data frame or table - # n: number of dimension to print (10 means 10 rows and columns) - # side: either "l" or "r" for the left or right side of the 2D object - # RETURN - # the tail - # EXAMPLES - # obs1 = matrix(1:30, ncol = 5, dimnames = list(letters[1:6], LETTERS[1:5])) ; obs1 ; fun_2d_tail(obs1, 3) - # obs1 = matrix(1:30, ncol = 5, dimnames = list(letters[1:6], LETTERS[1:5])) ; obs1 ; fun_2d_tail(obs1, 3, "r") - # DEBUGGING - # data1 = matrix(1:10, ncol = 5) # for function debugging - # data1 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) # for function debugging - # function name - function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") - # end function name - # required function checking - if(length(find("fun_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - # argument checking without fun_check() - if( ! any(class(data1) %in% c("matrix", "data.frame", "table"))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data1 ARGUMENT MUST BE A MATRIX, DATA FRAME OR TABLE\n\n================\n\n") - stop(tempo.cat) - } - # end argument checking without fun_check() - # argument checking with fun_check() - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_check(data = n, class = "vector", typeof = "integer", double.as.integer.allowed = TRUE, length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = side, options = c("l", "r"), length = 1, fun.name = function.name) ; eval(ee) - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_check() - } - # end argument checking with fun_check() - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() - # end argument checking - # main code - obs.dim <- dim(data1) - row <- ifelse(obs.dim[1] < n, 1, obs.dim[1] - n + 1):obs.dim[1] - if(side == "l"){ - col <- 1:ifelse(obs.dim[2] < n, obs.dim[2], n) - } - if(side == "r"){ - col <- ifelse(obs.dim[2] < n, 1, obs.dim[2] - n + 1):obs.dim[2] - } - return(data1[row, col]) +# AIM +# display the tail of the left or right of big 2D objects +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_check() +# ARGUMENTS +# data1: matrix, data frame or table +# n: number of dimension to print (10 means 10 rows and columns) +# side: either "l" or "r" for the left or right side of the 2D object +# RETURN +# the tail +# EXAMPLES +# obs1 = matrix(1:30, ncol = 5, dimnames = list(letters[1:6], LETTERS[1:5])) ; obs1 ; fun_2d_tail(obs1, 3) +# obs1 = matrix(1:30, ncol = 5, dimnames = list(letters[1:6], LETTERS[1:5])) ; obs1 ; fun_2d_tail(obs1, 3, "r") +# DEBUGGING +# data1 = matrix(1:10, ncol = 5) # for function debugging +# data1 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +# argument checking without fun_check() +if( ! any(class(data1) %in% c("matrix", "data.frame", "table"))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data1 ARGUMENT MUST BE A MATRIX, DATA FRAME OR TABLE\n\n================\n\n") +stop(tempo.cat) +} +# end argument checking without fun_check() +# argument checking with fun_check() +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_check(data = n, class = "vector", typeof = "integer", double.as.integer.allowed = TRUE, length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = side, options = c("l", "r"), length = 1, fun.name = function.name) ; eval(ee) +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_check() +} +# end argument checking with fun_check() +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() +# end argument checking +# main code +obs.dim <- dim(data1) +row <- ifelse(obs.dim[1] < n, 1, obs.dim[1] - n + 1):obs.dim[1] +if(side == "l"){ +col <- 1:ifelse(obs.dim[2] < n, obs.dim[2], n) +} +if(side == "r"){ +col <- ifelse(obs.dim[2] < n, 1, obs.dim[2] - n + 1):obs.dim[2] +} +return(data1[row, col]) } @@ -1077,128 +1082,128 @@ fun_2d_tail <- function(data1, n = 10, side = "l"){ # Check OK: clear to go Apollo fun_list_comp <- function(data1, data2){ - # AIM - # compare two lists. Check and report in a list if the 2 datasets have: - # same length - # common names - # common compartments - # REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION - # none - # ARGUMENTS - # data1: list - # data2: list - # RETURN - # a list containing: - # $same.length: logical. Are number of elements identical? - # $length: number of elements in the 2 datasets (NULL otherwise) - # $same.name: logical. Are element names identical ? - # $name: name of elements of the 2 datasets if identical (NULL otherwise) - # $any.id.name: logical. Is there any element names identical ? - # $same.name.pos1: position, in data1, of the element names identical in data2 - # $same.name.pos2: position, in data2, of the compartment names identical in data1 - # $any.id.compartment: logical. is there any identical compartments ? - # $same.compartment.pos1: position, in data1, of the compartments identical in data2 - # $same.compartment.pos2: position, in data2, of the compartments identical in data1 - # $identical.object: logical. Are objects identical (kind of object, compartment names and content)? - # $identical.content: logical. Are content objects identical (identical compartments excluding compartment names)? - # EXAMPLES - # obs1 = list(a = 1:5, b = LETTERS[1:2], d = matrix(1:6)) ; obs2 = list(a = 1:5, b = LETTERS[1:2], d = matrix(1:6)) ; fun_list_comp(obs1, obs2) - # obs1 = list(1:5, LETTERS[1:2]) ; obs2 = list(a = 1:5, b = LETTERS[1:2]) ; fun_list_comp(obs1, obs2) - # obs1 = list(b = 1:5, c = LETTERS[1:2]) ; obs2 = list(a = 1:5, b = LETTERS[1:2], d = matrix(1:6)) ; fun_list_comp(obs1, obs2) - # obs1 = list(b = 1:5, c = LETTERS[1:2]) ; obs2 = list(LETTERS[5:9], matrix(1:6), 1:5) ; fun_list_comp(obs1, obs2) - # DEBUGGING - # data1 = list(a = 1:5, b = LETTERS[1:2], d = matrix(1:6)) ; data2 = list(a = 1:5, b = LETTERS[1:2], d = matrix(1:6)) # for function debugging - # data1 = list(a = 1:5, b = LETTERS[1:2]) ; data2 = list(a = 1:5, b = LETTERS[1:2], d = matrix(1:6)) # for function debugging - # function name - function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") - # end function name - # argument checking - if( ! any(class(data1) %in% "list")){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data1 ARGUMENT MUST BE A LIST\n\n================\n\n") - stop(tempo.cat) - } - if( ! any(class(data2) %in% "list")){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data2 ARGUMENT MUST BE A LIST\n\n================\n\n") - stop(tempo.cat) - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) # activate this line and use the function to check arguments status - # end argument checking - # main code - same.length <- NULL - length <- NULL - same.name <- NULL - name <- NULL - any.id.name <- NULL - same.name.pos1 <- NULL - same.name.pos2 <- NULL - any.id.compartment <- NULL - same.compartment.pos1 <- NULL - same.compartment.pos2 <- NULL - identical.object <- NULL - identical.content <- NULL - if(identical(data1, data2)){ - same.length <- TRUE - length <- length(data1) - if( ! is.null(names(data1))){ - same.name <- TRUE - name <- names(data1) - any.id.name <- TRUE - same.name.pos1 <- 1:length(data1) - same.name.pos2 <- 1:length(data2) - } - any.id.compartment <- TRUE - same.compartment.pos1 <- 1:length(data1) - same.compartment.pos2 <- 1:length(data2) - identical.object <- TRUE - identical.content <- TRUE - }else{ - identical.object <- FALSE - if( ! identical(length(data1), length(data2))){ - same.length<- FALSE - }else{ - same.length<- TRUE - length <- length(data1) - } - if( ! (is.null(names(data1)) & is.null(names(data2)))){ - if( ! identical(names(data1), names(data2))){ - same.name <- FALSE - }else{ - same.name <- TRUE - name <- names(data1) - } - any.id.name <- FALSE - if(any(names(data1) %in% names(data2))){ - any.id.name <- TRUE - same.name.pos1 <- which(names(data1) %in% names(data2)) - } - if(any(names(data2) %in% names(data1))){ - any.id.name <- TRUE - same.name.pos2 <- which(names(data2) %in% names(data1)) - } - } - names(data1) <- NULL - names(data2) <- NULL - any.id.compartment <- FALSE - if(any(data1 %in% data2)){ - any.id.compartment <- TRUE - same.compartment.pos1 <- which(data1 %in% data2) - } - if(any(data2 %in% data1)){ - any.id.compartment <- TRUE - same.compartment.pos2 <- which(data2 %in% data1) - } - if(same.length == TRUE & ! all(is.null(same.compartment.pos1), is.null(same.compartment.pos2))){ - if(identical(same.compartment.pos1, same.compartment.pos2)){ - identical.content <- TRUE - }else{ - identical.content <- FALSE - } - }else{ - identical.content <- FALSE - } - } - output <- list(same.length = same.length, length = length, same.name = same.name, name = name, any.id.name = any.id.name, same.name.pos1 = same.name.pos1, same.name.pos2 = same.name.pos2, any.id.compartment = any.id.compartment, same.compartment.pos1 = same.compartment.pos1, same.compartment.pos2 = same.compartment.pos2, identical.object = identical.object, identical.content = identical.content) - return(output) +# AIM +# compare two lists. Check and report in a list if the 2 datasets have: +# same length +# common names +# common compartments +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# none +# ARGUMENTS +# data1: list +# data2: list +# RETURN +# a list containing: +# $same.length: logical. Are number of elements identical? +# $length: number of elements in the 2 datasets (NULL otherwise) +# $same.name: logical. Are element names identical ? +# $name: name of elements of the 2 datasets if identical (NULL otherwise) +# $any.id.name: logical. Is there any element names identical ? +# $same.name.pos1: position, in data1, of the element names identical in data2 +# $same.name.pos2: position, in data2, of the compartment names identical in data1 +# $any.id.compartment: logical. is there any identical compartments ? +# $same.compartment.pos1: position, in data1, of the compartments identical in data2 +# $same.compartment.pos2: position, in data2, of the compartments identical in data1 +# $identical.object: logical. Are objects identical (kind of object, compartment names and content)? +# $identical.content: logical. Are content objects identical (identical compartments excluding compartment names)? +# EXAMPLES +# obs1 = list(a = 1:5, b = LETTERS[1:2], d = matrix(1:6)) ; obs2 = list(a = 1:5, b = LETTERS[1:2], d = matrix(1:6)) ; fun_list_comp(obs1, obs2) +# obs1 = list(1:5, LETTERS[1:2]) ; obs2 = list(a = 1:5, b = LETTERS[1:2]) ; fun_list_comp(obs1, obs2) +# obs1 = list(b = 1:5, c = LETTERS[1:2]) ; obs2 = list(a = 1:5, b = LETTERS[1:2], d = matrix(1:6)) ; fun_list_comp(obs1, obs2) +# obs1 = list(b = 1:5, c = LETTERS[1:2]) ; obs2 = list(LETTERS[5:9], matrix(1:6), 1:5) ; fun_list_comp(obs1, obs2) +# DEBUGGING +# data1 = list(a = 1:5, b = LETTERS[1:2], d = matrix(1:6)) ; data2 = list(a = 1:5, b = LETTERS[1:2], d = matrix(1:6)) # for function debugging +# data1 = list(a = 1:5, b = LETTERS[1:2]) ; data2 = list(a = 1:5, b = LETTERS[1:2], d = matrix(1:6)) # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# argument checking +if( ! any(class(data1) %in% "list")){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data1 ARGUMENT MUST BE A LIST\n\n================\n\n") +stop(tempo.cat) +} +if( ! any(class(data2) %in% "list")){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data2 ARGUMENT MUST BE A LIST\n\n================\n\n") +stop(tempo.cat) +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) # activate this line and use the function to check arguments status +# end argument checking +# main code +same.length <- NULL +length <- NULL +same.name <- NULL +name <- NULL +any.id.name <- NULL +same.name.pos1 <- NULL +same.name.pos2 <- NULL +any.id.compartment <- NULL +same.compartment.pos1 <- NULL +same.compartment.pos2 <- NULL +identical.object <- NULL +identical.content <- NULL +if(identical(data1, data2)){ +same.length <- TRUE +length <- length(data1) +if( ! is.null(names(data1))){ +same.name <- TRUE +name <- names(data1) +any.id.name <- TRUE +same.name.pos1 <- 1:length(data1) +same.name.pos2 <- 1:length(data2) +} +any.id.compartment <- TRUE +same.compartment.pos1 <- 1:length(data1) +same.compartment.pos2 <- 1:length(data2) +identical.object <- TRUE +identical.content <- TRUE +}else{ +identical.object <- FALSE +if( ! identical(length(data1), length(data2))){ +same.length<- FALSE +}else{ +same.length<- TRUE +length <- length(data1) +} +if( ! (is.null(names(data1)) & is.null(names(data2)))){ +if( ! identical(names(data1), names(data2))){ +same.name <- FALSE +}else{ +same.name <- TRUE +name <- names(data1) +} +any.id.name <- FALSE +if(any(names(data1) %in% names(data2))){ +any.id.name <- TRUE +same.name.pos1 <- which(names(data1) %in% names(data2)) +} +if(any(names(data2) %in% names(data1))){ +any.id.name <- TRUE +same.name.pos2 <- which(names(data2) %in% names(data1)) +} +} +names(data1) <- NULL +names(data2) <- NULL +any.id.compartment <- FALSE +if(any(data1 %in% data2)){ +any.id.compartment <- TRUE +same.compartment.pos1 <- which(data1 %in% data2) +} +if(any(data2 %in% data1)){ +any.id.compartment <- TRUE +same.compartment.pos2 <- which(data2 %in% data1) +} +if(same.length == TRUE & ! all(is.null(same.compartment.pos1), is.null(same.compartment.pos2))){ +if(identical(same.compartment.pos1, same.compartment.pos2)){ +identical.content <- TRUE +}else{ +identical.content <- FALSE +} +}else{ +identical.content <- FALSE +} +} +output <- list(same.length = same.length, length = length, same.name = same.name, name = name, any.id.name = any.id.name, same.name.pos1 = same.name.pos1, same.name.pos2 = same.name.pos2, any.id.compartment = any.id.compartment, same.compartment.pos1 = same.compartment.pos1, same.compartment.pos2 = same.compartment.pos2, identical.object = identical.object, identical.content = identical.content) +return(output) } @@ -1210,71 +1215,71 @@ fun_list_comp <- function(data1, data2){ # Check OK: clear to go Apollo fun_name_change <- function(data1, data2, added.string = "_modif"){ - # AIM - # this function allow to check if a vector of character strings, like column names of a data frame, has elements present in another vector (vector of reserved words or column names of another data frame before merging) - # REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION - # fun_check() - # ARGUMENTS - # data1: vector of character strings to check and modify - # data2: reference vector of character strings - # added.string: string added at the end of the modified string in data1 if present in data2 - # RETURN - # a list containing - # $data: the modified or unmodified data1 (in the same order as in the initial data1) - # $ini: the initial elements before modification. NULL if no modification - # $post: the modified elements in the same order as in ini. NULL if no modification - # EXAMPLES - # obs1 <- c("A", "B", "C", "D") ; obs2 <- c("A", "C") ; fun_name_change(obs1, obs2) - # obs1 <- c("A", "B", "C", "C_modif1", "D") ; obs2 <- c("A", "A_modif1", "C") ; fun_name_change(obs1, obs2) # the function checks that the new names are neither in obs1 nor in obs2 (increment the number after the added string) - # DEBUGGING - # data1 = c("A", "B", "C", "D") ; data2 <- c("A", "C") ; added.string = "_modif" # for function debugging - # function name - function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") - # end function name - # required function checking - if(length(find("fun_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_check(data = data1, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = data2, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = added.string, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_check() - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() - # end argument checking - # main code - ini <- NULL - post <- NULL - if(any(data1 %in% data2)){ - tempo.names <- data1[data1 %in% data2] - ini <- NULL - post <- NULL - for(i3 in 1:length(tempo.names)){ - count <- 0 - tempo <- tempo.names[i3] - while(any(tempo %in% data2) | any(tempo %in% data1)){ - count <- count + 1 - tempo <- paste0(tempo.names[i3], "_modif", count) - } - data1[data1 %in% tempo.names[i3]] <- paste0(tempo.names[i3], "_modif", count) - if(count != 0){ - ini <- c(ini, tempo.names[i3]) - post <- c(post, paste0(tempo.names[i3], "_modif", count)) - } - } - data <- data1 - }else{ - data <- data1 - } - output <- list(data = data, ini = ini, post = post) - return(output) +# AIM +# this function allow to check if a vector of character strings, like column names of a data frame, has elements present in another vector (vector of reserved words or column names of another data frame before merging) +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_check() +# ARGUMENTS +# data1: vector of character strings to check and modify +# data2: reference vector of character strings +# added.string: string added at the end of the modified string in data1 if present in data2 +# RETURN +# a list containing +# $data: the modified or unmodified data1 (in the same order as in the initial data1) +# $ini: the initial elements before modification. NULL if no modification +# $post: the modified elements in the same order as in ini. NULL if no modification +# EXAMPLES +# obs1 <- c("A", "B", "C", "D") ; obs2 <- c("A", "C") ; fun_name_change(obs1, obs2) +# obs1 <- c("A", "B", "C", "C_modif1", "D") ; obs2 <- c("A", "A_modif1", "C") ; fun_name_change(obs1, obs2) # the function checks that the new names are neither in obs1 nor in obs2 (increment the number after the added string) +# DEBUGGING +# data1 = c("A", "B", "C", "D") ; data2 <- c("A", "C") ; added.string = "_modif" # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_check(data = data1, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = data2, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = added.string, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_check() +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() +# end argument checking +# main code +ini <- NULL +post <- NULL +if(any(data1 %in% data2)){ +tempo.names <- data1[data1 %in% data2] +ini <- NULL +post <- NULL +for(i3 in 1:length(tempo.names)){ +count <- 0 +tempo <- tempo.names[i3] +while(any(tempo %in% data2) | any(tempo %in% data1)){ +count <- count + 1 +tempo <- paste0(tempo.names[i3], "_modif", count) +} +data1[data1 %in% tempo.names[i3]] <- paste0(tempo.names[i3], "_modif", count) +if(count != 0){ +ini <- c(ini, tempo.names[i3]) +post <- c(post, paste0(tempo.names[i3], "_modif", count)) +} +} +data <- data1 +}else{ +data <- data1 +} +output <- list(data = data, ini = ini, post = post) +return(output) } @@ -1283,116 +1288,116 @@ fun_name_change <- function(data1, data2, added.string = "_modif"){ # Check OK: clear to go Apollo fun_df_remod <- function(data, quanti.col.name = "quanti", quali.col.name = "quali"){ - # AIM - # if the data frame is made of numeric columns, a new data frame is created, with the 1st column gathering all the numeric values, and the 2nd column being the name of the columns of the initial data frame. If row names were present in the initial data frame, then a new ini_rowname column is added with the names of the rows - - - # If the data frame is made of one numeric column and one character or factor column, a new data frame is created, with the new columns corresponding to the split numeric values (according to the character column). NA are added a the end of each column to have the same number of rows. BEWARE: in such data frame, rows are not individuals. This means that in the example below, values 10 and 20 are associated on the same row but that means nothing in term of association - - - - # REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION - # fun_check() - # ARGUMENTS - # data: data frame to convert - # quanti.col.name: optional name for the quanti column of the new data frame - # quali.col.name: optional name for the quali column of the new data frame - # RETURN - # the modified data frame - # EXAMPLES - # obs <- data.frame(col1 = (1:4)*10, col2 = c("A", "B", "A", "A")) ; obs ; fun_df_remod(obs) - # obs <- data.frame(col1 = (1:4)*10, col2 = 5:8) ; obs ; fun_df_remod(obs, quanti.col.name = "quanti", quali.col.name = "quali") - # obs <- data.frame(col1 = (1:4)*10, col2 = 5:8) ; rownames(obs) <- paste0("row", 1:4) ; obs ; fun_df_remod(obs, quanti.col.name = "quanti", quali.col.name = "quali") - # DEBUGGING - # data = data.frame(a = 1:3, b = 4:6) ; quanti.col.name = "quanti" ; quali.col.name = "quali" # for function debugging - # data = data.frame(a = 1:3, b = 4:6, c = 11:13) ; quanti.col.name = "quanti" ; quali.col.name = "quali" # for function debugging - # data = data.frame(a = 1:3, b = letters[1:3]) ; quanti.col.name = "quanti" ; quali.col.name = "quali" # for function debugging - # data = data.frame(a = 1:3, b = letters[1:3]) ; quanti.col.name = "TEST" ; quali.col.name = "quali" # for function debugging - # data = data.frame(b = letters[1:3], a = 1:3) ; quanti.col.name = "quanti" ; quali.col.name = "quali" # for function debugging - # data = data.frame(b = c("e", "e", "h"), a = 1:3) ; quanti.col.name = "quanti" ; quali.col.name = "quali" # for function debugging - # function name - function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") - # end function name - # required function checking - if(length(find("fun_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - # argument checking without fun_check() - if( ! any(class(data) %in% "data.frame")){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data ARGUMENT MUST BE A DATA FRAME\n\n================\n\n") - stop(tempo.cat) - } - # end argument checking without fun_check() - # argument checking with fun_check() - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_check(data = quanti.col.name, class = "character", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = quali.col.name, class = "character", length = 1, fun.name = function.name) ; eval(ee) - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_check() - } - # end argument checking with fun_check() - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() - # end argument checking - # main code - tempo.factor <- unlist(lapply(data, class)) - for(i in 1:length(tempo.factor)){ # convert factor columns as character - if(all(tempo.factor[i] == "factor")){ - data[, i] <- as.character(data[, i]) - } - } - tempo.factor <- unlist(lapply(data, mode)) - if(length(data) == 2){ - if( ! ((mode(data[, 1]) == "character" & mode(data[, 2]) == "numeric") | mode(data[, 2]) == "character" & mode(data[, 1]) == "numeric" | mode(data[, 2]) == "numeric" & mode(data[, 1]) == "numeric") ){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": IF data ARGUMENT IS A DATA FRAME MADE OF 2 COLUMNS, EITHER A COLUMN MUST BE NUMERIC AND THE OTHER CHARACTER, OR THE TWO COLUMNS MUST BE NUMERIC\n\n================\n\n") - stop(tempo.cat) - } - if((mode(data[, 1]) == "character" | mode(data[, 2]) == "character") & (quanti.col.name != "quanti" | quali.col.name != "quali")){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": IMPROPER quanti.col.name OR quali.col.name RESETTINGS. THESE ARGUMENTS ARE RESERVED FOR DATA FRAMES MADE OF n NUMERIC COLUMNS ONLY\n\n================\n\n") - stop(tempo.cat) - } - }else{ - if( ! all(tempo.factor %in% "numeric")){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": IF data ARGUMENT IS A DATA FRAME MADE OF ONE COLUMN, OR MORE THAN 2 COLUMNS, THESE COLUMNS MUST BE NUMERIC\n\n================\n\n") - stop(tempo.cat) - } - } - if(( ! any(tempo.factor %in% "character")) & is.null(names(data))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": NUMERIC DATA FRAME in the data ARGUMENT MUST HAVE COLUMN NAMES\n\n================\n\n") - stop() - } - if(all(tempo.factor %in% "numeric")){ # transfo 1 - quanti <- NULL - for(i in 1:length(data)){ - quanti <-c(quanti, data[, i]) - } - quali <- rep(names(data), each = nrow(data)) - output.data <- data.frame(quanti, quali) - names(output.data) <- c(quanti.col.name, quali.col.name) - # add the ini_rowname column - ini.rownames <- rownames(data) - tempo.data <- data - rownames(tempo.data) <- NULL - null.rownames <- (tempo.data) - if( ! identical(ini.rownames, null.rownames)){ - ini_rowname <- rep(ini.rownames, times = ncol(data)) - output.data <- cbind(output.data, ini_rowname) - } - }else{ # transfo 2 - if(class(data[, 1]) == "character"){ - data <- cbind(data[2], data[1]) - } - nc.max <- max(table(data[, 2])) # effectif maximum des classes - nb.na <- nc.max - table(data[,2]) # nombre de NA à ajouter pour réaliser la data frame - tempo<-split(data[, 1], data[, 2]) - for(i in 1:length(tempo)){tempo[[i]] <- append(tempo[[i]], rep(NA, nb.na[i]))} # des NA doivent être ajoutés lorsque les effectifs sont différents entre les classes. C'est uniquement pour que chaque colonne ait le même nombre de lignes - output.data<-data.frame(tempo) - } - return(output.data) +# AIM +# if the data frame is made of numeric columns, a new data frame is created, with the 1st column gathering all the numeric values, and the 2nd column being the name of the columns of the initial data frame. If row names were present in the initial data frame, then a new ini_rowname column is added with the names of the rows + + +# If the data frame is made of one numeric column and one character or factor column, a new data frame is created, with the new columns corresponding to the split numeric values (according to the character column). NA are added a the end of each column to have the same number of rows. BEWARE: in such data frame, rows are not individuals. This means that in the example below, values 10 and 20 are associated on the same row but that means nothing in term of association + + + +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_check() +# ARGUMENTS +# data: data frame to convert +# quanti.col.name: optional name for the quanti column of the new data frame +# quali.col.name: optional name for the quali column of the new data frame +# RETURN +# the modified data frame +# EXAMPLES +# obs <- data.frame(col1 = (1:4)*10, col2 = c("A", "B", "A", "A")) ; obs ; fun_df_remod(obs) +# obs <- data.frame(col1 = (1:4)*10, col2 = 5:8) ; obs ; fun_df_remod(obs, quanti.col.name = "quanti", quali.col.name = "quali") +# obs <- data.frame(col1 = (1:4)*10, col2 = 5:8) ; rownames(obs) <- paste0("row", 1:4) ; obs ; fun_df_remod(obs, quanti.col.name = "quanti", quali.col.name = "quali") +# DEBUGGING +# data = data.frame(a = 1:3, b = 4:6) ; quanti.col.name = "quanti" ; quali.col.name = "quali" # for function debugging +# data = data.frame(a = 1:3, b = 4:6, c = 11:13) ; quanti.col.name = "quanti" ; quali.col.name = "quali" # for function debugging +# data = data.frame(a = 1:3, b = letters[1:3]) ; quanti.col.name = "quanti" ; quali.col.name = "quali" # for function debugging +# data = data.frame(a = 1:3, b = letters[1:3]) ; quanti.col.name = "TEST" ; quali.col.name = "quali" # for function debugging +# data = data.frame(b = letters[1:3], a = 1:3) ; quanti.col.name = "quanti" ; quali.col.name = "quali" # for function debugging +# data = data.frame(b = c("e", "e", "h"), a = 1:3) ; quanti.col.name = "quanti" ; quali.col.name = "quali" # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +# argument checking without fun_check() +if( ! any(class(data) %in% "data.frame")){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data ARGUMENT MUST BE A DATA FRAME\n\n================\n\n") +stop(tempo.cat) +} +# end argument checking without fun_check() +# argument checking with fun_check() +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_check(data = quanti.col.name, class = "character", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = quali.col.name, class = "character", length = 1, fun.name = function.name) ; eval(ee) +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_check() +} +# end argument checking with fun_check() +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() +# end argument checking +# main code +tempo.factor <- unlist(lapply(data, class)) +for(i in 1:length(tempo.factor)){ # convert factor columns as character +if(all(tempo.factor[i] == "factor")){ +data[, i] <- as.character(data[, i]) +} +} +tempo.factor <- unlist(lapply(data, mode)) +if(length(data) == 2){ +if( ! ((mode(data[, 1]) == "character" & mode(data[, 2]) == "numeric") | mode(data[, 2]) == "character" & mode(data[, 1]) == "numeric" | mode(data[, 2]) == "numeric" & mode(data[, 1]) == "numeric") ){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": IF data ARGUMENT IS A DATA FRAME MADE OF 2 COLUMNS, EITHER A COLUMN MUST BE NUMERIC AND THE OTHER CHARACTER, OR THE TWO COLUMNS MUST BE NUMERIC\n\n================\n\n") +stop(tempo.cat) +} +if((mode(data[, 1]) == "character" | mode(data[, 2]) == "character") & (quanti.col.name != "quanti" | quali.col.name != "quali")){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": IMPROPER quanti.col.name OR quali.col.name RESETTINGS. THESE ARGUMENTS ARE RESERVED FOR DATA FRAMES MADE OF n NUMERIC COLUMNS ONLY\n\n================\n\n") +stop(tempo.cat) +} +}else{ +if( ! all(tempo.factor %in% "numeric")){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": IF data ARGUMENT IS A DATA FRAME MADE OF ONE COLUMN, OR MORE THAN 2 COLUMNS, THESE COLUMNS MUST BE NUMERIC\n\n================\n\n") +stop(tempo.cat) +} +} +if(( ! any(tempo.factor %in% "character")) & is.null(names(data))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": NUMERIC DATA FRAME in the data ARGUMENT MUST HAVE COLUMN NAMES\n\n================\n\n") +stop() +} +if(all(tempo.factor %in% "numeric")){ # transfo 1 +quanti <- NULL +for(i in 1:length(data)){ +quanti <-c(quanti, data[, i]) +} +quali <- rep(names(data), each = nrow(data)) +output.data <- data.frame(quanti, quali) +names(output.data) <- c(quanti.col.name, quali.col.name) +# add the ini_rowname column +ini.rownames <- rownames(data) +tempo.data <- data +rownames(tempo.data) <- NULL +null.rownames <- (tempo.data) +if( ! identical(ini.rownames, null.rownames)){ +ini_rowname <- rep(ini.rownames, times = ncol(data)) +output.data <- cbind(output.data, ini_rowname) +} +}else{ # transfo 2 +if(class(data[, 1]) == "character"){ +data <- cbind(data[2], data[1]) +} +nc.max <- max(table(data[, 2])) # effectif maximum des classes +nb.na <- nc.max - table(data[,2]) # nombre de NA à ajouter pour réaliser la data frame +tempo<-split(data[, 1], data[, 2]) +for(i in 1:length(tempo)){tempo[[i]] <- append(tempo[[i]], rep(NA, nb.na[i]))} # des NA doivent être ajoutés lorsque les effectifs sont différents entre les classes. C'est uniquement pour que chaque colonne ait le même nombre de lignes +output.data<-data.frame(tempo) +} +return(output.data) } @@ -1400,185 +1405,185 @@ fun_df_remod <- function(data, quanti.col.name = "quanti", quali.col.name = "qua fun_merge <- function(data1, data2, name1, name2, factor.as = "numeric", warn.print = FALSE){ - # AIM - # merge the columns of 2 data frames or 2 matrices or 2 tables, by associating the rows according to 1 or several common colums that must be strictly similar between the 2 objects - # contrary to the classical merge() function of R, fun_merge() orders the rows of the 2 objects according to the common columns, and merge only and only if the ordered common columns are strictly identical. Otherwise return an error - # keep row names of data1 in the merged object if they exist. Do not consider row names of data2 - # keep the intial row order of data1 after merging - # BEWARE: - # REQUIRED PACKAGES - # none - # REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION - # fun_2d_comp() - # fun_check() - # ARGUMENTS - # data1: matrix or data frame or table - # data2: same class of object as data1 (data frame for data1 data frame, matrix for data1 matrix and table for data1 table) with same number of rows as in data1 - # name1: either a vector of character strings or a vector of integer. If character strings, they must be the name of the columns in data1 that are common to the columns in data2. If integers, they must be the column numbers in data1 that are common to column numbers in data2. name1 can be strings and name2 (below) integers, and vice-versa. BEWARE: order of the elements in data1 are important as ordering is according to the first element, then the second, etc. - # name2: as in name1 but for data2. Order in name2 is not important as order in name1 is used for the ordering - # factor.as: either "numeric" (sort factors according to levels order, i.e., class number) or "character" (sort factors according to alphabetical order) - # warn.print: logical. Print warnings at the end of the execution? No print if no warning messages - # RETURN - # a list containing: - # $data: the merged data frame or matrix or table - # $warnings: the warning messages. Use cat() for proper display. NULL if no warning - # EXAMPLES - # obs1 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; obs2 = as.data.frame(matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5]))) ; obs1 ; obs2 ; fun_2d_comp(obs1, obs2) - # DEBUGGING - # data1 = matrix(1.0001:21, ncol = 4) ; dimnames(data1) <- list(LETTERS[1:5], letters[1:4]); data2 = matrix(1.0001:31, ncol = 6) ; dimnames(data2) <- list(NULL, c("a", "aa", "c", "d", "aaa", "aaaa")) ; set.seed(1) ; data2[, "c"] <- sample(data2[, "c"]) ; data2[, "d"] <- sample(data2[, "d"]) ; set.seed(NULL) ; data1 ; data2 ; name1 = c("c", "d") ; name2 = c("d", "c") ; factor.as = "numeric" # for function debugging - # function name - function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") - # end function name - # required function checking - if(length(find("fun_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking using fun_check() - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo1 <- fun_check(data = data1, class = "matrix", print = FALSE) - tempo2 <- fun_check(data = data1, class = "data.frame", print = FALSE) - tempo3 <- fun_check(data = data1, class = "table", print = FALSE) - if(tempo1$problem == TRUE & tempo2$problem == TRUE & tempo3$problem == TRUE){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ":\ndata1 ARGUMENT MUST BE A 2D OBJECT (MATRIX, DATA FRAME OR TABLE)\nHERE IT IS: ", paste(class(data1), collapse = " "), "\n\n================\n\n") # - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - tempo1 <- fun_check(data = data2, class = "matrix", print = FALSE) - tempo2 <- fun_check(data = data2, class = "data.frame", print = FALSE) - tempo3 <- fun_check(data = data2, class = "table", print = FALSE) - if(tempo1$problem == TRUE & tempo2$problem == TRUE & tempo3$problem == TRUE){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ":\ndata2 ARGUMENT MUST BE A 2D OBJECT (MATRIX, DATA FRAME OR TABLE)\nHERE IT IS: ", paste(class(data2), collapse = " "), "\n\n================\n\n") # - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - if( ! identical(class(data1), class(data2))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ":\ndata1 and data2 ARGUMENTS MUST BE A 2D OBJECT (MATRIX, DATA FRAME OR TABLE) OF SAME CLASS\nHERE IT IS RESPECTIVELY: ", paste(class(data1), collapse = " "), " AND ", paste(class(data2), collapse = " "), "\n\n================\n\n") # - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - tempo1 <- fun_check(data = name1, class = "vector", typeof = "integer", , double.as.integer.allowed = TRUE, print = FALSE) - tempo2 <- fun_check(data = name1, class = "vector", typeof = "character", , print = FALSE) - if(tempo1$problem == TRUE & tempo2$problem == TRUE){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ":\nname1 ARGUMENT MUST BE A UNIQUE CHARACTER STRING OR INTEGER\nHERE IT IS: ", paste(name1, collapse = " "), "\n\n================\n\n") # - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - tempo1 <- fun_check(data = name2, class = "vector", typeof = "integer", , double.as.integer.allowed = TRUE, print = FALSE) - tempo2 <- fun_check(data = name2, class = "vector", typeof = "character", , print = FALSE) - if(tempo1$problem == TRUE & tempo2$problem == TRUE){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ":\nname2 ARGUMENT MUST BE A UNIQUE CHARACTER STRING OR INTEGER\nHERE IT IS: ", paste(name2, collapse = " "), "\n\n================\n\n") # - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - tempo <- fun_check(data = factor.as, options = c("numeric", "character"), length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = warn.print, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_check() - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() - # end argument checking using fun_check() - # other argument checking - # column existence - if(mode(name1) == "character"){ - if( ! all(name1 %in% colnames(data1))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ":\nTHE CHARACTER STRINGS IN name1 ARGUMENT ARE NOT ALL COLUMN NAMES OF data1:\n", paste(name1, collapse = " "), "\n", colnames(data1), "\n\n================\n\n") # - stop(tempo.cat) - } - }else if(mode(name1) == "numeric"){ - if( ! all((name1 > ncol(data1) & name1 <= 0))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ":\nINTEGERS IN name1 ARGUMENT ARE NOT ALL COLUMN NUMBERS OF data1:\n", paste(name1, collapse = " "), "\n1:", ncol(data1), "\n\n================\n\n") # - stop(tempo.cat) - } - }else{ - tempo.cat <- paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 1\n\n============\n\n") - stop(tempo.cat) - } - if(mode(name2) == "character"){ - if( ! all(name2 %in% colnames(data2))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ":\nTHE CHARACTER STRINGS IN name2 ARGUMENT ARE NOT ALL COLUMN NAMES OF data2:\n", paste(name2, collapse = " "), "\n", colnames(data2), "\n\n================\n\n") # - stop(tempo.cat) - } - }else if(mode(name2) == "numeric"){ - if( ! all((name2 > ncol(data2) & name2 <= 0))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ":\nINTEGERS IN name2 ARGUMENT ARE NOT ALL COLUMN NUMBERS OF data2:\n", paste(name2, collapse = " "), "\n1:", ncol(data2), "\n\n================\n\n") # - stop(tempo.cat) - } - }else{ - tempo.cat <- paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 2\n\n============\n\n") - stop(tempo.cat) - } - if(length(name1) != length(name2)){ - tempo.cat <- paste0("\n\n============\n\nERROR IN ", function.name, ":\nLENGTH OF name1 ARGUMENT (", length(name1), ") IS NOT THE SAME AS LENGTH OF name2 ARGUMENT (", length(name2), "):\n", paste(name1, collapse = " "), "\n", paste(name2, collapse = " "), "\n\n============\n\n") - stop(tempo.cat) - } - # end column existence - # end other argument checking - # main code - # definition of set1 and set2: common columns - set1 <- data1[, name1, drop = FALSE] # set1 will be the reference for merging, drop = FALSE to keep the 2D structure - if(any(apply(set1, 2, FUN = "%in%", "factor"))){ - if(factor.as == "numeric"){ - set1[, apply(set1, 2, FUN = "%in%", "factor")] <- as.numeric(set1[, apply(set1, 2, FUN = "%in%", "factor")]) - } - } - set2 <- data2[, name2, drop = FALSE] # set2 will be the reference for merging, drop = FALSE to keep the 2D structure - if(any(apply(set2, 2, FUN = "%in%", "factor"))){ - if(factor.as == "numeric"){ - set2[, apply(set2, 2, FUN = "%in%", "factor")] <- as.numeric(set2[, apply(set2, 2, FUN = "%in%", "factor")]) - } - } - # end definition of set1 and set2: common columns - # conversion as character to avoid floating point problems - options.ini <- options()$digits - options(digits = 22) - set1 <- as.matrix(set1) - set2 <- as.matrix(set2) - mode(set1) <- "character" - mode(set2) <- "character" - options(digits = options.ini) - # end conversion as character to avoid floating point problems - # recovering initial order of set1 - ini.set1.order <- eval(parse(text = paste("order(", paste("set1[, ", 1:ncol(set1), "]", sep = "", collapse = ", "), ")"))) - set1 <- set1[ini.set1.order, ] - ini.set2.order <- eval(parse(text = paste("order(", paste("set2[, ", 1:ncol(set2), "]", sep = "", collapse = ", "), ")"))) - set2 <- set2[ini.set2.order, ] - # end recovering initial order of set1 - # check non identical columns - if(length(name1) > 1){ - for(i2 in 1:(length(name1) - 1)){ - for(i3 in (i2 + 1):length(name1)){ - if(identical(set1[, i2], set1[, i3])){ - tempo.cat <- paste0("\n\n============\n\nERROR IN ", function.name, ":\nCOLUMN ", i2, " OF data1 CORRESPONDING TO ELEMENT ", name1[i2], " OF name1 ARGUMENT IS IDENTICAL TO COLUMN ", i3, " OF data1 CORRESPONDING TO ELEMENT ", name1[i3], " OF name1 ARGUMENT\n\n============\n\n") - stop(tempo.cat) - } - } - } - } - if(length(name2) > 1){ - for(i2 in 1:(length(name2) - 1)){ - for(i3 in (i2 + 1):length(name2)){ - if(identical(set2[, i2], set2[, i3])){ - tempo.cat <- paste0("\n\n============\n\nERROR IN ", function.name, ":\nCOLUMN ", i2, " OF data2 CORRESPONDING TO ELEMENT ", name2[i2], " OF name2 ARGUMENT IS IDENTICAL TO COLUMN ", i3, " OF data2 CORRESPONDING TO ELEMENT ", name2[i3], " OF name2 ARGUMENT\n\n============\n\n") - stop(tempo.cat) - } - } - } - } - # end check non identical columns - # warning duplicates - # repositioning of the column in set2 as in set1 by comparing the two sorted column - #deal with identical col names when merging -> .x for data1, .y for data2 - - - if(warn.print == TRUE & ! is.null(warning)){ - warning(warning) - } - # output <- list() - return(output) +# AIM +# merge the columns of 2 data frames or 2 matrices or 2 tables, by associating the rows according to 1 or several common colums that must be strictly similar between the 2 objects +# contrary to the classical merge() function of R, fun_merge() orders the rows of the 2 objects according to the common columns, and merge only and only if the ordered common columns are strictly identical. Otherwise return an error +# keep row names of data1 in the merged object if they exist. Do not consider row names of data2 +# keep the intial row order of data1 after merging +# BEWARE: +# REQUIRED PACKAGES +# none +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_2d_comp() +# fun_check() +# ARGUMENTS +# data1: matrix or data frame or table +# data2: same class of object as data1 (data frame for data1 data frame, matrix for data1 matrix and table for data1 table) with same number of rows as in data1 +# name1: either a vector of character strings or a vector of integer. If character strings, they must be the name of the columns in data1 that are common to the columns in data2. If integers, they must be the column numbers in data1 that are common to column numbers in data2. name1 can be strings and name2 (below) integers, and vice-versa. BEWARE: order of the elements in data1 are important as ordering is according to the first element, then the second, etc. +# name2: as in name1 but for data2. Order in name2 is not important as order in name1 is used for the ordering +# factor.as: either "numeric" (sort factors according to levels order, i.e., class number) or "character" (sort factors according to alphabetical order) +# warn.print: logical. Print warnings at the end of the execution? No print if no warning messages +# RETURN +# a list containing: +# $data: the merged data frame or matrix or table +# $warnings: the warning messages. Use cat() for proper display. NULL if no warning +# EXAMPLES +# obs1 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; obs2 = as.data.frame(matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5]))) ; obs1 ; obs2 ; fun_2d_comp(obs1, obs2) +# DEBUGGING +# data1 = matrix(1.0001:21, ncol = 4) ; dimnames(data1) <- list(LETTERS[1:5], letters[1:4]); data2 = matrix(1.0001:31, ncol = 6) ; dimnames(data2) <- list(NULL, c("a", "aa", "c", "d", "aaa", "aaaa")) ; set.seed(1) ; data2[, "c"] <- sample(data2[, "c"]) ; data2[, "d"] <- sample(data2[, "d"]) ; set.seed(NULL) ; data1 ; data2 ; name1 = c("c", "d") ; name2 = c("d", "c") ; factor.as = "numeric" # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking using fun_check() +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo1 <- fun_check(data = data1, class = "matrix", print = FALSE) +tempo2 <- fun_check(data = data1, class = "data.frame", print = FALSE) +tempo3 <- fun_check(data = data1, class = "table", print = FALSE) +if(tempo1$problem == TRUE & tempo2$problem == TRUE & tempo3$problem == TRUE){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ":\ndata1 ARGUMENT MUST BE A 2D OBJECT (MATRIX, DATA FRAME OR TABLE)\nHERE IT IS: ", paste(class(data1), collapse = " "), "\n\n================\n\n") # +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +tempo1 <- fun_check(data = data2, class = "matrix", print = FALSE) +tempo2 <- fun_check(data = data2, class = "data.frame", print = FALSE) +tempo3 <- fun_check(data = data2, class = "table", print = FALSE) +if(tempo1$problem == TRUE & tempo2$problem == TRUE & tempo3$problem == TRUE){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ":\ndata2 ARGUMENT MUST BE A 2D OBJECT (MATRIX, DATA FRAME OR TABLE)\nHERE IT IS: ", paste(class(data2), collapse = " "), "\n\n================\n\n") # +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +if( ! identical(class(data1), class(data2))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ":\ndata1 and data2 ARGUMENTS MUST BE A 2D OBJECT (MATRIX, DATA FRAME OR TABLE) OF SAME CLASS\nHERE IT IS RESPECTIVELY: ", paste(class(data1), collapse = " "), " AND ", paste(class(data2), collapse = " "), "\n\n================\n\n") # +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +tempo1 <- fun_check(data = name1, class = "vector", typeof = "integer", , double.as.integer.allowed = TRUE, print = FALSE) +tempo2 <- fun_check(data = name1, class = "vector", typeof = "character", , print = FALSE) +if(tempo1$problem == TRUE & tempo2$problem == TRUE){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ":\nname1 ARGUMENT MUST BE A UNIQUE CHARACTER STRING OR INTEGER\nHERE IT IS: ", paste(name1, collapse = " "), "\n\n================\n\n") # +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +tempo1 <- fun_check(data = name2, class = "vector", typeof = "integer", , double.as.integer.allowed = TRUE, print = FALSE) +tempo2 <- fun_check(data = name2, class = "vector", typeof = "character", , print = FALSE) +if(tempo1$problem == TRUE & tempo2$problem == TRUE){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ":\nname2 ARGUMENT MUST BE A UNIQUE CHARACTER STRING OR INTEGER\nHERE IT IS: ", paste(name2, collapse = " "), "\n\n================\n\n") # +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +tempo <- fun_check(data = factor.as, options = c("numeric", "character"), length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = warn.print, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_check() +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() +# end argument checking using fun_check() +# other argument checking +# column existence +if(mode(name1) == "character"){ +if( ! all(name1 %in% colnames(data1))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ":\nTHE CHARACTER STRINGS IN name1 ARGUMENT ARE NOT ALL COLUMN NAMES OF data1:\n", paste(name1, collapse = " "), "\n", colnames(data1), "\n\n================\n\n") # +stop(tempo.cat) +} +}else if(mode(name1) == "numeric"){ +if( ! all((name1 > ncol(data1) & name1 <= 0))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ":\nINTEGERS IN name1 ARGUMENT ARE NOT ALL COLUMN NUMBERS OF data1:\n", paste(name1, collapse = " "), "\n1:", ncol(data1), "\n\n================\n\n") # +stop(tempo.cat) +} +}else{ +tempo.cat <- paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 1\n\n============\n\n") +stop(tempo.cat) +} +if(mode(name2) == "character"){ +if( ! all(name2 %in% colnames(data2))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ":\nTHE CHARACTER STRINGS IN name2 ARGUMENT ARE NOT ALL COLUMN NAMES OF data2:\n", paste(name2, collapse = " "), "\n", colnames(data2), "\n\n================\n\n") # +stop(tempo.cat) +} +}else if(mode(name2) == "numeric"){ +if( ! all((name2 > ncol(data2) & name2 <= 0))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ":\nINTEGERS IN name2 ARGUMENT ARE NOT ALL COLUMN NUMBERS OF data2:\n", paste(name2, collapse = " "), "\n1:", ncol(data2), "\n\n================\n\n") # +stop(tempo.cat) +} +}else{ +tempo.cat <- paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 2\n\n============\n\n") +stop(tempo.cat) +} +if(length(name1) != length(name2)){ +tempo.cat <- paste0("\n\n============\n\nERROR IN ", function.name, ":\nLENGTH OF name1 ARGUMENT (", length(name1), ") IS NOT THE SAME AS LENGTH OF name2 ARGUMENT (", length(name2), "):\n", paste(name1, collapse = " "), "\n", paste(name2, collapse = " "), "\n\n============\n\n") +stop(tempo.cat) +} +# end column existence +# end other argument checking +# main code +# definition of set1 and set2: common columns +set1 <- data1[, name1, drop = FALSE] # set1 will be the reference for merging, drop = FALSE to keep the 2D structure +if(any(apply(set1, 2, FUN = "%in%", "factor"))){ +if(factor.as == "numeric"){ +set1[, apply(set1, 2, FUN = "%in%", "factor")] <- as.numeric(set1[, apply(set1, 2, FUN = "%in%", "factor")]) +} +} +set2 <- data2[, name2, drop = FALSE] # set2 will be the reference for merging, drop = FALSE to keep the 2D structure +if(any(apply(set2, 2, FUN = "%in%", "factor"))){ +if(factor.as == "numeric"){ +set2[, apply(set2, 2, FUN = "%in%", "factor")] <- as.numeric(set2[, apply(set2, 2, FUN = "%in%", "factor")]) +} +} +# end definition of set1 and set2: common columns +# conversion as character to avoid floating point problems +options.ini <- options()$digits +options(digits = 22) +set1 <- as.matrix(set1) +set2 <- as.matrix(set2) +mode(set1) <- "character" +mode(set2) <- "character" +options(digits = options.ini) +# end conversion as character to avoid floating point problems +# recovering initial order of set1 +ini.set1.order <- eval(parse(text = paste("order(", paste("set1[, ", 1:ncol(set1), "]", sep = "", collapse = ", "), ")"))) +set1 <- set1[ini.set1.order, ] +ini.set2.order <- eval(parse(text = paste("order(", paste("set2[, ", 1:ncol(set2), "]", sep = "", collapse = ", "), ")"))) +set2 <- set2[ini.set2.order, ] +# end recovering initial order of set1 +# check non identical columns +if(length(name1) > 1){ +for(i2 in 1:(length(name1) - 1)){ +for(i3 in (i2 + 1):length(name1)){ +if(identical(set1[, i2], set1[, i3])){ +tempo.cat <- paste0("\n\n============\n\nERROR IN ", function.name, ":\nCOLUMN ", i2, " OF data1 CORRESPONDING TO ELEMENT ", name1[i2], " OF name1 ARGUMENT IS IDENTICAL TO COLUMN ", i3, " OF data1 CORRESPONDING TO ELEMENT ", name1[i3], " OF name1 ARGUMENT\n\n============\n\n") +stop(tempo.cat) +} +} +} +} +if(length(name2) > 1){ +for(i2 in 1:(length(name2) - 1)){ +for(i3 in (i2 + 1):length(name2)){ +if(identical(set2[, i2], set2[, i3])){ +tempo.cat <- paste0("\n\n============\n\nERROR IN ", function.name, ":\nCOLUMN ", i2, " OF data2 CORRESPONDING TO ELEMENT ", name2[i2], " OF name2 ARGUMENT IS IDENTICAL TO COLUMN ", i3, " OF data2 CORRESPONDING TO ELEMENT ", name2[i3], " OF name2 ARGUMENT\n\n============\n\n") +stop(tempo.cat) +} +} +} +} +# end check non identical columns +# warning duplicates +# repositioning of the column in set2 as in set1 by comparing the two sorted column +#deal with identical col names when merging -> .x for data1, .y for data2 + + +if(warn.print == TRUE & ! is.null(warning)){ +warning(warning) +} +# output <- list() +return(output) } @@ -1587,82 +1592,82 @@ fun_merge <- function(data1, data2, name1, name2, factor.as = "numeric", warn.pr # Check OK: clear to go Apollo fun_round <- function(data, dec.nb = 2, after.lead.zero = TRUE){ - # AIM - # round a vector of values, if decimal, with the desired number of decimal digits after the decimal leading zeros - # WARNINGS - # Work well with numbers as character strings, but not always with numerical numbers because of the floating point - # Numeric values are really truncated from a part of their decimal digits, whatever options(digits) settings - # See ?.Machine or https://stackoverflow.com/questions/5173692/how-to-return-number-of-decimal-places-in-r, with the interexting formula: abs(x - round(x)) > .Machine$double.eps^0.5 - # ARGUMENTS - # data: a vector of numbers (numeric or character mode) - # dec.nb: number of required decimal digits - # after.lead.zero: logical. If FALSE, rounding is performed for all the decimal numbers, whatever the leading zeros (e.g., 0.123 -> 0.12 and 0.00128 -> 0.00). If TRUE, dec.nb are taken after the leading zeros (e.g., 0.123 -> 0.12 and 0.00128 -> 0.0013) - # REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION - # fun_check() - # RETURN - # the modified vector - # EXAMPLES - # ini.options <- options()$digits ; options(digits = 8) ; cat(fun_round(data = c(NA, 10, 100.001, 333.0001254, 12312.1235), dec.nb = 2, after.lead.zero = FALSE), "\n\n") ; options(digits = ini.options) - # ini.options <- options()$digits ; options(digits = 8) ; cat(fun_round(data = c(NA, 10, 100.001, 333.0001254, 12312.1235), dec.nb = 2, after.lead.zero = TRUE), "\n\n") ; options(digits = ini.options) - # ini.options <- options()$digits ; options(digits = 8) ; cat(fun_round(data = c(NA, "10", "100.001", "333.0001254", "12312.1235"), dec.nb = 2, after.lead.zero = FALSE), "\n\n") ; options(digits = ini.options) - # ini.options <- options()$digits ; options(digits = 8) ; cat(fun_round(data = c(NA, "10", "100.001", "333.0001254", "12312.1235"), dec.nb = 2, after.lead.zero = TRUE), "\n\n") ; options(digits = ini.options) - # DEBUGGING - # data = data = c(10, 100.001, 333.0001254, 12312.1235) ; dec.nb = 2 ; after.lead.zero = FALSE # # for function debugging - # data = data = c("10", "100.001", "333.0001254", "12312.1235") ; dec.nb = 2 ; after.lead.zero = TRUE # # for function debugging - # function name - function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") - # end function name - # required function checking - if(length(find("fun_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - # argument checking without fun_check() - if( ! (all(typeof(data) == "character") | all(typeof(data) == "double") | all(typeof(data) == "integer"))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": data ARGUMENT MUST BE A VECTOR OF NUMBERS (IN NUMERIC OR CHARACTER MODE)\n\n================\n\n") - stop(tempo.cat) - } - # end argument checking without fun_check() - # argument checking with fun_check() - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_check(data = data, class = "vector", na.contain = TRUE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = dec.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = after.lead.zero, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_check() - } - # end argument checking with fun_check() - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() - # end argument checking - # main code - tempo <- grepl(x = data, pattern = "\\.") # detection of decimal numbers - ini.mode <- mode(data) - data <- as.character(data) # to really truncate decimal digits - for(i in 1:length(data)){ # scan all the numbers of the vector - if(tempo[i] == TRUE){ # means decimal number - if(after.lead.zero == TRUE){ - zero.pos <- unlist(gregexpr(text=data[i], pattern = 0)) # recover all the position of the zeros in the number. -1 if no zeros (do not record the leading and trailing zeros) - }else{ - zero.pos <- -1 # -1 as if no zero - } - dot.pos <- unlist(gregexpr(text=data[i], pattern = "\\.")) # recover all the position of the zeros in the number - digit.pos <- unlist(gregexpr(text=data[i], pattern = "[[:digit:]]")) # recover all the position of the digits in the number - dec.pos <- digit.pos[digit.pos > dot.pos] - count <- 0 - while((dot.pos + count + 1) %in% zero.pos & (dot.pos + count + 1) <= max(dec.pos) & (count + dec.nb) < length(dec.pos)){ # count the number of leading zeros in the decimal part - count <- count + 1 - } - data[i] <- formatC(as.numeric(data[i]), digits = (count + dec.nb), format = "f") - } - } - if(ini.mode != "character"){ - data <- as.numeric(data) - } - return(data) +# AIM +# round a vector of values, if decimal, with the desired number of decimal digits after the decimal leading zeros +# WARNINGS +# Work well with numbers as character strings, but not always with numerical numbers because of the floating point +# Numeric values are really truncated from a part of their decimal digits, whatever options(digits) settings +# See ?.Machine or https://stackoverflow.com/questions/5173692/how-to-return-number-of-decimal-places-in-r, with the interexting formula: abs(x - round(x)) > .Machine$double.eps^0.5 +# ARGUMENTS +# data: a vector of numbers (numeric or character mode) +# dec.nb: number of required decimal digits +# after.lead.zero: logical. If FALSE, rounding is performed for all the decimal numbers, whatever the leading zeros (e.g., 0.123 -> 0.12 and 0.00128 -> 0.00). If TRUE, dec.nb are taken after the leading zeros (e.g., 0.123 -> 0.12 and 0.00128 -> 0.0013) +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_check() +# RETURN +# the modified vector +# EXAMPLES +# ini.options <- options()$digits ; options(digits = 8) ; cat(fun_round(data = c(NA, 10, 100.001, 333.0001254, 12312.1235), dec.nb = 2, after.lead.zero = FALSE), "\n\n") ; options(digits = ini.options) +# ini.options <- options()$digits ; options(digits = 8) ; cat(fun_round(data = c(NA, 10, 100.001, 333.0001254, 12312.1235), dec.nb = 2, after.lead.zero = TRUE), "\n\n") ; options(digits = ini.options) +# ini.options <- options()$digits ; options(digits = 8) ; cat(fun_round(data = c(NA, "10", "100.001", "333.0001254", "12312.1235"), dec.nb = 2, after.lead.zero = FALSE), "\n\n") ; options(digits = ini.options) +# ini.options <- options()$digits ; options(digits = 8) ; cat(fun_round(data = c(NA, "10", "100.001", "333.0001254", "12312.1235"), dec.nb = 2, after.lead.zero = TRUE), "\n\n") ; options(digits = ini.options) +# DEBUGGING +# data = data = c(10, 100.001, 333.0001254, 12312.1235) ; dec.nb = 2 ; after.lead.zero = FALSE # # for function debugging +# data = data = c("10", "100.001", "333.0001254", "12312.1235") ; dec.nb = 2 ; after.lead.zero = TRUE # # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +# argument checking without fun_check() +if( ! (all(typeof(data) == "character") | all(typeof(data) == "double") | all(typeof(data) == "integer"))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": data ARGUMENT MUST BE A VECTOR OF NUMBERS (IN NUMERIC OR CHARACTER MODE)\n\n================\n\n") +stop(tempo.cat) +} +# end argument checking without fun_check() +# argument checking with fun_check() +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_check(data = data, class = "vector", na.contain = TRUE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = dec.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = after.lead.zero, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_check() +} +# end argument checking with fun_check() +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() +# end argument checking +# main code +tempo <- grepl(x = data, pattern = "\\.") # detection of decimal numbers +ini.mode <- mode(data) +data <- as.character(data) # to really truncate decimal digits +for(i in 1:length(data)){ # scan all the numbers of the vector +if(tempo[i] == TRUE){ # means decimal number +if(after.lead.zero == TRUE){ +zero.pos <- unlist(gregexpr(text=data[i], pattern = 0)) # recover all the position of the zeros in the number. -1 if no zeros (do not record the leading and trailing zeros) +}else{ +zero.pos <- -1 # -1 as if no zero +} +dot.pos <- unlist(gregexpr(text=data[i], pattern = "\\.")) # recover all the position of the zeros in the number +digit.pos <- unlist(gregexpr(text=data[i], pattern = "[[:digit:]]")) # recover all the position of the digits in the number +dec.pos <- digit.pos[digit.pos > dot.pos] +count <- 0 +while((dot.pos + count + 1) %in% zero.pos & (dot.pos + count + 1) <= max(dec.pos) & (count + dec.nb) < length(dec.pos)){ # count the number of leading zeros in the decimal part +count <- count + 1 +} +data[i] <- formatC(as.numeric(data[i]), digits = (count + dec.nb), format = "f") +} +} +if(ini.mode != "character"){ +data <- as.numeric(data) +} +return(data) } @@ -1671,43 +1676,43 @@ fun_round <- function(data, dec.nb = 2, after.lead.zero = TRUE){ # Check OK: clear to go Apollo fun_mat_rotate <- function(data){ - # AIM - # 90° clockwise matrix rotation - # applied twice, the function provide the mirror matrix, according to vertical and horizontal symmetry - # REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION - # fun_check() - # ARGUMENTS - # data: matrix (matrix class) - # RETURN - # the modified matrix - # EXAMPLES - # obs <- matrix(1:10, ncol = 1) ; obs ; fun_mat_rotate(obs) - # obs <- matrix(LETTERS[1:10], ncol = 5) ; obs ; fun_mat_rotate(obs) - # DEBUGGING - # data = matrix(1:10, ncol = 1) - # function name - function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") - # end function name - # required function checking - if(length(find("fun_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_check(data = data, class = "matrix", fun.name = function.name) ; eval(ee) - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_check() - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() - # end argument checking - # main code - for (i in 1:ncol(data)){data[,i] <- rev(data[,i])} - data <- t(data) - return(data) +# AIM +# 90° clockwise matrix rotation +# applied twice, the function provide the mirror matrix, according to vertical and horizontal symmetry +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_check() +# ARGUMENTS +# data: matrix (matrix class) +# RETURN +# the modified matrix +# EXAMPLES +# obs <- matrix(1:10, ncol = 1) ; obs ; fun_mat_rotate(obs) +# obs <- matrix(LETTERS[1:10], ncol = 5) ; obs ; fun_mat_rotate(obs) +# DEBUGGING +# data = matrix(1:10, ncol = 1) +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_check(data = data, class = "matrix", fun.name = function.name) ; eval(ee) +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_check() +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() +# end argument checking +# main code +for (i in 1:ncol(data)){data[,i] <- rev(data[,i])} +data <- t(data) +return(data) } @@ -1716,228 +1721,228 @@ fun_mat_rotate <- function(data){ # Check OK: clear to go Apollo fun_mat_num2color <- function(mat1, mat.hsv.h = TRUE, notch = 1, s = 1, v = 1, forced.color = NULL){ - # AIM - # convert a matrix made of numbers into a hexadecimal matrix for rgb colorization - # REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION - # fun_check() - # ARGUMENTS: - # mat1: matrix 1 of non negative numerical values that has to be colored (matrix class). NA allowed - # mat.hsv.h: logical. Is mat1 the h of hsv colors ? (if TRUE, mat1 must be between zero and 1) - # notch: single value between 0 and 1 to shift the successive colors on the hsv circle by + notch - # s: s argument of hsv(). Must be between 0 and 1 - # v: v argument of hsv(). Must be between 0 and 1 - # forced.color: Must be NULL or hexadecimal color code or name given by colors(). The first minimal values of mat1 will be these colors. All the color of mat1 can be forced using this argument - # RETURN - # a list containing: - # $mat1.name: name of mat1 - # $colored.mat: colors of mat1 in hexa - # $problem: logical. Is any colors of forced.color overlap the colors designed by the function. NULL if forced.color = NULL - # $text.problem: text when overlapping colors. NULL if forced.color = NULL or problem == FALSE - # EXAMPLES - # mat1 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2) ; dimnames(mat1) <- list(LETTERS[1:4], letters[1:2]) ; fun_mat_num2color(mat1, mat.hsv.h = FALSE, notch = 1, s = 1, v = 1, forced.color = NULL) - # DEBUGGING - # mat1 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2) ; dimnames(mat1) <- list(LETTERS[1:4], letters[1:2]); mat.hsv.h = FALSE ; notch = 1 ; s = 1 ; v = 1 ; forced.color = c(hsv(1,1,1), hsv(0,0,0)) # for function debugging - # function name - function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") - # end function name - # required function checking - if(length(find("fun_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - # argument checking with fun_check() - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_check(data = mat1, mode = "numeric", class = "matrix", na.contain = TRUE, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = mat.hsv.h, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = notch, class = "vector", mode = "numeric", length = 1, prop = TRUE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = s, class = "vector", mode = "numeric", length = 1, prop = TRUE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = v, class = "vector", mode = "numeric", length = 1, prop = TRUE, fun.name = function.name) ; eval(ee) - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_check() - } - # end argument checking with fun_check() - # argument checking without fun_check() - if(mat.hsv.h == TRUE & fun_check(data = mat1, mode = "numeric", prop = TRUE, print = FALSE)$problem == TRUE){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": mat1 ARGUMENT MUST BE A MATRIX OF PROPORTIONS SINCE THE mat.hsv.h ARGUMENT IS SET TO TRUE\n\n================\n\n") - stop(tempo.cat) - } - if( ! is.null(forced.color)){ - tempo <- fun_check(data = forced.color, class = "character") - if(tempo$problem == TRUE){ - stop() - } - if( ! all(forced.color %in% colors() | grepl(pattern = "^#", forced.color))){ # check that all strings of forced.color start by # - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": forced.color ARGUMENT MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # AND/OR COLOR NAMES GIVEN BY colors()\n\n================\n\n") - stop(tempo.cat) - } - } - # end argument checking without fun_check() - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() - # end argument checking - # main code - problem <- NULL - text.problem <- NULL - mat1.name <- deparse(substitute(mat1)) - # change the scale of the plotted matrix - if(mat.hsv.h == TRUE){ - if(any(min(mat1, na.rm = TRUE) < 0 | max(mat1, na.rm = TRUE) > 1, na.rm = TRUE)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": mat1 MUST BE MADE OF VALUES BETWEEN 0 AND 1 BECAUSE mat.hsv.h ARGUMENT SET TO TRUE\n\n================\n\n") - stop(tempo.cat) - } - }else{ - if(any(mat1 - floor(mat1) > 0, na.rm = TRUE) | any(mat1 == 0, na.rm = TRUE)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": mat1 MUST BE MADE OF INTEGER VALUES WITHOUT 0 BECAUSE mat.hsv.h ARGUMENT SET TO FALSE\n\n================\n\n") - stop(tempo.cat) - }else{ - mat1 <- mat1 / max(mat1, na.rm = TRUE) - } - } - if(notch != 1){ - different.color <- unique(as.vector(mat1)) - different.color <- different.color[ ! is.na(different.color)] - tempo.different.color <- different.color + c(0, cumsum(rep(notch, length(different.color) - 1))) - tempo.different.color <- tempo.different.color - floor(tempo.different.color) - if(any(duplicated(tempo.different.color) == TRUE)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": DUPLICATED VALUES AFTER USING notch (", paste(tempo.different.color[duplicated(tempo.different.color)], collapse = " "), "). TRY ANOTHER notch VALUE\n\n================\n\n") - stop(tempo.cat) - }else if(length(different.color) != length(tempo.different.color)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": LENGTH OF different.color (", paste(different.color, collapse = " "), ") DIFFERENT FROM LENGTH OF tempo.different.color (", paste(tempo.different.color, collapse = " "), ")\n\n================\n\n") - stop(tempo.cat) - }else{ - for(i in 1:length(different.color)){ - mat1[mat1 == different.color[i]] <- tempo.different.color[i] - } - } - } - if( ! is.null(forced.color)){ - hexa.values.to.change <- hsv(unique(sort(mat1))[1:length(forced.color)], s, v) - } - mat1[ ! is.na(mat1)] <- hsv(mat1[ ! is.na(mat1)], s, v) - if( ! is.null(forced.color)){ - if(any(forced.color %in% mat1, na.rm = TRUE)){ - problem <- TRUE - text.problem <- paste0("THE FOLLOWING COLORS WHERE INTRODUCED USING forced.color BUT WHERE ALREADY PRESENT IN THE COLORED MATRIX :", paste(forced.color[forced.color %in% mat1], collapse = " ")) - }else{ - problem <- FALSE - } - for(i in 1:length(hexa.values.to.change)){ - if( ! any(mat1 == hexa.values.to.change[i], na.rm = TRUE)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE ", hexa.values.to.change[i], " VALUE FROM hexa.values.to.change IS NOT REPRESENTED IN mat1 : ", paste(unique(as.vector(mat1)), collapse = " "), "\n\n================\n\n") - stop(tempo.cat) - }else{ - mat1[which(mat1 == hexa.values.to.change[i])] <- forced.color[i] - } - } - } - output <- list(mat1.name = mat1.name, colored.mat = mat1, problem = problem, text.problem = text.problem) - return(output) +# AIM +# convert a matrix made of numbers into a hexadecimal matrix for rgb colorization +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_check() +# ARGUMENTS: +# mat1: matrix 1 of non negative numerical values that has to be colored (matrix class). NA allowed +# mat.hsv.h: logical. Is mat1 the h of hsv colors ? (if TRUE, mat1 must be between zero and 1) +# notch: single value between 0 and 1 to shift the successive colors on the hsv circle by + notch +# s: s argument of hsv(). Must be between 0 and 1 +# v: v argument of hsv(). Must be between 0 and 1 +# forced.color: Must be NULL or hexadecimal color code or name given by colors(). The first minimal values of mat1 will be these colors. All the color of mat1 can be forced using this argument +# RETURN +# a list containing: +# $mat1.name: name of mat1 +# $colored.mat: colors of mat1 in hexa +# $problem: logical. Is any colors of forced.color overlap the colors designed by the function. NULL if forced.color = NULL +# $text.problem: text when overlapping colors. NULL if forced.color = NULL or problem == FALSE +# EXAMPLES +# mat1 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2) ; dimnames(mat1) <- list(LETTERS[1:4], letters[1:2]) ; fun_mat_num2color(mat1, mat.hsv.h = FALSE, notch = 1, s = 1, v = 1, forced.color = NULL) +# DEBUGGING +# mat1 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2) ; dimnames(mat1) <- list(LETTERS[1:4], letters[1:2]); mat.hsv.h = FALSE ; notch = 1 ; s = 1 ; v = 1 ; forced.color = c(hsv(1,1,1), hsv(0,0,0)) # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) } - - -######## fun_mat_op() #### assemble several matrices with operation - - -# Check OK: clear to go Apollo -fun_mat_op <- function(mat.list, kind.of.operation = "+"){ - # AIM - # assemble several matrices of same dimensions by performing by case operation. For instance add the value of all the case 1 (row1 & column1) of the matrices and put it in the case 1 of a new matrix M, add the value of all the case 2 (row2 & column1) of the matrices and put it in the case 2 of a new matrix M, etc. - - # c: case - # i: row number - # j: column number - # k: matrix number - # z: number of matrices - # REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION - # fun_check() - # fun_2d_comp() - # ARGUMENTS: - # mat.list: list of matrices - # kind.of.operation: either "+" (by case addition), "-" (by case subtraction) or "*" (by case multiplication) - # RETURN - # the assembled matrix, with row and/or column names only if all the matrices have identical row/column names - # EXAMPLES - # mat1 = matrix(c(1,1,1,2,1,5,9,8), ncol = 2) ; mat2 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2) ; fun_mat_op(mat.list = list(mat1, mat2), kind.of.operation = "+") - # mat1 = matrix(c(1,1,1,2,1,5,9,8), ncol = 2, dimnames = list(LETTERS[1:4], letters[1:2])) ; mat2 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2, dimnames = list(LETTERS[1:4], letters[1:2])) ; fun_mat_op(mat.list = list(mat1, mat2), kind.of.operation = "*") - # mat1 = matrix(c(1,1,1,2,1,5,9,8), ncol = 2, dimnames = list(LETTERS[1:4], c(NA, NA))) ; mat2 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2, dimnames = list(LETTERS[1:4], letters[1:2])) ; fun_mat_op(mat.list = list(mat1, mat2), kind.of.operation = "-") - # mat1 = matrix(c(1,1,1,2,1,5,9,8), ncol = 2, dimnames = list(c("A1", "A2", "A3", "A4"), letters[1:2])) ; mat2 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2, dimnames = list(LETTERS[1:4], letters[1:2])) ; mat3 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2, dimnames = list(LETTERS[1:4], letters[1:2])) ; fun_mat_op(mat.list = list(mat1, mat2, mat3), kind.of.operation = "+") - # DEBUGGING - # mat1 = matrix(c(1,1,1,2,1,5,9,8), ncol = 2) ; mat2 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2) ; mat.list = list(mat1, mat2) ; kind.of.operation = "+" # for function debugging - # mat1 = matrix(c(1,1,1,2,1,5,9,8), ncol = 2, dimnames = list(LETTERS[1:4], c(NA, NA))) ; mat2 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2, dimnames = list(LETTERS[1:4], letters[1:2])) ; mat.list = list(mat1, mat2) ; kind.of.operation = "*" # for function debugging - # function name - function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") - # end function name - # required function checking - if(length(find("fun_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - if(length(find("fun_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_2d_comp() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - # argument checking with fun_check() - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_check(data = mat.list, class = "list", fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = kind.of.operation, options = c("+", "-", "*"), length = 1, fun.name = function.name) ; eval(ee) - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_check() - } - # end argument checking with fun_check() - # argument checking without fun_check() - if(length(mat.list) < 2){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": mat.list ARGUMENT MUST BE A LIST CONTAINING AT LEAST 2 MATRICES\n\n================\n\n") - stop(tempo.cat) - } - for(i0 in 1:length(mat.list)){ - tempo <- fun_check(data = mat.list[[i0]], class = "matrix", mode = "numeric", na.contain = TRUE) - if(tempo$problem == TRUE){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ELEMENT ", i0, " OF mat.list ARGUMENT MUST BE A NUMERIC MATRIX\n\n================\n\n") - stop(tempo.cat) - } - } - ident.row.names <- TRUE - ident.col.names <- TRUE - for(i0 in 2:length(mat.list)){ - tempo <- fun_2d_comp(data1 = mat.list[[1]], data2 = mat.list[[i0]]) - if(tempo$same.dim == FALSE){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": MATRIX ", i0, " OF mat.list ARGUMENT MUST HAVE THE SAME DIMENSION (", paste(dim(mat.list[[i0]]), collapse = " "), ") THAN THE MATRIX 1 IN mat.list (", paste(dim(mat.list[[1]]), collapse = " "), ")\n\n================\n\n") - stop(tempo.cat) - } - if( ! is.null(tempo$same.row.name)){ - if(tempo$same.row.name != TRUE){ # != TRUE to deal with NA - ident.row.names <- FALSE - } - } - if( ! is.null(tempo$same.col.name)){ - if(tempo$same.col.name != TRUE){ # != TRUE to deal with NA - ident.col.names <- FALSE - } - } - } - # end argument checking without fun_check() - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() - # end argument checking - # main code - output <- mat.list[[1]] - for(i0 in 2:length(mat.list)){ - output <- get(kind.of.operation)(output, mat.list[[i0]]) - } - dimnames(output) <- NULL - if(ident.row.names == TRUE){ - rownames(output) <- rownames(mat.list[[1]]) - } - if(ident.col.names == TRUE){ - colnames(output) <- colnames(mat.list[[1]]) - } - return(output) +# end required function checking +# argument checking +# argument checking with fun_check() +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_check(data = mat1, mode = "numeric", class = "matrix", na.contain = TRUE, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = mat.hsv.h, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = notch, class = "vector", mode = "numeric", length = 1, prop = TRUE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = s, class = "vector", mode = "numeric", length = 1, prop = TRUE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = v, class = "vector", mode = "numeric", length = 1, prop = TRUE, fun.name = function.name) ; eval(ee) +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_check() +} +# end argument checking with fun_check() +# argument checking without fun_check() +if(mat.hsv.h == TRUE & fun_check(data = mat1, mode = "numeric", prop = TRUE, print = FALSE)$problem == TRUE){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": mat1 ARGUMENT MUST BE A MATRIX OF PROPORTIONS SINCE THE mat.hsv.h ARGUMENT IS SET TO TRUE\n\n================\n\n") +stop(tempo.cat) +} +if( ! is.null(forced.color)){ +tempo <- fun_check(data = forced.color, class = "character") +if(tempo$problem == TRUE){ +stop() +} +if( ! all(forced.color %in% colors() | grepl(pattern = "^#", forced.color))){ # check that all strings of forced.color start by # +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": forced.color ARGUMENT MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # AND/OR COLOR NAMES GIVEN BY colors()\n\n================\n\n") +stop(tempo.cat) +} +} +# end argument checking without fun_check() +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() +# end argument checking +# main code +problem <- NULL +text.problem <- NULL +mat1.name <- deparse(substitute(mat1)) +# change the scale of the plotted matrix +if(mat.hsv.h == TRUE){ +if(any(min(mat1, na.rm = TRUE) < 0 | max(mat1, na.rm = TRUE) > 1, na.rm = TRUE)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": mat1 MUST BE MADE OF VALUES BETWEEN 0 AND 1 BECAUSE mat.hsv.h ARGUMENT SET TO TRUE\n\n================\n\n") +stop(tempo.cat) +} +}else{ +if(any(mat1 - floor(mat1) > 0, na.rm = TRUE) | any(mat1 == 0, na.rm = TRUE)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": mat1 MUST BE MADE OF INTEGER VALUES WITHOUT 0 BECAUSE mat.hsv.h ARGUMENT SET TO FALSE\n\n================\n\n") +stop(tempo.cat) +}else{ +mat1 <- mat1 / max(mat1, na.rm = TRUE) +} +} +if(notch != 1){ +different.color <- unique(as.vector(mat1)) +different.color <- different.color[ ! is.na(different.color)] +tempo.different.color <- different.color + c(0, cumsum(rep(notch, length(different.color) - 1))) +tempo.different.color <- tempo.different.color - floor(tempo.different.color) +if(any(duplicated(tempo.different.color) == TRUE)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": DUPLICATED VALUES AFTER USING notch (", paste(tempo.different.color[duplicated(tempo.different.color)], collapse = " "), "). TRY ANOTHER notch VALUE\n\n================\n\n") +stop(tempo.cat) +}else if(length(different.color) != length(tempo.different.color)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": LENGTH OF different.color (", paste(different.color, collapse = " "), ") DIFFERENT FROM LENGTH OF tempo.different.color (", paste(tempo.different.color, collapse = " "), ")\n\n================\n\n") +stop(tempo.cat) +}else{ +for(i in 1:length(different.color)){ +mat1[mat1 == different.color[i]] <- tempo.different.color[i] +} +} +} +if( ! is.null(forced.color)){ +hexa.values.to.change <- hsv(unique(sort(mat1))[1:length(forced.color)], s, v) +} +mat1[ ! is.na(mat1)] <- hsv(mat1[ ! is.na(mat1)], s, v) +if( ! is.null(forced.color)){ +if(any(forced.color %in% mat1, na.rm = TRUE)){ +problem <- TRUE +text.problem <- paste0("THE FOLLOWING COLORS WHERE INTRODUCED USING forced.color BUT WHERE ALREADY PRESENT IN THE COLORED MATRIX :", paste(forced.color[forced.color %in% mat1], collapse = " ")) +}else{ +problem <- FALSE +} +for(i in 1:length(hexa.values.to.change)){ +if( ! any(mat1 == hexa.values.to.change[i], na.rm = TRUE)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE ", hexa.values.to.change[i], " VALUE FROM hexa.values.to.change IS NOT REPRESENTED IN mat1 : ", paste(unique(as.vector(mat1)), collapse = " "), "\n\n================\n\n") +stop(tempo.cat) +}else{ +mat1[which(mat1 == hexa.values.to.change[i])] <- forced.color[i] +} +} +} +output <- list(mat1.name = mat1.name, colored.mat = mat1, problem = problem, text.problem = text.problem) +return(output) +} + + +######## fun_mat_op() #### assemble several matrices with operation + + +# Check OK: clear to go Apollo +fun_mat_op <- function(mat.list, kind.of.operation = "+"){ +# AIM +# assemble several matrices of same dimensions by performing by case operation. For instance add the value of all the case 1 (row1 & column1) of the matrices and put it in the case 1 of a new matrix M, add the value of all the case 2 (row2 & column1) of the matrices and put it in the case 2 of a new matrix M, etc. + +# c: case +# i: row number +# j: column number +# k: matrix number +# z: number of matrices +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_check() +# fun_2d_comp() +# ARGUMENTS: +# mat.list: list of matrices +# kind.of.operation: either "+" (by case addition), "-" (by case subtraction) or "*" (by case multiplication) +# RETURN +# the assembled matrix, with row and/or column names only if all the matrices have identical row/column names +# EXAMPLES +# mat1 = matrix(c(1,1,1,2,1,5,9,8), ncol = 2) ; mat2 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2) ; fun_mat_op(mat.list = list(mat1, mat2), kind.of.operation = "+") +# mat1 = matrix(c(1,1,1,2,1,5,9,8), ncol = 2, dimnames = list(LETTERS[1:4], letters[1:2])) ; mat2 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2, dimnames = list(LETTERS[1:4], letters[1:2])) ; fun_mat_op(mat.list = list(mat1, mat2), kind.of.operation = "*") +# mat1 = matrix(c(1,1,1,2,1,5,9,8), ncol = 2, dimnames = list(LETTERS[1:4], c(NA, NA))) ; mat2 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2, dimnames = list(LETTERS[1:4], letters[1:2])) ; fun_mat_op(mat.list = list(mat1, mat2), kind.of.operation = "-") +# mat1 = matrix(c(1,1,1,2,1,5,9,8), ncol = 2, dimnames = list(c("A1", "A2", "A3", "A4"), letters[1:2])) ; mat2 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2, dimnames = list(LETTERS[1:4], letters[1:2])) ; mat3 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2, dimnames = list(LETTERS[1:4], letters[1:2])) ; fun_mat_op(mat.list = list(mat1, mat2, mat3), kind.of.operation = "+") +# DEBUGGING +# mat1 = matrix(c(1,1,1,2,1,5,9,8), ncol = 2) ; mat2 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2) ; mat.list = list(mat1, mat2) ; kind.of.operation = "+" # for function debugging +# mat1 = matrix(c(1,1,1,2,1,5,9,8), ncol = 2, dimnames = list(LETTERS[1:4], c(NA, NA))) ; mat2 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2, dimnames = list(LETTERS[1:4], letters[1:2])) ; mat.list = list(mat1, mat2) ; kind.of.operation = "*" # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_2d_comp() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +# argument checking with fun_check() +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_check(data = mat.list, class = "list", fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = kind.of.operation, options = c("+", "-", "*"), length = 1, fun.name = function.name) ; eval(ee) +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_check() +} +# end argument checking with fun_check() +# argument checking without fun_check() +if(length(mat.list) < 2){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": mat.list ARGUMENT MUST BE A LIST CONTAINING AT LEAST 2 MATRICES\n\n================\n\n") +stop(tempo.cat) +} +for(i0 in 1:length(mat.list)){ +tempo <- fun_check(data = mat.list[[i0]], class = "matrix", mode = "numeric", na.contain = TRUE) +if(tempo$problem == TRUE){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ELEMENT ", i0, " OF mat.list ARGUMENT MUST BE A NUMERIC MATRIX\n\n================\n\n") +stop(tempo.cat) +} +} +ident.row.names <- TRUE +ident.col.names <- TRUE +for(i0 in 2:length(mat.list)){ +tempo <- fun_2d_comp(data1 = mat.list[[1]], data2 = mat.list[[i0]]) +if(tempo$same.dim == FALSE){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": MATRIX ", i0, " OF mat.list ARGUMENT MUST HAVE THE SAME DIMENSION (", paste(dim(mat.list[[i0]]), collapse = " "), ") THAN THE MATRIX 1 IN mat.list (", paste(dim(mat.list[[1]]), collapse = " "), ")\n\n================\n\n") +stop(tempo.cat) +} +if( ! is.null(tempo$same.row.name)){ +if(tempo$same.row.name != TRUE){ # != TRUE to deal with NA +ident.row.names <- FALSE +} +} +if( ! is.null(tempo$same.col.name)){ +if(tempo$same.col.name != TRUE){ # != TRUE to deal with NA +ident.col.names <- FALSE +} +} +} +# end argument checking without fun_check() +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() +# end argument checking +# main code +output <- mat.list[[1]] +for(i0 in 2:length(mat.list)){ +output <- get(kind.of.operation)(output, mat.list[[i0]]) +} +dimnames(output) <- NULL +if(ident.row.names == TRUE){ +rownames(output) <- rownames(mat.list[[1]]) +} +if(ident.col.names == TRUE){ +colnames(output) <- colnames(mat.list[[1]]) +} +return(output) } @@ -1946,71 +1951,71 @@ fun_mat_op <- function(mat.list, kind.of.operation = "+"){ # Check OK: clear to go Apollo fun_mat_inv <- function(mat){ - # AIM - # return the inverse of a square matrix when solve() cannot - # REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION - # fun_check() - # ARGUMENTS: - # mat: a square numeric matrix without NULL, NA, Inf or single case (dimension 1, 1) of 0 - # RETURN - # the inversed matrix - # EXAMPLES - # mat1 = matrix(c(1,1,1,2,1,5,9,8,9), ncol = 3) ; fun_mat_inv(mat = mat1) # use solve() - # mat1 = matrix(c(0,0,0,0,0,0,0,0,0), ncol = 3) ; fun_mat_inv(mat = mat1) # use the trick - # mat1 = matrix(c(1,1,1,2,Inf,5,9,8,9), ncol = 3) ; fun_mat_inv(mat = mat1) - # mat1 = matrix(c(1,1,1,2,NA,5,9,8,9), ncol = 3) ; fun_mat_inv(mat = mat1) - # mat1 = matrix(c(1,2), ncol = 1) ; fun_mat_inv(mat = mat1) - # mat1 = matrix(0, ncol = 1) ; fun_mat_inv(mat = mat1) - # mat1 = matrix(2, ncol = 1) ; fun_mat_inv(mat = mat1) - # DEBUGGING - # mat = matrix(c(1,1,1,2,1,5,9,8,9), ncol = 3) # for function debugging - # function name - function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") - # end function name - # required function checking - if(length(find("fun_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - # argument checking with fun_check() - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_check(data = mat, class = "matrix", mode = "numeric", fun.name = function.name) ; eval(ee) - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_check() - } - # end argument checking with fun_check() - # argument checking without fun_check() - if(ncol(mat) != nrow(mat)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": mat ARGUMENT MUST BE A SQUARE MATRIX\n\n================\n\n") - stop(tempo.cat) - } - if(any(mat %in% c(Inf, -Inf, NA))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": mat ARGUMENT MUST BE A MATRIX WITHOUT Inf, -Inf OR NA\n\n================\n\n") - stop(tempo.cat) - } - if(all(mat == 0) & ncol(mat) == 1){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": mat ARGUMENT CANNOT BE A SQUARE MATRIX MADE OF A SINGLE CASE OF 0\n\n================\n\n") - stop(tempo.cat) - } - # end argument checking without fun_check() - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() - # end argument checking - # main code - if(any(grepl(x = try(solve(mat), silent = TRUE)[], pattern = "[Ee]rror"))){ - tempo <- svd(mat) - val.critique <- which(tempo$d < 10^-8) - Diag.mod <- diag(1 / tempo$d) - for(i in val.critique){ - Diag.mod[i, i] <- 0 - } - return(tempo$v %*% Diag.mod %*% t(tempo$u)) - }else{ - return(solve(mat)) - } +# AIM +# return the inverse of a square matrix when solve() cannot +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_check() +# ARGUMENTS: +# mat: a square numeric matrix without NULL, NA, Inf or single case (dimension 1, 1) of 0 +# RETURN +# the inversed matrix +# EXAMPLES +# mat1 = matrix(c(1,1,1,2,1,5,9,8,9), ncol = 3) ; fun_mat_inv(mat = mat1) # use solve() +# mat1 = matrix(c(0,0,0,0,0,0,0,0,0), ncol = 3) ; fun_mat_inv(mat = mat1) # use the trick +# mat1 = matrix(c(1,1,1,2,Inf,5,9,8,9), ncol = 3) ; fun_mat_inv(mat = mat1) +# mat1 = matrix(c(1,1,1,2,NA,5,9,8,9), ncol = 3) ; fun_mat_inv(mat = mat1) +# mat1 = matrix(c(1,2), ncol = 1) ; fun_mat_inv(mat = mat1) +# mat1 = matrix(0, ncol = 1) ; fun_mat_inv(mat = mat1) +# mat1 = matrix(2, ncol = 1) ; fun_mat_inv(mat = mat1) +# DEBUGGING +# mat = matrix(c(1,1,1,2,1,5,9,8,9), ncol = 3) # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +# argument checking with fun_check() +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_check(data = mat, class = "matrix", mode = "numeric", fun.name = function.name) ; eval(ee) +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_check() +} +# end argument checking with fun_check() +# argument checking without fun_check() +if(ncol(mat) != nrow(mat)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": mat ARGUMENT MUST BE A SQUARE MATRIX\n\n================\n\n") +stop(tempo.cat) +} +if(any(mat %in% c(Inf, -Inf, NA))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": mat ARGUMENT MUST BE A MATRIX WITHOUT Inf, -Inf OR NA\n\n================\n\n") +stop(tempo.cat) +} +if(all(mat == 0) & ncol(mat) == 1){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": mat ARGUMENT CANNOT BE A SQUARE MATRIX MADE OF A SINGLE CASE OF 0\n\n================\n\n") +stop(tempo.cat) +} +# end argument checking without fun_check() +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() +# end argument checking +# main code +if(any(grepl(x = try(solve(mat), silent = TRUE)[], pattern = "[Ee]rror"))){ +tempo <- svd(mat) +val.critique <- which(tempo$d < 10^-8) +Diag.mod <- diag(1 / tempo$d) +for(i in val.critique){ +Diag.mod[i, i] <- 0 +} +return(tempo$v %*% Diag.mod %*% t(tempo$u)) +}else{ +return(solve(mat)) +} } @@ -2019,142 +2024,142 @@ fun_mat_inv <- function(mat){ # Check OK: clear to go Apollo fun_mat_fill <- function(mat, empty.cell.string = 0, warn.print = FALSE){ - # AIM - # detect the empty half part of a symmetric square matrix (either topleft, topright, bottomleft or bottomright) - # fill this empty half part using the other symmetric half part of the matrix - # WARNINGS - # a plot verification using fun_gg_heatmap() is recommanded - # REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION - # fun_check() - # ARGUMENTS: - # mat: a numeric or character square matrix with the half part (according to the grand diagonal) filled with NA (any kind of matrix), "0" (character matrix) or 0 (numeric matrix) exclusively (not a mix of 0 and NA in the empty part) - # empty.cell.string: a numeric, character or NA (no quotes) indicating what empty cells are filled with - # warn.print: logical. Print warnings at the end of the execution? No print if no warning messages - # RETURN - # a list containing: - # $mat: the filled matrix - # $warnings: the warning messages. Use cat() for proper display. NULL if no warning - # EXAMPLES - # mat1 = matrix(c(1,NA,NA,NA, 0,2,NA,NA, NA,3,4,NA, 5,6,7,8), ncol = 4) ; mat1 ; fun_mat_fill(mat = mat1, empty.cell.string = NA, warn.print = TRUE) # bottomleft example - # mat1 = matrix(c(1,1,1,2, 0,2,3,0, NA,3,0,0, 5,0,0,0), ncol = 4) ; mat1 ; fun_mat_fill(mat = mat1, empty.cell.string = NA, warn.print = TRUE) # error example - # mat1 = matrix(c(1,1,1,2, 0,2,3,0, NA,3,0,0, 5,0,0,0), ncol = 4) ; mat1 ; fun_mat_fill(mat = mat1, empty.cell.string = 0, warn.print = TRUE) # bottomright example - # mat1 = matrix(c(1,1,1,2, "a",2,3,NA, "a","a",0,0, "a","a","a",0), ncol = 4) ; mat1 ; fun_mat_fill(mat = mat1, empty.cell.string = "a", warn.print = TRUE) # topright example - # mat1 = matrix(c(0,0,0,2, 0,0,3,0, 0,3,0,NA, 5,0,0,0), ncol = 4) ; mat1 ; fun_mat_fill(mat = mat1, empty.cell.string = 0, warn.print = TRUE) # topleft example - # mat1 = matrix(c(0,0,0,2, 0,0,3,0, 0,3,0,0, 5,0,0,0), ncol = 4) ; mat1 ; fun_mat_fill(mat = mat1, empty.cell.string = 0, warn.print = TRUE) # error example - # DEBUGGING - # mat = matrix(c(1,NA,NA,NA, 0,2,NA,NA, NA,3,4,NA, 5,6,7,8), ncol = 4) ; empty.cell.string = NA ; warn.print = TRUE # for function debugging - # mat = matrix(c(0,0,0,2, 0,0,3,0, 0,3,0,NA, 5,0,0,0), ncol = 4) ; empty.cell.string = 0 ; warn.print = TRUE # for function debugging # topleft example - # function name - function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") - # end function name - # required function checking - if(length(find("fun_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - # argument checking with fun_check() - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_check(data = mat, class = "matrix", na.contain = TRUE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = empty.cell.string, class = "vector", na.contain = TRUE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = warn.print, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_check() - } - # end argument checking with fun_check() - # argument checking without fun_check() - if(ncol(mat) != nrow(mat)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": mat ARGUMENT MUST BE A SQUARE MATRIX\n\n================\n\n") - stop(tempo.cat) - } - if( ! (mode(mat) %in% c("numeric", "character"))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": mat ARGUMENT MUST BE A NUMERIC OR CHARACTER MATRIX\n\n================\n\n") - stop(tempo.cat) - } - if(nrow(mat) == 1 & ncol(mat) == 1){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": mat ARGUMENT CANNOT BE A SQUARE MATRIX MADE OF A SINGLE CASE\n\n================\n\n") - stop(tempo.cat) - } - if(ifelse(is.na(empty.cell.string), ! any(is.na(mat)), ! any(mat == empty.cell.string, na.rm = TRUE))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": mat ARGUMENT MATRIX MUST HAVE CELLS WITH THE EMPTY STRING SPECIFIED IN empty.cell.string ARGUMENT\n\n================\n\n") - stop(tempo.cat) - } - # end argument checking without fun_check() - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() - # end argument checking - # main code - list.diag <- vector("list", length = nrow(mat) - 1) - for(i0 in 1:(nrow(mat) - 1)){ - list.diag[[i0]] <- numeric(length = nrow(mat) - i0) - } - sector <- c("topleft", "topright", "bottomright", "bottomleft") - diag.scan <-c( # same order as sector. Recover each diag from center to corner - "mat[as.matrix(as.data.frame(list(1:(nrow(mat) - i1), (ncol(mat) -i1):1)))]", # topleft part - "mat[as.matrix(as.data.frame(list(1:(nrow(mat) - i1), (1:ncol(mat))[-(1:i1)])))]", # topright part - "mat[as.matrix(as.data.frame(list((1 + i1):nrow(mat), ncol(mat):(1 + i1))))]", # bottomright part - "mat[as.matrix(as.data.frame(list((1 + i1):nrow(mat), 1:(ncol(mat) -i1))))]" # bottomleft part - ) - # empty part detection - tempo.list.diag <- list.diag - empty.sector <- NULL - full.sector <- NULL - warning <- NULL - for(i0 in 1:length(sector)){ - tempo.list.diag <- list.diag - for(i1 in 1:(nrow(mat) - 1)){ - tempo.list.diag[[i1]] <- eval(parse(text = diag.scan[i0])) - if(ifelse(is.na(empty.cell.string), ! all(is.na(tempo.list.diag[[i1]])), ! (all(tempo.list.diag[[i1]] == empty.cell.string, na.rm = TRUE) & ! (is.na(all(tempo.list.diag[[i1]] == empty.cell.string, na.rm = FALSE)))))){ # I had to add this ! (is.na(all(tempo.list.diag[[i1]] == empty.cell.string, na.rm = FALSE))) because all(tempo.list.diag[[i1]] == empty.cell.string, na.rm = FALSE) gives NA and not FALSE if one NA in tempo.list.diag[[i1]] -> not good for if() - full.sector <- c(full.sector, sector[i0]) - break - } - } - if(i1 == nrow(mat) - 1){ - if(all(unlist(lapply(tempo.list.diag, FUN = function(x){if(is.na(empty.cell.string)){is.na(x)}else{x == empty.cell.string}})), na.rm = TRUE)){ - empty.sector <- c(empty.sector, sector[i0]) - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": EMPTY SECTOR DETECTED ON THE ", toupper(sector[i0]), " CORNER, FULL OF ", empty.cell.string) - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - }else{ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE ", toupper(sector[i0]), " SECTOR, DETECTED AS EMPTY, IS NOT? DIFFERENT VALUES IN THIS SECTOR:\n", paste(names(table(unlist(tempo.list.diag), useNA = "ifany")), collapse = " "), "\n\n================\n\n") - stop(tempo.cat) - } - } - } - # end empty part detection - if(length(empty.sector) == 0){ - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": ACCORDING TO empty.cell.string ARGUMENT (", empty.cell.string, "), mat ARGUMENT MATRIX HAS ZERO EMPTY HALF PART") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - }else{ - if(length(empty.sector) > 1){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ACCORDING TO empty.cell.string ARGUMENT (", empty.cell.string, "), mat ARGUMENT MATRIX HAS MORE THAN ONE EMPTY HALF PART (ACCORDING TO THE GRAND DIAGONAL): ", paste(empty.sector, collapse = " "), "\n\n================\n\n") - stop(tempo.cat) - }else if(any(full.sector %in% empty.sector, na.rm = TRUE)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE FUNCTION HAS DETECTED EMPTY AND NON EMPTY HALF PART IN THE SAME SECTOR: ", paste(full.sector[full.sector %in% empty.sector], collapse = " "), "\n\n================\n\n") - stop(tempo.cat) - }else if(length(empty.sector) + length(full.sector)!= 4){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE FUNCTION HAS DETECTED MORE OR LESS SECTORS THAN 4:\nEMPTY SECTORS:", paste(empty.sector, collapse = " "), "\nFULL SECTORS:", paste(full.sector, collapse = " "), "\n\n================\n\n") - stop(tempo.cat) - } - # matrix filling - for(i1 in 1:(nrow(mat) - 1)){ - if(empty.sector == "topleft"){ - eval(parse(text = paste0(diag.scan[1], " <- ", diag.scan[3]))) - }else if(empty.sector == "topright"){ - eval(parse(text = paste0(diag.scan[2], " <- ", diag.scan[4]))) - }else if(empty.sector == "bottomright"){ - eval(parse(text = paste0(diag.scan[3], " <- ", diag.scan[1]))) - }else if(empty.sector == "bottomleft"){ - eval(parse(text = paste0(diag.scan[4], " <- ", diag.scan[2]))) - } - } - # end matrix filling - } - if(warn.print == TRUE & ! is.null(warning)){ - warning(warning) - } - return(list(mat = mat, warnings = warning)) +# AIM +# detect the empty half part of a symmetric square matrix (either topleft, topright, bottomleft or bottomright) +# fill this empty half part using the other symmetric half part of the matrix +# WARNINGS +# a plot verification using fun_gg_heatmap() is recommanded +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_check() +# ARGUMENTS: +# mat: a numeric or character square matrix with the half part (according to the grand diagonal) filled with NA (any kind of matrix), "0" (character matrix) or 0 (numeric matrix) exclusively (not a mix of 0 and NA in the empty part) +# empty.cell.string: a numeric, character or NA (no quotes) indicating what empty cells are filled with +# warn.print: logical. Print warnings at the end of the execution? No print if no warning messages +# RETURN +# a list containing: +# $mat: the filled matrix +# $warnings: the warning messages. Use cat() for proper display. NULL if no warning +# EXAMPLES +# mat1 = matrix(c(1,NA,NA,NA, 0,2,NA,NA, NA,3,4,NA, 5,6,7,8), ncol = 4) ; mat1 ; fun_mat_fill(mat = mat1, empty.cell.string = NA, warn.print = TRUE) # bottomleft example +# mat1 = matrix(c(1,1,1,2, 0,2,3,0, NA,3,0,0, 5,0,0,0), ncol = 4) ; mat1 ; fun_mat_fill(mat = mat1, empty.cell.string = NA, warn.print = TRUE) # error example +# mat1 = matrix(c(1,1,1,2, 0,2,3,0, NA,3,0,0, 5,0,0,0), ncol = 4) ; mat1 ; fun_mat_fill(mat = mat1, empty.cell.string = 0, warn.print = TRUE) # bottomright example +# mat1 = matrix(c(1,1,1,2, "a",2,3,NA, "a","a",0,0, "a","a","a",0), ncol = 4) ; mat1 ; fun_mat_fill(mat = mat1, empty.cell.string = "a", warn.print = TRUE) # topright example +# mat1 = matrix(c(0,0,0,2, 0,0,3,0, 0,3,0,NA, 5,0,0,0), ncol = 4) ; mat1 ; fun_mat_fill(mat = mat1, empty.cell.string = 0, warn.print = TRUE) # topleft example +# mat1 = matrix(c(0,0,0,2, 0,0,3,0, 0,3,0,0, 5,0,0,0), ncol = 4) ; mat1 ; fun_mat_fill(mat = mat1, empty.cell.string = 0, warn.print = TRUE) # error example +# DEBUGGING +# mat = matrix(c(1,NA,NA,NA, 0,2,NA,NA, NA,3,4,NA, 5,6,7,8), ncol = 4) ; empty.cell.string = NA ; warn.print = TRUE # for function debugging +# mat = matrix(c(0,0,0,2, 0,0,3,0, 0,3,0,NA, 5,0,0,0), ncol = 4) ; empty.cell.string = 0 ; warn.print = TRUE # for function debugging # topleft example +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +# argument checking with fun_check() +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_check(data = mat, class = "matrix", na.contain = TRUE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = empty.cell.string, class = "vector", na.contain = TRUE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = warn.print, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_check() +} +# end argument checking with fun_check() +# argument checking without fun_check() +if(ncol(mat) != nrow(mat)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": mat ARGUMENT MUST BE A SQUARE MATRIX\n\n================\n\n") +stop(tempo.cat) +} +if( ! (mode(mat) %in% c("numeric", "character"))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": mat ARGUMENT MUST BE A NUMERIC OR CHARACTER MATRIX\n\n================\n\n") +stop(tempo.cat) +} +if(nrow(mat) == 1 & ncol(mat) == 1){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": mat ARGUMENT CANNOT BE A SQUARE MATRIX MADE OF A SINGLE CASE\n\n================\n\n") +stop(tempo.cat) +} +if(ifelse(is.na(empty.cell.string), ! any(is.na(mat)), ! any(mat == empty.cell.string, na.rm = TRUE))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": mat ARGUMENT MATRIX MUST HAVE CELLS WITH THE EMPTY STRING SPECIFIED IN empty.cell.string ARGUMENT\n\n================\n\n") +stop(tempo.cat) +} +# end argument checking without fun_check() +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() +# end argument checking +# main code +list.diag <- vector("list", length = nrow(mat) - 1) +for(i0 in 1:(nrow(mat) - 1)){ +list.diag[[i0]] <- numeric(length = nrow(mat) - i0) +} +sector <- c("topleft", "topright", "bottomright", "bottomleft") +diag.scan <-c( # same order as sector. Recover each diag from center to corner +"mat[as.matrix(as.data.frame(list(1:(nrow(mat) - i1), (ncol(mat) -i1):1)))]", # topleft part +"mat[as.matrix(as.data.frame(list(1:(nrow(mat) - i1), (1:ncol(mat))[-(1:i1)])))]", # topright part +"mat[as.matrix(as.data.frame(list((1 + i1):nrow(mat), ncol(mat):(1 + i1))))]", # bottomright part +"mat[as.matrix(as.data.frame(list((1 + i1):nrow(mat), 1:(ncol(mat) -i1))))]" # bottomleft part +) +# empty part detection +tempo.list.diag <- list.diag +empty.sector <- NULL +full.sector <- NULL +warning <- NULL +for(i0 in 1:length(sector)){ +tempo.list.diag <- list.diag +for(i1 in 1:(nrow(mat) - 1)){ +tempo.list.diag[[i1]] <- eval(parse(text = diag.scan[i0])) +if(ifelse(is.na(empty.cell.string), ! all(is.na(tempo.list.diag[[i1]])), ! (all(tempo.list.diag[[i1]] == empty.cell.string, na.rm = TRUE) & ! (is.na(all(tempo.list.diag[[i1]] == empty.cell.string, na.rm = FALSE)))))){ # I had to add this ! (is.na(all(tempo.list.diag[[i1]] == empty.cell.string, na.rm = FALSE))) because all(tempo.list.diag[[i1]] == empty.cell.string, na.rm = FALSE) gives NA and not FALSE if one NA in tempo.list.diag[[i1]] -> not good for if() +full.sector <- c(full.sector, sector[i0]) +break +} +} +if(i1 == nrow(mat) - 1){ +if(all(unlist(lapply(tempo.list.diag, FUN = function(x){if(is.na(empty.cell.string)){is.na(x)}else{x == empty.cell.string}})), na.rm = TRUE)){ +empty.sector <- c(empty.sector, sector[i0]) +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": EMPTY SECTOR DETECTED ON THE ", toupper(sector[i0]), " CORNER, FULL OF ", empty.cell.string) +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +}else{ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE ", toupper(sector[i0]), " SECTOR, DETECTED AS EMPTY, IS NOT? DIFFERENT VALUES IN THIS SECTOR:\n", paste(names(table(unlist(tempo.list.diag), useNA = "ifany")), collapse = " "), "\n\n================\n\n") +stop(tempo.cat) +} +} +} +# end empty part detection +if(length(empty.sector) == 0){ +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": ACCORDING TO empty.cell.string ARGUMENT (", empty.cell.string, "), mat ARGUMENT MATRIX HAS ZERO EMPTY HALF PART") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +}else{ +if(length(empty.sector) > 1){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ACCORDING TO empty.cell.string ARGUMENT (", empty.cell.string, "), mat ARGUMENT MATRIX HAS MORE THAN ONE EMPTY HALF PART (ACCORDING TO THE GRAND DIAGONAL): ", paste(empty.sector, collapse = " "), "\n\n================\n\n") +stop(tempo.cat) +}else if(any(full.sector %in% empty.sector, na.rm = TRUE)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE FUNCTION HAS DETECTED EMPTY AND NON EMPTY HALF PART IN THE SAME SECTOR: ", paste(full.sector[full.sector %in% empty.sector], collapse = " "), "\n\n================\n\n") +stop(tempo.cat) +}else if(length(empty.sector) + length(full.sector)!= 4){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE FUNCTION HAS DETECTED MORE OR LESS SECTORS THAN 4:\nEMPTY SECTORS:", paste(empty.sector, collapse = " "), "\nFULL SECTORS:", paste(full.sector, collapse = " "), "\n\n================\n\n") +stop(tempo.cat) +} +# matrix filling +for(i1 in 1:(nrow(mat) - 1)){ +if(empty.sector == "topleft"){ +eval(parse(text = paste0(diag.scan[1], " <- ", diag.scan[3]))) +}else if(empty.sector == "topright"){ +eval(parse(text = paste0(diag.scan[2], " <- ", diag.scan[4]))) +}else if(empty.sector == "bottomright"){ +eval(parse(text = paste0(diag.scan[3], " <- ", diag.scan[1]))) +}else if(empty.sector == "bottomleft"){ +eval(parse(text = paste0(diag.scan[4], " <- ", diag.scan[2]))) +} +} +# end matrix filling +} +if(warn.print == TRUE & ! is.null(warning)){ +warning(warning) +} +return(list(mat = mat, warnings = warning)) } @@ -2162,371 +2167,371 @@ fun_mat_fill <- function(mat, empty.cell.string = 0, warn.print = FALSE){ fun_permut <- function(data1, data2 = NULL, n = NULL, seed = NULL, count.print = 10, text.print = "", cor.method = "spearman", cor.limit = 0.2, warn.print = FALSE, path.lib = NULL){ - # AIM - # reorder the elements of the data1 vector by flipping 2 randomly selected consecutive positions either: - # 1) n times (when n is precised) or - # 2) until the correlation between data1 and data2 decreases down to the cor.limit (0.2 by default). See cor.limit below to deal with negative correlations - # Example of consecutive position flipping: ABCD -> BACD -> BADC, etc. - # WARNINGS - # see # https://www.r-bloggers.com/strategies-to-speedup-r-code/ for code speedup - # the random switch of non consecutive positions (ABCD -> DBCA for instance) does not work very well as the correaltion is quickly obtained but the initial vector structure is mainly kept (no much order). Ths code would be: pos <- ini.pos[1:2] ; pos <- sample.int(n = n , size = 2, replace = FALSE) ; tempo.pos[pos] <- tempo.pos[rev(pos)] - # ARGUMENTS - # data1: a vector of at least 2 elements. Must be numeric if data2 is specified - # data2: a numeric vector of same length as data1 - # n: number of times "flipping 2 randomly selected consecutive positions". Ignored if data2 is specified - # seed: integer number used by set.seed(). Write NULL if random result is required, an integer otherwise. BEWARE: if not NULL, fun_permut() will systematically return the same result when the other parameters keep the same settings - # count.print: interger value. Print a working progress message every count.print during loops. BEWARE: can increase substentially the time to complete the process using a small value, like 10 for instance. Use Inf is no loop message desired - # text.print: optional message to add to the working progress message every count.print loop - # cor.method: correlation method. Either "pearson", "kendall" or "spearman". Ignored if data2 is not specified - # cor.limit: a correlation limit (between 0 and 1). Ignored if data2 is not specified. Compute the correlation between data1 and data2, permute the data1 values, and stop the permutation process when the correlation between data1 and data2 decreases down below the cor limit value (0.2 by default). If cor(data1, data2) is negative, then -cor.limit is used and the process stops until the correlation between data1 and data2 increases up over cor.limit (-0.2 by default). BEWARE: write a positive cor.limit even if cor(data1, data2) is known to be negative. The function will automatically uses -cor.limit. If the initial correlation is already below cor.limit (positive correlation) or over -cor.limit (negative correlation), then the data1 value positions are completely randomized (correlation between data1 and data2 is expected to be 0) - # warn.print: logical. Print warnings at the end of the execution? No print if no warning messages - # path.lib: absolute path of the required packages, if not in the default folders - # REQUIRED PACKAGES - # lubridate - # REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION - # fun_check() - # fun_pack() - # fun_round() - # RETURN - # a list containing: - # $data: the modified vector - # $warnings: potential warning messages (in case of negative correlation when data2 is specified). NULL if non warning message - # $cor: a spearman correlation between the initial positions (1:length(data1) and the final positions if data2 is not specified and the final correlation between data1 and data2 otherwise, according to cor.method - # $count: the number of loops used - # EXAMPLES - # example (1) showing that for loop, used in fun_permut(), is faster than while loop - # ini.time <- as.numeric(Sys.time()) ; count <- 0 ; for(i0 in 1:1e9){count <- count + 1} ; tempo.time <- as.numeric(Sys.time()) ; tempo.lapse <- round(lubridate::seconds_to_period(tempo.time - ini.time)) ; tempo.lapse - # example (2) showing that for loop, used in fun_permut(), is faster than while loop - # ini.time <- as.numeric(Sys.time()) ; count <- 0 ; while(count < 1e9){count <- count + 1} ; tempo.time <- as.numeric(Sys.time()) ; tempo.lapse <- round(lubridate::seconds_to_period(tempo.time - ini.time)) ; tempo.lapse - # fun_permut(data1 = LETTERS[1:5], data2 = NULL, n = 100, seed = 1, count.print = 10, text.print = "CPU NB 4") - # fun_permut(data1 = 101:110, data2 = 21:30, seed = 1, count.print = 1e4, text.print = "", cor.method = "spearman", cor.limit = 0.2) - # a way to use the cor.limit argument just considering data1 - # obs1 <- 101:110 ; fun_permut(data1 = obs1, data2 = obs1, seed = 1, count.print = 10, cor.method = "spearman", cor.limit = 0.2) - # fun_permut(data1 = 1:1e3, data2 = 1e3:1, seed = 1, count.print = 1e6, text.print = "", cor.method = "spearman", cor.limit = 0.7) - # fun_permut(data1 = 1:1e2, data2 = 1e2:1, seed = 1, count.print = 1e3, cor.limit = 0.5) - # fun_permut(data1 = c(0,0,0,0,0), n = 5, data2 = NULL, seed = 1, count.print = 1e3, cor.limit = 0.5) - # DEBUGGING - # data1 = LETTERS[1:5] ; data2 = NULL ; n = 1e6 ; seed = NULL ; count.print = 1e3 ; text.print = "" ; cor.method = "spearman" ; cor.limit = 0.2 ; warn.print = TRUE ; path.lib = NULL - # data1 = LETTERS[1:5] ; data2 = NULL ; n = 10 ; seed = 22 ; count.print = 10 ; text.print = "" ; cor.method = "spearman" ; cor.limit = 0.2 ; warn.print = TRUE ; path.lib = NULL - # data1 = 101:110 ; data2 = 21:30 ; n = 10 ; seed = 22 ; count.print = 10 ; text.print = "" ; cor.method = "spearman" ; cor.limit = 0.2 ; warn.print = TRUE ; path.lib = NULL - # data1 = 1:1e3 ; data2 = 1e3:1 ; n = 20 ; seed = 22 ; count.print = 1e6 ; text.print = "" ; cor.method = "spearman" ; cor.limit = 0.5 ; warn.print = TRUE ; path.lib = NULL - # function name - function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") - # end function name - # required function checking - if(length(find("fun_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - if(length(find("fun_pack", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_pack() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - if(length(find("fun_round", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_pack() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_check(data = data1, class = "vector", fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & length(data1) < 2){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": data1 ARGUMENT MUST BE A VECTOR OF MINIMUM LENGTH 2. HERE IT IS: ", length(data1),"\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - if( ! is.null(data2)){ - tempo <- fun_check(data = data1, class = "vector", mode = "numeric", fun.name = function.name) ; eval(ee) - if(tempo$problem == TRUE){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": data1 MUST BE A NUMERIC VECTOR IF data2 ARGUMENT IS SPECIFIED\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - tempo <- fun_check(data = data2, class = "vector", mode = "numeric", fun.name = function.name) ; eval(ee) - if(length(data1) != length(data2)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": data1 AND data2 MUST BE VECTOR OF SAME LENGTH. HERE IT IS ", length(data1)," AND ", length(data2), "\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - }else if(is.null(n)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": n ARGUMENT CANNOT BE NULL IF data2 ARGUMENT IS NULL\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - if( ! is.null(n)){ - tempo <- fun_check(data = n, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, neg.values = FALSE, fun.name = function.name) ; eval(ee) - } - if( ! is.null(seed)){ - tempo <- fun_check(data = seed, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, neg.values = FALSE, fun.name = function.name) ; eval(ee) - } - tempo <- fun_check(data = count.print, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = text.print, class = "character", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = cor.method, options = c("pearson", "kendall", "spearman"), length =1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = cor.limit, class = "vector", mode = "numeric", prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = warn.print, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - if( ! is.null(path.lib)){ - tempo <- fun_check(data = path.lib, class = "character", fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & ! all(dir.exists(path.lib))){ - tempo.cat <- paste0("\n\n============\n\nERROR IN ", function.name, ": \nDIRECTORY PATH INDICATED IN THE path.lib PARAMETER DOES NOT EXISTS: ", path.lib, "\n\n============\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - } - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_check() - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() - # end argument checking - # package checking - fun_pack(req.package = "lubridate", path.lib = path.lib) - # end package checking - # main code - # code that protects set.seed() in the global environment - # see also Protocol 100-rev0 Parallelization in R.docx - if(exists(".Random.seed", envir = .GlobalEnv)){ # if .Random.seed does not exists, it means that no random operation has been performed yet in any R environment - tempo.random.seed <- .Random.seed - on.exit(assign(".Random.seed", tempo.random.seed, env = .GlobalEnv)) - }else{ - on.exit(set.seed(NULL)) # inactivate seeding -> return to complete randomness - } - # end code that protects set.seed() in the global environment - if( ! is.null(seed)){ - set.seed(seed) - } - ini.date <- Sys.time() # time of process begin, converted into seconds - ini.time <- as.numeric(ini.date) # time of process begin, converted into seconds - ini.pos <- 1:length(data1) # positions of data1 before permutation loops - tempo.pos <- ini.pos # positions of data1 that will be modified during loops - # pos.selec.seq <- ini.pos[-length(data1)] # selection of 1 position in initial position, without the last because always up permutation (pos -> pos+1 & pos+1 -> pos) - pos.selec.seq.max <- length(ini.pos) - 1 # max position (used by sample.int() function). See below for - 1 - warnings <- NULL - count <- 0 - round <- 0 - BREAK <- FALSE - tempo.cor <- 0 - if(is.null(data2)){ - if(length(table(data1)) == 1){ - tempo.warnings <- paste0("NO PERMUTATION PERFORMED BECAUSE data1 ARGUMENT SEEMS TO BE MADE OF IDENTICAL ELEMENTS: ", names(table(data1))) - warnings <- paste0(warnings, ifelse(is.null(warnings), "", "\n"), tempo.warnings) # - }else{ - if(count.print > n){ - count.print <- n - } - cat(paste0("\n", ifelse(text.print == "", "", paste0(text.print, " | ")), "FOR LOOP OF ", n, " LOOPS INITIATED | LOOP COUNT: ", format(count, big.mark=","))) - count.print.loop <- logical(length = count.print) - count.print.loop[length(count.print.loop)] <- TRUE # not this to avoid long vector, but not forget to reset during printing: count.print.loop[(1:trunc(n / count.print) * count.print)] <- TRUE # counter to speedup - count.loop <- 0 - pos <- sample.int(n = pos.selec.seq.max , size = count.print, replace = TRUE) # selection of random positions. BEWARE: n = pos.selec.seq.max because already - 1 (see above) but is connected to tempo.pos[c(pos2 + 1, pos2)] <- tempo.pos[c(pos2, pos2 + 1)] - tempo.date.loop <- Sys.time() - tempo.time.loop <- as.numeric(tempo.date.loop) - for(i3 in 1:n){ - count.loop <- count.loop + 1 - pos2 <- pos[count.loop] # selection of 1 position - tempo.pos[c(pos2 + 1, pos2)] <- tempo.pos[c(pos2, pos2 + 1)] - if(count.print.loop[count.loop]){ - count.loop <- 0 - pos <- sample.int(n = pos.selec.seq.max , size = count.print, replace = TRUE) # BEWARE: never forget to resample here - tempo.time <- as.numeric(Sys.time()) - tempo.lapse <- round(lubridate::seconds_to_period(tempo.time - tempo.time.loop)) - final.loop <- (tempo.time - tempo.time.loop) / i3 * n - final.exp <- as.POSIXct(final.loop, origin = tempo.date.loop) - cat(paste0("\n", ifelse(text.print == "", "", paste0(text.print, " | ")), "FOR LOOP ", i3, " / ", n, " | TIME SPENT: ", tempo.lapse, " | EXPECTED END: ", final.exp)) - } - } - count <- count + n # out of the loop to speedup - cat(paste0("\n", ifelse(text.print == "", "", paste0(text.print, " | ")), "FOR LOOP ENDED | LOOP COUNT: ", format(count, big.mark=","))) - cat("\n\n") - } - }else{ - if(length(table(data1)) == 1){ - tempo.warnings <- paste0("NO PERMUTATION PERFORMED BECAUSE data1 ARGUMENT SEEMS TO BE MADE OF IDENTICAL ELEMENTS: ", names(table(data1))) - warnings <- paste0(warnings, ifelse(is.null(warnings), "", "\n"), tempo.warnings) # - tempo.cor <- 1 - }else if(length(table(data2)) == 1){ - tempo.warnings <- paste0("NO PERMUTATION PERFORMED BECAUSE data2 ARGUMENT SEEMS TO BE MADE OF IDENTICAL ELEMENTS: ", names(table(data2))) - warnings <- paste0(warnings, ifelse(is.null(warnings), "", "\n"), tempo.warnings) # - tempo.cor <- 1 - }else{ - cor.ini <- cor(x = data1, y = data2, use = "pairwise.complete.obs", method = cor.method) - tempo.cor <- cor.ini # correlation that will be modified during loops - neg.cor <- FALSE - if(tempo.cor < 0){ - tempo.warnings <- paste0("INITIAL ", toupper(cor.method), " CORRELATION BETWEEN data1 AND data2 HAS BEEN DETECTED AS NEGATIVE: ", tempo.cor, ". THE LOOP STEPS WILL BE PERFORMED USING POSITIVE CORRELATIONS BUT THE FINAL CORRELATION WILL BE NEGATIVE") - warnings <- paste0(warnings, ifelse(is.null(warnings), "", "\n"), tempo.warnings) # - neg.cor <- TRUE - tempo.cor <- abs(tempo.cor) - cor.ini <- abs(cor.ini) - } - if(tempo.cor < cor.limit){ # randomize directly all the position to be close to correlation zero - tempo.warnings <- paste0("INITIAL ABSOLUTE VALUE OF THE ", toupper(cor.method), " CORRELATION ", fun_round(tempo.cor), " BETWEEN data1 AND data2 HAS BEEN DETECTED AS BELOW THE CORRELATION LIMIT PARAMETER ", cor.limit, "\nTHE data1 SEQUENCE HAS BEEN COMPLETELY RANDOMIZED TO CORRESPOND TO CORRELATION ZERO") - warnings <- paste0(warnings, ifelse(is.null(warnings), "", "\n"), tempo.warnings) # - for(i4 in 1:5){ # done 5 times to be sure of the complete randomness - tempo.pos <- sample(x = tempo.pos, size = length(tempo.pos), replace = FALSE) - } - count <- count + 5 # out of the loop to speedup - }else{ - # smallest correlation decrease - count <- count + 1 # 1 and not 0 because already 1 performed just below - pos <- sample.int(n = pos.selec.seq.max , size = 1, replace = TRUE) # selection of 1 position # pos.selec.seq.max because selection of 1 position in initial position, without the last because always up permutation (pos -> pos+1 & pos+1 -> pos) - tempo.pos[c(pos + 1, pos)] <- tempo.pos[c(pos, pos + 1)] - tempo.cor <- abs(cor(x = data1[tempo.pos], y = data2, use = "pairwise.complete.obs", method = cor.method)) - smallest.cor.dec <- cor.ini - tempo.cor - # end smallest correlation decrease - # going out of tempo.cor == cor.ini - cat(paste0("\n", ifelse(text.print == "", "", paste0(text.print, " | ")), "CORRELATION DECREASE AFTER A SINGLE PERMUTATION: ", fun_round(smallest.cor.dec, 4))) - cat(paste0("\n", ifelse(text.print == "", "", paste0(text.print, " | ")), "FIRST WHILE LOOP STEP -> GOING OUT FROM EQUALITY | LOOP COUNT: ", format(count, big.mark=","), " | CORRELATION LIMIT: ", fun_round(cor.limit, 4), " | ABS TEMPO CORRELATION: ", fun_round(tempo.cor, 4))) - count.print.loop <- logical(length = count.print) - count.print.loop[length(count.print.loop)] <- TRUE # counter to speedup - count.loop <- 0 # - pos <- sample.int(n = pos.selec.seq.max , size = count.print, replace = TRUE) # selection of random positions. BEWARE: n = pos.selec.seq.max because already - 1 (see above) but is connected to tempo.pos[c(pos2 + 1, pos2)] <- tempo.pos[c(pos2, pos2 + 1)] - tempo.date.loop <- Sys.time() - tempo.time.loop <- as.numeric(tempo.date.loop) - while(tempo.cor == cor.ini){ # to be out of equality between tempo.cor and cor.ini at the beginning (only valid for very long vector) - count <- count + 1 - count.loop <- count.loop + 1 - pos2 <- pos[count.loop] - tempo.pos[c(pos2 + 1, pos2)] <- tempo.pos[c(pos2, pos2 + 1)] - tempo.cor <- abs(cor(x = data1[tempo.pos], y = data2, use = "pairwise.complete.obs", method = cor.method)) - if(count.print.loop[count.loop]){ - count.loop <- 0 - pos <- sample.int(n = pos.selec.seq.max , size = count.print, replace = TRUE) # BEWARE: never forget to resample here - tempo.time <- as.numeric(Sys.time()) - tempo.lapse <- round(lubridate::seconds_to_period(tempo.time - tempo.time.loop)) - cat(paste0("\n", ifelse(text.print == "", "", paste0(text.print, " | ")), "FIRST WHILE LOOP STEP", format(count.loop, big.mark=","), " / ? | COUNT: ", format(count, big.mark=","), " | CORRELATION LIMIT: ", fun_round(cor.limit, 4), " | ABS TEMPO CORRELATION: ", fun_round(tempo.cor, 4), " | TIME SPENT: ", tempo.lapse)) - } - } - tempo.time <- as.numeric(Sys.time()) - tempo.lapse <- round(lubridate::seconds_to_period(tempo.time - ini.time)) - cat(paste0("\n", ifelse(text.print == "", "", paste0(text.print, " | ")), "FIRST WHILE LOOP STEP END | LOOP COUNT: ", format(count, big.mark=","), " | CORRELATION LIMIT: ", fun_round(cor.limit, 4), " | ABS TEMPO CORRELATION: ", fun_round(tempo.cor, 4), " | TOTAL SPENT TIME: ", tempo.lapse)) - if(tempo.cor < cor.limit){ - tempo.warnings <- paste0("THE FIRST FOR & WHILE LOOP STEPS HAVE BEEN TOO FAR AND SUBSEQUENT LOOP STEPS WILL NOT RUN") - warnings <- paste0(warnings, ifelse(is.null(warnings), "", "\n"), tempo.warnings) - } - # end going out of tempo.cor == cor.ini - # estimation of the average correlation decrease per loop on x loops and for loop execution - cat(paste0("\n", ifelse(text.print == "", "", paste0(text.print, " | ")), "WHILE/FOR LOOPS INITIATION | LOOP COUNT: ", format(count, big.mark=","), " | CORRELATION LIMIT: ", fun_round(cor.limit, 4), " | ABS TEMPO CORRELATION: ", fun_round(tempo.cor, 4))) - count.est <- 1e5 - first.round <- TRUE - GOBACK <- FALSE - while(tempo.cor > cor.limit){ - round <- round + 1 - # estimation step - if(first.round == TRUE){ - first.round <- FALSE - cor.dec.per.loop <- numeric(length = 5) - loop.nb.est <- Inf - cor.est.ini <- tempo.cor - cor.est <- numeric(length = 5) - for(i6 in 1:5){ # connected to cor.dec.per.loop - tempo.pos.est <- tempo.pos - pos <- sample.int(n = pos.selec.seq.max , size = count.est, replace = TRUE) # selection of n position - for(i7 in 1:count.est){ - pos2 <- pos[i7] # selection of 1 position - tempo.pos.est[c(pos2 + 1, pos2)] <- tempo.pos.est[c(pos2, pos2 + 1)] - } - tempo.cor.est <- abs(cor(x = data1[tempo.pos.est], y = data2, use = "pairwise.complete.obs", method = cor.method)) - cor.est[i6] <- tempo.cor.est - tempo.cor.dec.per.loop <- (cor.est.ini - tempo.cor.est) / count.est # correlation decrease per loop - if(is.na(tempo.cor.dec.per.loop) | ! is.finite(tempo.cor.dec.per.loop)){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 2\ncor.est.ini: ", cor.est.ini, "\ntempo.cor.est: ", tempo.cor.est, "\n\n============\n\n")) - stop(tempo.cat) - } - cor.dec.per.loop[i6] <- tempo.cor.dec.per.loop - } - cor.est <- cor.est[which.max(cor.dec.per.loop)] # max to avoid to go to far with for loop (tempo.cor below tempo.limit) - cor.dec.per.loop <- max(cor.dec.per.loop, na.rm = TRUE) # max to avoid to go to far with for loop (tempo.cor below tempo.limit) - loop.nb.est <- round((tempo.cor - cor.limit) / cor.dec.per.loop) - }else{ - if(GOBACK == TRUE){ - loop.nb.est <- round(loop.nb.est / 2) - }else{ - cor.dec.per.loop <- (cor.ini - tempo.cor) / count - loop.nb.est <- round((tempo.cor - cor.limit) / cor.dec.per.loop) - } - } - # end estimation step - # loop step - if(is.na(loop.nb.est) | ! is.finite(loop.nb.est)){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 1\nloop.nb.est: ", loop.nb.est, "\ncor.ini: ", cor.ini, "\ntempo.cor: ", tempo.cor, "\ncor.limit: ", cor.limit, "\ncor.dec.per.loop: ", cor.dec.per.loop, "\n\n============\n\n")) - stop(tempo.cat) - }else if(loop.nb.est > 1e4){ # below -> leave the while loop - tempo.pos.secu <- tempo.pos - count.secu <- count - tempo.cor.secu <- tempo.cor - cat(paste0("\n", ifelse(text.print == "", "", paste0(text.print, " | ")), "INITIAL SETTINGS BEFORE ROUND: ", round, " | LOOP COUNT: ", format(count, big.mark=","), " | GO BACK: ", GOBACK, " | LOOP NUMBER ESTIMATION: ", format(loop.nb.est, big.mark=","), " | CORRELATION LIMIT: ", fun_round(cor.limit, 4), " | ABS TEMPO CORRELATION: ", fun_round(tempo.cor, 4))) - count.print.loop <- logical(length = count.print) - count.print.loop[length(count.print.loop)] <- TRUE # not this to avoid long vector, but not forget to reset during printing: count.print.loop[(1:trunc(n / count.print) * count.print)] <- TRUE # counter to speedup - count.loop <- 0 - pos <- sample.int(n = pos.selec.seq.max , size = count.print, replace = TRUE) # selection of random positions. BEWARE: n = pos.selec.seq.max because already - 1 (see above) but is connected to tempo.pos[c(pos2 + 1, pos2)] <- tempo.pos[c(pos2, pos2 + 1)] - tempo.date.loop <- Sys.time() - tempo.time.loop <- as.numeric(tempo.date.loop) - for(i6 in 1:loop.nb.est){ - count.loop <- count.loop + 1 - pos2 <- pos[count.loop] # selection of 1 position - tempo.pos[c(pos2 + 1, pos2)] <- tempo.pos[c(pos2, pos2 + 1)] - if(count.print.loop[count.loop]){ - count.loop <- 0 - pos <- sample.int(n = pos.selec.seq.max , size = count.print, replace = TRUE) # BEWARE: never forget to resample here - tempo.time <- as.numeric(Sys.time()) - tempo.lapse <- round(lubridate::seconds_to_period(tempo.time - tempo.time.loop)) - final.loop <- (tempo.time - tempo.time.loop) / i6 * loop.nb.est # intra nb.compar loop lapse: time lapse / cycles done * cycles remaining - final.exp <- as.POSIXct(final.loop, origin = tempo.date.loop) - cat(paste0("\n", ifelse(text.print == "", "", paste0(text.print, " | ")), "FOR LOOP | ROUND ", round, " | LOOP: ", format(i6, big.mark=","), " / ", format(loop.nb.est, big.mark=","), " | TIME SPENT: ", tempo.lapse, " | EXPECTED END: ", final.exp)) - } - } - count <- count + loop.nb.est # out of the loop to speedup - tempo.cor <- abs(cor(x = data1[tempo.pos], y = data2, use = "pairwise.complete.obs", method = cor.method)) - if(tempo.cor > tempo.cor.secu | ((tempo.cor - cor.limit) < 0 & abs(tempo.cor - cor.limit) > smallest.cor.dec * round(log10(max(ini.pos, na.rm = TRUE))))){ - GOBACK <- TRUE - tempo.pos <- tempo.pos.secu - count <- count.secu - tempo.cor <- tempo.cor.secu - }else{ - GOBACK <- FALSE - } - }else{ - cat(paste0("\n", ifelse(text.print == "", "", paste0(text.print, " | ")), "FINAL WHILE LOOP | LOOP COUNT: ", format(count, big.mark=","), " | CORRELATION LIMIT: ", fun_round(cor.limit, 4), " | ABS TEMPO CORRELATION: ", fun_round(tempo.cor, 4))) - count.print.loop <- logical(length = count.print) - count.print.loop[length(count.print.loop)] <- TRUE # counter to speedup - count.loop <- 0 # - pos <- sample.int(n = pos.selec.seq.max , size = count.print, replace = TRUE) # selection of random positions. BEWARE: n = pos.selec.seq.max because already - 1 (see above) but is connected to tempo.pos[c(pos2 + 1, pos2)] <- tempo.pos[c(pos2, pos2 + 1)] - tempo.cor.loop <- tempo.cor - tempo.date.loop <- Sys.time() - tempo.time.loop <- as.numeric(tempo.date.loop) - while(tempo.cor > cor.limit){ - count <- count + 1 - count.loop <- count.loop + 1 - pos2 <- pos[count.loop] - tempo.pos[c(pos2 + 1, pos2)] <- tempo.pos[c(pos2, pos2 + 1)] - tempo.cor <- abs(cor(x = data1[tempo.pos], y = data2, use = "pairwise.complete.obs", method = cor.method)) - if(count.print.loop[count.loop]){ - count.loop <- 0 - pos <- sample.int(n = pos.selec.seq.max , size = count.print, replace = TRUE) # BEWARE: never forget to resample here - tempo.time <- as.numeric(Sys.time()) - tempo.lapse <- round(lubridate::seconds_to_period(tempo.time - tempo.time.loop)) - final.loop <- (tempo.time - tempo.time.loop) / (tempo.cor.loop - tempo.cor) * (tempo.cor - cor.limit) # tempo.cor.loop - tempo.cor always positive and tempo.cor decreases progressively starting from tempo.cor.loop - final.exp <- as.POSIXct(final.loop, origin = tempo.date.loop) - cat(paste0("\n", ifelse(text.print == "", "", paste0(text.print, " | ")), "WHILE LOOP | LOOP NB: ", format(count.loop, big.mark=","), " | COUNT: ", format(count, big.mark=","), " | CORRELATION LIMIT: ", fun_round(cor.limit, 4), " | ABS TEMPO CORRELATION: ", fun_round(tempo.cor, 4), " | TIME SPENT: ", tempo.lapse, " | EXPECTED END: ", final.exp)) - } - } - } - } - tempo.time <- as.numeric(Sys.time()) - tempo.lapse <- round(lubridate::seconds_to_period(tempo.time - ini.time)) - cat(paste0("\n", ifelse(text.print == "", "", paste0(text.print, " | ")), "WHILE/FOR LOOPS END | LOOP COUNT: ", format(count, big.mark=","), " | NB OF ROUNDS: ", round, " | CORRELATION LIMIT: ", fun_round(cor.limit, 4), " | ABS TEMPO CORRELATION: ", fun_round(tempo.cor, 4), " | TOTAL SPENT TIME: ", tempo.lapse)) - } - tempo.cor <- ifelse(neg.cor == TRUE, -tempo.cor, tempo.cor) - } - } - cat("\n\n") - if(warn.print == TRUE & ! is.null(warning)){ - warning(warning) - cat("\n\n") - } - output <- list(data = data1[tempo.pos], warnings = warnings, cor = if(is.null(data2)){cor(ini.pos, tempo.pos, method = "spearman")}else{tempo.cor}, count = count) - return(output) +# AIM +# reorder the elements of the data1 vector by flipping 2 randomly selected consecutive positions either: +# 1) n times (when n is precised) or +# 2) until the correlation between data1 and data2 decreases down to the cor.limit (0.2 by default). See cor.limit below to deal with negative correlations +# Example of consecutive position flipping: ABCD -> BACD -> BADC, etc. +# WARNINGS +# see # https://www.r-bloggers.com/strategies-to-speedup-r-code/ for code speedup +# the random switch of non consecutive positions (ABCD -> DBCA for instance) does not work very well as the correaltion is quickly obtained but the initial vector structure is mainly kept (no much order). Ths code would be: pos <- ini.pos[1:2] ; pos <- sample.int(n = n , size = 2, replace = FALSE) ; tempo.pos[pos] <- tempo.pos[rev(pos)] +# ARGUMENTS +# data1: a vector of at least 2 elements. Must be numeric if data2 is specified +# data2: a numeric vector of same length as data1 +# n: number of times "flipping 2 randomly selected consecutive positions". Ignored if data2 is specified +# seed: integer number used by set.seed(). Write NULL if random result is required, an integer otherwise. BEWARE: if not NULL, fun_permut() will systematically return the same result when the other parameters keep the same settings +# count.print: interger value. Print a working progress message every count.print during loops. BEWARE: can increase substentially the time to complete the process using a small value, like 10 for instance. Use Inf is no loop message desired +# text.print: optional message to add to the working progress message every count.print loop +# cor.method: correlation method. Either "pearson", "kendall" or "spearman". Ignored if data2 is not specified +# cor.limit: a correlation limit (between 0 and 1). Ignored if data2 is not specified. Compute the correlation between data1 and data2, permute the data1 values, and stop the permutation process when the correlation between data1 and data2 decreases down below the cor limit value (0.2 by default). If cor(data1, data2) is negative, then -cor.limit is used and the process stops until the correlation between data1 and data2 increases up over cor.limit (-0.2 by default). BEWARE: write a positive cor.limit even if cor(data1, data2) is known to be negative. The function will automatically uses -cor.limit. If the initial correlation is already below cor.limit (positive correlation) or over -cor.limit (negative correlation), then the data1 value positions are completely randomized (correlation between data1 and data2 is expected to be 0) +# warn.print: logical. Print warnings at the end of the execution? No print if no warning messages +# path.lib: absolute path of the required packages, if not in the default folders +# REQUIRED PACKAGES +# lubridate +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_check() +# fun_pack() +# fun_round() +# RETURN +# a list containing: +# $data: the modified vector +# $warnings: potential warning messages (in case of negative correlation when data2 is specified). NULL if non warning message +# $cor: a spearman correlation between the initial positions (1:length(data1) and the final positions if data2 is not specified and the final correlation between data1 and data2 otherwise, according to cor.method +# $count: the number of loops used +# EXAMPLES +# example (1) showing that for loop, used in fun_permut(), is faster than while loop +# ini.time <- as.numeric(Sys.time()) ; count <- 0 ; for(i0 in 1:1e9){count <- count + 1} ; tempo.time <- as.numeric(Sys.time()) ; tempo.lapse <- round(lubridate::seconds_to_period(tempo.time - ini.time)) ; tempo.lapse +# example (2) showing that for loop, used in fun_permut(), is faster than while loop +# ini.time <- as.numeric(Sys.time()) ; count <- 0 ; while(count < 1e9){count <- count + 1} ; tempo.time <- as.numeric(Sys.time()) ; tempo.lapse <- round(lubridate::seconds_to_period(tempo.time - ini.time)) ; tempo.lapse +# fun_permut(data1 = LETTERS[1:5], data2 = NULL, n = 100, seed = 1, count.print = 10, text.print = "CPU NB 4") +# fun_permut(data1 = 101:110, data2 = 21:30, seed = 1, count.print = 1e4, text.print = "", cor.method = "spearman", cor.limit = 0.2) +# a way to use the cor.limit argument just considering data1 +# obs1 <- 101:110 ; fun_permut(data1 = obs1, data2 = obs1, seed = 1, count.print = 10, cor.method = "spearman", cor.limit = 0.2) +# fun_permut(data1 = 1:1e3, data2 = 1e3:1, seed = 1, count.print = 1e6, text.print = "", cor.method = "spearman", cor.limit = 0.7) +# fun_permut(data1 = 1:1e2, data2 = 1e2:1, seed = 1, count.print = 1e3, cor.limit = 0.5) +# fun_permut(data1 = c(0,0,0,0,0), n = 5, data2 = NULL, seed = 1, count.print = 1e3, cor.limit = 0.5) +# DEBUGGING +# data1 = LETTERS[1:5] ; data2 = NULL ; n = 1e6 ; seed = NULL ; count.print = 1e3 ; text.print = "" ; cor.method = "spearman" ; cor.limit = 0.2 ; warn.print = TRUE ; path.lib = NULL +# data1 = LETTERS[1:5] ; data2 = NULL ; n = 10 ; seed = 22 ; count.print = 10 ; text.print = "" ; cor.method = "spearman" ; cor.limit = 0.2 ; warn.print = TRUE ; path.lib = NULL +# data1 = 101:110 ; data2 = 21:30 ; n = 10 ; seed = 22 ; count.print = 10 ; text.print = "" ; cor.method = "spearman" ; cor.limit = 0.2 ; warn.print = TRUE ; path.lib = NULL +# data1 = 1:1e3 ; data2 = 1e3:1 ; n = 20 ; seed = 22 ; count.print = 1e6 ; text.print = "" ; cor.method = "spearman" ; cor.limit = 0.5 ; warn.print = TRUE ; path.lib = NULL +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_pack", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_pack() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_round", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_pack() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_check(data = data1, class = "vector", fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & length(data1) < 2){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": data1 ARGUMENT MUST BE A VECTOR OF MINIMUM LENGTH 2. HERE IT IS: ", length(data1),"\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +if( ! is.null(data2)){ +tempo <- fun_check(data = data1, class = "vector", mode = "numeric", fun.name = function.name) ; eval(ee) +if(tempo$problem == TRUE){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": data1 MUST BE A NUMERIC VECTOR IF data2 ARGUMENT IS SPECIFIED\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +tempo <- fun_check(data = data2, class = "vector", mode = "numeric", fun.name = function.name) ; eval(ee) +if(length(data1) != length(data2)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": data1 AND data2 MUST BE VECTOR OF SAME LENGTH. HERE IT IS ", length(data1)," AND ", length(data2), "\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +}else if(is.null(n)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": n ARGUMENT CANNOT BE NULL IF data2 ARGUMENT IS NULL\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +if( ! is.null(n)){ +tempo <- fun_check(data = n, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, neg.values = FALSE, fun.name = function.name) ; eval(ee) +} +if( ! is.null(seed)){ +tempo <- fun_check(data = seed, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, neg.values = FALSE, fun.name = function.name) ; eval(ee) +} +tempo <- fun_check(data = count.print, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = text.print, class = "character", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = cor.method, options = c("pearson", "kendall", "spearman"), length =1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = cor.limit, class = "vector", mode = "numeric", prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = warn.print, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(path.lib)){ +tempo <- fun_check(data = path.lib, class = "character", fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! all(dir.exists(path.lib))){ +tempo.cat <- paste0("\n\n============\n\nERROR IN ", function.name, ": \nDIRECTORY PATH INDICATED IN THE path.lib PARAMETER DOES NOT EXISTS: ", path.lib, "\n\n============\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +} +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_check() +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() +# end argument checking +# package checking +fun_pack(req.package = "lubridate", path.lib = path.lib) +# end package checking +# main code +# code that protects set.seed() in the global environment +# see also Protocol 100-rev0 Parallelization in R.docx +if(exists(".Random.seed", envir = .GlobalEnv)){ # if .Random.seed does not exists, it means that no random operation has been performed yet in any R environment +tempo.random.seed <- .Random.seed +on.exit(assign(".Random.seed", tempo.random.seed, env = .GlobalEnv)) +}else{ +on.exit(set.seed(NULL)) # inactivate seeding -> return to complete randomness +} +# end code that protects set.seed() in the global environment +if( ! is.null(seed)){ +set.seed(seed) +} +ini.date <- Sys.time() # time of process begin, converted into seconds +ini.time <- as.numeric(ini.date) # time of process begin, converted into seconds +ini.pos <- 1:length(data1) # positions of data1 before permutation loops +tempo.pos <- ini.pos # positions of data1 that will be modified during loops +# pos.selec.seq <- ini.pos[-length(data1)] # selection of 1 position in initial position, without the last because always up permutation (pos -> pos+1 & pos+1 -> pos) +pos.selec.seq.max <- length(ini.pos) - 1 # max position (used by sample.int() function). See below for - 1 +warnings <- NULL +count <- 0 +round <- 0 +BREAK <- FALSE +tempo.cor <- 0 +if(is.null(data2)){ +if(length(table(data1)) == 1){ +tempo.warnings <- paste0("NO PERMUTATION PERFORMED BECAUSE data1 ARGUMENT SEEMS TO BE MADE OF IDENTICAL ELEMENTS: ", names(table(data1))) +warnings <- paste0(warnings, ifelse(is.null(warnings), "", "\n"), tempo.warnings) # +}else{ +if(count.print > n){ +count.print <- n +} +cat(paste0("\n", ifelse(text.print == "", "", paste0(text.print, " | ")), "FOR LOOP OF ", n, " LOOPS INITIATED | LOOP COUNT: ", format(count, big.mark=","))) +count.print.loop <- logical(length = count.print) +count.print.loop[length(count.print.loop)] <- TRUE # not this to avoid long vector, but not forget to reset during printing: count.print.loop[(1:trunc(n / count.print) * count.print)] <- TRUE # counter to speedup +count.loop <- 0 +pos <- sample.int(n = pos.selec.seq.max , size = count.print, replace = TRUE) # selection of random positions. BEWARE: n = pos.selec.seq.max because already - 1 (see above) but is connected to tempo.pos[c(pos2 + 1, pos2)] <- tempo.pos[c(pos2, pos2 + 1)] +tempo.date.loop <- Sys.time() +tempo.time.loop <- as.numeric(tempo.date.loop) +for(i3 in 1:n){ +count.loop <- count.loop + 1 +pos2 <- pos[count.loop] # selection of 1 position +tempo.pos[c(pos2 + 1, pos2)] <- tempo.pos[c(pos2, pos2 + 1)] +if(count.print.loop[count.loop]){ +count.loop <- 0 +pos <- sample.int(n = pos.selec.seq.max , size = count.print, replace = TRUE) # BEWARE: never forget to resample here +tempo.time <- as.numeric(Sys.time()) +tempo.lapse <- round(lubridate::seconds_to_period(tempo.time - tempo.time.loop)) +final.loop <- (tempo.time - tempo.time.loop) / i3 * n +final.exp <- as.POSIXct(final.loop, origin = tempo.date.loop) +cat(paste0("\n", ifelse(text.print == "", "", paste0(text.print, " | ")), "FOR LOOP ", i3, " / ", n, " | TIME SPENT: ", tempo.lapse, " | EXPECTED END: ", final.exp)) +} +} +count <- count + n # out of the loop to speedup +cat(paste0("\n", ifelse(text.print == "", "", paste0(text.print, " | ")), "FOR LOOP ENDED | LOOP COUNT: ", format(count, big.mark=","))) +cat("\n\n") +} +}else{ +if(length(table(data1)) == 1){ +tempo.warnings <- paste0("NO PERMUTATION PERFORMED BECAUSE data1 ARGUMENT SEEMS TO BE MADE OF IDENTICAL ELEMENTS: ", names(table(data1))) +warnings <- paste0(warnings, ifelse(is.null(warnings), "", "\n"), tempo.warnings) # +tempo.cor <- 1 +}else if(length(table(data2)) == 1){ +tempo.warnings <- paste0("NO PERMUTATION PERFORMED BECAUSE data2 ARGUMENT SEEMS TO BE MADE OF IDENTICAL ELEMENTS: ", names(table(data2))) +warnings <- paste0(warnings, ifelse(is.null(warnings), "", "\n"), tempo.warnings) # +tempo.cor <- 1 +}else{ +cor.ini <- cor(x = data1, y = data2, use = "pairwise.complete.obs", method = cor.method) +tempo.cor <- cor.ini # correlation that will be modified during loops +neg.cor <- FALSE +if(tempo.cor < 0){ +tempo.warnings <- paste0("INITIAL ", toupper(cor.method), " CORRELATION BETWEEN data1 AND data2 HAS BEEN DETECTED AS NEGATIVE: ", tempo.cor, ". THE LOOP STEPS WILL BE PERFORMED USING POSITIVE CORRELATIONS BUT THE FINAL CORRELATION WILL BE NEGATIVE") +warnings <- paste0(warnings, ifelse(is.null(warnings), "", "\n"), tempo.warnings) # +neg.cor <- TRUE +tempo.cor <- abs(tempo.cor) +cor.ini <- abs(cor.ini) +} +if(tempo.cor < cor.limit){ # randomize directly all the position to be close to correlation zero +tempo.warnings <- paste0("INITIAL ABSOLUTE VALUE OF THE ", toupper(cor.method), " CORRELATION ", fun_round(tempo.cor), " BETWEEN data1 AND data2 HAS BEEN DETECTED AS BELOW THE CORRELATION LIMIT PARAMETER ", cor.limit, "\nTHE data1 SEQUENCE HAS BEEN COMPLETELY RANDOMIZED TO CORRESPOND TO CORRELATION ZERO") +warnings <- paste0(warnings, ifelse(is.null(warnings), "", "\n"), tempo.warnings) # +for(i4 in 1:5){ # done 5 times to be sure of the complete randomness +tempo.pos <- sample(x = tempo.pos, size = length(tempo.pos), replace = FALSE) +} +count <- count + 5 # out of the loop to speedup +}else{ +# smallest correlation decrease +count <- count + 1 # 1 and not 0 because already 1 performed just below +pos <- sample.int(n = pos.selec.seq.max , size = 1, replace = TRUE) # selection of 1 position # pos.selec.seq.max because selection of 1 position in initial position, without the last because always up permutation (pos -> pos+1 & pos+1 -> pos) +tempo.pos[c(pos + 1, pos)] <- tempo.pos[c(pos, pos + 1)] +tempo.cor <- abs(cor(x = data1[tempo.pos], y = data2, use = "pairwise.complete.obs", method = cor.method)) +smallest.cor.dec <- cor.ini - tempo.cor +# end smallest correlation decrease +# going out of tempo.cor == cor.ini +cat(paste0("\n", ifelse(text.print == "", "", paste0(text.print, " | ")), "CORRELATION DECREASE AFTER A SINGLE PERMUTATION: ", fun_round(smallest.cor.dec, 4))) +cat(paste0("\n", ifelse(text.print == "", "", paste0(text.print, " | ")), "FIRST WHILE LOOP STEP -> GOING OUT FROM EQUALITY | LOOP COUNT: ", format(count, big.mark=","), " | CORRELATION LIMIT: ", fun_round(cor.limit, 4), " | ABS TEMPO CORRELATION: ", fun_round(tempo.cor, 4))) +count.print.loop <- logical(length = count.print) +count.print.loop[length(count.print.loop)] <- TRUE # counter to speedup +count.loop <- 0 # +pos <- sample.int(n = pos.selec.seq.max , size = count.print, replace = TRUE) # selection of random positions. BEWARE: n = pos.selec.seq.max because already - 1 (see above) but is connected to tempo.pos[c(pos2 + 1, pos2)] <- tempo.pos[c(pos2, pos2 + 1)] +tempo.date.loop <- Sys.time() +tempo.time.loop <- as.numeric(tempo.date.loop) +while(tempo.cor == cor.ini){ # to be out of equality between tempo.cor and cor.ini at the beginning (only valid for very long vector) +count <- count + 1 +count.loop <- count.loop + 1 +pos2 <- pos[count.loop] +tempo.pos[c(pos2 + 1, pos2)] <- tempo.pos[c(pos2, pos2 + 1)] +tempo.cor <- abs(cor(x = data1[tempo.pos], y = data2, use = "pairwise.complete.obs", method = cor.method)) +if(count.print.loop[count.loop]){ +count.loop <- 0 +pos <- sample.int(n = pos.selec.seq.max , size = count.print, replace = TRUE) # BEWARE: never forget to resample here +tempo.time <- as.numeric(Sys.time()) +tempo.lapse <- round(lubridate::seconds_to_period(tempo.time - tempo.time.loop)) +cat(paste0("\n", ifelse(text.print == "", "", paste0(text.print, " | ")), "FIRST WHILE LOOP STEP", format(count.loop, big.mark=","), " / ? | COUNT: ", format(count, big.mark=","), " | CORRELATION LIMIT: ", fun_round(cor.limit, 4), " | ABS TEMPO CORRELATION: ", fun_round(tempo.cor, 4), " | TIME SPENT: ", tempo.lapse)) +} +} +tempo.time <- as.numeric(Sys.time()) +tempo.lapse <- round(lubridate::seconds_to_period(tempo.time - ini.time)) +cat(paste0("\n", ifelse(text.print == "", "", paste0(text.print, " | ")), "FIRST WHILE LOOP STEP END | LOOP COUNT: ", format(count, big.mark=","), " | CORRELATION LIMIT: ", fun_round(cor.limit, 4), " | ABS TEMPO CORRELATION: ", fun_round(tempo.cor, 4), " | TOTAL SPENT TIME: ", tempo.lapse)) +if(tempo.cor < cor.limit){ +tempo.warnings <- paste0("THE FIRST FOR & WHILE LOOP STEPS HAVE BEEN TOO FAR AND SUBSEQUENT LOOP STEPS WILL NOT RUN") +warnings <- paste0(warnings, ifelse(is.null(warnings), "", "\n"), tempo.warnings) +} +# end going out of tempo.cor == cor.ini +# estimation of the average correlation decrease per loop on x loops and for loop execution +cat(paste0("\n", ifelse(text.print == "", "", paste0(text.print, " | ")), "WHILE/FOR LOOPS INITIATION | LOOP COUNT: ", format(count, big.mark=","), " | CORRELATION LIMIT: ", fun_round(cor.limit, 4), " | ABS TEMPO CORRELATION: ", fun_round(tempo.cor, 4))) +count.est <- 1e5 +first.round <- TRUE +GOBACK <- FALSE +while(tempo.cor > cor.limit){ +round <- round + 1 +# estimation step +if(first.round == TRUE){ +first.round <- FALSE +cor.dec.per.loop <- numeric(length = 5) +loop.nb.est <- Inf +cor.est.ini <- tempo.cor +cor.est <- numeric(length = 5) +for(i6 in 1:5){ # connected to cor.dec.per.loop +tempo.pos.est <- tempo.pos +pos <- sample.int(n = pos.selec.seq.max , size = count.est, replace = TRUE) # selection of n position +for(i7 in 1:count.est){ +pos2 <- pos[i7] # selection of 1 position +tempo.pos.est[c(pos2 + 1, pos2)] <- tempo.pos.est[c(pos2, pos2 + 1)] +} +tempo.cor.est <- abs(cor(x = data1[tempo.pos.est], y = data2, use = "pairwise.complete.obs", method = cor.method)) +cor.est[i6] <- tempo.cor.est +tempo.cor.dec.per.loop <- (cor.est.ini - tempo.cor.est) / count.est # correlation decrease per loop +if(is.na(tempo.cor.dec.per.loop) | ! is.finite(tempo.cor.dec.per.loop)){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 2\ncor.est.ini: ", cor.est.ini, "\ntempo.cor.est: ", tempo.cor.est, "\n\n============\n\n")) +stop(tempo.cat) +} +cor.dec.per.loop[i6] <- tempo.cor.dec.per.loop +} +cor.est <- cor.est[which.max(cor.dec.per.loop)] # max to avoid to go to far with for loop (tempo.cor below tempo.limit) +cor.dec.per.loop <- max(cor.dec.per.loop, na.rm = TRUE) # max to avoid to go to far with for loop (tempo.cor below tempo.limit) +loop.nb.est <- round((tempo.cor - cor.limit) / cor.dec.per.loop) +}else{ +if(GOBACK == TRUE){ +loop.nb.est <- round(loop.nb.est / 2) +}else{ +cor.dec.per.loop <- (cor.ini - tempo.cor) / count +loop.nb.est <- round((tempo.cor - cor.limit) / cor.dec.per.loop) +} +} +# end estimation step +# loop step +if(is.na(loop.nb.est) | ! is.finite(loop.nb.est)){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 1\nloop.nb.est: ", loop.nb.est, "\ncor.ini: ", cor.ini, "\ntempo.cor: ", tempo.cor, "\ncor.limit: ", cor.limit, "\ncor.dec.per.loop: ", cor.dec.per.loop, "\n\n============\n\n")) +stop(tempo.cat) +}else if(loop.nb.est > 1e4){ # below -> leave the while loop +tempo.pos.secu <- tempo.pos +count.secu <- count +tempo.cor.secu <- tempo.cor +cat(paste0("\n", ifelse(text.print == "", "", paste0(text.print, " | ")), "INITIAL SETTINGS BEFORE ROUND: ", round, " | LOOP COUNT: ", format(count, big.mark=","), " | GO BACK: ", GOBACK, " | LOOP NUMBER ESTIMATION: ", format(loop.nb.est, big.mark=","), " | CORRELATION LIMIT: ", fun_round(cor.limit, 4), " | ABS TEMPO CORRELATION: ", fun_round(tempo.cor, 4))) +count.print.loop <- logical(length = count.print) +count.print.loop[length(count.print.loop)] <- TRUE # not this to avoid long vector, but not forget to reset during printing: count.print.loop[(1:trunc(n / count.print) * count.print)] <- TRUE # counter to speedup +count.loop <- 0 +pos <- sample.int(n = pos.selec.seq.max , size = count.print, replace = TRUE) # selection of random positions. BEWARE: n = pos.selec.seq.max because already - 1 (see above) but is connected to tempo.pos[c(pos2 + 1, pos2)] <- tempo.pos[c(pos2, pos2 + 1)] +tempo.date.loop <- Sys.time() +tempo.time.loop <- as.numeric(tempo.date.loop) +for(i6 in 1:loop.nb.est){ +count.loop <- count.loop + 1 +pos2 <- pos[count.loop] # selection of 1 position +tempo.pos[c(pos2 + 1, pos2)] <- tempo.pos[c(pos2, pos2 + 1)] +if(count.print.loop[count.loop]){ +count.loop <- 0 +pos <- sample.int(n = pos.selec.seq.max , size = count.print, replace = TRUE) # BEWARE: never forget to resample here +tempo.time <- as.numeric(Sys.time()) +tempo.lapse <- round(lubridate::seconds_to_period(tempo.time - tempo.time.loop)) +final.loop <- (tempo.time - tempo.time.loop) / i6 * loop.nb.est # intra nb.compar loop lapse: time lapse / cycles done * cycles remaining +final.exp <- as.POSIXct(final.loop, origin = tempo.date.loop) +cat(paste0("\n", ifelse(text.print == "", "", paste0(text.print, " | ")), "FOR LOOP | ROUND ", round, " | LOOP: ", format(i6, big.mark=","), " / ", format(loop.nb.est, big.mark=","), " | TIME SPENT: ", tempo.lapse, " | EXPECTED END: ", final.exp)) +} +} +count <- count + loop.nb.est # out of the loop to speedup +tempo.cor <- abs(cor(x = data1[tempo.pos], y = data2, use = "pairwise.complete.obs", method = cor.method)) +if(tempo.cor > tempo.cor.secu | ((tempo.cor - cor.limit) < 0 & abs(tempo.cor - cor.limit) > smallest.cor.dec * round(log10(max(ini.pos, na.rm = TRUE))))){ +GOBACK <- TRUE +tempo.pos <- tempo.pos.secu +count <- count.secu +tempo.cor <- tempo.cor.secu +}else{ +GOBACK <- FALSE +} +}else{ +cat(paste0("\n", ifelse(text.print == "", "", paste0(text.print, " | ")), "FINAL WHILE LOOP | LOOP COUNT: ", format(count, big.mark=","), " | CORRELATION LIMIT: ", fun_round(cor.limit, 4), " | ABS TEMPO CORRELATION: ", fun_round(tempo.cor, 4))) +count.print.loop <- logical(length = count.print) +count.print.loop[length(count.print.loop)] <- TRUE # counter to speedup +count.loop <- 0 # +pos <- sample.int(n = pos.selec.seq.max , size = count.print, replace = TRUE) # selection of random positions. BEWARE: n = pos.selec.seq.max because already - 1 (see above) but is connected to tempo.pos[c(pos2 + 1, pos2)] <- tempo.pos[c(pos2, pos2 + 1)] +tempo.cor.loop <- tempo.cor +tempo.date.loop <- Sys.time() +tempo.time.loop <- as.numeric(tempo.date.loop) +while(tempo.cor > cor.limit){ +count <- count + 1 +count.loop <- count.loop + 1 +pos2 <- pos[count.loop] +tempo.pos[c(pos2 + 1, pos2)] <- tempo.pos[c(pos2, pos2 + 1)] +tempo.cor <- abs(cor(x = data1[tempo.pos], y = data2, use = "pairwise.complete.obs", method = cor.method)) +if(count.print.loop[count.loop]){ +count.loop <- 0 +pos <- sample.int(n = pos.selec.seq.max , size = count.print, replace = TRUE) # BEWARE: never forget to resample here +tempo.time <- as.numeric(Sys.time()) +tempo.lapse <- round(lubridate::seconds_to_period(tempo.time - tempo.time.loop)) +final.loop <- (tempo.time - tempo.time.loop) / (tempo.cor.loop - tempo.cor) * (tempo.cor - cor.limit) # tempo.cor.loop - tempo.cor always positive and tempo.cor decreases progressively starting from tempo.cor.loop +final.exp <- as.POSIXct(final.loop, origin = tempo.date.loop) +cat(paste0("\n", ifelse(text.print == "", "", paste0(text.print, " | ")), "WHILE LOOP | LOOP NB: ", format(count.loop, big.mark=","), " | COUNT: ", format(count, big.mark=","), " | CORRELATION LIMIT: ", fun_round(cor.limit, 4), " | ABS TEMPO CORRELATION: ", fun_round(tempo.cor, 4), " | TIME SPENT: ", tempo.lapse, " | EXPECTED END: ", final.exp)) +} +} +} +} +tempo.time <- as.numeric(Sys.time()) +tempo.lapse <- round(lubridate::seconds_to_period(tempo.time - ini.time)) +cat(paste0("\n", ifelse(text.print == "", "", paste0(text.print, " | ")), "WHILE/FOR LOOPS END | LOOP COUNT: ", format(count, big.mark=","), " | NB OF ROUNDS: ", round, " | CORRELATION LIMIT: ", fun_round(cor.limit, 4), " | ABS TEMPO CORRELATION: ", fun_round(tempo.cor, 4), " | TOTAL SPENT TIME: ", tempo.lapse)) +} +tempo.cor <- ifelse(neg.cor == TRUE, -tempo.cor, tempo.cor) +} +} +cat("\n\n") +if(warn.print == TRUE & ! is.null(warning)){ +warning(warning) +cat("\n\n") +} +output <- list(data = data1[tempo.pos], warnings = warnings, cor = if(is.null(data2)){cor(ini.pos, tempo.pos, method = "spearman")}else{tempo.cor}, count = count) +return(output) } @@ -2547,60 +2552,60 @@ fun_permut <- function(data1, data2 = NULL, n = NULL, seed = NULL, count.print = # Check OK: clear to go Apollo fun_width <- function(class.nb, inches.per.class.nb = 1, ini.window.width = 7, inch.left.space, inch.right.space, boundarie.space = 0.5){ - # AIM - # rescale the width of a window to open depending on the number of classes to plot - # can be used for height, considering that it is as if it was a width - # this order can be used: - # fun_width() - # fun_open() - # fun_prior_plot() # not for ggplot2 - # plot() or any other plotting - # fun_post_plot() if fun_prior_plot() has been used # not for ggplot2 - # fun_close() - # REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION - # fun_check() - # ARGUMENTS - # class.nb: number of class to plot - # inches.per.class.nb: number of inches per unit of class.nb. 2 means 2 inches for each boxplot for instance - # ini.window.width:initial window width in inches - # inch.left.space: left horizontal margin of the figure region (in inches) - # inch.right.space: right horizontal margin of the figure region (in inches) - # boundarie.space: space between the right and left limits of the plotting region and the plot (0.5 means half a class width) - # RETURN - # the new window width in inches - # EXAMPLES - # fun_width(class.nb = 10, inches.per.class.nb = 0.2, ini.window.width = 7, inch.left.space = 1, inch.right.space = 1, boundarie.space = 0.5) - # DEBUGGING - # class.nb = 10 ; inches.per.class.nb = 0.2 ; ini.window.width = 7 ; inch.left.space = 1 ; inch.right.space = 1 ; boundarie.space = 0.5 # for function debugging - # function name - function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") - # end function name - # required function checking - if(length(find("fun_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_check(data = class.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = inches.per.class.nb, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = ini.window.width, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = inch.left.space, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = inch.right.space, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = boundarie.space, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_check() - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() - # end argument checking - # main code - range.max <- class.nb + boundarie.space # the max range of the future plot - range.min <- boundarie.space # the min range of the future plot - window.width <- inch.left.space + inch.right.space + inches.per.class.nb * (range.max - range.min) - return(window.width) +# AIM +# rescale the width of a window to open depending on the number of classes to plot +# can be used for height, considering that it is as if it was a width +# this order can be used: +# fun_width() +# fun_open() +# fun_prior_plot() # not for ggplot2 +# plot() or any other plotting +# fun_post_plot() if fun_prior_plot() has been used # not for ggplot2 +# fun_close() +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_check() +# ARGUMENTS +# class.nb: number of class to plot +# inches.per.class.nb: number of inches per unit of class.nb. 2 means 2 inches for each boxplot for instance +# ini.window.width:initial window width in inches +# inch.left.space: left horizontal margin of the figure region (in inches) +# inch.right.space: right horizontal margin of the figure region (in inches) +# boundarie.space: space between the right and left limits of the plotting region and the plot (0.5 means half a class width) +# RETURN +# the new window width in inches +# EXAMPLES +# fun_width(class.nb = 10, inches.per.class.nb = 0.2, ini.window.width = 7, inch.left.space = 1, inch.right.space = 1, boundarie.space = 0.5) +# DEBUGGING +# class.nb = 10 ; inches.per.class.nb = 0.2 ; ini.window.width = 7 ; inch.left.space = 1 ; inch.right.space = 1 ; boundarie.space = 0.5 # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_check(data = class.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = inches.per.class.nb, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = ini.window.width, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = inch.left.space, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = inch.right.space, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = boundarie.space, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_check() +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() +# end argument checking +# main code +range.max <- class.nb + boundarie.space # the max range of the future plot +range.min <- boundarie.space # the min range of the future plot +window.width <- inch.left.space + inch.right.space + inches.per.class.nb * (range.max - range.min) +return(window.width) } @@ -2609,142 +2614,142 @@ fun_width <- function(class.nb, inches.per.class.nb = 1, ini.window.width = 7, i # Check OK: clear to go Apollo fun_open <- function(pdf.disp = TRUE, path.fun = "working.dir", pdf.name.file = "graph", width.fun = 7, height.fun = 7, paper = "special", no.pdf.overwrite = TRUE, return.output = FALSE){ - # AIM - # open a pdf or screen (GUI) graphic window - # BEWARE: on Linux, use pdf.disp = TRUE, if (GUI) graphic window is not always available, meaning that X is not installed (clusters for instance). Use X11() in R to test if available - # this order can be used: - # fun_width() - # fun_open() - # fun_prior_plot() # not for ggplot2 - # plot() or any other plotting - # fun_post_plot() if fun_prior_plot() has been used # not for ggplot2 - # fun_close() - # REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION - # fun_check() - # ARGUMENTS: - # pdf.disp: use pdf or not - # path.fun: where the pdf is saved (do not terminate by / or \\). Write "working.dir" if working directory is required (default) - # pdf.name.file: name of the pdf file containing the graphs (the .pdf extension is added by the function) - # width.fun: width of the windows (in inches) - # height.fun: height of the windows (in inches) - # paper: paper argument of the pdf function (paper format). Only used for pdf(). Either "a4", "letter", "legal", "us", "executive", "a4r", "USr" or "special". If "special", means that width.fun and height.fun specify the paper size - # no.pdf.overwrite: existing pdf can be overwritten ? Only used if pdf.disp = TRUE - # return.output: return output ? If TRUE but function not assigned, the output list is displayed - # RETURN - # a list containing: - # $pdf.loc: path of the pdf created - # $ini.par: initial par() parameters (to reset in a new graph) - # $zone.ini: initial window spliting (to reset in a new graph) - # EXAMPLES - # fun_open(pdf.disp = FALSE, path.fun = "C:/Users/Gael/Desktop", pdf.name.file = "graph", width.fun = 7, height.fun = 7, paper = "special", no.pdf.overwrite = TRUE, return.output = TRUE) - # DEBUGGING - # pdf.disp = TRUE ; path.fun = "C:/Users/Gael/Desktop" ; pdf.name.file = "graphs" ; width.fun = 7 ; height.fun = 7 ; paper = "special" ; no.pdf.overwrite = TRUE ; return.output = TRUE # for function debugging - # pdf.disp = TRUE ; path.fun = "/pasteur/homes/gmillot/" ; pdf.name.file = "graphs" ; width.fun = 7 ; height.fun = 7 ; paper = "special" ; no.pdf.overwrite = TRUE ; return.output = TRUE # for function debugging - # function name - function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") - # end function name - # required function checking - if(length(find("fun_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_check(data = pdf.disp, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = path.fun, class = "character", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = pdf.name.file, class = "character", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = width.fun, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = height.fun, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = path.fun, class = "character", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = paper, options = c("a4", "letter", "legal", "us", "executive", "a4r", "USr", "special", "A4", "LETTER", "LEGAL", "US"), length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data =no.pdf.overwrite, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = return.output, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_check() - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() - # end argument checking - # main code - if(path.fun == "working.dir"){ - path.fun <- getwd() - }else{ - if(grepl(x = path.fun, pattern = ".+/$")){ - path.fun <- substr(path.fun, 1, nchar(path.fun) - 1) # remove the last / - } - if(dir.exists(path.fun) == FALSE){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": path.fun ARGUMENT DOES NOT CORRESPOND TO EXISTING DIRECTORY\n\n================\n\n") - stop(tempo.cat) - } - } - if(Sys.info()["sysname"] == "Windows"){ # Note that .Platform$OS.type() only says "unix" for macOS and Linux and "Windows" for Windows - open.fail <- NULL - windows() - ini.par <- par(no.readonly = TRUE) # to recover the initial graphical parameters if required (reset). BEWARE: this command alone opens a pdf of GUI window if no window already opened. But here, protected with the code because always a tempo window opened - invisible(dev.off()) # close the new window - }else if(Sys.info()["sysname"] == "Linux"){ - if(pdf.disp == TRUE){ - if(file.exists(paste0(path.fun, "/recover_ini_par.pdf"))){ - tempo.cat <- paste0("\n\n================\n\nPROBLEM IN fun_open(): THIS FUNCTION CANNOT BE USED ON LINUX IF A recover_ini_par.pdf FILE ALREADY EXISTS HERE: ", paste(path.fun, collapse = " "), "\n\n================\n\n") - stop(tempo.cat) - }else{ - pdf(width = width.fun, height = height.fun, file=paste0(path.fun, "/recover_ini_par.pdf"), paper = paper) - ini.par <- par(no.readonly = TRUE) # to recover the initial graphical parameters if required (reset). BEWARE: this command alone opens a pdf of GUI window if no window already opened. But here, protected with the code because always a tempo window opened - invisible(dev.off()) # close the pdf windows - file.remove(paste0(path.fun, "/recover_ini_par.pdf")) # remove the pdf file - } - }else{ - # test if X11 can be opened - if(file.exists(paste0(getwd(), "/Rplots.pdf"))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THIS FUNCTION CANNOT BE USED ON LINUX IF A Rplots.pdf FILE ALREADY EXISTS HERE: ", getwd(), "\n\n================\n\n") - stop(tempo.cat) - }else{ - open.fail <- suppressWarnings(try(X11(), silent = TRUE))[] # try to open a X11 window. If open.fail == NULL, no problem, meaning that the X11 window is opened. If open.fail != NULL, a pdf can be opened here paste0(getwd(), "/Rplots.pdf") - if(is.null(open.fail)){ - ini.par <- par(no.readonly = TRUE) # to recover the initial graphical parameters if required (reset). BEWARE: this command alone opens a pdf of GUI window if no window already opened. But here, protected with the code because always a tempo window opened - invisible(dev.off()) # close the new window - }else if(file.exists(paste0(getwd(), "/Rplots.pdf"))){ - file.remove(paste0(getwd(), "/Rplots.pdf")) # remove the pdf file - tempo.cat <- ("\n\n================\n\nPROBLEM IN fun_open(): THIS FUNCTION CANNOT OPEN GUI ON LINUX OR NON MACOS UNIX SYSTEM (X GRAPHIC INTERFACE HAS TO BE SET).\nTO OVERCOME THIS, PLEASE SET pdf.disp ARGUMENT TO TRUE AND RERUN\n\n================\n\n") - stop(tempo.cat) - } - } - } - }else{ - open.fail <- NULL - quartz() - ini.par <- par(no.readonly = TRUE) # to recover the initial graphical parameters if required (reset). BEWARE: this command alone opens a pdf of GUI window if no window already opened. But here, protected with the code because always a tempo window opened - invisible(dev.off()) # close the new window - } - zone.ini <- matrix(1, ncol=1) # to recover the initial parameters for next figure region when device region split into several figure regions - if(pdf.disp == TRUE){ - pdf.loc <- paste0(path.fun, "/", pdf.name.file, ".pdf") - if(file.exists(pdf.loc) == TRUE & no.pdf.overwrite == TRUE){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": pdf.loc FILE ALREADY EXISTS AND CANNOT BE OVERWRITTEN DUE TO no.pdf.overwrite ARGUMENT SET TO TRUE: ", pdf.loc, "\n\n================\n\n") - stop(tempo.cat) - }else{ - pdf(width = width.fun, height = height.fun, file=pdf.loc, paper = paper) - } - }else if(pdf.disp == FALSE){ - pdf.loc <- NULL - if(Sys.info()["sysname"] == "Windows"){ # .Platform$OS.type() only says "unix" for macOS and Linux and "Windows" for Windows - windows(width = width.fun, height = height.fun, rescale="fixed") - }else if(Sys.info()["sysname"] == "Linux"){ - if( ! is.null(open.fail)){ - stop("\n\n================\n\nPROBLEM IN fun_open(): THIS FUNCTION CANNOT OPEN GUI ON LINUX OR NON MACOS UNIX SYSTEM (X GRAPHIC INTERFACE HAS TO BE SET).\nTO OVERCOME THIS, PLEASE SET pdf.disp ARGUMENT TO TRUE AND RERUN\n\n================\n\n") - }else{ - X11(width = width.fun, height = height.fun) - } - }else{ - quartz(width = width.fun, height = height.fun) - } - } - if(return.output == TRUE){ - output <- list(pdf.loc = pdf.loc, ini.par = ini.par, zone.ini = zone.ini) - return(output) - } +# AIM +# open a pdf or screen (GUI) graphic window +# BEWARE: on Linux, use pdf.disp = TRUE, if (GUI) graphic window is not always available, meaning that X is not installed (clusters for instance). Use X11() in R to test if available +# this order can be used: +# fun_width() +# fun_open() +# fun_prior_plot() # not for ggplot2 +# plot() or any other plotting +# fun_post_plot() if fun_prior_plot() has been used # not for ggplot2 +# fun_close() +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_check() +# ARGUMENTS: +# pdf.disp: use pdf or not +# path.fun: where the pdf is saved (do not terminate by / or \\). Write "working.dir" if working directory is required (default) +# pdf.name.file: name of the pdf file containing the graphs (the .pdf extension is added by the function) +# width.fun: width of the windows (in inches) +# height.fun: height of the windows (in inches) +# paper: paper argument of the pdf function (paper format). Only used for pdf(). Either "a4", "letter", "legal", "us", "executive", "a4r", "USr" or "special". If "special", means that width.fun and height.fun specify the paper size +# no.pdf.overwrite: existing pdf can be overwritten ? Only used if pdf.disp = TRUE +# return.output: return output ? If TRUE but function not assigned, the output list is displayed +# RETURN +# a list containing: +# $pdf.loc: path of the pdf created +# $ini.par: initial par() parameters (to reset in a new graph) +# $zone.ini: initial window spliting (to reset in a new graph) +# EXAMPLES +# fun_open(pdf.disp = FALSE, path.fun = "C:/Users/Gael/Desktop", pdf.name.file = "graph", width.fun = 7, height.fun = 7, paper = "special", no.pdf.overwrite = TRUE, return.output = TRUE) +# DEBUGGING +# pdf.disp = TRUE ; path.fun = "C:/Users/Gael/Desktop" ; pdf.name.file = "graphs" ; width.fun = 7 ; height.fun = 7 ; paper = "special" ; no.pdf.overwrite = TRUE ; return.output = TRUE # for function debugging +# pdf.disp = TRUE ; path.fun = "/pasteur/homes/gmillot/" ; pdf.name.file = "graphs" ; width.fun = 7 ; height.fun = 7 ; paper = "special" ; no.pdf.overwrite = TRUE ; return.output = TRUE # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_check(data = pdf.disp, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = path.fun, class = "character", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = pdf.name.file, class = "character", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = width.fun, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = height.fun, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = path.fun, class = "character", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = paper, options = c("a4", "letter", "legal", "us", "executive", "a4r", "USr", "special", "A4", "LETTER", "LEGAL", "US"), length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data =no.pdf.overwrite, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = return.output, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_check() +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() +# end argument checking +# main code +if(path.fun == "working.dir"){ +path.fun <- getwd() +}else{ +if(grepl(x = path.fun, pattern = ".+/$")){ +path.fun <- substr(path.fun, 1, nchar(path.fun) - 1) # remove the last / +} +if(dir.exists(path.fun) == FALSE){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": path.fun ARGUMENT DOES NOT CORRESPOND TO EXISTING DIRECTORY\n\n================\n\n") +stop(tempo.cat) +} +} +if(Sys.info()["sysname"] == "Windows"){ # Note that .Platform$OS.type() only says "unix" for macOS and Linux and "Windows" for Windows +open.fail <- NULL +windows() +ini.par <- par(no.readonly = TRUE) # to recover the initial graphical parameters if required (reset). BEWARE: this command alone opens a pdf of GUI window if no window already opened. But here, protected with the code because always a tempo window opened +invisible(dev.off()) # close the new window +}else if(Sys.info()["sysname"] == "Linux"){ +if(pdf.disp == TRUE){ +if(file.exists(paste0(path.fun, "/recover_ini_par.pdf"))){ +tempo.cat <- paste0("\n\n================\n\nPROBLEM IN fun_open(): THIS FUNCTION CANNOT BE USED ON LINUX IF A recover_ini_par.pdf FILE ALREADY EXISTS HERE: ", paste(path.fun, collapse = " "), "\n\n================\n\n") +stop(tempo.cat) +}else{ +pdf(width = width.fun, height = height.fun, file=paste0(path.fun, "/recover_ini_par.pdf"), paper = paper) +ini.par <- par(no.readonly = TRUE) # to recover the initial graphical parameters if required (reset). BEWARE: this command alone opens a pdf of GUI window if no window already opened. But here, protected with the code because always a tempo window opened +invisible(dev.off()) # close the pdf windows +file.remove(paste0(path.fun, "/recover_ini_par.pdf")) # remove the pdf file +} +}else{ +# test if X11 can be opened +if(file.exists(paste0(getwd(), "/Rplots.pdf"))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THIS FUNCTION CANNOT BE USED ON LINUX IF A Rplots.pdf FILE ALREADY EXISTS HERE: ", getwd(), "\n\n================\n\n") +stop(tempo.cat) +}else{ +open.fail <- suppressWarnings(try(X11(), silent = TRUE))[] # try to open a X11 window. If open.fail == NULL, no problem, meaning that the X11 window is opened. If open.fail != NULL, a pdf can be opened here paste0(getwd(), "/Rplots.pdf") +if(is.null(open.fail)){ +ini.par <- par(no.readonly = TRUE) # to recover the initial graphical parameters if required (reset). BEWARE: this command alone opens a pdf of GUI window if no window already opened. But here, protected with the code because always a tempo window opened +invisible(dev.off()) # close the new window +}else if(file.exists(paste0(getwd(), "/Rplots.pdf"))){ +file.remove(paste0(getwd(), "/Rplots.pdf")) # remove the pdf file +tempo.cat <- ("\n\n================\n\nPROBLEM IN fun_open(): THIS FUNCTION CANNOT OPEN GUI ON LINUX OR NON MACOS UNIX SYSTEM (X GRAPHIC INTERFACE HAS TO BE SET).\nTO OVERCOME THIS, PLEASE SET pdf.disp ARGUMENT TO TRUE AND RERUN\n\n================\n\n") +stop(tempo.cat) +} +} +} +}else{ +open.fail <- NULL +quartz() +ini.par <- par(no.readonly = TRUE) # to recover the initial graphical parameters if required (reset). BEWARE: this command alone opens a pdf of GUI window if no window already opened. But here, protected with the code because always a tempo window opened +invisible(dev.off()) # close the new window +} +zone.ini <- matrix(1, ncol=1) # to recover the initial parameters for next figure region when device region split into several figure regions +if(pdf.disp == TRUE){ +pdf.loc <- paste0(path.fun, "/", pdf.name.file, ".pdf") +if(file.exists(pdf.loc) == TRUE & no.pdf.overwrite == TRUE){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": pdf.loc FILE ALREADY EXISTS AND CANNOT BE OVERWRITTEN DUE TO no.pdf.overwrite ARGUMENT SET TO TRUE: ", pdf.loc, "\n\n================\n\n") +stop(tempo.cat) +}else{ +pdf(width = width.fun, height = height.fun, file=pdf.loc, paper = paper) +} +}else if(pdf.disp == FALSE){ +pdf.loc <- NULL +if(Sys.info()["sysname"] == "Windows"){ # .Platform$OS.type() only says "unix" for macOS and Linux and "Windows" for Windows +windows(width = width.fun, height = height.fun, rescale="fixed") +}else if(Sys.info()["sysname"] == "Linux"){ +if( ! is.null(open.fail)){ +stop("\n\n================\n\nPROBLEM IN fun_open(): THIS FUNCTION CANNOT OPEN GUI ON LINUX OR NON MACOS UNIX SYSTEM (X GRAPHIC INTERFACE HAS TO BE SET).\nTO OVERCOME THIS, PLEASE SET pdf.disp ARGUMENT TO TRUE AND RERUN\n\n================\n\n") +}else{ +X11(width = width.fun, height = height.fun) +} +}else{ +quartz(width = width.fun, height = height.fun) +} +} +if(return.output == TRUE){ +output <- list(pdf.loc = pdf.loc, ini.par = ini.par, zone.ini = zone.ini) +return(output) +} } @@ -2753,5792 +2758,5795 @@ fun_open <- function(pdf.disp = TRUE, path.fun = "working.dir", pdf.name.file = # Check OK: clear to go Apollo fun_prior_plot <- function(param.reinitial = FALSE, xlog.scale = FALSE, ylog.scale = FALSE, remove.label = TRUE, remove.x.axis = TRUE, remove.y.axis = TRUE, std.x.range = TRUE, std.y.range = TRUE, down.space = 1, left.space = 1, up.space = 1, right.space = 1, orient = 1, dist.legend = 3.5, tick.length = 0.5, box.type = "n", amplif.label = 1, amplif.axis = 1, display.extend = FALSE, return.par = FALSE){ - # AIM - # very convenient to erase the axes for post plot axis redrawing using fun_post_plot() - # reinitialize and set the graphic parameters before plotting - # CANNOT be used if no graphic device already opened - # REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION - # fun_check() - # ARGUMENTS - # param.reinitial: reinitialize graphic parameters before applying the new ones, as defined by the other arguments? Either TRUE or FALSE - # xlog.scale: Log scale for the x-axis? Either TRUE or FALSE. If TRUE, erases the x-axis, except legend, for further drawing by fun_post_plot()(xlog argument of par()) - # ylog.scale: Log scale for the y-axis? Either TRUE or FALSE. If TRUE, erases the y-axis, except legend, for further drawing by fun_post_plot()(ylog argument of par()) - # remove.label: remove labels (axis legend) of the two axes? Either TRUE or FALSE (ann argument of par()) - # remove.x.axis: remove x-axis except legend? Either TRUE or FALSE (control the xaxt argument of par()). Automately set to TRUE if xlog.scale == TRUE - # remove.y.axis: remove y-axis except legend? Either TRUE or FALSE (control the yaxt argument of par()). Automately set to TRUE if ylog.scale == TRUE - # std.x.range: standard range on the x-axis? TRUE (no range extend) or FALSE (4% range extend). Controls xaxs argument of par() (TRUE is xaxs = "i", FALSE is xaxs = "r") - # std.y.range: standard range on the y-axis? TRUE (no range extend) or FALSE (4% range extend). Controls yaxs argument of par() (TRUE is yaxs = "i", FALSE is yaxs = "r") - # down.space: lower vertical margin (in inches, mai argument of par()) - # left.space: left horizontal margin (in inches, mai argument of par()) - # up.space: upper vertical margin between plot region and grapical window (in inches, mai argument of par()) - # right.space: right horizontal margin (in inches, mai argument of par()) - # orient: scale number orientation (las argument of par()). 0, always parallel to the axis; 1, always horizontal; 2, always perpendicular to the axis; 3, always vertical - # dist.legend: numeric value that moves axis legends away in inches (first number of mgp argument of par() but in inches thus / 0.2) - # tick.length: length of the ticks (1 means complete the distance between the plot region and the axis numbers, 0.5 means half the length, etc. 0 means no tick - # box.type: bty argument of par(). Either "o", "l", "7", "c", "u", "]", the resulting box resembles the corresponding upper case letter. A value of "n" suppresses the box - # amplif.label: increase or decrease the size of the text in legends - # amplif.axis: increase or decrease the size of the scale numbers in axis - # display.extend: extend display beyond plotting region? Either TRUE or FALSE (xpd argument of par() without NA) - # return.par: return graphic parameter modification? - # RETURN - # return graphic parameter modification - # EXAMPLES - # fun_prior_plot(param.reinitial = FALSE, xlog.scale = FALSE, ylog.scale = FALSE, remove.label = TRUE, remove.x.axis = TRUE, remove.y.axis = TRUE, std.x.range = TRUE, std.y.range = TRUE, down.space = 1, left.space = 1, up.space = 1, right.space = 1, orient = 1, dist.legend = 4.5, tick.length = 0.5, box.type = "n", amplif.label = 1, amplif.axis = 1, display.extend = FALSE, return.par = FALSE) - # DEBUGGING - # param.reinitial = FALSE ; xlog.scale = FALSE ; ylog.scale = FALSE ; remove.label = TRUE ; remove.x.axis = TRUE ; remove.y.axis = TRUE ; std.x.range = TRUE ; std.y.range = TRUE ; down.space = 1 ; left.space = 1 ; up.space = 1 ; right.space = 1 ; orient = 1 ; dist.legend = 4.5 ; tick.length = 0.5 ; box.type = "n" ; amplif.label = 1 ; amplif.axis = 1 ; display.extend = FALSE ; return.par = FALSE # for function debugging - # function name - function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") - # end function name - # required function checking - if(length(find("fun_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_check(data = param.reinitial, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = xlog.scale, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = ylog.scale, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = remove.label, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = remove.x.axis, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = remove.y.axis, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = std.x.range, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = std.y.range, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = down.space, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = left.space, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = up.space, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = right.space, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = orient, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = dist.legend, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = tick.length, class = "vector", mode = "numeric", length = 1, prop = TRUE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = box.type, options = c("o", "l", "7", "c", "u", "]", "n"), length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = amplif.label, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = amplif.axis, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = display.extend, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = return.par, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_check() - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() - # end argument checking - # main code - if(is.null(dev.list())){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THIS FUNCTION CANNOT BE USED IF NO GRAPHIC DEVICE ALREADY OPENED (dev.list() IS CURRENTLY NULL)\n\n================\n\n") - stop(tempo.cat) - } - if(param.reinitial == TRUE){ - if( ! all(names(dev.cur()) == "null device")){ - active.wind.nb <- dev.cur() - }else{ - active.wind.nb <- 0 - } - if(Sys.info()["sysname"] == "Windows"){ # Note that .Platform$OS.type() only says "unix" for macOS and Linux and "Windows" for Windows - windows() - ini.par <- par(no.readonly = TRUE) # to recover the initial graphical parameters if required (reset). BEWARE: this command alone opens a pdf of GUI window if no window already opened. But here, protected with the code because always a tempo window opened - invisible(dev.off()) # close the new window - }else if(Sys.info()["sysname"] == "Linux"){ - if(file.exists(paste0(getwd(), "/Rplots.pdf"))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THIS FUNCTION CANNOT BE USED ON LINUX WITH param.reinitial SET TO TRUE IF A Rplots.pdf FILE ALREADY EXISTS HERE: ", getwd(), "\n\n================\n\n") - stop(tempo.cat) - }else{ - open.fail <- suppressWarnings(try(X11(), silent = TRUE))[] # try to open a X11 window. If open.fail == NULL, no problem, meaning that the X11 window is opened. If open.fail != NULL, a pdf can be opened here paste0(getwd(), "/Rplots.pdf") - if(is.null(open.fail)){ - ini.par <- par(no.readonly = TRUE) # to recover the initial graphical parameters if required (reset). BEWARE: this command alone opens a pdf of GUI window if no window already opened. But here, protected with the code because always a tempo window opened - invisible(dev.off()) # close the new window - }else if(file.exists(paste0(getwd(), "/Rplots.pdf"))){ - ini.par <- par(no.readonly = TRUE) # to recover the initial graphical parameters if required (reset). BEWARE: this command alone opens a pdf of GUI window if no window already opened. But here, protected with the code because always a tempo window opened - invisible(dev.off()) # close the new window - file.remove(paste0(getwd(), "/Rplots.pdf")) # remove the pdf file - }else{ - tempo.cat <- ("\n\n================\n\nPROBLEM IN fun_prior_plot(): THIS FUNCTION CANNOT OPEN GUI ON LINUX OR NON MACOS UNIX SYSTEM (X GRAPHIC INTERFACE HAS TO BE SET).\nTO OVERCOME THIS, PLEASE USE PDF GRAPHIC INTERFACES AND RERUN\n\n================\n\n") - stop(tempo.cat) - } - } - }else{ # macOS - quartz() - ini.par <- par(no.readonly = TRUE) # to recover the initial graphical parameters if required (reset). BEWARE: this command alone opens a pdf of GUI window if no window already opened. But here, protected with the code because always a tempo window opened) - invisible(dev.off()) # close the new window - } - if( ! all(names(dev.cur()) == "null device")){ - dev.set(active.wind.nb) # go back to the active windows if exists - par(ini.par) # apply the initial par to current window - } - } - if(remove.x.axis == TRUE){ - par(xaxt = "n") # suppress the y-axis label - }else{ - par(xaxt = "s") - } - if(remove.y.axis == TRUE){ - par(yaxt = "n") # suppress the y-axis label - }else{ - par(yaxt = "s") - } - if(std.x.range == TRUE){ - par(xaxs = "i") - }else{ - par(xaxs = "r") - } - if(std.y.range == TRUE){ - par(yaxs = "i") - }else{ - par(yaxs = "r") - } - par(mai = c(down.space, left.space, up.space, right.space), ann = ! remove.label, las = orient, mgp = c(dist.legend/0.2, 1, 0), xpd = display.extend, bty= box.type, cex.lab = amplif.label, cex.axis = amplif.axis) - par(tcl = -par()$mgp[2] * tick.length) # tcl gives the length of the ticks as proportion of line text, knowing that mgp is in text lines. So the main ticks are a 0.5 of the distance of the axis numbers by default. The sign provides the side of the tick (negative for outside of the plot region) - if(xlog.scale == TRUE){ - par(xaxt = "n", xlog = TRUE) # suppress the x-axis label - }else{ - par(xlog = FALSE) - } - if(ylog.scale == TRUE){ - par(yaxt = "n", ylog = TRUE) # suppress the y-axis label - }else{ - par(ylog = FALSE) - } - if(return.par == TRUE){ - tempo.par <- par() - return(tempo.par) - } +# AIM +# very convenient to erase the axes for post plot axis redrawing using fun_post_plot() +# reinitialize and set the graphic parameters before plotting +# CANNOT be used if no graphic device already opened +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_check() +# ARGUMENTS +# param.reinitial: reinitialize graphic parameters before applying the new ones, as defined by the other arguments? Either TRUE or FALSE +# xlog.scale: Log scale for the x-axis? Either TRUE or FALSE. If TRUE, erases the x-axis, except legend, for further drawing by fun_post_plot()(xlog argument of par()) +# ylog.scale: Log scale for the y-axis? Either TRUE or FALSE. If TRUE, erases the y-axis, except legend, for further drawing by fun_post_plot()(ylog argument of par()) +# remove.label: remove labels (axis legend) of the two axes? Either TRUE or FALSE (ann argument of par()) +# remove.x.axis: remove x-axis except legend? Either TRUE or FALSE (control the xaxt argument of par()). Automately set to TRUE if xlog.scale == TRUE +# remove.y.axis: remove y-axis except legend? Either TRUE or FALSE (control the yaxt argument of par()). Automately set to TRUE if ylog.scale == TRUE +# std.x.range: standard range on the x-axis? TRUE (no range extend) or FALSE (4% range extend). Controls xaxs argument of par() (TRUE is xaxs = "i", FALSE is xaxs = "r") +# std.y.range: standard range on the y-axis? TRUE (no range extend) or FALSE (4% range extend). Controls yaxs argument of par() (TRUE is yaxs = "i", FALSE is yaxs = "r") +# down.space: lower vertical margin (in inches, mai argument of par()) +# left.space: left horizontal margin (in inches, mai argument of par()) +# up.space: upper vertical margin between plot region and grapical window (in inches, mai argument of par()) +# right.space: right horizontal margin (in inches, mai argument of par()) +# orient: scale number orientation (las argument of par()). 0, always parallel to the axis; 1, always horizontal; 2, always perpendicular to the axis; 3, always vertical +# dist.legend: numeric value that moves axis legends away in inches (first number of mgp argument of par() but in inches thus / 0.2) +# tick.length: length of the ticks (1 means complete the distance between the plot region and the axis numbers, 0.5 means half the length, etc. 0 means no tick +# box.type: bty argument of par(). Either "o", "l", "7", "c", "u", "]", the resulting box resembles the corresponding upper case letter. A value of "n" suppresses the box +# amplif.label: increase or decrease the size of the text in legends +# amplif.axis: increase or decrease the size of the scale numbers in axis +# display.extend: extend display beyond plotting region? Either TRUE or FALSE (xpd argument of par() without NA) +# return.par: return graphic parameter modification? +# RETURN +# return graphic parameter modification +# EXAMPLES +# fun_prior_plot(param.reinitial = FALSE, xlog.scale = FALSE, ylog.scale = FALSE, remove.label = TRUE, remove.x.axis = TRUE, remove.y.axis = TRUE, std.x.range = TRUE, std.y.range = TRUE, down.space = 1, left.space = 1, up.space = 1, right.space = 1, orient = 1, dist.legend = 4.5, tick.length = 0.5, box.type = "n", amplif.label = 1, amplif.axis = 1, display.extend = FALSE, return.par = FALSE) +# DEBUGGING +# param.reinitial = FALSE ; xlog.scale = FALSE ; ylog.scale = FALSE ; remove.label = TRUE ; remove.x.axis = TRUE ; remove.y.axis = TRUE ; std.x.range = TRUE ; std.y.range = TRUE ; down.space = 1 ; left.space = 1 ; up.space = 1 ; right.space = 1 ; orient = 1 ; dist.legend = 4.5 ; tick.length = 0.5 ; box.type = "n" ; amplif.label = 1 ; amplif.axis = 1 ; display.extend = FALSE ; return.par = FALSE # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_check(data = param.reinitial, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = xlog.scale, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = ylog.scale, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = remove.label, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = remove.x.axis, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = remove.y.axis, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = std.x.range, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = std.y.range, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = down.space, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = left.space, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = up.space, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = right.space, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = orient, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = dist.legend, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = tick.length, class = "vector", mode = "numeric", length = 1, prop = TRUE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = box.type, options = c("o", "l", "7", "c", "u", "]", "n"), length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = amplif.label, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = amplif.axis, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = display.extend, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = return.par, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_check() +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() +# end argument checking +# main code +if(is.null(dev.list())){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THIS FUNCTION CANNOT BE USED IF NO GRAPHIC DEVICE ALREADY OPENED (dev.list() IS CURRENTLY NULL)\n\n================\n\n") +stop(tempo.cat) +} +if(param.reinitial == TRUE){ +if( ! all(names(dev.cur()) == "null device")){ +active.wind.nb <- dev.cur() +}else{ +active.wind.nb <- 0 +} +if(Sys.info()["sysname"] == "Windows"){ # Note that .Platform$OS.type() only says "unix" for macOS and Linux and "Windows" for Windows +windows() +ini.par <- par(no.readonly = TRUE) # to recover the initial graphical parameters if required (reset). BEWARE: this command alone opens a pdf of GUI window if no window already opened. But here, protected with the code because always a tempo window opened +invisible(dev.off()) # close the new window +}else if(Sys.info()["sysname"] == "Linux"){ +if(file.exists(paste0(getwd(), "/Rplots.pdf"))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THIS FUNCTION CANNOT BE USED ON LINUX WITH param.reinitial SET TO TRUE IF A Rplots.pdf FILE ALREADY EXISTS HERE: ", getwd(), "\n\n================\n\n") +stop(tempo.cat) +}else{ +open.fail <- suppressWarnings(try(X11(), silent = TRUE))[] # try to open a X11 window. If open.fail == NULL, no problem, meaning that the X11 window is opened. If open.fail != NULL, a pdf can be opened here paste0(getwd(), "/Rplots.pdf") +if(is.null(open.fail)){ +ini.par <- par(no.readonly = TRUE) # to recover the initial graphical parameters if required (reset). BEWARE: this command alone opens a pdf of GUI window if no window already opened. But here, protected with the code because always a tempo window opened +invisible(dev.off()) # close the new window +}else if(file.exists(paste0(getwd(), "/Rplots.pdf"))){ +ini.par <- par(no.readonly = TRUE) # to recover the initial graphical parameters if required (reset). BEWARE: this command alone opens a pdf of GUI window if no window already opened. But here, protected with the code because always a tempo window opened +invisible(dev.off()) # close the new window +file.remove(paste0(getwd(), "/Rplots.pdf")) # remove the pdf file +}else{ +tempo.cat <- ("\n\n================\n\nPROBLEM IN fun_prior_plot(): THIS FUNCTION CANNOT OPEN GUI ON LINUX OR NON MACOS UNIX SYSTEM (X GRAPHIC INTERFACE HAS TO BE SET).\nTO OVERCOME THIS, PLEASE USE PDF GRAPHIC INTERFACES AND RERUN\n\n================\n\n") +stop(tempo.cat) +} +} +}else{ # macOS +quartz() +ini.par <- par(no.readonly = TRUE) # to recover the initial graphical parameters if required (reset). BEWARE: this command alone opens a pdf of GUI window if no window already opened. But here, protected with the code because always a tempo window opened) +invisible(dev.off()) # close the new window +} +if( ! all(names(dev.cur()) == "null device")){ +dev.set(active.wind.nb) # go back to the active windows if exists +par(ini.par) # apply the initial par to current window +} +} +if(remove.x.axis == TRUE){ +par(xaxt = "n") # suppress the y-axis label +}else{ +par(xaxt = "s") +} +if(remove.y.axis == TRUE){ +par(yaxt = "n") # suppress the y-axis label +}else{ +par(yaxt = "s") +} +if(std.x.range == TRUE){ +par(xaxs = "i") +}else{ +par(xaxs = "r") +} +if(std.y.range == TRUE){ +par(yaxs = "i") +}else{ +par(yaxs = "r") +} +par(mai = c(down.space, left.space, up.space, right.space), ann = ! remove.label, las = orient, mgp = c(dist.legend/0.2, 1, 0), xpd = display.extend, bty= box.type, cex.lab = amplif.label, cex.axis = amplif.axis) +par(tcl = -par()$mgp[2] * tick.length) # tcl gives the length of the ticks as proportion of line text, knowing that mgp is in text lines. So the main ticks are a 0.5 of the distance of the axis numbers by default. The sign provides the side of the tick (negative for outside of the plot region) +if(xlog.scale == TRUE){ +par(xaxt = "n", xlog = TRUE) # suppress the x-axis label +}else{ +par(xlog = FALSE) +} +if(ylog.scale == TRUE){ +par(yaxt = "n", ylog = TRUE) # suppress the y-axis label +}else{ +par(ylog = FALSE) +} +if(return.par == TRUE){ +tempo.par <- par() +return(tempo.par) +} } ######## fun_scale() #### select nice label numbers when setting number of ticks on an axis - + # Check OK: clear to go Apollo fun_scale <- function(n, lim, kind = "approx", path.lib = NULL){ - # AIM - # attempt to select nice scale numbers when setting n ticks on a lim axis range - # ARGUMENTS - # n: desired number of main ticks on the axis (integer more than 0) - # lim: vector of 2 numbers indicating the limit range of the axis. Order of the 2 values matters (for inverted axis). Can be log transformed values - # kind: either "approx" (approximative), "strict" (strict) or "strict.cl" (strict clean). If "approx", use the scales::trans_breaks() function to provide an easy to read scale of approximately n ticks spanning the range of the lim argument. If "strict", cut the range of the lim argument into n + 1 equidistant part and return the n numbers at each boundary. This often generates numbers uneasy to read. If "strict.cl", provide an easy to read scale of exactly n ticks, but sometimes not completely spanning the range of the lim argument - # path.lib: absolute path of the required packages, if not in the default folders - # REQUIRED PACKAGES - # if kind = "approx": - # ggplot2 - # scales - # REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION - # fun_check() - # fun_round() - # RETURN - # a vector of numbers - # EXAMPLES - # approximate number of main ticks - # ymin = 2 ; ymax = 3.101 ; n = 5 ; scale <- fun_scale(n = n, lim = c(ymin, ymax), kind = "approx") ; scale ; par(yaxt = "n", yaxs = "i", las = 1) ; plot(ymin:ymax, ymin:ymax, xlim = range(scale, ymin, ymax)[order(c(ymin, ymax))], ylim = range(scale, ymin, ymax)[order(c(ymin, ymax))], xlab = "DEFAULT SCALE", ylab = "NEW SCALE") ; par(yaxt = "s") ; axis(side = 2, at = scale) - # strict number of main ticks - # ymin = 2 ; ymax = 3.101 ; n = 5 ; scale <- fun_scale(n = n, lim = c(ymin, ymax), kind = "strict") ; scale ; par(yaxt = "n", yaxs = "i", las = 1) ; plot(ymin:ymax, ymin:ymax, xlim = range(scale, ymin, ymax)[order(c(ymin, ymax))], ylim = range(scale, ymin, ymax)[order(c(ymin, ymax))], xlab = "DEFAULT SCALE", ylab = "NEW SCALE") ; par(yaxt = "s") ; axis(side = 2, at = scale) - # strict "clean" number of main ticks - # ymin = 2 ; ymax = 3.101 ; n = 5 ; scale <- fun_scale(n = n, lim = c(ymin, ymax), kind = "strict.cl") ; scale ; par(yaxt = "n", yaxs = "i", las = 1) ; plot(ymin:ymax, ymin:ymax, xlim = range(scale, ymin, ymax)[order(c(ymin, ymax))], ylim = range(scale, ymin, ymax)[order(c(ymin, ymax))], xlab = "DEFAULT SCALE", ylab = "NEW SCALE") ; par(yaxt = "s") ; axis(side = 2, at = scale) - # approximate number of main ticks, scale inversion - # ymin = 3.101 ; ymax = 2 ; n = 5 ; scale <- fun_scale(n = n, lim = c(ymin, ymax), kind = "approx") ; scale ; par(yaxt = "n", yaxs = "i", las = 1) ; plot(ymin:ymax, ymin:ymax, xlim = range(scale, ymin, ymax)[order(c(ymin, ymax))], ylim = range(scale, ymin, ymax)[order(c(ymin, ymax))], xlab = "DEFAULT SCALE", ylab = "NEW SCALE") ; par(yaxt = "s") ; axis(side = 2, at = scale) - # DEBUGGING - # n = 9 ; lim = c(2, 3.101) ; kind = "approx" ; path.lib = NULL # for function debugging - # n = 10 ; lim = c(1e-4, 1e6) ; kind = "approx" ; path.lib = NULL # for function debugging - # function name - function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") - # end function name - # end initial argument checking - # required function checking - if(length(find("fun_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_check(data = n, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, neg.values = FALSE, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & n == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": n ARGUMENT MUST BE A NON NULL AND POSITIVE INTEGER\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) # - } - tempo <- fun_check(data = lim, class = "vector", mode = "numeric", length = 2, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & diff(lim) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": lim ARGUMENT HAS A NULL RANGE (2 IDENTICAL VALUES)\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - }else if(tempo$problem == FALSE & any(lim %in% c(Inf, -Inf))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": lim ARGUMENT CANNOT CONTAIN -Inf OR Inf VALUES\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - tempo <- fun_check(data = kind, options = c("approx", "strict", "strict.cl"), length = 1, fun.name = function.name) ; eval(ee) - if( ! is.null(path.lib)){ - tempo <- fun_check(data = path.lib, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & ! all(dir.exists(path.lib))){ - cat(paste0("\n\n============\n\nERROR IN ", function.name, ": \nDIRECTORY PATH INDICATED IN THE path.lib PARAMETER DOES NOT EXISTS: ", path.lib, "\n\n============\n\n")) - arg.check <- c(arg.check, TRUE) - } - } - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_check() - } - # end argument checking with fun_check() - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() - # end argument checking - # main code - lim.order <- order(lim) # to deal with inverted axis - lim <- sort(lim) - if(kind == "approx"){ - # package checking - fun_pack(req.package = c("ggplot2"), path.lib = path.lib) - fun_pack(req.package = c("scales"), path.lib = path.lib) - # end package checking - output <- ggplot2::ggplot_build(ggplot2::ggplot() + ggplot2::scale_y_continuous( - breaks = scales::trans_breaks( - trans = "identity", - inv = "identity", - n = n - ), - limits = lim - ))$layout$panel_params[[1]]$y.major_source # pretty() alone is not appropriate: tempo.pret <- pretty(seq(lim[1] ,lim[2], length.out = n)) ; tempo.pret[tempo.pret > = lim[1] & tempo.pret < = lim[2]] - }else if(kind == "strict"){ - output <- fun_round(seq(lim[1] ,lim[2], length.out = n), 2) - }else if(kind == "strict.cl"){ - tempo.range <- diff(sort(lim)) - tempo.max <- max(lim) - tempo.min <- min(lim) - mid <- tempo.min + (tempo.range/2) # middle of axis - tempo.inter <- tempo.range / (n + 1) # current interval between two ticks, between 0 and Inf - if(tempo.inter == 0){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": THE INTERVAL BETWEEN TWO TICKS OF THE SCALE IS NULL. MODIFY THE lim OR n ARGUMENT\n\n============\n\n")) - stop(tempo.cat) - } - log10.abs.lim <- 200 - log10.range <- (-log10.abs.lim):log10.abs.lim - log10.vec <- 10^log10.range - round.vec <- c(5, 4, 3, 2.5, 2, 1.25, 1) - dec.table <- outer(log10.vec, round.vec) # table containing the scale units (row: power of ten from -201 to +199, column: the 5, 2.5, 2, 1.25, 1 notches - - - - # recover the number of leading zeros in tempo.inter - ini.scipen <- options()$scipen - options(scipen = -1000) # force scientific format - if(any(grepl(pattern = "\\+", x = tempo.inter))){ # tempo.inter > 1 - power10.exp <- as.integer(substring(text = tempo.inter, first = (regexpr(pattern = "\\+", text = tempo.inter) + 1))) # recover the power of 10. Example recover 08 from 1e+08 - mantisse <- as.numeric(substr(x = tempo.inter, start = 1, stop = (regexpr(pattern = "\\+", text = tempo.inter) - 2))) # recover the mantisse. Example recover 1.22 from 1.22e+08 - }else if(any(grepl(pattern = "\\-", x = tempo.inter))){ # tempo.inter < 1 - power10.exp <- as.integer(substring(text = tempo.inter, first = (regexpr(pattern = "\\-", text = tempo.inter)))) # recover the power of 10. Example recover 08 from 1e+08 - mantisse <- as.numeric(substr(x = tempo.inter, start = 1, stop = (regexpr(pattern = "\\-", text = tempo.inter) - 2))) # recover the mantisse. Example recover 1.22 from 1.22e+08 - }else{ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 1\n\n============\n\n")) - stop(tempo.cat) - } - tempo.scale <- dec.table[log10.range == power10.exp, ] - # new interval - inter.select <- NULL - for(i1 in 1:length(tempo.scale)){ - tempo.first.tick <- trunc((tempo.min + tempo.scale[i1]) / tempo.scale[i1]) * (tempo.scale[i1]) # this would be use to have a number not multiple of tempo.scale[i1]: ceiling(tempo.min) + tempo.scale[i1] * 10^power10.exp - tempo.last.tick <- tempo.first.tick + tempo.scale[i1] * (n - 1) - if((tempo.first.tick >= tempo.min) & (tempo.last.tick <= tempo.max)){ - inter.select <- tempo.scale[i1] - break() - } - } - if(is.null(inter.select)){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 2\n\n============\n\n")) - stop(tempo.cat) - } - options(scipen = ini.scipen) # restore the initial scientific penalty - # end new interval - # centering the new scale - tempo.mid <- trunc((mid + (-1:1) * inter.select) / inter.select) * inter.select # tempo middle tick closest to the middle axis - mid.tick <- tempo.mid[which.min(abs(tempo.mid - mid))] - if(n == 1){ - output <- mid.tick - }else if(n == 2){ - tempo.min.dist <- mid.tick - inter.select - tempo.min - tempo.max.dist <- tempo.max - mid.tick + inter.select - if(tempo.min.dist <= tempo.max.dist){ # distance between lowest tick and bottom axis <= distance between highest tick and top axis. If yes, extra tick but at the top, otherwise at the bottom - output <- c(mid.tick, mid.tick + inter.select) - }else{ - output <- c(mid.tick - inter.select, mid.tick) - } - }else if((n / 2 - trunc(n / 2)) > 0.1){ # > 0.1 to avoid floating point. Because result can only be 0 or 0.5. Thus, > 0.1 means odd number - output <- c(mid.tick - (trunc(n / 2):1) * inter.select, mid.tick, mid.tick + (1:trunc(n / 2)) * inter.select) - }else if((n / 2 - trunc(n / 2)) < 0.1){ # < 0.1 to avoid floating point. Because result can only be 0 or 0.5. Thus, < 0.1 means even number - tempo.min.dist <- mid.tick - trunc(n / 2) * inter.select - tempo.min - tempo.max.dist <- tempo.max - mid.tick + trunc(n / 2) * inter.select - if(tempo.min.dist <= tempo.max.dist){ # distance between lowest tick and bottom axis <= distance between highest tick and top axis. If yes, extra tick but at the bottom, otherwise at the top - output <- c(mid.tick - ((trunc(n / 2) - 1):1) * inter.select, mid.tick, mid.tick + (1:trunc(n / 2)) * inter.select) - }else{ - output <- c(mid.tick - (trunc(n / 2):1) * inter.select, mid.tick, mid.tick + (1:(trunc(n / 2) - 1)) * inter.select) - } - }else{ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 3\n\n============\n\n")) - stop(tempo.cat) - } - # end centering the new scale - # last check - if(min(output) < tempo.min){ - output <- c(output[-1], max(output) + inter.select) # remove the lowest tick and add a tick at the top - }else if( max(output) > tempo.max){ - output <- c(min(output) - inter.select, output[-length(output)]) - } - if(min(output) < tempo.min | max(output) > tempo.max){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 4\n\n============\n\n")) - stop(tempo.cat) - } - if(any(is.na(output))){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 5 (NA GENERATION)\n\n============\n\n")) - stop(tempo.cat) - } - # end last check - }else{ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 6\n\n============\n\n")) - stop(tempo.cat) - } - if(diff(lim.order) < 0){ - output <- rev(output) - } - return(output) +# AIM +# attempt to select nice scale numbers when setting n ticks on a lim axis range +# ARGUMENTS +# n: desired number of main ticks on the axis (integer more than 0) +# lim: vector of 2 numbers indicating the limit range of the axis. Order of the 2 values matters (for inverted axis). Can be log transformed values +# kind: either "approx" (approximative), "strict" (strict) or "strict.cl" (strict clean). If "approx", use the scales::trans_breaks() function to provide an easy to read scale of approximately n ticks spanning the range of the lim argument. If "strict", cut the range of the lim argument into n + 1 equidistant part and return the n numbers at each boundary. This often generates numbers uneasy to read. If "strict.cl", provide an easy to read scale of exactly n ticks, but sometimes not completely spanning the range of the lim argument +# path.lib: absolute path of the required packages, if not in the default folders +# REQUIRED PACKAGES +# if kind = "approx": +# ggplot2 +# scales +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_check() +# fun_round() +# RETURN +# a vector of numbers +# EXAMPLES +# approximate number of main ticks +# ymin = 2 ; ymax = 3.101 ; n = 5 ; scale <- fun_scale(n = n, lim = c(ymin, ymax), kind = "approx") ; scale ; par(yaxt = "n", yaxs = "i", las = 1) ; plot(ymin:ymax, ymin:ymax, xlim = range(scale, ymin, ymax)[order(c(ymin, ymax))], ylim = range(scale, ymin, ymax)[order(c(ymin, ymax))], xlab = "DEFAULT SCALE", ylab = "NEW SCALE") ; par(yaxt = "s") ; axis(side = 2, at = scale) +# strict number of main ticks +# ymin = 2 ; ymax = 3.101 ; n = 5 ; scale <- fun_scale(n = n, lim = c(ymin, ymax), kind = "strict") ; scale ; par(yaxt = "n", yaxs = "i", las = 1) ; plot(ymin:ymax, ymin:ymax, xlim = range(scale, ymin, ymax)[order(c(ymin, ymax))], ylim = range(scale, ymin, ymax)[order(c(ymin, ymax))], xlab = "DEFAULT SCALE", ylab = "NEW SCALE") ; par(yaxt = "s") ; axis(side = 2, at = scale) +# strict "clean" number of main ticks +# ymin = 2 ; ymax = 3.101 ; n = 5 ; scale <- fun_scale(n = n, lim = c(ymin, ymax), kind = "strict.cl") ; scale ; par(yaxt = "n", yaxs = "i", las = 1) ; plot(ymin:ymax, ymin:ymax, xlim = range(scale, ymin, ymax)[order(c(ymin, ymax))], ylim = range(scale, ymin, ymax)[order(c(ymin, ymax))], xlab = "DEFAULT SCALE", ylab = "NEW SCALE") ; par(yaxt = "s") ; axis(side = 2, at = scale) +# approximate number of main ticks, scale inversion +# ymin = 3.101 ; ymax = 2 ; n = 5 ; scale <- fun_scale(n = n, lim = c(ymin, ymax), kind = "approx") ; scale ; par(yaxt = "n", yaxs = "i", las = 1) ; plot(ymin:ymax, ymin:ymax, xlim = range(scale, ymin, ymax)[order(c(ymin, ymax))], ylim = range(scale, ymin, ymax)[order(c(ymin, ymax))], xlab = "DEFAULT SCALE", ylab = "NEW SCALE") ; par(yaxt = "s") ; axis(side = 2, at = scale) +# DEBUGGING +# n = 9 ; lim = c(2, 3.101) ; kind = "approx" ; path.lib = NULL # for function debugging +# n = 10 ; lim = c(1e-4, 1e6) ; kind = "approx" ; path.lib = NULL # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# end initial argument checking +# required function checking +if(length(find("fun_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_check(data = n, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, neg.values = FALSE, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & n == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": n ARGUMENT MUST BE A NON NULL AND POSITIVE INTEGER\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) # +} +tempo <- fun_check(data = lim, class = "vector", mode = "numeric", length = 2, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & diff(lim) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": lim ARGUMENT HAS A NULL RANGE (2 IDENTICAL VALUES)\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +}else if(tempo$problem == FALSE & any(lim %in% c(Inf, -Inf))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": lim ARGUMENT CANNOT CONTAIN -Inf OR Inf VALUES\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +tempo <- fun_check(data = kind, options = c("approx", "strict", "strict.cl"), length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(path.lib)){ +tempo <- fun_check(data = path.lib, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! all(dir.exists(path.lib))){ +cat(paste0("\n\n============\n\nERROR IN ", function.name, ": \nDIRECTORY PATH INDICATED IN THE path.lib PARAMETER DOES NOT EXISTS: ", path.lib, "\n\n============\n\n")) +arg.check <- c(arg.check, TRUE) +} +} +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_check() +} +# end argument checking with fun_check() +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() +# end argument checking +# main code +lim.order <- order(lim) # to deal with inverted axis +lim <- sort(lim) +if(kind == "approx"){ +# package checking +fun_pack(req.package = c("ggplot2"), path.lib = path.lib) +fun_pack(req.package = c("scales"), path.lib = path.lib) +# end package checking +output <- ggplot2::ggplot_build(ggplot2::ggplot() + ggplot2::scale_y_continuous( +breaks = scales::trans_breaks( +trans = "identity", +inv = "identity", +n = n +), +limits = lim +))$layout$panel_params[[1]]$y.major_source # pretty() alone is not appropriate: tempo.pret <- pretty(seq(lim[1] ,lim[2], length.out = n)) ; tempo.pret[tempo.pret > = lim[1] & tempo.pret < = lim[2]] +}else if(kind == "strict"){ +output <- fun_round(seq(lim[1] ,lim[2], length.out = n), 2) +}else if(kind == "strict.cl"){ +tempo.range <- diff(sort(lim)) +tempo.max <- max(lim) +tempo.min <- min(lim) +mid <- tempo.min + (tempo.range/2) # middle of axis +tempo.inter <- tempo.range / (n + 1) # current interval between two ticks, between 0 and Inf +if(tempo.inter == 0){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": THE INTERVAL BETWEEN TWO TICKS OF THE SCALE IS NULL. MODIFY THE lim OR n ARGUMENT\n\n============\n\n")) +stop(tempo.cat) +} +log10.abs.lim <- 200 +log10.range <- (-log10.abs.lim):log10.abs.lim +log10.vec <- 10^log10.range +round.vec <- c(5, 4, 3, 2.5, 2, 1.25, 1) +dec.table <- outer(log10.vec, round.vec) # table containing the scale units (row: power of ten from -201 to +199, column: the 5, 2.5, 2, 1.25, 1 notches + + + +# recover the number of leading zeros in tempo.inter +ini.scipen <- options()$scipen +options(scipen = -1000) # force scientific format +if(any(grepl(pattern = "\\+", x = tempo.inter))){ # tempo.inter > 1 +power10.exp <- as.integer(substring(text = tempo.inter, first = (regexpr(pattern = "\\+", text = tempo.inter) + 1))) # recover the power of 10. Example recover 08 from 1e+08 +mantisse <- as.numeric(substr(x = tempo.inter, start = 1, stop = (regexpr(pattern = "\\+", text = tempo.inter) - 2))) # recover the mantisse. Example recover 1.22 from 1.22e+08 +}else if(any(grepl(pattern = "\\-", x = tempo.inter))){ # tempo.inter < 1 +power10.exp <- as.integer(substring(text = tempo.inter, first = (regexpr(pattern = "\\-", text = tempo.inter)))) # recover the power of 10. Example recover 08 from 1e+08 +mantisse <- as.numeric(substr(x = tempo.inter, start = 1, stop = (regexpr(pattern = "\\-", text = tempo.inter) - 2))) # recover the mantisse. Example recover 1.22 from 1.22e+08 +}else{ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 1\n\n============\n\n")) +stop(tempo.cat) +} +tempo.scale <- dec.table[log10.range == power10.exp, ] +# new interval +inter.select <- NULL +for(i1 in 1:length(tempo.scale)){ +tempo.first.tick <- trunc((tempo.min + tempo.scale[i1]) / tempo.scale[i1]) * (tempo.scale[i1]) # this would be use to have a number not multiple of tempo.scale[i1]: ceiling(tempo.min) + tempo.scale[i1] * 10^power10.exp +tempo.last.tick <- tempo.first.tick + tempo.scale[i1] * (n - 1) +if((tempo.first.tick >= tempo.min) & (tempo.last.tick <= tempo.max)){ +inter.select <- tempo.scale[i1] +break() +} +} +if(is.null(inter.select)){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 2\n\n============\n\n")) +stop(tempo.cat) +} +options(scipen = ini.scipen) # restore the initial scientific penalty +# end new interval +# centering the new scale +tempo.mid <- trunc((mid + (-1:1) * inter.select) / inter.select) * inter.select # tempo middle tick closest to the middle axis +mid.tick <- tempo.mid[which.min(abs(tempo.mid - mid))] +if(n == 1){ +output <- mid.tick +}else if(n == 2){ +tempo.min.dist <- mid.tick - inter.select - tempo.min +tempo.max.dist <- tempo.max - mid.tick + inter.select +if(tempo.min.dist <= tempo.max.dist){ # distance between lowest tick and bottom axis <= distance between highest tick and top axis. If yes, extra tick but at the top, otherwise at the bottom +output <- c(mid.tick, mid.tick + inter.select) +}else{ +output <- c(mid.tick - inter.select, mid.tick) +} +}else if((n / 2 - trunc(n / 2)) > 0.1){ # > 0.1 to avoid floating point. Because result can only be 0 or 0.5. Thus, > 0.1 means odd number +output <- c(mid.tick - (trunc(n / 2):1) * inter.select, mid.tick, mid.tick + (1:trunc(n / 2)) * inter.select) +}else if((n / 2 - trunc(n / 2)) < 0.1){ # < 0.1 to avoid floating point. Because result can only be 0 or 0.5. Thus, < 0.1 means even number +tempo.min.dist <- mid.tick - trunc(n / 2) * inter.select - tempo.min +tempo.max.dist <- tempo.max - mid.tick + trunc(n / 2) * inter.select +if(tempo.min.dist <= tempo.max.dist){ # distance between lowest tick and bottom axis <= distance between highest tick and top axis. If yes, extra tick but at the bottom, otherwise at the top +output <- c(mid.tick - ((trunc(n / 2) - 1):1) * inter.select, mid.tick, mid.tick + (1:trunc(n / 2)) * inter.select) +}else{ +output <- c(mid.tick - (trunc(n / 2):1) * inter.select, mid.tick, mid.tick + (1:(trunc(n / 2) - 1)) * inter.select) +} +}else{ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 3\n\n============\n\n")) +stop(tempo.cat) +} +# end centering the new scale +# last check +if(min(output) < tempo.min){ +output <- c(output[-1], max(output) + inter.select) # remove the lowest tick and add a tick at the top +}else if( max(output) > tempo.max){ +output <- c(min(output) - inter.select, output[-length(output)]) +} +if(min(output) < tempo.min | max(output) > tempo.max){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 4\n\n============\n\n")) +stop(tempo.cat) +} +if(any(is.na(output))){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 5 (NA GENERATION)\n\n============\n\n")) +stop(tempo.cat) +} +# end last check +}else{ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 6\n\n============\n\n")) +stop(tempo.cat) +} +if(diff(lim.order) < 0){ +output <- rev(output) +} +return(output) } ######## fun_post_plot() #### set graph param after plotting (axes redesign for instance) - + # Check OK: clear to go Apollo fun_post_plot <- function(x.side = 0, x.log.scale = FALSE, x.categ = NULL, x.categ.pos = NULL, x.lab = "", x.axis.magnific = 1.5, x.label.magnific = 1.5, x.dist.legend = 0.5, x.nb.inter.tick = 1, y.side = 0, y.log.scale = FALSE, y.categ = NULL, y.categ.pos = NULL, y.lab = "", y.axis.magnific = 1.5, y.label.magnific = 1.5, y.dist.legend = 0.5, y.nb.inter.tick = 1, text.angle = 90, tick.length = 0.5, sec.tick.length = 0.3, bg.color = NULL, grid.lwd = NULL, grid.col = "white", corner.text = "", magnific.corner.text = 1, just.label.add = FALSE, par.reset = FALSE, custom.par = NULL){ - # AIM - # redesign axis. If x.side = 0, y.side = 0, the function just adds text at topright of the graph and reset par() for next graphics and provides outputs (see below) - # provide also positions for legend or additional text on the graph - # use fun_prior_plot() before this function for initial inactivation of the axis drawings - # REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION - # fun_check() - # fun_open() to reinitialize graph parameters if par.reset = TRUE and custom.par = NULL - # ARGUMENTS - # x.side: axis at the bottom (1) or top (3) of the region figure. Write 0 for no change - # x.log.scale: Log scale for the x-axis? Either TRUE or FALSE - # x.categ: character vector representing the classes (levels()) to specify when the x-axis is qualititative(stripchart, boxplot) - # x.categ.pos: position of the classes names (numeric vector of identical length than x.categ). If left NULL, this will be 1:length(levels()) - # x.lab: label of the x-axis. If x.side == 0 and x.lab != "", then x.lab is printed - # x.axis.magnific: increase or decrease the value to increase or decrease the size of the x axis numbers. Also control the size of displayed categories - # x.label.magnific: increase or decrease the value to increase or decrease the size of the x axis legend - # x.dist.legend: increase the number to move x-axis legends away in inches (first number of mgp argument of par() but in inches) - # x.nb.inter.tick: number of secondary ticks between main ticks on x-axis (only if not log scale). 0 means no secondary ticks - # y.side: axis at the left (2) or right (4) of the region figure. Write 0 for no change - # y.log.scale: Log scale for the y-axis? Either TRUE or FALSE - # y.categ: classes (levels()) to specify when the y-axis is qualititative(stripchart, boxplot) - # y.categ.pos: position of the classes names (numeric vector of identical length than y.categ). If left NULL, this will be 1:length(levels()) - # y.lab: label of the y-axis. If y.side == 0 and y.lab != "", then y.lab is printed - # y.axis.magnific: increase or decrease the value to increase or decrease the size of the y axis numbers. Also control the size of displayed categories - # y.label.magnific: increase or decrease the value to increase or decrease the size of the y axis legend - # y.dist.legend: increase the number to move y-axis legends away in inches (first number of mgp argument of par() but in inches) - # y.nb.inter.tick: number of secondary ticks between main ticks on y-axis (only if not log scale). 0 means non secondary ticks - # text.angle: angle of the text when axis is qualitative - # tick.length: length of the main ticks (1 means complete the distance between the plot region and the axis numbers, 0.5 means half the length, etc., 0 for no ticks) - # sec.tick.length: length of the secondary ticks (1 means complete the distance between the plot region and the axis numbers, 0.5 means half the length, etc., 0 for no ticks) - # bg.color: background color of the plot region. NULL for no color. BEWARE: cover/hide an existing plot ! - # grid.lwd: if non NULL, activate the grid line (specify the line width) - # grid.col: grid line color (only if grid.lwd non NULL) - # corner.text: text to add at the top right corner of the window - # magnific.corner.text: increase or decrease the size of the text - # par.reset: to reset all the graphics parameters. BEWARE: TRUE can generate display problems, mainly in graphic devices with multiple figure regions - # just.label.add: just add axis labels (legend)? Either TRUE or FALSE. If TRUE, at least (x.side == 0 & x.lab != "") or (y.side == 0 & y.lab != "") must be set to display the corresponding x.lab or y.lab - # custom.par: list that provides the parameters that reset all the graphics parameters. BEWARE: if NULL and par.reset == TRUE, the default par() parameters are used - # RETURN - # a list containing: - # $x.mid.left.dev.region: middle of the left margin of the device region, in coordinates of the x-axis - # $x.left.dev.region: left side of the left margin (including the potential margin of the device region), in coordinates of the x-axis - # $x.mid.right.dev.region: middle of the right margin of the device region, in coordinates of the x-axis - # $x.right.dev.region: right side of the right margin (including the potential margin of the device region), in coordinates of the x-axis - # $x.mid.left.fig.region: middle of the left margin of the figure region, in coordinates of the x-axis - # $x.left.fig.region: left side of the left margin, in coordinates of the x-axis - # $x.mid.right.fig.region: middle of the right margin of the figure region, in coordinates of the x-axis - # $x.right.fig.region: right side of the right margin, in coordinates of the x-axis - # $x.left.plot.region: left side of the plot region, in coordinates of the x-axis - # $x.right.plot.region: right side of the plot region, in coordinates of the x-axis - # $x.mid.plot.region: middle of the plot region, in coordinates of the x-axis - # $y.mid.bottom.dev.region: middle of the bottom margin of the device region, in coordinates of the y-axis - # $y.bottom.dev.region: bottom side of the bottom margin (including the potential margin of the device region), in coordinates of the y-axis - # $y.mid.top.dev.region: middle of the top margin of the device region, in coordinates of the y-axis - # $y.top.dev.region: top side of the top margin (including the potential margin of the device region), in coordinates of the y-axis - # $y.mid.bottom.fig.region: middle of the bottom margin of the figure region, in coordinates of the y-axis - # $y.bottom.fig.region: bottom of the bottom margin of the figure region, in coordinates of the y-axis - # $y.mid.top.fig.region: middle of the top margin of the figure region, in coordinates of the y-axis - # $y.top.fig.region: top of the top margin of the figure region, in coordinates of the y-axis - # $y.top.plot.region: top of the plot region, in coordinates of the y-axis - # $y.bottom.plot.region: bottom of the plot region, in coordinates of the y-axis - # $y.mid.plot.region: middle of the plot region, in coordinates of the y-axis - # $text: warning text - # EXAMPLES - # Example of log axis with log y-axis and unmodified x-axis: - # prior.par <- fun_prior_plot(param.reinitial = TRUE, xlog.scale = FALSE, ylog.scale = TRUE, remove.label = TRUE, remove.x.axis = FALSE, remove.y.axis = TRUE, down.space = 1, left.space = 1, up.space = 1, right.space = 1, orient = 1, dist.legend = 0.5, tick.length = 0.5, box.type = "n", amplif.label = 1, amplif.axis = 1, display.extend = FALSE, return.par = TRUE) ; plot(1:100, log = "y") ; fun_post_plot(y.side = 2, y.log.scale = prior.par$ylog, x.lab = "Values", y.lab = "TEST", y.axis.magnific = 1.25, y.label.magnific = 1.5, y.dist.legend = 0.7, just.label.add = ! prior.par$ann) - # Example of log axis with redrawn x-axis and y-axis: - # prior.par <- fun_prior_plot(param.reinitial = TRUE) ; plot(1:100) ; fun_post_plot(x.side = 1, x.lab = "Values", y.side = 2, y.lab = "TEST", y.axis.magnific = 1, y.label.magnific = 2, y.dist.legend = 0.6) - # example with margins in the device region: - # windows(5,5) ; fun_prior_plot(box.type = "o") ; par(mai=c(0.5,0.5,0.5,0.5), omi = c(0.25,0.25,1,0.25), xaxs = "i", yaxs = "i") ; plot(0:10) ; a <- fun_post_plot(x.side = 0, y.side = 0) ; x <- c(a$x.mid.left.dev.region, a$x.left.dev.region, a$x.mid.right.dev.region, a$x.right.dev.region, a$x.mid.left.fig.region, a$x.left.fig.region, a$x.mid.right.fig.region, a$x.right.fig.region, a$x.right.plot.region, a$x.left.plot.region, a$x.mid.plot.region) ; y <- c(a$y.mid.bottom.dev.region, a$y.bottom.dev.region, a$y.mid.top.dev.region, a$y.top.dev.region, a$y.mid.bottom.fig.region, a$y.bottom.fig.region, a$y.mid.top.fig.region, a$y.top.fig.region, a$y.top.plot.region, a$y.bottom.plot.region, a$y.mid.plot.region) ; par(xpd = NA) ; points(x = rep(5, length(y)), y = y, pch = 16, col = "red") ; text(x = rep(5, length(y)), y = y, c("y.mid.bottom.dev.region", "y.bottom.dev.region", "y.mid.top.dev.region", "y.top.dev.region", "y.mid.bottom.fig.region", "y.bottom.fig.region", "y.mid.top.fig.region", "y.top.fig.region", "y.top.plot.region", "y.bottom.plot.region", "y.mid.plot.region"), cex = 0.65, col = grey(0.25)) ; points(y = rep(5, length(x)), x = x, pch = 16, col = "blue") ; text(y = rep(5, length(x)), x = x, c("x.mid.left.dev.region", "x.left.dev.region", "x.mid.right.dev.region", "x.right.dev.region", "x.mid.left.fig.region", "x.left.fig.region", "x.mid.right.fig.region", "x.right.fig.region", "x.right.plot.region", "x.left.plot.region", "x.mid.plot.region"), cex = 0.65, srt = 90, col = grey(0.25)) - # DEBUGGING - # x.side = 0 ; x.log.scale = FALSE ; x.categ = NULL ; x.categ.pos = NULL ; x.lab = "" ; x.axis.magnific = 1.5 ; x.label.magnific = 1.5 ; x.dist.legend = 1 ; x.nb.inter.tick = 1 ; y.side = 0 ; y.log.scale = FALSE ; y.categ = NULL ; y.categ.pos = NULL ; y.lab = "" ; y.axis.magnific = 1.5 ; y.label.magnific = 1.5 ; y.dist.legend = 0.7 ; y.nb.inter.tick = 1 ; text.angle = 90 ; tick.length = 0.5 ; sec.tick.length = 0.3 ; bg.color = NULL ; grid.lwd = NULL ; grid.col = "white" ; corner.text = "" ; magnific.corner.text = 1 ; just.label.add = FALSE ; par.reset = FALSE ; custom.par = NULL # for function debugging - # function name - function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") - # end function name - # required function checking - if(length(find("fun_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - if(length(find("fun_open", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_open() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_check(data = x.side, options = c(0, 1, 3), length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = x.log.scale, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - if( ! is.null(x.categ)){ - tempo <- fun_check(data = x.categ, class = "character", na.contain = TRUE, fun.name = function.name) ; eval(ee) - } - if( ! is.null(x.categ.pos)){ - tempo <- fun_check(data = x.categ.pos, class = "vector", mode = "numeric", fun.name = function.name) ; eval(ee) - } - tempo <- fun_check(data = x.lab, class = "character", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = x.axis.magnific, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = x.label.magnific, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = x.dist.legend, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = x.nb.inter.tick, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = y.side, options = c(0, 2, 4), length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = y.log.scale, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - if( ! is.null(y.categ)){ - tempo <- fun_check(data = y.categ, class = "character", na.contain = TRUE, fun.name = function.name) ; eval(ee) - } - if( ! is.null(y.categ.pos)){ - tempo <- fun_check(data = y.categ.pos, class = "vector", mode = "numeric", fun.name = function.name) ; eval(ee) - } - tempo <- fun_check(data = y.lab, class = "character", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = y.axis.magnific, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = y.label.magnific, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = y.dist.legend, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = y.nb.inter.tick, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = text.angle, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = tick.length, class = "vector", mode = "numeric", length = 1, prop = TRUE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = sec.tick.length, class = "vector", mode = "numeric", length = 1, prop = TRUE, fun.name = function.name) ; eval(ee) - if( ! is.null(bg.color)){ - tempo <- fun_check(data = bg.color, class = "character", length = 1, fun.name = function.name) ; eval(ee) - if( ! (bg.color %in% colors() | grepl(pattern = "^#", bg.color))){ # check color - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": bg.color ARGUMENT MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # OR A COLOR NAME GIVEN BY colors()\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - } - if( ! is.null(grid.lwd)){ - tempo <- fun_check(data = grid.lwd, class = "vector", mode = "numeric", neg.values = FALSE, fun.name = function.name) ; eval(ee) - } - if( ! is.null(grid.col)){ - tempo <- fun_check(data = grid.col, class = "character", length = 1, fun.name = function.name) ; eval(ee) - if( ! (grid.col %in% colors() | grepl(pattern = "^#", grid.col))){ # check color - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": grid.col ARGUMENT MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # OR A COLOR NAME GIVEN BY colors()\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - } - tempo <- fun_check(data = corner.text, class = "character", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = magnific.corner.text, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = just.label.add, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = par.reset, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - if( ! is.null(custom.par)){ - tempo <- fun_check(data = custom.par, typeof = "list", length = 1, fun.name = function.name) ; eval(ee) - } - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_check() - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() - # end argument checking - # main code - text <- NULL - par(tcl = -par()$mgp[2] * tick.length) - if(x.log.scale == TRUE){ - grid.coord.x <- c(10^par("usr")[1], 10^par("usr")[2]) - }else{ - grid.coord.x <- c(par("usr")[1], par("usr")[2]) - } - if(y.log.scale == TRUE){ - grid.coord.y <- c(10^par("usr")[3], 10^par("usr")[4]) - }else{ - grid.coord.y <- c(par("usr")[3], par("usr")[4]) - } - if( ! is.null(bg.color)){ - rect(grid.coord.x[1], grid.coord.y[1], grid.coord.x[2], grid.coord.y[2], col = bg.color, border = NA) - } - if( ! is.null(grid.lwd)){ - grid(nx = NA, ny = NULL, col = grid.col, lty = 1, lwd = grid.lwd) - } - if(x.log.scale == TRUE){ - x.mid.left.dev.region <- 10^(par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] - ((par("usr")[2] - par("usr")[1]) / ((par("omd")[2] - par("omd")[1]) * (par("plt")[2] - par("plt")[1]))) * par("omd")[1] / 2) # in x coordinates, to position axis labeling at the bottom of the graph (according to x scale) - x.left.dev.region <- 10^(par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] - ((par("usr")[2] - par("usr")[1]) / ((par("omd")[2] - par("omd")[1]) * (par("plt")[2] - par("plt")[1]))) * par("omd")[1]) # in x coordinates - x.mid.right.dev.region <- 10^(par("usr")[2] + ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * (1 - par("plt")[2]) + ((par("usr")[2] - par("usr")[1]) / ((par("omd")[2] - par("omd")[1]) * (par("plt")[2] - par("plt")[1]))) * (1 - par("omd")[2]) / 2) # in x coordinates, to position axis labeling at the top of the graph (according to x scale) - x.right.dev.region <- 10^(par("usr")[2] + ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * (1 - par("plt")[2]) + ((par("usr")[2] - par("usr")[1]) / ((par("omd")[2] - par("omd")[1]) * (par("plt")[2] - par("plt")[1]))) * (1 - par("omd")[2])) # in x coordinates - x.mid.left.fig.region <- 10^(par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] / 2) # in x coordinates, to position axis labeling at the bottom of the graph (according to x scale) - x.left.fig.region <- 10^(par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1]) # in x coordinates - x.mid.right.fig.region <- 10^(par("usr")[2] + ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * (1 - par("plt")[2]) / 2) # in x coordinates, to position axis labeling at the top of the graph (according to x scale) - x.right.fig.region <- 10^(par("usr")[2] + ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * (1 - par("plt")[2])) # in x coordinates - x.left.plot.region <- 10^par("usr")[1] # in x coordinates, left of the plot region (according to x scale) - x.right.plot.region <- 10^par("usr")[2] # in x coordinates, right of the plot region (according to x scale) - x.mid.plot.region <- 10^((par("usr")[2] + par("usr")[1]) / 2) # in x coordinates, right of the plot region (according to x scale) - }else{ - x.mid.left.dev.region <- (par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] - ((par("usr")[2] - par("usr")[1]) / ((par("omd")[2] - par("omd")[1]) * (par("plt")[2] - par("plt")[1]))) * par("omd")[1] / 2) # in x coordinates, to position axis labeling at the bottom of the graph (according to x scale) - x.left.dev.region <- (par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] - ((par("usr")[2] - par("usr")[1]) / ((par("omd")[2] - par("omd")[1]) * (par("plt")[2] - par("plt")[1]))) * par("omd")[1]) # in x coordinates - x.mid.right.dev.region <- (par("usr")[2] + ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * (1 - par("plt")[2]) + ((par("usr")[2] - par("usr")[1]) / ((par("omd")[2] - par("omd")[1]) * (par("plt")[2] - par("plt")[1]))) * (1 - par("omd")[2]) / 2) # in x coordinates, to position axis labeling at the top of the graph (according to x scale) - x.right.dev.region <- (par("usr")[2] + ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * (1 - par("plt")[2]) + ((par("usr")[2] - par("usr")[1]) / ((par("omd")[2] - par("omd")[1]) * (par("plt")[2] - par("plt")[1]))) * (1 - par("omd")[2])) # in x coordinates - x.mid.left.fig.region <- (par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] / 2) # in x coordinates, to position axis labeling at the bottom of the graph (according to x scale) - x.left.fig.region <- (par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1]) # in x coordinates - x.mid.right.fig.region <- (par("usr")[2] + ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * (1 - par("plt")[2]) / 2) # in x coordinates, to position axis labeling at the top of the graph (according to x scale) - x.right.fig.region <- (par("usr")[2] + ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * (1 - par("plt")[2])) # in x coordinates - x.left.plot.region <- par("usr")[1] # in x coordinates, left of the plot region (according to x scale) - x.right.plot.region <- par("usr")[2] # in x coordinates, right of the plot region (according to x scale) - x.mid.plot.region <- (par("usr")[2] + par("usr")[1]) / 2 # in x coordinates, right of the plot region (according to x scale) - } - if(y.log.scale == TRUE){ - y.mid.bottom.dev.region <- 10^(par("usr")[3] - ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * par("plt")[3] - ((par("usr")[4] - par("usr")[3]) / ((par("omd")[4] - par("omd")[3]) * (par("plt")[4] - par("plt")[3]))) * (par("omd")[3] / 2)) # in y coordinates, to position axis labeling at the bottom of the graph (according to y scale). Ex mid.bottom.space - y.bottom.dev.region <- 10^(par("usr")[3] - ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * par("plt")[3] - ((par("usr")[4] - par("usr")[3]) / ((par("omd")[4] - par("omd")[3]) * (par("plt")[4] - par("plt")[3]))) * par("omd")[3]) # in y coordinates - y.mid.top.dev.region <- 10^(par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / ((par("omd")[4] - par("omd")[3]) * (par("plt")[4] - par("plt")[3]))) * (1 - par("omd")[4]) / 2) # in y coordinates, to position axis labeling at the top of the graph (according to y scale). Ex mid.top.space - y.top.dev.region <- 10^(par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / ((par("omd")[4] - par("omd")[3]) * (par("plt")[4] - par("plt")[3]))) * (1 - par("omd")[4])) # in y coordinates - y.mid.bottom.fig.region <- 10^(par("usr")[3] - ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * par("plt")[3] / 2) # in y coordinates, to position axis labeling at the bottom of the graph (according to y scale). Ex mid.bottom.space - y.bottom.fig.region <- 10^(par("usr")[3] - ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * par("plt")[3]) # in y coordinates - y.mid.top.fig.region <- 10^(par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) / 2) # in y coordinates, to position axis labeling at the top of the graph (according to y scale). Ex mid.top.space - y.top.fig.region <- 10^(par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4])) # in y coordinates - y.top.plot.region <- 10^par("usr")[4] # in y coordinates, top of the plot region (according to y scale) - y.bottom.plot.region <- 10^par("usr")[3] # in y coordinates, bottom of the plot region (according to y scale) - y.mid.plot.region <- (par("usr")[3] + par("usr")[4]) / 2 # in x coordinates, right of the plot region (according to x scale) - }else{ - y.mid.bottom.dev.region <- (par("usr")[3] - ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * par("plt")[3] - ((par("usr")[4] - par("usr")[3]) / ((par("omd")[4] - par("omd")[3]) * (par("plt")[4] - par("plt")[3]))) * (par("omd")[3] / 2)) # in y coordinates, to position axis labeling at the bottom of the graph (according to y scale). Ex mid.bottom.space - y.bottom.dev.region <- (par("usr")[3] - ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * par("plt")[3] - ((par("usr")[4] - par("usr")[3]) / ((par("omd")[4] - par("omd")[3]) * (par("plt")[4] - par("plt")[3]))) * par("omd")[3]) # in y coordinates - y.mid.top.dev.region <- (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / ((par("omd")[4] - par("omd")[3]) * (par("plt")[4] - par("plt")[3]))) * (1 - par("omd")[4]) / 2) # in y coordinates, to position axis labeling at the top of the graph (according to y scale). Ex mid.top.space - y.top.dev.region <- (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / ((par("omd")[4] - par("omd")[3]) * (par("plt")[4] - par("plt")[3]))) * (1 - par("omd")[4])) # in y coordinates - y.mid.bottom.fig.region <- (par("usr")[3] - ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * par("plt")[3] / 2) # in y coordinates, to position axis labeling at the bottom of the graph (according to y scale). Ex mid.bottom.space - y.bottom.fig.region <- (par("usr")[3] - ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * par("plt")[3]) # in y coordinates - y.mid.top.fig.region <- (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) / 2) # in y coordinates, to position axis labeling at the top of the graph (according to y scale). Ex mid.top.space - y.top.fig.region <- (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4])) # in y coordinates - y.top.plot.region <- par("usr")[4] # in y coordinates, top of the plot region (according to y scale) - y.bottom.plot.region <- par("usr")[3] # in y coordinates, bottom of the plot region (according to y scale) - y.mid.plot.region <- ((par("usr")[3] + par("usr")[4]) / 2) # in x coordinates, right of the plot region (according to x scale) - } - if(x.side == 1 | x.side == 3){ - par(xpd=FALSE, xaxt="s") - if(is.null(x.categ) & x.log.scale == TRUE){ - if(any(par()$xaxp[1:2] == 0)){ - if(par()$xaxp[1] == 0){ - par(xaxp = c(10^-30, par()$xaxp[2:3])) # because log10(par()$xaxp[1] == 0) == -Inf - } - if(par()$xaxp[2] == 0){ - par(xaxp = c(par()$xaxp[1], 10^-30, par()$xaxp[3])) # because log10(par()$xaxp[2] == 0) == -Inf - } - } - axis(side=x.side, at=c(10^par()$usr[1], 10^par()$usr[2]), labels=rep("", 2), lwd=1, lwd.ticks=0) # draw the axis line - mtext(side = x.side, text = x.lab, line = x.dist.legend / 0.2, las = 0, cex = x.label.magnific) - par(tcl = -par()$mgp[2] * sec.tick.length) # length of the secondary ticks are reduced - suppressWarnings(rug(10^outer(c((log10(par("xaxp")[1]) -1):log10(par("xaxp")[2])), log10(1:10), "+"), ticksize = NA, side = x.side)) # ticksize = NA to allow the use of par()$tcl value - par(tcl = -par()$mgp[2] * tick.length) # back to main ticks - axis(side = x.side, at = c(1e-15, 1e-14, 1e-13, 1e-12, 1e-11, 1e-10, 1e-9, 1e-8, 1e-7, 1e-6, 1e-5, 1e-4, 1e-3, 1e-2, 1e-1, 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10), labels = expression(10^-15, 10^-14, 10^-13, 10^-12, 10^-11, 10^-10, 10^-9, 10^-8, 10^-7, 10^-6, 10^-5, 10^-4, 10^-3, 10^-2, 10^-1, 10^0, 10^1, 10^2, 10^3, 10^4, 10^5, 10^6, 10^7, 10^8, 10^9, 10^10), lwd = 0, lwd.ticks = 1, cex.axis = x.axis.magnific) - x.text <- 10^par("usr")[2] - }else if(is.null(x.categ) & x.log.scale == FALSE){ - axis(side=x.side, at=c(par()$usr[1], par()$usr[2]), labels=rep("", 2), lwd=1, lwd.ticks=0) # draw the axis line - axis(side=x.side, at=round(seq(par()$xaxp[1], par()$xaxp[2], length.out=par()$xaxp[3]+1), 2), cex.axis = x.axis.magnific) # axis(side=x.side, at=round(seq(par()$xaxp[1], par()$xaxp[2], length.out=par()$xaxp[3]+1), 2), labels = format(round(seq(par()$xaxp[1], par()$xaxp[2], length.out=par()$xaxp[3]+1), 2), big.mark=','), cex.axis = x.axis.magnific) # to get the 1000 comma separator - mtext(side = x.side, text = x.lab, line = x.dist.legend / 0.2, las = 0, cex = x.label.magnific) - if(x.nb.inter.tick > 0){ - inter.tick.unit <- (par("xaxp")[2] - par("xaxp")[1]) / par("xaxp")[3] - par(tcl = -par()$mgp[2] * sec.tick.length) # length of the ticks are reduced - suppressWarnings(rug(seq(par("xaxp")[1] - 10 * inter.tick.unit, par("xaxp")[2] + 10 * inter.tick.unit, by = inter.tick.unit / (1 + x.nb.inter.tick)), ticksize = NA, x.side)) # ticksize = NA to allow the use of par()$tcl value - par(tcl = -par()$mgp[2] * tick.length) # back to main ticks - } - x.text <- par("usr")[2] - }else if(( ! is.null(x.categ)) & x.log.scale == FALSE){ - if(is.null(x.categ.pos)){ - x.categ.pos <- 1:length(x.categ) - }else if(length(x.categ.pos) != length(x.categ)){ - stop("\n\nPROBLEM: x.categ.pos MUST BE THE SAME LENGTH AS x.categ\n\n") - } - par(xpd = TRUE) - if(x.side == 1){ - segments(x0 = x.left.plot.region, x1 = x.right.plot.region, y0 = y.bottom.plot.region, y1 = y.bottom.plot.region) # draw the line of the axis - text(x = x.categ.pos, y = y.mid.bottom.fig.region, labels = x.categ, srt = text.angle, cex = x.axis.magnific) - }else if(x.side == 3){ - segments(x0 = x.left.plot.region, x1 = x.right.plot.region, y0 = y.top.plot.region, y1 = y.top.plot.region) # draw the line of the axis - text(x = x.categ.pos, y = y.mid.top.fig.region, labels = x.categ, srt = text.angle, cex = x.axis.magnific) - }else{ - stop("\n\nARGUMENT x.side CAN ONLY BE 1 OR 3\n\n") - } - par(xpd = FALSE) - x.text <- par("usr")[2] - }else{ - stop("\n\nPROBLEM WITH THE x.side (", x.side ,") OR x.log.scale (", x.log.scale,") ARGUMENTS\n\n") - } - }else{ - x.text <- par("usr")[2] - } - if(y.side == 2 | y.side == 4){ - par(xpd=FALSE, yaxt="s") - if(is.null(y.categ) & y.log.scale == TRUE){ - if(any(par()$yaxp[1:2] == 0)){ - if(par()$yaxp[1] == 0){ - par(yaxp = c(10^-30, par()$yaxp[2:3])) # because log10(par()$yaxp[1] == 0) == -Inf - } - if(par()$yaxp[2] == 0){ - par(yaxp = c(par()$yaxp[1], 10^-30, par()$yaxp[3])) # because log10(par()$yaxp[2] == 0) == -Inf - } - } - axis(side=y.side, at=c(10^par()$usr[3], 10^par()$usr[4]), labels=rep("", 2), lwd=1, lwd.ticks=0) # draw the axis line - par(tcl = -par()$mgp[2] * sec.tick.length) # length of the ticks are reduced - suppressWarnings(rug(10^outer(c((log10(par("yaxp")[1])-1):log10(par("yaxp")[2])), log10(1:10), "+"), ticksize = NA, side = y.side)) # ticksize = NA to allow the use of par()$tcl value - par(tcl = -par()$mgp[2] * tick.length) # back to main tick length - axis(side = y.side, at = c(1e-15, 1e-14, 1e-13, 1e-12, 1e-11, 1e-10, 1e-9, 1e-8, 1e-7, 1e-6, 1e-5, 1e-4, 1e-3, 1e-2, 1e-1, 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10), labels = expression(10^-15, 10^-14, 10^-13, 10^-12, 10^-11, 10^-10, 10^-9, 10^-8, 10^-7, 10^-6, 10^-5, 10^-4, 10^-3, 10^-2, 10^-1, 10^0, 10^1, 10^2, 10^3, 10^4, 10^5, 10^6, 10^7, 10^8, 10^9, 10^10), lwd = 0, lwd.ticks = 1, cex.axis = y.axis.magnific) - y.text <- 10^(par("usr")[4] + (par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3]) * (1 - par("plt")[4])) - mtext(side = y.side, text = y.lab, line = y.dist.legend / 0.2, las = 0, cex = y.label.magnific) - }else if(is.null(y.categ) & y.log.scale == FALSE){ - axis(side=y.side, at=c(par()$usr[3], par()$usr[4]), labels=rep("", 2), lwd=1, lwd.ticks=0) # draw the axis line - axis(side=y.side, at=round(seq(par()$yaxp[1], par()$yaxp[2], length.out=par()$yaxp[3]+1), 2), cex.axis = y.axis.magnific) - mtext(side = y.side, text = y.lab, line = y.dist.legend / 0.2, las = 0, cex = y.label.magnific) - if(y.nb.inter.tick > 0){ - inter.tick.unit <- (par("yaxp")[2] - par("yaxp")[1]) / par("yaxp")[3] - par(tcl = -par()$mgp[2] * sec.tick.length) # length of the ticks are reduced - suppressWarnings(rug(seq(par("yaxp")[1] - 10 * inter.tick.unit, par("yaxp")[2] + 10 * inter.tick.unit, by = inter.tick.unit / (1 + y.nb.inter.tick)), ticksize = NA, side=y.side)) # ticksize = NA to allow the use of par()$tcl value - par(tcl = -par()$mgp[2] * tick.length) # back to main tick length - } - y.text <- (par("usr")[4] + (par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3]) * (1 - par("plt")[4])) - }else if(( ! is.null(y.categ)) & y.log.scale == FALSE){ - if(is.null(y.categ.pos)){ - y.categ.pos <- 1:length(y.categ) - }else if(length(y.categ.pos) != length(y.categ)){ - stop("\n\nPROBLEM: y.categ.pos MUST BE THE SAME LENGTH AS y.categ\n\n") - } - axis(side = y.side, at = y.categ.pos, labels = rep("", length(y.categ)), lwd=0, lwd.ticks=1) # draw the line of the axis - par(xpd = TRUE) - if(y.side == 2){ - text(x = x.mid.left.fig.region, y = y.categ.pos, labels = y.categ, srt = text.angle, cex = y.axis.magnific) - }else if(y.side == 4){ - text(x = x.mid.right.fig.region, y = y.categ.pos, labels = y.categ, srt = text.angle, cex = y.axis.magnific) - }else{ - stop("\n\nARGUMENT y.side CAN ONLY BE 2 OR 4\n\n") - } - par(xpd = FALSE) - y.text <- (par("usr")[4] + (par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3]) * (1 - par("plt")[4])) - }else{ - stop("\n\nPROBLEM WITH THE y.side (", y.side ,") OR y.log.scale (", y.log.scale,") ARGUMENTS\n\n") - } - }else{ - y.text <- (par("usr")[4] + (par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3]) * (1 - par("plt")[4])) - } - par(xpd=NA) - text(x = x.mid.right.fig.region, y = y.text, corner.text, adj=c(1, 1.1), cex = magnific.corner.text) # text at the topright corner. Replace x.right.fig.region by x.text if text at the right edge of the plot region - if(just.label.add == TRUE & x.side == 0 & x.lab != ""){ - text(x = x.mid.plot.region, y = y.mid.bottom.fig.region, x.lab, adj=c(0.5, 0.5), cex = x.label.magnific) # x label - } - if(just.label.add == TRUE & y.side == 0 & y.lab != ""){ - text(x = y.mid.plot.region, y = x.mid.left.fig.region, y.lab, adj=c(0.5, 0.5), cex = y.label.magnific) # x label - } - par(xpd=FALSE) - if(par.reset == TRUE){ - tempo.par <- fun_open(pdf.disp = FALSE, return.output = TRUE) - invisible(dev.off()) # close the new window - if( ! is.null(custom.par)){ - if( ! names(custom.par) %in% names(tempo.par$ini.par)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": custom.par ARGUMENT SHOULD HAVE THE NAMES OF THE COMPARTMENT LIST COMING FROM THE par() LIST\n\n================\n\n") - stop(tempo.cat) - } - par(custom.par) - text <- c(text, "\nGRAPH PARAMETERS SET TO VALUES DEFINED BY custom.par ARGUMENT\n") - }else{ - par(tempo.par$ini.par) - text <- c(text, "\nGRAPH PARAMETERS RESET TO par() DEFAULT VALUES\n") - } - } - output <- list(x.mid.left.dev.region = x.mid.left.dev.region, x.left.dev.region = x.left.dev.region, x.mid.right.dev.region = x.mid.right.dev.region, x.right.dev.region = x.right.dev.region, x.mid.left.fig.region = x.mid.left.fig.region, x.left.fig.region = x.left.fig.region, x.mid.right.fig.region = x.mid.right.fig.region, x.right.fig.region = x.right.fig.region, x.left.plot.region = x.left.plot.region, x.right.plot.region = x.right.plot.region, x.mid.plot.region = x.mid.plot.region, y.mid.bottom.dev.region = y.mid.bottom.dev.region, y.bottom.dev.region = y.bottom.dev.region, y.mid.top.dev.region = y.mid.top.dev.region, y.top.dev.region = y.top.dev.region, y.mid.bottom.fig.region = y.mid.bottom.fig.region, y.bottom.fig.region = y.bottom.fig.region, y.mid.top.fig.region = y.mid.top.fig.region, y.top.fig.region = y.top.fig.region, y.top.plot.region = y.top.plot.region, y.bottom.plot.region = y.bottom.plot.region, y.mid.plot.region = y.mid.plot.region, text = text) - return(output) +# AIM +# redesign axis. If x.side = 0, y.side = 0, the function just adds text at topright of the graph and reset par() for next graphics and provides outputs (see below) +# provide also positions for legend or additional text on the graph +# use fun_prior_plot() before this function for initial inactivation of the axis drawings +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_check() +# fun_open() to reinitialize graph parameters if par.reset = TRUE and custom.par = NULL +# ARGUMENTS +# x.side: axis at the bottom (1) or top (3) of the region figure. Write 0 for no change +# x.log.scale: Log scale for the x-axis? Either TRUE or FALSE +# x.categ: character vector representing the classes (levels()) to specify when the x-axis is qualititative(stripchart, boxplot) +# x.categ.pos: position of the classes names (numeric vector of identical length than x.categ). If left NULL, this will be 1:length(levels()) +# x.lab: label of the x-axis. If x.side == 0 and x.lab != "", then x.lab is printed +# x.axis.magnific: increase or decrease the value to increase or decrease the size of the x axis numbers. Also control the size of displayed categories +# x.label.magnific: increase or decrease the value to increase or decrease the size of the x axis legend +# x.dist.legend: increase the number to move x-axis legends away in inches (first number of mgp argument of par() but in inches) +# x.nb.inter.tick: number of secondary ticks between main ticks on x-axis (only if not log scale). 0 means no secondary ticks +# y.side: axis at the left (2) or right (4) of the region figure. Write 0 for no change +# y.log.scale: Log scale for the y-axis? Either TRUE or FALSE +# y.categ: classes (levels()) to specify when the y-axis is qualititative(stripchart, boxplot) +# y.categ.pos: position of the classes names (numeric vector of identical length than y.categ). If left NULL, this will be 1:length(levels()) +# y.lab: label of the y-axis. If y.side == 0 and y.lab != "", then y.lab is printed +# y.axis.magnific: increase or decrease the value to increase or decrease the size of the y axis numbers. Also control the size of displayed categories +# y.label.magnific: increase or decrease the value to increase or decrease the size of the y axis legend +# y.dist.legend: increase the number to move y-axis legends away in inches (first number of mgp argument of par() but in inches) +# y.nb.inter.tick: number of secondary ticks between main ticks on y-axis (only if not log scale). 0 means non secondary ticks +# text.angle: angle of the text when axis is qualitative +# tick.length: length of the main ticks (1 means complete the distance between the plot region and the axis numbers, 0.5 means half the length, etc., 0 for no ticks) +# sec.tick.length: length of the secondary ticks (1 means complete the distance between the plot region and the axis numbers, 0.5 means half the length, etc., 0 for no ticks) +# bg.color: background color of the plot region. NULL for no color. BEWARE: cover/hide an existing plot ! +# grid.lwd: if non NULL, activate the grid line (specify the line width) +# grid.col: grid line color (only if grid.lwd non NULL) +# corner.text: text to add at the top right corner of the window +# magnific.corner.text: increase or decrease the size of the text +# par.reset: to reset all the graphics parameters. BEWARE: TRUE can generate display problems, mainly in graphic devices with multiple figure regions +# just.label.add: just add axis labels (legend)? Either TRUE or FALSE. If TRUE, at least (x.side == 0 & x.lab != "") or (y.side == 0 & y.lab != "") must be set to display the corresponding x.lab or y.lab +# custom.par: list that provides the parameters that reset all the graphics parameters. BEWARE: if NULL and par.reset == TRUE, the default par() parameters are used +# RETURN +# a list containing: +# $x.mid.left.dev.region: middle of the left margin of the device region, in coordinates of the x-axis +# $x.left.dev.region: left side of the left margin (including the potential margin of the device region), in coordinates of the x-axis +# $x.mid.right.dev.region: middle of the right margin of the device region, in coordinates of the x-axis +# $x.right.dev.region: right side of the right margin (including the potential margin of the device region), in coordinates of the x-axis +# $x.mid.left.fig.region: middle of the left margin of the figure region, in coordinates of the x-axis +# $x.left.fig.region: left side of the left margin, in coordinates of the x-axis +# $x.mid.right.fig.region: middle of the right margin of the figure region, in coordinates of the x-axis +# $x.right.fig.region: right side of the right margin, in coordinates of the x-axis +# $x.left.plot.region: left side of the plot region, in coordinates of the x-axis +# $x.right.plot.region: right side of the plot region, in coordinates of the x-axis +# $x.mid.plot.region: middle of the plot region, in coordinates of the x-axis +# $y.mid.bottom.dev.region: middle of the bottom margin of the device region, in coordinates of the y-axis +# $y.bottom.dev.region: bottom side of the bottom margin (including the potential margin of the device region), in coordinates of the y-axis +# $y.mid.top.dev.region: middle of the top margin of the device region, in coordinates of the y-axis +# $y.top.dev.region: top side of the top margin (including the potential margin of the device region), in coordinates of the y-axis +# $y.mid.bottom.fig.region: middle of the bottom margin of the figure region, in coordinates of the y-axis +# $y.bottom.fig.region: bottom of the bottom margin of the figure region, in coordinates of the y-axis +# $y.mid.top.fig.region: middle of the top margin of the figure region, in coordinates of the y-axis +# $y.top.fig.region: top of the top margin of the figure region, in coordinates of the y-axis +# $y.top.plot.region: top of the plot region, in coordinates of the y-axis +# $y.bottom.plot.region: bottom of the plot region, in coordinates of the y-axis +# $y.mid.plot.region: middle of the plot region, in coordinates of the y-axis +# $text: warning text +# EXAMPLES +# Example of log axis with log y-axis and unmodified x-axis: +# prior.par <- fun_prior_plot(param.reinitial = TRUE, xlog.scale = FALSE, ylog.scale = TRUE, remove.label = TRUE, remove.x.axis = FALSE, remove.y.axis = TRUE, down.space = 1, left.space = 1, up.space = 1, right.space = 1, orient = 1, dist.legend = 0.5, tick.length = 0.5, box.type = "n", amplif.label = 1, amplif.axis = 1, display.extend = FALSE, return.par = TRUE) ; plot(1:100, log = "y") ; fun_post_plot(y.side = 2, y.log.scale = prior.par$ylog, x.lab = "Values", y.lab = "TEST", y.axis.magnific = 1.25, y.label.magnific = 1.5, y.dist.legend = 0.7, just.label.add = ! prior.par$ann) +# Example of log axis with redrawn x-axis and y-axis: +# prior.par <- fun_prior_plot(param.reinitial = TRUE) ; plot(1:100) ; fun_post_plot(x.side = 1, x.lab = "Values", y.side = 2, y.lab = "TEST", y.axis.magnific = 1, y.label.magnific = 2, y.dist.legend = 0.6) +# example with margins in the device region: +# windows(5,5) ; fun_prior_plot(box.type = "o") ; par(mai=c(0.5,0.5,0.5,0.5), omi = c(0.25,0.25,1,0.25), xaxs = "i", yaxs = "i") ; plot(0:10) ; a <- fun_post_plot(x.side = 0, y.side = 0) ; x <- c(a$x.mid.left.dev.region, a$x.left.dev.region, a$x.mid.right.dev.region, a$x.right.dev.region, a$x.mid.left.fig.region, a$x.left.fig.region, a$x.mid.right.fig.region, a$x.right.fig.region, a$x.right.plot.region, a$x.left.plot.region, a$x.mid.plot.region) ; y <- c(a$y.mid.bottom.dev.region, a$y.bottom.dev.region, a$y.mid.top.dev.region, a$y.top.dev.region, a$y.mid.bottom.fig.region, a$y.bottom.fig.region, a$y.mid.top.fig.region, a$y.top.fig.region, a$y.top.plot.region, a$y.bottom.plot.region, a$y.mid.plot.region) ; par(xpd = NA) ; points(x = rep(5, length(y)), y = y, pch = 16, col = "red") ; text(x = rep(5, length(y)), y = y, c("y.mid.bottom.dev.region", "y.bottom.dev.region", "y.mid.top.dev.region", "y.top.dev.region", "y.mid.bottom.fig.region", "y.bottom.fig.region", "y.mid.top.fig.region", "y.top.fig.region", "y.top.plot.region", "y.bottom.plot.region", "y.mid.plot.region"), cex = 0.65, col = grey(0.25)) ; points(y = rep(5, length(x)), x = x, pch = 16, col = "blue") ; text(y = rep(5, length(x)), x = x, c("x.mid.left.dev.region", "x.left.dev.region", "x.mid.right.dev.region", "x.right.dev.region", "x.mid.left.fig.region", "x.left.fig.region", "x.mid.right.fig.region", "x.right.fig.region", "x.right.plot.region", "x.left.plot.region", "x.mid.plot.region"), cex = 0.65, srt = 90, col = grey(0.25)) +# DEBUGGING +# x.side = 0 ; x.log.scale = FALSE ; x.categ = NULL ; x.categ.pos = NULL ; x.lab = "" ; x.axis.magnific = 1.5 ; x.label.magnific = 1.5 ; x.dist.legend = 1 ; x.nb.inter.tick = 1 ; y.side = 0 ; y.log.scale = FALSE ; y.categ = NULL ; y.categ.pos = NULL ; y.lab = "" ; y.axis.magnific = 1.5 ; y.label.magnific = 1.5 ; y.dist.legend = 0.7 ; y.nb.inter.tick = 1 ; text.angle = 90 ; tick.length = 0.5 ; sec.tick.length = 0.3 ; bg.color = NULL ; grid.lwd = NULL ; grid.col = "white" ; corner.text = "" ; magnific.corner.text = 1 ; just.label.add = FALSE ; par.reset = FALSE ; custom.par = NULL # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) } - - -######## fun_close() #### close specific graphic windows - - -# Check OK: clear to go Apollo -fun_close <- function(kind = "pdf", return.text = FALSE){ - # AIM - # close only specific graphic windows (devices) - # REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION - # fun_check() - # ARGUMENTS: - # kind: vector, among c("windows", "quartz", "x11", "X11", "pdf", "bmp", "png", "tiff"), indicating the kind of graphic windows (devices) to close. BEWARE: either "windows", "quartz", "x11" or "X11" means that all the X11 GUI graphics devices will be closed, whatever the OS used - # return.text: print text regarding the kind parameter and the devices that were finally closed? - # RETURN - # text regarding the kind parameter and the devices that were finally closed - # EXAMPLES - # windows() ; windows() ; pdf() ; dev.list() ; fun_close(kind = c("pdf", "x11"), return.text = TRUE) ; dev.list() - # DEBUGGING - # kind = c("windows", "pdf") ; return.text = FALSE # for function debugging - # function name - function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") - # end function name - # required function checking - if(length(find("fun_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_check(data = kind, options = c("windows", "quartz", "x11", "X11", "pdf", "bmp", "png", "tiff"), fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = return.text, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_check() - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() - # end argument checking - # main code - text <- paste0("THE REQUIRED KIND OF GRAPHIC DEVICES TO CLOSE ARE ", paste(kind, collapse = " ")) - if(Sys.info()["sysname"] == "Windows"){ # Note that .Platform$OS.type() only says "unix" for macOS and Linux and "Windows" for Windows - if(any(kind %in% c("windows", "quartz", "x11", "X11"))){ - tempo <- kind %in% c("windows", "quartz", "x11", "X11") - kind[tempo] <- "windows" # term are replaced by what is displayed when using a <- dev.list() ; names(a) - } - }else if(Sys.info()["sysname"] == "Linux"){ - if(any(kind %in% c("windows", "quartz", "x11", "X11"))){ - tempo.device <- suppressWarnings(try(X11(), silent = TRUE))[] # open a X11 window to try to recover the X11 system used - if( ! is.null(tempo.device)){ - text <- paste0(text, "\nCANNOT CLOSE GUI GRAPHIC DEVICES AS REQUIRED BECAUSE THIS LINUX SYSTEM DOES NOT HAVE IT") - }else{ - tempo <- kind %in% c("windows", "quartz", "x11", "X11") - kind[tempo] <- names(dev.list()[length(dev.list())]) # term are replaced by what is displayed when using a <- dev.list() ; names(a) - invisible(dev.off()) # close the X11 opened by tempo - } - } - }else{ # for macOS - if(any(kind %in% c("windows", "quartz", "x11", "X11"))){ - tempo <- kind %in% c("windows", "quartz", "x11", "X11") - kind[tempo] <- "quartz" # term are replaced by what is displayed when using a <- dev.list() ; names(a) - } - } - kind <- unique(kind) - if(length(dev.list()) != 0){ - for(i in length(names(dev.list())):1){ - if(names(dev.list())[i] %in% kind){ - text <- paste0(text, "\n", names(dev.list())[i], " DEVICE NUMBER ", dev.list()[i], " HAS BEEN CLOSED") - invisible(dev.off(dev.list()[i])) - } - } - } - if(return.text == TRUE){ - return(text) - } +if(length(find("fun_open", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_open() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) } - - -################ Standard graphics - - -######## fun_empty_graph() #### text to display for empty graphs - - - - - -# Check OK: clear to go Apollo -fun_empty_graph <- function(text = NULL, text.size = 1, title = NULL, title.size = 1.5){ - # AIM - # display an empty plot with a text in the middle of the window (for instance to specify that no plot can be drawn) - # ARGUMENTS - # text: character string of the message to display - # text.size: numeric value of the text size - # title: character string of the graph title - # title.size: numeric value of the title size (in points) - # REQUIRED PACKAGES - # none - # REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION - # fun_check() - # RETURN - # an empty plot - # EXAMPLES - # simple example - # fun_empty_graph(text = "NO GRAPH") - # white page - # fun_empty_graph() # white page - # all the arguments - # fun_empty_graph(text = "NO GRAPH", text.size = 2, title = "GRAPH1", title.size = 1) - # DEBUGGING - # text = "NO GRAPH" ; title = "GRAPH1" ; text.size = 1 - # function name - function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") - # end function name - # required function checking - if(length(find("fun_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - if( ! is.null(text)){ - tempo <- fun_check(data = text, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) - } - tempo <- fun_check(data = text.size, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) - if( ! is.null(title)){ - tempo <- fun_check(data = title, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) - } - tempo <- fun_check(data = title.size, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_check() - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() - # end argument checking - # main code - ini.par <- par(no.readonly = TRUE) # to recover the initial graphical parameters if required (reset). BEWARE: this command alone opens a pdf of GUI window if no window already opened. But here, protected with the code because always a tempo window opened - par(ann=FALSE, xaxt="n", yaxt="n", mar = rep(1, 4), bty = "n", xpd = NA) - plot(1, 1, type = "n") # no display with type = "n" - x.left.dev.region <- (par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] - ((par("usr")[2] - par("usr")[1]) / ((par("omd")[2] - par("omd")[1]) * (par("plt")[2] - par("plt")[1]))) * par("omd")[1]) - y.top.dev.region <- (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / ((par("omd")[4] - par("omd")[3]) * (par("plt")[4] - par("plt")[3]))) * (1 - par("omd")[4])) - if( ! is.null(text)){ - text(x = 1, y = 1, labels = text, cex = text.size) - } - if( ! is.null(title)){ - text(x = x.left.dev.region, y = y.top.dev.region, labels = title, adj=c(0, 1), cex = title.size) - } - par(ini.par) +# end required function checking +# argument checking +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_check(data = x.side, options = c(0, 1, 3), length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = x.log.scale, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(x.categ)){ +tempo <- fun_check(data = x.categ, class = "character", na.contain = TRUE, fun.name = function.name) ; eval(ee) } - - -################ gg graphics - - -######## fun_gg_palette() #### ggplot2 default color palette - - - - - -# Check OK: clear to go Apollo -fun_gg_palette <- function(n, kind = "std"){ - # AIM - # provide colors used by ggplot2 - # the interest is to use another single color that is not the red one used by default - # for ggplot2 specifications, see: https://ggplot2.tidyverse.org/articles/ggplot2-specs.html - # ARGUMENTS - # n: number of groups on the graph - # kind: either "std" for standard gg colors, "dark" for darkened gg colors, or "light" for pastel gg colors - # REQUIRED PACKAGES - # none - # REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION - # fun_check() - # RETURN - # the vector of hexadecimal colors - # EXAMPLES - # output of the function - # fun_gg_palette(n = 2) - # the ggplot2 palette when asking for 7 different colors - # plot(1:7, pch = 16, cex = 5, col = fun_gg_palette(n = 7)) - # selection of the 5th color of the ggplot2 palette made of 7 different colors - # plot(1:7, pch = 16, cex = 5, col = fun_gg_palette(n = 7)[5]) - # the ggplot2 palette made of 7 darkened colors - # plot(1:7, pch = 16, cex = 5, col = fun_gg_palette(n = 7, kind = "dark")) - # the ggplot2 palette made of 7 lighten colors - # plot(1:7, pch = 16, cex = 5, col = fun_gg_palette(n = 7, kind = "light")) - # DEBUGGING - # n = 0 - # kind = "std" - # function name - function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") - # end function name - # required function checking - if(length(find("fun_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_check(data = n, class = "integer", length = 1, double.as.integer.allowed = TRUE, neg.values = FALSE, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & n == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": n ARGUMENT MUST BE A NON ZERO INTEGER. HERE IT IS: ", paste(n, collapse = " "), "\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - tempo <- fun_check(data = kind, options = c("std", "dark", "light"), length = 1, fun.name = function.name) ; eval(ee) - } - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_check() - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() - # end argument checking - # main code - hues = seq(15, 375, length = n + 1) - hcl(h = hues, l = if(kind == "std"){65}else if(kind == "dark"){35}else if(kind == "light"){85}, c = 100)[1:n] +if( ! is.null(x.categ.pos)){ +tempo <- fun_check(data = x.categ.pos, class = "vector", mode = "numeric", fun.name = function.name) ; eval(ee) } - - -######## fun_gg_just() #### ggplot2 justification of the axis labeling, depending on angle - - - - - -# Check OK: clear to go Apollo -fun_gg_just <- function(angle, axis){ - # AIM - # provide correct justification for axis labeling, depending on the chosen angle - # ARGUMENTS - # angle: integer value of the text angle for the axis labels. Positive values for counterclockwise rotation: 0 for horizontal, 90 for vertical, 180 for upside down etc. Negative values for clockwise rotation: 0 for horizontal, -90 for vertical, -180 for upside down etc. - # axis: which axis for? Either "x" or "y" - # REQUIRED PACKAGES - # none - # REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION - # fun_check() - # RETURN - # a list containing: - # $angle: the submitted angle (value potentially reduced to fit the [-360 ; 360] interval, e.g., 460 -> 100, without impact on the final angle displayed) - # $hjust: the horizontal justification - # $vjust: the vertical justification - # EXAMPLES - # fun_gg_just(angle = 45, axis = "x") - # fun_gg_just(angle = (360*2 + 45), axis = "y") - # output <- fun_gg_just(angle = 45, axis = "x") ; obs1 <- data.frame(time = 1:20, group = rep(c("CLASS_1", "CLASS_2"), times = 10)) ; ggplot2::ggplot() + ggplot2::geom_bar(data = obs1, mapping = ggplot2::aes(x = group, y = time), stat = "identity") + ggplot2::theme(axis.text.x = ggplot2::element_text(angle = output$angle, hjust = output$hjust, vjust = output$vjust)) - # output <- fun_gg_just(angle = -45, axis = "y") ; obs1 <- data.frame(time = 1:20, group = rep(c("CLASS_1", "CLASS_2"), times = 10)) ; ggplot2::ggplot() + ggplot2::geom_bar(data = obs1, mapping = ggplot2::aes(x = group, y = time), stat = "identity") + ggplot2::theme(axis.text.y = ggplot2::element_text(angle = output$angle, hjust = output$hjust, vjust = output$vjust)) + ggplot2::coord_flip() - # output1 <- fun_gg_just(angle = 90, axis = "x") ; output2 <- fun_gg_just(angle = -45, axis = "y") ; obs1 <- data.frame(time = 1:20, group = rep(c("CLASS_1", "CLASS_2"), times = 10)) ; ggplot2::ggplot() + ggplot2::geom_bar(data = obs1, mapping = ggplot2::aes(x = group, y = time), stat = "identity") + ggplot2::theme(axis.text.x = ggplot2::element_text(angle = output1$angle, hjust = output1$hjust, vjust = output1$vjust), axis.text.y = ggplot2::element_text(angle = output2$angle, hjust = output2$hjust, vjust = output2$vjust)) - # DEBUGGING - # angle = 45 ; axis = "y" - # function name - function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") - # end function name - # required function checking - if(length(find("fun_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_check(data = angle, class = "integer", length = 1, double.as.integer.allowed = TRUE, neg.values = TRUE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = axis, options = c("x", "y"), length = 1, fun.name = function.name) ; eval(ee) - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_check() - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() - # end argument checking - # main code - # to get angle between -360 and 360 - while(angle > 360){ - angle <- angle - 360 - } - while(angle < -360){ - angle <- angle + 360 - } - # end to get angle between -360 and 360 - # justifications - if(axis == "x"){ - if(angle == -360 | angle == -180 | angle == 0 | angle == 180 | angle == 360){ - hjust <- 0.5 - vjust <- 0.5 - }else if(angle == -270 | angle == 90){ - hjust <- 1 - vjust <- 0.5 - }else if(angle == -90 | angle == 270){ - hjust <- 0 - vjust <- 0.5 - }else if((angle > -360 & angle < -270) | (angle > 0 & angle < 90)){ - hjust <- 1 - vjust <- 1 - }else if((angle > -270 & angle < -180) | (angle > 90 & angle < 180)){ - hjust <- 1 - vjust <- 0 - }else if((angle > -180 & angle < -90) | (angle > 180 & angle < 270)){ - hjust <- 0 - vjust <- 0 - }else if((angle > -90 & angle < 0) | (angle > 270 & angle < 360)){ - hjust <- 0 - vjust <- 1 - } - }else if(axis == "y"){ - if(angle == -270 | angle == -90 | angle == 90 | angle == 270){ - hjust <- 0.5 - vjust <- 0.5 - }else if(angle == -360 | angle == 0 | angle == 360){ - hjust <- 1 - vjust <- 0.5 - }else if(angle == -180 | angle == 180){ - hjust <- 0 - vjust <- 0.5 - }else if((angle > -360 & angle < -270) | (angle > 0 & angle < 90)){ - hjust <- 1 - vjust <- 0 - }else if((angle > -270 & angle < -180) | (angle > 90 & angle < 180)){ - hjust <- 0 - vjust <- 0 - }else if((angle > -180 & angle < -90) | (angle > 180 & angle < 270)){ - hjust <- 0 - vjust <- 1 - }else if((angle > -90 & angle < 0) | (angle > 270 & angle < 360)){ - hjust <- 1 - vjust <- 1 - } - } - # end justifications - output <- list(angle = angle, hjust = hjust, vjust = vjust) - return(output) +tempo <- fun_check(data = x.lab, class = "character", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = x.axis.magnific, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = x.label.magnific, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = x.dist.legend, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = x.nb.inter.tick, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = y.side, options = c(0, 2, 4), length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = y.log.scale, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(y.categ)){ +tempo <- fun_check(data = y.categ, class = "character", na.contain = TRUE, fun.name = function.name) ; eval(ee) } - - -######## fun_gg_point_rast() #### ggplot2 raster scatterplot layer - - - - - -# Check OK: clear to go Apollo -fun_gg_point_rast <- function(data = NULL, mapping = NULL, stat = "identity", position = "identity", ..., na.rm = FALSE, show.legend = NA, inherit.aes = TRUE, raster.width = NULL, raster.height = NULL, raster.dpi = 300, inactivate = TRUE, path.lib = NULL){ - # AIM - # equivalent to ggplot2::geom_point() but in raster mode - # use it like ggplot2::geom_point() with the main raster.dpi additional argument - # WARNINGS - # can be long to generate the plot - # use a square plot region. Otherwise, the dots will have ellipsoid shape - # solve the transparency problems with some GUI - # this function is derived from the geom_point_rast() function, created by VPetukhov, and present in the ggrastr package (https://rdrr.io/github/VPetukhov/ggrastr/src/R/geom-point-rast.R). Has been placed here to minimize package dependencies - # ARGUMENTS - # classical arguments of geom_point(), shown here https://rdrr.io/github/VPetukhov/ggrastr/man/geom_point_rast.html - # raster.width : width of the result image (in inches). Default: deterined by the current device parameters - # raster.height: height of the result image (in inches). Default: deterined by the current device parameters - # raster.dpi: resolution of the result image - # inactivate: logical. Inactivate the fun.name argument of the fun_check() function? If TRUE, the name of the fun_check() function in error messages coming from this function. Use TRUE if fun_gg_point_rast() is used like this: eval(parse(text = "fun_gg_point_rast")) - # path.lib: absolute path of the required packages, if not in the default folders - # REQUIRED PACKAGES - # ggplot2 - # grid - # Cairo - # REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION - # fun_check() - # fun_pack() - # RETURN - # a raster scatter plot - # EXAMPLES - # Two pdf in the current directory - # set.seed(1) ; data1 = data.frame(x = rnorm(100000), y = rnorm(10000)) ; fun_open(pdf.name.file = "Raster") ; ggplot2::ggplot() + fun_gg_point_rast(data = data1, mapping = ggplot2::aes(x = x, y = y)) ; fun_open(pdf.name.file = "Vectorial") ; ggplot2::ggplot() + ggplot2::geom_point(data = data1, mapping = ggplot2::aes(x = x, y = y)) ; dev.off() ; dev.off() - # DEBUGGING - # - # function name - if(all(inactivate == FALSE)){ # inactivate has to be used here but will be fully checked below - function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") - }else if(all(inactivate == TRUE)){ - function.name <- NULL - }else{ - tempo.cat <- (paste0("\n\n============\n\nERROR IN fun_gg_point_rast(): CODE INCONSISTENCY 1\n\n============\n\n")) - stop(tempo.cat) - } - # end function name - # required function checking - if(length(find("fun_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - if(length(find("fun_pack", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_pack() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - if( ! is.null(data)){ - tempo <- fun_check(data = data, class = "data.frame", na.contain = TRUE, fun.name = function.name) ; eval(ee) - } - if( ! is.null(mapping)){ - tempo <- fun_check(data = mapping, class = "uneval", typeof = "list", fun.name = function.name) ; eval(ee) # aes() is tested - } - # stat and position not tested because too complicate - tempo <- fun_check(data = na.rm, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = show.legend, class = "vector", mode = "logical", length = 1, na.contain = TRUE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = inherit.aes, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) - if( ! is.null(raster.width)){ - tempo <- fun_check(data = raster.width, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - } - if( ! is.null(raster.height)){ - tempo <- fun_check(data = raster.height, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - } - tempo <- fun_check(data = raster.dpi, class = "integer", length = 1, double.as.integer.allowed = TRUE, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = inactivate, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) - if( ! is.null(path.lib)){ - tempo <- fun_check(data = path.lib, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & ! all(dir.exists(path.lib))){ - cat(paste0("\n\n============\n\nERROR IN ", function.name, ": \nDIRECTORY PATH INDICATED IN THE path.lib PARAMETER DOES NOT EXISTS: ", path.lib, "\n\n============\n\n")) - arg.check <- c(arg.check, TRUE) - } - } - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_check() - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() - # end argument checking - # package checking - fun_pack(req.package = c("ggplot2"), path.lib = path.lib) - fun_pack(req.package = c("grid"), path.lib = path.lib) - fun_pack(req.package = c("Cairo"), path.lib = path.lib) - # end package checking - # additional functions - DrawGeomPointRast <- function(data, panel_params, coord, na.rm = FALSE, raster.width = NULL, raster.height= NULL, raster.dpi = 300){ - if (is.null(raster.width)){ - raster.width <- par('fin')[1] - } - if (is.null(raster.height)){ - raster.height <- par('fin')[2] - } - prev_dev_id <- dev.cur() - p <- ggplot2::GeomPoint$draw_panel(data, panel_params, coord) - dev_id <- Cairo::Cairo(type='raster', width = raster.width*raster.dpi, height = raster.height*raster.dpi, dpi = raster.dpi, units = 'px', bg = "transparent")[1] - grid::pushViewport(grid::viewport(width = 1, height = 1)) - grid::grid.points(x = p$x, y = p$y, pch = p$pch, size = p$size, - name = p$name, gp = p$gp, vp = p$vp, draw = T) - grid::popViewport() - cap <- grid::grid.cap() - dev.off(dev_id) - dev.set(prev_dev_id) - grid::rasterGrob(cap, x = 0, y = 0, width = 1, height = 1, default.units = "native", just = c("left","bottom")) - } - # end additional functions - # main code - GeomPointRast <- ggplot2::ggproto("GeomPointRast", ggplot2::GeomPoint, draw_panel = DrawGeomPointRast) - ggplot2::layer( - data = data, - mapping = mapping, - stat = stat, - geom = GeomPointRast, - position = position, - show.legend = show.legend, - inherit.aes = inherit.aes, - params = list( - na.rm = na.rm, - raster.width = raster.width, - raster.height = raster.height, - raster.dpi = raster.dpi, - ... - ) - ) - # end main code +if( ! is.null(y.categ.pos)){ +tempo <- fun_check(data = y.categ.pos, class = "vector", mode = "numeric", fun.name = function.name) ; eval(ee) } - - -######## fun_gg_scatter() #### ggplot2 scatterplot + lines (up to 6 overlays totally) - - -# Check OK: clear to go Apollo -fun_gg_scatter <- function(data1, x, y, categ = NULL, legend.name = NULL, color = NULL, geom = "geom_point", alpha = 0.5, dot.size = 2, line.size = 0.5, xlim = NULL, xlab = NULL, xlog = "no", x.tick.nb = NULL, x.inter.tick.nb = NULL, x.left.extra.margin = 0.05, x.right.extra.margin = 0.05, ylim = NULL, ylab = NULL, ylog = "no", y.tick.nb = NULL, y.inter.tick.nb = NULL, y.top.extra.margin = 0.05, y.bottom.extra.margin = 0.05, xy.include.zero = FALSE, text.size = 12, title = "", title.text.size = 12, show.legend = TRUE, classic = FALSE, grid = FALSE, raster = FALSE, vectorial.limit = NULL, return = FALSE, plot = TRUE, add = NULL, warn.print = FALSE, path.lib = NULL){ - # AIM - # ggplot2 scatterplot with the possibility to overlay dots from up to 3 different data frames and lines from up to 3 different data frames (up to 6 overlays totally) - # for ggplot2 specifications, see: https://ggplot2.tidyverse.org/articles/ggplot2-specs.html - # WARNINGS - # rows containing NA in data1[, c(y, categ)] will be removed before processing, with a warning (see below) - # ARGUMENTS - # data1: a dataframe compatible with ggplot, or a list of data frames - # x: character string or list of character string (one compartment for each list compartment of data1) of the data1 column name for x-axis. write NULL for each "geom_hline" in geom argument - # y: character string or list of character string (one compartment for each list compartment of data1) of the data1 column name for y-axis. Write NULL for each "geom_vline" in geom argument - # categ: character string or list of character string (one compartment for each list compartment of data1) of the data1 column name for categories. If categ = NULL, no categories (no legend). Some of the list compartments can be NULL, and other not - # legend.name: character string list of character string (one compartment for each list compartment of data1) of the legend title. If legend.name = NULL and categ != NULL, then legend.name <- categ. Some of the list compartments can be NULL, and other not - # color: vector of character string or list of character vectors (one compartment for each list compartment of data1) for the colors of categ arguments. If color = NULL, default colors of ggplot2. If non null, it can be either: (1) a single color string (all the dots of the corresponding data1 will have this color, whatever categ NULL or not), (2) if categ non null, a vector of string colors, one for each class of categ (each color will be associated according to the alphabetical order of categ classes), (3) if categ non null, a vector or factor of string colors, like if it was one of the column of data1 data frame (beware: a single color per class of categ and a single class of categ per color must be respected). Integers are also accepted instead of character strings, as long as above rules about length are respected. Integers will be processed by fun_gg_palette() using the max integer value among all the integers in color. If color is a list, some of the compartments can be NULL. In that case, a different grey color will be used for each NULL compartment - # geom: character string or list of character string (one compartment for each list compartment of data1) for the kind of plot. Either "geom_point" (scatterplot), "geom_line" (coordinates plotted then line connection from the lowest to highest coordinates), "geom_path" (line connection respecting the order in data1), "geom_hline" (horizontal line) or "geom_vline" (vertical line). BEWARE: for "geom_hline" or "geom_vline", (1) x or y argument must be NULL, respectively, (2) xlim or ylim argument must NOT be NULL, respectively, if only these kind of lines are drawn (if other geom present, then xlim = NULL and ylim = NULL will generate xlim and ylim defined by these other geom, which is not possible with "geom_hline" or "geom_vline"), (3) the function will draw n lines for n values in the x argument column name of the data1 data frame. If several colors required, the categ argument must be specified and the corresponding categ column name must exist in the data1 data frame with a different class name for each row - # alpha: numeric value (from 0 to 1) of the transparency or list of numeric values (one compartment for each list compartment of data1) - # dot.size: numeric value of point size - # line.size: numeric value of line size - # xlim: 2 numeric values for x-axis range. If NULL, range of x in data1. Order of the 2 values matters (for inverted axis). BEWARE: values of the xlim must be already in the corresponding log if xlog argument is not "no" (see below) - # xlab: a character string or expression for x-axis legend. If NULL, x of the first data frame in data1. Warning message if the elements in x are different between data frames in data1 - # xlog: Either "no" (values in the x argument column of the data1 data frame are not log), "log2" (values in the x argument column of the data1 data frame are log2 transformed) or "log10" (values in the x argument column of the data1 data frame are log10 transformed). BEWARE: do not tranform the data, but just display ticks in a log scale manner. Thus, negative or zero values allowed. BEWARE: not possible to have horizontal bars with a log axis, due to a bug in ggplot2 (see https://github.com/tidyverse/ggplot2/issues/881) - # x.tick.nb: approximate number of desired label values on the x-axis (n argument of the the fun_scale() function) - # x.inter.tick.nb: number of desired secondary ticks between main ticks. Not considered if xlog is other than "no". In that case, play with the xlim and x.tick.nb arguments - # x.left.extra.margin: single proportion (between 0 and 1) indicating if extra margins must be added to xlim. If different from 0, add the range of the axis * x.left.extra.margin (e.g., abs(xlim[2] - xlim[1]) * x.left.extra.margin) to the left of x-axis - # x.right.extra.margin: idem as x.left.extra.margin but to the bottom of x-axis - # ylim: 2 numeric values for y-axis range. If NULL, range of y in data1. Order of the 2 values matters (for inverted axis). BEWARE: values of the ylim must be already in the corresponding log if ylog argument is not "no" (see below) - # ylab: a character string or expression for y-axis legend. If NULL, y of the first data frame in data1. Warning message if the elements in y are different between data frames in data1 - # ylog: Either "no" (values in the y argument column of the data1 data frame are not log), "log2" (values in the y argument column of the data1 data frame are log2 transformed) or "log10" (values in the y argument column of the data1 data frame are log10 transformed). BEWARE: do not tranform the data, but just display ticks in a log scale manner. Thus, negative or zero values allowed. BEWARE: not possible to have horizontal bars with a log axis, due to a bug in ggplot2 (see https://github.com/tidyverse/ggplot2/issues/881) - # y.tick.nb: approximate number of desired label values on the y-axis (n argument of the the fun_scale() function) - # y.inter.tick.nb: number of desired secondary ticks between main ticks. Not considered if ylog is other than "no". In that case, play with the ylim and y.tick.nb arguments - # y.top.extra.margin: single proportion (between 0 and 1) indicating if extra margins must be added to ylim. If different from 0, add the range of the axis * y.top.extra.margin (e.g., abs(ylim[2] - ylim[1]) * y.top.extra.margin) to the top of y-axis - # xy.include.zero: logical. Does xlim and ylim range include 0? Ok even if xlog = TRUE or ylog = TRUE because xlim and ylim must already be log transformed values - # text.size: numeric value of the size of the (1) axis numbers and axis legends and (2) texts in the graphic legend - # title: character string of the graph title - # title.text.size: numeric value of the title size (in points) - # show.legend: logical. Show legend? Not considered if categ argument is NULL, because this already generate no legend - # classic: logical. Use the classic theme (article like)? - # grid: logical. Draw horizontal and vertical lines in the background to better read the values? Not considered if classic = FALSE - # raster: logical. Dots in raster mode? If FALSE, dots from each geom_point from geom argument are in vectorial mode (bigger pdf and long to display if millions of dots). If TRUE, dots from each geom_point from geom argument are in matricial mode (smaller pdf and easy display if millions of dots, but long to generate the layer). If TRUE, the plot region will be square to avoid a bug in fun_gg_point_rast(). If TRUE, solve the transparency problem with some GUI. Overriden by vectorial.limit if non NULL - # vectorial.limit: positive integer value indicating the limit of the dot number above which geom_point from geom argument switch from vectorial mode to raster mode (see the raster argument). If any layer is raster, then the region plot will be square to avoid a bug in fun_gg_point_rast(). Inactive the raster argument if non NULL - # return: logical. Return the graph info? - # plot: logical. Plot the graphic? If FALSE and return argument is TRUE, graphical parameters and associated warnings are provided without plotting - # add: character string allowing to add more ggplot2 features (dots, lines, themes, etc.). BEWARE: (1) must start with "+" just after the simple or double opening quote (no space, end of line, carriage return, etc., allowed), (2) must finish with ")" just before the simple or double closing quote (no space, end of line, carriage return, etc., allowed) and (3) each function must be preceded by "ggplot2::" (for instance: "ggplot2::coord_flip()). If the character string contains the "ggplot2::theme" string, then internal ggplot2 theme() and theme_classic() functions will be inactivated to be reused by add. BEWARE: handle this argument with caution since added functions can create conflicts with the preexisting internal ggplot2 functions - # warn.print: logical. Print warnings at the end of the execution? No print if no warning messages - # path.lib: absolute path of the required packages, if not in the default folders - # REQUIRED PACKAGES - # ggplot2 - # if raster plots are drawn (see the raster and vectorial.limit arguments): - # Cairo - # grid - # REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION - # fun_gg_palette() - # fun_gg_point_rast() - # fun_pack() - # fun_check() - # RETURN - # a scatter plot is plot argument is TRUE - # a list of the graph info if return argument is TRUE: - # $data: the graphic info coordinates - # $removed.row.nb: a list of the removed rows numbers in data frames (because of NA). NULL if no row removed - # $removed.rows: a list of the removed rows in data frames (because of NA). NULL if no row removed - # $axes: the x-axis and y-axis info - # $warnings: the warning messages. Use cat() for proper display. NULL if no warning - # EXAMPLES - ## NICE REPRESENTATION - # set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 10, 3), time = rnorm(1000, 10, 3), group1 = rep(c("A1", "A2"), 500)) ; obs2 <-data.frame(km = rnorm(1000, 15, 3), time = rnorm(1000, 15, 3), group2 = rep(c("G1", "G2"), 500)) ; set.seed(NULL) ; obs1$L1$km[2:3] <- NA ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), categ = list(L1 = "group1", L2 = "group2"), legend.name = NULL, color = list(L1 = 4:5, L2 = 7:8), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5), dot.size = 3, line.size = 0.5, xlim = c(1, 25), xlab = "KM", xlog = "no", x.tick.nb = 10, x.inter.tick.nb = 1, x.left.extra.margin = 0, x.right.extra.margin = 0, ylim = c(1, 25), ylab = expression(paste("TIME (", 10^-20, " s)")), ylog = "log10", y.tick.nb = 5, y.top.extra.margin = 0, y.bottom.extra.margin = 0, xy.include.zero = TRUE, classic = TRUE) - ## SINGLE GEOMETRIC LAYER - ### simple example (1) of scatter plot using the classical writting - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time") - ### simple example (2) of scatter plot, identical to (1) but using the list writting. Here, a list of one compartment, systematically named L1, is provided to the data1, x, y, categ, geom and alpha. Contrary to example (1), the geom and alpha argument have to be included because the default value are not lists (if data1 is a list, all the x, y, categ, legend.name, color, geom and alpha must also be list if non NULL) - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = list(L1 = obs1), x = list(L1 = "km"), y = list(L1 = "time"), geom = list(L1 = "geom_point"), alpha = list(L1 = 0.5)) - ### color of dots. Example (1) using the classical writting - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", color = "blue") - ### color of dots. Example (2) using the list writting - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = list(L1 = obs1), x = list(L1 = "km"), y = list(L1 = "time"), color = list(L1 = "blue"), geom = list(L1 = "geom_point"), alpha = list(L1 = 1)) - ### From here, classical writting is use for single element in data1 and list writting otherwise - ### color of dots. Example (3) when dots are in different categories. Note that categ argument controls the legend display - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", categ = "group") - ### color of dots. Example (4) when dots are in different categories. A single color mentionned is applied to all the dots - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", categ = "group", color = "coral") - ### color of dots. Example (5) when dots are in different categories. Numbers can be used if ggplot colors are desired - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", categ = "group", color = 2) - ### color of dots. Example (6) when dots are in different categories, with one color per category (try also color = 2:1) - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", categ = "group", color = c("coral", "green")) - ### color of dots. Example (7) when dots are in different categories, with colors as a data frame column. BEWARE: one color per category must be respected (try also numbers) - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B"), col = rep(c("coral", "green"), each = 3)) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", categ = "group", color = obs1$col) - ### color of dots. Example (8) when dots are in different categories, with colors as a data frame column. Easiest way (ggplot colors) - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", categ = "group", color = as.numeric(obs1$group)) - ### legend name - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", categ = "group", legend.name = "CLASSES") - ### different geom features. Example (1) with geom_line kind of lines - # obs1 <- data.frame(km = c(1, 3, 2, 6, 4, 5), time = c(1, 3, 2, 6, 4, 5)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", geom = "geom_line", categ = "group") - ### different geom features. Example (2) with geom_path kind of lines (see the difference with (1)) - # obs1 <- data.frame(km = c(1, 3, 2, 6, 4, 5), time = c(1, 3, 2, 6, 4, 5)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", geom = "geom_path", categ = "group") - ### different geom features. Example (3) with geom_hline kind of lines. Fake_y y-axis name by default because y argument must be NULL (see ylab argument below to change this) - # obs1 <- data.frame(km = 1:2, time = (1:2)^2, group = c("A", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = NULL, y = "km", geom = "geom_hline", categ = "group", xlim = c(1,10)) - ### different geom features. Example (4) with geom_vline kind of lines. Fake_y y-axis name by default because y argument must be NULL (see ylab argument below to change this) - # obs1 <- data.frame(km = 1:2, time = (1:2)^2, group = c("A", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = NULL, geom = "geom_vline", categ = "group", ylim = c(1,10)) - ## MULTI GEOMETRIC LAYERS - ### Note that in subsequent examples, names of list compartments are systematically referred to as L1, L2, etc., to show the correspondence between the arguments data1, x, y, categ, etc. - ### single layer (as examples above) - # set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1), x = list(L1 = "km"), y = list(L1 = "time"), geom = list(L1 = "geom_point"), alpha = list(L1 = 0.5)) - ### simple example of two layers - # set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5)) - ### color of dots. Example (1) - # set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5), color = list(L1 = "coral", L2 = "green")) - ### color of dots. Example (2) of the legend display. The categ argument must be supplied. Make a fake categorical colum in the data frame if necessary (as in this example). The categ argument triggers the legend display. The legend.name argument is used to remove the legend title of each layer - # set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = "GROUP1") ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = "GROUP2") ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), categ = list(L1 = "group1", L2 = "group2"), legend.name = list(L1 = NULL, L2 = NULL), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5), color = list(L1 = "coral", L2 = "green")) - ### color of dots. Example (3) when dots are in different categories (default colors) - # set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = rep(c("A1", "A2"), each = 500)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = rep(c("G1", "G2"), each = 500)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), , categ = list(L1 = "group1", L2 = "group2"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5)) - ### color of dots. Example (3) when dots are in different categories. A single color mentionned per layer is applied to all the dots of the layer - # set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = rep(c("A1", "A2"), each = 500)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = rep(c("G1", "G2"), each = 500)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), , categ = list(L1 = "group1", L2 = "group2"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5), color = list(L1 = "coral", L2 = "green")) - ### color of dots. Example (5) when dots are in different categories, with one color per category in each layer - # set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = rep(c("A1", "A2"), each = 500)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = rep(c("G1", "G2"), each = 500)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), , categ = list(L1 = "group1", L2 = "group2"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5), color = list(L1 = c("coral", "blue"), L2 = c("green", "black"))) - ### color of dots. Example (4) when dots are in different categories. Numbers can be used if ggplot colors are desired - # set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = rep(c("A1", "A2"), each = 500)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = rep(c("G1", "G2"), each = 500)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), , categ = list(L1 = "group1", L2 = "group2"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5), color = list(L1 = 1:2, L2 = c(4, 7))) - ### color of dots. Example (7) when dots are in different categories, with colors as a data frame column. BEWARE: one color per category must be respected (try also numbers). BEWARE: in color argument, if the column of the data frame does not exist, color can be still displayed (L2 = obs2$notgood is equivalent to L2 = NULL). Such situation is reported in the warning messages (see below) - # set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = rep(c("A1", "A2"), each = 500), col1 = rep(c("coral", "blue"), each = 500)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = rep(c("G1", "G2"), each = 500), col2 = rep(c("green", "black"), each = 500)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), , categ = list(L1 = "group1", L2 = "group2"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5), color = list(L1 = obs1$col1, L2 = obs2$col2)) - ### color of dots. Example (8) when dots are in different categories, with colors as a data frame column. Easiest way is not recommended with mutiple layers - # set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = rep(c("A1", "A2"), each = 500), col1 = rep(c("coral", "blue"), each = 500)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = rep(c("G1", "G2"), each = 500), col2 = rep(c("green", "black"), each = 500)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), , categ = list(L1 = "group1", L2 = "group2"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5), color = list(L1 = as.numeric(obs1$group1), L2 = as.numeric(obs2$group2))) - ### legend name - # set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = rep(c("A1", "A2"), each = 500)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = rep(c("G1", "G2"), each = 500)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), , categ = list(L1 = "group1", L2 = "group2"), legend.name = list(L1 = "CLASS A", L2 = "CLASS G"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5)) - ### different geom features. Example (1) with 5 layers. Note that order in data1 defines the overlay order (from below to above) and the order in the legend (from top to bottom) - # set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = rep(c("A1", "A2"), each = 500)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = rep(c("G1", "G2"), each = 500)) ; set.seed(NULL) ; obs3 <- data.frame(time = c(29, 31), group3 = c("HORIZ.THRESHOLD.1", "HORIZ.THRESHOLD.2")) ; obs4 <- data.frame(km = 26, group4 = "VERTIC.THRESHOLD") ; obs5 <- data.frame(km = seq(1, 100, 0.1), time = 7*seq(1, 100, 0.1)^0.5, group5 = "FUNCTION") ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2, L3 = obs3, L4 = obs4, L5 = obs5), x = list(L1 = "km", L2 = "km", L3 = NULL, L4 = "km", L5 = "km"), y = list(L1 = "time", L2 = "time", L3 = "time", L4 = NULL, L5 = "time"), categ = list(L1 = "group1", L2 = "group2", L3 = "group3", L4 = "group4", L5 = "group5"), geom = list(L1 = "geom_point", L2 = "geom_point", L3 = "geom_hline", L4 = "geom_vline", L5 = "geom_line"), alpha = list(L1 = 0.5, L2 = 0.5, L3 = 0.5, L4 = 0.5, L5 = 0.5), xlim = c(10, 40), ylim = c(10, 40), classic = TRUE, line.size = 0.75) - ### layer transparency. One transparency defined by layer (from 0 invisible to 1 opaque). Note that for lines, transparency in not applied in the legend to prevent a ggplot2 bug (https://github.com/tidyverse/ggplot2/issues/2452) - # set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = rep(c("A1", "A2"), each = 500)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = rep(c("G1", "G2"), each = 500)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), , categ = list(L1 = "group1", L2 = "group2"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 1, L2 = 0.1)) - ### other different example of mutiple geom features are shown in the fun_segmentation function - ## OTHER GRAPHIC ARGUMENTS - ### dot size (line.size argument controls size of lines) - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", dot.size = 5) - ### axis management: examples are shown for x-axis but are identical for y-axis - ### x-axis limits. Example (1) - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", xlim = c(-1, 25)) - ### x-axis limits. Example (2) showing that order matters in ylim argument - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", xlim = c(25, -1)) - ### log scale. Example (1). BEWARE: x column must be log, otherwise incoherent scale (see below warning message with the return argument) - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", xlog = "log10") - ### log scale. Example (2). BEWARE: values of the xlim must be in the corresponding log - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", xlog = "log10", xlim = c(1, 10)) - ### tick number. Example (1). Note that the final number shown is approximate - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", x.tick.nb = 6) - ### tick number. Example (2) using a log2 scale - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", xlog = "log2", x.tick.nb = 6) - ### tick number. Example (3) using a log10 scale - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", xlog = "log10", x.tick.nb = 6) - ### tick number. Example (4) using a log10 scale: the reverse x-axis correctly deal with log10 scale - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", xlog = "log10", xlim = c(7, 2)) - ### secondary tick number. Example (1) - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", x.inter.tick.nb = 4) - ### secondary ticks. Example (2) not for log2 and log10 scales (see below warning message with the return argument) - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", xlog = "log10", x.inter.tick.nb = 4) - ### extra margins. To avoid dot cuts - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", x.left.extra.margin = 0.25, x.right.extra.margin = 0.25) - ### include zero in both the x-axis and y-xis - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", xy.include.zero = TRUE) - ### graph title, text size and legend display - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", categ = "group", text.size = 8, title = "GRAPH1", title.text.size = 16, show.legend = TRUE) - ### raster display. This switchs from vectorial mode to raster mode. The display can takes some time, but this is easier to export and handle than vectorial display - # set.seed(1) ; obs1 <- data.frame(km = rnorm(100000, 22, 3), time = rnorm(100000, 22, 3)) ; set.seed(NULL) ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", raster = TRUE) - ### classic representation (use grid = TRUE to display the background lines of the y axis ticks) - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", classic = TRUE, grid = FALSE) - ### graphic info. Example (1) - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", return = TRUE) - ### graphic info. Example (2) of assignation and warning message display - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; output <- fun_gg_scatter(data1 = obs1, x = "km", y = "time", xlog = "log10", return = TRUE) ; cat(output$warnings) - ### add ggplot2 functions - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", add = "+ggplot2::theme_classic()") - ### all the arguments - # set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 10, 3), time = rnorm(1000, 10, 3), group1 = rep(c("A1", "A2"), 500)) ; obs2 <-data.frame(km = rnorm(1000, 15, 3), time = rnorm(1000, 15, 3), group2 = rep(c("G1", "G2"), 500)) ; set.seed(NULL) ; obs1$L1$km[2:3] <- NA ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), categ = list(L1 = "group1", L2 = "group2"), legend.name = NULL, color = list(L1 = 4:5, L2 = 7:8), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5), dot.size = 3, line.size = 0.5, xlim = c(1, 25), xlab = "KM", xlog = "no", x.tick.nb = 10, x.inter.tick.nb = 1, x.left.extra.margin = 0, x.right.extra.margin = 0, ylim = c(1, 25), ylab = "TIME (s)", ylog = "log10", y.tick.nb = 5, y.inter.tick.nb = NULL, y.top.extra.margin = 0, y.bottom.extra.margin = 0, xy.include.zero = TRUE, text.size = 12, title = "", title.text.size = 8, show.legend = TRUE, classic = FALSE, grid = FALSE, raster = FALSE, vectorial.limit = NULL, return = FALSE, plot = TRUE, add = NULL, warn.print = TRUE, path.lib = NULL) - # DEBUGGING - # set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 10, 3), time = rnorm(1000, 10, 3), group1 = rep(c("A1", "A2"), 500)) ; obs2 <-data.frame(km = rnorm(1000, 15, 3), time = rnorm(1000, 15, 3), group2 = rep(c("G1", "G2"), 500)) ; set.seed(NULL) ; obs1$L1$km[2:3] <- NA ; data1 = list(L1 = obs1, L2 = obs2) ; x = list(L1 = "km", L2 = "km") ; y = list(L1 = "time", L2 = "time") ; categ = list(L1 = "group1", L2 = "group2") ; legend.name = NULL ; color = list(L1 = 4:5, L2 = 7:8) ; geom = list(L1 = "geom_point", L2 = "geom_point") ; alpha = list(L1 = 0.5, L2 = 0.5) ; dot.size = 3 ; line.size = 0.5 ; xlim = c(25, 0) ; xlab = "KM" ; xlog = "no" ; x.tick.nb = 10 ; x.inter.tick.nb = 1 ; x.left.extra.margin = 0 ; x.right.extra.margin = 0 ; ylim = c(1, 25) ; ylab = "TIME (s)" ; ylog = "log2" ; y.tick.nb = 5 ; y.inter.tick.nb = 2 ; y.top.extra.margin = 0 ; y.bottom.extra.margin = 0 ; xy.include.zero = TRUE ; text.size = 12 ; title = "" ; title.text.size = 8 ; show.legend = TRUE ; classic = FALSE ; grid = FALSE ; raster = FALSE ; vectorial.limit = NULL ; return = FALSE ; plot = TRUE ; add = NULL ; warn.print = TRUE ; path.lib = NULL - # data1 <- list(L1 = data.frame(a = 1:6, b = (1:6)^2, group = c("A", "A", "A", "B", "B", "B")), L2 = data.frame(a = (1:6)*2, b = ((1:6)^2)*2, group = c("A1", "A1", "A1", "B1", "B1", "B1")), L3 = data.frame(a = (1:6)*3, b = ((1:6)^2)*3, group3 = c("A4", "A5", "A6", "A7", "B4", "B5"))) ; data1$L1$a[3] <- NA ; data1$L1$group[5] <- NA ; data1$L3$group3[4] <- NA ; x = list(L1 = names(data1$L1)[1], L2 = names(data1$L2)[1], L3 = NULL) ; y = list(L1 = names(data1$L1)[2], L2 = names(data1$L2)[2], L3 = "a") ; categ = list(L1 = "group", L2 = NULL, L3 = NULL) ; legend.name = NULL ; color = NULL ; geom = list(L1 = "geom_point", L2 = "geom_point", L3 = "geom_hline") ; alpha = list(L1 = 0.5, L2 = 0.5, L3 = 0.5) ; dot.size = 1 ; line.size = 0.5 ; xlim = c(14, 4) ; xlab = NULL ; xlog = "log10" ; x.tick.nb = 10 ; x.inter.tick.nb = 4 ; x.left.extra.margin = 0 ; x.right.extra.margin = 0 ; ylim = c(60, 5) ; ylab = NULL ; ylog = "log10" ; y.tick.nb = 10 ; y.inter.tick.nb = 2 ; y.top.extra.margin = 0 ; y.bottom.extra.margin = 0 ; xy.include.zero = FALSE ; text.size = 12 ; title = "" ; title.text.size = 8 ; show.legend = TRUE ; classic = FALSE ; grid = FALSE ; raster = FALSE ; vectorial.limit = NULL ; return = FALSE ; plot = TRUE ; add = NULL ; warn.print = TRUE ; path.lib = NULL - # data1 <- data.frame(km = 1:2, time = (1:2)^2, group = c("A", "B")) ; data1 ; x = NULL; y = "km"; categ = "group"; legend.name = NULL ; color = NULL ; geom = "geom_hline"; alpha = 0.5 ; dot.size = 1 ; line.size = 0.5 ; xlim = c(1,10) ; xlab = NULL ; xlog = "log10" ; x.tick.nb = 10 ; x.inter.tick.nb = 4 ; x.left.extra.margin = 0 ; x.right.extra.margin = 0 ; ylim = NULL ; ylab = expression(paste("TIME (", 10^-20, " s)")) ; ylog = "log10" ; y.tick.nb = 10 ; y.inter.tick.nb = 2 ; y.top.extra.margin = 0 ; y.bottom.extra.margin = 0 ; xy.include.zero = FALSE ; text.size = 12 ; title = "" ; title.text.size = 8 ; show.legend = TRUE ; classic = FALSE ; grid = FALSE ; raster = FALSE ; vectorial.limit = NULL ; return = FALSE ; plot = TRUE ; add = NULL ; warn.print = TRUE ; path.lib = NULL - # function name - function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") - # end function name - # required function checking - if(length(find("fun_gg_palette", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_gg_palette() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - if(length(find("fun_gg_point_rast", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_gg_point_rast() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - if(length(find("fun_pack", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_pack() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - if(length(find("fun_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # reserved words to avoid bugs (used in this function) - reserved.words <- c("fake_x", "fake_y", "fake_categ", "color") - # end reserved words to avoid bugs (used in this function) - # check list lengths (and names of data1 compartments if non name present) - warning <- NULL - if(all(class(data1) == "list")){ - if(length(data1) > 6){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": data1 ARGUMENT MUST BE A LIST OF 6 DATA FRAMES MAXIMUM (6 OVERLAYS MAX)\n\n================\n\n") - stop(tempo.cat) - } - if(is.null(names(data1))){ - names(data1) <- paste0("L", 1:length(data1)) - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": NULL NAME COMPARTMENT OF data1 LIST -> NAMES RESPECTIVELY ATTRIBUTED TO EACH COMPARTMENT:\n", paste(names(data1), collapse = " ")) - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - if( ! is.null(x)){ - if( ! (all(class(x) == "list") & length(data1) == length(x))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": x ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST\n\n================\n\n") - stop(tempo.cat) - } - }else{ - x <- vector("list", length(data1)) - } - if( ! is.null(y)){ - if( ! (all(class(y) == "list") & length(data1) == length(y))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": y ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST\n\n================\n\n") - stop(tempo.cat) - } - }else{ - y <- vector("list", length(data1)) - } - if( ! is.null(categ)){ - if( ! (all(class(categ) == "list") & length(data1) == length(categ))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": categ ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST\n\n================\n\n") - stop(tempo.cat) - } - } - if( ! is.null(legend.name)){ - if( ! (all(class(legend.name) == "list") & length(data1) == length(legend.name))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": legend.name ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST\n\n================\n\n") - stop(tempo.cat) - } - } - if( ! is.null(color)){ - if( ! (all(class(color) == "list") & length(data1) == length(color))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": color ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST\n\n================\n\n") - stop(tempo.cat) - } - } - if( ! (all(class(geom) == "list") & length(data1) == length(geom))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": geom ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST\n\n================\n\n") - stop(tempo.cat) - } - if( ! (all(class(alpha) == "list") & length(data1) == length(alpha))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": alpha ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST\n\n================\n\n") - stop(tempo.cat) - } - } - # end check list lengths (and names of data1 compartments if non name present) - # conversion into lists - if(all(is.data.frame(data1))){ - data1 <- list(L1 = data1) - if(all(class(x) == "list")){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": x ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME\n\n================\n\n") - stop(tempo.cat) - }else{ - x <- list(L1 = x) - } - if(all(class(y) == "list")){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": y ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME\n\n================\n\n") - stop(tempo.cat) - }else{ - y <- list(L1 = y) - } - if( ! is.null(categ)){ - if(all(class(categ) == "list")){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": categ ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME\n\n================\n\n") - stop(tempo.cat) - }else{ - categ <- list(L1 = categ) - } - } - if( ! is.null(legend.name)){ - if(all(class(legend.name) == "list")){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": legend.name ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME\n\n================\n\n") - stop(tempo.cat) - }else{ - legend.name <- list(L1 = legend.name) - } - } - if( ! is.null(color)){ - if(all(class(color) == "list")){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": color ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME\n\n================\n\n") - stop(tempo.cat) - }else{ - color <- list(L1 = color) - } - } - if(all(class(geom) == "list")){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": geom ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME\n\n================\n\n") - stop(tempo.cat) - }else{ - geom <- list(L1 = geom) - } - if(all(class(alpha) == "list")){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": alpha ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME\n\n================\n\n") - stop(tempo.cat) - }else{ - alpha <- list(L1 = alpha) - } - } - # end conversion into lists - # legend name filling - if(is.null(legend.name) & ! is.null(categ)){ - legend.name <- categ - }else if(is.null(legend.name) & is.null(categ)){ - legend.name <- vector("list", length(data1)) # null list - } - # end legend name filling - # ini categ for legend display - fin.lg.disp <- vector("list", 6) # will be used at the end to display or not legends - fin.lg.disp[] <- FALSE - legend.disp <- vector("list", length(data1)) - if(is.null(categ) | show.legend == FALSE){ - legend.disp[] <- FALSE - }else{ - for(i2 in 1:length(data1)){ - if(is.null(categ[[i2]])){ - legend.disp[[i2]] <- FALSE - }else{ - legend.disp[[i2]] <- TRUE - } - } - } - # end ini categ for legend display - # integer colors into gg_palette - tempo.check.color <- NULL - for(i1 in 1:length(data1)){ - if(any(is.na(color[[i1]]))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ": color ARGUMENT CANNOT CONTAIN NA\n\n================\n\n") - stop(tempo.cat) - } - tempo.check.color <- c(tempo.check.color, fun_check(data = color[[i1]], data.name = ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), class = "integer", double.as.integer.allowed = TRUE, na.contain = TRUE, fun.name = function.name, print = FALSE)$problem) - } - tempo.check.color <- ! tempo.check.color # invert TRUE and FALSE because if integer, then problem = FALSE - if(any(tempo.check.color == TRUE)){ # convert integers into colors - tempo.integer <- unlist(color[tempo.check.color]) - tempo.color <- fun_gg_palette(max(tempo.integer, na.rm = TRUE)) - for(i1 in 1:length(data1)){ - if(tempo.check.color[i1] == TRUE){ - color[[i1]] <-tempo.color[color[[i1]]] - } - } - } - # end integer colors into gg_palette - # argument checking - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - compart.null.color <- 0 # will be used to attribute a color when color is non NULL but a compartment of color is NULL - data1.ini <- data1 # to report NA removal - removed.row.nb <- vector("list", length = length(data1)) # to report NA removal - removed.rows <- vector("list", length = length(data1)) # to report NA removal - for(i1 in 1:length(data1)){ - tempo <- fun_check(data = data1[[i1]], data.name = ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), class = "data.frame", na.contain = TRUE, fun.name = function.name) ; eval(ee) - # reserved word checking - if(any(names(data1[[i1]]) %in% reserved.words)){ # I do not use fun_name_change() because cannot control y before creating "fake_y". But ok because reserved are not that common - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": COLUMN NAMES OF ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), " ARGUMENT CANNOT BE ONE OF THESE WORDS\n", paste(reserved.words, collapse = " "), "\nTHESE ARE RESERVED FOR THE ", function.name, " FUNCTION\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - # end reserved word checking - # check of geom now because required for y argument - tempo <- fun_check(data = geom[[i1]], data.name = ifelse(length(geom) == 1, "geom", paste0("geom NUMBER ", i1)), options = c("geom_point", "geom_line", "geom_path", "geom_hline", "geom_vline"), length = 1, fun.name = function.name) ; eval(ee) - # end check of geom now because required for y argument - if(is.null(x[[i1]])){ - if(all(geom[[i1]] != "geom_hline")){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(x) == 1, "x", paste0("x NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ": x ARGUMENT CANNOT BE NULL EXCEPT IF ", ifelse(length(geom) == 1, "x", paste0("geom NUMBER ", i1)), " ARGUMENT IS \"geom_hline\"\nHERE geom ARGUMENT IS: ", paste(geom[[i1]], collapse = " "), "\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - }else{ - x[[i1]] <- "fake_x" - data1[[i1]] <- cbind(data1[[i1]], fake_x = NA) - data1[[i1]][, "fake_x"] <- as.numeric(data1[[i1]][, "fake_x"]) - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": NULL ", ifelse(length(x) == 1, "x", paste0("x NUMBER ", i1)), " ARGUMENT ASSOCIATED TO ", ifelse(length(geom) == 1, "geom", paste0("geom NUMBER ", i1)), " ARGUMENT ", geom[[i1]], " -> FAKE COLUMN ADDED TO DATA FRAME ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ", NAMED \"fake_x\" FOR FINAL DRAWING") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - }else{ - if(all(geom[[i1]] == "geom_hline")){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(x) == 1, "x", paste0("x NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ": x ARGUMENT MUST BE NULL IF ", ifelse(length(geom) == 1, "geom", paste0("geom NUMBER ", i1)), " ARGUMENT IS \"geom_hline\"\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - tempo <- fun_check(data = x[[i1]], data.name = ifelse(length(x) == 1, "x", paste0("x NUMBER ", i1)), class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) - } - if(is.null(y[[i1]])){ - if(all(geom[[i1]] != "geom_vline")){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(y) == 1, "y", paste0("y NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ": y ARGUMENT CANNOT BE NULL EXCEPT IF ", ifelse(length(geom) == 1, "y", paste0("geom NUMBER ", i1)), " ARGUMENT IS \"geom_vline\"\nHERE geom ARGUMENT IS: ", paste(geom[[i1]], collapse = " "), "\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - }else{ - y[[i1]] <- "fake_y" - data1[[i1]] <- cbind(data1[[i1]], fake_y = NA) - data1[[i1]][, "fake_y"] <- as.numeric(data1[[i1]][, "fake_y"]) - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": NULL ", ifelse(length(y) == 1, "y", paste0("y NUMBER ", i1)), " ARGUMENT ASSOCIATED TO ", ifelse(length(geom) == 1, "geom", paste0("geom NUMBER ", i1)), " ARGUMENT ", geom[[i1]], " -> FAKE COLUMN ADDED TO DATA FRAME ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ", NAMED \"fake_y\" FOR FINAL DRAWING") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - }else{ - if(all(geom[[i1]] == "geom_vline")){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(y) == 1, "y", paste0("y NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ": y ARGUMENT MUST BE NULL IF ", ifelse(length(geom) == 1, "geom", paste0("geom NUMBER ", i1)), " ARGUMENT IS \"geom_vline\"\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - tempo <- fun_check(data = y[[i1]], data.name = ifelse(length(y) == 1, "y", paste0("y NUMBER ", i1)), class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) - } - if( ! (x[[i1]] %in% names(data1[[i1]]))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(x) == 1, "x", paste0("x NUMBER ", i1)), " ARGUMENT MUST BE A COLUMN NAME OF ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), "\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - if( ! (y[[i1]] %in% names(data1[[i1]]))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(y) == 1, "y", paste0("y NUMBER ", i1)), " ARGUMENT MUST BE A COLUMN NAME OF ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), "\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - # na detection and removal (done now to be sure of the correct length of categ) - if(x[[i1]] == "fake_x" & y[[i1]] == "fake_y"){ # because the code cannot accept to be both "fake_x" and "fake_y" at the same time - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 2\nTHE CODE CANNOT ACCEPT x AND y TO BE \"fake_x\" AND \"fake_y\" IN THE SAME DATA FRAME ", i1, " \n\n============\n\n")) - stop(tempo.cat) - } - if(any(is.na(data1[[i1]][, c(if(x[[i1]] == "fake_x"){NULL}else{x[[i1]]}, if(y[[i1]] == "fake_y"){NULL}else{y[[i1]]})]))){ - tempo.removed.row.nb <- unlist(lapply(lapply(c(data1[[i1]][c(if(x[[i1]] == "fake_x"){NULL}else{x[[i1]]}, if(y[[i1]] == "fake_y"){NULL}else{y[[i1]]})]), FUN = is.na), FUN = which)) - removed.row.nb[[i1]] <- c(removed.row.nb[[i1]], tempo.removed.row.nb) - # report of removed rows will be performed at the very end - data1[[i1]] <- data1[[i1]][-tempo.removed.row.nb, ] - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": NA DETECTED IN COLUMN ", if(x[[i1]] == "fake_x"){""}else{ifelse(length(x) == 1, "x", paste0("x NUMBER ", i1))}, if(x[[i1]] != "fake_x" & y[[i1]] != "fake_y"){" AND "}, if(y[[i1]] == "fake_y"){""}else{ifelse(length(y) == 1, "y", paste0("y NUMBER ", i1))}, " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ". CORRESPONDING ROWS HAVE BEEN REMOVED (SEE $removed.row.nb AND $removed.rows)") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - # end na detection and removal (done now to be sure of the correct length of categ) - tempo <- fun_check(data = data1[[i1]][, x[[i1]]], data.name = ifelse(length(x) == 1, "x OF data1", paste0("x NUMBER ", i1, " OF data1 NUMBER ", i1)), class = "vector", mode = "numeric", na.contain = ifelse(x[[i1]] == "fake_x", TRUE, FALSE), fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = data1[[i1]][, y[[i1]]], data.name = ifelse(length(y) == 1, "y OF data1", paste0("y NUMBER ", i1, " OF data1 NUMBER ", i1)), class = "vector", mode = "numeric", na.contain = ifelse(y[[i1]] == "fake_y", TRUE, FALSE), fun.name = function.name) ; eval(ee) - if(( ! is.null(categ)) & ( ! is.null(categ[[i1]]))){ # if categ[[i1]] = NULL, fake_categ will be created later on - tempo <- fun_check(data = categ[[i1]], data.name = ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)),, class = "vector", mode = "character", length = 1, fun.name = function.name) - if( ! (categ[[i1]] %in% names(data1[[i1]]))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " ARGUMENT MUST BE A COLUMN NAME OF ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), "\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - # na detection and removal (done now to be sure of the correct length of categ) - if(any(is.na(data1[[i1]][, categ[[i1]]]))){ - tempo.removed.row.nb <- unlist(lapply(lapply(c(data1[[i1]][categ[[i1]]]), FUN = is.na), FUN = which)) - removed.row.nb[[i1]] <- c(removed.row.nb[[i1]], tempo.removed.row.nb) - # report of removed rows will be performed at the very end - data1[[i1]] <- data1[[i1]][-tempo.removed.row.nb, ] - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": IN ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ", THE CATEGORY COLUMN:\n", paste(categ[[i1]], collapse = " "), "\nCONTAINS NA") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - # end na detection and removal (done now to be sure of the correct length of categ) - tempo1 <- fun_check(data = data1[[i1]][, categ[[i1]]], data.name = ifelse(length(categ) == 1, "categ OF data1", paste0("categ NUMBER ", i1, " OF data1 NUMBER ", i1)), class = "vector", mode = "character", na.contain = FALSE, fun.name = function.name, print = FALSE) - tempo2 <- fun_check(data = data1[[i1]][, categ[[i1]]], data.name = ifelse(length(categ) == 1, "categ OF data1", paste0("categ NUMBER ", i1, " OF data1 NUMBER ", i1)), class = "factor", na.contain = FALSE, fun.name = function.name, print = FALSE) - if(tempo1$problem == TRUE & tempo2$problem == TRUE){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(categ) == 1, "categ OF data1", paste0("categ NUMBER ", i1, " OF data1 NUMBER ", i1)), " MUST BE A FACTOR OR CHARACTER VECTOR\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - }else if(tempo1$problem == FALSE){ - data1[[i1]][, categ[[i1]]] <- factor(data1[[i1]][, categ[[i1]]]) # if already a factor, change nothing, if characters, levels according to alphabetical order - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": IN ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ", THE CHARACTER COLUMN HAS BEEN CONVERTED TO FACTOR") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - - } - if(geom[[i1]] == "geom_vline" | geom[[i1]] == "geom_hline"){ - if(length(unique(data1[[i1]][, categ[[i1]]])) != nrow(data1[[i1]])){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(geom) == 1, "geom OF data1", paste0("geom NUMBER ", i1, " OF data1 NUMBER ", i1)), " ARGUMENT IS ", geom[[i1]], ", MEANING THAT ", ifelse(length(categ) == 1, "categ OF data1", paste0("categ NUMBER ", i1, " OF data1 NUMBER ", i1)), " MUST HAVE A DIFFERENT CLASS PER LINE OF data1 (ONE x VALUE PER CLASS)\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - } - }else if(( ! is.null(categ)) & is.null(categ[[i1]])){ # if categ[[i1]] = NULL, fake_categ will be created. BEWARE: is.null(categ[[i1]]) means no legend display (see above), because categ has not been precised. This also means a single color for data1[[i1]] - if(length(color[[i1]]) > 1){ # 0 means is.null(color[[i1]]) and 1 is ok -> single color for data1[[i1]] - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": NULL ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " ARGUMENT BUT CORRESPONDING COLORS IN ", ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " HAS LENGTH OVER 1\n", paste(color[[i1]], collapse = " "), "\nWHICH IS NOT COMPATIBLE WITH NULL CATEG -> COLOR RESET TO A SINGLE COLOR") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - color[[i1]] <- NULL # will provide a single color below - } - categ[[i1]] <- "fake_categ" - data1[[i1]] <- cbind(data1[[i1]], fake_categ = "") - # inactivated because give a different color to different "Line_" categ while a single color for all the data1[[i1]] required. Thus, put back after the color management - # if(geom[[i1]] == "geom_hline" | geom[[i1]] == "geom_vline"){ - # data1[[i1]][, "fake_categ"] <- paste0("Line_", 1:nrow(data1[[i1]])) - # }else{ - data1[[i1]][, "fake_categ"] <- data1[[i1]][, "fake_categ"] # as.numeric("") create a vector of NA but class numeric - # } - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": NULL ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " ARGUMENT -> FAKE COLUMN ADDED TO DATA FRAME ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ", NAMED \"fake_categ\" FOR FINAL DRAWING") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - if( ! is.null(legend.name[[i1]])){ - tempo <- fun_check(data = legend.name[[i1]], data.name = ifelse(length(legend.name) == 1, "legend.name", paste0("legend.name NUMBER ", i1)),, class = "vector", mode = "character", length = 1, fun.name = function.name) - } - if( ! is.null(color)){ # if color is NULL, will be filled later on - # check the nature of color - if(is.null(color[[i1]])){ - compart.null.color <- compart.null.color + 1 - color[[i1]] <- grey(compart.null.color / 8) # cannot be more than 7 overlays. Thus 7 different greys. 8/8 is excluded because white dots - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": NULL COLOR IN ", ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ", SINGLE COLOR ", paste(color[[i1]], collapse = " "), " HAS BEEN ATTRIBUTED") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - tempo1 <- fun_check(data = color[[i1]], data.name = ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name, print = FALSE) - tempo2 <- fun_check(data = color[[i1]], data.name = ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), class = "factor", na.contain = TRUE, fun.name = function.name, print = FALSE) - if(tempo1$problem == TRUE & tempo2$problem == TRUE){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " MUST BE A FACTOR OR CHARACTER VECTOR OR INTEGER VECTOR\n\n================\n\n") # integer possible because dealt above - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - }else if( ! (all(color[[i1]] %in% colors() | grepl(pattern = "^#", color[[i1]])))){ # check that all strings of low.color start by # - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " ARGUMENT MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # AND/OR COLOR NAMES GIVEN BY colors(): ", paste(unique(color[[i1]]), collapse = " "), "\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - if(any(is.na(color[[i1]]))){ - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": IN ", ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ", THE COLORS:\n", paste(unique(color[[i1]]), collapse = " "), "\nCONTAINS NA") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - # end check the nature of color - # check the length of color - if(is.null(categ) & length(color[[i1]]) != 1){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " ARGUMENT MUST BE A SINGLE COLOR IF categ IS NULL\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - }else if( ! is.null(categ)){ - # No problem of NA management by ggplot2 because already removed - if(categ[[i1]] == "fake_categ" & length(color[[i1]]) != 1){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " ARGUMENT MUST BE A SINGLE COLOR IF ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " IS NULL\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - }else if(length(color[[i1]]) == length(unique(data1[[i1]][, categ[[i1]]]))){ # here length(color) is equal to the different number of categ - data1[[i1]][, categ[[i1]]] <- factor(data1[[i1]][, categ[[i1]]]) # if already a factor, change nothing, if characters, levels according to alphabetical order - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": IN ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ", THE FOLLOWING COLORS:\n", paste(color[[i1]], collapse = " "), "\nHAVE BEEN ATTRIBUTED TO THESE CLASSES:\n", paste(levels(factor(data1[[i1]][, categ[[i1]]])), collapse = " ")) - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - }else if(length(color[[i1]]) == length(data1[[i1]][, categ[[i1]]])){# here length(color) is equal to nrow(data1[[i1]]) -> Modif to have length(color) equal to the different number of categ (length(color) == length(levels(data1[[i1]][, categ[[i1]]]))) - data1[[i1]] <- cbind(data1[[i1]], color = color[[i1]]) - tempo.check <- unique(data1[[i1]][ , c(categ[[i1]], "color")]) - if( ! (nrow(data1[[i1]]) == length(color[[i1]]) & nrow(tempo.check) == length(unique(data1[[i1]][ , categ[[i1]]])))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " ARGUMENT HAS THE LENGTH OF ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), " COLUMN VALUES\nBUT IS INCORRECTLY ASSOCIATED TO EACH CLASS OF THIS categ:\n", paste(unique(mapply(FUN = "paste", data1[[i1]][ ,categ[[i1]]], data1[[i1]][ ,"color"])), collapse = "\n"), "\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - }else{ - data1[[i1]][, categ[[i1]]] <- factor(data1[[i1]][, categ[[i1]]]) # if already a factor, change nothing, if characters, levels according to alphabetical order - color[[i1]] <- unique(color[[i1]][order(data1[[i1]][, categ[[i1]]])]) # Modif to have length(color) equal to the different number of categ (length(color) == length(levels(data1[[i1]][, categ[[i1]]]))) - tempo.warning <- paste0(ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " ARGUMENT HAS THE LENGTH OF ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), " COLUMN VALUES\nCOLORS HAVE BEEN RESPECTIVELY ASSOCIATED TO EACH CLASS OF categ AS:\n", paste(levels(factor(data1[[i1]][, categ[[i1]]])), collapse = " "), "\n", paste(color[[i1]], collapse = " ")) - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - }else if(length(color[[i1]]) == 1){ - data1[[i1]][, categ[[i1]]] <- factor(data1[[i1]][, categ[[i1]]]) # if already a factor, change nothing, if characters, levels according to alphabetical order - color[[i1]] <- rep(color[[i1]], length(levels(data1[[i1]][, categ[[i1]]]))) - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": IN ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ", COLOR HAS LENGTH 1 MEANING THAT ALL THE DIFFERENT CLASSES OF ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), "\n", paste(levels(factor(data1[[i1]][, categ[[i1]]])), collapse = " "), "\nWILL HAVE THE SAME COLOR\n", paste(color[[i1]], collapse = " ")) - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - }else{ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " ARGUMENT MUST BE (1) LENGTH 1, OR (2) THE LENGTH OF ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), " COLUMN VALUES, OR (3) THE LENGTH OF THE CLASSES IN THIS COLUMN. HERE IT IS COLOR LENGTH ", length(color[[i1]]), " VERSUS CATEG LENGTH ", length(data1[[i1]][, categ[[i1]]]), " AND CATEG CLASS LENGTH ", length(unique(data1[[i1]][, categ[[i1]]])), "\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - } - } - if((geom[[i1]] == "geom_hline" | geom[[i1]] == "geom_vline") & ! is.null(categ[[i1]])){ # add here after the color management, to deal with the different lines to plot inside any data[[i1]] - if(categ[[i1]] == "fake_categ"){ - data1[[i1]][, "fake_categ"] <- paste0("Line_", 1:nrow(data1[[i1]])) - } - } - tempo <- fun_check(data = alpha[[i1]], data.name = ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) - } - if(length(data1) > 1){ - if(length(unique(unlist(x))) > 1){ - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": THE x ARGUMENT DOES NOT CONTAIN IDENTICAL COLUMN NAMES:\n", paste(unlist(x), collapse = " "), "\nX-AXIS OVERLAYING DIFFERENT VARIABLES?") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - } - if(length(data1) > 1){ - if(length(unique(unlist(y))) > 1){ - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": THE y ARGUMENT DOES NOT CONTAIN IDENTICAL COLUMN NAMES:\n", paste(unlist(y), collapse = " "), "\nY-AXIS OVERLAYING DIFFERENT VARIABLES?") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - } - if(sum(geom %in% "geom_point") > 3){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": geom ARGUMENT CANNOT HAVE MORE THAN FOUR \"geom_point\" ELEMENTS\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - }else if(length(geom) - sum(geom %in% "geom_point") > 3){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": geom ARGUMENT CANNOT HAVE MORE THAN THREE LINE ELEMENTS\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - tempo <- fun_check(data = dot.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = line.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - if( ! is.null(xlim)){ - tempo <- fun_check(data = xlim, class = "vector", mode = "numeric", length = 2, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & any(xlim %in% c(Inf, -Inf))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": xlim ARGUMENT CANNOT CONTAIN -Inf OR Inf VALUES\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - } - if( ! is.null(xlab)){ - if(all(class(xlab) %in% "expression")){ # to deal with math symbols - tempo <- fun_check(data = xlab, class = "expression", length = 1, fun.name = function.name) ; eval(ee) - }else{ - tempo <- fun_check(data = xlab, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) - } - } - tempo <- fun_check(data = xlog, options = c("no", "log2", "log10"), length = 1, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & xlog != "no"){ - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": xlog ARGUMENT SET TO ", xlog, ".\nVALUES FROM THE x ARGUMENT COLUMN OF THE data1 DATA FRAME MUST BE ALREADY ", toupper(xlog), " TRANSFORMED, AS THE xlog ARGUMENT JUST MODIFIES THE AXIS SCALE") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - if( ! is.null(xlim)){ - if(any(xlim <= 0)){ - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": xlim ARGUMENT CAN SPAN ZERO OR NEGATIVE VALUES IF xlog ARGUMENT IS SET TO ", xlog, " BECAUSE THIS LATTER ARGUMENT DOES NOT TRANSFORM DATA, JUST MODIFIES THE AXIS SCALE") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - }else if(any( ! is.finite(if(xlog == "log10"){10^xlim}else{2^xlim}))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": xlim ARGUMENT RETURNS INF WITH THE xlog ARGUMENT SET TO ", xlog, "\nAS SCALE COMPUTATION IS ", ifelse(xlog == "log10", 10, 2), "^xlim:\n", paste(ifelse(xlog == "log10", 10, 2)^xlim, collapse = " "), "\nARE YOU SURE THAT xlim ARGUMENT HAS BEEN SPECIFIED WITH VALUES ALREADY IN LOG SCALE?\n", paste(xlim, collapse = " "), "\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - } - } - if( ! is.null(x.tick.nb)){ - tempo <- fun_check(data = x.tick.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & x.tick.nb < 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": x.tick.nb ARGUMENT MUST BE A NON NULL POSITIVE INTEGER\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - } - if( ! is.null(x.inter.tick.nb)){ - tempo <- fun_check(data = x.inter.tick.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & x.inter.tick.nb < 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": x.inter.tick.nb ARGUMENT MUST BE A NON NULL POSITIVE INTEGER\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - } - tempo <- fun_check(data = x.left.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = x.right.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) - if( ! is.null(ylim)){ - tempo <- fun_check(data = ylim, class = "vector", mode = "numeric", length = 2, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & any(ylim %in% c(Inf, -Inf))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ylim ARGUMENT CANNOT CONTAIN -Inf OR Inf VALUES\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - } - if( ! is.null(ylab)){ - if(all(class(ylab) %in% "expression")){ # to deal with math symbols - tempo <- fun_check(data = ylab, class = "expression", length = 1, fun.name = function.name) ; eval(ee) - }else{ - tempo <- fun_check(data = ylab, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) - } - } - tempo <- fun_check(data = ylog, options = c("no", "log2", "log10"), length = 1, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & ylog != "no"){ - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": ylog ARGUMENT SET TO ", ylog, ".\nVALUES FROM THE y ARGUMENT COLUMN OF THE data1 DATA FRAME MUST BE ALREADY ", toupper(ylog), " TRANSFORMED, AS THE ylog ARGUMENT JUST MODIFIES THE AXIS SCALE") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - if( ! is.null(ylim)){ - if(any(ylim <= 0)){ - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": ylim ARGUMENT CAN SPAN ZERO OR NEGATIVE VALUES IF ylog ARGUMENT IS SET TO ", ylog, " BECAUSE THIS LATTER ARGUMENT DOES NOT TRANSFORM DATA, JUST MODIFIES THE AXIS SCALE") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - }else if(any( ! is.finite(if(ylog == "log10"){10^ylim}else{2^ylim}))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ylim ARGUMENT RETURNS INF WITH THE ylog ARGUMENT SET TO ", ylog, "\nAS SCALE COMPUTATION IS ", ifelse(ylog == "log10", 10, 2), "^ylim:\n", paste(ifelse(ylog == "log10", 10, 2)^ylim, collapse = " "), "\nARE YOU SURE THAT ylim ARGUMENT HAS BEEN SPECIFIED WITH VALUES ALREADY IN LOG SCALE?\n", paste(ylim, collapse = " "), "\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - } - } - if( ! is.null(y.tick.nb)){ - tempo <- fun_check(data = y.tick.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & y.tick.nb < 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": y.tick.nb ARGUMENT MUST BE A NON NULL POSITIVE INTEGER\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - } - if( ! is.null(y.inter.tick.nb)){ - tempo <- fun_check(data = y.inter.tick.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & y.inter.tick.nb < 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": y.inter.tick.nb ARGUMENT MUST BE A NON NULL POSITIVE INTEGER\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - } - tempo <- fun_check(data = y.top.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = y.bottom.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = xy.include.zero, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) - # inactivated because xlim and ylim already log transformed - # if(tempo$problem == FALSE & ylog == TRUE & xy.include.zero == TRUE){ - #tempo.warning <- paste0("FROM FUNCTION ", function.name, ": BOTH ylog AND xy.include.zero ARGUMENTS SET TO TRUE -> xy.include.zero ARGUMENT RESET TO FALSE") - # warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - # } - tempo <- fun_check(data = text.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = title, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = title.text.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = show.legend, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = classic, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = grid, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = raster, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - if( ! is.null(vectorial.limit)){ - tempo <- fun_check(data = vectorial.limit, class = "vector", typeof = "integer", neg.values = FALSE, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) - } - tempo <- fun_check(data = return, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = plot, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - if( ! is.null(add)){ - tempo <- fun_check(data = add, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & ! grepl(pattern = "^\\+", add)){ # check that the add string start by + - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": add ARGUMENT MUST START WITH \"+\": ", paste(unique(add), collapse = " "), "\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - }else if(tempo$problem == FALSE & ! grepl(pattern = "ggplot2::", add)){ # - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": add ARGUMENT MUST CONTAIN \"ggplot2::\" IN FRONT OF EACH GGPLOT2 FUNCTION: ", paste(unique(add), collapse = " "), "\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - }else if(tempo$problem == FALSE & ! grepl(pattern = ")$", add)){ # check that the add string finished by ) - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": add ARGUMENT MUST FINISH BY \")\": ", paste(unique(add), collapse = " "), "\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - } - tempo <- fun_check(data = warn.print, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - if( ! is.null(path.lib)){ - tempo <- fun_check(data = path.lib, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & ! all(dir.exists(path.lib))){ - cat(paste0("\n\n============\n\nERROR IN ", function.name, ": \nDIRECTORY PATH INDICATED IN THE path.lib PARAMETER DOES NOT EXISTS: ", path.lib, "\n\n============\n\n")) - arg.check <- c(arg.check, TRUE) - } - } - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_check() - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() - # end argument checking - # package checking - fun_pack(req.package = c("ggplot2"), path.lib = path.lib) - # packages Cairo and grid tested by fun_gg_point_rast() - # end package checking - # main code - # axes management - if(is.null(xlim)){ - if(any(unlist(mapply(FUN = "[[", data1, x, SIMPLIFY = FALSE)) %in% c(Inf, -Inf))){ - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": THE x COLUMN IN data1 CONTAINS -Inf OR Inf VALUES THAT WILL NOT BE CONSIDERED IN THE PLOT RANGE") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - xlim <- suppressWarnings(range(unlist(mapply(FUN = "[[", data1, x, SIMPLIFY = FALSE)), na.rm = TRUE, finite = TRUE)) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only. xlim added here. If NULL, ok if x argument has values - if(suppressWarnings(all(xlim %in% c(Inf, -Inf)))){ - if(all(unlist(geom) == "geom_hline")){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, " NOT POSSIBLE TO ONLY DRAW geom_hline KIND OF LINES IF xlim ARGUMENT IS SET TO NULL, SINCE NO X-AXIS DEFINED (", ifelse(length(x) == 1, "x", paste0("x NUMBER ", i1)), " ARGUMENT MUST BE NULL FOR THESE KIND OF LINES)\n\n================\n\n") - stop(tempo.cat) - }else{ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, " xlim ARGUMENT MADE OF NA, -Inf OR Inf ONLY: ", paste(xlim, collapse = " "), "\n\n================\n\n") - stop(tempo.cat) - } - } - } - xlim.order <- order(xlim) # to deal with inverse axis - # print(xlim.order) - xlim <- sort(xlim) - xlim[1] <- xlim[1] - abs(xlim[2] - xlim[1]) * ifelse(diff(xlim.order) > 0, x.right.extra.margin, x.left.extra.margin) # diff(xlim.order) > 0 means not inversed axis - xlim[2] <- xlim[2] + abs(xlim[2] - xlim[1]) * ifelse(diff(xlim.order) > 0, x.left.extra.margin, x.right.extra.margin) # diff(xlim.order) > 0 means not inversed axis - if(xy.include.zero == TRUE){ # no need to check xlog != "no" because done before - xlim <- range(c(xlim, 0), na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only - } - xlim <- xlim[xlim.order] - if(any(is.na(xlim))){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 3\n\n============\n\n")) - stop(tempo.cat) - } - if(is.null(ylim)){ - if(any(unlist(mapply(FUN = "[[", data1, y, SIMPLIFY = FALSE)) %in% c(Inf, -Inf))){ - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": THE y COLUMN IN data1 CONTAINS -Inf OR Inf VALUES THAT WILL NOT BE CONSIDERED IN THE PLOT RANGE") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - ylim <- suppressWarnings(range(unlist(mapply(FUN = "[[", data1, y, SIMPLIFY = FALSE)), na.rm = TRUE, finite = TRUE)) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only. ylim added here. If NULL, ok if y argument has values - if(suppressWarnings(all(ylim %in% c(Inf, -Inf)))){ # happen when y is only NULL - if(all(unlist(geom) == "geom_vline")){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, " NOT POSSIBLE TO ONLY DRAW geom_vline KIND OF LINES IF ylim ARGUMENT IS SET TO NULL, SINCE NO Y-AXIS DEFINED (", ifelse(length(y) == 1, "y", paste0("y NUMBER ", i1)), " ARGUMENT MUST BE NULL FOR THESE KIND OF LINES)\n\n================\n\n") - stop(tempo.cat) - }else{ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, " ylim ARGUMENT MADE OF NA, -Inf OR Inf ONLY: ", paste(ylim, collapse = " "), "\n\n================\n\n") - stop(tempo.cat) - } - } - } - ylim.order <- order(ylim) # to deal with inverse axis - ylim <- sort(ylim) - ylim[1] <- ylim[1] - abs(ylim[2] - ylim[1]) * ifelse(diff(ylim.order) > 0, y.bottom.extra.margin, y.top.extra.margin) # diff(ylim.order) > 0 means not inversed axis - ylim[2] <- ylim[2] + abs(ylim[2] - ylim[1]) * ifelse(diff(ylim.order) > 0, y.top.extra.margin, y.bottom.extra.margin) # diff(ylim.order) > 0 means not inversed axis - if(xy.include.zero == TRUE){ # no need to check ylog != "no" because done before - ylim <- range(c(ylim, 0), na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only - } - ylim <- ylim[ylim.order] - if(any(is.na(ylim))){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 4\n\n============\n\n")) - stop(tempo.cat) - } - # end axes management - # create a fake categ if NULL to deal with legend display - if(is.null(categ)){ - categ <- vector("list", length(data1)) - categ[] <- "fake_categ" - for(i2 in 1:length(data1)){ - data1[[i2]] <- cbind(data1[[i2]], fake_categ = "") - if(geom[[i2]] == "geom_hline" | geom[[i2]] == "geom_vline"){ - data1[[i2]][, "fake_categ"] <- paste0("Line_", 1:nrow(data1[[i2]])) - } - } - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": NULL categ ARGUMENT -> FAKE COLUMN ADDED TO EACH DATA FRAME IN data1, NAMED \"fake_categ\" AND FILLED WITH \"\"") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - # end create a fake categ if NULL to deal with legend display - # vector of color with length as in data1 - if(is.null(color)){ - color <- vector("list", length(data1)) - length.categ.list <- lapply(lapply(mapply(FUN = "[[", data1, categ, SIMPLIFY = FALSE), FUN = unique), FUN = function(x){length(x[ ! is.na(x)])}) - length.categ.list[sapply(categ, FUN = "==", "fake_categ")] <- 1 # when is.null(color), a single color for all the dots or lines of data[[i1]] that contain "fake_categ" category - total.categ.length <- sum(unlist(length.categ.list), na.rm = TRUE) - tempo.color <- fun_gg_palette(total.categ.length) - tempo.count <- 0 - for(i3 in 1:length(data1)){ - color[[i3]] <- tempo.color[(1:length.categ.list[[i3]]) + tempo.count] - tempo.count <- tempo.count + length.categ.list[[i3]] - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": NULL color ARGUMENT -> COLORS RESPECTIVELY ATTRIBUTED TO EACH CLASS OF ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i3)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i3)), ":\n", paste(unlist(color), collapse = " "), "\n", paste(names(data1), collapse = " ")) - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - } - # end vector of color with length as in data1 - # last check - for(i1 in 1:length(data1)){ - if(categ[[i1]] != "fake_categ" & length(color[[i1]]) != length(unique(data1[[i1]][, categ[[i1]]]))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, " LAST CHECK: ", ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " ARGUMENT MUST HAVE THE LENGTH OF LEVELS OF ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), "\nHERE IT IS COLOR LENGTH ", length(color[[i1]]), " VERSUS CATEG LEVELS LENGTH ", length(unique(data1[[i1]][, categ[[i1]]])), "\n\n================\n\n") - stop(tempo.cat) - }else if(categ[[i1]] == "fake_categ" & length(color[[i1]]) != 1){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, " LAST CHECK: ", ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " ARGUMENT MUST HAVE LENGTH 1 WHEN ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " IS NULL\nHERE IT IS COLOR LENGTH ", length(color[[i1]]), "\n\n================\n\n") - stop(tempo.cat) - } - } - # end last check - # conversion of geom_hline and geom_vline - for(i1 in 1:length(data1)){ - if(geom[[i1]] == "geom_hline" | geom[[i1]] == "geom_vline"){ - final.data.frame <- data.frame() - for(i3 in 1:nrow(data1[[i1]])){ - tempo.data.frame <- rbind(data1[[i1]][i3, ], data1[[i1]][i3, ]) - if(geom[[i1]] == "geom_hline"){ - tempo.data.frame[, x[[i1]]] <- xlim - }else if(geom[[i1]] == "geom_vline"){ - tempo.data.frame[, y[[i1]]] <- ylim - }else{ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 5\n\n============\n\n")) - stop(tempo.cat) - } - # if(is.null(categ[[i1]])){ - # data1[, "fake_categ"] <- paste0("Line_", i3) - # } #I put that up - final.data.frame <- rbind(final.data.frame, tempo.data.frame) - } - data1[[i1]] <- final.data.frame - geom[[i1]] <- "geom_line" - if(length(color[[i1]]) == 1){ - color[[i1]] <- rep(color[[i1]], length(unique(data1[[i1]][ , categ[[i1]]]))) - }else if(length(color[[i1]]) != length(unique(data1[[i1]][ , categ[[i1]]]))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, " geom_hline AND geom_vline CONVERSION TO FIT THE XLIM AND YLIM LIMITS OF THE DATA: ", ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " ARGUMENT MUST HAVE THE LENGTH OF LEVELS OF ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), "\nHERE IT IS COLOR LENGTH ", length(color[[i1]]), " VERSUS CATEG LEVELS LENGTH ", length(unique(data1[[i1]][, categ[[i1]]])), "\n\n================\n\n") - stop(tempo.cat) - } - } - } - # end conversion of geom_hline and geom_vline - # kind of geom_point (vectorial or raster) - scatter.kind <- vector("list", length = length(data1)) # list of same length as data1, that will be used to use either ggplot2::geom_point() (vectorial dot layer) or fun_gg_point_rast() (raster dot layer) - fix.ratio <- FALSE - if(is.null(vectorial.limit)){ - if(raster == TRUE){ - scatter.kind[] <- "fun_gg_point_rast" # not important to fill everything: will be only used when geom == "geom_point" - fix.ratio <- TRUE - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": RASTER PLOT GENERATED -> ASPECT RATIO OF THE PLOT REGION SET TO 1/1 TO AVOID A BUG OF ELLIPSOID DOT DRAWING") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - }else{ - scatter.kind[] <- "ggplot2::geom_point" - } - }else{ - for(i2 in 1:length(data1)){ - if(geom[[i2]] == "geom_point"){ - if(nrow(data1[[i2]]) <= vectorial.limit){ - scatter.kind[[i2]] <- "ggplot2::geom_point" - }else{ - scatter.kind[[i2]] <- "fun_gg_point_rast" - fix.ratio <- TRUE - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i2)), " LAYER AS RASTER (NOT VECTORIAL)") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - } - } - if(any(unlist(scatter.kind) == "fun_gg_point_rast")){ - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": RASTER PLOT GENERATED -> ASPECT RATIO OF THE PLOT REGION SET TO 1/1 TO AVOID A BUG OF ELLIPSOID DOT DRAWING") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - } - # end kind of geom_point (vectorial or raster) - tempo.gg.name <- "gg.indiv.plot." - tempo.gg.count <- 0 - # no need loop part - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ggplot()) - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::xlab(if(is.null(xlab)){x[[1]]}else{xlab})) - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ylab(if(is.null(ylab)){y[[1]]}else{ylab})) - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ggtitle(title)) - add.check <- TRUE - if( ! is.null(add)){ # if add is NULL, then = 0 - if(grepl(pattern = "ggplot2::theme", add) == TRUE){ - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": \"ggplot2::theme\" STRING DETECTED IN THE add ARGUMENT -> INTERNAL GGPLOT2 THEME FUNCTIONS theme() AND theme_classic() HAVE BEEN INACTIVATED, TO BE USED BY THE USER. -\nIT IS RECOMMENDED TO USE \"+ theme(aspect.ratio = 1)\" IF RASTER MODE IS ACTIVATED") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - add.check <- FALSE - } - } - if(add.check == TRUE & classic == TRUE){ - # BEWARE: not possible to add several times theme(). NO message but the last one overwrites the others - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::theme_classic(base_size = text.size)) - if(grid == TRUE){ - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( - text = ggplot2::element_text(size = text.size), - plot.title = ggplot2::element_text(size = title.text.size), # stronger than text - line = ggplot2::element_line(size = 0.5), - axis.line.y.left = ggplot2::element_line(colour = "black"), # draw lines for the y axis - axis.line.x.bottom = ggplot2::element_line(colour = "black"), # draw lines for the x axis - panel.grid.major.x = ggplot2::element_line(colour = "grey75"), - panel.grid.major.y = ggplot2::element_line(colour = "grey75"), - aspect.ratio = if(fix.ratio == TRUE){1}else{NULL} - )) - }else{ - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( - text = ggplot2::element_text(size = text.size), - plot.title = ggplot2::element_text(size = title.text.size), # stronger than text - line = ggplot2::element_line(size = 0.5), - axis.line.y.left = ggplot2::element_line(colour = "black"), - axis.line.x.bottom = ggplot2::element_line(colour = "black"), - aspect.ratio = if(fix.ratio == TRUE){1}else{NULL} - )) - } - }else if(add.check == TRUE & classic == FALSE){ - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( - text = ggplot2::element_text(size = text.size), - plot.title = ggplot2::element_text(size = title.text.size), # stronger than text - line = ggplot2::element_line(size = 0.5), - panel.background = ggplot2::element_rect(fill = "grey95"), - axis.line.y.left = ggplot2::element_line(colour = "black"), - axis.line.x.bottom = ggplot2::element_line(colour = "black"), - panel.grid.major.x = ggplot2::element_line(colour = "grey75"), - panel.grid.major.y = ggplot2::element_line(colour = "grey75"), - panel.grid.minor.x = ggplot2::element_blank(), - panel.grid.minor.y = ggplot2::element_blank(), - strip.background = ggplot2::element_rect(fill = "white", colour = "black"), - aspect.ratio = if(fix.ratio == TRUE){1}else{NULL} - # do not work -> legend.position = "none" # to remove the legend completely: https://www.datanovia.com/en/blog/how-to-remove-legend-from-a-ggplot/ - )) - } - # end no need loop part - # loop part - point.count <- 0 - line.count <- 0 - lg.order <- vector(mode = "list", length = 6) # order of the legend - lg.order <- lapply(lg.order, as.numeric) # order of the legend - lg.color <- vector(mode = "list", length = 6) # color of the legend - lg.alpha <- vector(mode = "list", length = 6) # order of the legend - lg.alpha <- lapply(lg.alpha, as.numeric) # alpha of the legend - for(i1 in 1:length(data1)){ - if(geom[[i1]] == "geom_point"){ - point.count <- point.count + 1 - if(point.count == 1){ - fin.lg.disp[[1]] <- legend.disp[[point.count + line.count]] - lg.order[[1]] <- point.count + line.count - lg.color[[1]] <- color[[i1]] - lg.alpha[[1]] <- alpha[[i1]] - class.categ <- levels(factor(data1[[i1]][, categ[[i1]]])) - for(i5 in 1:length(color[[i1]])){ # or length(class.categ). It is the same because already checked that lengths are the same - tempo.data.frame <- data1[[i1]][data1[[i1]][, categ[[i1]]] == class.categ[i5], ] - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = scatter.kind[[i1]]))(data = tempo.data.frame, mapping = ggplot2::aes_string(x = x[[i1]], y = y[[i1]], fill = categ[[i1]]), size = dot.size, color = color[[i1]][i5], alpha = alpha[[i1]])) # beware: a single color allowed for color argument outside aesthetic, hence the loop # show.legend option do not remove the legend, only the aesthetic of the legend (dot, line, etc.) - } - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_fill_manual(name = if(is.null(legend.name)){NULL}else{legend.name[[i1]]}, values = color[[i1]], guide = ggplot2::guide_legend(override.aes = list(colour = color[[i1]], linetype = 0)))) # values are the values of fill. order determines the order in the legend - } - if(point.count == 2){ - fin.lg.disp[[2]] <- legend.disp[[point.count + line.count]] - lg.order[[2]] <- point.count + line.count - lg.color[[2]] <- color[[i1]] - lg.alpha[[2]] <- alpha[[i1]] - class.categ <- levels(factor(data1[[i1]][, categ[[i1]]])) - for(i5 in 1:length(color[[i1]])){ # or length(class.categ). It is the same because already checked that lengths are the same - tempo.data.frame <- data1[[i1]][data1[[i1]][, categ[[i1]]] == class.categ[i5], ] - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = scatter.kind[[i1]]))(data = tempo.data.frame, mapping = ggplot2::aes_string(x = x[[i1]], y = y[[i1]], shape = categ[[i1]]), size = dot.size, color = color[[i1]][i5], alpha = alpha[[i1]])) # beware: a single color allowed for color argument outside aesthetic, hence the loop # show.legend option do not remove the legend, only the aesthetic of the legend (dot, line, etc.) - } - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_shape_manual(name = if(is.null(legend.name)){NULL}else{legend.name[[i1]]}, values = rep(19, length(color[[i1]])), guide = ggplot2::guide_legend(override.aes = list(colour = color[[i1]], linetype = 0)))) # values are the values of shape - } - if(point.count == 3){ - fin.lg.disp[[3]] <- legend.disp[[point.count + line.count]] - lg.order[[3]] <- point.count + line.count - lg.color[[3]] <- color[[i1]] - lg.alpha[[3]] <- alpha[[i1]] - class.categ <- levels(factor(data1[[i1]][, categ[[i1]]])) - for(i5 in 1:length(color[[i1]])){ # or length(class.categ). It is the same because already checked that lengths are the same - tempo.data.frame <- data1[[i1]][data1[[i1]][, categ[[i1]]] == class.categ[i5], ] - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = scatter.kind[[i1]]))(data = tempo.data.frame, mapping = ggplot2::aes_string(x = x[[i1]], y = y[[i1]], stroke = categ[[i1]]), size = dot.size, color = color[[i1]][i5], alpha = alpha[[i1]])) # beware: a single color allowed for color argument outside aesthetic, hence the loop # show.legend option do not remove the legend, only the aesthetic of the legend (dot, line, etc.) - } - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "stroke", name = if(is.null(legend.name)){NULL}else{legend.name[[i1]]}, values = rep(0.5, length(color[[i1]])), guide = ggplot2::guide_legend(override.aes = list(colour = color[[i1]], linetype = 0)))) # values are the values of stroke - } - }else{ - line.count <- line.count + 1 - if(line.count == 1){ - fin.lg.disp[[4]] <- legend.disp[[point.count + line.count]] - lg.order[[4]] <- point.count + line.count - lg.color[[4]] <- color[[i1]] - lg.alpha[[4]] <- 1 # to avoid a bug on windows: if alpha argument is different from 1 for lines (transparency), then lines are not correctly displayed in the legend when using the R GUI (bug https://github.com/tidyverse/ggplot2/issues/2452). No bug when using a pdf - class.categ <- levels(factor(data1[[i1]][, categ[[i1]]])) - for(i5 in 1:length(color[[i1]])){ # or length(class.categ). It is the same because already checked that lengths are the same - tempo.data.frame <- data1[[i1]][data1[[i1]][, categ[[i1]]] == class.categ[i5], ] - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = paste("ggplot2::", geom[[i1]], sep ="")))(data = tempo.data.frame, mapping = ggplot2::aes_string(x = x[[i1]], y = y[[i1]], linetype = categ[[i1]]), color = color[[i1]][i5], size = line.size, lineend = "round", alpha = alpha[[i1]])) # beware: a single color allowed for color argument outside aesthetic, hence the loop # show.legend option do not remove the legend, only the aesthetic of the legend (dot, line, etc.) - } - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "linetype", name = if(is.null(legend.name)){NULL}else{legend.name[[i1]]}, values = rep(1, length(color[[i1]])), guide = ggplot2::guide_legend(override.aes = list(colour = color[[i1]], shape = NA)))) # values are the values of linetype. 1 means solid. Regarding the alpha bug, I have tried different things without success: alpha in guide alone, in geom alone, in both, with different values - } - if(line.count == 2){ - fin.lg.disp[[5]] <- legend.disp[[point.count + line.count]] - lg.order[[5]] <- point.count + line.count - lg.color[[5]] <- color[[i1]] - lg.alpha[[5]] <- 1 # to avoid a bug on windows: if alpha argument is different from 1 for lines (transparency), then lines are not correctly displayed in the legend when using the R GUI (bug https://github.com/tidyverse/ggplot2/issues/2452). No bug when using a pdf - class.categ <- levels(factor(data1[[i1]][, categ[[i1]]])) - for(i5 in 1:length(color[[i1]])){ # or length(class.categ). It is the same because already checked that lengths are the same - tempo.data.frame <- data1[[i1]][data1[[i1]][, categ[[i1]]] == class.categ[i5], ] - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = paste("ggplot2::", geom[[i1]], sep ="")))(data = tempo.data.frame, mapping = ggplot2::aes_string(x = x[[i1]], y = y[[i1]], alpha = categ[[i1]]), color = color[[i1]][i5], size = line.size, lineend = "round")) # beware: a single color allowed for color argument outside aesthetic, hence the loop # show.legend option do not remove the legend, only the aesthetic of the legend (dot, line, etc.) - } - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "alpha", name = if(is.null(legend.name)){NULL}else{legend.name[[i1]]}, values = rep(alpha[[i1]], length(color[[i1]])), guide = ggplot2::guide_legend(override.aes = list(colour = color[[i1]], shape = NA)))) # values are the values of linetype. 1 means solid. Regarding the alpha bug, I have tried different things without success: alpha in guide alone, in geom alone, in both, with different values - } - if(line.count == 3){ - fin.lg.disp[[6]] <- legend.disp[[point.count + line.count]] - lg.order[[6]] <- point.count + line.count - lg.color[[6]] <- color[[i1]] - lg.alpha[[6]] <- 1 # to avoid a bug on windows: if alpha argument is different from 1 for lines (transparency), then lines are not correctly displayed in the legend when using the R GUI (bug https://github.com/tidyverse/ggplot2/issues/2452). No bug when using a pdf - class.categ <- levels(factor(data1[[i1]][, categ[[i1]]])) - for(i5 in 1:length(color[[i1]])){ # or length(class.categ). It is the same because already checked that lengths are the same - tempo.data.frame <- data1[[i1]][data1[[i1]][, categ[[i1]]] == class.categ[i5], ] - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = paste("ggplot2::", geom[[i1]], sep ="")))(data = tempo.data.frame, mapping = ggplot2::aes_string(x = x[[i1]], y = y[[i1]], size = categ[[i1]]), color = color[[i1]][i5], alpha = alpha[[i1]], lineend = "round")) # beware: a single color allowed for color argument outside aesthetic, hence the loop # show.legend option do not remove the legend, only the aesthetic of the legend (dot, line, etc.) - } - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "size", name = if(is.null(legend.name)){NULL}else{legend.name[[i1]]}, values = rep(line.size, length(color[[i1]])), guide = ggplot2::guide_legend(override.aes = list(colour = color[[i1]], shape = NA)))) # values are the values of linetype. 1 means solid. Regarding the alpha bug, I have tried different things without success: alpha in guide alone, in geom alone, in both, with different values - } - } - } - # end loop part - # legend display - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::guides(fill = if(fin.lg.disp[[1]] == TRUE){ggplot2::guide_legend(order = lg.order[[1]], override.aes = list(alpha = lg.alpha[[1]], color = lg.color[[1]]))}else{FALSE}, shape = if(fin.lg.disp[[2]] == TRUE){ggplot2::guide_legend(order = lg.order[[2]], override.aes = list(alpha = lg.alpha[[2]], color = lg.color[[2]]))}else{FALSE}, stroke = if(fin.lg.disp[[3]] == TRUE){ggplot2::guide_legend(order = lg.order[[3]], override.aes = list(alpha = lg.alpha[[2]], color = lg.color[[3]]))}else{FALSE}, linetype = if(fin.lg.disp[[4]] == TRUE){ggplot2::guide_legend(order = lg.order[[4]], override.aes = list(alpha = lg.alpha[[4]], color = lg.color[[4]]))}else{FALSE}, alpha = if(fin.lg.disp[[5]] == TRUE){ggplot2::guide_legend(order = lg.order[[5]], override.aes = list(alpha = lg.alpha[[5]], color = lg.color[[5]]))}else{FALSE}, size = if(fin.lg.disp[[6]] == TRUE){ggplot2::guide_legend(order = lg.order[[6]], override.aes = list(alpha = lg.alpha[[6]], color = lg.color[[6]]))}else{FALSE})) # clip = "off" to have secondary ticks outside plot region does not work - # end legend display - # scale management - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::coord_cartesian(xlim = xlim, ylim = ylim)) # clip = "off" to have secondary ticks outside plot region does not work - # x-axis ticks and inv - tempo.coord <- ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))$layout$panel_params[[1]] - tempo.scale <- fun_scale(lim = xlim, n = ifelse(is.null(x.tick.nb), length(tempo.coord$x.major_source), x.tick.nb)) - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_x_continuous( - breaks = tempo.scale, - labels = if(xlog == "log10"){scales::trans_format("identity", scales::math_format(10^.x))}else if(xlog == "log2"){scales::trans_format("identity", scales::math_format(2^.x))}else if(xlog == "no"){ggplot2::waiver()}else{tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 6\n\n============\n\n")) ; stop(tempo.cat)}, - expand = c(0, 0), - limits = NA, - trans = ifelse(diff(xlim) < 0, "reverse", "identity") # equivalent to ggplot2::scale_x_reverse() - )) - # end x-axis ticks and inv - # y-axis ticks and inv - tempo.coord <- ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))$layout$panel_params[[1]] - tempo.scale <- fun_scale(lim = ylim, n = ifelse(is.null(y.tick.nb), length(tempo.coord$y.major_source), y.tick.nb)) - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_y_continuous( - breaks = tempo.scale, - labels = if(ylog == "log10"){scales::trans_format("identity", scales::math_format(10^.x))}else if(ylog == "log2"){scales::trans_format("identity", scales::math_format(2^.x))}else if(ylog == "no"){ggplot2::waiver()}else{tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 7\n\n============\n\n")) ; stop(tempo.cat)}, - expand = c(0, 0), - limits = NA, - trans = ifelse(diff(ylim) < 0, "reverse", "identity") # equivalent to ggplot2::scale_y_reverse() - )) - # end y-axis ticks and inv - # x-axis secondary ticks (after ggplot2::coord_cartesian() or ggplot2::coord_flip()) - tempo.coord <- ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))$layout$panel_params[[1]] - xlim.order <- order(xlim) # to deal with inverse axis - ylim.order <- order(ylim) # to deal with inverse axis - # no secondary ticks for log2. Play with xlim - if(xlog == "log10"){ - y.range <- tempo.coord$y.range - if(diff(ylim.order) < 0){y.range <- -(y.range)} - ini.scipen <- options()$scipen - options(scipen = -1000) # force scientific format - power10.exp <- as.integer(substring(text = 10^xlim, first = (regexpr(pattern = "\\+|\\-", text = 10^xlim)))) # recover the power of 10. Example recover 08 from 1e+08 - # print(xlim) - mantisse <- as.numeric(substr(x = 10^xlim, start = 1, stop = (regexpr(pattern = "\\+|\\-", text = 10^xlim) - 2))) # recover the mantisse. Example recover 1.22 from 1.22e+08 - options(scipen = ini.scipen) # restore the initial scientific penalty - # print(power10.exp) - tempo.tick.pos <- as.vector(outer(log10(2:10), 10^((power10.exp[1] - ifelse(diff(xlim.order) > 0, 1, -1)):(power10.exp[2] + ifelse(diff(xlim.order) > 0, 1, -1))))) - tempo.tick.pos <- sort(tempo.tick.pos, decreasing = ifelse(diff(xlim.order) > 0, FALSE, TRUE)) - tempo.tick.pos <- log10(tempo.tick.pos[tempo.tick.pos >= min(10^xlim) & tempo.tick.pos <= max(10^xlim)]) - if(any(is.na(tempo.tick.pos) | ! is.finite(tempo.tick.pos))){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 8\n\n============\n\n")) - stop(tempo.cat) - } - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "segment", x = tempo.tick.pos, xend = tempo.tick.pos, y = y.range[1], yend = y.range[1] + diff(y.range) / 80)) - }else if(( ! is.null(x.inter.tick.nb)) & xlog == "no"){ - if(x.inter.tick.nb > 0){ - x.ticks.pos <- suppressWarnings(as.numeric(tempo.coord$x.labels)) # too difficult to predict the behavior of tempo.coord$x.major_source depending on xlim neg or not, inv or not. Inv is respected - if(any(is.na(x.ticks.pos))){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 9\n\n============\n\n")) - stop(tempo.cat) - } - y.range <- tempo.coord$y.range - if(diff(ylim.order) < 0){y.range <- -(y.range)} - tick.dist <- mean(diff(x.ticks.pos), na.rm = TRUE) - minor.tick.dist <- tick.dist / (x.inter.tick.nb + 1) - minor.tick.pos <- seq(x.ticks.pos[1] - tick.dist, x.ticks.pos[length(x.ticks.pos)] + tick.dist, by = minor.tick.dist) - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "segment", x = minor.tick.pos, xend = minor.tick.pos, y = y.range[1], yend = y.range[1] + diff(y.range) / 80)) - } - } - # end x-axis secondary ticks (after ggplot2::coord_cartesian() or ggplot2::coord_flip()) - # y-axis secondary ticks (after ggplot2::coord_cartesian() or ggplot2::coord_flip()) - tempo.coord <- ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))$layout$panel_params[[1]] - # no secondary ticks for log2. Play with ylim - if(ylog == "log10"){ - x.range <- tempo.coord$x.range - if(diff(xlim.order) < 0){x.range <- -(x.range)} - ini.scipen <- options()$scipen - options(scipen = -1000) # force scientific format - power10.exp <- as.integer(substring(text = 10^ylim, first = (regexpr(pattern = "\\+|\\-", text = 10^ylim)))) # recover the power of 10. Example recover 08 from 1e+08 - mantisse <- as.numeric(substr(x = 10^ylim, start = 1, stop = (regexpr(pattern = "\\+|\\-", text = 10^ylim) - 2))) # recover the mantisse. Example recover 1.22 from 1.22e+08 - options(scipen = ini.scipen) # restore the initial scientific penalty - tempo.tick.pos <- as.vector(outer(log10(2:10), 10^((power10.exp[1] - ifelse(diff(ylim.order) > 0, 1, -1)):(power10.exp[2] + ifelse(diff(ylim.order) > 0, 1, -1))))) - tempo.tick.pos <- sort(tempo.tick.pos, decreasing = ifelse(diff(ylim.order) > 0, FALSE, TRUE)) - tempo.tick.pos <- log10(tempo.tick.pos[tempo.tick.pos >= min(10^ylim) & tempo.tick.pos <= max(10^ylim)]) - if(any(is.na(tempo.tick.pos) | ! is.finite(tempo.tick.pos))){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 10\n\n============\n\n")) - stop(tempo.cat) - } - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "segment", y = tempo.tick.pos, yend = tempo.tick.pos, x = x.range[1], xend = x.range[1] + diff(x.range) / 80)) - }else if(( ! is.null(y.inter.tick.nb)) & ylog == "no"){ - if(y.inter.tick.nb > 0){ - y.ticks.pos <- suppressWarnings(as.numeric(tempo.coord$y.labels)) # too difficult to predict the behavior of tempo.coord$y.major_source depending on ylim neg or not, inv or not. Inv is respected - if(any(is.na(y.ticks.pos))){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 11\n\n============\n\n")) - stop(tempo.cat) - } - x.range <- tempo.coord$x.range - if(diff(xlim.order) < 0){x.range <- -(x.range)} - tick.dist <- mean(diff(y.ticks.pos), na.rm = TRUE) - minor.tick.dist <- tick.dist / (y.inter.tick.nb + 1) - minor.tick.pos <- seq(y.ticks.pos[1] - tick.dist, y.ticks.pos[length(y.ticks.pos)] + tick.dist, by = minor.tick.dist) - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "segment", y = minor.tick.pos, yend = minor.tick.pos, x = x.range[1], xend = x.range[1] + diff(x.range) / 80)) - } - } - # end y-axis secondary ticks (after ggplot2::coord_cartesian() or ggplot2::coord_flip()) - # end scale management - if(plot == TRUE){ - suppressWarnings(print(eval(parse(text = paste(paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "),if(is.null(add)){NULL}else{add}))))) - }else{ - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": PLOT NOT SHOWN AS REQUESTED") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - if(warn.print == TRUE & ! is.null(warning)){ - warning(warning) - } - if(return == TRUE){ - output <- ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + ")))) - if(is.null(unlist(removed.row.nb))){ - removed.row.nb <- NULL - removed.rows <- NULL - }else{ - for(i3 in 1:length(data1)){ - if( ! is.null(removed.row.nb[[i3]])){ - removed.row.nb[[i3]] <- sort(removed.row.nb[[i3]]) - removed.rows[[i3]] <- data1.ini[[i3]][removed.row.nb[[i3]], ] - } - } - } - output <- list(data = output$data, removed.row.nb = removed.row.nb, removed.rows = removed.rows, axes = output$layout$panel_params[[1]], warnings = paste0("\n", warning, "\n\n")) - return(output) - } +tempo <- fun_check(data = y.lab, class = "character", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = y.axis.magnific, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = y.label.magnific, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = y.dist.legend, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = y.nb.inter.tick, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = text.angle, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = tick.length, class = "vector", mode = "numeric", length = 1, prop = TRUE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = sec.tick.length, class = "vector", mode = "numeric", length = 1, prop = TRUE, fun.name = function.name) ; eval(ee) +if( ! is.null(bg.color)){ +tempo <- fun_check(data = bg.color, class = "character", length = 1, fun.name = function.name) ; eval(ee) +if( ! (bg.color %in% colors() | grepl(pattern = "^#", bg.color))){ # check color +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": bg.color ARGUMENT MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # OR A COLOR NAME GIVEN BY colors()\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +} +if( ! is.null(grid.lwd)){ +tempo <- fun_check(data = grid.lwd, class = "vector", mode = "numeric", neg.values = FALSE, fun.name = function.name) ; eval(ee) +} +if( ! is.null(grid.col)){ +tempo <- fun_check(data = grid.col, class = "character", length = 1, fun.name = function.name) ; eval(ee) +if( ! (grid.col %in% colors() | grepl(pattern = "^#", grid.col))){ # check color +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": grid.col ARGUMENT MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # OR A COLOR NAME GIVEN BY colors()\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +} +tempo <- fun_check(data = corner.text, class = "character", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = magnific.corner.text, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = just.label.add, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = par.reset, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(custom.par)){ +tempo <- fun_check(data = custom.par, typeof = "list", length = 1, fun.name = function.name) ; eval(ee) +} +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_check() +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() +# end argument checking +# main code +text <- NULL +par(tcl = -par()$mgp[2] * tick.length) +if(x.log.scale == TRUE){ +grid.coord.x <- c(10^par("usr")[1], 10^par("usr")[2]) +}else{ +grid.coord.x <- c(par("usr")[1], par("usr")[2]) +} +if(y.log.scale == TRUE){ +grid.coord.y <- c(10^par("usr")[3], 10^par("usr")[4]) +}else{ +grid.coord.y <- c(par("usr")[3], par("usr")[4]) +} +if( ! is.null(bg.color)){ +rect(grid.coord.x[1], grid.coord.y[1], grid.coord.x[2], grid.coord.y[2], col = bg.color, border = NA) +} +if( ! is.null(grid.lwd)){ +grid(nx = NA, ny = NULL, col = grid.col, lty = 1, lwd = grid.lwd) +} +if(x.log.scale == TRUE){ +x.mid.left.dev.region <- 10^(par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] - ((par("usr")[2] - par("usr")[1]) / ((par("omd")[2] - par("omd")[1]) * (par("plt")[2] - par("plt")[1]))) * par("omd")[1] / 2) # in x coordinates, to position axis labeling at the bottom of the graph (according to x scale) +x.left.dev.region <- 10^(par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] - ((par("usr")[2] - par("usr")[1]) / ((par("omd")[2] - par("omd")[1]) * (par("plt")[2] - par("plt")[1]))) * par("omd")[1]) # in x coordinates +x.mid.right.dev.region <- 10^(par("usr")[2] + ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * (1 - par("plt")[2]) + ((par("usr")[2] - par("usr")[1]) / ((par("omd")[2] - par("omd")[1]) * (par("plt")[2] - par("plt")[1]))) * (1 - par("omd")[2]) / 2) # in x coordinates, to position axis labeling at the top of the graph (according to x scale) +x.right.dev.region <- 10^(par("usr")[2] + ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * (1 - par("plt")[2]) + ((par("usr")[2] - par("usr")[1]) / ((par("omd")[2] - par("omd")[1]) * (par("plt")[2] - par("plt")[1]))) * (1 - par("omd")[2])) # in x coordinates +x.mid.left.fig.region <- 10^(par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] / 2) # in x coordinates, to position axis labeling at the bottom of the graph (according to x scale) +x.left.fig.region <- 10^(par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1]) # in x coordinates +x.mid.right.fig.region <- 10^(par("usr")[2] + ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * (1 - par("plt")[2]) / 2) # in x coordinates, to position axis labeling at the top of the graph (according to x scale) +x.right.fig.region <- 10^(par("usr")[2] + ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * (1 - par("plt")[2])) # in x coordinates +x.left.plot.region <- 10^par("usr")[1] # in x coordinates, left of the plot region (according to x scale) +x.right.plot.region <- 10^par("usr")[2] # in x coordinates, right of the plot region (according to x scale) +x.mid.plot.region <- 10^((par("usr")[2] + par("usr")[1]) / 2) # in x coordinates, right of the plot region (according to x scale) +}else{ +x.mid.left.dev.region <- (par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] - ((par("usr")[2] - par("usr")[1]) / ((par("omd")[2] - par("omd")[1]) * (par("plt")[2] - par("plt")[1]))) * par("omd")[1] / 2) # in x coordinates, to position axis labeling at the bottom of the graph (according to x scale) +x.left.dev.region <- (par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] - ((par("usr")[2] - par("usr")[1]) / ((par("omd")[2] - par("omd")[1]) * (par("plt")[2] - par("plt")[1]))) * par("omd")[1]) # in x coordinates +x.mid.right.dev.region <- (par("usr")[2] + ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * (1 - par("plt")[2]) + ((par("usr")[2] - par("usr")[1]) / ((par("omd")[2] - par("omd")[1]) * (par("plt")[2] - par("plt")[1]))) * (1 - par("omd")[2]) / 2) # in x coordinates, to position axis labeling at the top of the graph (according to x scale) +x.right.dev.region <- (par("usr")[2] + ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * (1 - par("plt")[2]) + ((par("usr")[2] - par("usr")[1]) / ((par("omd")[2] - par("omd")[1]) * (par("plt")[2] - par("plt")[1]))) * (1 - par("omd")[2])) # in x coordinates +x.mid.left.fig.region <- (par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] / 2) # in x coordinates, to position axis labeling at the bottom of the graph (according to x scale) +x.left.fig.region <- (par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1]) # in x coordinates +x.mid.right.fig.region <- (par("usr")[2] + ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * (1 - par("plt")[2]) / 2) # in x coordinates, to position axis labeling at the top of the graph (according to x scale) +x.right.fig.region <- (par("usr")[2] + ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * (1 - par("plt")[2])) # in x coordinates +x.left.plot.region <- par("usr")[1] # in x coordinates, left of the plot region (according to x scale) +x.right.plot.region <- par("usr")[2] # in x coordinates, right of the plot region (according to x scale) +x.mid.plot.region <- (par("usr")[2] + par("usr")[1]) / 2 # in x coordinates, right of the plot region (according to x scale) +} +if(y.log.scale == TRUE){ +y.mid.bottom.dev.region <- 10^(par("usr")[3] - ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * par("plt")[3] - ((par("usr")[4] - par("usr")[3]) / ((par("omd")[4] - par("omd")[3]) * (par("plt")[4] - par("plt")[3]))) * (par("omd")[3] / 2)) # in y coordinates, to position axis labeling at the bottom of the graph (according to y scale). Ex mid.bottom.space +y.bottom.dev.region <- 10^(par("usr")[3] - ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * par("plt")[3] - ((par("usr")[4] - par("usr")[3]) / ((par("omd")[4] - par("omd")[3]) * (par("plt")[4] - par("plt")[3]))) * par("omd")[3]) # in y coordinates +y.mid.top.dev.region <- 10^(par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / ((par("omd")[4] - par("omd")[3]) * (par("plt")[4] - par("plt")[3]))) * (1 - par("omd")[4]) / 2) # in y coordinates, to position axis labeling at the top of the graph (according to y scale). Ex mid.top.space +y.top.dev.region <- 10^(par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / ((par("omd")[4] - par("omd")[3]) * (par("plt")[4] - par("plt")[3]))) * (1 - par("omd")[4])) # in y coordinates +y.mid.bottom.fig.region <- 10^(par("usr")[3] - ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * par("plt")[3] / 2) # in y coordinates, to position axis labeling at the bottom of the graph (according to y scale). Ex mid.bottom.space +y.bottom.fig.region <- 10^(par("usr")[3] - ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * par("plt")[3]) # in y coordinates +y.mid.top.fig.region <- 10^(par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) / 2) # in y coordinates, to position axis labeling at the top of the graph (according to y scale). Ex mid.top.space +y.top.fig.region <- 10^(par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4])) # in y coordinates +y.top.plot.region <- 10^par("usr")[4] # in y coordinates, top of the plot region (according to y scale) +y.bottom.plot.region <- 10^par("usr")[3] # in y coordinates, bottom of the plot region (according to y scale) +y.mid.plot.region <- (par("usr")[3] + par("usr")[4]) / 2 # in x coordinates, right of the plot region (according to x scale) +}else{ +y.mid.bottom.dev.region <- (par("usr")[3] - ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * par("plt")[3] - ((par("usr")[4] - par("usr")[3]) / ((par("omd")[4] - par("omd")[3]) * (par("plt")[4] - par("plt")[3]))) * (par("omd")[3] / 2)) # in y coordinates, to position axis labeling at the bottom of the graph (according to y scale). Ex mid.bottom.space +y.bottom.dev.region <- (par("usr")[3] - ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * par("plt")[3] - ((par("usr")[4] - par("usr")[3]) / ((par("omd")[4] - par("omd")[3]) * (par("plt")[4] - par("plt")[3]))) * par("omd")[3]) # in y coordinates +y.mid.top.dev.region <- (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / ((par("omd")[4] - par("omd")[3]) * (par("plt")[4] - par("plt")[3]))) * (1 - par("omd")[4]) / 2) # in y coordinates, to position axis labeling at the top of the graph (according to y scale). Ex mid.top.space +y.top.dev.region <- (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / ((par("omd")[4] - par("omd")[3]) * (par("plt")[4] - par("plt")[3]))) * (1 - par("omd")[4])) # in y coordinates +y.mid.bottom.fig.region <- (par("usr")[3] - ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * par("plt")[3] / 2) # in y coordinates, to position axis labeling at the bottom of the graph (according to y scale). Ex mid.bottom.space +y.bottom.fig.region <- (par("usr")[3] - ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * par("plt")[3]) # in y coordinates +y.mid.top.fig.region <- (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) / 2) # in y coordinates, to position axis labeling at the top of the graph (according to y scale). Ex mid.top.space +y.top.fig.region <- (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4])) # in y coordinates +y.top.plot.region <- par("usr")[4] # in y coordinates, top of the plot region (according to y scale) +y.bottom.plot.region <- par("usr")[3] # in y coordinates, bottom of the plot region (according to y scale) +y.mid.plot.region <- ((par("usr")[3] + par("usr")[4]) / 2) # in x coordinates, right of the plot region (according to x scale) +} +if(x.side == 1 | x.side == 3){ +par(xpd=FALSE, xaxt="s") +if(is.null(x.categ) & x.log.scale == TRUE){ +if(any(par()$xaxp[1:2] == 0)){ +if(par()$xaxp[1] == 0){ +par(xaxp = c(10^-30, par()$xaxp[2:3])) # because log10(par()$xaxp[1] == 0) == -Inf +} +if(par()$xaxp[2] == 0){ +par(xaxp = c(par()$xaxp[1], 10^-30, par()$xaxp[3])) # because log10(par()$xaxp[2] == 0) == -Inf +} +} +axis(side=x.side, at=c(10^par()$usr[1], 10^par()$usr[2]), labels=rep("", 2), lwd=1, lwd.ticks=0) # draw the axis line +mtext(side = x.side, text = x.lab, line = x.dist.legend / 0.2, las = 0, cex = x.label.magnific) +par(tcl = -par()$mgp[2] * sec.tick.length) # length of the secondary ticks are reduced +suppressWarnings(rug(10^outer(c((log10(par("xaxp")[1]) -1):log10(par("xaxp")[2])), log10(1:10), "+"), ticksize = NA, side = x.side)) # ticksize = NA to allow the use of par()$tcl value +par(tcl = -par()$mgp[2] * tick.length) # back to main ticks +axis(side = x.side, at = c(1e-15, 1e-14, 1e-13, 1e-12, 1e-11, 1e-10, 1e-9, 1e-8, 1e-7, 1e-6, 1e-5, 1e-4, 1e-3, 1e-2, 1e-1, 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10), labels = expression(10^-15, 10^-14, 10^-13, 10^-12, 10^-11, 10^-10, 10^-9, 10^-8, 10^-7, 10^-6, 10^-5, 10^-4, 10^-3, 10^-2, 10^-1, 10^0, 10^1, 10^2, 10^3, 10^4, 10^5, 10^6, 10^7, 10^8, 10^9, 10^10), lwd = 0, lwd.ticks = 1, cex.axis = x.axis.magnific) +x.text <- 10^par("usr")[2] +}else if(is.null(x.categ) & x.log.scale == FALSE){ +axis(side=x.side, at=c(par()$usr[1], par()$usr[2]), labels=rep("", 2), lwd=1, lwd.ticks=0) # draw the axis line +axis(side=x.side, at=round(seq(par()$xaxp[1], par()$xaxp[2], length.out=par()$xaxp[3]+1), 2), cex.axis = x.axis.magnific) # axis(side=x.side, at=round(seq(par()$xaxp[1], par()$xaxp[2], length.out=par()$xaxp[3]+1), 2), labels = format(round(seq(par()$xaxp[1], par()$xaxp[2], length.out=par()$xaxp[3]+1), 2), big.mark=','), cex.axis = x.axis.magnific) # to get the 1000 comma separator +mtext(side = x.side, text = x.lab, line = x.dist.legend / 0.2, las = 0, cex = x.label.magnific) +if(x.nb.inter.tick > 0){ +inter.tick.unit <- (par("xaxp")[2] - par("xaxp")[1]) / par("xaxp")[3] +par(tcl = -par()$mgp[2] * sec.tick.length) # length of the ticks are reduced +suppressWarnings(rug(seq(par("xaxp")[1] - 10 * inter.tick.unit, par("xaxp")[2] + 10 * inter.tick.unit, by = inter.tick.unit / (1 + x.nb.inter.tick)), ticksize = NA, x.side)) # ticksize = NA to allow the use of par()$tcl value +par(tcl = -par()$mgp[2] * tick.length) # back to main ticks +} +x.text <- par("usr")[2] +}else if(( ! is.null(x.categ)) & x.log.scale == FALSE){ +if(is.null(x.categ.pos)){ +x.categ.pos <- 1:length(x.categ) +}else if(length(x.categ.pos) != length(x.categ)){ +stop("\n\nPROBLEM: x.categ.pos MUST BE THE SAME LENGTH AS x.categ\n\n") +} +par(xpd = TRUE) +if(x.side == 1){ +segments(x0 = x.left.plot.region, x1 = x.right.plot.region, y0 = y.bottom.plot.region, y1 = y.bottom.plot.region) # draw the line of the axis +text(x = x.categ.pos, y = y.mid.bottom.fig.region, labels = x.categ, srt = text.angle, cex = x.axis.magnific) +}else if(x.side == 3){ +segments(x0 = x.left.plot.region, x1 = x.right.plot.region, y0 = y.top.plot.region, y1 = y.top.plot.region) # draw the line of the axis +text(x = x.categ.pos, y = y.mid.top.fig.region, labels = x.categ, srt = text.angle, cex = x.axis.magnific) +}else{ +stop("\n\nARGUMENT x.side CAN ONLY BE 1 OR 3\n\n") +} +par(xpd = FALSE) +x.text <- par("usr")[2] +}else{ +stop("\n\nPROBLEM WITH THE x.side (", x.side ,") OR x.log.scale (", x.log.scale,") ARGUMENTS\n\n") +} +}else{ +x.text <- par("usr")[2] +} +if(y.side == 2 | y.side == 4){ +par(xpd=FALSE, yaxt="s") +if(is.null(y.categ) & y.log.scale == TRUE){ +if(any(par()$yaxp[1:2] == 0)){ +if(par()$yaxp[1] == 0){ +par(yaxp = c(10^-30, par()$yaxp[2:3])) # because log10(par()$yaxp[1] == 0) == -Inf +} +if(par()$yaxp[2] == 0){ +par(yaxp = c(par()$yaxp[1], 10^-30, par()$yaxp[3])) # because log10(par()$yaxp[2] == 0) == -Inf +} +} +axis(side=y.side, at=c(10^par()$usr[3], 10^par()$usr[4]), labels=rep("", 2), lwd=1, lwd.ticks=0) # draw the axis line +par(tcl = -par()$mgp[2] * sec.tick.length) # length of the ticks are reduced +suppressWarnings(rug(10^outer(c((log10(par("yaxp")[1])-1):log10(par("yaxp")[2])), log10(1:10), "+"), ticksize = NA, side = y.side)) # ticksize = NA to allow the use of par()$tcl value +par(tcl = -par()$mgp[2] * tick.length) # back to main tick length +axis(side = y.side, at = c(1e-15, 1e-14, 1e-13, 1e-12, 1e-11, 1e-10, 1e-9, 1e-8, 1e-7, 1e-6, 1e-5, 1e-4, 1e-3, 1e-2, 1e-1, 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10), labels = expression(10^-15, 10^-14, 10^-13, 10^-12, 10^-11, 10^-10, 10^-9, 10^-8, 10^-7, 10^-6, 10^-5, 10^-4, 10^-3, 10^-2, 10^-1, 10^0, 10^1, 10^2, 10^3, 10^4, 10^5, 10^6, 10^7, 10^8, 10^9, 10^10), lwd = 0, lwd.ticks = 1, cex.axis = y.axis.magnific) +y.text <- 10^(par("usr")[4] + (par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3]) * (1 - par("plt")[4])) +mtext(side = y.side, text = y.lab, line = y.dist.legend / 0.2, las = 0, cex = y.label.magnific) +}else if(is.null(y.categ) & y.log.scale == FALSE){ +axis(side=y.side, at=c(par()$usr[3], par()$usr[4]), labels=rep("", 2), lwd=1, lwd.ticks=0) # draw the axis line +axis(side=y.side, at=round(seq(par()$yaxp[1], par()$yaxp[2], length.out=par()$yaxp[3]+1), 2), cex.axis = y.axis.magnific) +mtext(side = y.side, text = y.lab, line = y.dist.legend / 0.2, las = 0, cex = y.label.magnific) +if(y.nb.inter.tick > 0){ +inter.tick.unit <- (par("yaxp")[2] - par("yaxp")[1]) / par("yaxp")[3] +par(tcl = -par()$mgp[2] * sec.tick.length) # length of the ticks are reduced +suppressWarnings(rug(seq(par("yaxp")[1] - 10 * inter.tick.unit, par("yaxp")[2] + 10 * inter.tick.unit, by = inter.tick.unit / (1 + y.nb.inter.tick)), ticksize = NA, side=y.side)) # ticksize = NA to allow the use of par()$tcl value +par(tcl = -par()$mgp[2] * tick.length) # back to main tick length +} +y.text <- (par("usr")[4] + (par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3]) * (1 - par("plt")[4])) +}else if(( ! is.null(y.categ)) & y.log.scale == FALSE){ +if(is.null(y.categ.pos)){ +y.categ.pos <- 1:length(y.categ) +}else if(length(y.categ.pos) != length(y.categ)){ +stop("\n\nPROBLEM: y.categ.pos MUST BE THE SAME LENGTH AS y.categ\n\n") +} +axis(side = y.side, at = y.categ.pos, labels = rep("", length(y.categ)), lwd=0, lwd.ticks=1) # draw the line of the axis +par(xpd = TRUE) +if(y.side == 2){ +text(x = x.mid.left.fig.region, y = y.categ.pos, labels = y.categ, srt = text.angle, cex = y.axis.magnific) +}else if(y.side == 4){ +text(x = x.mid.right.fig.region, y = y.categ.pos, labels = y.categ, srt = text.angle, cex = y.axis.magnific) +}else{ +stop("\n\nARGUMENT y.side CAN ONLY BE 2 OR 4\n\n") +} +par(xpd = FALSE) +y.text <- (par("usr")[4] + (par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3]) * (1 - par("plt")[4])) +}else{ +stop("\n\nPROBLEM WITH THE y.side (", y.side ,") OR y.log.scale (", y.log.scale,") ARGUMENTS\n\n") +} +}else{ +y.text <- (par("usr")[4] + (par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3]) * (1 - par("plt")[4])) +} +par(xpd=NA) +text(x = x.mid.right.fig.region, y = y.text, corner.text, adj=c(1, 1.1), cex = magnific.corner.text) # text at the topright corner. Replace x.right.fig.region by x.text if text at the right edge of the plot region +if(just.label.add == TRUE & x.side == 0 & x.lab != ""){ +text(x = x.mid.plot.region, y = y.mid.bottom.fig.region, x.lab, adj=c(0.5, 0.5), cex = x.label.magnific) # x label +} +if(just.label.add == TRUE & y.side == 0 & y.lab != ""){ +text(x = y.mid.plot.region, y = x.mid.left.fig.region, y.lab, adj=c(0.5, 0.5), cex = y.label.magnific) # x label +} +par(xpd=FALSE) +if(par.reset == TRUE){ +tempo.par <- fun_open(pdf.disp = FALSE, return.output = TRUE) +invisible(dev.off()) # close the new window +if( ! is.null(custom.par)){ +if( ! names(custom.par) %in% names(tempo.par$ini.par)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": custom.par ARGUMENT SHOULD HAVE THE NAMES OF THE COMPARTMENT LIST COMING FROM THE par() LIST\n\n================\n\n") +stop(tempo.cat) +} +par(custom.par) +text <- c(text, "\nGRAPH PARAMETERS SET TO VALUES DEFINED BY custom.par ARGUMENT\n") +}else{ +par(tempo.par$ini.par) +text <- c(text, "\nGRAPH PARAMETERS RESET TO par() DEFAULT VALUES\n") +} +} +output <- list(x.mid.left.dev.region = x.mid.left.dev.region, x.left.dev.region = x.left.dev.region, x.mid.right.dev.region = x.mid.right.dev.region, x.right.dev.region = x.right.dev.region, x.mid.left.fig.region = x.mid.left.fig.region, x.left.fig.region = x.left.fig.region, x.mid.right.fig.region = x.mid.right.fig.region, x.right.fig.region = x.right.fig.region, x.left.plot.region = x.left.plot.region, x.right.plot.region = x.right.plot.region, x.mid.plot.region = x.mid.plot.region, y.mid.bottom.dev.region = y.mid.bottom.dev.region, y.bottom.dev.region = y.bottom.dev.region, y.mid.top.dev.region = y.mid.top.dev.region, y.top.dev.region = y.top.dev.region, y.mid.bottom.fig.region = y.mid.bottom.fig.region, y.bottom.fig.region = y.bottom.fig.region, y.mid.top.fig.region = y.mid.top.fig.region, y.top.fig.region = y.top.fig.region, y.top.plot.region = y.top.plot.region, y.bottom.plot.region = y.bottom.plot.region, y.mid.plot.region = y.mid.plot.region, text = text) +return(output) } -######## fun_gg_bar_mean() #### ggplot2 mean barplot + overlaid dots if required - - - +######## fun_close() #### close specific graphic windows # Check OK: clear to go Apollo -fun_gg_bar_mean <- function(data1, y, categ, categ.class.order = NULL, categ.legend.name = NULL, categ.color = NULL, bar.width = 0.5, error.disp = NULL, error.whisker.width = 0.5, dot.color = "same", dot.tidy = FALSE, dot.bin.nb = 30, dot.jitter = 0.25, dot.size = 3, dot.border.size = 0.5, dot.alpha = 0.5, ylim = NULL, ylog = "no", y.tick.nb = NULL, y.inter.tick.nb = NULL, y.include.zero = FALSE, y.top.extra.margin = 0, y.bottom.extra.margin = 0, stat.disp = NULL, stat.size = 4, stat.dist = 2, xlab = NULL, ylab = NULL, vertical = TRUE, text.size = 12, title = "", title.text.size = 8, text.angle = 0, classic = FALSE, grid = FALSE, return = FALSE, plot = TRUE, add = NULL, warn.print = FALSE, path.lib = NULL){ - # AIM - # ggplot2 vertical barplot representing mean values with the possibility to add error bars and to overlay dots - # for ggplot2 specifications, see: https://ggplot2.tidyverse.org/articles/ggplot2-specs.html - # WARNINGS - # rows containing NA in data1[, c(y, categ)] will be removed before processing, with a warning (see below) - # if ever bars disappear, see the end of https://github.com/tidyverse/ggplot2/issues/2887 - # to have a single bar, create a factor column with a single class and specify the name of this column in categ argument as unique element (no categ2 in categ argument). For a single set of grouped bars, create a factor column with a single class and specify this column in categ argument as first element (categ1). See categ below - # with several single bars (categ argument with only one element), bar.width argument (i.e., width argument of ggplot2::geom_bar()) defines each bar width. The bar.width argument also defines the space between bars by using (1 - bar.width). In addition, xmin and xmax of the fun_gg_bar_mean() output report the bar boundaries (around x-axis unit 1, 2, 3, etc., for each bar) - # with several sets of grouped bars (categ argument with two elements), bar.width argument defines each set of grouped bar width. The bar.width argument also defines the space between set of grouped bars by using (1 - bar.width). In addition, xmin and xmax of the fun_gg_bar_mean() output report the bar boundaries (around x-axis unit 1, 2, 3, etc., for each set of grouped bar) - # to manually change the 0 base bar into this code, see https://stackoverflow.com/questions/35324892/ggplot2-setting-geom-bar-baseline-to-1-instead-of-zero - # ARGUMENTS - # data1: a dataframe containing one column of values (see y argument below) and one or two columns of categories (see categ argument below). Duplicated column names not allowed - # y: character string of the data1 column name for y-axis (containing numeric values). Numeric values will be averaged by categ to generate the bars and will also be used to plot the dots - # categ: vector of character strings of the data1 column name for categories (column of characters or factor). Must either be one or two column names. If a single column name (further refered to as categ1), then one bar per class of categ1. If two column names (further refered to as categ1 and categ2), then one bar per class of categ2, which form a group of bars in each class of categ1. BEWARE, categ1 (and categ2 if it exists) must have a single value of y per class of categ1 (and categ2). To have a single bar, create a factor column with a single class and specify the name of this column in categ argument as unique element (no categ2 in categ argument). For a single set of grouped bars, create a factor column with a single class and specify this column in categ argument as first element (categ1) - # categ.class.order: list indicating the order of the classes of categ1 and categ2 represented on the barplot (the first compartment for categ1 and and the second for categ2). If categ.class.order = NULL, classes are represented according to the alphabetical order. Some compartment can be NULL and other not - # categ.legend.name: character string of the legend title for categ2. If categ.legend.name = NULL, then categ.legend.name <- categ1 if only categ1 is present and categ.legend.name <- categ2 if categ1 and categ2 are present. Write "" if no legend required - # categ.color: vector of character color string for bar filling. If categ.color = NULL, default colors of ggplot2, whatever categ1 and categ2. If categ.color is non null and only categ1 in categ argument, categ.color can be either: (1) a single color string (all the bars will have this color, whatever the classes of categ1), (2) a vector of string colors, one for each class of categ1 (each color will be associated according to categ.class.order of categ1), (3) a vector or factor of string colors, like if it was one of the column of data1 data frame (beware: a single color per class of categ1 and a single class of categ1 per color must be respected). Integers are also accepted instead of character strings, as long as above rules about length are respected. Integers will be processed by fun_gg_palette() using the max integer value among all the integers in categ.color. If categ.color is non null and categ1 and categ2 specified, all the rules described above will apply to categ2 instead of categ1 (colors will be determined for bars inside a group of bars) - # bar.width: numeric value (from 0 to 1) of the bar or set of grouped bar width (see warnings above) - # error.disp: either "SD", "SD.TOP", "SEM" or "SEM.TOP". If NULL, no error bars added - # error.whisker.width: numeric value (from 0 to 1) of the whisker (error bar extremities) width, with 0 meaning no whiskers and 1 meaning a width equal to the corresponding bar width - # dot.color: vector of character string. Idem as categ.color but for dots, except that in the possibility (3), the rule "a single color per class of categ1 and a single class of categ1", cannot be respected (each dot can have a different color). If NULL, no dots plotted - # dot.tidy: logical. Nice dot spreading? If TRUE, use the geom_dotplot() function for a nice representation. If FALSE, dots are randomly spread, using the dot.jitter argument (see below) - # dot.bin.nb: positive integer indicating the number of bins (i.e., nb of separations) of the ylim range. Each dot will then be put in one of the bin, with the size the width of the bin. Not considered if dot.tidy is FALSE - # dot.jitter: numeric value (from 0 to 1) of random dot horizontal dispersion, with 0 meaning no dispersion and 1 meaning a dispersion in the corresponding bar width interval. Not considered if dot.tidy is TRUE - # dot.size: numeric value of dot size. Not considered if dot.tidy is TRUE - # dot.border.size: numeric value of border dot size. Write zero for no dot border. If dot.tidy is TRUE, value 0 remove the border. Another one leave the border without size control (geom_doplot() feature) - # dot.alpha: numeric value (from 0 to 1) of dot transparency (full transparent to full opaque, respectively) - # ylim: 2 numeric values for y-axis range. If NULL, range of y in data1. Order of the 2 values matters (for inverted axis). BEWARE: values of the ylim must be already in the corresponding log if ylog argument is not "no" (see below) - # ylog: Either "no" (values in the y argument column of the data1 data frame are not log), "log2" (values in the y argument column of the data1 data frame are log2 transformed) or "log10" (values in the y argument column of the data1 data frame are log10 transformed). BEWARE: do not tranform the data, but just display ticks in a log scale manner. Thus, negative or zero values allowed. BEWARE: not possible to have horizontal bars with a log axis, due to a bug in ggplot2 (see https://github.com/tidyverse/ggplot2/issues/881) - # y.tick.nb: approximate number of desired label values on the y-axis (n argument of the the fun_scale() function) - # y.inter.tick.nb: number of desired secondary ticks between main ticks. Not considered if ylog is other than "no". In that case, play with the ylim and y.tick.nb arguments - # y.include.zero: logical. Does ylim range include 0? Ok even if ylog = TRUE because ylim must already be log transformed values - # y.top.extra.margin: single proportion (between 0 and 1) indicating if extra margins must be added to ylim. If different from 0, add the range of the axis * y.top.extra.margin (e.g., abs(ylim[2] - ylim[1]) * y.top.extra.margin) to the top of y-axis - # y.bottom.extra.margin: idem as y.top.extra.margin but to the bottom of y-axis - # stat.disp: add the mean number above the corresponding bar. Either NULL (no number shown), "top" (at the top of the figure region) or "above" (above each bar) - # stat.size: numeric value of the stat size (in points). Increase the value to increase text size - # stat.dist: numeric value of the stat distance. Increase the value to increase the distance - # xlab: a character string or expression for x-axis legend. If NULL, character string of categ1 - # ylab: a character string or expression for y-axis legend. If NULL, character string of the y argument - # vertical: logical. Vertical bars? BEWARE: will be automatically set to TRUE if ylog argument is other than "no". Indeed, not possible to have horizontal bars with a log axis, due to a bug in ggplot2 (see https://github.com/tidyverse/ggplot2/issues/881) - # text.size: numeric value of the size of the (1) axis numbers and axis legends, (2) texts in the graphic legend, (3) stats above bars (in points) - # title: character string of the graph title - # title.text.size: numeric value of the title size (in points) - # text.angle: integer value of the text angle for the x-axis labels. Positive values for counterclockwise rotation: 0 for horizontal, 90 for vertical, 180 for upside down etc. Negative values for clockwise rotation: 0 for horizontal, -90 for vertical, -180 for upside down etc. - # classic: logical. Use the classic theme (article like)? - # grid: logical. draw horizontal lines in the background to better read the bar values? Not considered if classic = FALSE - # return: logical. Return the graph parameters? - # plot: logical. Plot the graphic? If FALSE and return argument is TRUE, graphical parameters and associated warnings are provided without plotting - # add: character string allowing to add more ggplot2 features (dots, lines, themes, etc.). BEWARE: (1) must start with "+" just after the simple or double opening quote (no space, end of line, carriage return, etc., allowed), (2) must finish with ")" just before the simple or double closing quote (no space, end of line, carriage return, etc., allowed) and (3) each function must be preceded by "ggplot2::" (for instance: "ggplot2::coord_flip()). If the character string contains the "ggplot2::theme" string, then internal ggplot2 theme() and theme_classic() functions will be inactivated to be reused by add. BEWARE: handle this argument with caution since added functions can create conflicts with the preexisting internal ggplot2 functions - # warn.print: logical. Print warnings at the end of the execution? No print if no warning messages - # path.lib: absolute path of the required packages, if not in the default folders - # REQUIRED PACKAGES - # ggplot2 - # scales - # REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION - # fun_2d_comp() - # fun_gg_just() - # fun_gg_palette() - # fun_name_change() - # fun_pack() - # fun_check() - # fun_round() - # fun_scale() - # RETURN - # a barplot if plot argument is TRUE - # a list of the graph info if return argument is TRUE: - # $stat: the graphic statistics - # $removed.row.nb: which rows have been removed due to NA detection in y and categ columns (NULL if no row removed) - # $removed.rows: removed rows containing NA (NULL if no row removed) - # $data: the graphic bar and dot coordinates - # $axes: the x-axis and y-axis info - # $warnings: the warning messages. Use cat() for proper display. NULL if no warning - # EXAMPLES - ### nice representation (1) - # obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), categ.class.order = list(NULL, c("B", "A")), categ.legend.name = "LEGEND", categ.color = NULL, bar.width = 0.3, error.disp = "SD.TOP", error.whisker.width = 0.8, dot.color = "same", dot.jitter = 0.5, dot.size = 3.5, dot.border.size = 0.2, dot.alpha = 0.5, ylim = c(10, 25), y.include.zero = TRUE, stat.disp = "above", stat.size = 4, xlab = "GROUP", ylab = "MEAN", text.size = 12, title = "GRAPH1", title.text.size = 8, text.angle = 0, classic = TRUE, grid = TRUE) - ### nice representation (2) - # set.seed(1) ; obs1 <- data.frame(Time = c(rnorm(24, 0), rnorm(24, -10), rnorm(24, 10), rnorm(24, 20)), Group1 = rep(c("CAT", "DOG"), times = 48), Group2 = rep(c("A", "B", "C", "D"), each = 24)) ; set.seed(NULL) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), categ.class.order = list(NULL, c("B", "A", "D", "C")), categ.legend.name = "LEGEND", categ.color = NULL, bar.width = 0.8, dot.color = "grey50", dot.tidy = TRUE, dot.bin.nb = 60, dot.size = 3.5, dot.border.size = 0.2, dot.alpha = 0.5, ylim= c(-20, 30), stat.disp = "above", stat.size = 4, stat.dist = 1, xlab = "GROUP", ylab = "MEAN", vertical = FALSE, text.size = 12, title = "GRAPH1", title.text.size = 8, text.angle = 45, classic = FALSE) - ### simple example - # obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = "Group1") - ### separate bars. Example (1) of modification of bar color using a single value - # obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = "Group1", categ.color = "white") - ### separate bars. Example (2) of modification of bar color using one value par class of categ2 - # obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = "Group1", categ.color = c("coral", "lightblue")) - ### separate bars. Example (3) of modification of bar color using the bar.color data frame column, with respect of the correspondence between categ2 and bar.color columns - # obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10), bar.color = rep(c("coral", "lightblue"), time = 10)) ; obs1 ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = "Group1", categ.color = obs1$bar.color) - ### separate bars. Example (1) of modification of dot color, using the same dot color as the corresponding bar - # obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = "Group1", dot.color = "same") - ### separate bars. Example (2) of modification of dot color, using a single color for all the dots - # obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = "Group1", dot.color = "green") - ### separate bars. Example (3) of modification of dot color, using one value par class of categ2 - # obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = "Group1", dot.color = c("green", "brown")) - ### separate bars. Example (4) of modification of dot color, using different colors for each dot - # obs1 <- data.frame(Time = 1:10, Group1 = rep(c("G", "H"), times = 5)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = "Group1", dot.color = hsv(h = (1:nrow(obs1)) / nrow(obs1))) - ### grouped bars. Simple example - # obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2")) - ### grouped bars. More grouped bars - # obs1 <- data.frame(Time = 1:24, Group1 = rep(c("G", "H"), times = 12), Group2 = rep(c("A", "B", "C", "D"), each = 6)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2")) - ### grouped bars. Example (1) of modification of bar color, using a single value - # obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), categ.color = "white") - ### grouped bars. Example (2) of modification of bar color, using one value par class of categ2 - # obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), categ.color = c("coral", "lightblue")) - ### grouped bars. Example (3) of modification of bar color, using one value per line of obs1, with respect of the correspondence between categ2 and bar.color columns - # obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10), bar.color = rep(c("coral", "lightblue"), each = 10)) ; obs1 ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), categ.color = obs1$bar.color) - ### grouped bars. Example (1) of modification of dot color, using the same dot color as the corresponding bar - # obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), dot.color = "same") - ### grouped bars. Example (2) of modification of dot color, using a single color for all the dots - # obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), dot.color = "green") - ### grouped bars. Example (3) of modification of dot color, using one value par class of categ2 - # obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), dot.color = c("green", "brown")) - ### grouped bars. Example (4) of modification of dot color, using different colors for each dot - # obs1 <- data.frame(Time = 1:10, Group1 = rep(c("G", "H"), times = 5), Group2 = rep(c("A", "B"), each = 5)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), dot.color = hsv(h = (1:nrow(obs1)) / nrow(obs1))) - ### no dots (y.include.zero set to TRUE to see the lowest bar): - # obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), dot.color = NULL, y.include.zero = TRUE) - ### bar width. Example (1) with bar.width = 0.25 -> three times more space between single bars than the bar width (y.include.zero set to TRUE to see the lowest bar) - # obs1 <- data.frame(Time = 1:1000, Group1 = rep(c("G", "H"), each = 500)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = "Group1", dot.color = NULL, y.include.zero = TRUE, bar.width = 0.25) - ### bar width. Example (2) with bar.width = 1, no space between single bars - # obs1 <- data.frame(Time = 1:1000, Group1 = rep(c("G", "H"), each = 500)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = "Group1", dot.color = NULL, y.include.zero = TRUE, bar.width = 1) - ### bar width. Example (3) with bar.width = 0.25 -> three times more space between sets of grouped bars than the set width - # obs1 <- data.frame(Time = 1:1000, Group1 = rep(c("G", "H"), times = 500), Group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), dot.color = NULL, y.include.zero = TRUE, bar.width = 0.25) - ### bar width. Example (4) with bar.width = 0 -> no space between sets of grouped bars - # obs1 <- data.frame(Time = 1:1000, Group1 = rep(c("G", "H"), times = 500), Group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), dot.color = NULL, y.include.zero = TRUE, bar.width = 1) - ### error bars - # obs1 <- data.frame(Time = 1:1000, Group1 = rep(c("G", "H"), times = 500), Group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), dot.color = NULL, error.disp = "SD.TOP") - ### whisker width. Example (1) with error.whisker.width = 1 -> whiskers have the width of the corresponding bar - # obs1 <- data.frame(Time = 1:1000, Group1 = rep(c("G", "H"), times = 500), Group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), dot.color = NULL, error.disp = "SD", error.whisker.width = 1) - ### whisker width. Example (2) error bars with no whiskers - # obs1 <- data.frame(Time = 1:1000, Group1 = rep(c("G", "H"), times = 500), Group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), dot.color = NULL, error.disp = "SD", error.whisker.width = 0) - ### tidy dot distribution. Example (1) - # obs1 <- data.frame(Time = 1:1000, Group1 = rep(c("G", "H"), times = 500), Group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), dot.color = "same", dot.tidy = TRUE, dot.bin.nb = 100) - ### tidy dot distribution. Example (2) reducing the dot size with dot.bin.nb - # obs1 <- data.frame(Time = 1:1000, Group1 = rep(c("G", "H"), times = 500), Group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), dot.color = "same", dot.tidy = TRUE, dot.bin.nb = 150) - ### dot jitter. Example (1) - # obs1 <- data.frame(Time = 1:1000, Group1 = rep(c("G", "H"), times = 500), Group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), dot.color = "same", dot.tidy = FALSE, dot.jitter = 1, dot.size = 2) - ### dot jitter. Example (2) with dot.jitter = 1 -> dispersion around the corresponding bar width - # obs1 <- data.frame(Time = 1:1000, Group1 = rep(c("G", "H"), times = 500), Group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), dot.color = "grey", dot.size = 3, dot.alpha = 1, dot.jitter = 1) - ### dot jitter. Example (3) with no dispersion - # obs1 <- data.frame(Time = 1:100, Group1 = rep(c("G", "H"), times = 50), Group2 = rep(LETTERS[1:5], each = 20)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), dot.color = "grey", dot.size = 3, dot.alpha = 1, dot.jitter = 0) - ### dot size, dot border size and dot transparency - # obs1 <- data.frame(Time = 1:100, Group1 = rep(c("G", "H"), times = 50), Group2 = rep(LETTERS[1:5], each = 20)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), dot.color = "grey", dot.size = 4, dot.border.size = 0, dot.alpha = 0.6) - ### y-axis limits. Example (1) - # obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), ylim = c(-1, 25)) - ### y-axis limits. Example (2) showing that order matters in ylim argument - # obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), ylim = c(25, -1)) - ### log scale. Example (1). BEWARE: y column must be log, otherwise incoherent scale (see below warning message with the return argument) - # obs1 <- data.frame(Time = log10((1:20) * 100), Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), ylog = "log10") - ### log scale. Example (2). BEWARE: values of the ylim must be in the corresponding log - # obs1 <- data.frame(Time = log10((1:20) * 100), Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), ylog = "log10", ylim = c(1,4)) - ### tick number. Example (1) - # obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), y.tick.nb = 10) - ### tick number. Example (2) using a log2 scale - # obs1 <- data.frame(Time = log2((1:20) * 100), Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), ylog = "log2", y.tick.nb = 10, ylim = c(1, 16)) - ### tick number. Example (3) using a log10 scale - # obs1 <- data.frame(Time = log10((1:20) * 100), Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), ylog = "log10", y.tick.nb = 10) - ### tick number. Example (4) using a log10 scale: the reverse y-axis correctly deal with log10 scale - # obs1 <- data.frame(Time = log10((1:20) * 100), Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), ylog = "log10", y.tick.nb = 10, ylim = c(4, 1)) - ### secondary tick number. Example (1) - # obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), y.inter.tick.nb = 2) - ### secondary ticks. Example (2) not for log2 and log10 scales (see below warning message with the return argument) - # obs1 <- data.frame(Time = log10((1:20) * 100), Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), ylog = "log10", y.inter.tick.nb = 2) - ### include zero in the y-axis - # obs1 <- data.frame(Time = (1:20), Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), y.include.zero = TRUE) - ### extra margins. To avoid dot cuts - # obs1 <- data.frame(Time = (1:20), Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), y.top.extra.margin = 0.25, y.bottom.extra.margin = 0.25) - ### mean diplay. Example (1) at the top of the plot region - # obs1 <- data.frame(Time = (1:20), Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), y.top.extra.margin = 0.1, stat.disp = "top", stat.size = 4, stat.dist = 2) - ### mean diplay. Example (2) above bars - # obs1 <- data.frame(Time = (1:20), Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), y.top.extra.margin = 0.1, stat.disp = "above", stat.size = 4, stat.dist = 2) - ### bar orientation. Example (1) without log scale, showing that the other arguments are still operational - # obs1 <- data.frame(Time = (1:20), Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), y.tick.nb = 10, y.inter.tick.nb = 2, y.include.zero = TRUE, vertical = FALSE) - ### bar orientation. Example (2) with log scale. Horizontal orientation is blocked with log2 and log10 scales because of a bug in ggplot2 (https://github.com/tidyverse/ggplot2/issues/881) - # obs1 <- data.frame(Time = log10((1:20) * 100), Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), ylog = "log10", vertical = FALSE) - ### classic representation (use grid = TRUE to display the background lines of the y axis ticks) - # obs1 <- data.frame(Time = (1:20), Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), classic = TRUE, grid = FALSE) - ### graphic info. Example (1) - # obs1 <- data.frame(Time = log10((1:20) * 100), Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), return = TRUE) - ### graphic info. Example (2) of assignation and warning message display - # obs1 <- data.frame(Time = log10((1:20) * 100), Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; warn <- fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), ylog = "log10", return = TRUE) ; cat(warn$warnings) - ### add ggplot2 functions - # obs1 <- data.frame(Time = log10((1:20) * 100), Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), add = "+ggplot2::theme_classic()") - ### all the arguments - # obs1 <- data.frame(x = 1:20, Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "x", categ = c("Group1", "Group2"), categ.class.order = list(NULL, c("B", "A")), categ.legend.name = "", categ.color = c("red", "blue"), bar.width = 0.25, error.disp = "SD", error.whisker.width = 0.8, dot.color = "grey", dot.tidy = FALSE, dot.bin.nb = 30, dot.jitter = 1, dot.size = 4, dot.border.size = 0, dot.alpha = 1, ylim = c(0, 25), ylog = "no", y.tick.nb = NULL, y.inter.tick.nb = NULL, y.include.zero = FALSE, y.top.extra.margin = 0.05, y.bottom.extra.margin = 0, stat.disp = "above", stat.size = 4, stat.dist = 2, xlab = "GROUP", ylab = "MEAN", vertical = FALSE, text.size = 12, title = "", title.text.size = 8, text.angle = 45, classic = TRUE, grid = TRUE, return = TRUE, plot = TRUE, add = NULL, warn.print = TRUE, path.lib = NULL) - # DEBUGGING - # data1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10), bar.color = rep(c("brown", "orange"), each = 10)) ; data1[2:3, 1] <- NA ; data1[7:8, 2] <- NA ; y = names(data1)[1] ; categ = c(names(data1)[2], names(data1)[3]) ; categ.class.order = list(L1 = NULL, L2 = c("B", "A")) ; categ.legend.name = NULL ; categ.color = na.omit(data1)$bar.color ; bar.width = 0.5 ; error.disp = "SD" ; error.whisker.width = 0.5 ; dot.color = "same" ; dot.tidy = FALSE ; dot.bin.nb = 30 ; dot.jitter = 0.25 ; dot.size = 3 ; dot.border.size = 0.5 ; dot.alpha = 1 ; ylim = NULL ; ylog = "no" ; y.tick.nb = NULL ; y.inter.tick.nb = NULL ; y.include.zero = FALSE ; y.top.extra.margin = 0.05 ; y.bottom.extra.margin = 0 ; stat.disp = NULL ; stat.size = 4 ; stat.dist = 2 ; xlab = NULL ; ylab = NULL ; vertical = TRUE ; text.size = 12 ; title = "" ; title.text.size = 8 ; text.angle = 0 ; classic = FALSE ; grid = FALSE ; return = FALSE ; plot = TRUE ; add = NULL ; warn.print = TRUE ; path.lib = NULL - # data1 <-data.frame(a = rep(1:20, 5), group1 = rep(c("G", "H"), times = 50), group2 = rep(LETTERS[1:5], each = 20)) ; y = names(data1)[1] ; categ = c(names(data1)[2], names(data1)[3]) ; categ.class.order = list(L1 = NULL, L2 = c("B", "A", "E", "D", "C")) ; categ.legend.name = NULL ; categ.color = NULL ; bar.width = 0.5 ; error.disp = "SD" ; error.whisker.width = 0.5 ; dot.color = "same" ; dot.tidy = TRUE ; dot.bin.nb = 30 ; dot.jitter = 0.25 ; dot.size = 3 ; dot.border.size = 0.5 ; dot.alpha = 1 ; ylim = NULL ; ylog = "no" ; y.tick.nb = NULL ; y.inter.tick.nb = NULL ; y.include.zero = FALSE ; y.top.extra.margin = 0.05 ; y.bottom.extra.margin = 0 ; stat.disp = NULL ; stat.size = 4 ; stat.dist = 2 ; xlab = NULL ; ylab = NULL ; vertical = TRUE ; text.size = 12 ; title = "" ; title.text.size = 8 ; text.angle = 0 ; classic = FALSE ; grid = FALSE ; return = FALSE; plot = TRUE ; add = NULL ; warn.print = TRUE ; path.lib = NULL - # data1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10), bar.color = rep(c("brown", "orange"), each = 10)) ; data1[2:3, 1] <- NA ; data1[7:8, 2] <- NA ; y = names(data1)[1] ; categ = c(names(data1)[2], names(data1)[3]) ; categ.class.order = list(L1 = NULL, L2 = c("B", "A")) ; categ.legend.name = NULL ; categ.color = na.omit(data1)$bar.color ; bar.width = 0.5 ; error.disp = "SD" ; error.whisker.width = 0.5 ; dot.color = "same" ; dot.tidy = TRUE ; dot.bin.nb = 30 ; dot.jitter = 0.25 ; dot.size = 3 ; dot.border.size = 0.5 ; dot.alpha = 1 ; ylim = NULL ; ylog = "no" ; y.tick.nb = NULL ; y.inter.tick.nb = NULL ; y.include.zero = FALSE ; y.top.extra.margin = 0.05 ; y.bottom.extra.margin = 0 ; stat.disp = "above" ; stat.size = 4 ; stat.dist = 2 ; xlab = NULL ; ylab = NULL ; vertical = TRUE ; text.size = 12 ; title = "" ; title.text.size = 8 ; text.angle = 0 ; classic = FALSE ; grid = FALSE ; return = FALSE; plot = TRUE ; add = NULL ; warn.print = TRUE ; path.lib = NULL - # set.seed(1) ; data1 <- data.frame(a = c(rnorm(25, 0), rnorm(25, -10), rnorm(25, 10), rnorm(25, 20)), group1 = rep(c("G", "H"), times = 50), group2 = rep(c("A", "B", "C", "D"), each = 25)) ; set.seed(NULL) ; y = "Time" ; categ = c("group1", "group2") ; categ.class.order = list(NULL, c("B", "A", "D", "C")) ; categ.legend.name = "LEGEND" ; categ.color = NULL ; bar.width = 0.8 ; error.disp = "SD" ; error.whisker.width = 0.5 ; dot.color = "same" ; dot.tidy = TRUE ; dot.bin.nb = 60 ; dot.jitter = 0.25 ; dot.size = 3.5 ; dot.border.size = 0 ; dot.alpha = 1 ; ylim= c(-15, 25) ; ylog = "no" ; y.tick.nb = NULL ; y.inter.tick.nb = NULL ; y.include.zero = "no" ; y.top.extra.margin = 0.05 ; y.bottom.extra.margin = 0 ; stat.disp = "above" ; stat.size = 4 ; stat.dist = 2 ; xlab = "GROUP" ; ylab = "MEAN" ; vertical = FALSE ; text.size = 12 ; title = "" ; title.text.size = 8 ; text.angle = -200 ; classic = FALSE ; grid = FALSE ; return = FALSE; plot = TRUE ; add = NULL ; warn.print = TRUE ; path.lib = NULL - # set.seed(1) ; data1 <- data.frame(x = 1:1000, group1 = rep(c("G", "H"), times = 500), group2 = rep(LETTERS[1:5], each = 200)) ; set.seed(NULL) ; y = "x" ; categ <- c("group1", "group2") ; categ.class.order = list(NULL, c("B", "A", "D", "C", "E")) ; categ.legend.name = "LEGEND" ; categ.color = NULL ; bar.width = 0.8 ; error.disp = "SD" ; error.whisker.width = 1 ; dot.color = NULL ; dot.tidy = FALSE ; dot.bin.nb = 60 ; dot.jitter = 0.25 ; dot.size = 3.5 ; dot.border.size = 0.2 ; dot.alpha = 1 ; ylim= c(1, 4) ; ylog = "log10" ; y.tick.nb = NULL ; y.inter.tick.nb = NULL ; y.include.zero = FALSE ; y.top.extra.margin = 0 ; y.bottom.extra.margin = 0 ; stat.disp = "above" ; stat.size = 4 ; stat.dist = 1 ; xlab = "GROUP" ; ylab = "MEAN" ; vertical = TRUE ; text.size = 12 ; title = "" ; title.text.size = 8 ; text.angle = -200 ; classic = FALSE ; grid = FALSE ; return = FALSE; plot = TRUE ; add = NULL ; warn.print = TRUE ; path.lib = NULL - # function name - function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") - # end function name - # required function checking - if(length(find("fun_2d_comp", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_2d_comp() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - if(length(find("fun_gg_just", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_gg_just() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - if(length(find("fun_gg_palette", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_gg_palette() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - if(length(find("fun_name_change", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_name_change() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - if(length(find("fun_pack", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_pack() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - if(length(find("fun_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - if(length(find("fun_round", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_round() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - if(length(find("fun_scale", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_scale() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # reserved words to avoid bugs (used in this function) - reserved.words <- c("categ.check", "categ.color", "dot.color", "dot.max", "dot.min", "ERROR.INF", "ERROR.SUP", "group", "group.check", "max.dot.error", "MEAN", "min.dot.error", "SD", "SEM", "tempo.categ1", "tempo.categ2", "text.max.pos", "text.min.pos", "x", "x.y", "y", "y.check", "y_from.dot.max", "ymax") - # end reserved words to avoid bugs (used in this function) - # argument checking (and modification for proper color management) - warning <- NULL - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_check(data = data1, class = "data.frame", na.contain = TRUE, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & any(duplicated(names(data1)))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": DUPLICATED COLUMN NAMES OF data1 ARGUMENT NOT ALLOWED:\n", paste(names(data1)[duplicated(names(data1))], collapse = " "), "\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - tempo <- fun_check(data = y, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & ! (y %in% names(data1))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": y ARGUMENT MUST BE A COLUMN NAME OF data1\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - }else if(tempo$problem == FALSE){ - tempo <- fun_check(data = data1[, y], data.name = "y COLUMN OF data1", class = "vector", mode = "numeric", na.contain = TRUE, fun.name = function.name) ; eval(ee) - } - tempo <- fun_check(data = categ, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & length(categ) > 2){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": categ ARGUMENT CANNOT HAVE MORE THAN 2 COLUMN NAMES OF data1\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - }else if(tempo$problem == FALSE & ! all(categ %in% names(data1))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": categ ARGUMENT MUST BE COLUMN NAMES OF data1. HERE IT IS:\n", paste(categ, collapse = " "), "\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - # reserved word checking - if(any(names(data1) %in% reserved.words)){ - if(any(duplicated(names(data1)))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": DUPLICATED COLUMN NAMES OF data1 ARGUMENT NOT ALLOWED:\n", paste(names(data1)[duplicated(names(data1))], collapse = " "), "\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - tempo.output <- fun_name_change(names(data1), reserved.words) - for(i3 in 1:length(tempo.output$ini)){ # a loop to be sure to take the good ones - names(data1)[names(data1) == tempo.output$ini[i3]] <- tempo.output$post[i3] - if(any(y == tempo.output$ini[i3])){ - y[y == tempo.output$ini[i3]] <- tempo.output$post[i3] - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": IN y ARGUMENT (COLUMN NAMES OF data1 ARGUMENT),\n", tempo.output$ini[i3], " HAS BEEN REPLACED BY ", tempo.output$post[i3], "\nBECAUSE RISK OF BUG AS SOME NAMES IN y ARGUMENT ARE RESERVED WORD USED BY THE ", function.name, " FUNCTION") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - if(any(categ == tempo.output$ini[i3])){ - categ[categ == tempo.output$ini[i3]] <- tempo.output$post[i3] - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": IN categ ARGUMENT (COLUMN NAMES OF data1 ARGUMENT),\n", tempo.output$ini[i3], " HAS BEEN REPLACED BY ", tempo.output$post[i3], "\nBECAUSE RISK OF BUG AS SOME NAMES IN categ ARGUMENT ARE RESERVED WORD USED BY THE ", function.name, " FUNCTION") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - } - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": REGARDING COLUMN NAMES REPLACEMENT, THE NAMES\n", paste(tempo.output$ini, collapse = " "), "\nHAVE BEEN REPLACED BY\n", paste(tempo.output$post, collapse = " ")) - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - # end reserved word checking - # na detection and removal (done now to be sure of the correct length of categ) - if(any(is.na(data1[, c(y, categ)]))){ - removed.row.nb <- unlist(lapply(lapply(c(data1[c(y, categ)]), FUN = is.na), FUN = which)) - removed.rows <- data1[removed.row.nb, ] - data1 <- data1[-removed.row.nb, ] - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": NA DETECTED IN COLUMN ", paste(c(y, categ), collapse = " "), " OF data1 AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - }else{ - removed.row.nb <- NULL - removed.rows <- NULL - } - # end na detection and removal (done now to be sure of the correct length of categ) - for(i1 in 1:length(categ)){ - if(any(is.na(data1[, categ[i1]]))){ - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": IN categ NUMBER ", i1, " IN data1, THE CATEGORY COLUMN ", categ[i1], " CONTAINS NA") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - tempo1 <- fun_check(data = data1[, categ[i1]], data.name = paste0("categ NUMBER ", i1, " OF data1"), class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name, print = FALSE) - tempo2 <- fun_check(data = data1[, categ[i1]], data.name = paste0("categ NUMBER ", i1, " OF data1"), class = "factor", na.contain = TRUE, fun.name = function.name, print = FALSE) - if(tempo1$problem == TRUE & tempo2$problem == TRUE){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", paste0("categ NUMBER ", i1, " OF data1"), " MUST BE A FACTOR OR CHARACTER VECTOR\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - }else if(tempo1$problem == FALSE){ - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": IN categ NUMBER ", i1, " IN data1, THE CHARACTER COLUMN HAS BEEN CONVERTED TO FACTOR") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - data1[, categ[i1]] <- factor(data1[, categ[i1]]) # if already a factor, change nothing, if characters, levels according to alphabetical order - } - if( ! is.null(categ.class.order)){ - tempo <- fun_check(data = categ.class.order, class = "list", fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & length(categ.class.order) > 2){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": categ.class.order ARGUMENT MUST BE A LIST OF MAX LENGTH 2\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - }else if(tempo$problem == FALSE){ - for(i3 in 1:length(categ.class.order)){ - if(is.null(categ.class.order[[i3]])){ - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": THE categ.class.order COMPARTMENT ", i3, " IS NULL. ALPHABETICAL ORDER WILL BE APPLIED") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - data1[, categ[i3]] <- factor(as.character(data1[, categ[i3]])) # if already a factor, change nothing, if characters, levels according to alphabetical order - }else if(any(duplicated(categ.class.order[[i3]]))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": COMPARTMENT ", i3, " OF categ.class.order ARGUMENT CANNOT HAVE DUPLICATED CLASSES: ", paste(categ.class.order[[i3]], collapse = " "), "\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - }else if( ! (all(categ.class.order[[i3]] %in% unique(data1[, categ[i3]])) & all(unique(data1[, categ[i3]]) %in% categ.class.order[[i3]]))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": COMPARTMENT ", i3, " OF categ.class.order ARGUMENT MUST BE CLASSES OF ELEMENT ", i3, " OF categ\nHERE IT IS:\nCOMPARTMENT ", i3, " OF categ.class.order:", paste(categ.class.order[[i3]], collapse = " "), "\nCOLUMN ", categ[i3], " OF data1: ", paste( unique(data1[, categ[i3]]), collapse = " "), "\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - }else{ - data1[, categ[i3]] <- factor(data1[, categ[i3]], levels = categ.class.order[[i3]]) # reorder the factor - - } - } - } - } - if( ! is.null(categ.legend.name)){ - tempo <- fun_check(data = categ.legend.name, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) - }else{ - categ.legend.name <- categ[length(categ)] # if only categ1, then legend name of categ1, if length(categ) == 2, then legend name of categ2 - } - if( ! is.null(categ.color)){ - # check the nature of color - tempo1 <- fun_check(data = categ.color, class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name, print = FALSE) - tempo2 <- fun_check(data = categ.color, class = "factor", na.contain = TRUE, fun.name = function.name, print = FALSE) - if(tempo1$problem == TRUE & tempo2$problem == TRUE){ - # integer colors into gg_palette - tempo.check.color <- fun_check(data = categ.color, class = "integer", double.as.integer.allowed = TRUE, na.contain = TRUE, fun.name = function.name, print = FALSE)$problem - if(tempo.check.color == TRUE){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": categ.color MUST BE A FACTOR OR CHARACTER VECTOR OR INTEGER VECTOR\n\n================\n\n") # integer possible because dealt above - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - }else{ # convert integers into colors - categ.color <- fun_gg_palette(max(categ.color, na.rm = TRUE)) - } - # end integer colors into gg_palette - } - if( ! (all(categ.color %in% colors() | grepl(pattern = "^#", categ.color)))){ # check that all strings of low.color start by # - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": categ.color ARGUMENT MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # AND/OR COLOR NAMES GIVEN BY colors(): ", paste(unique(categ.color), collapse = " "), "\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - if(any(is.na(categ.color))){ - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": categ.color ARGUMENT CONTAINS NA") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - # end check the nature of color - # check the length of color - # No problem of NA management by ggplot2 because already removed - i0 <- length(categ) # if only categ1, then colors for classes of categ1, if length(categ) == 2, then colors for classes of categ2 - if(length(categ.color) == length(unique(data1[, categ[i0]]))){ # here length(categ.color) is equal to the different number of categ - data1[, categ[i0]] <- factor(data1[, categ[i0]]) # if already a factor, change nothing, if characters, levels according to alphabetical order - data1 <- data.frame(data1, categ.color = data1[, categ[i0]]) - levels(data1$categ.color) <- categ.color - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": IN ", categ[i0], " OF categ ARGUMENT, THE FOLLOWING COLORS:\n", paste(categ.color, collapse = " "), "\nHAVE BEEN ATTRIBUTED TO THESE CLASSES:\n", paste(levels(factor(data1[, categ[i0]])), collapse = " ")) - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - }else if(length(categ.color) == length(data1[, categ[i0]])){# here length(categ.color) is equal to nrow(data1) -> Modif to have length(categ.color) equal to the different number of categ (length(categ.color) == length(levels(data1[, categ[i0]]))) - data1 <- data.frame(data1, categ.color = categ.color) - tempo.check <- unique(data1[ , c(categ[i0], "categ.color")]) - if( ! (nrow(tempo.check) == length(unique(categ.color)) & nrow(tempo.check) == length(unique(data1[ , categ[i0]])))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": categ.color ARGUMENT HAS THE LENGTH OF data1 ROW NUMBER\nBUT IS INCORRECTLY ASSOCIATED TO EACH CLASS OF categ ", categ[i0], ":\n", paste(unique(mapply(FUN = "paste", data1[ ,categ[i0]], data1[ ,"categ.color"])), collapse = "\n"), "\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - }else{ - data1[, categ[i0]] <- factor(data1[, categ[i0]]) # if already a factor, change nothing, if characters, levels according to alphabetical order - categ.color <- unique(categ.color[order(data1[, categ[i0]])]) # Modif to have length(categ.color) equal to the different number of categ (length(categ.color) == length(levels(data1[, categ[i0]]))) - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": categ.color ARGUMENT HAS THE LENGTH OF data1 ROW NUMBER\nCOLORS HAVE BEEN RESPECTIVELY ASSOCIATED TO EACH CLASS OF categ ", categ[i0], " AS:\n", paste(levels(factor(data1[, categ[i0]])), collapse = " "), "\n", paste(categ.color, collapse = " ")) - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - }else if(length(categ.color) == 1){ - data1[, categ[i0]] <- factor(data1[, categ[i0]]) # if already a factor, change nothing, if characters, levels according to alphabetical order - data1 <- data.frame(data1, categ.color = categ.color) - categ.color <- rep(categ.color, length(levels(data1[, categ[i0]]))) - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": categ.color ARGUMENT HAS LENGTH 1, MEANING THAT ALL THE DIFFERENT CLASSES OF ", categ[i0], "\n", paste(levels(factor(data1[, categ[i0]])), collapse = " "), "\nWILL HAVE THE SAME COLOR\n", paste(categ.color, collapse = " ")) - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - }else{ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": categ.color ARGUMENT MUST BE (1) LENGTH 1, OR (2) THE LENGTH OF data1 NROWS, OR (3) THE LENGTH OF THE CLASSES IN THE categ ", categ[i0], " COLUMN. HERE IT IS COLOR LENGTH ", length(categ.color), " VERSUS CATEG LENGTH ", length(data1[, categ[i0]]), " AND CATEG CLASS LENGTH ", length(unique(data1[, categ[i0]])), "\nPRESENCE OF NA COULD BE THE PROBLEM\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - }else{ - i0 <- length(categ) # if only categ1, then colors for classes of categ1, if length(categ) == 2, then colors for classes of categ2 - data1[, categ[i0]] <- factor(data1[, categ[i0]]) # if already a factor, change nothing, if characters, levels according to alphabetical order - categ.color <- fun_gg_palette(length(levels(data1[, categ[i0]]))) - data1 <- data.frame(data1, categ.color = data1[, categ[i0]]) - levels(data1$categ.color) <- categ.color - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": NULL categ.color ARGUMENT -> COLORS RESPECTIVELY ATTRIBUTED TO EACH CLASS OF ", categ[i0], " IN data1:\n", paste(categ.color, collapse = " "), "\n", paste(levels(data1[, categ[i0]]), collapse = " ")) - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - tempo <- fun_check(data = bar.width, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) - if( ! is.null(error.disp)){ - tempo <- fun_check(data = error.disp, options = c("SD", "SD.TOP", "SEM", "SEM.TOP"), length = 1, fun.name = function.name) ; eval(ee) - } - tempo <- fun_check(data = error.whisker.width, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) - if( ! is.null(dot.color)){ - # check the nature of color - tempo1 <- fun_check(data = dot.color, class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name, print = FALSE) - tempo2 <- fun_check(data = dot.color, class = "factor", na.contain = TRUE, fun.name = function.name, print = FALSE) - if(tempo1$problem == TRUE & tempo2$problem == TRUE){ - # integer colors into gg_palette - tempo.check.color <- fun_check(data = dot.color, class = "integer", double.as.integer.allowed = TRUE, na.contain = TRUE, fun.name = function.name, print = FALSE)$problem - if(tempo.check.color == TRUE){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": dot.color MUST BE A FACTOR OR CHARACTER VECTOR OR INTEGER VECTOR\n\n================\n\n") # integer possible because dealt above - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - }else{ # convert integers into colors - dot.color <- fun_gg_palette(max(dot.color, na.rm = TRUE)) - } - # end integer colors into gg_palette - } - if(all(dot.color == "same") & length(dot.color) == 1){ - dot.color <- categ.color # same color of the dots as the corresponding bar color - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": dot.color ARGUMENT HAS BEEN SET TO \"SAME\"\nTHUS, DOT COLORS HAVE BEEN RESPECTIVELY ASSOCIATED TO EACH CLASS OF categ ", categ[i0], " AS:\n", paste(levels(factor(data1[, categ[i0]])), collapse = " "), "\n", paste(levels(factor(dot.color)), collapse = " ")) - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - }else if( ! (all(dot.color %in% colors() | grepl(pattern = "^#", dot.color)))){ # check that all strings of low.color start by # - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": dot.color ARGUMENT MUST BE (1) A HEXADECIMAL COLOR VECTOR STARTING BY #, OR (2) COLOR NAMES GIVEN BY colors(), OR (3) INTEGERS, OR THE STRING\"same\"\nHERE IT IS: ", paste(unique(dot.color), collapse = " "), "\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - if(any(is.na(dot.color))){ - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": dot.color ARGUMENT CONTAINS NA") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - # end check the nature of color - # check the length of color - # No problem of NA management by ggplot2 because already removed - i0 <- length(categ) # if only categ1, then colors for classes of categ1, if length(categ) == 2, then colors for classes of categ2 - if(length(dot.color) == length(unique(data1[, categ[i0]]))){ # here length(dot.color) is equal to the different number of categ - data1[, categ[i0]] <- factor(data1[, categ[i0]]) # if already a factor, change nothing, if characters, levels according to alphabetical order - data1 <- data.frame(data1, dot.color = data1[, categ[i0]]) - levels(data1$dot.color) <- dot.color - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": IN ", categ[i0], " OF categ ARGUMENT, THE FOLLOWING COLORS:\n", paste(dot.color, collapse = " "), "\nHAVE BEEN ATTRIBUTED TO THESE CLASSES:\n", paste(levels(factor(data1[, categ[i0]])), collapse = " ")) - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - }else if(length(dot.color) == length(data1[, categ[i0]])){# here length(dot.color) is equal to nrow(data1) -> Modif to have length(dot.color) equal to the different number of categ (length(dot.color) == length(levels(data1[, categ[i0]]))) - data1 <- data.frame(data1, dot.color = dot.color) - }else if(length(dot.color) == 1 & ! all(dot.color == "same")){ - data1[, categ[i0]] <- factor(data1[, categ[i0]]) # if already a factor, change nothing, if characters, levels according to alphabetical order - data1 <- data.frame(data1, dot.color = dot.color) - dot.color <- rep(dot.color, length(levels(data1[, categ[i0]]))) - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": dot.color ARGUMENT HAS LENGTH 1, MEANING THAT ALL THE DIFFERENT CLASSES OF ", categ[i0], "\n", paste(levels(factor(data1[, categ[i0]])), collapse = " "), "\nWILL HAVE THE SAME COLOR\n", paste(dot.color, collapse = " ")) - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - }else{ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": dot.color ARGUMENT MUST BE (1) LENGTH 1, OR (2) THE LENGTH OF data1 NROWS, OR (3) THE LENGTH OF THE CLASSES IN THE categ ", categ[i0], " COLUMN. HERE IT IS COLOR LENGTH ", length(dot.color), " VERSUS CATEG LENGTH ", length(data1[, categ[i0]]), " AND CATEG CLASS LENGTH ", length(unique(data1[, categ[i0]])), "\nPRESENCE OF NA COULD BE THE PROBLEM\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - } - tempo <- fun_check(data = dot.tidy, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = dot.bin.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = dot.jitter, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = dot.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = dot.border.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = dot.alpha, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) - if( ! is.null(ylim)){ - tempo <- fun_check(data = ylim, class = "vector", mode = "numeric", length = 2, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & any(ylim %in% c(Inf, -Inf))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ylim ARGUMENT CANNOT CONTAIN -Inf OR Inf VALUES\n\n================\n\n") - - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - } - tempo <- fun_check(data = ylog, options = c("no", "log2", "log10"), length = 1, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & ylog != "no"){ - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": ylog ARGUMENT SET TO ", ylog, ".\nVALUES FROM THE y ARGUMENT COLUMN OF THE data1 DATA FRAME MUST BE ALREADY ", toupper(ylog), " TRANSFORMED, AS THE ylog ARGUMENT JUST MODIFIES THE AXIS SCALE") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - if( ! is.null(ylim)){ - if(any(ylim <= 0)){ - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": ylim ARGUMENT CAN SPAN ZERO OR NEGATIVE VALUES IF ylog ARGUMENT IS SET TO ", ylog, " BECAUSE THIS LATTER ARGUMENT DOES NOT TRANSFORM DATA, JUST MODIFIES THE AXIS SCALE") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - }else if(any( ! is.finite(if(ylog == "log10"){10^ylim}else{2^ylim}))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ylim ARGUMENT RETURNS INF WITH THE ylog ARGUMENT SET TO ", ylog, "\nAS SCALE COMPUTATION IS ", ifelse(ylog == "log10", 10, 2), "^ylim:\n", paste(ifelse(ylog == "log10", 10, 2)^ylim, collapse = " "), "\nARE YOU SURE THAT ylim ARGUMENT HAS BEEN SPECIFIED WITH VALUES ALREADY IN LOG SCALE?\n", paste(ylim, collapse = " "), "\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - } - } - if( ! is.null(y.tick.nb)){ - tempo <- fun_check(data = y.tick.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & y.tick.nb < 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": y.tick.nb ARGUMENT MUST BE A NON NULL POSITIVE INTEGER\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - } - if( ! is.null(y.inter.tick.nb)){ - tempo <- fun_check(data = y.inter.tick.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & y.inter.tick.nb < 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": y.inter.tick.nb ARGUMENT MUST BE A NON NULL POSITIVE INTEGER\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - } - tempo <- fun_check(data = y.include.zero, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) - # inactivated because xlim and ylim already log transformed - # if(tempo$problem == FALSE & ylog != "no" & y.include.zero == TRUE){ - # tempo.warning <- paste0("FROM FUNCTION ", function.name, ": ylog ARGUMENT SET TO ", ylog, " AND y.include.zero ARGUMENT SET TO TRUE -> y.include.zero ARGUMENT RESET TO FALSE BECAUSE NO 0 ALLOWED IN LOG SCALE") - # warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - # } - tempo <- fun_check(data = y.top.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = y.bottom.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) - if( ! is.null(stat.disp)){ - tempo <- fun_check(data = stat.disp, options = c("top", "above"), length = 1, fun.name = function.name) ; eval(ee) - } - tempo <- fun_check(data = stat.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = stat.dist, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) - if( ! is.null(xlab)){ - if(all(class(xlab) %in% "expression")){ # to deal with math symbols - tempo <- fun_check(data = xlab, class = "expression", length = 1, fun.name = function.name) ; eval(ee) - }else{ - tempo <- fun_check(data = xlab, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) - } - } - if( ! is.null(ylab)){ - if(all(class(ylab) %in% "expression")){ # to deal with math symbols - tempo <- fun_check(data = ylab, class = "expression", length = 1, fun.name = function.name) ; eval(ee) - }else{ - tempo <- fun_check(data = ylab, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) - } - } - tempo <- fun_check(data = vertical, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & ylog != "no" & vertical == FALSE){ - vertical <- TRUE - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": BECAUSE OF A BUG IN ggplot2, CANNOT FLIP BARS HORIZONTALLY WITH A YLOG SCALE -> vertical ARGUMENT RESET TO TRUE") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - tempo <- fun_check(data = text.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = title, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = title.text.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = text.angle, class = "vector", typeof = "integer", double.as.integer.allowed = TRUE, length = 1, neg.values = TRUE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = classic, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = grid, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = return, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = plot, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - if( ! is.null(add)){ - tempo <- fun_check(data = add, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & ! grepl(pattern = "^\\+", add)){ # check that the add string start by + - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": add ARGUMENT MUST START WITH \"+\": ", paste(unique(add), collapse = " "), "\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - }else if(tempo$problem == FALSE & ! grepl(pattern = "ggplot2::", add)){ # - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": add ARGUMENT MUST CONTAIN \"ggplot2::\" IN FRONT OF EACH GGPLOT2 FUNCTION: ", paste(unique(add), collapse = " "), "\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - }else if(tempo$problem == FALSE & ! grepl(pattern = ")$", add)){ # check that the add string finished by ) - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": add ARGUMENT MUST FINISH BY \")\": ", paste(unique(add), collapse = " "), "\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - } - tempo <- fun_check(data = warn.print, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - if( ! is.null(path.lib)){ - tempo <- fun_check(data = path.lib, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & ! all(dir.exists(path.lib))){ - cat(paste0("\n\n============\n\nERROR IN ", function.name, ": \nDIRECTORY PATH INDICATED IN THE path.lib PARAMETER DOES NOT EXISTS: ", path.lib, "\n\n============\n\n")) - arg.check <- c(arg.check, TRUE) - } - } - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_check() - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() - # end argument checking (and modification for proper color management) - # package checking - fun_pack(req.package = c("ggplot2"), path.lib = path.lib) - fun_pack(req.package = c("scales"), path.lib = path.lib) - # end package checking - # main code - if(length(categ) == 1){ - # new data frames for bar and error bars - mean.dataframe <- aggregate(x = data1[y], by = {x.env <- list(data1[, categ[1]]) ; names(x.env) <-categ[1] ; x.env}, FUN = mean, na.rm = TRUE) - sd.dataframe <- aggregate(x = data1[y], by = {x.env <- list(data1[, categ[1]]) ; names(x.env) <-categ[1] ; x.env}, FUN = sd, na.rm = TRUE) - nb.dataframe <- aggregate(x = data1[y], by = {x.env <- list(data1[, categ[1]]) ; names(x.env) <- categ[1] ; x.env}, FUN = function(x.env2){length(x.env2[ ! is.na(x.env2)])}) - if( ! all(identical(mean.dataframe[, categ[1]], sd.dataframe[, categ[1]]) & identical(mean.dataframe[, categ[1]], nb.dataframe[, categ[1]]))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": aggregate OUTPUT IS DIFFERENT IN TERM OF CLASS ORDER FOR mean.dataframe, sd.dataframe AND nb.dataframe. CODE HAS TO BE MODIFIED\n\n================\n\n") - stop(tempo.cat) - }else{ - sem.dataframe <- sd.dataframe - sem.dataframe[, y] <- sd.dataframe[, y] / (nb.dataframe[, y])^0.5 - } - # end new data frames for bar and error bars - # data1 check categ order for dots coordinates recovery - data1 <- data.frame(data1, categ.check = data1[, categ[1]]) - data1$categ.check <- as.integer(data1$categ.check) # to check that data1[, categ[1]] and dot.coord$group are similar, during merging - # end data1 check categ order for dots coordinates recovery - # per bar dots coordinates recovery - tempo.gg.name <- "gg.indiv.plot." - tempo.gg.count <- 0 - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ggplot(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, fill = categ[1]))) # fill because this is what is used with geom_bar - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point(stroke = dot.border.size, size = dot.size, alpha = dot.alpha, pch = 21)) - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_boxplot()) # to easily have the equivalent of the grouped bars - dot.coord <- ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))$data[[1]] - if( ! is.null(dot.color)){ - dot.coord <- data.frame(dot.coord[order(dot.coord$group, dot.coord$y), ], y.check = as.double(data1[order(data1$categ.check, data1[, y]), y]), categ.check = data1[order(data1$categ.check, data1[, y]), "categ.check"], dot.color = data1[order(data1$categ.check, data1[, y]), "dot.color"], tempo.categ1 = data1[order(data1$categ.check, data1[, y]), categ[1]]) # y.check to be sure that the order is the same between the y of data1 and the y of dot.coord - names(dot.coord)[names(dot.coord) == "tempo.categ1"] <- categ[1] - if( ! identical(dot.coord$y, dot.coord$y.check)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": (dot.coord$y AND dot.coord$y.check) AS WELL AS (dot.coord$group AND dot.coord$categ.check) MUST BE IDENTICAL. CODE HAS TO BE MODIFIED\n\n================\n\n") - stop(tempo.cat) - } - } - # end per bar dots coordinates recovery - }else if(length(categ) == 2){ - # new data frames for bar and error bars - mean.dataframe <- aggregate(x = data1[y], by = {x.env <- list(data1[, categ[1]], data1[, categ[2]]) ; names(x.env) <- c(categ[1], categ[2]) ; x.env}, FUN = mean, na.rm = TRUE) - sd.dataframe <- aggregate(x = data1[y], by = {x.env <- list(data1[, categ[1]], data1[, categ[2]]) ; names(x.env) <- c(categ[1], categ[2]) ; x.env}, FUN = sd, na.rm = TRUE) - nb.dataframe <- aggregate(x = data1[y], by = {x.env <- list(data1[, categ[1]], data1[, categ[2]]) ; names(x.env) <- c(categ[1], categ[2]) ; x.env}, FUN = function(x.env2){length(x.env2[ ! is.na(x.env2)])}) - tempo.check.mean <- mapply(FUN = "paste", mean.dataframe[, categ[1]], mean.dataframe[, categ[2]], sep = "_") - tempo.check.sd <- mapply(FUN = "paste", sd.dataframe[, categ[1]], sd.dataframe[, categ[2]], sep = "_") - tempo.check.nb <- mapply(FUN = "paste", nb.dataframe[, categ[1]], nb.dataframe[, categ[2]], sep = "_") - if( ! all(identical(tempo.check.mean, tempo.check.sd) & identical(tempo.check.mean, tempo.check.nb))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": aggregate OUTPUT IS DIFFERENT IN TERM OF CLASS ORDER FOR mean.dataframe, sd.dataframe AND nb.dataframe. CODE HAS TO BE MODIFIED\n\n================\n\n") - stop(tempo.cat) - }else{ - sem.dataframe <- sd.dataframe - sem.dataframe[, y] <- sd.dataframe[, y] / (nb.dataframe[, y])^0.5 - } - # end new data frames for bar and error bars - # data1 check categ order for dots coordinates recovery - tempo.factor <- paste0(data1[order(data1[, categ[2]], data1[, categ[1]]), categ[2]], "_", data1[order(data1[, categ[2]], data1[, categ[1]]), categ[1]]) - data1 <- data.frame(data1[order(data1[, categ[2]], data1[, categ[1]]), ], categ.check = factor(tempo.factor, levels = unique(tempo.factor))) - data1$categ.check <- as.integer(data1$categ.check) - # end data1 check categ order for dots coordinates recovery - # per bar dots coordinates recovery - tempo.gg.name <- "gg.indiv.plot." - tempo.gg.count <- 0 - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ggplot(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, fill = categ[2]))) # fill because this is what is used with geom_bar - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point(stroke = dot.border.size, size = dot.size, alpha = dot.alpha, pch = 21)) - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_boxplot()) # to easily have the equivalent of the grouped bars - dot.coord <- ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))$data[[1]] - if( ! is.null(dot.color)){ - dot.coord <- data.frame(dot.coord[order(dot.coord$group, dot.coord$y), ], y.check = as.double(data1[order(data1$categ.check, data1[, y]), y]), categ.check = data1[order(data1$categ.check, data1[, y]), "categ.check"], dot.color = data1[order(data1$categ.check, data1[, y]), "dot.color"], tempo.categ1 = data1[order(data1$categ.check, data1[, y]), categ[1]], tempo.categ2 = data1[order(data1$categ.check, data1[, y]), categ[2]]) # y.check to be sure that the order is the same between the y of data1 and the y of dot.coord - names(dot.coord)[names(dot.coord) == "tempo.categ1"] <- categ[1] - names(dot.coord)[names(dot.coord) == "tempo.categ2"] <- categ[2] - if( ! (identical(dot.coord$y, dot.coord$y.check) & identical(dot.coord$group, dot.coord$categ.check))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": (dot.coord$y AND dot.coord$y.check) AS WELL AS (dot.coord$group AND dot.coord$categ.check) MUST BE IDENTICAL. CODE HAS TO BE MODIFIED\n\n================\n\n") - stop(tempo.cat) - } - } - }else{ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 2\n\n============\n\n")) - stop(tempo.cat) - } - data2 <- mean.dataframe - if( ! is.null(error.disp)){ - if(error.disp == "SD"){ - data2 <- data.frame(data2, SD = sd.dataframe[, y], ERROR.INF = mean.dataframe[, y] - sd.dataframe[, y], ERROR.SUP = mean.dataframe[, y] + sd.dataframe[, y]) - }else if(error.disp == "SD.TOP"){ - data2 <- data.frame(data2, SD = sd.dataframe[, y], ERROR.INF = mean.dataframe[, y], ERROR.SUP = mean.dataframe[, y] + sd.dataframe[, y]) - }else if(error.disp == "SEM"){ - data2 <- data.frame(data2, SEM = sem.dataframe[, y], ERROR.INF = mean.dataframe[, y] - sem.dataframe[, y], ERROR.SUP = mean.dataframe[, y] + sem.dataframe[, y]) - }else if(error.disp == "SEM.TOP"){ - data2 <- data.frame(data2, SEM = sem.dataframe[, y], ERROR.INF = mean.dataframe[, y], ERROR.SUP = mean.dataframe[, y] + sem.dataframe[, y]) - }else{ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 3\n\n============\n\n")) - stop(tempo.cat) - } - } - # stat output - stat <- data2 - names(stat)[names(stat) == y] <- "MEAN" - # end stat output - # range depending on means and error bars - if(is.null(ylim)){ - if(is.null(dot.color)){ # no dots plotted - if( ! is.null(error.disp)){ - if(any(c(data2[, "ERROR.INF"], data2[, "ERROR.SUP"]) %in% c(Inf, -Inf))){ - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": THE data2 ARGUMENT CONTAINS -Inf OR Inf VALUES IN THE ERROR.INF OR ERROR.SUP COLUMN, THAT WILL NOT BE CONSIDERED IN THE PLOT RANGE") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - ylim <- range(c(data2[, "ERROR.INF"], data2[, "ERROR.SUP"]), na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only - }else{ - if(any(data2[, y] %in% c(Inf, -Inf))){ - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": THE data2 ARGUMENT CONTAINS -Inf OR Inf VALUES IN THE y COLUMN, THAT WILL NOT BE CONSIDERED IN THE PLOT RANGE") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - ylim <- range(data2[, y], na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only - } - }else{ - if(any(data1[, y] %in% c(Inf, -Inf))){ - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": THE data1 ARGUMENT CONTAINS -Inf OR Inf VALUES IN THE y COLUMN, THAT WILL NOT BE CONSIDERED IN THE PLOT RANGE") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - ylim <- range(data1[, y], na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only - } - } - if(suppressWarnings(all(ylim %in% c(Inf, -Inf)))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, " COMPUTED YLIM CONTAINS Inf VALUES, BECAUSE VALUES FROM data2 ARGUMENTS ARE NA OR Inf ONLY\n\n================\n\n") - stop(tempo.cat) - } - # end range depending on means and error bars - ylim.order <- order(ylim) # to deal with inverse axis - ylim <- sort(ylim) - ylim[1] <- ylim[1] - abs(ylim[2] - ylim[1]) * ifelse(diff(ylim.order) > 0, y.bottom.extra.margin, y.top.extra.margin) # diff(ylim.order) > 0 means not inversed axis - ylim[2] <- ylim[2] + abs(ylim[2] - ylim[1]) * ifelse(diff(ylim.order) > 0, y.top.extra.margin, y.bottom.extra.margin) # diff(ylim.order) > 0 means not inversed axis - if(y.include.zero == TRUE){ # no need to check ylog != "no" because done before - ylim <- range(c(ylim, 0), na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only - } - ylim <- ylim[ylim.order] - if(any(is.na(ylim))){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 4\n\n============\n\n")) - stop(tempo.cat) - } - # width commputations - if(length(categ) == 2){ - bar.width2 <- bar.width / length(unique(data1[, categ[length(categ)]])) # real width of each bar in x-axis unit, among the set of grouped bar. Not relevant if no grouped bars length(categ) == 1 - }else if(length(categ) == 1){ - bar.width2 <- bar.width - }else{ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 5\n\n============\n\n")) - stop(tempo.cat) - } - error.whisker.width <- bar.width * error.whisker.width # real error bar width - dot.jitter <- bar.width2 * dot.jitter # real dot.jitter - # end width commputations - # barplot - # constant part - tempo.gg.name <- "gg.indiv.plot." - tempo.gg.count <- 0 - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ggplot()) - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::xlab(if(is.null(xlab)){categ[1]}else{xlab})) - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ylab(if(is.null(ylab)){y}else{ylab})) - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ggtitle(title)) - # text angle management - tempo.just <- fun_gg_just(angle = text.angle, axis = ifelse(vertical == TRUE, "x", "y")) - # end text angle management - add.check <- TRUE - if( ! is.null(add)){ # if add is NULL, then = 0 - if(grepl(pattern = "ggplot2::theme", add) == TRUE){ - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": \"ggplot2::theme\" STRING DETECTED IN THE add ARGUMENT -> INTERNAL GGPLOT2 THEME FUNCTIONS theme() AND theme_classic() HAVE BEEN INACTIVATED, TO BE USED BY THE USER") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - add.check <- FALSE - } - } - if(add.check == TRUE & classic == TRUE){ - # BEWARE: not possible to add several times theme(). NO message but the last one overwrites the others - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::theme_classic(base_size = text.size)) - if(grid == TRUE){ - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( - text = ggplot2::element_text(size = text.size), - plot.title = ggplot2::element_text(size = title.text.size), # stronger than text - line = ggplot2::element_line(size = 0.5), - axis.line.y.left = ggplot2::element_line(colour = "black"), # draw lines for the y axis - axis.line.x.bottom = ggplot2::element_line(colour = "black"), # draw lines for the x axis - panel.grid.major.x = if(vertical == TRUE){NULL}else{ggplot2::element_line(colour = "grey75")}, - panel.grid.major.y = if(vertical == TRUE){ggplot2::element_line(colour = "grey75")}else{NULL}, - axis.text.x = if(vertical == TRUE){ggplot2::element_text(angle = tempo.just$angle, hjust = tempo.just$hjust, vjust = tempo.just$vjust)}else{NULL}, - axis.text.y = if(vertical == TRUE){NULL}else{ggplot2::element_text(angle = tempo.just$angle, hjust = tempo.just$hjust, vjust = tempo.just$vjust)} - )) - }else{ - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( - text = ggplot2::element_text(size = text.size), - plot.title = ggplot2::element_text(size = title.text.size), # stronger than text - line = ggplot2::element_line(size = 0.5), - axis.line.y.left = ggplot2::element_line(colour = "black"), - axis.line.x.bottom = ggplot2::element_line(colour = "black"), - axis.text.x = if(vertical == TRUE){ggplot2::element_text(angle = tempo.just$angle, hjust = tempo.just$hjust, vjust = tempo.just$vjust)}else{NULL}, - axis.text.y = if(vertical == TRUE){NULL}else{ggplot2::element_text(angle = tempo.just$angle, hjust = tempo.just$hjust, vjust = tempo.just$vjust)} - )) - } - }else if(add.check == TRUE & classic == FALSE){ - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( - text = ggplot2::element_text(size = text.size), - plot.title = ggplot2::element_text(size = title.text.size), # stronger than text - line = ggplot2::element_line(size = 0.5), - panel.background = ggplot2::element_rect(fill = "grey95"), - axis.line.y.left = ggplot2::element_line(colour = "black"), - axis.line.x.bottom = ggplot2::element_line(colour = "black"), - panel.grid.major.x = ggplot2::element_line(colour = "grey75"), - panel.grid.major.y = ggplot2::element_line(colour = "grey75"), - panel.grid.minor.x = ggplot2::element_blank(), - panel.grid.minor.y = ggplot2::element_blank(), - strip.background = ggplot2::element_rect(fill = "white", colour = "black"), - axis.text.x = if(vertical == TRUE){ggplot2::element_text(angle = tempo.just$angle, hjust = tempo.just$hjust, vjust = tempo.just$vjust)}else{NULL}, - axis.text.y = if(vertical == TRUE){NULL}else{ggplot2::element_text(angle = tempo.just$angle, hjust = tempo.just$hjust, vjust = tempo.just$vjust)} - )) - } - # end constant part - # barplot and error bars - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_bar(data = data2, mapping = ggplot2::aes_string(x = categ[1], y = y, fill = categ[length(categ)]), stat = "identity", position = ggplot2::position_dodge(width = NULL), color = "black", width = bar.width)) # stat = "identity" because already counted, position = position_dodge(width = NULL) for grouped bars (width = NULL means no overlap between grouped bars). Please, see explanation in https://stackoverflow.com/questions/34889766/what-is-the-width-argument-in-position-dodge/35102486#35102486 - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "fill", name = categ.legend.name, values = as.character(categ.color), guide = ggplot2::guide_legend(override.aes = list(fill = categ.color)))) # values are the values of color (which is the border color in geom_bar. BEWARE: values = categ.color takes the numbers to make the colors if categ.color is a factor - if( ! is.null(error.disp)){ - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_errorbar(data = data2, mapping = ggplot2::aes_string(x = categ[1], group = categ[length(categ)], ymin = "ERROR.INF", ymax = "ERROR.SUP"), position = ggplot2::position_dodge(width = bar.width), color = "black", width = error.whisker.width)) # cannot use fill = categ[length(categ)] because not an aesthetic of geom_errorbar, but if only x = categ[1], wrong x coordinates with grouped bars - } - # end barplot and error bars - # coordinates management (for random plotting and for stat display) - # bars - bar.coord <- ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))$data[[1]] # to have the summary statistics of the plot. Here because can be required for stat.disp when just bar are plotted - # end bars - if( ! is.null(dot.color)){ - # random dots - if(dot.tidy == FALSE){ - dot.coord.rd1 <- merge(dot.coord, bar.coord[c("fill", "group", "x")], by = intersect("group", "group"), sort = FALSE) # rd for random. Send the coord of the bars into the coord data.frame of the dots (in the column x.y). BEWARE: by = intersect("group", "group") because group is enough as only one value of x per group number in bar.coord. Thus, no need to consider fill - if(nrow(dot.coord.rd1) != nrow(dot.coord)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE merge() FUNCTION DID NOT RETURN A CORRECT dot.coord.rd1 DATA FRAME. CODE HAS TO BE MODIFIED\n\n================\n\n") - stop(tempo.cat) - } - set.seed(1) - sampled.dot.jitter <- if(nrow(dot.coord.rd1) == 1){runif(n = nrow(dot.coord.rd1), min = - dot.jitter / 2, max = dot.jitter / 2)}else{sample(x = runif(n = nrow(dot.coord.rd1), min = - dot.jitter / 2, max = dot.jitter / 2), size = nrow(dot.coord.rd1), replace = FALSE)} - dot.coord.rd2 <- data.frame(dot.coord.rd1, dot.x = dot.coord.rd1$x.y + sampled.dot.jitter) # set the dot.jitter thanks to runif and dot.jitter range. Then, send the coord of the bars into the coord data.frame of the dots (in the column x.y) - set.seed(NULL) - if(length(categ) == 1){ - tempo.data1 <- unique(data.frame(data1[categ[1]], group = as.integer(factor(as.numeric(data1[, categ[1]]))))) # categ[2] first if categ[2] is used to make the categories in ggplot and categ[1] is used to make the x-axis - names(tempo.data1)[names(tempo.data1) == categ[1]] <- paste0(categ[1], ".check") - verif <- paste0(categ[1], ".check") - }else if(length(categ) == 2){ - tempo.data1 <- unique(data.frame(data1[c(categ[1], categ[2])], group = as.integer(factor(paste0(as.numeric(data1[, categ[2]]), ".", as.numeric(data1[, categ[1]])))))) # categ[2] first if categ[2] is used to make the categories in ggplot and categ[1] is used to make the x-axis - names(tempo.data1)[names(tempo.data1) == categ[1]] <- paste0(categ[1], ".check") - names(tempo.data1)[names(tempo.data1) == categ[2]] <- paste0(categ[2], ".check") - verif <- c(paste0(categ[1], ".check"), paste0(categ[2], ".check")) - }else{ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 6\n\n============\n\n")) - stop(tempo.cat) - } - dot.coord.rd3 <- merge(dot.coord.rd2, tempo.data1, by = "group", sort = FALSE) # send the factors of data1 into coord - if(nrow(dot.coord.rd3) != nrow(dot.coord) | ( ! fun_2d_comp(dot.coord.rd3[categ], dot.coord.rd3[verif])$identical.content)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE merge() FUNCTION DID NOT RETURN A CORRECT dot.coord.rd3 DATA FRAME. CODE HAS TO BE MODIFIED\n\n================\n\n") - stop(tempo.cat) - } - # end random dots - } - # tidy dots - # coordinates are recover during plotting (see dot.coord.tidy1 below) - # end tidy dots - } - # end coordinates management (for random plotting and for stat display) - # dot display - if( ! is.null(dot.color)){ - if(dot.tidy == FALSE){ - if(dot.border.size == 0){ - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point(data = dot.coord.rd3, mapping = ggplot2::aes_string(x = "dot.x", y = "y", group = categ[length(categ)]), size = dot.size, color = dot.coord.rd3$dot.color, alpha = dot.alpha, pch = 16)) # group used in aesthetic to do not have it in the legend. Here ggplot2::scale_discrete_manual() cannot be used because of the group easthetic - }else{ - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point(data = dot.coord.rd3, mapping = ggplot2::aes_string(x = "dot.x", y = "y", group = categ[length(categ)]), stroke = dot.border.size, size = dot.size, fill = dot.coord.rd3$dot.color, alpha = dot.alpha, pch = 21)) # group used in aesthetic to do not have it in the legend. Here ggplot2::scale_discrete_manual() cannot be used because of the group easthetic - } - }else if(dot.tidy == TRUE){ - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_dotplot(data = dot.coord, mapping = ggplot2::aes_string(x = categ[1], y = "y", color = categ[length(categ)]), position = ggplot2::position_dodge(width = bar.width), binaxis = "y", stackdir = "center", alpha = dot.alpha, fill = dot.coord[rev(order(dot.coord[, categ[1]], decreasing = TRUE)), "dot.color"], show.legend = FALSE, binwidth = (ylim[2] - ylim[1]) / dot.bin.nb)) # very weird behavior of geom_dotplot, because data1 seems reorderer according to x = categ[1] before plotting. Thus, I have to use fill = dot.coord[rev(order(dot.coord[, categ[1]], decreasing = TRUE)), "dot.color"] to have the good corresponding colors # show.legend option do not remove the legend, only the aesthetic of the legend (dot, line, etc.) - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "color", name = categ.legend.name, values = if(dot.border.size == 0){as.character(levels(dot.coord[rev(order(dot.coord[, categ[1]], decreasing = TRUE)), "dot.color"]))}else{rep("black", length(categ.color))})) # values = rep("black", length(categ.color)) are the values of color (which is the border color of dots), and this modify the border color on the plot. BEWARE: values = categ.color takes the numbers to make the colors if categ.color is a factor. BEWARE: , guide = ggplot2::guide_legend(override.aes = list(fill = levels(dot.color))) here - # coordinates of tidy dots - tempo.coord <- ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))$data # to have the tidy dot coordinates - if(length(which(sapply(tempo.coord, FUN = nrow) == nrow(data1))) > 1){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": MORE THAN 2 COMPARTMENT WITH NROW EQUAL TO nrow(data1) IN THE tempo.coord LIST (FOR TIDY DOT COORDINATES). CODE HAS TO BE MODIFIED\n\n================\n\n") - stop(tempo.cat) - }else{ - dot.coord.tidy1 <- tempo.coord[[which(sapply(tempo.coord, FUN = nrow) == nrow(data1))]] - } - tempo.bar.coord <- merge(bar.coord, unique(dot.coord[, c("group", categ)]), by = intersect("group", "group"), sort = FALSE) # add the categ in bar.coord. BEWARE: by = intersect("group", "group") because group is enough as only one value of x per group number in bar.coord. Thus, no need to consider fill - if(nrow(tempo.bar.coord) != nrow(bar.coord)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE merge() FUNCTION DID NOT RETURN A CORRECT tempo.bar.coord DATA FRAME. CODE HAS TO BE MODIFIED\n\n================\n\n") - stop(tempo.cat) - } - dot.coord.tidy2 <- merge(dot.coord.tidy1, tempo.bar.coord[c("fill", "group", "x", categ)], by = intersect("group", "group"), sort = FALSE) # send the coord of the bars into the coord data.frame of the dots (in the column x.y). BEWARE: by = intersect("group", "group") because group is enough as only one value of x per group number in bar.coord. Thus, no need to consider fill - if(nrow(dot.coord.tidy2) != nrow(dot.coord)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE merge() FUNCTION DID NOT RETURN A CORRECT dot.coord.tidy2 DATA FRAME. CODE HAS TO BE MODIFIED\n\n================\n\n") - stop(tempo.cat) - } - if(length(categ) == 1){ - tempo.data1 <- unique(data.frame(data1[categ[1]], group = as.integer(factor(as.numeric(data1[, categ[1]]))))) # categ[2] first if categ[2] is used to make the categories in ggplot and categ[1] is used to make the x-axis - names(tempo.data1)[names(tempo.data1) == categ[1]] <- paste0(categ[1], ".check") - verif <- paste0(categ[1], ".check") - }else if(length(categ) == 2){ - tempo.data1 <- unique(data.frame(data1[c(categ[1], categ[2])], group = as.integer(factor(paste0(as.numeric(data1[, categ[2]]), ".", as.numeric(data1[, categ[1]])))))) # categ[2] first if categ[2] is used to make the categories in ggplot and categ[1] is used to make the x-axis - names(tempo.data1)[names(tempo.data1) == categ[1]] <- paste0(categ[1], ".check") - names(tempo.data1)[names(tempo.data1) == categ[2]] <- paste0(categ[2], ".check") - verif <- c(paste0(categ[1], ".check"), paste0(categ[2], ".check")) - }else{ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 7\n\n============\n\n")) - stop(tempo.cat) - } - dot.coord.tidy3 <- merge(dot.coord.tidy2, tempo.data1, by = "group", sort = FALSE) # send the factors of data1 into coord - if(nrow(dot.coord.tidy3) != nrow(dot.coord) | ( ! fun_2d_comp(dot.coord.tidy3[categ], dot.coord.tidy3[verif])$identical.content)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE merge() FUNCTION DID NOT RETURN A CORRECT dot.coord.tidy3 DATA FRAME. CODE HAS TO BE MODIFIED\n\n================\n\n") - stop(tempo.cat) - } - # end coordinates of tidy dots - } - } - # end dot display - # stat display - # layer after dots but ok, behind dots on the plot - if( ! is.null(stat.disp)){ - if(stat.disp == "top"){ - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "text", x = bar.coord$x, y = ylim[2], label = fun_round(bar.coord$y, 2), size = stat.size, color = "black", hjust = ifelse(vertical == TRUE, 0.5, 1.1), vjust = ifelse(vertical == TRUE, 1.1, 0.5))) # beware: no need of order() for labels because bar.coord$x set the order. For justification, see https://stackoverflow.com/questions/7263849/what-do-hjust-and-vjust-do-when-making-a-plot-using-ggplot - }else if(stat.disp == "above"){ - # stat coordinates - if( ! is.null(dot.color)){ # for text just above max dot - if(dot.tidy == FALSE){ - tempo.stat.ini <- dot.coord.rd3 - }else if(dot.tidy == TRUE){ - tempo.stat.ini <- dot.coord.tidy3 - } - stat.coord1 <- aggregate(x = tempo.stat.ini["y"], by = {x.env <- if(length(categ) == 1){list(tempo.stat.ini$group, tempo.stat.ini$x.y, tempo.stat.ini[, categ[1]])}else if(length(categ) == 2){list(tempo.stat.ini$group, tempo.stat.ini$x.y, tempo.stat.ini[, categ[1]], tempo.stat.ini[, categ[2]])} ; names(x.env) <- if(length(categ) == 1){c("group", "x.y", categ[1])}else if(length(categ) == 2){c("group", "x.y", categ[1], categ[2])} ; x.env}, FUN = min, na.rm = TRUE) - names(stat.coord1)[names(stat.coord1) == "y"] <- "dot.min" - stat.coord2 <- aggregate(x = tempo.stat.ini["y"], by = {x.env <- if(length(categ) == 1){list(tempo.stat.ini$group, tempo.stat.ini$x.y, tempo.stat.ini[, categ[1]])}else if(length(categ) == 2){list(tempo.stat.ini$group, tempo.stat.ini$x.y, tempo.stat.ini[, categ[1]], tempo.stat.ini[, categ[2]])} ; names(x.env) <- if(length(categ) == 1){c("group", "x.y", categ[1])}else if(length(categ) == 2){c("group", "x.y", categ[1], categ[2])} ; x.env}, FUN = max, na.rm = TRUE) - names(stat.coord2) <- paste0(names(stat.coord2), "_from.dot.max") - names(stat.coord2)[names(stat.coord2) == "y_from.dot.max"] <- "dot.max" - stat.coord3 <- cbind(bar.coord[order(bar.coord$x), ], stat.coord1[order(stat.coord1$x.y), ], stat.coord2[order(stat.coord2$x.y), ]) # should be ok to use bar.coord$x and stat.coord$x.y to assemble the two data frames because x coordinates of the bars. Thus, we cannot have identical values - if( ! all(identical(round(stat.coord3$x, 9), round(stat.coord3$x.y, 9)))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": FUSION OF bar.coord, stat.coord1 AND stat.coord2 ACCORDING TO bar.coord$x, stat.coord1$x.y AND stat.coord2$x.y IS NOT CORRECT. CODE HAS TO BE MODIFIED\n\n================\n\n") - stop(tempo.cat) - } - dot.text.coord <- stat.coord3[, c("x", "group", "dot.min", "dot.max")] - names(dot.text.coord)[names(dot.text.coord) == "dot.min"] <- "text.min.pos" - names(dot.text.coord)[names(dot.text.coord) == "dot.max"] <- "text.max.pos" - } - if( ! is.null(error.disp)){ # for text just above error bars - if(length(categ) == 1){ - tempo.data1 <- unique(data.frame(data1[categ[1]], group = as.integer(factor(as.numeric(data1[, categ[1]]))))) # categ[2] first if categ[2] is used to make the categories in ggplot and categ[1] is used to make the x-axis - if( ! identical(stat[order(stat[, categ[1]]), categ[1]], tempo.data1[order(tempo.data1[, categ[1]]), categ[1]])){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE PROBLEM IN TRYING TO ASSEMBLE stat AND tempo.data1\n\n============\n\n")) - stop(tempo.cat) - }else{ - names(tempo.data1)[names(tempo.data1) == categ[1]] <- paste0(categ[1], ".check") - names(tempo.data1)[names(tempo.data1) == "group"] <- "group.check" - stat.coord4 <- cbind(stat[order(stat[, categ[1]]), ], tempo.data1[order(tempo.data1[, paste0(categ[1], ".check")]), ]) - } - }else if(length(categ) == 2){ - tempo.data1 <- unique(data.frame(data1[c(categ[1], categ[2])], group = as.integer(factor(paste0(as.numeric(data1[, categ[2]]), ".", as.numeric(data1[, categ[1]])))))) # categ[2] first if categ[2] is used to make the categories in ggplot and categ[1] is used to make the x-axis - if( ! fun_2d_comp(stat[order(stat[, categ[1]], stat[, categ[2]]), c(categ[1], categ[2])], tempo.data1[order(tempo.data1[, categ[1]], tempo.data1[, categ[2]]), c(categ[1], categ[2])])$identical.content){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE PROBLEM IN TRYING TO ASSEMBLE stat AND tempo.data1\n\n============\n\n")) - stop(tempo.cat) - }else{ - names(tempo.data1)[names(tempo.data1) == categ[1]] <- paste0(categ[1], ".check") - names(tempo.data1)[names(tempo.data1) == categ[2]] <- paste0(categ[2], ".check") - names(tempo.data1)[names(tempo.data1) == "group"] <- "group.check" - stat.coord4 <- cbind(stat[order(stat[, categ[1]], stat[, categ[2]]), ], tempo.data1[order(tempo.data1[, paste0(categ[1], ".check")], tempo.data1[,paste0(categ[2], ".check")]), ]) - } - }else{ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 8\n\n============\n\n")) - stop(tempo.cat) - } - if( ! identical(bar.coord$group[order(bar.coord$group)], stat.coord4$group.check[order(stat.coord4$group.check)])){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE PROBLEM IN TRYING TO ASSEMBLE bar.coord AND stat.coord4\n\n============\n\n")) - stop(tempo.cat) - }else{ - stat.coord5 <- cbind(bar.coord[order(bar.coord$group), ], stat.coord4[order(stat.coord4$group.check), ]) - error.text.coord <- stat.coord5[, c("x", "group", "ERROR.INF", "ERROR.SUP")] # - names(error.text.coord)[names(error.text.coord) == "ERROR.INF"] <- "text.min.pos" - names(error.text.coord)[names(error.text.coord) == "ERROR.SUP"] <- "text.max.pos" - } - } - if(( ! is.null(dot.color)) & ! is.null(error.disp)){ # for text above max dot or error bar - stat.coord3 <- stat.coord3[order(stat.coord3$x), ] - stat.coord5 <- stat.coord5[order(stat.coord5$x), ] - if( ! identical(stat.coord3$group, stat.coord5$group)){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE PROBLEM IN TRYING TO ASSEMBLE stat.coord3 AND stat.coord5\n\n============\n\n")) - stop(tempo.cat) - }else{ - stat.coord6 <- data.frame(stat.coord3, min.dot.error = mapply(FUN = min, stat.coord3$dot.min, stat.coord5$ERROR.INF, na.rm = TRUE)) - stat.coord7 <- data.frame(stat.coord6, max.dot.error = mapply(FUN = max, stat.coord3$dot.max, stat.coord5$ERROR.SUP, na.rm = TRUE)) - both.text.coord <- stat.coord7[, c("x", "group", "min.dot.error", "max.dot.error")] # - names(both.text.coord)[names(both.text.coord) == "min.dot.error"] <- "text.min.pos" - names(both.text.coord)[names(both.text.coord) == "max.dot.error"] <- "text.max.pos" - } - } - if(( ! is.null(dot.color)) & is.null(error.disp)){ - text.coord <- dot.text.coord - }else if(is.null(dot.color) & ! is.null(error.disp)){ - text.coord <- error.text.coord - }else if(( ! is.null(dot.color)) & ! is.null(error.disp)){ - text.coord <- both.text.coord - } - if( ! (is.null(dot.color) & is.null(error.disp))){ - bar.coord <- bar.coord[order(bar.coord$x), ] - text.coord <- text.coord[order(text.coord$x), ] # to be sure to have the two objects in the same order for x. BEWARE: cannot add identical(as.integer(text.coord$group), as.integer(bar.coord$group)) because with error, the correspondence between x and group is not the same - if( ! identical(text.coord$x, bar.coord$x)){ - tempo.cat <- (paste0("\n\n============\n\nERROR: text.coord AND bar.coord DO NOT HAVE THE SAME x COLUMN CONTENT\n\n============\n\n")) - stop(tempo.cat) - } - } - # end stat coordinates - # stat display - if(is.null(dot.color) & is.null(error.disp)){ # text just above bars - # performed twice: first for y values >=0, then y values < 0, because only a single value allowed for hjust anf vjust - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "text", x = bar.coord$x[bar.coord$y >= 0], y = bar.coord$y[bar.coord$y >= 0], label = fun_round(bar.coord$y, 2)[bar.coord$y >= 0], size = stat.size, color = "black", hjust = ifelse(vertical == TRUE, 0.5, 0.5 - stat.dist), vjust = ifelse(vertical == TRUE, 0.5 - stat.dist, 0.5))) # beware: no need of order() for labels because bar.coord$x set the order - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "text", x = bar.coord$x[bar.coord$y < 0], y = bar.coord$y[bar.coord$y < 0], label = fun_round(bar.coord$y, 2)[bar.coord$y < 0], size = stat.size, color = "black", hjust = ifelse(vertical == TRUE, 0.5, 0.5 + stat.dist), vjust = ifelse(vertical == TRUE, 0.5 + stat.dist, 0.5))) # beware: no need of order() for labels because bar.coord$x set the order - }else{ # text just above error bars or dots - # I checked that text.coord and bar.coord have the same x and group column content. Thus, ok to use them together - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "text", x = text.coord$x[bar.coord$y >= 0], y = text.coord$text.max.pos[bar.coord$y >= 0], label = fun_round(bar.coord$y, 2)[bar.coord$y >= 0], size = stat.size, color = "black", hjust = ifelse(vertical == TRUE, 0.5, 0.5 - stat.dist), vjust = ifelse(vertical == TRUE, 0.5 - stat.dist, 0.5))) # beware: no need of order() for labels because bar.coord$x set the order - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "text", x = text.coord$x[bar.coord$y < 0], y = text.coord$text.min.pos[bar.coord$y < 0], label = fun_round(bar.coord$y, 2)[bar.coord$y < 0], size = stat.size, color = "black", hjust = ifelse(vertical == TRUE, 0.5, 0.5 + stat.dist), vjust = ifelse(vertical == TRUE, 0.5 + stat.dist, 0.5))) # beware: no need of order() for labels because bar.coord$x set the order - } - # end stat display - }else{ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 9\n\n============\n\n")) - stop(tempo.cat) - } - } - # end stat display - # y scale management (cannot be before dot plot management) - tempo.coord <- ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))$layout$panel_params[[1]] - tempo.scale <- fun_scale(lim = ylim, n = ifelse(is.null(y.tick.nb), length(tempo.coord$y.major_source), y.tick.nb)) - # for the ggplot2 bug with ylog, this does not work: eval(parse(text = ifelse(vertical == FALSE & ylog == "log10", "ggplot2::scale_x_continuous", "ggplot2::scale_y_continuous"))) - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_y_continuous( - breaks = tempo.scale, - labels = if(ylog == "log10"){scales::trans_format("identity", scales::math_format(10^.x))}else if(ylog == "log2"){scales::trans_format("identity", scales::math_format(2^.x))}else if(ylog == "no"){ggplot2::waiver()}else{tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 10\n\n============\n\n")) ; stop(tempo.cat)}, - expand = c(0, 0), - limits = NA, - trans = ifelse(diff(ylim) < 0, "reverse", "identity") # equivalent to ggplot2::scale_y_reverse() - )) - if(vertical == TRUE){ - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::coord_cartesian(ylim = ylim)) # clip = "off" to have secondary ticks outside plot region does not work - }else{ - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::coord_flip(ylim = ylim)) # clip = "off" to have secondary ticks outside plot region does not work - } - # secondary ticks (after ggplot2::coord_cartesian() or ggplot2::coord_flip()) - tempo.coord <- ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))$layout$panel_params[[1]] - # no secondary ticks for log2. Play with ylim - if(ylog == "log10"){ - ylim.order <- order(ylim) # to deal with inverse axis - ini.scipen <- options()$scipen - options(scipen = -1000) # force scientific format - power10.exp <- as.integer(substring(text = 10^ylim, first = (regexpr(pattern = "\\+|\\-", text = 10^ylim)))) # recover the power of 10. Example recover 08 from 1e+08 - mantisse <- as.numeric(substr(x = 10^ylim, start = 1, stop = (regexpr(pattern = "\\+|\\-", text = 10^ylim) - 2))) # recover the mantisse. Example recover 1.22 from 1.22e+08 - options(scipen = ini.scipen) # restore the initial scientific penalty - tempo.tick.pos <- as.vector(outer(log10(2:10), 10^((power10.exp[1] - ifelse(diff(ylim.order) > 0, 1, -1)):(power10.exp[2] + ifelse(diff(ylim.order) > 0, 1, -1))))) - tempo.tick.pos <- sort(tempo.tick.pos, decreasing = ifelse(diff(ylim.order) > 0, FALSE, TRUE)) - tempo.tick.pos <- log10(tempo.tick.pos[tempo.tick.pos >= min(10^ylim) & tempo.tick.pos <= max(10^ylim)]) - if(any(is.na(tempo.tick.pos) | ! is.finite(tempo.tick.pos))){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 11\n\n============\n\n")) - stop(tempo.cat) - } - # if(vertical == TRUE){ # do not remove in case the bug is fixed - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "segment", y = tempo.tick.pos, yend = tempo.tick.pos, x = tempo.coord$x.range[1], xend = tempo.coord$x.range[1] + diff(tempo.coord$x.range) / 80)) - # }else{ # not working because of the ggplot2 bug - # assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "segment", x = tempo.tick.pos, xend = tempo.tick.pos, y = tempo.coord$y.range[1], yend = tempo.coord$y.range[1] + diff(tempo.coord$y.range) / 80)) - # } - }else if(( ! is.null(y.inter.tick.nb)) & ylog == "no"){ - if(y.inter.tick.nb > 0){ - if(vertical == TRUE){ - ticks.pos <- suppressWarnings(as.numeric(tempo.coord$y.labels)) # too difficult to predict the behavior of tempo.coord$x.major_source depending on ylim neg or not, inv or not - if(any(is.na(ticks.pos))){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 12\n\n============\n\n")) - stop(tempo.cat) - } - tick.dist <- mean(diff(ticks.pos), na.rm = TRUE) - minor.tick.dist <- tick.dist / (y.inter.tick.nb + 1) - minor.tick.pos <- seq(ticks.pos[1] - tick.dist, ticks.pos[length(ticks.pos)] + tick.dist, by = minor.tick.dist) - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "segment", y = minor.tick.pos, yend = minor.tick.pos, x = tempo.coord$x.range[1], xend = tempo.coord$x.range[1] + diff(tempo.coord$x.range) / 80)) - }else{ - ticks.pos <- suppressWarnings(as.numeric(tempo.coord$x.labels))# too difficult to predict the behavior of tempo.coord$x.major_source depending on ylim neg or not, inv or not - if(any(is.na(ticks.pos))){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 13\n\n============\n\n")) - stop(tempo.cat) - } - tick.dist <- mean(diff(ticks.pos), na.rm = TRUE) - minor.tick.dist <- tick.dist / (y.inter.tick.nb + 1) - minor.tick.pos <- seq(ticks.pos[1] - tick.dist, ticks.pos[length(ticks.pos)] + tick.dist, by = minor.tick.dist) - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "segment", y = minor.tick.pos, yend = minor.tick.pos, x = tempo.coord$y.range[1], xend = tempo.coord$y.range[1] + diff(tempo.coord$y.range) / 80)) - } - } - } - # end secondary ticks (after ggplot2::coord_cartesian() or ggplot2::coord_flip()) - # end y scale management (cannot be before dot plot management) - if(plot == TRUE){ - suppressWarnings(print(eval(parse(text = paste(paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "), if(is.null(add)){NULL}else{add}))))) - }else{ - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": PLOT NOT SHOWN AS REQUESTED") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - # end barplot - if(warn.print == TRUE & ! is.null(warning)){ - warning(warning) - } - if(return == TRUE){ - output <- ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + ")))) - output <- list(stat = stat, removed.row.nb = removed.row.nb, removed.rows = removed.rows, data = output$data, axes = output$layout$panel_params[[1]], warnings = paste0("\n", warning, "\n\n")) - return(output) - } +fun_close <- function(kind = "pdf", return.text = FALSE){ +# AIM +# close only specific graphic windows (devices) +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_check() +# ARGUMENTS: +# kind: vector, among c("windows", "quartz", "x11", "X11", "pdf", "bmp", "png", "tiff"), indicating the kind of graphic windows (devices) to close. BEWARE: either "windows", "quartz", "x11" or "X11" means that all the X11 GUI graphics devices will be closed, whatever the OS used +# return.text: print text regarding the kind parameter and the devices that were finally closed? +# RETURN +# text regarding the kind parameter and the devices that were finally closed +# EXAMPLES +# windows() ; windows() ; pdf() ; dev.list() ; fun_close(kind = c("pdf", "x11"), return.text = TRUE) ; dev.list() +# DEBUGGING +# kind = c("windows", "pdf") ; return.text = FALSE # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_check(data = kind, options = c("windows", "quartz", "x11", "X11", "pdf", "bmp", "png", "tiff"), fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = return.text, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_check() +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() +# end argument checking +# main code +text <- paste0("THE REQUIRED KIND OF GRAPHIC DEVICES TO CLOSE ARE ", paste(kind, collapse = " ")) +if(Sys.info()["sysname"] == "Windows"){ # Note that .Platform$OS.type() only says "unix" for macOS and Linux and "Windows" for Windows +if(any(kind %in% c("windows", "quartz", "x11", "X11"))){ +tempo <- kind %in% c("windows", "quartz", "x11", "X11") +kind[tempo] <- "windows" # term are replaced by what is displayed when using a <- dev.list() ; names(a) +} +}else if(Sys.info()["sysname"] == "Linux"){ +if(any(kind %in% c("windows", "quartz", "x11", "X11"))){ +tempo.device <- suppressWarnings(try(X11(), silent = TRUE))[] # open a X11 window to try to recover the X11 system used +if( ! is.null(tempo.device)){ +text <- paste0(text, "\nCANNOT CLOSE GUI GRAPHIC DEVICES AS REQUIRED BECAUSE THIS LINUX SYSTEM DOES NOT HAVE IT") +}else{ +tempo <- kind %in% c("windows", "quartz", "x11", "X11") +kind[tempo] <- names(dev.list()[length(dev.list())]) # term are replaced by what is displayed when using a <- dev.list() ; names(a) +invisible(dev.off()) # close the X11 opened by tempo +} +} +}else{ # for macOS +if(any(kind %in% c("windows", "quartz", "x11", "X11"))){ +tempo <- kind %in% c("windows", "quartz", "x11", "X11") +kind[tempo] <- "quartz" # term are replaced by what is displayed when using a <- dev.list() ; names(a) +} +} +kind <- unique(kind) +if(length(dev.list()) != 0){ +for(i in length(names(dev.list())):1){ +if(names(dev.list())[i] %in% kind){ +text <- paste0(text, "\n", names(dev.list())[i], " DEVICE NUMBER ", dev.list()[i], " HAS BEEN CLOSED") +invisible(dev.off(dev.list()[i])) +} +} +} +if(return.text == TRUE){ +return(text) +} } -######## fun_gg_boxplot() #### ggplot2 boxplot + background dots if required - - - - - - - -######## fun_gg_bar_prop() #### ggplot2 proportion barplot - - -######## fun_gg_strip() #### ggplot2 stripchart + mean/median - - -######## fun_gg_violin() #### ggplot2 violins - - -######## fun_gg_line() #### ggplot2 lines + background dots and error bars - - -# DO NOT ERASE. COMPARE WITH BAR MEAN BEFORE AND RECOVER WHAT HAS BEEN MODIFIED +################ Standard graphics -fun_gg_line <- function(data1, y, categ, categ.class.order = NULL, categ.legend.name = NULL, categ.color = NULL, line.size = 1, error.disp = NULL, error.whisker.width = 0.5, dot.color = "same", dot.tidy = FALSE, dot.bin.nb = 30, dot.jitter = 0.25, dot.size = 3, dot.border.size = 0.5, dot.alpha = 0.5, ylim = NULL, ylog = FALSE, y.tick.nb = NULL, y.include.zero = FALSE, y.top.extra.margin = 0.05, y.bottom.extra.margin = 0, stat.disp = NULL, stat.size = 4, stat.dist = 2, xlab = NULL, ylab = NULL, vertical = TRUE, title = "", text.size = 12, text.angle = 0, classic = FALSE, grid = FALSE, return = FALSE, path.lib = NULL){ - # AIM - # ggplot2 vertical barplot representing mean values with the possibility to add error bars and to overlay dots - # for ggplot2 specifications, see: https://ggplot2.tidyverse.org/articles/ggplot2-specs.html - # WARNINGS - # rows containing NA in data1[, c(y, categ)] will be removed before processing, with a warning (see below) - # if ever bars disappear, see the end of https://github.com/tidyverse/ggplot2/issues/2887 - # to have a single bar, create a factor column with a single class and specify the name of this column in categ argument as unique element (no categ2 in categ argument). For a single set of grouped bars, create a factor column with a single class and specify this column in categ argument as first element (categ1). See categ below - # with several single bars (categ argument with only one element), bar.width argument (i.e., width argument of ggplot2::geom_bar()) defines each bar width. The bar.width argument also defines the space between bars by using (1 - bar.width). In addition, xmin and xmax of the fun_gg_bar_mean() output report the bar boundaries (around x-axis unit 1, 2, 3, etc., for each bar) - # with several sets of grouped bars (categ argument with two elements), bar.width argument defines each set of grouped bar width. The bar.width argument also defines the space between set of grouped bars by using (1 - bar.width). In addition, xmin and xmax of the fun_gg_bar_mean() output report the bar boundaries (around x-axis unit 1, 2, 3, etc., for each set of grouped bar) - # to manually change the 0 base bar into this code, see https://stackoverflow.com/questions/35324892/ggplot2-setting-geom-bar-baseline-to-1-instead-of-zero - # ARGUMENTS - # data1: a dataframe containing one column of values (see y argument below) and one or two columns of categories (see categ argument below). Duplicated column names not allowed - # y: character string of the data1 column name for y-axis (containing numeric values). Numeric values will be averaged by categ to generate the bars and will also be used to plot the dots - # categ: vector of character strings of the data1 column name for categories (column of characters or factor). Must either be one or two column names. If a single column name (further refered to as categ1), then one bar per class of categ1. If two column names (further refered to as categ1 and categ2), then one bar per class of categ2, which form a group of bars in each class of categ1. BEWARE, categ1 (and categ2 if it exists) must have a single value of y per class of categ1 (and categ2). To have a single bar, create a factor column with a single class and specify the name of this column in categ argument as unique element (no categ2 in categ argument). For a single set of grouped bars, create a factor column with a single class and specify this column in categ argument as first element (categ1) - # categ.class.order: list indicating the order of the classes of categ1 and categ2 represented on the barplot (the first compartment for categ1 and and the second for categ2). If categ.class.order = NULL, classes are represented according to the alphabetical order. Some compartment can be NULL and other not - # categ.legend.name: character string of the legend title for categ2. If categ.legend.name = NULL, then categ.legend.name <- categ1 if only categ1 is present and categ.legend.name <- categ2 if categ1 and categ2 are present. Write "" if no legend required - # categ.color: vector of character color string for bar filling. If categ.color = NULL, default colors of ggplot2, whatever categ1 and categ2. If categ.color is non null and only categ1 in categ argument, categ.color can be either: (1) a single color string (all the bars will have this color, whatever the classes of categ1), (2) a vector of string colors, one for each class of categ1 (each color will be associated according to categ.class.order of categ1), (3) a vector or factor of string colors, like if it was one of the column of data1 data frame (beware: a single color per class of categ1 and a single class of categ1 per color must be respected). Integers are also accepted instead of character strings, as long as above rules about length are respected. Integers will be processed by fun_gg_palette() using the max integer value among all the integers in categ.color. If categ.color is non null and categ1 and categ2 specified, all the rules described above will apply to categ2 instead of categ1 (colors will be determined for bars inside a group of bars) - # bar.width: numeric value (from 0 to 1) of the bar or set of grouped bar width (see warnings above) - # error.disp: either "SD", "SD.TOP", "SEM" or "SEM.TOP". If NULL, no error bars added - # error.whisker.width: numeric value (from 0 to 1) of the whisker (error bar extremities) width, with 0 meaning no whiskers and 1 meaning a width equal to the corresponding bar width - # dot.color: vector of character string. Idem as categ.color but for dots, except that in the possibility (3), the rule "a single color per class of categ1 and a single class of categ1", cannot be respected (each dot can have a different color). If NULL, no dots plotted - # dot.tidy: logical. Nice dot spreading? If TRUE, use the geom_dotplot() function for a nice representation. If FALSE, dots are randomly spread, using the dot.jitter argument (see below) - # dot.bin.nb: positive integer indicating the number of bins (i.e., nb of separations) of the ylim range. Each dot will then be put in one of the bin, with the size the width of the bin. Not considered if dot.tidy is FALSE - # dot.jitter: numeric value (from 0 to 1) of random dot horizontal dispersion, with 0 meaning no dispersion and 1 meaning a dispersion in the corresponding bar width interval. Not considered if dot.tidy is TRUE - # dot.size: numeric value of dot size. Not considered if dot.tidy is TRUE - # dot.border.size: numeric value of border dot size. Write zero for no dot border. If dot.tidy is TRUE, value 0 remove the border. Another one leave the border without size control (geom_doplot() feature) - # dot.alpha: numeric value (from 0 to 1) of dot transparency (full transparent to full opaque, respectively) - # ylim: 2 numeric values for y-axis range. If NULL, range of y in data1 - # ylog: logical. Log scale for the y-axis? BEWARE: do not tranform the data, but just display ticks in a log scale manner. BEWARE: if TRUE, ylim must not contain null or negative values. In addition, will be automatically set to FALSE if vertical argument is set to FALSE, to prevent a bug in ggplot2 (see https://github.com/tidyverse/ggplot2/issues/881) - # y.tick.nb: number of desired values on the y-axis - # y.include.zero: logical. Does ylim range include 0? BEWARE: if ylog = TRUE, will be automately set to FALSE with a warning message - # y.top.extra.margin: single proportion (between 0 and 1) indicating if extra margins must be added to ylim. If different from 0, add the range of the axis * y.top.extra.margin (e.g., abs(ylim[2] - ylim[1]) * y.top.extra.margin) to the top of y-axis. BEWARE with ylog = TRUE, the range result must not overlap zero or negative values - # y.bottom.extra.margin: idem as y.top.extra.margin but to the bottom of y-axis - # stat.disp: add the mean number above the corresponding bar. Either NULL (no number shown), "top" (at the top of the figure region) or "above" (above each bar) - # stat.size: numeric value of the stat size (in points). Increase the value to increase text size - # stat.dist: numeric value of the stat distance. Increase the value to increase the distance - # xlab: a character string for x-axis legend. If NULL, character string of categ1 - # ylab: a character string y-axis legend. If NULL, character string of the y argument - # vertical: logical. Vertical bars? BEWARE: cannot have horizontal bars with a log axis, i.e., ylog = TRUE & vertical = FALSE (see ylog above) - # title: character string of the graph title - # text.size: numeric value of the text size (in points) - # text.angle: integer value of the text angle for the x-axis labels. Positive values for counterclockwise rotation: 0 for horizontal, 90 for vertical, 180 for upside down etc. Negative values for clockwise rotation: 0 for horizontal, -90 for vertical, -180 for upside down etc. - # classic: logical. Use the classic theme (article like)? - # grid: logical. draw horizontal lines in the background to better read the bar values? Not considered if classic = FALSE - # return: logical. Return the graph parameters? - # path.lib: absolute path of the required packages, if not in the default folders -} +######## fun_empty_graph() #### text to display for empty graphs -######## fun_gg_heatmap() #### ggplot2 heatmap + overlaid mask if required + -#test plot.margin = margin(up.space.mds, right.space.mds, down.space.mds, left.space.mds, "inches") to set the dim of the region plot ? -# if matrix is full of zero (or same value I guess), heatmap is complicate. Test it and error message # Check OK: clear to go Apollo -fun_gg_heatmap <- function(data1, legend.name1 = "", low.color1 = "blue", mid.color1 = "white", high.color1 = "red", limit1 = NULL, midpoint1 = NULL, data2 = NULL, color2 = "black", alpha2 = 0.5, invert2 = FALSE, text.size = 12, title = "", title.text.size = 12, show.scale = TRUE, rotate = FALSE, return = FALSE, plot = TRUE, add = NULL, warn.print = FALSE, path.lib = NULL){ - # AIM - # ggplot2 heatmap with the possibility to overlay a mask - # see also: - # draw : http://www.sthda.com/english/wiki/ggplot2-quick-correlation-matrix-heatmap-r-software-and-data-visualization - # same range scale : https://stackoverflow.com/questions/44655723/r-ggplot2-heatmap-fixed-scale-color-between-graphs - # for ggplot2 specifications, see: https://ggplot2.tidyverse.org/articles/ggplot2-specs.html - # ARGUMENTS - # data1: numeric matrix or data frame resulting from the conversion of the numeric matrix by reshape2::melt() - # legend.name1: character string of the data1 heatmap scale legend - # low.color1: character string of the color (i.e., "blue" or "#0000FF") of the lowest scale value - # mid.color1: same as low.color1 but for the middle scale value. If NULL, the middle color is the default color between low.color1 and high.color1. BEWARE: argument midpoint1 is not ignored, even if mid.color1 is NULL, meaning that the default mid color can still be controled - # high.color1: same as low.color1 but for the highest scale value - # limit1: 2 numeric values defining the lowest and higest color scale values. If NULL, take the range of data1 values - # midpoint1: single numeric value defining the value corresponding to the mid.color1 argument. A warning message is returned if midpoint1 does not correspond to the mean of limit1 values, because the color scale is not linear anymore. If NULL, takes the mean of limit1 values. Mean of data1, instead of mean of limit1, can be used here if required - # data2: binary mask matrix (made of 0 and 1) of same dimension as data1 or a data frame resulting from the conversion of the binary mask matrix by reshape2::melt(). Value 1 of data2 will correspond to color2 argument (value 0 will be NA color), and the opposite if invert2 argument is TRUE (inverted mask) - # color2: color of the 1 values of the binary mask matrix. The 0 values will be color NA - # alpha2: numeric value (from 0 to 1) of the mask transparency - # invert2: logical. Invert the mask (1 -> 0 and 0 -> 1)? - # text.size: numeric value of the size of the texts in scale - # title: character string of the graph title - # title.text.size: numeric value of the title size (in points) - # show.scale: logical. Show color scale? - # rotate: logical. Rotate the heatmap 90° clockwise? - # return: logical. Return the graph parameters? - # plot: logical. Plot the graphic? If FALSE and return argument is TRUE, graphical parameters and associated warnings are provided without plotting - # add: character string allowing to add more ggplot2 features (dots, lines, themes, etc.). BEWARE: (1) must start with "+" just after the simple or double opening quote (no space, end of line, carriage return, etc., allowed), (2) must finish with ")" just before the simple or double closing quote (no space, end of line, carriage return, etc., allowed) and (3) each function must be preceded by "ggplot2::" (for instance: "ggplot2::coord_flip()). If the character string contains the "ggplot2::theme" string, then internal ggplot2 theme() and theme_classic() functions will be inactivated to be reused by add. BEWARE: handle this argument with caution since added functions can create conflicts with the preexisting internal ggplot2 functions - # warn.print: logical. Print warnings at the end of the execution? No print if no warning messages - # path.lib: absolute path of the required packages, if not in the default folders - # REQUIRED PACKAGES - # ggplot2 - # reshape2 - # REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION - # fun_check() - # fun_pack() - # fun_round() - # RETURN - # a heatmap if plot argument is TRUE - # a list of the graph info if return argument is TRUE: - # $data: a list of the graphic info - # $axes: a list of the axes info - # $scale: the scale info (lowest, mid and highest values) - # $warnings: the warning messages. Use cat() for proper display. NULL if no warning - # EXAMPLES - # fun_gg_heatmap(data1 = matrix(1:16, ncol = 4), title = "GRAPH 1") - # fun_gg_heatmap(data1 = matrix(1:16, ncol = 4), return = TRUE) - # fun_gg_heatmap(data1 = matrix(1:16, ncol = 4), legend.name1 = "VALUE", title = "GRAPH 1", text.size = 5, data2 = matrix(rep(c(1,0,0,0), 4), ncol = 4), invert2 = FALSE, return = TRUE) - # diagonal matrix - # fun_gg_heatmap(data1 = matrix(c(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1), ncol = 4)) - # fun_gg_heatmap(data1 = reshape2::melt(matrix(c(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1), ncol = 4))) - # error message - # fun_gg_heatmap(data1 = matrix(1:16, ncol = 4), data2 = matrix(rep(c(1,0,0,0), 5), ncol = 5)) - # fun_gg_heatmap(data1 = matrix(1:16, ncol = 4), data2 = reshape2::melt(matrix(rep(c(1,0,0,0), 4), ncol = 4))) - # fun_gg_heatmap(data1 = reshape2::melt(matrix(1:16, ncol = 4)), data2 = reshape2::melt(matrix(rep(c(1,0,0,0), 4), ncol = 4))) - #### NICE REPRESENTATION - # set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 10, 3), time = rnorm(1000, 10, 3), group1 = rep(c("A1", "A2"), 500)) ; obs2 <-data.frame(km = rnorm(1000, 15, 3), time = rnorm(1000, 15, 3), group2 = rep(c("G1", "G2"), 500)) ; set.seed(NULL) ; obs1$L1$km[2:3] <- NA ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), categ = list(L1 = "group1", L2 = "group2"), legend.name = NULL, color = list(L1 = 4:5, L2 = 7:8), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5), dot.size = 3, line.size = 0.5, xlim = c(1, 25), xlab = "KM", xlog = "no", x.tick.nb = 10, x.inter.tick.nb = 1, x.left.extra.margin = 0, x.right.extra.margin = 0, ylim = c(1, 25), ylab = expression(paste("TIME (", 10^-20, " s)")), ylog = "log10", y.tick.nb = 5, y.top.extra.margin = 0, y.bottom.extra.margin = 0, xy.include.zero = TRUE, classic = TRUE) - #### SINGLE GEOMETRIC LAYER - # simple example (1) of scatter plot using the classical writting - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time") - # simple example (2) of scatter plot, identical to (1) but using the list writting. Here, a list of one compartment, systematically named L1, is provided to the data1, x, y, categ, geom and alpha. Contrary to example (1), the geom and alpha argument have to be included because the default value are not lists (if data1 is a list, all the x, y, categ, legend.name, color, geom and alpha must also be list if non NULL) - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = list(L1 = obs1), x = list(L1 = "km"), y = list(L1 = "time"), geom = list(L1 = "geom_point"), alpha = list(L1 = 0.5)) - # color of dots. Example (1) using the classical writting - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", color = "blue") - # color of dots. Example (2) using the list writting - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = list(L1 = obs1), x = list(L1 = "km"), y = list(L1 = "time"), color = list(L1 = "blue"), geom = list(L1 = "geom_point"), alpha = list(L1 = 1)) - # From here, classical writting is use for single element in data1 and list writting otherwise - # color of dots. Example (3) when dots are in different categories. Note that categ argument controls the legend display - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", categ = "group") - # color of dots. Example (4) when dots are in different categories. A single color mentionned is applied to all the dots - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", categ = "group", color = "coral") - # color of dots. Example (5) when dots are in different categories. Numbers can be used if ggplot colors are desired - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", categ = "group", color = 2) - # color of dots. Example (6) when dots are in different categories, with one color per category (try also color = 2:1) - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", categ = "group", color = c("coral", "green")) - # color of dots. Example (7) when dots are in different categories, with colors as a data frame column. BEWARE: one color per category must be respected (try also numbers) - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B"), col = rep(c("coral", "green"), each = 3)) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", categ = "group", color = obs1$col) - # color of dots. Example (8) when dots are in different categories, with colors as a data frame column. Easiest way (ggplot colors) - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", categ = "group", color = as.numeric(obs1$group)) - # legend name - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", categ = "group", legend.name = "CLASSES") - # different geom features. Example (1) with geom_line kind of lines - # obs1 <- data.frame(km = c(1, 3, 2, 6, 4, 5), time = c(1, 3, 2, 6, 4, 5)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", geom = "geom_line", categ = "group") - # different geom features. Example (2) with geom_path kind of lines (see the difference with (1)) - # obs1 <- data.frame(km = c(1, 3, 2, 6, 4, 5), time = c(1, 3, 2, 6, 4, 5)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", geom = "geom_path", categ = "group") - # different geom features. Example (3) with geom_hline kind of lines. Fake_y y-axis name by default because y argument must be NULL (see ylab argument below to change this) - # obs1 <- data.frame(km = 1:2, time = (1:2)^2, group = c("A", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = NULL, y = "km", geom = "geom_hline", categ = "group", xlim = c(1,10)) - # different geom features. Example (4) with geom_vline kind of lines. Fake_y y-axis name by default because y argument must be NULL (see ylab argument below to change this) - # obs1 <- data.frame(km = 1:2, time = (1:2)^2, group = c("A", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = NULL, geom = "geom_vline", categ = "group", ylim = c(1,10)) - #### MULTI GEOMETRIC LAYERS - # Note that in subsequent examples, names of list compartments are systematically referred to as L1, L2, etc., to show the correspondence between the arguments data1, x, y, categ, etc. - # single layer (as examples above) - # set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1), x = list(L1 = "km"), y = list(L1 = "time"), geom = list(L1 = "geom_point"), alpha = list(L1 = 0.5)) - # simple example of two layers - # set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5)) - # color of dots. Example (1) - # set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5), color = list(L1 = "coral", L2 = "green")) - # color of dots. Example (2) of the legend display. The categ argument must be supplied. Make a fake categorical colum in the data frame if necessary (as in this example). The categ argument triggers the legend display. The legend.name argument is used to remove the legend title of each layer - # set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = "GROUP1") ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = "GROUP2") ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), categ = list(L1 = "group1", L2 = "group2"), legend.name = list(L1 = NULL, L2 = NULL), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5), color = list(L1 = "coral", L2 = "green")) - # color of dots. Example (3) when dots are in different categories (default colors) - # set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = rep(c("A1", "A2"), each = 500)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = rep(c("G1", "G2"), each = 500)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), , categ = list(L1 = "group1", L2 = "group2"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5)) - # color of dots. Example (3) when dots are in different categories. A single color mentionned per layer is applied to all the dots of the layer - # set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = rep(c("A1", "A2"), each = 500)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = rep(c("G1", "G2"), each = 500)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), , categ = list(L1 = "group1", L2 = "group2"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5), color = list(L1 = "coral", L2 = "green")) - # color of dots. Example (5) when dots are in different categories, with one color per category in each layer - # set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = rep(c("A1", "A2"), each = 500)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = rep(c("G1", "G2"), each = 500)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), , categ = list(L1 = "group1", L2 = "group2"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5), color = list(L1 = c("coral", "blue"), L2 = c("green", "black"))) - # color of dots. Example (4) when dots are in different categories. Numbers can be used if ggplot colors are desired - # set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = rep(c("A1", "A2"), each = 500)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = rep(c("G1", "G2"), each = 500)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), , categ = list(L1 = "group1", L2 = "group2"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5), color = list(L1 = 1:2, L2 = c(4, 7))) - # color of dots. Example (7) when dots are in different categories, with colors as a data frame column. BEWARE: one color per category must be respected (try also numbers). BEWARE: in color argument, if the column of the data frame does not exist, color can be still displayed (L2 = obs2$notgood is equivalent to L2 = NULL). Such situation is reported in the warning messages (see below) - # set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = rep(c("A1", "A2"), each = 500), col1 = rep(c("coral", "blue"), each = 500)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = rep(c("G1", "G2"), each = 500), col2 = rep(c("green", "black"), each = 500)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), , categ = list(L1 = "group1", L2 = "group2"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5), color = list(L1 = obs1$col1, L2 = obs2$col2)) - # color of dots. Example (8) when dots are in different categories, with colors as a data frame column. Easiest way is not recommended with mutiple layers - # set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = rep(c("A1", "A2"), each = 500), col1 = rep(c("coral", "blue"), each = 500)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = rep(c("G1", "G2"), each = 500), col2 = rep(c("green", "black"), each = 500)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), , categ = list(L1 = "group1", L2 = "group2"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5), color = list(L1 = as.numeric(obs1$group1), L2 = as.numeric(obs2$group2))) - # legend name - # set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = rep(c("A1", "A2"), each = 500)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = rep(c("G1", "G2"), each = 500)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), , categ = list(L1 = "group1", L2 = "group2"), legend.name = list(L1 = "CLASS A", L2 = "CLASS G"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5)) - # different geom features. Example (1) with 5 layers. Note that order in data1 defines the overlay order (from below to above) and the order in the legend (from top to bottom) - # set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = rep(c("A1", "A2"), each = 500)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = rep(c("G1", "G2"), each = 500)) ; set.seed(NULL) ; obs3 <- data.frame(time = c(29, 31), group3 = c("HORIZ.THRESHOLD.1", "HORIZ.THRESHOLD.2")) ; obs4 <- data.frame(km = 26, group4 = "VERTIC.THRESHOLD") ; obs5 <- data.frame(km = seq(1, 100, 0.1), time = 7*seq(1, 100, 0.1)^0.5, group5 = "FUNCTION") ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2, L3 = obs3, L4 = obs4, L5 = obs5), x = list(L1 = "km", L2 = "km", L3 = NULL, L4 = "km", L5 = "km"), y = list(L1 = "time", L2 = "time", L3 = "time", L4 = NULL, L5 = "time"), categ = list(L1 = "group1", L2 = "group2", L3 = "group3", L4 = "group4", L5 = "group5"), geom = list(L1 = "geom_point", L2 = "geom_point", L3 = "geom_hline", L4 = "geom_vline", L5 = "geom_line"), alpha = list(L1 = 0.5, L2 = 0.5, L3 = 0.5, L4 = 0.5, L5 = 0.5), xlim = c(10, 40), ylim = c(10, 40), classic = TRUE, line.size = 0.75) - # layer transparency. One transparency defined by layer (from 0 invisible to 1 opaque). Note that for lines, transparency in not applied in the legend to prevent a ggplot2 bug (https://github.com/tidyverse/ggplot2/issues/2452) - # set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = rep(c("A1", "A2"), each = 500)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = rep(c("G1", "G2"), each = 500)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), , categ = list(L1 = "group1", L2 = "group2"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 1, L2 = 0.1)) - # other different example of mutiple geom features are shown in the fun_segmentation function - #### OTHER GRAPHIC ARGUMENTS - # dot size (line.size argument controls size of lines) - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", dot.size = 5) - # axis management: examples are shown for x-axis but are identical for y-axis - # x-axis limits. Example (1) - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", xlim = c(-1, 25)) - # x-axis limits. Example (2) showing that order matters in ylim argument - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", xlim = c(25, -1)) - # log scale. Example (1). BEWARE: x column must be log, otherwise incoherent scale (see below warning message with the return argument) - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", xlog = "log10") - # log scale. Example (2). BEWARE: values of the xlim must be in the corresponding log - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", xlog = "log10", xlim = c(1, 10)) - # tick number. Example (1). Note that the final number shown is approximate - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", x.tick.nb = 6) - # tick number. Example (2) using a log2 scale - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", xlog = "log2", x.tick.nb = 6) - # tick number. Example (3) using a log10 scale - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", xlog = "log10", x.tick.nb = 6) - # tick number. Example (4) using a log10 scale: the reverse x-axis correctly deal with log10 scale - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", xlog = "log10", xlim = c(7, 2)) - # secondary tick number. Example (1) - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", x.inter.tick.nb = 4) - # secondary ticks. Example (2) not for log2 and log10 scales (see below warning message with the return argument) - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", xlog = "log10", x.inter.tick.nb = 4) - # extra margins. To avoid dot cuts - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", x.left.extra.margin = 0.25, x.right.extra.margin = 0.25) - # include zero in both the x-axis and y-xis - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", xy.include.zero = TRUE) - # graph title, text size and legend display - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", categ = "group", text.size = 8, title = "GRAPH1", title.text.size = 16, show.legend = TRUE) - # raster display. This switchs from vectorial mode to raster mode. The display can takes some time, but this is easier to export and handle than vectorial display - # set.seed(1) ; obs1 <- data.frame(km = rnorm(100000, 22, 3), time = rnorm(100000, 22, 3)) ; set.seed(NULL) ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", raster = TRUE) - # classic representation (use grid = TRUE to display the background lines of the y axis ticks) - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", classic = TRUE, grid = FALSE) - # graphic info. Example (1) - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", return = TRUE) - # graphic info. Example (2) of assignation and warning message display - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; output <- fun_gg_scatter(data1 = obs1, x = "km", y = "time", xlog = "log10", return = TRUE) ; cat(output$warnings) - # add ggplot2 functions - # obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", add = "+ggplot2::theme_classic()") - # all the arguments - # set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 10, 3), time = rnorm(1000, 10, 3), group1 = rep(c("A1", "A2"), 500)) ; obs2 <-data.frame(km = rnorm(1000, 15, 3), time = rnorm(1000, 15, 3), group2 = rep(c("G1", "G2"), 500)) ; set.seed(NULL) ; obs1$L1$km[2:3] <- NA ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), categ = list(L1 = "group1", L2 = "group2"), legend.name = NULL, color = list(L1 = 4:5, L2 = 7:8), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5), dot.size = 3, line.size = 0.5, xlim = c(1, 25), xlab = "KM", xlog = "no", x.tick.nb = 10, x.inter.tick.nb = 1, x.left.extra.margin = 0, x.right.extra.margin = 0, ylim = c(1, 25), ylab = "TIME (s)", ylog = "log10", y.tick.nb = 5, y.inter.tick.nb = NULL, y.top.extra.margin = 0, y.bottom.extra.margin = 0, xy.include.zero = TRUE, text.size = 12, title = "", title.text.size = 8, show.legend = TRUE, classic = FALSE, grid = FALSE, raster = FALSE, vectorial.limit = NULL, return = FALSE, plot = TRUE, add = NULL, warn.print = TRUE, path.lib = NULL) - - - - - - # DEBUGGING - # data1 = matrix(1:16, ncol = 4) ; legend.name1 = "" ; low.color1 = "blue" ; mid.color1 = "white" ; high.color1 = "red" ; limit1 = NULL ; midpoint1 = NULL ; data2 = matrix(rep(c(1,0,0,0), 4), ncol = 4) ; color2 = "black" ; alpha2 = 0.5 ; invert2 = FALSE ; text.size = 12 ; title = "" ; title.text.size = 12 ; show.scale = TRUE ; rotate = FALSE ; return = FALSE ; plot = TRUE ; add = NULL ; warn.print = TRUE ; path.lib = NULL - # function name - function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") - # end function name - # required function checking - if(length(find("fun_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - if(length(find("fun_pack", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_pack() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - if(length(find("fun_round", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_round() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # no reserved words required for this function - # argument checking - warning <- NULL - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - if(all(is.matrix(data1))){ - tempo <- fun_check(data = data1, class = "matrix", mode = "numeric", na.contain = TRUE, fun.name = function.name) ; eval(ee) - }else if(all(is.data.frame(data1))){ - tempo <- fun_check(data = data1, class = "data.frame", length = 3, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE){ - # structure of reshape2::melt() data frame - tempo <- fun_check(data = data1[, 1], typeof = "integer", fun.name = function.name) - tempo <- fun_check(data = data1[, 2], typeof = "integer", fun.name = function.name) - tempo <- fun_check(data = data1[, 3], mode = "numeric", na.contain = TRUE, fun.name = function.name) - } - }else{ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data1 ARGUMENT MUST BE A NUMERIC MATRIX OR A DATA FRAME OUTPUT OF THE reshape::melt() FUNCTION\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - tempo <- fun_check(data = legend.name1, class = "character", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = low.color1, class = "character", length = 1, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & ! (all(low.color1 %in% colors() | grepl(pattern = "^#", low.color1)))){ # check that all strings of low.color1 start by # - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": low.color1 ARGUMENT MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # AND/OR COLOR NAMES GIVEN BY colors()\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - if( ! is.null(mid.color1)){ - tempo <- fun_check(data = mid.color1, class = "character", length = 1, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & ! (all(mid.color1 %in% colors() | grepl(pattern = "^#", mid.color1)))){ # check that all strings of mid.color1 start by # - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": mid.color1 ARGUMENT MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # AND/OR COLOR NAMES GIVEN BY colors()\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - } - tempo <- fun_check(data = high.color1, class = "character", length = 1, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & ! (all(high.color1 %in% colors() | grepl(pattern = "^#", high.color1)))){ # check that all strings of high.color1 start by # - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": high.color1 ARGUMENT MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # AND/OR COLOR NAMES GIVEN BY colors()\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - if( ! is.null(limit1)){ - tempo <- fun_check(data = limit1, class = "vector", mode = "numeric", length = 2, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & any(limit1 %in% c(Inf, -Inf))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": limit1 ARGUMENT CANNOT CONTAIN -Inf OR Inf VALUES\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - } - if( ! is.null(midpoint1)){ - tempo <- fun_check(data = midpoint1, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) - } - if( ! is.null(data2)){ - if(all(is.matrix(data2))){ - tempo <- fun_check(data = data2, class = "matrix", mode = "numeric", fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & ! all(unique(data2) %in% c(0,1))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": MATRIX IN data2 MUST BE MADE OF 0 AND 1 ONLY (MASK MATRIX)\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - }else if(tempo$problem == FALSE & all(is.matrix(data1)) & ! identical(dim(data1), dim(data2))){ # matrix and matrix - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": MATRIX DIMENSION IN data2 MUST BE IDENTICAL AS MATRIX DIMENSION IN data1. HERE IT IS RESPECTIVELY:\n", paste(dim(data2), collapse = " "), "\n", paste(dim(data1), collapse = " "), "\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - }else if(tempo$problem == FALSE & all(is.data.frame(data1)) & nrow(data1) != prod(dim(data2))){ # reshape2 and matrix - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": DATA FRAME IN data2 MUST HAVE ROW NUMBER EQUAL TO PRODUCT OF DIMENSIONS OF data1 MATRIX. HERE IT IS RESPECTIVELY:\n", paste(nrow(data1), collapse = " "), "\n", paste(prod(dim(data2)), collapse = " "), "\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - }else if(all(is.data.frame(data2))){ - tempo <- fun_check(data = data2, class = "data.frame", length = 3, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE){ - # structure of reshape2::melt() data frame - tempo <- fun_check(data = data2[, 1], typeof = "integer", fun.name = function.name) - tempo <- fun_check(data = data2[, 2], typeof = "integer", fun.name = function.name) - tempo <- fun_check(data = data2[, 3], mode = "numeric", fun.name = function.name) - } - if(tempo$problem == FALSE & ! all(unique(data2[, 3]) %in% c(0,1))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THIRD COLUMN OF DATA FRAME IN data2 MUST BE MADE OF 0 AND 1 ONLY (MASK DATA FRAME)\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - }else if(tempo$problem == FALSE & all(is.data.frame(data1)) & ! identical(dim(data1), dim(data2))){ # data frame and data frame - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": DATA FRAME DIMENSION IN data2 MUST BE IDENTICAL TO DATA FRAME DIMENSION IN data1. HERE IT IS RESPECTIVELY:\n", paste(dim(data2), collapse = " "), "\n", paste(dim(data1), collapse = " "), "\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - }else if(tempo$problem == FALSE & all(is.matrix(data1)) & nrow(data2) != prod(dim(data1))){ # reshape2 and matrix - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": DATA FRAME IN data2 MUST HAVE ROW NUMBER EQUAL TO PRODUCT OF DIMENSION OF data1 MATRIX. HERE IT IS RESPECTIVELY:\n", paste(nrow(data2), collapse = " "), "\n", paste(prod(dim(data1)), collapse = " "), "\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - }else{ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data2 ARGUMENT MUST BE A NUMERIC MATRIX OR A DATA FRAME OUTPUT OF THE reshape::melt() FUNCTION\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - } - tempo <- fun_check(data = color2, class = "character", length = 1, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & ! (all(color2 %in% colors() | grepl(pattern = "^#", color2)))){ # check that all strings of color2 start by # - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": color2 ARGUMENT MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # AND/OR COLOR NAMES GIVEN BY colors()\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - tempo <- fun_check(data = alpha2, class = "vector", mode = "numeric", length = 1, prop = TRUE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = invert2, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = text.size, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = title, class = "character", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = title.text.size, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = show.scale, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = return, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = plot, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - if( ! is.null(add)){ - tempo <- fun_check(data = add, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & ! grepl(pattern = "^\\+", add)){ # check that the add string start by + - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": add ARGUMENT MUST START WITH \"+\": ", paste(unique(add), collapse = " "), "\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - }else if(tempo$problem == FALSE & ! grepl(pattern = "ggplot2::", add)){ # - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": add ARGUMENT MUST CONTAIN \"ggplot2::\" IN FRONT OF EACH GGPLOT2 FUNCTION: ", paste(unique(add), collapse = " "), "\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - }else if(tempo$problem == FALSE & ! grepl(pattern = ")$", add)){ # check that the add string finished by ) - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": add ARGUMENT MUST FINISH BY \")\": ", paste(unique(add), collapse = " "), "\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - } - tempo <- fun_check(data = warn.print, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - if( ! is.null(path.lib)){ - tempo <- fun_check(data = path.lib, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & ! all(dir.exists(path.lib))){ - cat(paste0("\n\n============\n\nERROR IN ", function.name, ": \nDIRECTORY PATH INDICATED IN THE path.lib PARAMETER DOES NOT EXISTS: ", path.lib, "\n\n============\n\n")) - arg.check <- c(arg.check, TRUE) - } - } - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_check() - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() - # end argument checking - # package checking - fun_pack(req.package = c("reshape2", "ggplot2"), path.lib = path.lib) - # end package checking - # main code - if(all(is.matrix(data1))){ - data1 <- reshape2::melt(data1) # transform a matrix into a dataframe with 2 coordinates columns and the third intensity column - } - if(rotate == TRUE){ - data1[, 1] <- rev(data1[, 1]) - } - if(is.null(limit1)){ - if(any(data1[, 3] %in% c(Inf, -Inf))){ - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": THE data1 ARGUMENT CONTAINS -Inf OR Inf VALUES IN THE THIRD COLUMN, THAT WILL NOT BE CONSIDERED IN THE PLOT RANGE") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - limit1 <- range(data1[, 3], na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": THE limit1 ARGUMENT IS NULL -> RANGE OF data1 ARGUMENT HAS BEEN TAKEN: ", paste(fun_round(limit1), collapse = " ")) - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - if(suppressWarnings(any(limit1 %in% c(Inf, -Inf)))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, " COMPUTED LIMIT CONTAINS Inf VALUES, BECAUSE VALUES FROM data1 ARGUMENTS ARE NA OR Inf ONLY\n\n================\n\n") - stop(tempo.cat) - } - } - if(is.null(midpoint1)){ - midpoint1 <- mean(limit1, na.rm = TRUE) - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": THE midpoint1 ARGUMENT IS NULL -> MEAN OF limit1 ARGUMENT HAS BEEN TAKEN: ", paste(fun_round(midpoint1), collapse = " ")) - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - }else if(fun_round(midpoint1, 9) != fun_round(mean(limit1), 9)){ - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": THE midpoint1 ARGUMENT (", fun_round(mean(midpoint1), 9), ") DOES NOT CORRESPOND TO THE MEAN OF THE limit1 ARGUMENT (", fun_round(mean(limit1), 9), "). COLOR SCALE IS NOT LINEAR") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - if( ! is.null(data2)){ - if(all(is.matrix(data2))){ - data2 <- reshape2::melt(data2) # transform a matrix into a dataframe with 2 coordinates columns and the third intensity column - } - if(rotate == TRUE){ - data2[, 1] <- rev(data2[, 1]) - } - data2[, 3] <- factor(data2[, 3]) # to converte continuous scale into discrete scale - } - tempo.gg.name <- "gg.indiv.plot." - tempo.gg.count <- 0 # to facilitate debugging - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ggplot()) - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_raster(data = data1, mapping = ggplot2::aes_string(x = names(data1)[ifelse(rotate == FALSE, 2, 1)], y = names(data1)[ifelse(rotate == FALSE, 1, 2)], fill = names(data1)[3]), show.legend = show.scale)) # show.legend option do not remove the legend, only the aesthetic of the legend (dot, line, etc.) - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_fill_gradient2(low = low.color1, high = high.color1, mid = mid.color1, midpoint = midpoint1, limit = limit1, breaks = c(limit1[1], midpoint1, limit1[2]), labels = fun_round(c(limit1[1], midpoint1, limit1[2])), name = legend.name1)) - if( ! is.null(data2)){ - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_raster(data = data2, mapping = ggplot2::aes_string(x = names(data2)[ifelse(rotate == FALSE, 2, 1)], y = names(data2)[ifelse(rotate == FALSE, 1, 2)], alpha = names(data2)[3]), fill = color2, show.legend = FALSE)) - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "alpha", values = if(invert2 == FALSE){c(0, alpha2)}else{c(alpha2, 0)}, guide = FALSE)) - # assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_raster(data = data2, mapping = ggplot2::aes_string(x = names(data2)[ifelse(rotate == FALSE, 2, 1)], y = names(data2)[ifelse(rotate == FALSE, 1, 2)], group = names(data2)[3]), fill = data2[, 3], alpha = alpha2, show.legend = FALSE)) # BEWARE: this does not work if NA present, because geom_raster() has a tendency to complete empty spaces, and thus, behave differently than geom_tile(). See https://github.com/tidyverse/ggplot2/issues/3025 - } - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::coord_fixed()) # x = y - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_y_reverse()) - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ggtitle(title)) - add.check <- TRUE - if( ! is.null(add)){ # if add is NULL, then = 0 - if(grepl(pattern = "ggplot2::theme", add) == TRUE){ - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": \"ggplot2::theme\" STRING DETECTED IN THE add ARGUMENT -> INTERNAL GGPLOT2 THEME FUNCTIONS theme() AND theme_classic() HAVE BEEN INACTIVATED, TO BE USED BY THE USER") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - add.check <- FALSE - } - } - if(add.check == TRUE){ - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::theme_classic(base_size = text.size)) - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::theme( - text = ggplot2::element_text(size = text.size), - plot.title = ggplot2::element_text(size = title.text.size), # stronger than text - line = ggplot2::element_blank(), - axis.title = ggplot2::element_blank(), - axis.text = ggplot2::element_blank(), - axis.ticks = ggplot2::element_blank(), - panel.background = ggplot2::element_blank() - )) - } - if(plot == TRUE){ - # suppressWarnings( - print(eval(parse(text = paste(paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "), if(is.null(add)){NULL}else{add})))) - # ) - }else{ - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": PLOT NOT SHOWN AS REQUESTED") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - if(warn.print == TRUE & ! is.null(warning)){ - warning(warning) - } - if(return == TRUE){ - output <- ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + ")))) - output <- output$data - names(output)[1] <- "heatmap" - if( ! is.null(data2)){ - names(output)[2] <- "mask" - } - return(list(data = output, axes = output$layout$panel_params[[1]], scale = c(limit1[1], midpoint1, limit1[2]), warnings = warning)) - } +fun_empty_graph <- function(text = NULL, text.size = 1, title = NULL, title.size = 1.5){ +# AIM +# display an empty plot with a text in the middle of the window (for instance to specify that no plot can be drawn) +# ARGUMENTS +# text: character string of the message to display +# text.size: numeric value of the text size +# title: character string of the graph title +# title.size: numeric value of the title size (in points) +# REQUIRED PACKAGES +# none +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_check() +# RETURN +# an empty plot +# EXAMPLES +# simple example +# fun_empty_graph(text = "NO GRAPH") +# white page +# fun_empty_graph() # white page +# all the arguments +# fun_empty_graph(text = "NO GRAPH", text.size = 2, title = "GRAPH1", title.size = 1) +# DEBUGGING +# text = "NO GRAPH" ; title = "GRAPH1" ; text.size = 1 +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +if( ! is.null(text)){ +tempo <- fun_check(data = text, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +} +tempo <- fun_check(data = text.size, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(title)){ +tempo <- fun_check(data = title, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +} +tempo <- fun_check(data = title.size, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_check() +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() +# end argument checking +# main code +ini.par <- par(no.readonly = TRUE) # to recover the initial graphical parameters if required (reset). BEWARE: this command alone opens a pdf of GUI window if no window already opened. But here, protected with the code because always a tempo window opened +par(ann=FALSE, xaxt="n", yaxt="n", mar = rep(1, 4), bty = "n", xpd = NA) +plot(1, 1, type = "n") # no display with type = "n" +x.left.dev.region <- (par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] - ((par("usr")[2] - par("usr")[1]) / ((par("omd")[2] - par("omd")[1]) * (par("plt")[2] - par("plt")[1]))) * par("omd")[1]) +y.top.dev.region <- (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / ((par("omd")[4] - par("omd")[3]) * (par("plt")[4] - par("plt")[3]))) * (1 - par("omd")[4])) +if( ! is.null(text)){ +text(x = 1, y = 1, labels = text, cex = text.size) +} +if( ! is.null(title)){ +text(x = x.left.dev.region, y = y.top.dev.region, labels = title, adj=c(0, 1), cex = title.size) +} +par(ini.par) } -######## fun_gg_empty_graph() #### text to display for empty graphs +################ gg graphics +######## fun_gg_palette() #### ggplot2 default color palette + + # Check OK: clear to go Apollo -fun_gg_empty_graph <- function(text = NULL, text.size = 12, title = NULL, title.size = 8, path.lib = NULL){ - # AIM - # display an empty ggplot2 plot with a text in the middle of the window (for instance to specify that no plot can be drawn) - # ARGUMENTS - # text: character string of the message to display - # text.size: numeric value of the text size (in points) - # title: character string of the graph title - # title.size: numeric value of the title size (in points) - # path.lib: absolute path of the required packages, if not in the default folders - # REQUIRED PACKAGES - # ggplot2 - # REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION - # fun_check() - # fun_pack() - # RETURN - # an empty plot - # EXAMPLES - ### simple example - # fun_gg_empty_graph(text = "NO GRAPH") - ### white page - # fun_gg_empty_graph() - ### all the arguments - # fun_gg_empty_graph(text = "NO GRAPH", text.size = 8, title = "GRAPH1", title.size = 10, path.lib = NULL) - # DEBUGGING - # text = "NO GRAPH" ; text.size = 12 ; title = "GRAPH1" ; title.size = 8 ; path.lib = NULL - # function name - function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") - # end function name - # required function checking - if(length(find("fun_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - if(length(find("fun_pack", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_pack() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - if( ! is.null(text)){ - tempo <- fun_check(data = text, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) - } - tempo <- fun_check(data = text.size, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) - if( ! is.null(title)){ - tempo <- fun_check(data = title, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) - } - tempo <- fun_check(data = title.size, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_check() - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() - # end argument checking - # package checking - fun_pack(req.package = c("ggplot2"), path.lib = path.lib) - # end package checking - # main code - tempo.gg.name <- "gg.indiv.plot." - tempo.gg.count <- 0 - # no need loop part - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ggplot()) - if( ! is.null(text)){ - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_text(data = data.frame(x = 1, y = 1), ggplot2::aes(x = x, y = y, label = text), size = text.size)) - } - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ggtitle(title)) - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::theme_void()) - assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( - plot.title = ggplot2::element_text(size = title.size) # stronger than text - )) - suppressWarnings(print(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))) +fun_gg_palette <- function(n, kind = "std"){ +# AIM +# provide colors used by ggplot2 +# the interest is to use another single color that is not the red one used by default +# for ggplot2 specifications, see: https://ggplot2.tidyverse.org/articles/ggplot2-specs.html +# ARGUMENTS +# n: number of groups on the graph +# kind: either "std" for standard gg colors, "dark" for darkened gg colors, or "light" for pastel gg colors +# REQUIRED PACKAGES +# none +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_check() +# RETURN +# the vector of hexadecimal colors +# EXAMPLES +# output of the function +# fun_gg_palette(n = 2) +# the ggplot2 palette when asking for 7 different colors +# plot(1:7, pch = 16, cex = 5, col = fun_gg_palette(n = 7)) +# selection of the 5th color of the ggplot2 palette made of 7 different colors +# plot(1:7, pch = 16, cex = 5, col = fun_gg_palette(n = 7)[5]) +# the ggplot2 palette made of 7 darkened colors +# plot(1:7, pch = 16, cex = 5, col = fun_gg_palette(n = 7, kind = "dark")) +# the ggplot2 palette made of 7 lighten colors +# plot(1:7, pch = 16, cex = 5, col = fun_gg_palette(n = 7, kind = "light")) +# DEBUGGING +# n = 0 +# kind = "std" +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_check(data = n, class = "integer", length = 1, double.as.integer.allowed = TRUE, neg.values = FALSE, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & n == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": n ARGUMENT MUST BE A NON ZERO INTEGER. HERE IT IS: ", paste(n, collapse = " "), "\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +tempo <- fun_check(data = kind, options = c("std", "dark", "light"), length = 1, fun.name = function.name) ; eval(ee) +} +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_check() +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() +# end argument checking +# main code +hues = seq(15, 375, length = n + 1) +hcl(h = hues, l = if(kind == "std"){65}else if(kind == "dark"){35}else if(kind == "light"){85}, c = 100)[1:n] } -################ Graphic extraction +######## fun_gg_just() #### ggplot2 justification of the axis labeling, depending on angle -######## fun_trim() #### display values from a quantitative variable and trim according to defined cut-offs + # Check OK: clear to go Apollo -fun_trim <- function(data, displayed.nb = NULL, single.value.display = FALSE, trim.method = "", trim.cutoffs = c(0.05, 0.975), interval.scale.disp = TRUE, down.space = 0.75, left.space = 0.75, up.space = 0.3, right.space = 0.25, orient = 1, dist.legend = 0.37, box.type = "l", amplif.label = 1.25, amplif.axis = 1.25, std.x.range = TRUE, std.y.range = TRUE, cex.pt = 0.2, col.box = hsv(0.55, 0.8, 0.8), x.nb.inter.tick = 4, y.nb.inter.tick = 0, tick.length = 1, sec.tick.length = 0.75, corner.text = "", amplif.legend = 1, magnific.corner.text = 0.75, trim.return = FALSE){ - # AIM - # trim and display values from a numeric vector or matrix - # plot 4 graphs: stripchart of values, stripchart of rank of values, hitogramme and normal QQPlot - # different kinds of intervals are displayed on the top of graphes to facilitate the analysis of the variable and a trimming setting - # the trimming interval chosen is displayed on top of graphs - # both trimmed and not trimmed values are returned in a list - # REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION - # fun_check() - # ARGUMENTS - # data: values to plot (either a numeric vector or a numeric matrix) - # displayed.nb: number of values displayed. If NULL, all the values are displayed. Otherwise, if the number of values is over displayed.nb, then displayed.nb values are displayed after random selection - # single.value.display: provide the 4 graphs if data is made of a single (potentially repeated value)? If FALSE, an empty graph is displayed if data is made of a single (potentially repeated value). And the return list is made of NULL compartments - # trim.method: Write "" if not required. write "mean.sd" if mean +/- sd has to be displayed as a trimming interval (only recommanded for normal distribution). Write "quantile" to display a trimming interval based on quantile cut-offs. No other possibility allowed. See trim.cutoffs below - # trim.cutoffs: 2 values cutoff for the trimming interval displayed, each value between 0 and 1. Not used if trim.method == "".The couple of values c(lower, upper) represents the lower and upper boundaries of the trimming interval (in proportion), which represent the interval of distribution kept (between 0 and 1). Example: trim.cutoffs = c(0.05, 0.975). What is strictly kept for the display is ]lower , upper[, boundaries excluded. Using the "mean.sd" method, 0.025 and 0.975 represent 95% CI which is mean +/- 1.96 * sd - # interval.scale.disp: display sd and quantiles intervals on top of graphs ? - # down.space: lower vertical margin (in inches, mai argument of par()) - # left.space: left horizontal margin (in inches, mai argument of par()) - # up.space: upper vertical margin between plot region and grapical window (in inches, mai argument of par()) - # right.space: right horizontal margin (in inches, mai argument of par()) - # orient: scale number orientation (las argument of par()). 0, always parallel to the axis; 1, always horizontal; 2, always perpendicular to the axis; 3, always vertical - # dist.legend: numeric value that moves axis legends away in inches (first number of mgp argument of par() but in inches thus / 0.2) - # box.type: bty argument of par(). Either "o", "l", "7", "c", "u", "]", the resulting box resembles the corresponding upper case letter. A value of "n" suppresses the box - # amplif.label: increase or decrease the size of the text in legends - # amplif.axis: increase or decrease the size of the scale numbers in axis - # std.x.range: standard range on the x-axis? TRUE (no range extend) or FALSE (4% range extend). Controls xaxs argument of par() (TRUE is xaxs = "i", FALSE is xaxs = "r") - # std.y.range: standard range on the y-axis? TRUE (no range extend) or FALSE (4% range extend). Controls yaxs argument of par() (TRUE is yaxs = "i", FALSE is yaxs = "r") - # cex.pt: size of points in stripcharts (in inches, thus cex.pt will be thereafter / 0.2) - # col.box: color of boxplot - # x.nb.inter.tick: number of secondary ticks between main ticks on x-axis (only if not log scale). Zero means non secondary ticks - # y.nb.inter.tick: number of secondary ticks between main ticks on y-axis (only if not log scale). Zero means non secondary ticks - # tick.length: length of the ticks (1 means complete the distance between the plot region and the axis numbers, 0.5 means half the length, etc. 0 means no tick - # sec.tick.length: length of the secondary ticks (1 means complete the distance between the plot region and the axis numbers, 0.5 means half the length, etc., 0 for no ticks) - # corner.text: text to add at the top right corner of the window - # amplif.legend: increase or decrease the size of the text of legend - # magnific.corner.text: increase or decrease the size of the text - # trim.return: return the trimmed and non trimmed values? NULL returned for trimmed and non trimmed values if trim.method == "" - # RETURN - # a list containing: - # $trim.method: correspond to trim.method above - # $trim.cutoffs: correspond to trim.cutoffs above - # $real.trim.cutoffs: the two boundary values (in the unit of the numeric vector or numeric matrix analyzed). NULL - # $trimmed.values: the values outside of the trimming interval as defined in trim.cutoffs above - # $kept.values: the values inside the trimming interval as defined in trim.cutoffs above - # EXAMPLES - # fun_trim(data = c(1:100, 1:10), displayed.nb = NULL, single.value.display = FALSE, trim.method = "mean.sd", trim.cutoffs = c(0.05, 0.975), interval.scale.disp = TRUE, down.space = 0.75, left.space = 0.75, up.space = 0.3, right.space = 0.25, orient = 1, dist.legend = 0.37, box.type = "l", amplif.label = 1.25, amplif.axis = 1.25, std.x.range = TRUE, std.y.range = TRUE, cex.pt = 0.2, col.box = hsv(0.55, 0.8, 0.8), x.nb.inter.tick = 4, y.nb.inter.tick = 0, tick.length = 0.5, sec.tick.length = 0.3, corner.text = "", amplif.legend = 1, magnific.corner.text = 0.75, trim.return = TRUE) - # DEBUGGING - # data = c(1:100, 1:10) ; displayed.nb = NULL ; single.value.display = FALSE ; trim.method = "quantile" ; trim.cutoffs = c(0.05, 0.975) ; interval.scale.disp = TRUE ; down.space = 1 ; left.space = 1 ; up.space = 0.5 ; right.space = 0.25 ; orient = 1 ; dist.legend = 0.5 ; box.type = "l" ; amplif.label = 1 ; amplif.axis = 1 ; std.x.range = TRUE ; std.y.range = TRUE ; cex.pt = 0.1 ; col.box = hsv(0.55, 0.8, 0.8) ; x.nb.inter.tick = 4 ; y.nb.inter.tick = 0 ; tick.length = 0.5 ; sec.tick.length = 0.3 ; corner.text = "" ; amplif.legend = 1 ; magnific.corner.text = 0.75 ; trim.return = TRUE # for function debugging - # function name - function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") - # end function name - # required function checking - if(length(find("fun_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - # argument checking without fun_check() - if( ! (all(class(data) == "numeric") | all(class(data) == "integer") | (all(class(data) == "matrix") & mode(data) == "numeric"))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": data ARGUMENT MUST BE A NUMERIC VECTOR OR NUMERIC MATRIX\n\n================\n\n") - stop(tempo.cat) - } - # end argument checking without fun_check() - # argument checking with fun_check() - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - if( ! is.null(displayed.nb)){ - tempo <- fun_check(data = displayed.nb, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) - if(displayed.nb < 2){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": displayed.nb ARGUMENT MUST BE A SINGLE INTEGER VALUE GREATER THAN 1 AND NOT: ", paste(displayed.nb, collapse = " "), "\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - } - tempo <- fun_check(data = single.value.display, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = trim.method, options = c("", "mean.sd", "quantile"), length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = trim.cutoffs, class = "vector", mode = "numeric", length = 2, prop = TRUE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = interval.scale.disp, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = down.space, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = left.space, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = up.space, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = right.space, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = orient, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = dist.legend, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = box.type, options = c("o", "l", "7", "c", "u", "]", "n"), length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = amplif.label, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = amplif.axis, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = std.x.range, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = std.y.range, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = cex.pt, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = col.box, class = "character", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = x.nb.inter.tick, class = "integer", length = 1, neg.values = FALSE, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = y.nb.inter.tick, class = "integer", length = 1, neg.values = FALSE, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = tick.length, class = "vector", mode = "numeric", length = 1, prop = TRUE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = sec.tick.length, class = "vector", mode = "numeric", length = 1, prop = TRUE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = corner.text, class = "character", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = amplif.legend, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = magnific.corner.text, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = trim.return, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_check() - } - # end argument checking with fun_check() - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() - # end argument checking - # main code - if(class(data) == "matrix"){ - data <- as.vector(data) - } - color.cut <- hsv(0.75, 1, 1) # color of interval selected - col.mean <- hsv(0.25, 1, 0.8) # color of interval using mean+/-sd - col.quantile <- "orange" # color of interval using quantiles - quantiles.selection <- c(0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 0.75, 0.9, 0.95, 0.975, 0.99) # quantiles used in axis to help for choosing trimming cutoffs - if(single.value.display == FALSE & length(unique(data)) == 1){ - par(bty = "n", xaxt = "n", yaxt = "n", xpd = TRUE) - plot(1, pch = 16, col = "white", xlab = "", ylab = "") - text(x = 1, y = 1, paste0("No graphic displayed\nBecause data made of a single different value (", formatC(as.double(table(data))), ")"), cex = 2) - output <- list(trim.method = NULL, trim.cutoffs = NULL, real.trim.cutoffs = NULL, trimmed.values = NULL, kept.values = NULL) - }else{ - output <- list(trim.method = trim.method, trim.cutoffs = trim.cutoffs, real.trim.cutoffs = NULL, trimmed.values = NULL, kept.values = NULL) - fun.rug <- function(sec.tick.length.f = sec.tick.length, x.nb.inter.tick.f = x.nb.inter.tick, y.nb.inter.tick.f = y.nb.inter.tick){ - if(x.nb.inter.tick.f > 0){ - inter.tick.unit <- (par("xaxp")[2] - par("xaxp")[1]) / par("xaxp")[3] - par.ini <- par()[c("xpd", "tcl")] - par(xpd = FALSE) - par(tcl = -par()$mgp[2] * sec.tick.length.f) # tcl gives the length of the ticks as proportion of line text, knowing that mgp is in text lines. So the main ticks are a 0.5 of the distance of the axis numbers by default. The sign provides the side of the tick (negative for outside of the plot region) - suppressWarnings(rug(seq(par("xaxp")[1] - 10 * inter.tick.unit, par("xaxp")[2] + 10 * inter.tick.unit, by = inter.tick.unit / (1 + x.nb.inter.tick.f)), ticksize = NA, side = 1)) # ticksize = NA to allow the use of par()$tcl value - par(par.ini) - rm(par.ini) - } - if(y.nb.inter.tick.f > 0){ - inter.tick.unit <- (par("yaxp")[2] - par("yaxp")[1]) / par("yaxp")[3] - par.ini <- par()[c("xpd", "tcl")] - par(xpd = FALSE) - par(tcl = -par()$mgp[2] * sec.tick.length.f) # tcl gives the length of the ticks as proportion of line text, knowing that mgp is in text lines. So the main ticks are a 0.5 of the distance of the axis numbers by default. The sign provides the side of the tick (negative for outside of the plot region) - suppressWarnings(rug(seq(par("yaxp")[1] - 10 * inter.tick.unit, par("yaxp")[2] + 10 * inter.tick.unit, by = inter.tick.unit / (1 + y.nb.inter.tick.f)), ticksize = NA, side = 2)) # ticksize = NA to allow the use of par()$tcl value - par(par.ini) - rm(par.ini) - } - } - fun.add.cut <- function(data.f, trim.method.f = trim.method, trim.cutoffs.f = trim.cutoffs, color.cut.f = color.cut, return.f = FALSE){ - # DEBUGGING - # data.f = data ; trim.method.f = "mean.sd"; trim.cutoffs.f = trim.cutoffs ; color.cut.f = color.cut ; return.f = TRUE - real.trim.cutoffs.f <- NULL - if(trim.method.f != ""){ - data.f <- sort(data.f) - par.ini <- par()$xpd - par(xpd = FALSE) - if(trim.method.f == "mean.sd"){ - real.trim.cutoffs.f <- qnorm(trim.cutoffs.f, mean(data.f, na.rm = TRUE), sd(data.f, na.rm = TRUE)) - abline(v = qnorm(trim.cutoffs.f, mean(data.f, na.rm = TRUE), sd(data.f, na.rm = TRUE)), col = color.cut.f) - segments(qnorm(trim.cutoffs.f[1], mean(data.f, na.rm = TRUE), sd(data.f, na.rm = TRUE)), par()$usr[4] * 0.75, qnorm(trim.cutoffs.f[2], mean(data.f, na.rm = TRUE), sd(data.f, na.rm = TRUE)), par()$usr[4] * 0.75, col = color.cut.f) - } - if(trim.method.f == "quantile"){ - real.trim.cutoffs.f <- quantile(data.f, probs = trim.cutoffs.f, type = 7) - abline(v = quantile(data.f, probs = trim.cutoffs.f, type = 7), col = color.cut.f) - segments(quantile(data.f, probs = trim.cutoffs.f[1], type = 7), par()$usr[4] * 0.75, quantile(data.f, probs = trim.cutoffs.f[2], type = 7), par()$usr[4] * 0.75, col = color.cut.f) - } - par(par.ini) - if(return.f == TRUE){ - trimmed.values.f <- data.f[data.f <= real.trim.cutoffs.f[1] | data.f >= real.trim.cutoffs.f[2]] - kept.values.f <- data.f[data.f > real.trim.cutoffs.f[1] & data.f < real.trim.cutoffs.f[2]] - } - }else{ - real.trim.cutoffs.f <- NULL - trimmed.values.f <- NULL - kept.values.f <- NULL - } - if(return.f == TRUE){ - output <- list(trim.method = trim.method.f, trim.cutoffs = trim.cutoffs.f, real.trim.cutoffs = real.trim.cutoffs.f, trimmed.values = trimmed.values.f, kept.values = kept.values.f) - return(output) - } - } - fun.interval.scale.display <- function(data.f, col.quantile.f = col.quantile, quantiles.selection.f = quantiles.selection, col.mean.f = col.mean){ # intervals on top of graphs - par.ini <- par()[c("mgp", "xpd")] - par(mgp = c(0.25, 0.25, 0), xpd = NA) - axis(side = 3, at = c(par()$usr[1], par()$usr[2]), labels = rep("", 2), col = col.quantile.f, lwd.ticks = 0) - par(xpd = FALSE) - axis(side = 3, at = quantile(as.vector(data.f), probs = quantiles.selection.f, type = 7), labels = quantiles.selection.f, col.axis = col.quantile.f, col = col.quantile.f) - par(mgp = c(1.75, 1.75, 1.5), xpd = NA) - axis(side = 3, at = c(par()$usr[1], par()$usr[2]), labels = rep("", 2), col = col.mean.f, lwd.ticks = 0) - par(xpd = FALSE) - axis(side = 3, at = m + s * qnorm(quantiles.selection.f), labels = formatC(round(qnorm(quantiles.selection.f), 2)), col.axis = col.mean.f, col = col.mean.f, lwd.ticks = 1) - par(par.ini) - } - zone<-matrix(1:4, ncol=2) - layout(zone) - par(omi = c(0, 0, 1.5, 0), mai = c(down.space, left.space, up.space, right.space), las = orient, mgp = c(dist.legend / 0.2, 0.5, 0), xpd = FALSE, bty= box.type, cex.lab = amplif.label, cex.axis = amplif.axis, xaxs = ifelse(std.x.range, "i", "r"), yaxs = ifelse(std.y.range, "i", "r")) - par(tcl = -par()$mgp[2] * tick.length) # tcl gives the length of the ticks as proportion of line text, knowing that mgp is in text lines. So the main ticks are a 0.5 of the distance of the axis numbers by default. The sign provides the side of the tick (negative for outside of the plot region) - if(is.null(displayed.nb)){ - sampled.data <- as.vector(data) - if(corner.text == ""){ - corner.text <- paste0("ALL VALUES OF THE DATASET DISPLAYED") - }else{ - corner.text <- paste0(corner.text, "\nALL VALUES OF THE DATASET DISPLAYED") - } - }else{ - if(length(as.vector(data)) > displayed.nb){ - sampled.data <- sample(as.vector(data), displayed.nb, replace = FALSE) - if(corner.text == ""){ - corner.text <- paste0("BEWARE: ONLY ", displayed.nb, " VALUES ARE DISPLAYED AMONG THE ", length(as.vector(data)), " VALUES OF THE DATASET ANALYZED") - }else{ - corner.text <- paste0(corner.text, "\nBEWARE: ONLY ", displayed.nb, " VALUES ARE DISPLAYED AMONG THE ", length(as.vector(data)), " VALUES OF THE DATASET ANALYZED") - } - }else{ - sampled.data <- as.vector(data) - if(corner.text == ""){ - corner.text <- paste0("BEWARE: THE DISPLAYED NUMBER OF VALUES PARAMETER ", deparse(substitute(displayed.nb)), " HAS BEEN SET TO ", displayed.nb, " WHICH IS ABOVE THE NUMBER OF VALUES OF THE DATASET ANALYZED -> ALL VALUES DISPLAYED") - }else{ - corner.text <- paste0(corner.text, "\nBEWARE: THE DISPLAYED NUMBER OF VALUES PARAMETER ", deparse(substitute(displayed.nb)), " HAS BEEN SET TO ", displayed.nb, " WHICH IS ABOVE THE NUMBER OF VALUES OF THE DATASET ANALYZED -> ALL VALUES DISPLAYED") - } - } - } - stripchart(sampled.data, method="jitter", jitter=0.4, vertical=FALSE, ylim=c(0.5, 1.5), group.names = "", xlab = "Value", ylab="", pch=1, cex = cex.pt / 0.2) - fun.rug(y.nb.inter.tick.f = 0) - boxplot(as.vector(data), horizontal=TRUE, add=TRUE, boxwex = 0.4, staplecol = col.box, whiskcol = col.box, medcol = col.box, boxcol = col.box, range = 0, whisklty = 1) - m <- mean(as.vector(data), na.rm = TRUE) - s <- sd(as.vector(data), na.rm = TRUE) - segments(m, 0.8, m, 1, lwd=2, col="red") # mean - segments(m -1.96 * s, 0.9, m + 1.96 * s, 0.9, lwd=1, col="red") # mean - graph.xlim <- par()$usr[1:2] # for hist() and qqnorm() below - if(interval.scale.disp == TRUE){ - fun.interval.scale.display(data.f = data) - if(corner.text == ""){ - corner.text <- paste0("MULTIPLYING FACTOR DISPLAYED (MEAN +/- SD) ON SCALES: ", paste(formatC(round(qnorm(quantiles.selection), 2))[-(1:(length(quantiles.selection) - 1) / 2)], collapse = ", "), "\nQUANTILES DISPLAYED ON SCALES: ", paste(quantiles.selection, collapse = ", ")) - }else{ - corner.text <- paste0(corner.text, "\nMULTIPLYING FACTOR DISPLAYED (MEAN +/- SD) ON SCALES: ", paste(formatC(round(qnorm(quantiles.selection), 2))[-(1:(length(quantiles.selection) - 1) / 2)], collapse = ", "), "\nQUANTILES DISPLAYED ON SCALES: ", paste(quantiles.selection, collapse = ", ")) - } - } - output.tempo <- fun.add.cut(data.f = data, return.f = TRUE) # to recover real.trim.cutoffs - if(trim.return == TRUE){ - output <- output.tempo - } - par(xpd = NA) - if(trim.method != ""){ - if(corner.text == ""){ - corner.text <- paste0("SELECTED CUT-OFFS (PROPORTION): ", paste(trim.cutoffs, collapse = ", "), "\nSELECTED CUT-OFFS: ", paste(output.tempo$real.trim.cutoffs, collapse = ", ")) - }else{ - corner.text <- paste0(corner.text, "\nSELECTED CUT-OFFS (PROPORTION): ", paste(trim.cutoffs, collapse = ", "), "\nSELECTED CUT-OFFS: ", paste(output.tempo$real.trim.cutoffs, collapse = ", ")) - } - if(interval.scale.disp == TRUE){ - legend(x = (par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] - ((par("usr")[2] - par("usr")[1]) / (par("omd")[2] - par("omd")[1])) * par("omd")[1]), y = (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / (par("omd")[4] - par("omd")[3])) * (1 - par("omd")[4]) / 2), legend = c(c("min, Q1, Median, Q3, max"), "mean +/- 1.96sd", paste0("Trimming interval: ", paste0(trim.cutoffs, collapse = " , ")), "Mean +/- sd multiplying factor", "Quantile"), yjust = 0, lty=1, col=c(col.box, "red", color.cut, col.mean, col.quantile), bty="n", cex = amplif.legend) - }else{ - legend(x = (par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] - ((par("usr")[2] - par("usr")[1]) / (par("omd")[2] - par("omd")[1])) * par("omd")[1]), y = (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / (par("omd")[4] - par("omd")[3])) * (1 - par("omd")[4]) / 2), legend = c(c("min, Q1, Median, Q3, max"), "mean +/- 1.96sd", paste0("Trimming interval: ", paste0(trim.cutoffs, collapse = " , "))), yjust = 0, lty=1, col=c(col.box, "red", color.cut), bty="n", cex = amplif.legend, y.intersp=1.25) - } - }else{ - if(interval.scale.disp == TRUE){ - legend(x = (par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] - ((par("usr")[2] - par("usr")[1]) / (par("omd")[2] - par("omd")[1])) * par("omd")[1]), y = (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / (par("omd")[4] - par("omd")[3])) * (1 - par("omd")[4]) / 2), legend = c(c("min, Q1, Median, Q3, max"), "mean +/- sd", "Mean +/- sd multiplying factor", "Quantile"), yjust = 0, lty=1, col=c(col.box, "red", col.mean, col.quantile), bty="n", cex = amplif.legend) - }else{ - legend(x = (par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] - ((par("usr")[2] - par("usr")[1]) / (par("omd")[2] - par("omd")[1])) * par("omd")[1]), y = (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / (par("omd")[4] - par("omd")[3])) * (1 - par("omd")[4]) / 2), legend = c(c("min, Q1, Median, Q3, max"), "mean +/- sd"), yjust = 0, lty=1, col=c(col.box, "red"), bty="n", cex = amplif.legend, y.intersp=1.25) - } - } - par(xpd = FALSE, xaxs = ifelse(std.x.range, "i", "r"), yaxs = ifelse(std.y.range, "i", "r")) - hist(as.vector(data), main = "", breaks = seq(min(as.vector(data), na.rm = TRUE), max(as.vector(data), na.rm = TRUE), length.out = length(as.vector(data)) / 10), xlim = graph.xlim, xlab = "Value", ylab="Density", col = grey(0.25)) - abline(h = par()$usr[3]) - fun.rug() - if(interval.scale.disp == TRUE){ - fun.interval.scale.display(data.f = data) - } - fun.add.cut(data.f = data) - par(xaxs = ifelse(std.x.range, "i", "r")) - stripchart(rank(sampled.data), method="stack", vertical=FALSE, ylim=c(0.99, 1.3), group.names = "", xlab = "Rank of values", ylab="", pch=1, cex = cex.pt / 0.2) - fun.rug(y.nb.inter.tick.f = 0) - x.text <- par("usr")[2] + (par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1]) * (1 - par("plt")[2]) / 2 - y.text <- (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / ((par()$omd[4] / 2) * ((par("plt")[4] - par("plt")[3])))) * (1 - par("omd")[4])) # BEWARE. Here in "(par()$omd[4] / 2", division by two because there are 2 graphs staked on the y axis, and not one - par(xpd=NA) - text(x = x.text, y = y.text, paste0(corner.text), adj=c(1, 1.1), cex = magnific.corner.text) # text at the topright corner - par(xpd=FALSE) - par(xaxs = ifelse(std.x.range, "i", "r"), yaxs = ifelse(std.y.range, "i", "r")) - qqnorm(as.vector(sampled.data), main = "", datax = TRUE, ylab = "Value", pch = 1, col = "red", cex = cex.pt / 0.2) - fun.rug() - if(diff(quantile(as.vector(data), probs = c(0.25, 0.75), na.rm = TRUE)) != 0){ # otherwise, error generated - qqline(as.vector(data), datax = TRUE) - } - if(interval.scale.disp == TRUE){ - fun.interval.scale.display(data.f = data) - } - fun.add.cut(data.f = data) - } - if(trim.return == TRUE){ - return(output) - } +fun_gg_just <- function(angle, axis){ +# AIM +# provide correct justification for axis labeling, depending on the chosen angle +# ARGUMENTS +# angle: integer value of the text angle for the axis labels. Positive values for counterclockwise rotation: 0 for horizontal, 90 for vertical, 180 for upside down etc. Negative values for clockwise rotation: 0 for horizontal, -90 for vertical, -180 for upside down etc. +# axis: which axis for? Either "x" or "y" +# REQUIRED PACKAGES +# none +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_check() +# RETURN +# a list containing: +# $angle: the submitted angle (value potentially reduced to fit the [-360 ; 360] interval, e.g., 460 -> 100, without impact on the final angle displayed) +# $hjust: the horizontal justification +# $vjust: the vertical justification +# EXAMPLES +# fun_gg_just(angle = 45, axis = "x") +# fun_gg_just(angle = (360*2 + 45), axis = "y") +# output <- fun_gg_just(angle = 45, axis = "x") ; obs1 <- data.frame(time = 1:20, group = rep(c("CLASS_1", "CLASS_2"), times = 10)) ; ggplot2::ggplot() + ggplot2::geom_bar(data = obs1, mapping = ggplot2::aes(x = group, y = time), stat = "identity") + ggplot2::theme(axis.text.x = ggplot2::element_text(angle = output$angle, hjust = output$hjust, vjust = output$vjust)) +# output <- fun_gg_just(angle = -45, axis = "y") ; obs1 <- data.frame(time = 1:20, group = rep(c("CLASS_1", "CLASS_2"), times = 10)) ; ggplot2::ggplot() + ggplot2::geom_bar(data = obs1, mapping = ggplot2::aes(x = group, y = time), stat = "identity") + ggplot2::theme(axis.text.y = ggplot2::element_text(angle = output$angle, hjust = output$hjust, vjust = output$vjust)) + ggplot2::coord_flip() +# output1 <- fun_gg_just(angle = 90, axis = "x") ; output2 <- fun_gg_just(angle = -45, axis = "y") ; obs1 <- data.frame(time = 1:20, group = rep(c("CLASS_1", "CLASS_2"), times = 10)) ; ggplot2::ggplot() + ggplot2::geom_bar(data = obs1, mapping = ggplot2::aes(x = group, y = time), stat = "identity") + ggplot2::theme(axis.text.x = ggplot2::element_text(angle = output1$angle, hjust = output1$hjust, vjust = output1$vjust), axis.text.y = ggplot2::element_text(angle = output2$angle, hjust = output2$hjust, vjust = output2$vjust)) +# DEBUGGING +# angle = 45 ; axis = "y" +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) } - - -######## fun_segmentation() #### segment a dot cloud on a scatterplot and define the dots from another cloud outside the segmentation - - -# Check OK: clear to go Apollo -fun_segmentation <- function(data1, x1, y1, x.range.split = NULL, x.step.factor = 10, y.range.split = NULL, y.step.factor = 10, error = 0, data2 = NULL, x2, y2, data2.pb.dot = "unknown", xy.cross.kind = "&", plot = FALSE, graph.in.file = FALSE, raster = TRUE, warn.print = FALSE, path.lib = NULL){ - # AIM - # if data1 is a data frame corresponding to the data set of a scatterplot (with a x column for x-axis values and a y column for the y-axis column), then fun_segmentation() delimits a frame around the dots cloud using a sliding window set by x.range.split and x.step.factor to frame the top and bottom part of the cloud, and set by y.range.split and y.step.factor to frame the left and right part of the cloud - # if a second data frame is provided, corresponding to the data set of a scatterplot (with a x column for x-axis values and a y column for the y-axis column), then fun_segmentation() defines the dots of this data frame, outside of the frame of the first data frame - # WARNINGS - # if dots from data2 look significant on the graph (outside the frame) but are not (not black on the last figure), this is probably because the frame is flat on the zero coordinate (no volume inside the frame at this position). Thus, no way to conclude that data2 dots here are significant. These dots are refered to as "unknown". The pb.dot argument deals with such dots - # dots that are sometimes inside and outside the frame, depending on the sliding windows, are treated differently: they are removed. Such dots are neither classified as "signif", "non signif" or "unknown", but as "inconsistent" - # unknown dots are treated as finally significant, not significant, or unknown (data2.pb.dot argument) for each x-axis and y-axis separately. Then, the union or intersection of significant dots is performed (argument xy.cross.kind). See the example section - # ARGUMENTS - # data1: a dataframe containing a column of x-axis values and a column of y-axis values - # x1: character string of the data1 column name for x-axis (first column of data1 by default) - # y1: character string of the data1 column name for y-axis (second column of data1 by default) - # x.range.split: positive non null numeric value giving the number of interval on the x value range. if x.range is the range of the dots on the x-axis, then abs(diff(x.range) / x.range.split) gives the window size. Window size decreases when range.split increases. In unit of x-axis. Write NULL if not required. At least one of the x.range.split and y.range.split must be non NULL - # x.step.factor: positive non null numeric value giving the shift step of the window. If x.step.factor = 1, no overlap during the sliding (when the window slides from position n to position n+1, no overlap between the two positions). If x.step.factor = 2, 50% of overlap (when the window slides from position n to position n+1, the window on position n+1 overlap 50% of the window when it was on position n) - # y.range.split: same as x.range.split for the y-axis. At least one of the x.range.split and y.range.split must be non NULL - # y.step.factor: same as x.step.factor for the y-axis - # error: proportion (from 0 to 1) of false positives (i.e., proportion of dots from data1 outside of the frame). 0.05 means 5% of the dots from data1 outside of the frame - # data2: a dataframe containing a column of x-axis values and a column of y-axis values, for which outside dots of the data1 cloud has to be determined. Write NULL if not required - # x2: character string of the data1 column name for x-axis (first column of data1 by default) - # y2: character string of the data1 column name for y-axis (second column of data1 by default) - # data2.pb.dot: unknown dots are explain in the warning section above. If "signif", then the unknown dots are finally considered as significant (outside the frame). If "not.signif", then the unknown dots are finally considered as non significant (inside the frame). If "unknown", no conclusion are drawn from these dots. See the examples below - # xy.cross.kind: if data2 is non null and if both x.range.split and y.range.split are non null, which dots are finally significants? Write "&" for intersection of outside dots on x and on y. Write "|" for union of outside dots on x and on y. See the examples below - # plot: logical. Print graphs that check the frame? - # graph.in.file: logical. Graphs sent into a graphic device already opened? If FALSE, GUI are opened for each graph. If TRUE, no GUI are opended. The graphs are displayed on the current active graphic device. Ignored if plot is FALSE - # raster: logical. Dots in raster mode? If FALSE, dots from each geom_point from geom argument are in vectorial mode (bigger pdf and long to display if millions of dots). If TRUE, dots from each geom_point from geom argument are in matricial mode (smaller pdf and easy display if millions of dots, but long to generate the layer). If TRUE, the region plot will be square to avoid a bug in fun_gg_point_rast(). If TRUE, solve the transparency problem with some GUI. Not considered if plot is FALSE - # warn.print: logical. Print warnings at the end of the execution? No print if no warning messages - # path.lib: absolute path of the required packages, if not in the default folders. Ignored if plot is FALSE - # REQUIRED PACKAGES - # ggplot2 if plot is TRUE - # REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION - # fun_check() - # if plot is TRUE: - # fun_pack() - # fun_open() - # fun_gg_palette() - # fun_gg_scatter() - # fun_gg_empty_graph() - # fun_close() - # RETURN - # several graphs if plot is TRUE - # a list containing: - # $data1.removed.row.nb: which rows have been removed due to NA; NaN, -Inf or Inf detection in x1 or y1 columns (NULL if no row removed) - # $data1.removed.rows: removed rows (NULL if no row removed) - # $data2.removed.row.nb: which rows have been removed due to NA; NaN, -Inf or Inf detection in x2 or y2 columns (NULL if no row removed) - # $data2.removed.rows: removed rows (NULL if no row removed) - # $hframe: x and y coordinates of the bottom and top frames for frame plotting (frame1 for the left step and frame2 for the right step) - # $vframe: x and y coordinates of the left and right frames for frame plotting (frame1 for the down step and frame2 for the top step) - # $data1.signif.dot: the significant dots of data1 (i.e., dots outside the frame). A good segmentation should not have any data1.signif.dot - # $data1.non.signif.dot: the non significant dots of data1 (i.e., dots inside the frame) - # $data1.inconsistent.dot: see the warning section above - # $data2.signif.dot: the significant dots of data2 if non NULL (i.e., dots outside the frame) - # $data2.non.signif.dot: the non significant dots of data2 (i.e., dots inside the frame) - # $data2.unknown.dot: the problematic dots of data2 (i.e., data2 dots outside of the range of data1, or data2 dots in a sliding window without data1 dots). Is systematically NULL except if argument data2.pb.dot = "unknown" and some data2 dots are in such situation. Modifying the segmentation x.range.split, x.step.factor, y.range.split, y.step.factor arguments can solve this problem - # $data2.inconsistent.dot: see the warning section above - # $axes: the x-axis and y-axis info - # $warnings: the warning messages. Use cat() for proper display. NULL if no warning - # EXAMPLES - # example explaining the unknown and inconsistent dots, and the cross - - # set.seed(1) ; data1 = data.frame(x = rnorm(500), y = rnorm(500)) ; data1[5:7, 2] <- NA ; data2 = data.frame(x = rnorm(500, 0, 2), y = rnorm(500, 0, 2)) ; data2[11:13, 1] <- Inf ; set.seed(NULL) ; fun_segmentation(data1 = data1, x1 = names(data1)[1], y1 = names(data1)[2], x.range.split = 20, x.step.factor = 10, y.range.split = 23, y.step.factor = 10, error = 0, data2 = data2, x2 = names(data2)[1], y2 = names(data2)[2], data2.pb.dot = "not.signif", xy.cross.kind = "|", plot = TRUE, graph.in.file = FALSE, raster = FALSE, path.lib = NULL) - # set.seed(1) ; data1 = data.frame(x = rnorm(500), y = rnorm(500)) ; data2 = data.frame(x = rnorm(500, 0, 2), y = rnorm(500, 0, 2)) ; set.seed(NULL) ; fun_segmentation(data1 = data1, x1 = names(data1)[1], y1 = names(data1)[2], x.range.split = NULL, x.step.factor = 10, y.range.split = 23, y.step.factor = 10, error = 0, data2 = data2, x2 = names(data2)[1], y2 = names(data2)[2], data2.pb.dot = "unknown", xy.cross.kind = "|", plot = TRUE, graph.in.file = FALSE, raster = FALSE, path.lib = NULL) - # set.seed(1) ; data1 = data.frame(x = rnorm(500), y = rnorm(500)) ; data2 = data.frame(x = rnorm(500, 0, 2), y = rnorm(500, 0, 2)) ; set.seed(NULL) ; fun_segmentation(data1 = data1, x1 = names(data1)[1], y1 = names(data1)[2], x.range.split = 20, x.step.factor = 10, y.range.split = NULL, y.step.factor = 10, error = 0, data2 = data2, x2 = names(data2)[1], y2 = names(data2)[2], data2.pb.dot = "unknown", xy.cross.kind = "&", plot = TRUE, graph.in.file = FALSE, raster = FALSE, path.lib = NULL) - # DEBUGGING - # set.seed(1) ; data1 = data.frame(x = rnorm(50), y = rnorm(50)) ; data1[5:7, 2] <- NA ; x1 = names(data1)[1] ; y1 = names(data1)[2] ; x.range.split = 5 ; x.step.factor = 10 ; y.range.split = 5 ; y.step.factor = 10 ; error = 0 ; data2 = data.frame(x = rnorm(50, 0, 2), y = rnorm(50, 0, 2)) ; set.seed(NULL) ; x2 = names(data2)[1] ; y2 = names(data2)[2] ; data2.pb.dot = "unknown" ; xy.cross.kind = "|" ; plot = TRUE ; graph.in.file = FALSE ; raster = FALSE ; warn.print = TRUE ; path.lib = NULL - # set.seed(1) ; data1 = data.frame(x = rnorm(500), y = rnorm(500)) ; data2 = data.frame(x = rnorm(500, 0, 2), y = rnorm(500, 0, 2)) ; set.seed(NULL) ; x1 = names(data1)[1] ; y1 = names(data1)[2] ; x.range.split = NULL ; x.step.factor = 10 ; y.range.split = 23 ; y.step.factor = 10 ; error = 0 ; x2 = names(data2)[1] ; y2 = names(data2)[2] ; data2.pb.dot = "unknown" ; xy.cross.kind = "|" ; plot = TRUE ; graph.in.file = FALSE ; raster = FALSE ; warn.print = TRUE ; path.lib = NULL - # set.seed(1) ; data1 = data.frame(x = rnorm(500), y = rnorm(500)) ; data2 = data.frame(x = rnorm(500, 0, 2), y = rnorm(500, 0, 2)) ; set.seed(NULL) ; x1 = names(data1)[1] ; y1 = names(data1)[2] ; x.range.split = 20 ; x.step.factor = 10 ; y.range.split = NULL ; y.step.factor = 10 ; error = 0 ; x2 = names(data2)[1] ; y2 = names(data2)[2] ; data2.pb.dot = "unknown" ; xy.cross.kind = "&" ; plot = TRUE ; graph.in.file = FALSE ; raster = FALSE ; warn.print = TRUE ; path.lib = NULL - # function name - function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") - # end function name - # required function checking - if(length(find("fun_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - warning <- NULL - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_check(data = data1, class = "data.frame", na.contain = TRUE, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & length(data1) < 2){ - cat(paste0("\n\n============\n\nERROR IN ", function.name, ": data1 ARGUMENT MUST BE A DATA FRAME OF AT LEAST 2 COLUMNS\n\n============\n\n")) - arg.check <- c(arg.check, TRUE) - } - tempo <- fun_check(data = x1, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & ! (x1 %in% names(data1))){ - cat(paste0("\n\n================\n\nERROR IN ", function.name, ": x1 ARGUMENT MUST BE A COLUMN NAME OF data1\n\n================\n\n")) - arg.check <- c(arg.check, TRUE) - }else if(tempo$problem == FALSE & x1 %in% names(data1)){ - tempo <- fun_check(data = data1[, x1], data.name = "x1 COLUMN OF data1", class = "vector", mode = "numeric", na.contain = TRUE, fun.name = function.name) ; eval(ee) - } - tempo <- fun_check(data = y1, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & ! (y1 %in% names(data1))){ - cat(paste0("\n\n================\n\nERROR IN ", function.name, ": y1 ARGUMENT MUST BE A COLUMN NAME OF data1\n\n================\n\n")) - arg.check <- c(arg.check, TRUE) - }else if(tempo$problem == FALSE & y1 %in% names(data1)){ - tempo <- fun_check(data = data1[, y1], data.name = "y1 COLUMN OF data1", class = "vector", mode = "numeric", na.contain = TRUE, fun.name = function.name) ; eval(ee) - } - if(is.null(x.range.split) & is.null(y.range.split)){ - cat(paste0("\n\n================\n\nERROR IN ", function.name, ": AT LEAST ONE OF THE x.range.split AND y.range.split ARGUMENTS MUST BE NON NULL\n\n================\n\n")) - arg.check <- c(arg.check, TRUE) - } - if( ! is.null(x.range.split)){ - tempo <- fun_check(data = x.range.split, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & x.range.split < 1){ - cat(paste0("\n\n================\n\nERROR IN ", function.name, ": x.range.split ARGUMENT CANNOT BE LOWER THAN 1\n\n================\n\n")) - arg.check <- c(arg.check, TRUE) - } - } - if( ! is.null(y.range.split)){ - tempo <- fun_check(data = y.range.split, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & y.range.split < 1){ - cat(paste0("\n\n================\n\nERROR IN ", function.name, ": y.range.split ARGUMENT CANNOT BE LOWER THAN 1\n\n================\n\n")) - arg.check <- c(arg.check, TRUE) - } - } - tempo <- fun_check(data = x.step.factor, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & x.step.factor < 1){ - cat(paste0("\n\n================\n\nERROR IN ", function.name, ": x.step.factor ARGUMENT CANNOT BE LOWER THAN 1\n\n================\n\n")) - arg.check <- c(arg.check, TRUE) - } - tempo <- fun_check(data = y.step.factor, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & y.step.factor < 1){ - cat(paste0("\n\n================\n\nERROR IN ", function.name, ": y.step.factor ARGUMENT CANNOT BE LOWER THAN 1\n\n================\n\n")) - arg.check <- c(arg.check, TRUE) - } - tempo <- fun_check(data = error, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) - if( ! is.null(data2)){ - if(is.null(x2) | is.null(y2)){ - cat(paste0("\n\n================\n\nERROR IN ", function.name, ": x2 AND y2 ARGUMENTS CANNOT BE NULL IF data2 ARGUMENT IS NON NULL\n\n================\n\n")) - arg.check <- c(arg.check, TRUE) - } - tempo <- fun_check(data = data2, class = "data.frame", na.contain = TRUE, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & length(data2) < 2){ - cat(paste0("\n\n============\n\nERROR IN ", function.name, ": data2 ARGUMENT MUST BE A DATA FRAME OF AT LEAST 2 COLUMNS\n\n============\n\n")) - arg.check <- c(arg.check, TRUE) - } - if( ! is.null(x2)){ - tempo <- fun_check(data = x2, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & ! (x2 %in% names(data2))){ - cat(paste0("\n\n================\n\nERROR IN ", function.name, ": x2 ARGUMENT MUST BE A COLUMN NAME OF data2\n\n================\n\n")) - arg.check <- c(arg.check, TRUE) - }else if(tempo$problem == FALSE & x2 %in% names(data2)){ - tempo <- fun_check(data = data2[, x2], data.name = "x2 COLUMN OF data2", class = "vector", mode = "numeric", na.contain = TRUE, fun.name = function.name) ; eval(ee) - } - } - if( ! is.null(y2)){ - tempo <- fun_check(data = y2, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & ! (y2 %in% names(data2))){ - cat(paste0("\n\n================\n\nERROR IN ", function.name, ": y2 ARGUMENT MUST BE A COLUMN NAME OF data2\n\n================\n\n")) - arg.check <- c(arg.check, TRUE) - }else if(tempo$problem == FALSE & y2 %in% names(data2)){ - tempo <- fun_check(data = data2[, y2], data.name = "y2 COLUMN OF data2", class = "vector", mode = "numeric", na.contain = TRUE, fun.name = function.name) ; eval(ee) - } - } - } - if( ! is.null(data2)){ - tempo <- fun_check(data = data2.pb.dot, options = c("signif", "not.signif", "unknown"), length = 1, fun.name = function.name) ; eval(ee) - } - if( ! (is.null(x.range.split)) & ! (is.null(y.range.split))){ - tempo <- fun_check(data = xy.cross.kind, options = c("&", "|"), length = 1, fun.name = function.name) ; eval(ee) - } - tempo <- fun_check(data = plot, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = warn.print, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & plot == TRUE){ - tempo <- fun_check(data = raster, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = graph.in.file, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & graph.in.file == TRUE & is.null(dev.list())){ - cat(paste0("\n\n============\n\nERROR IN ", function.name, ": \ngraph.in.file PARAMETER SET TO TRUE BUT NO ACTIVE GRAPHIC DEVICE DETECTED\n\n============\n\n")) - arg.check <- c(arg.check, TRUE) - }else if(tempo$problem == FALSE & graph.in.file == TRUE & ! is.null(dev.list())){ - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": GRAPHS PRINTED IN THE CURRENT DEVICE (TYPE ", toupper(names(dev.cur())), ")") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - if( ! is.null(path.lib)){ - tempo <- fun_check(data = path.lib, class = "character", fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & ! all(dir.exists(path.lib))){ - cat(paste0("\n\n============\n\nERROR IN ", function.name, ": \nDIRECTORY PATH INDICATED IN THE path.lib PARAMETER DOES NOT EXISTS: ", path.lib, "\n\n============\n\n")) - arg.check <- c(arg.check, TRUE) - } - } - } - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_check() - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() - # end argument checking - # other required function checking - if(plot == TRUE){ - if(length(find("fun_pack", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_pack() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - if(length(find("fun_open", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_open() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - if(length(find("fun_gg_palette", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_gg_palette() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - if(length(find("fun_gg_empty_graph", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_gg_empty_graph() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - if(length(find("fun_gg_scatter", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_gg_scatter() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - if(length(find("fun_close", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_close() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - } - # end other required function checking - # package checking - if(plot == TRUE){ - fun_pack(req.package = c("ggplot2"), path.lib = path.lib) - } - # end package checking - # main code - # na and Inf detection and removal (done now to be sure of the correct length of categ) - data1.removed.row.nb <- NULL - data1.removed.rows <- NULL - data2.removed.row.nb <- NULL - data2.removed.rows <- NULL - if(any(is.na(data1[, c(x1, y1)])) | any(is.infinite(data1[, x1])) | any(is.infinite(data1[, y1]))){ - tempo.na <- unlist(lapply(lapply(c(data1[c(x1, y1)]), FUN = is.na), FUN = which)) - tempo.inf <- unlist(lapply(lapply(c(data1[c(x1, y1)]), FUN = is.infinite), FUN = which)) - data1.removed.row.nb <- sort(unique(c(tempo.na, tempo.inf))) - if(length(data1.removed.row.nb) > 0){ - data1.removed.rows <- data1[data1.removed.row.nb, ] - } - if(length(data1.removed.row.nb) == nrow(data1)){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": AT LEAST ONE NA, NaN, -Inf OR Inf DETECTED IN EACH ROW OF data1. FUNCTION CANNOT BE USED ON EMPTY DATA FRAME\n\n============\n\n")) - stop(tempo.cat) - } - if(length(data1.removed.row.nb) > 0){ - data1 <- data1[-data1.removed.row.nb, ] - } - if(nrow(data1) == 0){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 1\n\n============\n\n")) - stop(tempo.cat) - } - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": NA, NaN, -Inf OR Inf DETECTED IN COLUMN ", paste(c(x1, y1), collapse = " "), " OF data1 AND CORRESPONDING ROWS REMOVED (SEE $data1.removed.row.nb AND $data1.removed.rows)") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - }else{ - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": NO NA, NaN, -Inf OR Inf DETECTED IN COLUMN ", paste(c(x1, y1), collapse = " "), " OF data1. NO ROW REMOVED") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - if( ! is.null(data2)){ - if(any(is.na(data2[, c(x2, y2)])) | any(is.infinite(data2[, x2])) | any(is.infinite(data2[, y2]))){ - tempo.na <- unlist(lapply(lapply(c(data2[c(x2, y2)]), FUN = is.na), FUN = which)) - tempo.inf <- unlist(lapply(lapply(c(data2[c(x2, y2)]), FUN = is.infinite), FUN = which)) - data2.removed.row.nb <- sort(unique(c(tempo.na, tempo.inf))) - if(length(data2.removed.row.nb) > 0){ - data2.removed.rows <- data2[data2.removed.row.nb, ] - } - if(length(data2.removed.row.nb) == nrow(data2)){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": AT LEAST ONE NA, NaN, -Inf OR Inf DETECTED IN EACH ROW OF data2. FUNCTION CANNOT BE USED ON EMPTY DATA FRAME\n\n============\n\n")) - stop(tempo.cat) - } - if(length(data2.removed.row.nb) > 0){ - data2 <- data2[-data2.removed.row.nb, ] - } - if(nrow(data2) == 0){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 2\n\n============\n\n")) - stop(tempo.cat) - } - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": NA, NaN, -Inf OR Inf DETECTED IN COLUMN ", paste(c(x2, y2), collapse = " "), " OF data2 AND CORRESPONDING ROWS REMOVED (SEE $data2.removed.row.nb AND $data2.removed.rows)") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - }else{ - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": NO NA, NaN, -Inf OR Inf DETECTED IN COLUMN ", paste(c(x2, y2), collapse = " "), " OF data2. NO ROW REMOVED") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - } - # end na and Inf detection and removal (done now to be sure of the correct length of categ) - # row annotation (dot number) - # data1 <- data1[ ! duplicated(data1[, c(x1, y1)]), ] # do not remove the dots that have same x and y values, because they will have different dot number -> not the same position on the matrices (so true for symmetric matrices) - data1 <- cbind(data1, DOT_NB = 1:nrow(data1)) - if( ! is.null(data2)){ - # data2 <- data2[ ! duplicated(data2[, c(x2, y2)]), ] # do not remove the dots that have same x and y values, because they will have different dot number -> not the same position on the matrices (so true for symmetric matrices) - data2 <- cbind(data2, DOT_NB = 1:nrow(data2)) - } - # end row annotation (dot number) - - - - - # Method using x unit interval - # may be create vector of each column to increase speed - x.data1.l <- NULL # x coord of the y upper and lower limits defined on the data1 cloud for left step line - x.data1.r <- NULL # x coord of the y upper and lower limits defined on the data1 cloud for right step line - y.data1.down.limit.l <- NULL # lower limit of the data1 cloud for left step line - y.data1.top.limit.l <- NULL # upper limit of the data1 cloud for left step line - y.data1.down.limit.r <- NULL # lower limit of the data1 cloud for right step line - y.data1.top.limit.r <- NULL # upper limit of the data1 cloud for left step line - if(any(data1[, x1] %in% c(Inf, -Inf))){ - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": THE data1 ARGUMENT CONTAINS -Inf OR Inf VALUES IN THE x1 COLUMN, THAT WILL NOT BE CONSIDERED IN THE PLOT RANGE") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - x.range <- range(data1[, x1], na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only - if(suppressWarnings(any(x.range %in% c(Inf, -Inf)))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, " COMPUTED x.range CONTAINS Inf VALUES, BECAUSE VALUES FROM data1 ARGUMENTS ARE NA OR Inf ONLY\n\n================\n\n") - stop(tempo.cat) - } - if(any(data1[, y1] %in% c(Inf, -Inf))){ - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": THE data1 ARGUMENT CONTAINS -Inf OR Inf VALUES IN THE y1 COLUMN, THAT WILL NOT BE CONSIDERED IN THE PLOT RANGE") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - y.range <- range(data1[, y1], na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only - if(suppressWarnings(any(x.range %in% c(Inf, -Inf)))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, " COMPUTED y.range CONTAINS Inf VALUES, BECAUSE VALUES FROM data1 ARGUMENTS ARE NA OR Inf ONLY\n\n================\n\n") - stop(tempo.cat) - } - x.range.plot <- range(data1[, x1], na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only - y.range.plot <- range(data1[, y1], na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only - if( ! is.null(data2)){ - if(any(data2[, x2] %in% c(Inf, -Inf))){ - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": THE data2 ARGUMENT CONTAINS -Inf OR Inf VALUES IN THE x2 COLUMN, THAT WILL NOT BE CONSIDERED IN THE PLOT RANGE") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - x.range.plot <- range(data1[, x1], data2[, x2], na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only - if(any(data2[, y2] %in% c(Inf, -Inf))){ - tempo.warning <- paste0("FROM FUNCTION ", function.name, ": THE data2 ARGUMENT CONTAINS -Inf OR Inf VALUES IN THE y2 COLUMN, THAT WILL NOT BE CONSIDERED IN THE PLOT RANGE") - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - y.range.plot <- range(data1[, y1], data2[, y2], na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only - } - if(suppressWarnings(any(x.range.plot %in% c(Inf, -Inf)))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, " COMPUTED x.range.plot CONTAINS Inf VALUES, BECAUSE VALUES FROM data1 (AND data2?) ARGUMENTS ARE NA OR Inf ONLY\n\n================\n\n") - stop(tempo.cat) - } - if(suppressWarnings(any(y.range.plot %in% c(Inf, -Inf)))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, " COMPUTED y.range.plot CONTAINS Inf VALUES, BECAUSE VALUES FROM data1 (AND data2?) ARGUMENTS ARE NA OR Inf ONLY\n\n================\n\n") - stop(tempo.cat) - } - if( ! is.null(x.range.split)){ - # data.frame ordering to slide the window from small to big values + sliding window definition - data1 <- data1[order(data1[, x1], na.last = TRUE), ] - if( ! is.null(data2)){ - data2 <- data2[order(data2[, x2], na.last = TRUE), ] - } - x.win.size <- abs(diff(x.range) / x.range.split) # in unit of x-axis - step <- x.win.size / x.step.factor - # end data.frame ordering to slide the window from small to big values + sliding window definition - # x-axis sliding and y-axis limits of the data1 cloud -> y significant data2 - loop.nb <- ceiling((diff(x.range) - x.win.size) / step) # x.win.size + n * step covers the x range if x.win.size + n * step >= diff(x.range), thus if n >= (diff(x.range) - x.win.size) / step - y.outside.data1.dot.nb <- integer() # vector that will contain the selected rows numbers of data1 that are upper or lower than the frame - y.inside.data1.dot.nb <- integer() # vector that will contain the selected rows numbers of data1 that are not upper or lower than the frame - y.data1.median <- median(data1[, y1], na.rm = TRUE) # will be used for sliding windows without data1 in it - if( ! is.null(data2)){ - y.outside.data2.dot.nb <- integer() # vector that will contain the selected 1D coordinates (i.e., dots) of data2 that are upper or lower than the data1 frame - y.inside.data2.dot.nb <- integer() # vector that will contain the 1D coordinates (i.e., dots) of data2 that are not upper or lower than the data1 frame - y.unknown.data2.dot.nb <- integer() # vector that will contain the 1D coordinates (i.e., dots) of data2 that are problematic: data2 dots outside of the range of data1, or data2 dots in a sliding window without data1 dots - # recover data2 dots outside the range of data1 - if(any(data2[, x2] < x.range[1])){ - y.unknown.data2.dot.nb <- c(y.unknown.data2.dot.nb, data2$DOT_NB[data2[, x2] < x.range[1]]) - #tempo.warning & indicate the interval - } - if(any(data2[, x2] > x.range[2])){ - y.unknown.data2.dot.nb <- c(y.unknown.data2.dot.nb, data2$DOT_NB[data2[, x2] > x.range[2]]) - #tempo.warning & indicate the interval - } - # end recover data2 dots outside the range of data1 - } - # loop.ini.time <- as.numeric(Sys.time()) - for(i1 in 0:(loop.nb + 1)){ - min.pos <- x.range[1] + step * i1 # lower position of the sliding window in data1 - max.pos <- min.pos + x.win.size # upper position of the sliding window in data1 - x.data1.l <- c(x.data1.l, min.pos, min.pos + step) # min.pos + step to make the steps - x.data1.r <- c(x.data1.r, max.pos, max.pos + step) # max.pos + step to make the steps - x.data1.dot.here <- data1[, x1] >= min.pos & data1[, x1] < max.pos # is there data1 dot present in the sliding window, considering the x axis? - if( ! is.null(data2)){ - x.data2.dot.here <- data2[, x2] >= min.pos & data2[, x2] < max.pos # is there data2 dot present in the sliding window, considering the x axis? - } - # recover the data1 dots outside the frame - if(any(x.data1.dot.here == TRUE)){ - tempo.y.data1.top.limit <- quantile(data1[x.data1.dot.here, y1], probs = 1 - error, na.rm = TRUE) - tempo.y.data1.down.limit <- quantile(data1[x.data1.dot.here, y1], probs = 0 + error, na.rm = TRUE) - y.data1.top.limit.l <- c(y.data1.top.limit.l, tempo.y.data1.top.limit, tempo.y.data1.top.limit) - y.data1.down.limit.l <- c(y.data1.down.limit.l, tempo.y.data1.down.limit, tempo.y.data1.down.limit) - y.data1.top.limit.r <- c(y.data1.top.limit.r, tempo.y.data1.top.limit, tempo.y.data1.top.limit) - y.data1.down.limit.r <- c(y.data1.down.limit.r, tempo.y.data1.down.limit, tempo.y.data1.down.limit) - y.data1.dot.signif <- ( ! ((data1[, y1] <= tempo.y.data1.top.limit) & (data1[, y1] >= tempo.y.data1.down.limit))) & x.data1.dot.here # is there data1 dot present in the sliding window, above or below the data1 limits, considering the y axis? - y.data1.dot.not.signif <- x.data1.dot.here & ! y.data1.dot.signif - y.outside.data1.dot.nb <- c(y.outside.data1.dot.nb, data1$DOT_NB[y.data1.dot.signif]) # recover the row number of data1 - y.outside.data1.dot.nb <- unique(y.outside.data1.dot.nb) - y.inside.data1.dot.nb <- c(y.inside.data1.dot.nb, data1$DOT_NB[y.data1.dot.not.signif]) - y.inside.data1.dot.nb <- unique(y.inside.data1.dot.nb) - }else{ - y.data1.top.limit.l <- c(y.data1.top.limit.l, y.data1.median, y.data1.median) - y.data1.down.limit.l <- c(y.data1.down.limit.l, y.data1.median, y.data1.median) - y.data1.top.limit.r <- c(y.data1.top.limit.r, y.data1.median, y.data1.median) - y.data1.down.limit.r <- c(y.data1.down.limit.r, y.data1.median, y.data1.median) - } - # end recover the data1 dots outside the frame - # recover the data2 dots outside the frame - if( ! is.null(data2)){ - if(any(x.data1.dot.here == TRUE) & any(x.data2.dot.here == TRUE)){ - y.data2.dot.signif <- ( ! ((data2[, y2] <= tempo.y.data1.top.limit) & (data2[, y2] >= tempo.y.data1.down.limit))) & x.data2.dot.here # is there data2 dot present in the sliding window, above or below the data1 limits, considering the y axis? - y.data2.dot.not.signif <- x.data2.dot.here & ! y.data2.dot.signif - y.outside.data2.dot.nb <- c(y.outside.data2.dot.nb, data2$DOT_NB[y.data2.dot.signif]) - y.outside.data2.dot.nb <- unique(y.outside.data2.dot.nb) - y.inside.data2.dot.nb <- c(y.inside.data2.dot.nb, data2$DOT_NB[y.data2.dot.not.signif]) - y.inside.data2.dot.nb <- unique(y.inside.data2.dot.nb) - }else if(any(x.data1.dot.here == FALSE) & any(x.data2.dot.here == TRUE)){ # problem: data2 dots in the the windows but no data1 dots to generates the quantiles - y.unknown.data2.dot.nb <- c(y.unknown.data2.dot.nb, data2$DOT_NB[x.data2.dot.here]) - y.unknown.data2.dot.nb <- unique(y.unknown.data2.dot.nb) - #tempo.warning & indicate the interval - - - - - # tempo.warning <- paste0("FROM FUNCTION ", function.name, ": THE [", round(min.pos, 3), " ; ", round(max.pos, 3), "] INTERVAL DOES NOT CONTAIN data1 X VALUES BUT CONTAINS data2 X VALUES WHICH CANNOT BE EVALUATED.\nTHE CONCERNED data2 ROW NUMBERS ARE:\n", paste(which(x.data1.dot.here == FALSE & x.data2.dot.here == TRUE), collapse = "\n")) - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - } - # end recover the data2 dots outside the frame - # if(any(i1 == seq(1, loop.nb, 500))){ - # loop.fin.time <- as.numeric(Sys.time()) # time of process end - # cat(paste0("COMPUTATION TIME OF LOOP ", i1, " / ", loop.nb, ": ", as.character(lubridate::seconds_to_period(round(loop.fin.time - loop.ini.time))), "\n")) - # } - } - if(max.pos < x.range[2]){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE SLIDING WINDOW HAS NOT REACHED THE MAX VALUE OF data1 ON THE X-AXIS: ", max.pos, " VERSUS ", x.range[2], "\n\n================\n\n") - stop(tempo.cat) - } - y.incon.data1.dot.nb.final <- unique(c(y.outside.data1.dot.nb[y.outside.data1.dot.nb %in% y.inside.data1.dot.nb], y.inside.data1.dot.nb[y.inside.data1.dot.nb %in% y.outside.data1.dot.nb])) # inconsistent dots: if a row number of y.inside.data1.dot.nb is present in y.outside.data1.dot.nb (and vice versa), it means that during the sliding, a dot has been sometime inside, sometime outside -> removed from the outside list - y.outside.data1.dot.nb.final <- y.outside.data1.dot.nb[ ! (y.outside.data1.dot.nb %in% y.incon.data1.dot.nb.final)] # inconsistent dots removed from the outside list - y.inside.data1.dot.nb.final <- y.inside.data1.dot.nb[ ! (y.inside.data1.dot.nb %in% y.incon.data1.dot.nb.final)] # inconsistent dots removed from the inside list - if( ! is.null(data2)){ - # if some unknown dots are also inside, and/or outside, they are put in the inside and/or outside. Ok, because then the intersection between inside and outside is treated -> inconsistent dots - tempo.unknown.out <- y.unknown.data2.dot.nb[y.unknown.data2.dot.nb %in% y.outside.data2.dot.nb] - y.outside.data2.dot.nb <- unique(c(y.outside.data2.dot.nb, tempo.unknown.out)) # if a row number of y.unknown.data2.dot.nb is present in y.outside.data2.dot.nb, it is put into outside - tempo.unknown.in <- y.unknown.data2.dot.nb[y.unknown.data2.dot.nb %in% y.inside.data2.dot.nb] - y.inside.data2.dot.nb <- unique(c(y.inside.data2.dot.nb, tempo.unknown.in)) # if a row number of y.unknown.data2.dot.nb is present in y.inside.data2.dot.nb, it is put into inside - y.unknown.data2.dot.nb.final <- y.unknown.data2.dot.nb[ ! (y.unknown.data2.dot.nb %in% c(y.outside.data2.dot.nb, y.inside.data2.dot.nb))] # then dots also in inside and outside are remove from unknown - y.incon.data2.dot.nb.final <- unique(c(y.outside.data2.dot.nb[y.outside.data2.dot.nb %in% y.inside.data2.dot.nb], y.inside.data2.dot.nb[y.inside.data2.dot.nb %in% y.outside.data2.dot.nb])) # inconsistent dots: if a row number of y.inside.data2.dot.nb is present in y.outside.data2.dot.nb (and vice versa), it means that during the sliding, a dot has been sometime inside, sometime outside -> removed from the outside list - y.outside.data2.dot.nb.final <- y.outside.data2.dot.nb[ ! (y.outside.data2.dot.nb %in% y.incon.data2.dot.nb.final)] # inconsistent dots removed from the outside list - y.inside.data2.dot.nb.final <- y.inside.data2.dot.nb[ ! (y.inside.data2.dot.nb %in% y.incon.data2.dot.nb.final)] # inconsistent dots removed from the inside list - } - # end x-axis sliding and y-axis limits of the data1 cloud -> y significant data2 - } - # end Method using x unit interval - - - - - # Method using y unit interval - y.data1.d <- NULL # y coord of the x upper and lower limits defined on the data1 cloud for down step line - y.data1.t <- NULL # y coord of the x upper and lower limits defined on the data1 cloud for top step line - x.data1.left.limit.d <- NULL # left limit of the data1 cloud for down step line - x.data1.right.limit.d <- NULL # right limit of the data1 cloud for down step line - x.data1.left.limit.t <- NULL # left limit of the data1 cloud for top step line - x.data1.right.limit.t <- NULL # right limit of the data1 cloud for top step line - if( ! is.null(y.range.split)){ - # data.frame ordering to slide the window from small to big values + sliding window definition - data1 <- data1[order(data1[, y1], na.last = TRUE), ] - if( ! is.null(data2)){ - data2 <- data2[order(data2[, y2], na.last = TRUE), ] - } - y.win.size <- abs(diff(y.range) / y.range.split) # in unit of y-axis - step <- y.win.size / y.step.factor - # end data.frame ordering to slide the window from small to big values + sliding window definition - # y-axis sliding and x-axis limits of the data1 cloud -> x significant data2 - loop.nb <- ceiling((diff(y.range) - y.win.size) / step) # y.win.size + n * step covers the y range if y.win.size + n * step >= diff(y.range), thus if n >= (diff(y.range) - y.win.size) / step - x.outside.data1.dot.nb <- integer() # vector that will contain the selected rows numbers of data1 that are upper or lower than the frame - x.inside.data1.dot.nb <- integer() # vector that will contain the selected rows numbers of data1 that are not upper or lower than the frame - x.data1.median <- median(data1[, x1], na.rm = TRUE) # will be used for sliding windows without data1 in it - if( ! is.null(data2)){ - x.outside.data2.dot.nb <- integer() # vector that will contain the selected 1D coordinates (i.e., dots) of data2 that are upper or lower than the data1 frame - x.inside.data2.dot.nb <- integer() # vector that will contain the 1D coordinates (i.e., dots) of data2 that are not upper or lower than the data1 frame - x.unknown.data2.dot.nb <- integer() # vector that will contain the 1D coordinates (i.e., dots) of data2 that are problematic: data2 dots outside of the range of data1, or data2 dots in a sliding window without data1 dots - # recover data2 dots outside the range of data1 - if(any(data2[, y2] < y.range[1])){ - x.unknown.data2.dot.nb <- c(x.unknown.data2.dot.nb, data2$DOT_NB[data2[, y2] < y.range[1]]) - } - if(any(data2[, y2] > y.range[2])){ - x.unknown.data2.dot.nb <- c(x.unknown.data2.dot.nb, data2$DOT_NB[data2[, y2] > y.range[2]]) - } - # end recover data2 dots outside the range of data1 - } - # loop.ini.time <- as.numeric(Sys.time()) - for(i1 in 0:(loop.nb + 1)){ - min.pos <- y.range[1] + step * i1 # lower position of the sliding window in data1 - max.pos <- min.pos + y.win.size # upper position of the sliding window in data1 - y.data1.d <- c(y.data1.d, min.pos, min.pos + step) # min.pos + step to make the steps - y.data1.t <- c(y.data1.t, max.pos, max.pos + step) # max.pos + step to make the steps - y.data1.dot.here <- data1[, y1] >= min.pos & data1[, y1] < max.pos # is there data1 dot present in the sliding window, considering the y axis? - if( ! is.null(data2)){ - y.data2.dot.here <- data2[, y2] >= min.pos & data2[, y2] < max.pos # is there data2 dot present in the sliding window, considering the y axis? - } - # recover the data1 dots outside the frame - if(any(y.data1.dot.here == TRUE)){ - tempo.x.data1.right.limit <- quantile(data1[y.data1.dot.here, x1], probs = 1 - error, na.rm = TRUE) - tempo.x.data1.left.limit <- quantile(data1[y.data1.dot.here, x1], probs = 0 + error, na.rm = TRUE) - x.data1.right.limit.d <- c(x.data1.right.limit.d, tempo.x.data1.right.limit, tempo.x.data1.right.limit) - x.data1.left.limit.d <- c(x.data1.left.limit.d, tempo.x.data1.left.limit, tempo.x.data1.left.limit) - x.data1.right.limit.t <- c(x.data1.right.limit.t, tempo.x.data1.right.limit, tempo.x.data1.right.limit) - x.data1.left.limit.t <- c(x.data1.left.limit.t, tempo.x.data1.left.limit, tempo.x.data1.left.limit) - x.data1.dot.signif <- ( ! ((data1[, x1] <= tempo.x.data1.right.limit) & (data1[, x1] >= tempo.x.data1.left.limit))) & y.data1.dot.here # is there data2 dot present in the sliding window, above or below the data1 limits, considering the x axis? - x.data1.dot.not.signif <- y.data1.dot.here & ! x.data1.dot.signif - x.outside.data1.dot.nb <- c(x.outside.data1.dot.nb, data1$DOT_NB[x.data1.dot.signif]) # recover the row number of data1 - x.outside.data1.dot.nb <- unique(x.outside.data1.dot.nb) - x.inside.data1.dot.nb <- c(x.inside.data1.dot.nb, data1$DOT_NB[x.data1.dot.not.signif]) - x.inside.data1.dot.nb <- unique(x.inside.data1.dot.nb) - }else{ - x.data1.right.limit.d <- c(x.data1.right.limit.d, x.data1.median, x.data1.median) - x.data1.left.limit.d <- c(x.data1.left.limit.d, x.data1.median, x.data1.median) - x.data1.right.limit.t <- c(x.data1.right.limit.t, x.data1.median, x.data1.median) - x.data1.left.limit.t <- c(x.data1.left.limit.t, x.data1.median, x.data1.median) - } - # end recover the data1 dots outside the frame - # recover the data2 dots outside the frame - if( ! is.null(data2)){ - if(any(y.data1.dot.here == TRUE) & any(y.data2.dot.here == TRUE)){ - x.data2.dot.signif <- ( ! ((data2[, x2] <= tempo.x.data1.right.limit) & (data2[, x2] >= tempo.x.data1.left.limit))) & y.data2.dot.here # is there data2 dot present in the sliding window, above or below the data1 limits, considering the x axis? - x.data2.dot.not.signif <- y.data2.dot.here & ! x.data2.dot.signif - x.outside.data2.dot.nb <- c(x.outside.data2.dot.nb, data2$DOT_NB[x.data2.dot.signif]) - x.outside.data2.dot.nb <- unique(x.outside.data2.dot.nb) - x.inside.data2.dot.nb <- c(x.inside.data2.dot.nb, data2$DOT_NB[x.data2.dot.not.signif]) - x.inside.data2.dot.nb <- unique(x.inside.data2.dot.nb) - }else if(any(y.data1.dot.here == FALSE) & any(y.data2.dot.here == TRUE)){ # recover the data2 dots outside the range of the data1 cloud - x.unknown.data2.dot.nb <- c(x.unknown.data2.dot.nb, data2$DOT_NB[y.data2.dot.here]) - x.unknown.data2.dot.nb <- unique(x.unknown.data2.dot.nb) - - - - # tempo.warning <- paste0("FROM FUNCTION ", function.name, ": THE [", round(min.pos, 3), " ; ", round(max.pos, 3), "] INTERVAL DOES NOT CONTAIN data1 Y VALUES BUT CONTAINS data2 Y VALUES WHICH CANNOT BE EVALUATED.\nTHE CONCERNED data2 ROW NUMBERS ARE:\n", paste(which(y.data1.dot.here == FALSE & y.data2.dot.here == TRUE), collapse = "\n")) - warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - } - } - # end recover the data2 dots outside the frame - # if(any(i1 == seq(1, loop.nb, 500))){ - # loop.fin.time <- as.numeric(Sys.time()) # time of process end - # cat(paste0("COMPUTATION TIME OF LOOP ", i1, " / ", loop.nb, ": ", as.character(lubridate::seconds_to_period(round(loop.fin.time - loop.ini.time))), "\n")) - # } - } - if(max.pos < y.range[2]){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE SLIDING WINDOW HAS NOT REACHED THE MAX VALUE OF data1 ON THE Y-AXIS: ", max.pos, " VERSUS ", y.range[2], "\n\n================\n\n") - stop(tempo.cat) - } - x.incon.data1.dot.nb.final <- unique(c(x.outside.data1.dot.nb[x.outside.data1.dot.nb %in% x.inside.data1.dot.nb], x.inside.data1.dot.nb[x.inside.data1.dot.nb %in% x.outside.data1.dot.nb])) # inconsistent dots: if a row number of x.inside.data1.dot.nb is present in x.outside.data1.dot.nb (and vice versa), it means that during the sliding, a dot has been sometime inside, sometime outside -> removed from the outside list - x.outside.data1.dot.nb.final <- x.outside.data1.dot.nb[ ! (x.outside.data1.dot.nb %in% x.incon.data1.dot.nb.final)] # inconsistent dots removed from the outside list - x.inside.data1.dot.nb.final <- x.inside.data1.dot.nb[ ! (x.inside.data1.dot.nb %in% x.incon.data1.dot.nb.final)] # inconsistent dots removed from the inside list - if( ! is.null(data2)){ - # if some unknown dots are also inside, and/or outside, they are put in the inside and/or outside. Ok, because then the intersection between inside and outside is treated -> inconsistent dots - tempo.unknown.out <- x.unknown.data2.dot.nb[x.unknown.data2.dot.nb %in% x.outside.data2.dot.nb] - x.outside.data2.dot.nb <- unique(c(x.outside.data2.dot.nb, tempo.unknown.out)) # if a row number of x.unknown.data2.dot.nb is present in x.outside.data2.dot.nb, it is put into outside - tempo.unknown.in <- x.unknown.data2.dot.nb[x.unknown.data2.dot.nb %in% x.inside.data2.dot.nb] - x.inside.data2.dot.nb <- unique(c(x.inside.data2.dot.nb, tempo.unknown.in)) # if a row number of x.unknown.data2.dot.nb is present in x.inside.data2.dot.nb, it is put into inside - x.unknown.data2.dot.nb.final <- x.unknown.data2.dot.nb[ ! (x.unknown.data2.dot.nb %in% c(x.outside.data2.dot.nb, x.inside.data2.dot.nb))] # then dots also in inside and outside are remove from unknown - x.incon.data2.dot.nb.final <- unique(c(x.outside.data2.dot.nb[x.outside.data2.dot.nb %in% x.inside.data2.dot.nb], x.inside.data2.dot.nb[x.inside.data2.dot.nb %in% x.outside.data2.dot.nb])) # inconsistent dots: if a row number of x.inside.data2.dot.nb is present in x.outside.data2.dot.nb (and vice versa), it means that during the sliding, a dot has been sometime inside, sometime outside -> removed from the outside list - x.outside.data2.dot.nb.final <- x.outside.data2.dot.nb[ ! (x.outside.data2.dot.nb %in% x.incon.data2.dot.nb.final)] # inconsistent dots removed from the outside list - x.inside.data2.dot.nb.final <- x.inside.data2.dot.nb[ ! (x.inside.data2.dot.nb %in% x.incon.data2.dot.nb.final)] # inconsistent dots removed from the inside list - } - # end y-axis sliding and x-axis limits of the data1 cloud -> x significant data2 - } - # end Method using y unit interval - - - - # recovering the frame coordinates - hframe = rbind( - data.frame( - x = if(is.null(x.data1.l)){NULL}else{x.data1.l}, - y = if(is.null(x.data1.l)){NULL}else{y.data1.down.limit.l}, - kind = if(is.null(x.data1.l)){NULL}else{"down.frame1"} - ), - data.frame( - x = if(is.null(x.data1.r)){NULL}else{x.data1.r}, - y = if(is.null(x.data1.r)){NULL}else{y.data1.down.limit.r}, - kind = if(is.null(x.data1.r)){NULL}else{"down.frame2"} - ), - data.frame( - x = if(is.null(x.data1.l)){NULL}else{x.data1.l}, - y = if(is.null(x.data1.l)){NULL}else{y.data1.top.limit.l}, - kind = if(is.null(x.data1.l)){NULL}else{"top.frame1"} - ), - data.frame( - x = if(is.null(x.data1.r)){NULL}else{x.data1.r}, - y = if(is.null(x.data1.r)){NULL}else{y.data1.top.limit.r}, - kind = if(is.null(x.data1.r)){NULL}else{"top.frame2"} - ) - ) - vframe = rbind( - data.frame( - x = if(is.null(y.data1.d)){NULL}else{x.data1.left.limit.d}, - y = if(is.null(y.data1.d)){NULL}else{y.data1.d}, - kind = if(is.null(y.data1.d)){NULL}else{"left.frame1"} - ), - data.frame( - x = if(is.null(y.data1.t)){NULL}else{x.data1.left.limit.t}, - y = if(is.null(y.data1.t)){NULL}else{y.data1.t}, - kind = if(is.null(y.data1.t)){NULL}else{"left.frame2"} - ), - data.frame( - x = if(is.null(y.data1.d)){NULL}else{x.data1.right.limit.d}, - y = if(is.null(y.data1.d)){NULL}else{y.data1.d}, - kind = if(is.null(y.data1.d)){NULL}else{"right.frame1"} - ), - data.frame( - x = if(is.null(y.data1.t)){NULL}else{x.data1.right.limit.t}, - y = if(is.null(y.data1.t)){NULL}else{y.data1.t}, - kind = if(is.null(y.data1.t)){NULL}else{"right.frame2"} - ) - ) - # end recovering the frame coordinates - # recovering the dot coordinates - data1.signif.dot <- NULL - data1.non.signif.dot <- NULL - data1.incon.dot <- NULL - data2.signif.dot <- NULL - data2.non.signif.dot <- NULL - data2.unknown.dot <- NULL - data2.incon.dot <- NULL - if(( ! is.null(x.range.split)) & ( ! is.null(y.range.split))){ - # inconsistent dots recovery - if(length(unique(c(x.incon.data1.dot.nb.final, y.incon.data1.dot.nb.final))) > 0){ - data1.incon.dot <- data1[data1$DOT_NB %in% unique(c(x.incon.data1.dot.nb.final, y.incon.data1.dot.nb.final)), ] # if a dot in inconsistent in x or y -> classified as inconsistent (so unique() used) - # removal of the inconsistent dot in the other classifications - x.inside.data1.dot.nb.final <- x.inside.data1.dot.nb.final[ ! x.inside.data1.dot.nb.final %in% data1.incon.dot$DOT_NB] - y.inside.data1.dot.nb.final <- y.inside.data1.dot.nb.final[ ! y.inside.data1.dot.nb.final %in% data1.incon.dot$DOT_NB] - x.outside.data1.dot.nb.final <- x.outside.data1.dot.nb.final[ ! x.outside.data1.dot.nb.final %in% data1.incon.dot$DOT_NB] - y.outside.data1.dot.nb.final <- y.outside.data1.dot.nb.final[ ! y.outside.data1.dot.nb.final %in% data1.incon.dot$DOT_NB] - x.unknown.data1.dot.nb.final <- x.unknown.data1.dot.nb.final[ ! x.unknown.data1.dot.nb.final %in% data1.incon.dot$DOT_NB] - y.unknown.data1.dot.nb.final <- y.unknown.data1.dot.nb.final[ ! y.unknown.data1.dot.nb.final %in% data1.incon.dot$DOT_NB] - # end removal of the inconsistent dot in the other classifications - } - if( ! is.null(data2)){ - if(length(unique(c(x.incon.data2.dot.nb.final, y.incon.data2.dot.nb.final))) > 0){ - data2.incon.dot <- data2[data2$DOT_NB %in% unique(c(x.incon.data2.dot.nb.final, y.incon.data2.dot.nb.final)), ] - # removal of the inconsistent dot in the other classifications - x.inside.data2.dot.nb.final <- x.inside.data2.dot.nb.final[ ! x.inside.data2.dot.nb.final %in% data2.incon.dot$DOT_NB] - y.inside.data2.dot.nb.final <- y.inside.data2.dot.nb.final[ ! y.inside.data2.dot.nb.final %in% data2.incon.dot$DOT_NB] - x.outside.data2.dot.nb.final <- x.outside.data2.dot.nb.final[ ! x.outside.data2.dot.nb.final %in% data2.incon.dot$DOT_NB] - y.outside.data2.dot.nb.final <- y.outside.data2.dot.nb.final[ ! y.outside.data2.dot.nb.final %in% data2.incon.dot$DOT_NB] - x.unknown.data2.dot.nb.final <- x.unknown.data2.dot.nb.final[ ! x.unknown.data2.dot.nb.final %in% data2.incon.dot$DOT_NB] - y.unknown.data2.dot.nb.final <- y.unknown.data2.dot.nb.final[ ! y.unknown.data2.dot.nb.final %in% data2.incon.dot$DOT_NB] - # end removal of the inconsistent dot in the other classifications - } - } - # end inconsistent dots recovery - # unknown dots recovery - if( ! is.null(data2)){ - if(data2.pb.dot == "signif"){ - x.outside.data2.dot.nb.final <- unique(c(x.outside.data2.dot.nb.final, x.unknown.data2.dot.nb.final)) - x.inside.data2.dot.nb.final <- x.inside.data2.dot.nb.final[ ! x.inside.data2.dot.nb.final %in% x.unknown.data2.dot.nb.final] # remove x.unknown.data2.dot.nb.final from x.inside.data2.dot.nb.final - y.outside.data2.dot.nb.final <- unique(c(y.outside.data2.dot.nb.final, y.unknown.data2.dot.nb.final)) - y.inside.data2.dot.nb.final <- y.inside.data2.dot.nb.final[ ! y.inside.data2.dot.nb.final %in% y.unknown.data2.dot.nb.final] # remove y.unknown.data2.dot.nb.final from y.inside.data2.dot.nb.final - x.unknown.data2.dot.nb.final <- NULL - y.unknown.data2.dot.nb.final <- NULL - data2.unknown.dot <- NULL - }else if(data2.pb.dot == "not.signif"){ - x.inside.data2.dot.nb.final <- unique(c(x.inside.data2.dot.nb.final, x.unknown.data2.dot.nb.final)) - x.outside.data2.dot.nb.final <- x.outside.data2.dot.nb.final[ ! x.outside.data2.dot.nb.final %in% x.unknown.data2.dot.nb.final] # remove x.unknown.data2.dot.nb.final from x.outside.data2.dot.nb.final - y.inside.data2.dot.nb.final <- unique(c(y.inside.data2.dot.nb.final, y.unknown.data2.dot.nb.final)) - y.outside.data2.dot.nb.final <- y.outside.data2.dot.nb.final[ ! y.outside.data2.dot.nb.final %in% y.unknown.data2.dot.nb.final] # remove y.unknown.data2.dot.nb.final from y.outside.data2.dot.nb.final - x.unknown.data2.dot.nb.final <- NULL - y.unknown.data2.dot.nb.final <- NULL - data2.unknown.dot <- NULL - }else if(data2.pb.dot == "unknown"){ - if(length(unique(c(x.unknown.data2.dot.nb.final, y.unknown.data2.dot.nb.final))) > 0){ - data2.unknown.dot <- data2[data2$DOT_NB %in% unique(c(x.unknown.data2.dot.nb.final, y.unknown.data2.dot.nb.final)), ] # if a dot in unknown in x or y -> classified as unknown (so unique() used) - x.outside.data2.dot.nb.final <- x.outside.data2.dot.nb.final[ ! x.outside.data2.dot.nb.final %in% data2.unknown.dot$DOT_NB] # remove x.unknown.data2.dot.nb.final from x.outside.data2.dot.nb.final - x.inside.data2.dot.nb.final <- x.inside.data2.dot.nb.final[ ! x.inside.data2.dot.nb.final %in% data2.unknown.dot$DOT_NB] # remove x.unknown.data2.dot.nb.final from x.inside.data2.dot.nb.final - y.outside.data2.dot.nb.final <- y.outside.data2.dot.nb.final[ ! y.outside.data2.dot.nb.final %in% data2.unknown.dot$DOT_NB] # remove y.unknown.data2.dot.nb.final from y.outside.data2.dot.nb.final - y.inside.data2.dot.nb.final <- y.inside.data2.dot.nb.final[ ! y.inside.data2.dot.nb.final %in% data2.unknown.dot$DOT_NB] # remove y.unknown.data2.dot.nb.final from y.inside.data2.dot.nb.final - } - }else{ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 3\n\n============\n\n")) - stop(tempo.cat) - } - } - # end unknown dots recovery - # sign and non sign dot recovery - if(xy.cross.kind == "|"){ # here the problem is to deal with significant dots depending on x and y. Thus I start with that, recover dots finally non significant in outside and put them in inside (when &), and remove from inside the dots in outside - if(length(unique(c(x.outside.data1.dot.nb.final, y.outside.data1.dot.nb.final))) > 0){ - tempo.outside <- unique(c(x.outside.data1.dot.nb.final, y.outside.data1.dot.nb.final)) # union so unique() used - tempo.inside <- unique(c(x.inside.data1.dot.nb.final, y.inside.data1.dot.nb.final)) - tempo.inside <- tempo.inside[ ! tempo.inside %in% tempo.outside] - data1.signif.dot <- data1[data1$DOT_NB %in% tempo.outside, ] - data1.non.signif.dot <- data1[data1$DOT_NB %in% tempo.inside, ] - }else{ - data1.non.signif.dot <- data1[unique(c(x.inside.data1.dot.nb.final, y.inside.data1.dot.nb.final)), ] # if no outside dots, I recover all the inside dots and that's it - } - }else if(xy.cross.kind == "&"){ - if(sum(x.outside.data1.dot.nb.final %in% y.outside.data1.dot.nb.final) > 0){ # that is intersection - tempo.outside <- unique(x.outside.data1.dot.nb.final[x.outside.data1.dot.nb.final %in% y.outside.data1.dot.nb.final]) # intersection - tempo.outside.removed <- unique(c(x.outside.data1.dot.nb.final, y.outside.data1.dot.nb.final))[ ! unique(c(x.outside.data1.dot.nb.final, y.outside.data1.dot.nb.final)) %in% tempo.outside] - tempo.inside <- unique(c(x.inside.data1.dot.nb.final, y.inside.data1.dot.nb.final)) - data1.signif.dot <- data1[data1$DOT_NB %in% tempo.outside, ] - data1.non.signif.dot <- data1[data1$DOT_NB %in% tempo.inside, ] - }else{ - data1.non.signif.dot <- data1[unique(c(x.inside.data1.dot.nb.final, y.inside.data1.dot.nb.final)), ] # if no outside dots, I recover all the inside dots and that's it - } - }else{ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 4\n\n============\n\n")) - stop(tempo.cat) - } - if( ! is.null(data2)){ - if(xy.cross.kind == "|"){ # here the problem is to deal with significant dots depending on x and y. Thus I start with that, recover dots finally non significant in outside and put them in inside (when &), and remove from inside the dots in outside - if(length(unique(c(x.outside.data2.dot.nb.final, y.outside.data2.dot.nb.final))) > 0){ - tempo.outside <- unique(c(x.outside.data2.dot.nb.final, y.outside.data2.dot.nb.final)) # union so unique() used - tempo.inside <- unique(c(x.inside.data2.dot.nb.final, y.inside.data2.dot.nb.final)) - tempo.inside <- tempo.inside[ ! tempo.inside %in% tempo.outside] - data2.signif.dot <- data2[data2$DOT_NB %in% tempo.outside, ] - data2.non.signif.dot <- data2[data2$DOT_NB %in% tempo.inside, ] - }else{ - data2.non.signif.dot <- data2[unique(c(x.inside.data2.dot.nb.final, y.inside.data2.dot.nb.final)), ] # if no outside dots, I recover all the inside dots and that's it - } - }else if(xy.cross.kind == "&"){ - if(sum(x.outside.data2.dot.nb.final %in% y.outside.data2.dot.nb.final) > 0){ # that is intersection - tempo.outside <- unique(x.outside.data2.dot.nb.final[x.outside.data2.dot.nb.final %in% y.outside.data2.dot.nb.final]) # intersection - tempo.outside.removed <- unique(c(x.outside.data2.dot.nb.final, y.outside.data2.dot.nb.final))[ ! unique(c(x.outside.data2.dot.nb.final, y.outside.data2.dot.nb.final)) %in% tempo.outside] - tempo.inside <- unique(c(x.inside.data2.dot.nb.final, y.inside.data2.dot.nb.final)) - data2.signif.dot <- data2[data2$DOT_NB %in% tempo.outside, ] - data2.non.signif.dot <- data2[data2$DOT_NB %in% tempo.inside, ] - }else{ - data2.non.signif.dot <- data2[unique(c(x.inside.data2.dot.nb.final, y.inside.data2.dot.nb.final)), ] # if no outside dots, I recover all the inside dots and that's it - } - }else{ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 5\n\n============\n\n")) - stop(tempo.cat) - } - } - # end sign and non sign dot recovery - }else if(( ! is.null(x.range.split)) & is.null(y.range.split)){ - # inconsistent dots recovery - if(length(y.incon.data1.dot.nb.final) > 0){ - data1.incon.dot <- data1[data1$DOT_NB %in% y.incon.data1.dot.nb.final, ] - } - if( ! is.null(data2)){ - if(length(y.incon.data2.dot.nb.final) > 0){ - data2.incon.dot <- data2[data2$DOT_NB %in% y.incon.data2.dot.nb.final, ] - } - }# end inconsistent dots recovery - # unknown dots recovery - if( ! is.null(data2)){ - if(data2.pb.dot == "signif"){ - y.outside.data2.dot.nb.final <- unique(c(y.outside.data2.dot.nb.final, y.unknown.data2.dot.nb.final)) - }else if(data2.pb.dot == "not.signif"){ - y.inside.data2.dot.nb.final <- unique(c(y.inside.data2.dot.nb.final, y.unknown.data2.dot.nb.final)) - }else if(data2.pb.dot == "unknown"){ - if(length(y.unknown.data2.dot.nb.final) > 0){ - data2.unknown.dot <- data2[data2$DOT_NB %in% y.unknown.data2.dot.nb.final, ] - } - }else{ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 6\n\n============\n\n")) - stop(tempo.cat) - } - } - # end unknown dots recovery - # sign and non sign dot recovery - if(length(y.outside.data1.dot.nb.final) > 0){ - data1.signif.dot <- data1[data1$DOT_NB %in% y.outside.data1.dot.nb.final, ] - } - if(length(y.inside.data1.dot.nb.final) > 0){ - data1.non.signif.dot <- data1[data1$DOT_NB %in% y.inside.data1.dot.nb.final, ] - } - if( ! is.null(data2)){ - if(length(y.outside.data2.dot.nb.final) > 0){ - data2.signif.dot <- data2[data2$DOT_NB %in% y.outside.data2.dot.nb.final, ] - } - if(length(y.inside.data2.dot.nb.final) > 0){ - data2.non.signif.dot <- data2[data2$DOT_NB %in% y.inside.data2.dot.nb.final, ] - } - } - # end sign and non sign dot recovery - }else if(is.null(x.range.split) & ( ! is.null(y.range.split))){ - # inconsistent dots recovery - if(length(x.incon.data1.dot.nb.final) > 0){ - data1.incon.dot <- data1[data1$DOT_NB %in% x.incon.data1.dot.nb.final, ] - } - if( ! is.null(data2)){ - if(length(x.incon.data2.dot.nb.final) > 0){ - data2.incon.dot <- data2[data2$DOT_NB %in% x.incon.data2.dot.nb.final, ] - } - }# end inconsistent dots recovery - # unknown dots recovery - if( ! is.null(data2)){ - if(data2.pb.dot == "signif"){ - x.outside.data2.dot.nb.final <- unique(c(x.outside.data2.dot.nb.final, x.unknown.data2.dot.nb.final)) - }else if(data2.pb.dot == "not.signif"){ - x.inside.data2.dot.nb.final <- unique(c(x.inside.data2.dot.nb.final, x.unknown.data2.dot.nb.final)) - }else if(data2.pb.dot == "unknown"){ - if(length(x.unknown.data2.dot.nb.final) > 0){ - data2.unknown.dot <- data2[data2$DOT_NB %in% x.unknown.data2.dot.nb.final, ] - } - }else{ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 7\n\n============\n\n")) - stop(tempo.cat) - } - } - # end unknown dots recovery - # sign and non sign dot recovery - if(length(x.outside.data1.dot.nb.final) > 0){ - data1.signif.dot <- data1[data1$DOT_NB %in% x.outside.data1.dot.nb.final, ] - } - if(length(x.inside.data1.dot.nb.final) > 0){ - data1.non.signif.dot <- data1[data1$DOT_NB %in% x.inside.data1.dot.nb.final, ] - } - if( ! is.null(data2)){ - if(length(x.outside.data2.dot.nb.final) > 0){ - data2.signif.dot <- data2[data2$DOT_NB %in% x.outside.data2.dot.nb.final, ] - } - if(length(x.inside.data2.dot.nb.final) > 0){ - data2.non.signif.dot <- data2[data2$DOT_NB %in% x.inside.data2.dot.nb.final, ] - } - } - # end sign and non sign dot recovery - } - # end recovering the dot coordinates - # verif - if(any(data1.signif.dot$DOT_NB %in% data1.non.signif.dot$DOT_NB)){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", FUNCTION.NAME, ": CODE INCONSISTENCY 8\n\n============\n\n")) - stop(tempo.cat) - } - if(any(data1.non.signif.dot$DOT_NB %in% data1.signif.dot$DOT_NB)){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", FUNCTION.NAME, ": CODE INCONSISTENCY 9\n\n============\n\n")) - stop(tempo.cat) - } - if(any(data1.signif.dot$DOT_NB %in% data1.incon.dot$DOT_NB)){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 10\n\n============\n\n")) - stop(tempo.cat) - } - if(any(data1.incon.dot$DOT_NB %in% data1.signif.dot$DOT_NB)){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 11\n\n============\n\n")) - stop(tempo.cat) - } - if(any(data1.non.signif.dot$DOT_NB %in% data1.incon.dot$DOT_NB)){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 12\n\n============\n\n")) - stop(tempo.cat) - } - if(any(data1.incon.dot$DOT_NB %in% data1.non.signif.dot$DOT_NB)){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 13\n\n============\n\n")) - stop(tempo.cat) - } - if( ! is.null(data2)){ - if(any(data2.signif.dot$DOT_NB %in% data2.non.signif.dot$DOT_NB)){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 14\n\n============\n\n")) - stop(tempo.cat) - } - if(any(data2.non.signif.dot$DOT_NB %in% data2.signif.dot$DOT_NB)){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 15\n\n============\n\n")) - stop(tempo.cat) - } - if(any(data2.signif.dot$DOT_NB %in% data2.unknown.dot$DOT_NB)){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 16\n\n============\n\n")) - stop(tempo.cat) - } - if(any(data2.unknown.dot$DOT_NB %in% data2.signif.dot$DOT_NB)){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 17\n\n============\n\n")) - stop(tempo.cat) - } - if(any(data2.signif.dot$DOT_NB %in% data2.incon.dot$DOT_NB)){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 18\n\n============\n\n")) - stop(tempo.cat) - } - if(any(data2.incon.dot$DOT_NB %in% data2.signif.dot$DOT_NB)){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 19\n\n============\n\n")) - stop(tempo.cat) - } - if(any(data2.non.signif.dot$DOT_NB %in% data2.unknown.dot$DOT_NB)){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 20\n\n============\n\n")) - stop(tempo.cat) - } - if(any(data2.unknown.dot$DOT_NB %in% data2.non.signif.dot$DOT_NB)){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 21\n\n============\n\n")) - stop(tempo.cat) - } - if(any(data2.non.signif.dot$DOT_NB %in% data2.incon.dot$DOT_NB)){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 22\n\n============\n\n")) - stop(tempo.cat) - } - if(any(data2.incon.dot$DOT_NB %in% data2.non.signif.dot$DOT_NB)){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 23\n\n============\n\n")) - stop(tempo.cat) - } - if(any(data2.unknown.dot$DOT_NB %in% data2.incon.dot$DOT_NB)){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 24\n\n============\n\n")) - stop(tempo.cat) - } - if(any(data2.incon.dot$DOT_NB %in% data2.unknown.dot$DOT_NB)){ - tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 25\n\n============\n\n")) - stop(tempo.cat) - } - } - # end verif - # plot - # recovering the axes data whatever plot or not - if(is.null(data2)){ - axes <- fun_gg_scatter(data1 = list(data1), x = list(x1), y = list(y1), categ = list(NULL), color = list(fun_gg_palette(2)[2]), geom = list("geom_point"), alpha = list(0.5), xlim = x.range.plot, ylim = y.range.plot, raster = raster, plot = FALSE, return = TRUE)$axes - }else{ - axes <- fun_gg_scatter(data1 = list(data1, data2), x = list(x1, x2), y = list(y1, y2), categ = list(NULL, NULL), color = list(fun_gg_palette(2)[2], fun_gg_palette(2)[1]), geom = list("geom_point", "geom_point"), alpha = list(0.5, 0.5), xlim = x.range.plot, ylim = y.range.plot, raster = raster, plot = FALSE, return = TRUE)$axes - } - # end recovering the axes data whatever plot or not - if(plot == TRUE){ - # add a categ for plot legend - tempo.df.name <- c("data1", "data1.signif.dot", "data1.incon.dot", "data2", "data2.signif.dot", "data2.unknown.dot", "data2.incon.dot") - tempo.class.name <- c("data1", "data1", "data1", "data2", "data2", "data2", "data2") - for(i2 in 1:length(tempo.df.name)){ - if( ! is.null(get(tempo.df.name[i2]))){ - assign(tempo.df.name[i2], data.frame(get(tempo.df.name[i2]), kind = tempo.class.name[i2])) - } - } - # end add a categ for plot legend - if(( ! is.null(x.range.split)) & ( ! is.null(y.range.split))){ - if(graph.in.file == FALSE){ - fun_open(pdf.disp = FALSE) - } - tempo.graph <- fun_gg_scatter(data1 = list(data1, hframe, vframe), x = list(x1, "x", "x"), y = list(y1, "y", "y"), categ = list("kind", "kind", "kind"), legend.name = list("DATASET", "HORIZ FRAME" , "VERT FRAME"), color = list(fun_gg_palette(2)[2], rep(hsv(h = c(0.1, 0.15), v = c(0.75, 1)), 2), rep(hsv(h = c(0.5, 0.6), v = c(0.9, 1)), 2)), geom = list("geom_point", "geom_path", "geom_path"), alpha = list(0.5, 0.5, 0.5), title = "DATA1", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) - if( ! is.null(tempo.graph$warnings)){ - warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) - } - if( ! is.null(data1.signif.dot)){ - if(graph.in.file == FALSE){ - fun_open(pdf.disp = FALSE) - } - tempo.graph <- fun_gg_scatter(data1 = list(data1, hframe, vframe, data1.signif.dot), x = list(x1, "x", "x", x1), y = list(y1, "y", "y", y1), categ = list("kind", "kind", "kind", "kind"), legend.name = list("DATASET", "HORIZ FRAME" , "VERT FRAME", "SIGNIF DOTS"), color = list(fun_gg_palette(2)[2], rep(hsv(h = c(0.1, 0.15), v = c(0.75, 1)), 2), rep(hsv(h = c(0.5, 0.6), v = c(0.9, 1)), 2), "black"), geom = list("geom_point", "geom_path", "geom_path", "geom_point"), alpha = list(0.5, 0.5, 0.5, 0.5), title = "DATA1 + DATA1 SIGNIFICANT DOTS", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) - if( ! is.null(tempo.graph$warnings)){ - warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) - } - }else{ - if(graph.in.file == FALSE){ - fun_open(pdf.disp = FALSE) - } - fun_gg_empty_graph(text = "NO PLOT\nBECAUSE\nNO DATA1 DOTS\nOUTSIDE THE FRAMES", text.size = 8, title = "DATA1 + DATA1 SIGNIFICANT DOTS") - } - if( ! is.null(data1.incon.dot)){ - if(graph.in.file == FALSE){ - fun_open(pdf.disp = FALSE) - } - tempo.graph <- fun_gg_scatter(data1 = list(data1, hframe, vframe, data1.incon.dot), x = list(x1, "x", "x", x1), y = list(y1, "y", "y", y1), categ = list("kind", "kind", "kind", "kind"), legend.name = list("DATASET", "HORIZ FRAME" , "VERT FRAME", "INCONSISTENT DOTS"), color = list(fun_gg_palette(2)[2], rep(hsv(h = c(0.1, 0.15), v = c(0.75, 1)), 2), rep(hsv(h = c(0.5, 0.6), v = c(0.9, 1)), 2), fun_gg_palette(7)[6]), geom = list("geom_point", "geom_path", "geom_path", "geom_point"), alpha = list(0.5, 0.5, 0.5, 0.5), title = "DATA1 + DATA1 INCONSISTENT DOTS", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) - if( ! is.null(tempo.graph$warnings)){ - warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) - } - }else{ - if(graph.in.file == FALSE){ - fun_open(pdf.disp = FALSE) - } - fun_gg_empty_graph(text = "NO PLOT\nBECAUSE\nNO DATA1\nINCONSISTENT DOTS", text.size = 8, title = "DATA1 + DATA1 INCONSISTENT DOTS") - } - if( ! is.null(data2)){ - if(graph.in.file == FALSE){ - fun_open(pdf.disp = FALSE) - } - tempo.graph <- fun_gg_scatter(data1 = list(data1, data2, hframe , vframe), x = list(x1, x2, "x", "x"), y = list(y1, y2, "y", "y"), categ = list("kind", "kind", "kind", "kind"), legend.name = list("DATASET", "DATASET", "HORIZ FRAME" , "VERT FRAME"), color = list(fun_gg_palette(2)[2], fun_gg_palette(2)[1], rep(hsv(h = c(0.1, 0.15), v = c(0.75, 1)), 2), rep(hsv(h = c(0.5, 0.6), v = c(0.9, 1)), 2)), geom = list("geom_point", "geom_point", "geom_path", "geom_path"), alpha = list(0.5, 0.5, 0.5, 0.5), title = "DATA1 + DATA2", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) - if( ! is.null(tempo.graph$warnings)){ - warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) - } - if( ! is.null(data2.signif.dot)){ - if(graph.in.file == FALSE){ - fun_open(pdf.disp = FALSE) - } - tempo.graph <- fun_gg_scatter(data1 = list(data1, data2, data2.signif.dot, hframe , vframe), x = list(x1, x2, x2, "x", "x"), y = list(y1, y2, y2, "y", "y"), categ = list("kind", "kind", "kind", "kind", "kind"), legend.name = list("DATASET", "DATASET", "SIGNIF DOTS", "HORIZ FRAME" , "VERT FRAME"), color = list(fun_gg_palette(2)[2], fun_gg_palette(2)[1], "black", rep(hsv(h = c(0.1, 0.15), v = c(0.75, 1)), 2), rep(hsv(h = c(0.5, 0.6), v = c(0.9, 1)), 2)), geom = list("geom_point", "geom_point", "geom_point", "geom_path", "geom_path"), alpha = list(0.5, 0.5, 0.5, 0.5, 0.5), title = "DATA1 + DATA2 + DATA2 SIGNIFICANT DOTS", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) - if( ! is.null(tempo.graph$warnings)){ - warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) - } - }else{ - if(graph.in.file == FALSE){ - fun_open(pdf.disp = FALSE) - } - fun_gg_empty_graph(text = "NO PLOT\nBECAUSE\nNO DATA2 DOTS\nOUTSIDE THE FRAMES", text.size = 8, title = "DATA1 + DATA2 + DATA2 SIGNIFICANT DOTS") - } - if( ! is.null(data2.incon.dot)){ - if(graph.in.file == FALSE){ - fun_open(pdf.disp = FALSE) - } - tempo.graph <- fun_gg_scatter(data1 = list(data1, data2, data2.incon.dot, hframe , vframe), x = list(x1, x2, x2, "x", "x"), y = list(y1, y2, y2, "y", "y"), categ = list("kind", "kind", "kind", "kind", "kind"), legend.name = list("DATASET", "DATASET", "INCONSISTENT DOTS", "HORIZ FRAME" , "VERT FRAME"), color = list(fun_gg_palette(2)[2], fun_gg_palette(2)[1], fun_gg_palette(7)[6], rep(hsv(h = c(0.1, 0.15), v = c(0.75, 1)), 2), rep(hsv(h = c(0.5, 0.6), v = c(0.9, 1)), 2)), geom = list("geom_point", "geom_point", "geom_point", "geom_path", "geom_path"), alpha = list(0.5, 0.5, 0.5, 0.5, 0.5), title = "DATA1 + DATA2 + DATA2 INCONSISTENT DOTS", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) - if( ! is.null(tempo.graph$warnings)){ - warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) - } - }else{ - if(graph.in.file == FALSE){ - fun_open(pdf.disp = FALSE) - } - fun_gg_empty_graph(text = "NO PLOT\nBECAUSE\nNO DATA2\nINCONSISTENT DOTS", text.size = 8, title = "DATA2 + DATA2 INCONSISTENT DOTS") - } - if( ! is.null(data2.unknown.dot)){ - if(graph.in.file == FALSE){ - fun_open(pdf.disp = FALSE) - } - tempo.graph <- fun_gg_scatter(data1 = list(data1, data2, data2.unknown.dot, hframe , vframe), x = list(x1, x2, x2, "x", "x"), y = list(y1, y2, y2, "y", "y"), categ = list("kind", "kind", "kind", "kind", "kind"), legend.name = list("DATASET", "DATASET", "UNKNOWN DOTS", "HORIZ FRAME" , "VERT FRAME"), color = list(fun_gg_palette(2)[2], fun_gg_palette(2)[1], fun_gg_palette(7)[5], rep(hsv(h = c(0.1, 0.15), v = c(0.75, 1)), 2), rep(hsv(h = c(0.5, 0.6), v = c(0.9, 1)), 2)), geom = list("geom_point", "geom_point", "geom_point", "geom_path", "geom_path"), alpha = list(0.5, 0.5, 0.5, 0.5, 0.5), title = "DATA1 + DATA2 + DATA2 UNKNOWN DOTS", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) - - if( ! is.null(tempo.graph$warnings)){ - warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) - } - }else{ - if(graph.in.file == FALSE){ - fun_open(pdf.disp = FALSE) - } - fun_gg_empty_graph(text = "NO PLOT\nBECAUSE\nNO DATA2\nUNKNOWN DOTS", text.size = 12, title = "DATA2 + DATA2 UNKNOWN DOTS") - } - } - }else if(( ! is.null(x.range.split)) & is.null(y.range.split)){ - if(graph.in.file == FALSE){ - fun_open(pdf.disp = FALSE) - } - tempo.graph <- fun_gg_scatter(data1 = list(data1, hframe), x = list(x1, "x"), y = list(y1, "y"), categ = list("kind", "kind"), legend.name = list("DATASET", "HORIZ FRAME"), color = list(fun_gg_palette(2)[2], rep(hsv(h = c(0.1, 0.15), v = c(0.75, 1)), 2)), geom = list("geom_point", "geom_path"), alpha = list(0.5, 0.5), title = "DATA1", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) - if( ! is.null(tempo.graph$warnings)){ - warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) - } - if( ! is.null(data1.signif.dot)){ - if(graph.in.file == FALSE){ - fun_open(pdf.disp = FALSE) - } - tempo.graph <- fun_gg_scatter(data1 = list(data1, hframe, data1.signif.dot), x = list(x1, "x", x1), y = list(y1, "y", y1), categ = list("kind", "kind", "kind"), legend.name = list("DATASET", "HORIZ FRAME", "SIGNIF DOTS"), color = list(fun_gg_palette(2)[2], rep(hsv(h = c(0.1, 0.15), v = c(0.75, 1)), 2), "black"), geom = list("geom_point", "geom_path", "geom_point"), alpha = list(0.5, 0.5, 0.5), title = "DATA1 + DATA1 SIGNIFICANT DOTS", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) - if( ! is.null(tempo.graph$warnings)){ - warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) - } - }else{ - if(graph.in.file == FALSE){ - fun_open(pdf.disp = FALSE) - } - fun_gg_empty_graph(text = "NO PLOT\nBECAUSE\nNO DATA1 DOTS\nOUTSIDE THE FRAMES", text.size = 8, title = "DATA1 + DATA1 SIGNIFICANT DOTS") - } - if( ! is.null(data1.incon.dot)){ - if(graph.in.file == FALSE){ - fun_open(pdf.disp = FALSE) - } - tempo.graph <- fun_gg_scatter(data1 = list(data1, hframe, data1.incon.dot), x = list(x1, "x", x1), y = list(y1, "y", y1), categ = list("kind", "kind", "kind"), legend.name = list("DATASET", "HORIZ FRAME", "INCONSISTENT DOTS"), color = list(fun_gg_palette(2)[2], rep(hsv(h = c(0.1, 0.15), v = c(0.75, 1)), 2), fun_gg_palette(7)[6]), geom = list("geom_point", "geom_path", "geom_point"), alpha = list(0.5, 0.5, 0.5), title = "DATA1 + DATA1 INCONSISTENT DOTS", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) - if( ! is.null(tempo.graph$warnings)){ - warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) - } - }else{ - if(graph.in.file == FALSE){ - fun_open(pdf.disp = FALSE) - } - fun_gg_empty_graph(text = "NO PLOT\nBECAUSE\nNO DATA1\nINCONSISTENT DOTS", text.size = 8, title = "DATA1 + DATA1 INCONSISTENT DOTS") - } - if( ! is.null(data2)){ - if(graph.in.file == FALSE){ - fun_open(pdf.disp = FALSE) - } - tempo.graph <- fun_gg_scatter(data1 = list(data1, data2, hframe), x = list(x1, x2, "x"), y = list(y1, y2, "y"), categ = list("kind", "kind", "kind"), legend.name = list("DATASET", "DATASET", "HORIZ FRAME"), color = list(fun_gg_palette(2)[2], fun_gg_palette(2)[1], rep(hsv(h = c(0.1, 0.15), v = c(0.75, 1)), 2)), geom = list("geom_point", "geom_point", "geom_path"), alpha = list(0.5, 0.5, 0.5), title = "DATA1 + DATA2", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) - if( ! is.null(tempo.graph$warnings)){ - warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) - } - if( ! is.null(data2.signif.dot)){ - if(graph.in.file == FALSE){ - fun_open(pdf.disp = FALSE) - } - tempo.graph <- fun_gg_scatter(data1 = list(data1, data2, data2.signif.dot, hframe), x = list(x1, x2, x2, "x"), y = list(y1, y2, y2, "y"), categ = list("kind", "kind", "kind", "kind"), legend.name = list("DATASET", "DATASET", "SIGNIF DOTS", "HORIZ FRAME"), color = list(fun_gg_palette(2)[2], fun_gg_palette(2)[1], "black", rep(hsv(h = c(0.1, 0.15), v = c(0.75, 1)), 2)), geom = list("geom_point", "geom_point", "geom_point", "geom_path"), alpha = list(0.5, 0.5, 0.5, 0.5), title = "DATA1 + DATA2 + DATA2 SIGNIFICANT DOTS", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) - if( ! is.null(tempo.graph$warnings)){ - warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) - } - }else{ - if(graph.in.file == FALSE){ - fun_open(pdf.disp = FALSE) - } - fun_gg_empty_graph(text = "NO PLOT\nBECAUSE\nNO DATA2 DOTS\nOUTSIDE THE FRAMES", text.size = 8, title = "DATA1 + DATA2 + DATA2 SIGNIFICANT DOTS") - } - if( ! is.null(data2.incon.dot)){ - if(graph.in.file == FALSE){ - fun_open(pdf.disp = FALSE) - } - tempo.graph <- fun_gg_scatter(data1 = list(data1, data2, data2.incon.dot, hframe), x = list(x1, x2, x2, "x"), y = list(y1, y2, y2, "y"), categ = list("kind", "kind", "kind", "kind"), legend.name = list("DATASET", "DATASET", "INCONSISTENT DOTS", "HORIZ FRAME"), color = list(fun_gg_palette(2)[2], fun_gg_palette(2)[1], fun_gg_palette(7)[6], rep(hsv(h = c(0.1, 0.15), v = c(0.75, 1)), 2)), geom = list("geom_point", "geom_point", "geom_point", "geom_path"), alpha = list(0.5, 0.5, 0.5, 0.5), title = "DATA1 + DATA2 + DATA2 INCONSISTENT DOTS", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) - if( ! is.null(tempo.graph$warnings)){ - warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) - } - }else{ - if(graph.in.file == FALSE){ - fun_open(pdf.disp = FALSE) - } - fun_gg_empty_graph(text = "NO PLOT\nBECAUSE\nNO DATA2\nINCONSISTENT DOTS", text.size = 8, title = "DATA2 + DATA2 INCONSISTENT DOTS") - } - if( ! is.null(data2.unknown.dot)){ - if(graph.in.file == FALSE){ - fun_open(pdf.disp = FALSE) - } - tempo.graph <- fun_gg_scatter(data1 = list(data1, data2, data2.unknown.dot, hframe), x = list(x1, x2, x2, "x"), y = list(y1, y2, y2, "y"), categ = list("kind", "kind", "kind", "kind"), legend.name = list("DATASET", "DATASET", "UNKNOWN DOTS", "HORIZ FRAME"), color = list(fun_gg_palette(2)[2], fun_gg_palette(2)[1], fun_gg_palette(7)[5], rep(hsv(h = c(0.1, 0.15), v = c(0.75, 1)), 2)), geom = list("geom_point", "geom_point", "geom_point", "geom_path"), alpha = list(0.5, 0.5, 0.5, 0.5), title = "DATA1 + DATA2 + DATA2 UNKNOWN DOTS", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) - if( ! is.null(tempo.graph$warnings)){ - warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) - } - }else{ - if(graph.in.file == FALSE){ - fun_open(pdf.disp = FALSE) - } - fun_gg_empty_graph(text = "NO PLOT\nBECAUSE\nNO DATA2\nUNKNOWN DOTS", text.size = 8, title = "DATA2 + DATA2 UNKNOWN DOTS") - } - } - }else if(is.null(x.range.split) & ( ! is.null(y.range.split))){ - if(graph.in.file == FALSE){ - fun_open(pdf.disp = FALSE) - } - tempo.graph <- fun_gg_scatter(data1 = list(data1, vframe), x = list(x1, "x"), y = list(y1, "y"), categ = list("kind", "kind"), legend.name = list("DATASET", "VERT FRAME"), color = list(fun_gg_palette(2)[2], rep(hsv(h = c(0.5, 0.6), v = c(0.9, 1)), 2)), geom = list("geom_point", "geom_path"), alpha = list(0.5, 0.5), title = "DATA1", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) - if( ! is.null(tempo.graph$warnings)){ - warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) - } - if( ! is.null(data1.signif.dot)){ - if(graph.in.file == FALSE){ - fun_open(pdf.disp = FALSE) - } - tempo.graph <- fun_gg_scatter(data1 = list(data1, vframe, data1.signif.dot), x = list(x1, "x", x1), y = list(y1, "y", y1), categ = list("kind", "kind", "kind"), legend.name = list("DATASET", "VERT FRAME", "SIGNIF DOTS"), color = list(fun_gg_palette(2)[2], rep(hsv(h = c(0.5, 0.6), v = c(0.9, 1)), 2), "black"), geom = list("geom_point", "geom_path", "geom_point"), alpha = list(0.5, 0.5, 0.5), title = "DATA1 + DATA1 SIGNIFICANT DOTS", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) - if( ! is.null(tempo.graph$warnings)){ - warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) - } - }else{ - if(graph.in.file == FALSE){ - fun_open(pdf.disp = FALSE) - } - fun_gg_empty_graph(text = "NO PLOT\nBECAUSE\nNO DATA1 DOTS\nOUTSIDE THE FRAMES", text.size = 8, title = "DATA1 + DATA1 SIGNIFICANT DOTS") - } - if( ! is.null(data1.incon.dot)){ - if(graph.in.file == FALSE){ - fun_open(pdf.disp = FALSE) - } - tempo.graph <- fun_gg_scatter(data1 = list(data1, vframe, data1.incon.dot), x = list(x1, "x", x1), y = list(y1, "y", y1), categ = list("kind", "kind", "kind"), legend.name = list("DATASET", "VERT FRAME", "INCONSISTENT DOTS"), color = list(fun_gg_palette(2)[2], rep(hsv(h = c(0.5, 0.6), v = c(0.9, 1)), 2), fun_gg_palette(7)[6]), geom = list("geom_point", "geom_path", "geom_point"), alpha = list(0.5, 0.5, 0.5), title = "DATA1 + DATA1 INCONSISTENT DOTS", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) - if( ! is.null(tempo.graph$warnings)){ - warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) - } - }else{ - if(graph.in.file == FALSE){ - fun_open(pdf.disp = FALSE) - } - fun_gg_empty_graph(text = "NO PLOT\nBECAUSE\nNO DATA1\nINCONSISTENT DOTS", text.size = 8, title = "DATA1 + DATA1 INCONSISTENT DOTS") - } - if( ! is.null(data2)){ - if(graph.in.file == FALSE){ - fun_open(pdf.disp = FALSE) - } - tempo.graph <- fun_gg_scatter(data1 = list(data1, data2, vframe), x = list(x1, x2, "x"), y = list(y1, y2, "y"), categ = list("kind", "kind", "kind"), legend.name = list("DATASET", "DATASET", "VERT FRAME"), color = list(fun_gg_palette(2)[2], fun_gg_palette(2)[1], rep(hsv(h = c(0.5, 0.6), v = c(0.9, 1)), 2)), geom = list("geom_point", "geom_point", "geom_path"), alpha = list(0.5, 0.5, 0.5), title = "DATA1 + DATA2", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) - if( ! is.null(tempo.graph$warnings)){ - warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) - } - if( ! is.null(data2.signif.dot)){ - if(graph.in.file == FALSE){ - fun_open(pdf.disp = FALSE) - } - tempo.graph <- fun_gg_scatter(data1 = list(data1, data2, data2.signif.dot, vframe), x = list(x1, x2, x2, "x"), y = list(y1, y2, y2, "y"), categ = list("kind", "kind", "kind", "kind"), legend.name = list("DATASET", "DATASET", "SIGNIF DOTS", "VERT FRAME"), color = list(fun_gg_palette(2)[2], fun_gg_palette(2)[1], "black", rep(hsv(h = c(0.5, 0.6), v = c(0.9, 1)), 2)), geom = list("geom_point", "geom_point", "geom_point", "geom_path"), alpha = list(0.5, 0.5, 0.5, 0.5), title = "DATA1 + DATA2 + DATA2 SIGNIFICANT DOTS", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) - if( ! is.null(tempo.graph$warnings)){ - warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) - } - }else{ - if(graph.in.file == FALSE){ - fun_open(pdf.disp = FALSE) - } - fun_gg_empty_graph(text = "NO PLOT\nBECAUSE\nNO DATA2 DOTS\nOUTSIDE THE FRAMES", text.size = 8, title = "DATA1 + DATA2 + DATA2 SIGNIFICANT DOTS") - } - if( ! is.null(data2.incon.dot)){ - if(graph.in.file == FALSE){ - fun_open(pdf.disp = FALSE) - } - tempo.graph <- fun_gg_scatter(data1 = list(data1, data2, data2.incon.dot, vframe), x = list(x1, x2, x2, "x"), y = list(y1, y2, y2, "y"), categ = list("kind", "kind", "kind", "kind"), legend.name = list("DATASET", "DATASET", "INCONSISTENT DOTS", "VERT FRAME"), color = list(fun_gg_palette(2)[2], fun_gg_palette(2)[1], fun_gg_palette(7)[6], rep(hsv(h = c(0.5, 0.6), v = c(0.9, 1)), 2)), geom = list("geom_point", "geom_point", "geom_point", "geom_path"), alpha = list(0.5, 0.5, 0.5, 0.5), title = "DATA1 + DATA2 + DATA2 INCONSISTENT DOTS", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) - if( ! is.null(tempo.graph$warnings)){ - warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) - } - }else{ - if(graph.in.file == FALSE){ - fun_open(pdf.disp = FALSE) - } - fun_gg_empty_graph(text = "NO PLOT\nBECAUSE\nNO DATA2\nINCONSISTENT DOTS", text.size = 8, title = "DATA2 + DATA2 INCONSISTENT DOTS") - } - if( ! is.null(data2.unknown.dot)){ - if(graph.in.file == FALSE){ - fun_open(pdf.disp = FALSE) - } - tempo.graph <- fun_gg_scatter(data1 = list(data1, data2, data2.unknown.dot, vframe), x = list(x1, x2, x2, "x"), y = list(y1, y2, y2, "y"), categ = list("kind", "kind", "kind", "kind"), legend.name = list("DATASET", "DATASET", "UNKNOWN DOTS", "VERT FRAME"), color = list(fun_gg_palette(2)[2], fun_gg_palette(2)[1], fun_gg_palette(7)[5], rep(hsv(h = c(0.5, 0.6), v = c(0.9, 1)), 2)), geom = list("geom_point", "geom_point", "geom_point", "geom_path"), alpha = list(0.5, 0.5, 0.5, 0.5), title = "DATA1 + DATA2 + DATA2 UNKNOWN DOTS", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) - if( ! is.null(tempo.graph$warnings)){ - warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) - } - }else{ - if(graph.in.file == FALSE){ - fun_open(pdf.disp = FALSE) - } - fun_gg_empty_graph(text = "NO PLOT\nBECAUSE\nNO DATA2\nUNKNOWN DOTS", text.size = 8, title = "DATA2 + DATA2 UNKNOWN DOTS") - } - } - } - } - # end plot - if(warn.print == TRUE & ! is.null(warning)){ - warning(warning) - } - tempo.list <- list(data1.removed.row.nb = data1.removed.row.nb, data1.removed.rows = data1.removed.rows, data2.removed.row.nb = data2.removed.row.nb, data2.removed.rows = data2.removed.rows, hframe = hframe, vframe = vframe, data1.signif.dot = data1.signif.dot, data1.non.signif.dot = data1.non.signif.dot, data1.inconsistent.dot = data1.incon.dot, data2.signif.dot = data2.signif.dot, data2.non.signif.dot = data2.non.signif.dot, data2.unknown.dot = data2.unknown.dot, data2.inconsistent.dot = data2.incon.dot, axes = axes, warnings = warning) - return(tempo.list) +# end required function checking +# argument checking +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_check(data = angle, class = "integer", length = 1, double.as.integer.allowed = TRUE, neg.values = TRUE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = axis, options = c("x", "y"), length = 1, fun.name = function.name) ; eval(ee) +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_check() +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() +# end argument checking +# main code +# to get angle between -360 and 360 +while(angle > 360){ +angle <- angle - 360 +} +while(angle < -360){ +angle <- angle + 360 +} +# end to get angle between -360 and 360 +# justifications +if(axis == "x"){ +if(angle == -360 | angle == -180 | angle == 0 | angle == 180 | angle == 360){ +hjust <- 0.5 +vjust <- 0.5 +}else if(angle == -270 | angle == 90){ +hjust <- 1 +vjust <- 0.5 +}else if(angle == -90 | angle == 270){ +hjust <- 0 +vjust <- 0.5 +}else if((angle > -360 & angle < -270) | (angle > 0 & angle < 90)){ +hjust <- 1 +vjust <- 1 +}else if((angle > -270 & angle < -180) | (angle > 90 & angle < 180)){ +hjust <- 1 +vjust <- 0 +}else if((angle > -180 & angle < -90) | (angle > 180 & angle < 270)){ +hjust <- 0 +vjust <- 0 +}else if((angle > -90 & angle < 0) | (angle > 270 & angle < 360)){ +hjust <- 0 +vjust <- 1 +} +}else if(axis == "y"){ +if(angle == -270 | angle == -90 | angle == 90 | angle == 270){ +hjust <- 0.5 +vjust <- 0.5 +}else if(angle == -360 | angle == 0 | angle == 360){ +hjust <- 1 +vjust <- 0.5 +}else if(angle == -180 | angle == 180){ +hjust <- 0 +vjust <- 0.5 +}else if((angle > -360 & angle < -270) | (angle > 0 & angle < 90)){ +hjust <- 1 +vjust <- 0 +}else if((angle > -270 & angle < -180) | (angle > 90 & angle < 180)){ +hjust <- 0 +vjust <- 0 +}else if((angle > -180 & angle < -90) | (angle > 180 & angle < 270)){ +hjust <- 0 +vjust <- 1 +}else if((angle > -90 & angle < 0) | (angle > 270 & angle < 360)){ +hjust <- 1 +vjust <- 1 +} +} +# end justifications +output <- list(angle = angle, hjust = hjust, vjust = vjust) +return(output) } -################ Import +######## fun_gg_point_rast() #### ggplot2 raster scatterplot layer -######## fun_pack() #### check if R packages are present and import into the working environment + # Check OK: clear to go Apollo -fun_pack <- function(req.package, load = FALSE, path.lib = NULL){ - # AIM - # check if the specified R packages are present in the computer and import them into the working environment - # ARGUMENTS - # req.package: character vector of package names to import - # req.package: logical. Load the package into the environement (using library())? - # path.lib: optional character vector specifying the absolute pathways of the directories containing some of the listed packages - # REQUIRED PACKAGES - # none - # REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION - # fun_check() - # RETURN - # nothing - # EXAMPLES - # fun_pack(req.package = "nopackage") - # fun_pack(req.package = "ggplot2") - # fun_pack(req.package = "ggplot2", path.lib = "blablabla") - # DEBUGGING - # req.package = "ggplot2" ; path.lib = "C:/Program Files/R/R-3.5.1/library" - # req.package = "serpentine" ; path.lib = "C:/users/gael/appdata/roaming/python/python36/site-packages" - # function name - function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") - # end function name - # required function checking - if(length(find("fun_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_check(data = req.package, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = load, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) - if( ! is.null(path.lib)){ - tempo <- fun_check(data = path.lib, class = "character", fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & ! all(dir.exists(path.lib))){ - cat(paste0("\n\n============\n\nERROR IN ", function.name, ": \nDIRECTORY PATH INDICATED IN THE path.lib PARAMETER DOES NOT EXISTS: ", path.lib, "\n\n============\n\n")) - arg.check <- c(arg.check, TRUE) - } - } - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_check() - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() - # end argument checking - # main code - if(is.null(path.lib)){ - path.lib <- .libPaths() # .libPaths(new = path.lib) # or .libPaths(new = c(.libPaths(), path.lib)) - }else{ - .libPaths(new = sub(x = path.lib, pattern = "/$|\\\\$", replacement = "")) # .libPaths(new = ) add path to default path. BEWARE: .libPaths() does not support / at the end of a submitted path. Thus check and replace last / or \\ in path - } - for(i0 in 1:length(req.package)){ - if( ! req.package[i0] %in% rownames(installed.packages(lib.loc = path.lib))){ - stop(paste0("\n\n================\n\nERROR IN ", function.name, ": PACKAGE ", req.package[i0], " MUST BE INSTALLED IN:\n", paste(path.lib, collapse = "\n"), "\n\n================\n\n")) - }else{ - if(load == TRUE){ - suppressWarnings(suppressPackageStartupMessages(library(req.package[i0], lib.loc = path.lib, quietly = TRUE, character.only = TRUE))) - } - } - } +fun_gg_point_rast <- function(data = NULL, mapping = NULL, stat = "identity", position = "identity", ..., na.rm = FALSE, show.legend = NA, inherit.aes = TRUE, raster.width = NULL, raster.height = NULL, raster.dpi = 300, inactivate = TRUE, path.lib = NULL){ +# AIM +# equivalent to ggplot2::geom_point() but in raster mode +# use it like ggplot2::geom_point() with the main raster.dpi additional argument +# WARNINGS +# can be long to generate the plot +# use a square plot region. Otherwise, the dots will have ellipsoid shape +# solve the transparency problems with some GUI +# this function is derived from the geom_point_rast() function, created by VPetukhov, and present in the ggrastr package (https://rdrr.io/github/VPetukhov/ggrastr/src/R/geom-point-rast.R). Has been placed here to minimize package dependencies +# ARGUMENTS +# classical arguments of geom_point(), shown here https://rdrr.io/github/VPetukhov/ggrastr/man/geom_point_rast.html +# raster.width : width of the result image (in inches). Default: deterined by the current device parameters +# raster.height: height of the result image (in inches). Default: deterined by the current device parameters +# raster.dpi: resolution of the result image +# inactivate: logical. Inactivate the fun.name argument of the fun_check() function? If TRUE, the name of the fun_check() function in error messages coming from this function. Use TRUE if fun_gg_point_rast() is used like this: eval(parse(text = "fun_gg_point_rast")) +# path.lib: absolute path of the required packages, if not in the default folders +# REQUIRED PACKAGES +# ggplot2 +# grid +# Cairo +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_check() +# fun_pack() +# RETURN +# a raster scatter plot +# EXAMPLES +# Two pdf in the current directory +# set.seed(1) ; data1 = data.frame(x = rnorm(100000), y = rnorm(10000)) ; fun_open(pdf.name.file = "Raster") ; ggplot2::ggplot() + fun_gg_point_rast(data = data1, mapping = ggplot2::aes(x = x, y = y)) ; fun_open(pdf.name.file = "Vectorial") ; ggplot2::ggplot() + ggplot2::geom_point(data = data1, mapping = ggplot2::aes(x = x, y = y)) ; dev.off() ; dev.off() +# DEBUGGING +# +# function name +if(all(inactivate == FALSE)){ # inactivate has to be used here but will be fully checked below +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +}else if(all(inactivate == TRUE)){ +function.name <- NULL +}else{ +tempo.cat <- (paste0("\n\n============\n\nERROR IN fun_gg_point_rast(): CODE INCONSISTENCY 1\n\n============\n\n")) +stop(tempo.cat) +} +# end function name +# required function checking +if(length(find("fun_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_pack", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_pack() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +if( ! is.null(data)){ +tempo <- fun_check(data = data, class = "data.frame", na.contain = TRUE, fun.name = function.name) ; eval(ee) +} +if( ! is.null(mapping)){ +tempo <- fun_check(data = mapping, class = "uneval", typeof = "list", fun.name = function.name) ; eval(ee) # aes() is tested +} +# stat and position not tested because too complicate +tempo <- fun_check(data = na.rm, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = show.legend, class = "vector", mode = "logical", length = 1, na.contain = TRUE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = inherit.aes, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(raster.width)){ +tempo <- fun_check(data = raster.width, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +} +if( ! is.null(raster.height)){ +tempo <- fun_check(data = raster.height, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +} +tempo <- fun_check(data = raster.dpi, class = "integer", length = 1, double.as.integer.allowed = TRUE, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = inactivate, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(path.lib)){ +tempo <- fun_check(data = path.lib, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! all(dir.exists(path.lib))){ +cat(paste0("\n\n============\n\nERROR IN ", function.name, ": \nDIRECTORY PATH INDICATED IN THE path.lib PARAMETER DOES NOT EXISTS: ", path.lib, "\n\n============\n\n")) +arg.check <- c(arg.check, TRUE) +} +} +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_check() +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() +# end argument checking +# package checking +fun_pack(req.package = c("ggplot2"), path.lib = path.lib) +fun_pack(req.package = c("grid"), path.lib = path.lib) +fun_pack(req.package = c("Cairo"), path.lib = path.lib) +# end package checking +# additional functions +DrawGeomPointRast <- function(data, panel_params, coord, na.rm = FALSE, raster.width = NULL, raster.height= NULL, raster.dpi = 300){ +if (is.null(raster.width)){ +raster.width <- par('fin')[1] +} +if (is.null(raster.height)){ + raster.height <- par('fin')[2] +} +prev_dev_id <- dev.cur() +p <- ggplot2::GeomPoint$draw_panel(data, panel_params, coord) +dev_id <- Cairo::Cairo(type='raster', width = raster.width*raster.dpi, height = raster.height*raster.dpi, dpi = raster.dpi, units = 'px', bg = "transparent")[1] +grid::pushViewport(grid::viewport(width = 1, height = 1)) +grid::grid.points(x = p$x, y = p$y, pch = p$pch, size = p$size, +name = p$name, gp = p$gp, vp = p$vp, draw = T) +grid::popViewport() +cap <- grid::grid.cap() +dev.off(dev_id) +dev.set(prev_dev_id) +grid::rasterGrob(cap, x = 0, y = 0, width = 1, height = 1, default.units = "native", just = c("left","bottom")) +} +# end additional functions +# main code +GeomPointRast <- ggplot2::ggproto("GeomPointRast", ggplot2::GeomPoint, draw_panel = DrawGeomPointRast) +ggplot2::layer( +data = data, +mapping = mapping, +stat = stat, +geom = GeomPointRast, +position = position, +show.legend = show.legend, +inherit.aes = inherit.aes, +params = list( +na.rm = na.rm, +raster.width = raster.width, +raster.height = raster.height, +raster.dpi = raster.dpi, +... +) +) +# end main code } -######## fun_python_pack() #### check if python packages are present +######## fun_gg_scatter() #### ggplot2 scatterplot + lines (up to 6 overlays totally) # Check OK: clear to go Apollo -fun_python_pack <- function(req.package, path.lib = NULL, R.path.lib = NULL){ - # AIM - # check if the specified python packages are present in the computer (no import) - # ARGUMENTS - # req.package: character vector of package names to import - # path.lib: optional character vector specifying the absolute pathways of the directories containing some of the listed packages in the req.package argument - # R.path.lib: absolute path of the reticulate packages, if not in the default folders - # REQUIRED PACKAGES - # reticulate - # REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION - # fun_check() - # fun_pack() - # RETURN - # nothing - # EXAMPLES - # fun_python_pack(req.package = "nopackage") - # fun_python_pack(req.package = "serpentine", path.lib = "c:/programdata/anaconda3/lib/site-packages/") - # fun_python_pack(req.package = "serpentine", path.lib = "blablabla") - # DEBUGGING - # req.package = "serpentine" ; path.lib = "c:/programdata/anaconda3/lib/site-packages/" ; R.path.lib = NULL - # req.package = "bad" ; path.lib = NULL ; R.path.lib = NULL - # function name - function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") - # end function name - # required function checking - if(length(find("fun_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - if(length(find("fun_pack", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_pack() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_check(data = req.package, class = "character", fun.name = function.name) ; eval(ee) - if( ! is.null(path.lib)){ - tempo <- fun_check(data = path.lib, class = "character", fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & ! all(dir.exists(path.lib))){ - cat(paste0("\n\n============\n\nERROR IN ", function.name, ": \nDIRECTORY PATH INDICATED IN THE path.lib PARAMETER DOES NOT EXISTS: ", path.lib, "\n\n============\n\n")) - arg.check <- c(arg.check, TRUE) - } - } - if( ! is.null(R.path.lib)){ - tempo <- fun_check(data = R.path.lib, class = "character", fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & ! all(dir.exists(R.path.lib))){ - cat(paste0("\n\n============\n\nERROR IN ", function.name, ": \nDIRECTORY PATH INDICATED IN THE R.path.lib PARAMETER DOES NOT EXISTS: ", R.path.lib, "\n\n============\n\n")) - arg.check <- c(arg.check, TRUE) - } - } - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_check() - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() - # end argument checking - # package checking - fun_pack(req.package = "reticulate", path.lib = R.path.lib) - # end package checking - # main code - if(is.null(path.lib)){ - path.lib <- reticulate::py_run_string(" -import sys ; -path_lib = sys.path -") # python string - path.lib <- path.lib$path_lib - } - for(i0 in 1:length(req.package)){ - tempo.try <- vector("list", length = length(path.lib)) - for(i1 in 1:length(path.lib)){ - tempo.try[[i1]] <- suppressWarnings(try(reticulate::import_from_path(req.package[i0], path = path.lib[i1]), silent = TRUE)) - tempo.try[[i1]] <- suppressWarnings(try(reticulate::import_from_path(req.package[i0], path = path.lib[i1]), silent = TRUE)) # done twice to avoid the error message about flushing present the first time but not the second time. see https://stackoverflow.com/questions/57357001/reticulate-1-13-error-in-sysstdoutflush-attempt-to-apply-non-function - } - if(all(sapply(tempo.try, FUN = grepl, pattern = "[Ee]rror"))){ - stop(paste0("\n\n================\n\nERROR IN ", function.name, ": PACKAGE ", req.package[i0], " MUST BE INSTALLED IN THE MENTIONNED DIRECTORY:\n", paste(path.lib, collapse = "\n"), "\n\n================\n\n")) - }else{ - # suppressWarnings(suppressPackageStartupMessages(assign(req.package[i0], reticulate::import(req.package[i0])))) # not required because try() already evaluates - } - } +fun_gg_scatter <- function(data1, x, y, categ = NULL, legend.name = NULL, color = NULL, geom = "geom_point", alpha = 0.5, dot.size = 2, line.size = 0.5, xlim = NULL, xlab = NULL, xlog = "no", x.tick.nb = NULL, x.inter.tick.nb = NULL, x.left.extra.margin = 0.05, x.right.extra.margin = 0.05, ylim = NULL, ylab = NULL, ylog = "no", y.tick.nb = NULL, y.inter.tick.nb = NULL, y.top.extra.margin = 0.05, y.bottom.extra.margin = 0.05, xy.include.zero = FALSE, text.size = 12, title = "", title.text.size = 12, show.legend = TRUE, classic = FALSE, grid = FALSE, raster = FALSE, vectorial.limit = NULL, return = FALSE, plot = TRUE, add = NULL, warn.print = FALSE, path.lib = NULL){ +# AIM +# ggplot2 scatterplot with the possibility to overlay dots from up to 3 different data frames and lines from up to 3 different data frames (up to 6 overlays totally) +# for ggplot2 specifications, see: https://ggplot2.tidyverse.org/articles/ggplot2-specs.html +# WARNINGS +# rows containing NA in data1[, c(y, categ)] will be removed before processing, with a warning (see below) +# ARGUMENTS +# data1: a dataframe compatible with ggplot, or a list of data frames +# x: character string or list of character string (one compartment for each list compartment of data1) of the data1 column name for x-axis. write NULL for each "geom_hline" in geom argument +# y: character string or list of character string (one compartment for each list compartment of data1) of the data1 column name for y-axis. Write NULL for each "geom_vline" in geom argument +# categ: character string or list of character string (one compartment for each list compartment of data1) of the data1 column name for categories. If categ = NULL, no categories (no legend). Some of the list compartments can be NULL, and other not +# legend.name: character string list of character string (one compartment for each list compartment of data1) of the legend title. If legend.name = NULL and categ != NULL, then legend.name <- categ. Some of the list compartments can be NULL, and other not +# color: vector of character string or list of character vectors (one compartment for each list compartment of data1) for the colors of categ arguments. If color = NULL, default colors of ggplot2. If non null, it can be either: (1) a single color string (all the dots of the corresponding data1 will have this color, whatever categ NULL or not), (2) if categ non null, a vector of string colors, one for each class of categ (each color will be associated according to the alphabetical order of categ classes), (3) if categ non null, a vector or factor of string colors, like if it was one of the column of data1 data frame (beware: a single color per class of categ and a single class of categ per color must be respected). Integers are also accepted instead of character strings, as long as above rules about length are respected. Integers will be processed by fun_gg_palette() using the max integer value among all the integers in color. If color is a list, some of the compartments can be NULL. In that case, a different grey color will be used for each NULL compartment +# geom: character string or list of character string (one compartment for each list compartment of data1) for the kind of plot. Either "geom_point" (scatterplot), "geom_line" (coordinates plotted then line connection from the lowest to highest coordinates), "geom_path" (line connection respecting the order in data1), "geom_hline" (horizontal line) or "geom_vline" (vertical line). BEWARE: for "geom_hline" or "geom_vline", (1) x or y argument must be NULL, respectively, (2) xlim or ylim argument must NOT be NULL, respectively, if only these kind of lines are drawn (if other geom present, then xlim = NULL and ylim = NULL will generate xlim and ylim defined by these other geom, which is not possible with "geom_hline" or "geom_vline"), (3) the function will draw n lines for n values in the x argument column name of the data1 data frame. If several colors required, the categ argument must be specified and the corresponding categ column name must exist in the data1 data frame with a different class name for each row +# alpha: numeric value (from 0 to 1) of the transparency or list of numeric values (one compartment for each list compartment of data1) +# dot.size: numeric value of point size +# line.size: numeric value of line size +# xlim: 2 numeric values for x-axis range. If NULL, range of x in data1. Order of the 2 values matters (for inverted axis). BEWARE: values of the xlim must be already in the corresponding log if xlog argument is not "no" (see below) +# xlab: a character string or expression for x-axis legend. If NULL, x of the first data frame in data1. Warning message if the elements in x are different between data frames in data1 +# xlog: Either "no" (values in the x argument column of the data1 data frame are not log), "log2" (values in the x argument column of the data1 data frame are log2 transformed) or "log10" (values in the x argument column of the data1 data frame are log10 transformed). BEWARE: do not tranform the data, but just display ticks in a log scale manner. Thus, negative or zero values allowed. BEWARE: not possible to have horizontal bars with a log axis, due to a bug in ggplot2 (see https://github.com/tidyverse/ggplot2/issues/881) +# x.tick.nb: approximate number of desired label values on the x-axis (n argument of the the fun_scale() function) +# x.inter.tick.nb: number of desired secondary ticks between main ticks. Not considered if xlog is other than "no". In that case, play with the xlim and x.tick.nb arguments +# x.left.extra.margin: single proportion (between 0 and 1) indicating if extra margins must be added to xlim. If different from 0, add the range of the axis * x.left.extra.margin (e.g., abs(xlim[2] - xlim[1]) * x.left.extra.margin) to the left of x-axis +# x.right.extra.margin: idem as x.left.extra.margin but to the bottom of x-axis +# ylim: 2 numeric values for y-axis range. If NULL, range of y in data1. Order of the 2 values matters (for inverted axis). BEWARE: values of the ylim must be already in the corresponding log if ylog argument is not "no" (see below) +# ylab: a character string or expression for y-axis legend. If NULL, y of the first data frame in data1. Warning message if the elements in y are different between data frames in data1 +# ylog: Either "no" (values in the y argument column of the data1 data frame are not log), "log2" (values in the y argument column of the data1 data frame are log2 transformed) or "log10" (values in the y argument column of the data1 data frame are log10 transformed). BEWARE: do not tranform the data, but just display ticks in a log scale manner. Thus, negative or zero values allowed. BEWARE: not possible to have horizontal bars with a log axis, due to a bug in ggplot2 (see https://github.com/tidyverse/ggplot2/issues/881) +# y.tick.nb: approximate number of desired label values on the y-axis (n argument of the the fun_scale() function) +# y.inter.tick.nb: number of desired secondary ticks between main ticks. Not considered if ylog is other than "no". In that case, play with the ylim and y.tick.nb arguments +# y.top.extra.margin: single proportion (between 0 and 1) indicating if extra margins must be added to ylim. If different from 0, add the range of the axis * y.top.extra.margin (e.g., abs(ylim[2] - ylim[1]) * y.top.extra.margin) to the top of y-axis +# xy.include.zero: logical. Does xlim and ylim range include 0? Ok even if xlog = TRUE or ylog = TRUE because xlim and ylim must already be log transformed values +# text.size: numeric value of the size of the (1) axis numbers and axis legends and (2) texts in the graphic legend +# title: character string of the graph title +# title.text.size: numeric value of the title size (in points) +# show.legend: logical. Show legend? Not considered if categ argument is NULL, because this already generate no legend +# classic: logical. Use the classic theme (article like)? +# grid: logical. Draw horizontal and vertical lines in the background to better read the values? Not considered if classic = FALSE +# raster: logical. Dots in raster mode? If FALSE, dots from each geom_point from geom argument are in vectorial mode (bigger pdf and long to display if millions of dots). If TRUE, dots from each geom_point from geom argument are in matricial mode (smaller pdf and easy display if millions of dots, but long to generate the layer). If TRUE, the plot region will be square to avoid a bug in fun_gg_point_rast(). If TRUE, solve the transparency problem with some GUI. Overriden by vectorial.limit if non NULL +# vectorial.limit: positive integer value indicating the limit of the dot number above which geom_point from geom argument switch from vectorial mode to raster mode (see the raster argument). If any layer is raster, then the region plot will be square to avoid a bug in fun_gg_point_rast(). Inactive the raster argument if non NULL +# return: logical. Return the graph info? +# plot: logical. Plot the graphic? If FALSE and return argument is TRUE, graphical parameters and associated warnings are provided without plotting +# add: character string allowing to add more ggplot2 features (dots, lines, themes, etc.). BEWARE: (1) must start with "+" just after the simple or double opening quote (no space, end of line, carriage return, etc., allowed), (2) must finish with ")" just before the simple or double closing quote (no space, end of line, carriage return, etc., allowed) and (3) each function must be preceded by "ggplot2::" (for instance: "ggplot2::coord_flip()). If the character string contains the "ggplot2::theme" string, then internal ggplot2 theme() and theme_classic() functions will be inactivated to be reused by add. BEWARE: handle this argument with caution since added functions can create conflicts with the preexisting internal ggplot2 functions +# warn.print: logical. Print warnings at the end of the execution? No print if no warning messages +# path.lib: absolute path of the required packages, if not in the default folders +# REQUIRED PACKAGES +# ggplot2 +# if raster plots are drawn (see the raster and vectorial.limit arguments): +# Cairo +# grid +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_gg_palette() +# fun_gg_point_rast() +# fun_pack() +# fun_check() +# RETURN +# a scatter plot is plot argument is TRUE +# a list of the graph info if return argument is TRUE: +# $data: the graphic info coordinates +# $removed.row.nb: a list of the removed rows numbers in data frames (because of NA). NULL if no row removed +# $removed.rows: a list of the removed rows in data frames (because of NA). NULL if no row removed +# $axes: the x-axis and y-axis info +# $warnings: the warning messages. Use cat() for proper display. NULL if no warning +# EXAMPLES +## NICE REPRESENTATION +# set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 10, 3), time = rnorm(1000, 10, 3), group1 = rep(c("A1", "A2"), 500)) ; obs2 <-data.frame(km = rnorm(1000, 15, 3), time = rnorm(1000, 15, 3), group2 = rep(c("G1", "G2"), 500)) ; set.seed(NULL) ; obs1$L1$km[2:3] <- NA ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), categ = list(L1 = "group1", L2 = "group2"), legend.name = NULL, color = list(L1 = 4:5, L2 = 7:8), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5), dot.size = 3, line.size = 0.5, xlim = c(1, 25), xlab = "KM", xlog = "no", x.tick.nb = 10, x.inter.tick.nb = 1, x.left.extra.margin = 0, x.right.extra.margin = 0, ylim = c(1, 25), ylab = expression(paste("TIME (", 10^-20, " s)")), ylog = "log10", y.tick.nb = 5, y.top.extra.margin = 0, y.bottom.extra.margin = 0, xy.include.zero = TRUE, classic = TRUE) +## SINGLE GEOMETRIC LAYER +### simple example (1) of scatter plot using the classical writting +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time") +### simple example (2) of scatter plot, identical to (1) but using the list writting. Here, a list of one compartment, systematically named L1, is provided to the data1, x, y, categ, geom and alpha. Contrary to example (1), the geom and alpha argument have to be included because the default value are not lists (if data1 is a list, all the x, y, categ, legend.name, color, geom and alpha must also be list if non NULL) +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = list(L1 = obs1), x = list(L1 = "km"), y = list(L1 = "time"), geom = list(L1 = "geom_point"), alpha = list(L1 = 0.5)) +### color of dots. Example (1) using the classical writting +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", color = "blue") +### color of dots. Example (2) using the list writting +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = list(L1 = obs1), x = list(L1 = "km"), y = list(L1 = "time"), color = list(L1 = "blue"), geom = list(L1 = "geom_point"), alpha = list(L1 = 1)) +### From here, classical writting is use for single element in data1 and list writting otherwise +### color of dots. Example (3) when dots are in different categories. Note that categ argument controls the legend display +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", categ = "group") +### color of dots. Example (4) when dots are in different categories. A single color mentionned is applied to all the dots +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", categ = "group", color = "coral") +### color of dots. Example (5) when dots are in different categories. Numbers can be used if ggplot colors are desired +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", categ = "group", color = 2) +### color of dots. Example (6) when dots are in different categories, with one color per category (try also color = 2:1) +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", categ = "group", color = c("coral", "green")) +### color of dots. Example (7) when dots are in different categories, with colors as a data frame column. BEWARE: one color per category must be respected (try also numbers) +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B"), col = rep(c("coral", "green"), each = 3)) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", categ = "group", color = obs1$col) +### color of dots. Example (8) when dots are in different categories, with colors as a data frame column. Easiest way (ggplot colors) +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", categ = "group", color = as.numeric(obs1$group)) +### legend name +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", categ = "group", legend.name = "CLASSES") +### different geom features. Example (1) with geom_line kind of lines +# obs1 <- data.frame(km = c(1, 3, 2, 6, 4, 5), time = c(1, 3, 2, 6, 4, 5)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", geom = "geom_line", categ = "group") +### different geom features. Example (2) with geom_path kind of lines (see the difference with (1)) +# obs1 <- data.frame(km = c(1, 3, 2, 6, 4, 5), time = c(1, 3, 2, 6, 4, 5)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", geom = "geom_path", categ = "group") +### different geom features. Example (3) with geom_hline kind of lines. Fake_y y-axis name by default because y argument must be NULL (see ylab argument below to change this) +# obs1 <- data.frame(km = 1:2, time = (1:2)^2, group = c("A", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = NULL, y = "km", geom = "geom_hline", categ = "group", xlim = c(1,10)) +### different geom features. Example (4) with geom_vline kind of lines. Fake_y y-axis name by default because y argument must be NULL (see ylab argument below to change this) +# obs1 <- data.frame(km = 1:2, time = (1:2)^2, group = c("A", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = NULL, geom = "geom_vline", categ = "group", ylim = c(1,10)) +## MULTI GEOMETRIC LAYERS +### Note that in subsequent examples, names of list compartments are systematically referred to as L1, L2, etc., to show the correspondence between the arguments data1, x, y, categ, etc. +### single layer (as examples above) +# set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1), x = list(L1 = "km"), y = list(L1 = "time"), geom = list(L1 = "geom_point"), alpha = list(L1 = 0.5)) +### simple example of two layers +# set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5)) +### color of dots. Example (1) +# set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5), color = list(L1 = "coral", L2 = "green")) +### color of dots. Example (2) of the legend display. The categ argument must be supplied. Make a fake categorical colum in the data frame if necessary (as in this example). The categ argument triggers the legend display. The legend.name argument is used to remove the legend title of each layer +# set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = "GROUP1") ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = "GROUP2") ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), categ = list(L1 = "group1", L2 = "group2"), legend.name = list(L1 = NULL, L2 = NULL), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5), color = list(L1 = "coral", L2 = "green")) +### color of dots. Example (3) when dots are in different categories (default colors) +# set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = rep(c("A1", "A2"), each = 500)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = rep(c("G1", "G2"), each = 500)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), , categ = list(L1 = "group1", L2 = "group2"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5)) +### color of dots. Example (3) when dots are in different categories. A single color mentionned per layer is applied to all the dots of the layer +# set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = rep(c("A1", "A2"), each = 500)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = rep(c("G1", "G2"), each = 500)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), , categ = list(L1 = "group1", L2 = "group2"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5), color = list(L1 = "coral", L2 = "green")) +### color of dots. Example (5) when dots are in different categories, with one color per category in each layer +# set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = rep(c("A1", "A2"), each = 500)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = rep(c("G1", "G2"), each = 500)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), , categ = list(L1 = "group1", L2 = "group2"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5), color = list(L1 = c("coral", "blue"), L2 = c("green", "black"))) +### color of dots. Example (4) when dots are in different categories. Numbers can be used if ggplot colors are desired +# set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = rep(c("A1", "A2"), each = 500)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = rep(c("G1", "G2"), each = 500)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), , categ = list(L1 = "group1", L2 = "group2"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5), color = list(L1 = 1:2, L2 = c(4, 7))) +### color of dots. Example (7) when dots are in different categories, with colors as a data frame column. BEWARE: one color per category must be respected (try also numbers). BEWARE: in color argument, if the column of the data frame does not exist, color can be still displayed (L2 = obs2$notgood is equivalent to L2 = NULL). Such situation is reported in the warning messages (see below) +# set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = rep(c("A1", "A2"), each = 500), col1 = rep(c("coral", "blue"), each = 500)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = rep(c("G1", "G2"), each = 500), col2 = rep(c("green", "black"), each = 500)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), , categ = list(L1 = "group1", L2 = "group2"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5), color = list(L1 = obs1$col1, L2 = obs2$col2)) +### color of dots. Example (8) when dots are in different categories, with colors as a data frame column. Easiest way is not recommended with mutiple layers +# set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = rep(c("A1", "A2"), each = 500), col1 = rep(c("coral", "blue"), each = 500)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = rep(c("G1", "G2"), each = 500), col2 = rep(c("green", "black"), each = 500)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), , categ = list(L1 = "group1", L2 = "group2"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5), color = list(L1 = as.numeric(obs1$group1), L2 = as.numeric(obs2$group2))) +### legend name +# set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = rep(c("A1", "A2"), each = 500)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = rep(c("G1", "G2"), each = 500)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), , categ = list(L1 = "group1", L2 = "group2"), legend.name = list(L1 = "CLASS A", L2 = "CLASS G"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5)) +### different geom features. Example (1) with 5 layers. Note that order in data1 defines the overlay order (from below to above) and the order in the legend (from top to bottom) +# set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = rep(c("A1", "A2"), each = 500)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = rep(c("G1", "G2"), each = 500)) ; set.seed(NULL) ; obs3 <- data.frame(time = c(29, 31), group3 = c("HORIZ.THRESHOLD.1", "HORIZ.THRESHOLD.2")) ; obs4 <- data.frame(km = 26, group4 = "VERTIC.THRESHOLD") ; obs5 <- data.frame(km = seq(1, 100, 0.1), time = 7*seq(1, 100, 0.1)^0.5, group5 = "FUNCTION") ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2, L3 = obs3, L4 = obs4, L5 = obs5), x = list(L1 = "km", L2 = "km", L3 = NULL, L4 = "km", L5 = "km"), y = list(L1 = "time", L2 = "time", L3 = "time", L4 = NULL, L5 = "time"), categ = list(L1 = "group1", L2 = "group2", L3 = "group3", L4 = "group4", L5 = "group5"), geom = list(L1 = "geom_point", L2 = "geom_point", L3 = "geom_hline", L4 = "geom_vline", L5 = "geom_line"), alpha = list(L1 = 0.5, L2 = 0.5, L3 = 0.5, L4 = 0.5, L5 = 0.5), xlim = c(10, 40), ylim = c(10, 40), classic = TRUE, line.size = 0.75) +### layer transparency. One transparency defined by layer (from 0 invisible to 1 opaque). Note that for lines, transparency in not applied in the legend to prevent a ggplot2 bug (https://github.com/tidyverse/ggplot2/issues/2452) +# set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = rep(c("A1", "A2"), each = 500)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = rep(c("G1", "G2"), each = 500)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), , categ = list(L1 = "group1", L2 = "group2"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 1, L2 = 0.1)) +### other different example of mutiple geom features are shown in the fun_segmentation function +## OTHER GRAPHIC ARGUMENTS +### dot size (line.size argument controls size of lines) +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", dot.size = 5) +### axis management: examples are shown for x-axis but are identical for y-axis +### x-axis limits. Example (1) +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", xlim = c(-1, 25)) +### x-axis limits. Example (2) showing that order matters in ylim argument +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", xlim = c(25, -1)) +### log scale. Example (1). BEWARE: x column must be log, otherwise incoherent scale (see below warning message with the return argument) +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", xlog = "log10") +### log scale. Example (2). BEWARE: values of the xlim must be in the corresponding log +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", xlog = "log10", xlim = c(1, 10)) +### tick number. Example (1). Note that the final number shown is approximate +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", x.tick.nb = 6) +### tick number. Example (2) using a log2 scale +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", xlog = "log2", x.tick.nb = 6) +### tick number. Example (3) using a log10 scale +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", xlog = "log10", x.tick.nb = 6) +### tick number. Example (4) using a log10 scale: the reverse x-axis correctly deal with log10 scale +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", xlog = "log10", xlim = c(7, 2)) +### secondary tick number. Example (1) +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", x.inter.tick.nb = 4) +### secondary ticks. Example (2) not for log2 and log10 scales (see below warning message with the return argument) +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", xlog = "log10", x.inter.tick.nb = 4) +### extra margins. To avoid dot cuts +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", x.left.extra.margin = 0.25, x.right.extra.margin = 0.25) +### include zero in both the x-axis and y-xis +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", xy.include.zero = TRUE) +### graph title, text size and legend display +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", categ = "group", text.size = 8, title = "GRAPH1", title.text.size = 16, show.legend = TRUE) +### raster display. This switchs from vectorial mode to raster mode. The display can takes some time, but this is easier to export and handle than vectorial display +# set.seed(1) ; obs1 <- data.frame(km = rnorm(100000, 22, 3), time = rnorm(100000, 22, 3)) ; set.seed(NULL) ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", raster = TRUE) +### classic representation (use grid = TRUE to display the background lines of the y axis ticks) +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", classic = TRUE, grid = FALSE) +### graphic info. Example (1) +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", return = TRUE) +### graphic info. Example (2) of assignation and warning message display +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; output <- fun_gg_scatter(data1 = obs1, x = "km", y = "time", xlog = "log10", return = TRUE) ; cat(output$warnings) +### add ggplot2 functions +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", add = "+ggplot2::theme_classic()") +### all the arguments +# set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 10, 3), time = rnorm(1000, 10, 3), group1 = rep(c("A1", "A2"), 500)) ; obs2 <-data.frame(km = rnorm(1000, 15, 3), time = rnorm(1000, 15, 3), group2 = rep(c("G1", "G2"), 500)) ; set.seed(NULL) ; obs1$L1$km[2:3] <- NA ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), categ = list(L1 = "group1", L2 = "group2"), legend.name = NULL, color = list(L1 = 4:5, L2 = 7:8), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5), dot.size = 3, line.size = 0.5, xlim = c(1, 25), xlab = "KM", xlog = "no", x.tick.nb = 10, x.inter.tick.nb = 1, x.left.extra.margin = 0, x.right.extra.margin = 0, ylim = c(1, 25), ylab = "TIME (s)", ylog = "log10", y.tick.nb = 5, y.inter.tick.nb = NULL, y.top.extra.margin = 0, y.bottom.extra.margin = 0, xy.include.zero = TRUE, text.size = 12, title = "", title.text.size = 8, show.legend = TRUE, classic = FALSE, grid = FALSE, raster = FALSE, vectorial.limit = NULL, return = FALSE, plot = TRUE, add = NULL, warn.print = TRUE, path.lib = NULL) +# DEBUGGING +# set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 10, 3), time = rnorm(1000, 10, 3), group1 = rep(c("A1", "A2"), 500)) ; obs2 <-data.frame(km = rnorm(1000, 15, 3), time = rnorm(1000, 15, 3), group2 = rep(c("G1", "G2"), 500)) ; set.seed(NULL) ; obs1$L1$km[2:3] <- NA ; data1 = list(L1 = obs1, L2 = obs2) ; x = list(L1 = "km", L2 = "km") ; y = list(L1 = "time", L2 = "time") ; categ = list(L1 = "group1", L2 = "group2") ; legend.name = NULL ; color = list(L1 = 4:5, L2 = 7:8) ; geom = list(L1 = "geom_point", L2 = "geom_point") ; alpha = list(L1 = 0.5, L2 = 0.5) ; dot.size = 3 ; line.size = 0.5 ; xlim = c(25, 0) ; xlab = "KM" ; xlog = "no" ; x.tick.nb = 10 ; x.inter.tick.nb = 1 ; x.left.extra.margin = 0 ; x.right.extra.margin = 0 ; ylim = c(1, 25) ; ylab = "TIME (s)" ; ylog = "log2" ; y.tick.nb = 5 ; y.inter.tick.nb = 2 ; y.top.extra.margin = 0 ; y.bottom.extra.margin = 0 ; xy.include.zero = TRUE ; text.size = 12 ; title = "" ; title.text.size = 8 ; show.legend = TRUE ; classic = FALSE ; grid = FALSE ; raster = FALSE ; vectorial.limit = NULL ; return = FALSE ; plot = TRUE ; add = NULL ; warn.print = TRUE ; path.lib = NULL +# data1 <- list(L1 = data.frame(a = 1:6, b = (1:6)^2, group = c("A", "A", "A", "B", "B", "B")), L2 = data.frame(a = (1:6)*2, b = ((1:6)^2)*2, group = c("A1", "A1", "A1", "B1", "B1", "B1")), L3 = data.frame(a = (1:6)*3, b = ((1:6)^2)*3, group3 = c("A4", "A5", "A6", "A7", "B4", "B5"))) ; data1$L1$a[3] <- NA ; data1$L1$group[5] <- NA ; data1$L3$group3[4] <- NA ; x = list(L1 = names(data1$L1)[1], L2 = names(data1$L2)[1], L3 = NULL) ; y = list(L1 = names(data1$L1)[2], L2 = names(data1$L2)[2], L3 = "a") ; categ = list(L1 = "group", L2 = NULL, L3 = NULL) ; legend.name = NULL ; color = NULL ; geom = list(L1 = "geom_point", L2 = "geom_point", L3 = "geom_hline") ; alpha = list(L1 = 0.5, L2 = 0.5, L3 = 0.5) ; dot.size = 1 ; line.size = 0.5 ; xlim = c(14, 4) ; xlab = NULL ; xlog = "log10" ; x.tick.nb = 10 ; x.inter.tick.nb = 4 ; x.left.extra.margin = 0 ; x.right.extra.margin = 0 ; ylim = c(60, 5) ; ylab = NULL ; ylog = "log10" ; y.tick.nb = 10 ; y.inter.tick.nb = 2 ; y.top.extra.margin = 0 ; y.bottom.extra.margin = 0 ; xy.include.zero = FALSE ; text.size = 12 ; title = "" ; title.text.size = 8 ; show.legend = TRUE ; classic = FALSE ; grid = FALSE ; raster = FALSE ; vectorial.limit = NULL ; return = FALSE ; plot = TRUE ; add = NULL ; warn.print = TRUE ; path.lib = NULL +# data1 <- data.frame(km = 1:2, time = (1:2)^2, group = c("A", "B")) ; data1 ; x = NULL; y = "km"; categ = "group"; legend.name = NULL ; color = NULL ; geom = "geom_hline"; alpha = 0.5 ; dot.size = 1 ; line.size = 0.5 ; xlim = c(1,10) ; xlab = NULL ; xlog = "log10" ; x.tick.nb = 10 ; x.inter.tick.nb = 4 ; x.left.extra.margin = 0 ; x.right.extra.margin = 0 ; ylim = NULL ; ylab = expression(paste("TIME (", 10^-20, " s)")) ; ylog = "log10" ; y.tick.nb = 10 ; y.inter.tick.nb = 2 ; y.top.extra.margin = 0 ; y.bottom.extra.margin = 0 ; xy.include.zero = FALSE ; text.size = 12 ; title = "" ; title.text.size = 8 ; show.legend = TRUE ; classic = FALSE ; grid = FALSE ; raster = FALSE ; vectorial.limit = NULL ; return = FALSE ; plot = TRUE ; add = NULL ; warn.print = TRUE ; path.lib = NULL +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_gg_palette", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_gg_palette() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) } +if(length(find("fun_gg_point_rast", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_gg_point_rast() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_pack", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_pack() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# reserved words to avoid bugs (used in this function) +reserved.words <- c("fake_x", "fake_y", "fake_categ", "color") +# end reserved words to avoid bugs (used in this function) +# check list lengths (and names of data1 compartments if non name present) +warning <- NULL +if(all(class(data1) == "list")){ +if(length(data1) > 6){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": data1 ARGUMENT MUST BE A LIST OF 6 DATA FRAMES MAXIMUM (6 OVERLAYS MAX)\n\n================\n\n") +stop(tempo.cat) +} +if(is.null(names(data1))){ +names(data1) <- paste0("L", 1:length(data1)) +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": NULL NAME COMPARTMENT OF data1 LIST -> NAMES RESPECTIVELY ATTRIBUTED TO EACH COMPARTMENT:\n", paste(names(data1), collapse = " ")) +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +if( ! is.null(x)){ +if( ! (all(class(x) == "list") & length(data1) == length(x))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": x ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST\n\n================\n\n") +stop(tempo.cat) +} +}else{ +x <- vector("list", length(data1)) +} +if( ! is.null(y)){ +if( ! (all(class(y) == "list") & length(data1) == length(y))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": y ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST\n\n================\n\n") +stop(tempo.cat) +} +}else{ +y <- vector("list", length(data1)) +} +if( ! is.null(categ)){ +if( ! (all(class(categ) == "list") & length(data1) == length(categ))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": categ ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST\n\n================\n\n") +stop(tempo.cat) +} +} +if( ! is.null(legend.name)){ +if( ! (all(class(legend.name) == "list") & length(data1) == length(legend.name))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": legend.name ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST\n\n================\n\n") +stop(tempo.cat) +} +} +if( ! is.null(color)){ +if( ! (all(class(color) == "list") & length(data1) == length(color))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": color ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST\n\n================\n\n") +stop(tempo.cat) +} +} +if( ! (all(class(geom) == "list") & length(data1) == length(geom))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": geom ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST\n\n================\n\n") +stop(tempo.cat) +} +if( ! (all(class(alpha) == "list") & length(data1) == length(alpha))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": alpha ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST\n\n================\n\n") +stop(tempo.cat) +} +} +# end check list lengths (and names of data1 compartments if non name present) +# conversion into lists +if(all(is.data.frame(data1))){ +data1 <- list(L1 = data1) +if(all(class(x) == "list")){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": x ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME\n\n================\n\n") +stop(tempo.cat) +}else{ +x <- list(L1 = x) +} +if(all(class(y) == "list")){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": y ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME\n\n================\n\n") +stop(tempo.cat) +}else{ +y <- list(L1 = y) +} +if( ! is.null(categ)){ +if(all(class(categ) == "list")){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": categ ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME\n\n================\n\n") +stop(tempo.cat) +}else{ +categ <- list(L1 = categ) +} +} +if( ! is.null(legend.name)){ +if(all(class(legend.name) == "list")){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": legend.name ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME\n\n================\n\n") +stop(tempo.cat) +}else{ +legend.name <- list(L1 = legend.name) +} +} +if( ! is.null(color)){ +if(all(class(color) == "list")){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": color ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME\n\n================\n\n") +stop(tempo.cat) +}else{ +color <- list(L1 = color) +} +} +if(all(class(geom) == "list")){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": geom ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME\n\n================\n\n") +stop(tempo.cat) +}else{ +geom <- list(L1 = geom) +} +if(all(class(alpha) == "list")){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": alpha ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME\n\n================\n\n") +stop(tempo.cat) +}else{ +alpha <- list(L1 = alpha) +} +} +# end conversion into lists +# legend name filling +if(is.null(legend.name) & ! is.null(categ)){ +legend.name <- categ +}else if(is.null(legend.name) & is.null(categ)){ +legend.name <- vector("list", length(data1)) # null list +} +# end legend name filling +# ini categ for legend display +fin.lg.disp <- vector("list", 6) # will be used at the end to display or not legends +fin.lg.disp[] <- FALSE +legend.disp <- vector("list", length(data1)) +if(is.null(categ) | show.legend == FALSE){ +legend.disp[] <- FALSE +}else{ +for(i2 in 1:length(data1)){ +if(is.null(categ[[i2]])){ +legend.disp[[i2]] <- FALSE +}else{ +legend.disp[[i2]] <- TRUE +} +} +} +# end ini categ for legend display +# integer colors into gg_palette +tempo.check.color <- NULL +for(i1 in 1:length(data1)){ +if(any(is.na(color[[i1]]))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ": color ARGUMENT CANNOT CONTAIN NA\n\n================\n\n") +stop(tempo.cat) +} +tempo.check.color <- c(tempo.check.color, fun_check(data = color[[i1]], data.name = ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), class = "integer", double.as.integer.allowed = TRUE, na.contain = TRUE, fun.name = function.name, print = FALSE)$problem) +} +tempo.check.color <- ! tempo.check.color # invert TRUE and FALSE because if integer, then problem = FALSE +if(any(tempo.check.color == TRUE)){ # convert integers into colors +tempo.integer <- unlist(color[tempo.check.color]) +tempo.color <- fun_gg_palette(max(tempo.integer, na.rm = TRUE)) +for(i1 in 1:length(data1)){ +if(tempo.check.color[i1] == TRUE){ +color[[i1]] <-tempo.color[color[[i1]]] +} +} +} +# end integer colors into gg_palette +# argument checking +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +compart.null.color <- 0 # will be used to attribute a color when color is non NULL but a compartment of color is NULL +data1.ini <- data1 # to report NA removal +removed.row.nb <- vector("list", length = length(data1)) # to report NA removal +removed.rows <- vector("list", length = length(data1)) # to report NA removal +for(i1 in 1:length(data1)){ +tempo <- fun_check(data = data1[[i1]], data.name = ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), class = "data.frame", na.contain = TRUE, fun.name = function.name) ; eval(ee) +# reserved word checking +if(any(names(data1[[i1]]) %in% reserved.words)){ # I do not use fun_name_change() because cannot control y before creating "fake_y". But ok because reserved are not that common +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": COLUMN NAMES OF ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), " ARGUMENT CANNOT BE ONE OF THESE WORDS\n", paste(reserved.words, collapse = " "), "\nTHESE ARE RESERVED FOR THE ", function.name, " FUNCTION\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +# end reserved word checking +# check of geom now because required for y argument +tempo <- fun_check(data = geom[[i1]], data.name = ifelse(length(geom) == 1, "geom", paste0("geom NUMBER ", i1)), options = c("geom_point", "geom_line", "geom_path", "geom_hline", "geom_vline"), length = 1, fun.name = function.name) ; eval(ee) +# end check of geom now because required for y argument +if(is.null(x[[i1]])){ +if(all(geom[[i1]] != "geom_hline")){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(x) == 1, "x", paste0("x NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ": x ARGUMENT CANNOT BE NULL EXCEPT IF ", ifelse(length(geom) == 1, "x", paste0("geom NUMBER ", i1)), " ARGUMENT IS \"geom_hline\"\nHERE geom ARGUMENT IS: ", paste(geom[[i1]], collapse = " "), "\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +}else{ +x[[i1]] <- "fake_x" +data1[[i1]] <- cbind(data1[[i1]], fake_x = NA) +data1[[i1]][, "fake_x"] <- as.numeric(data1[[i1]][, "fake_x"]) +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": NULL ", ifelse(length(x) == 1, "x", paste0("x NUMBER ", i1)), " ARGUMENT ASSOCIATED TO ", ifelse(length(geom) == 1, "geom", paste0("geom NUMBER ", i1)), " ARGUMENT ", geom[[i1]], " -> FAKE COLUMN ADDED TO DATA FRAME ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ", NAMED \"fake_x\" FOR FINAL DRAWING") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +}else{ +if(all(geom[[i1]] == "geom_hline")){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(x) == 1, "x", paste0("x NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ": x ARGUMENT MUST BE NULL IF ", ifelse(length(geom) == 1, "geom", paste0("geom NUMBER ", i1)), " ARGUMENT IS \"geom_hline\"\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +tempo <- fun_check(data = x[[i1]], data.name = ifelse(length(x) == 1, "x", paste0("x NUMBER ", i1)), class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +} +if(is.null(y[[i1]])){ +if(all(geom[[i1]] != "geom_vline")){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(y) == 1, "y", paste0("y NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ": y ARGUMENT CANNOT BE NULL EXCEPT IF ", ifelse(length(geom) == 1, "y", paste0("geom NUMBER ", i1)), " ARGUMENT IS \"geom_vline\"\nHERE geom ARGUMENT IS: ", paste(geom[[i1]], collapse = " "), "\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +}else{ +y[[i1]] <- "fake_y" +data1[[i1]] <- cbind(data1[[i1]], fake_y = NA) +data1[[i1]][, "fake_y"] <- as.numeric(data1[[i1]][, "fake_y"]) +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": NULL ", ifelse(length(y) == 1, "y", paste0("y NUMBER ", i1)), " ARGUMENT ASSOCIATED TO ", ifelse(length(geom) == 1, "geom", paste0("geom NUMBER ", i1)), " ARGUMENT ", geom[[i1]], " -> FAKE COLUMN ADDED TO DATA FRAME ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ", NAMED \"fake_y\" FOR FINAL DRAWING") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +}else{ +if(all(geom[[i1]] == "geom_vline")){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(y) == 1, "y", paste0("y NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ": y ARGUMENT MUST BE NULL IF ", ifelse(length(geom) == 1, "geom", paste0("geom NUMBER ", i1)), " ARGUMENT IS \"geom_vline\"\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +tempo <- fun_check(data = y[[i1]], data.name = ifelse(length(y) == 1, "y", paste0("y NUMBER ", i1)), class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +} +if( ! (x[[i1]] %in% names(data1[[i1]]))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(x) == 1, "x", paste0("x NUMBER ", i1)), " ARGUMENT MUST BE A COLUMN NAME OF ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), "\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +if( ! (y[[i1]] %in% names(data1[[i1]]))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(y) == 1, "y", paste0("y NUMBER ", i1)), " ARGUMENT MUST BE A COLUMN NAME OF ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), "\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +# na detection and removal (done now to be sure of the correct length of categ) +if(x[[i1]] == "fake_x" & y[[i1]] == "fake_y"){ # because the code cannot accept to be both "fake_x" and "fake_y" at the same time +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 2\nTHE CODE CANNOT ACCEPT x AND y TO BE \"fake_x\" AND \"fake_y\" IN THE SAME DATA FRAME ", i1, " \n\n============\n\n")) +stop(tempo.cat) +} +if(any(is.na(data1[[i1]][, c(if(x[[i1]] == "fake_x"){NULL}else{x[[i1]]}, if(y[[i1]] == "fake_y"){NULL}else{y[[i1]]})]))){ +tempo.removed.row.nb <- unlist(lapply(lapply(c(data1[[i1]][c(if(x[[i1]] == "fake_x"){NULL}else{x[[i1]]}, if(y[[i1]] == "fake_y"){NULL}else{y[[i1]]})]), FUN = is.na), FUN = which)) +removed.row.nb[[i1]] <- c(removed.row.nb[[i1]], tempo.removed.row.nb) +# report of removed rows will be performed at the very end +data1[[i1]] <- data1[[i1]][-tempo.removed.row.nb, ] +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": NA DETECTED IN COLUMN ", if(x[[i1]] == "fake_x"){""}else{ifelse(length(x) == 1, "x", paste0("x NUMBER ", i1))}, if(x[[i1]] != "fake_x" & y[[i1]] != "fake_y"){" AND "}, if(y[[i1]] == "fake_y"){""}else{ifelse(length(y) == 1, "y", paste0("y NUMBER ", i1))}, " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ". CORRESPONDING ROWS HAVE BEEN REMOVED (SEE $removed.row.nb AND $removed.rows)") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +# end na detection and removal (done now to be sure of the correct length of categ) +tempo <- fun_check(data = data1[[i1]][, x[[i1]]], data.name = ifelse(length(x) == 1, "x OF data1", paste0("x NUMBER ", i1, " OF data1 NUMBER ", i1)), class = "vector", mode = "numeric", na.contain = ifelse(x[[i1]] == "fake_x", TRUE, FALSE), fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = data1[[i1]][, y[[i1]]], data.name = ifelse(length(y) == 1, "y OF data1", paste0("y NUMBER ", i1, " OF data1 NUMBER ", i1)), class = "vector", mode = "numeric", na.contain = ifelse(y[[i1]] == "fake_y", TRUE, FALSE), fun.name = function.name) ; eval(ee) +if(( ! is.null(categ)) & ( ! is.null(categ[[i1]]))){ # if categ[[i1]] = NULL, fake_categ will be created later on +tempo <- fun_check(data = categ[[i1]], data.name = ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)),, class = "vector", mode = "character", length = 1, fun.name = function.name) +if( ! (categ[[i1]] %in% names(data1[[i1]]))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " ARGUMENT MUST BE A COLUMN NAME OF ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), "\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +# na detection and removal (done now to be sure of the correct length of categ) +if(any(is.na(data1[[i1]][, categ[[i1]]]))){ +tempo.removed.row.nb <- unlist(lapply(lapply(c(data1[[i1]][categ[[i1]]]), FUN = is.na), FUN = which)) +removed.row.nb[[i1]] <- c(removed.row.nb[[i1]], tempo.removed.row.nb) +# report of removed rows will be performed at the very end +data1[[i1]] <- data1[[i1]][-tempo.removed.row.nb, ] +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": IN ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ", THE CATEGORY COLUMN:\n", paste(categ[[i1]], collapse = " "), "\nCONTAINS NA") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +# end na detection and removal (done now to be sure of the correct length of categ) +tempo1 <- fun_check(data = data1[[i1]][, categ[[i1]]], data.name = ifelse(length(categ) == 1, "categ OF data1", paste0("categ NUMBER ", i1, " OF data1 NUMBER ", i1)), class = "vector", mode = "character", na.contain = FALSE, fun.name = function.name, print = FALSE) +tempo2 <- fun_check(data = data1[[i1]][, categ[[i1]]], data.name = ifelse(length(categ) == 1, "categ OF data1", paste0("categ NUMBER ", i1, " OF data1 NUMBER ", i1)), class = "factor", na.contain = FALSE, fun.name = function.name, print = FALSE) +if(tempo1$problem == TRUE & tempo2$problem == TRUE){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(categ) == 1, "categ OF data1", paste0("categ NUMBER ", i1, " OF data1 NUMBER ", i1)), " MUST BE A FACTOR OR CHARACTER VECTOR\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +}else if(tempo1$problem == FALSE){ +data1[[i1]][, categ[[i1]]] <- factor(data1[[i1]][, categ[[i1]]]) # if already a factor, change nothing, if characters, levels according to alphabetical order +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": IN ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ", THE CHARACTER COLUMN HAS BEEN CONVERTED TO FACTOR") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) - -################ Exporting results (text & tables) - - -######## fun_report() #### print string or data object into output file - - -# Check OK: clear to go Apollo -fun_report <- function(data = NULL, output ="results.txt", path = "C:/Users/Gael/Desktop", no.overwrite = TRUE, rownames.kept = FALSE, vector.cat = FALSE, noquote = TRUE, sep = 2){ - # AIM - # log file function: print a character string or a data object into a same output file - # REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION - # fun_check() - # ARGUMENTS - # data: object to print in the output file. cannot be NULL - # output: name of the output file - # path: location of the output file - # no.overwrite: (logical) if output file already exists, defines if the printing is appended (default TRUE) or if the output file content is erased before printing (FALSE) - # rownames.kept: (logical) defines whether row names have to be removed or not in small tables (less than length.rows rows) - # vector.cat (logical). If TRUE print a vector of length > 1 using cat() instead of capture.output(). Otherwise (default FALSE) the opposite - # noquote: (logical). If TRUE no quote are present for the characters - # sep: number of separating lines after printed data (must be integer) - # RETURN - # nothing - # EXAMPLES - # fun_report() - # fun_report(data = 1:3, output = "results.txt", path = "C:/Users/Gael/Desktop", no.overwrite = TRUE, rownames.kept = FALSE, vector.cat = FALSE, noquote = FALSE, sep = 2) - # DEBUGGING - # data = 1:3 ; output = "results.txt" ; path = "C:/Users/Gael/Desktop" ; no.overwrite = TRUE ; rownames.kept = FALSE ; vector.cat = FALSE ; noquote = FALSE ; sep = 2 # for function debugging - # function name - function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") - # end function name - # required function checking - if(length(find("fun_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - # argument checking without fun_check() - if(is.null(data)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": data ARGUMENT CANNOT BE NULL\n\n================\n\n") - stop(tempo.cat) - } - # end argument checking without fun_check() - # argument checking with fun_check() - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_check(data = output, class = "character", length = 1, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & output == ""){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": output ARGUMENT AS \"\" DOES NOT CORRESPOND TO A VALID FILE NAME\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - tempo <- fun_check(data = path, class = "character", length = 1, fun.name = function.name) ; eval(ee) - if(tempo$problem == FALSE & dir.exists(path) == FALSE){ - tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": path ARGUMENT DOES NOT CORRESPOND TO EXISTING DIRECTORY\n", paste(path, collapse = "\n"),"\n\n================\n\n") - cat(tempo.cat) - arg.check <- c(arg.check, TRUE) - } - tempo <- fun_check(data = no.overwrite, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = rownames.kept, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = vector.cat, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = noquote, class = "logical", length = 1, fun.name = function.name) ; eval(ee) - tempo <- fun_check(data = sep, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_check() - } - # end argument checking with fun_check() - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() - # the 4 next lines are inactivated but kept because at a time, I might have a problem with data (solved with data = NULL). These 4 lines are just to know how to detect a missing argument. Important here because if data is not provided, print the code of the data function - # arg.user.list <- as.list(match.call(expand.dots=FALSE))[-1] # recover all the arguments provided by the function user (excluding the argument with defaults values not provided by the user. Thus, it is really the list indicated by the user) - # default.arg.list <- formals(fun = sys.function(sys.parent())) # list of all the arguments of the function with their default values (not the values of the user !). It seems that ls() as first line of the function provide the names of the arguments (empty, called, etc., or not) - # arg.without.default.value <- sapply(default.arg.list, is.symbol) & sapply(sapply(default.arg.list, as.character), identical, "") # logical to detect argument without default values (these are typeof "symbol" and class "name" and empty character - # if( ! all(names(default.arg.list)[arg.without.default.value] %in% names(arg.user.list))){ # test that the arguments with no null values are provided by the user - # tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": VALUE REQUIRED FOR THESE ARGUMENTS WITH NO DEFAULTS VALUES: ", paste(names(default.arg.list)[arg.without.default.value][ ! names(default.arg.list)[arg.without.default.value] %in% names(arg.user.list)], collapse = " "), "\n\n================\n\n") - #stop(tempo.cat) - # } - # end argument checking - # main code - if(all(class(data) %in% c("matrix", "data.frame", "table"))){ - if(rownames.kept == FALSE & all(class(data) == "data.frame") & nrow(data) != 0 & nrow(data) <= 4){ # for data frames with nrows <= 4 - rownames.output.tables <- "" - length.rows <- nrow(data) - for(i in 1:length.rows){ # replace the rownames of the first 4 rows by increasing number of spaces (because identical row names not allowed in data frames). This method cannot be extended to more rows as the printed data frame is shifted on the right because of "big empty rownames" - rownames.output.tables <- c(rownames.output.tables, paste0(rownames.output.tables[i]," ", collapse="")) - } - row.names(data) <- rownames.output.tables[1:length.rows] - }else if(rownames.kept == FALSE & all(class(data) %in% c("matrix", "table"))){ - rownames(data) <- rep("", nrow(data)) # identical row names allowed in matrices and tables - } - if(noquote == TRUE){ - capture.output(noquote(data), file=paste0(path, "/", output), append = no.overwrite) - }else{ - capture.output(data, file=paste0(path, "/", output), append = no.overwrite) - } - }else if(is.vector(data) & all(class(data) != "list") & (length(data) == 1 | vector.cat == TRUE)){ - if(noquote == TRUE){ - cat(noquote(data), file= paste0(path, "/", output), append = no.overwrite) - }else{ - cat(data, file= paste0(path, "/", output), append = no.overwrite) - } - }else{ # other (array, list, factor or vector with vector.cat = FALSE) - if(noquote == TRUE){ - capture.output(noquote(data), file=paste0(path, "/", output), append = no.overwrite) - }else{ - capture.output(data, file=paste0(path, "/", output), append = no.overwrite) - } - } - sep.final <- paste0(rep("\n", sep), collapse = "") - write(sep.final, file= paste0(path, "/", output), append = TRUE) # add a sep +} +if(geom[[i1]] == "geom_vline" | geom[[i1]] == "geom_hline"){ +if(length(unique(data1[[i1]][, categ[[i1]]])) != nrow(data1[[i1]])){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(geom) == 1, "geom OF data1", paste0("geom NUMBER ", i1, " OF data1 NUMBER ", i1)), " ARGUMENT IS ", geom[[i1]], ", MEANING THAT ", ifelse(length(categ) == 1, "categ OF data1", paste0("categ NUMBER ", i1, " OF data1 NUMBER ", i1)), " MUST HAVE A DIFFERENT CLASS PER LINE OF data1 (ONE x VALUE PER CLASS)\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +} +}else if(( ! is.null(categ)) & is.null(categ[[i1]])){ # if categ[[i1]] = NULL, fake_categ will be created. BEWARE: is.null(categ[[i1]]) means no legend display (see above), because categ has not been precised. This also means a single color for data1[[i1]] +if(length(color[[i1]]) > 1){ # 0 means is.null(color[[i1]]) and 1 is ok -> single color for data1[[i1]] +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": NULL ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " ARGUMENT BUT CORRESPONDING COLORS IN ", ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " HAS LENGTH OVER 1\n", paste(color[[i1]], collapse = " "), "\nWHICH IS NOT COMPATIBLE WITH NULL CATEG -> COLOR RESET TO A SINGLE COLOR") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +color[[i1]] <- NULL # will provide a single color below +} +categ[[i1]] <- "fake_categ" +data1[[i1]] <- cbind(data1[[i1]], fake_categ = "") +# inactivated because give a different color to different "Line_" categ while a single color for all the data1[[i1]] required. Thus, put back after the color management +# if(geom[[i1]] == "geom_hline" | geom[[i1]] == "geom_vline"){ +# data1[[i1]][, "fake_categ"] <- paste0("Line_", 1:nrow(data1[[i1]])) +# }else{ +data1[[i1]][, "fake_categ"] <- data1[[i1]][, "fake_categ"] # as.numeric("") create a vector of NA but class numeric +# } +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": NULL ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " ARGUMENT -> FAKE COLUMN ADDED TO DATA FRAME ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ", NAMED \"fake_categ\" FOR FINAL DRAWING") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +if( ! is.null(legend.name[[i1]])){ +tempo <- fun_check(data = legend.name[[i1]], data.name = ifelse(length(legend.name) == 1, "legend.name", paste0("legend.name NUMBER ", i1)),, class = "vector", mode = "character", length = 1, fun.name = function.name) +} +if( ! is.null(color)){ # if color is NULL, will be filled later on +# check the nature of color +if(is.null(color[[i1]])){ +compart.null.color <- compart.null.color + 1 +color[[i1]] <- grey(compart.null.color / 8) # cannot be more than 7 overlays. Thus 7 different greys. 8/8 is excluded because white dots +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": NULL COLOR IN ", ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ", SINGLE COLOR ", paste(color[[i1]], collapse = " "), " HAS BEEN ATTRIBUTED") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +tempo1 <- fun_check(data = color[[i1]], data.name = ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name, print = FALSE) +tempo2 <- fun_check(data = color[[i1]], data.name = ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), class = "factor", na.contain = TRUE, fun.name = function.name, print = FALSE) +if(tempo1$problem == TRUE & tempo2$problem == TRUE){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " MUST BE A FACTOR OR CHARACTER VECTOR OR INTEGER VECTOR\n\n================\n\n") # integer possible because dealt above +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +}else if( ! (all(color[[i1]] %in% colors() | grepl(pattern = "^#", color[[i1]])))){ # check that all strings of low.color start by # +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " ARGUMENT MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # AND/OR COLOR NAMES GIVEN BY colors(): ", paste(unique(color[[i1]]), collapse = " "), "\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +if(any(is.na(color[[i1]]))){ +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": IN ", ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ", THE COLORS:\n", paste(unique(color[[i1]]), collapse = " "), "\nCONTAINS NA") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +# end check the nature of color +# check the length of color +if(is.null(categ) & length(color[[i1]]) != 1){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " ARGUMENT MUST BE A SINGLE COLOR IF categ IS NULL\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +}else if( ! is.null(categ)){ +# No problem of NA management by ggplot2 because already removed +if(categ[[i1]] == "fake_categ" & length(color[[i1]]) != 1){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " ARGUMENT MUST BE A SINGLE COLOR IF ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " IS NULL\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +}else if(length(color[[i1]]) == length(unique(data1[[i1]][, categ[[i1]]]))){ # here length(color) is equal to the different number of categ +data1[[i1]][, categ[[i1]]] <- factor(data1[[i1]][, categ[[i1]]]) # if already a factor, change nothing, if characters, levels according to alphabetical order +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": IN ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ", THE FOLLOWING COLORS:\n", paste(color[[i1]], collapse = " "), "\nHAVE BEEN ATTRIBUTED TO THESE CLASSES:\n", paste(levels(factor(data1[[i1]][, categ[[i1]]])), collapse = " ")) +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +}else if(length(color[[i1]]) == length(data1[[i1]][, categ[[i1]]])){# here length(color) is equal to nrow(data1[[i1]]) -> Modif to have length(color) equal to the different number of categ (length(color) == length(levels(data1[[i1]][, categ[[i1]]]))) +data1[[i1]] <- cbind(data1[[i1]], color = color[[i1]]) +tempo.check <- unique(data1[[i1]][ , c(categ[[i1]], "color")]) +if( ! (nrow(data1[[i1]]) == length(color[[i1]]) & nrow(tempo.check) == length(unique(data1[[i1]][ , categ[[i1]]])))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " ARGUMENT HAS THE LENGTH OF ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), " COLUMN VALUES\nBUT IS INCORRECTLY ASSOCIATED TO EACH CLASS OF THIS categ:\n", paste(unique(mapply(FUN = "paste", data1[[i1]][ ,categ[[i1]]], data1[[i1]][ ,"color"])), collapse = "\n"), "\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +}else{ +data1[[i1]][, categ[[i1]]] <- factor(data1[[i1]][, categ[[i1]]]) # if already a factor, change nothing, if characters, levels according to alphabetical order +color[[i1]] <- unique(color[[i1]][order(data1[[i1]][, categ[[i1]]])]) # Modif to have length(color) equal to the different number of categ (length(color) == length(levels(data1[[i1]][, categ[[i1]]]))) +tempo.warning <- paste0(ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " ARGUMENT HAS THE LENGTH OF ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), " COLUMN VALUES\nCOLORS HAVE BEEN RESPECTIVELY ASSOCIATED TO EACH CLASS OF categ AS:\n", paste(levels(factor(data1[[i1]][, categ[[i1]]])), collapse = " "), "\n", paste(color[[i1]], collapse = " ")) +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +}else if(length(color[[i1]]) == 1){ +data1[[i1]][, categ[[i1]]] <- factor(data1[[i1]][, categ[[i1]]]) # if already a factor, change nothing, if characters, levels according to alphabetical order +color[[i1]] <- rep(color[[i1]], length(levels(data1[[i1]][, categ[[i1]]]))) +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": IN ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ", COLOR HAS LENGTH 1 MEANING THAT ALL THE DIFFERENT CLASSES OF ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), "\n", paste(levels(factor(data1[[i1]][, categ[[i1]]])), collapse = " "), "\nWILL HAVE THE SAME COLOR\n", paste(color[[i1]], collapse = " ")) +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +}else{ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " ARGUMENT MUST BE (1) LENGTH 1, OR (2) THE LENGTH OF ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), " COLUMN VALUES, OR (3) THE LENGTH OF THE CLASSES IN THIS COLUMN. HERE IT IS COLOR LENGTH ", length(color[[i1]]), " VERSUS CATEG LENGTH ", length(data1[[i1]][, categ[[i1]]]), " AND CATEG CLASS LENGTH ", length(unique(data1[[i1]][, categ[[i1]]])), "\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +} +} +if((geom[[i1]] == "geom_hline" | geom[[i1]] == "geom_vline") & ! is.null(categ[[i1]])){ # add here after the color management, to deal with the different lines to plot inside any data[[i1]] +if(categ[[i1]] == "fake_categ"){ +data1[[i1]][, "fake_categ"] <- paste0("Line_", 1:nrow(data1[[i1]])) +} +} +tempo <- fun_check(data = alpha[[i1]], data.name = ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) +} +if(length(data1) > 1){ +if(length(unique(unlist(x))) > 1){ +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": THE x ARGUMENT DOES NOT CONTAIN IDENTICAL COLUMN NAMES:\n", paste(unlist(x), collapse = " "), "\nX-AXIS OVERLAYING DIFFERENT VARIABLES?") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +} +if(length(data1) > 1){ +if(length(unique(unlist(y))) > 1){ +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": THE y ARGUMENT DOES NOT CONTAIN IDENTICAL COLUMN NAMES:\n", paste(unlist(y), collapse = " "), "\nY-AXIS OVERLAYING DIFFERENT VARIABLES?") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +} +if(sum(geom %in% "geom_point") > 3){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": geom ARGUMENT CANNOT HAVE MORE THAN FOUR \"geom_point\" ELEMENTS\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +}else if(length(geom) - sum(geom %in% "geom_point") > 3){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": geom ARGUMENT CANNOT HAVE MORE THAN THREE LINE ELEMENTS\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +tempo <- fun_check(data = dot.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = line.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +if( ! is.null(xlim)){ +tempo <- fun_check(data = xlim, class = "vector", mode = "numeric", length = 2, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & any(xlim %in% c(Inf, -Inf))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": xlim ARGUMENT CANNOT CONTAIN -Inf OR Inf VALUES\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +} +if( ! is.null(xlab)){ +if(all(class(xlab) %in% "expression")){ # to deal with math symbols +tempo <- fun_check(data = xlab, class = "expression", length = 1, fun.name = function.name) ; eval(ee) +}else{ +tempo <- fun_check(data = xlab, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +} +} +tempo <- fun_check(data = xlog, options = c("no", "log2", "log10"), length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & xlog != "no"){ +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": xlog ARGUMENT SET TO ", xlog, ".\nVALUES FROM THE x ARGUMENT COLUMN OF THE data1 DATA FRAME MUST BE ALREADY ", toupper(xlog), " TRANSFORMED, AS THE xlog ARGUMENT JUST MODIFIES THE AXIS SCALE") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +if( ! is.null(xlim)){ +if(any(xlim <= 0)){ +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": xlim ARGUMENT CAN SPAN ZERO OR NEGATIVE VALUES IF xlog ARGUMENT IS SET TO ", xlog, " BECAUSE THIS LATTER ARGUMENT DOES NOT TRANSFORM DATA, JUST MODIFIES THE AXIS SCALE") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +}else if(any( ! is.finite(if(xlog == "log10"){10^xlim}else{2^xlim}))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": xlim ARGUMENT RETURNS INF WITH THE xlog ARGUMENT SET TO ", xlog, "\nAS SCALE COMPUTATION IS ", ifelse(xlog == "log10", 10, 2), "^xlim:\n", paste(ifelse(xlog == "log10", 10, 2)^xlim, collapse = " "), "\nARE YOU SURE THAT xlim ARGUMENT HAS BEEN SPECIFIED WITH VALUES ALREADY IN LOG SCALE?\n", paste(xlim, collapse = " "), "\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +} +} +if( ! is.null(x.tick.nb)){ +tempo <- fun_check(data = x.tick.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & x.tick.nb < 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": x.tick.nb ARGUMENT MUST BE A NON NULL POSITIVE INTEGER\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +} +if( ! is.null(x.inter.tick.nb)){ +tempo <- fun_check(data = x.inter.tick.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & x.inter.tick.nb < 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": x.inter.tick.nb ARGUMENT MUST BE A NON NULL POSITIVE INTEGER\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +} +tempo <- fun_check(data = x.left.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = x.right.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(ylim)){ +tempo <- fun_check(data = ylim, class = "vector", mode = "numeric", length = 2, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & any(ylim %in% c(Inf, -Inf))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ylim ARGUMENT CANNOT CONTAIN -Inf OR Inf VALUES\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +} +if( ! is.null(ylab)){ +if(all(class(ylab) %in% "expression")){ # to deal with math symbols +tempo <- fun_check(data = ylab, class = "expression", length = 1, fun.name = function.name) ; eval(ee) +}else{ +tempo <- fun_check(data = ylab, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +} +} +tempo <- fun_check(data = ylog, options = c("no", "log2", "log10"), length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ylog != "no"){ +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": ylog ARGUMENT SET TO ", ylog, ".\nVALUES FROM THE y ARGUMENT COLUMN OF THE data1 DATA FRAME MUST BE ALREADY ", toupper(ylog), " TRANSFORMED, AS THE ylog ARGUMENT JUST MODIFIES THE AXIS SCALE") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +if( ! is.null(ylim)){ +if(any(ylim <= 0)){ +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": ylim ARGUMENT CAN SPAN ZERO OR NEGATIVE VALUES IF ylog ARGUMENT IS SET TO ", ylog, " BECAUSE THIS LATTER ARGUMENT DOES NOT TRANSFORM DATA, JUST MODIFIES THE AXIS SCALE") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +}else if(any( ! is.finite(if(ylog == "log10"){10^ylim}else{2^ylim}))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ylim ARGUMENT RETURNS INF WITH THE ylog ARGUMENT SET TO ", ylog, "\nAS SCALE COMPUTATION IS ", ifelse(ylog == "log10", 10, 2), "^ylim:\n", paste(ifelse(ylog == "log10", 10, 2)^ylim, collapse = " "), "\nARE YOU SURE THAT ylim ARGUMENT HAS BEEN SPECIFIED WITH VALUES ALREADY IN LOG SCALE?\n", paste(ylim, collapse = " "), "\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +} +} +if( ! is.null(y.tick.nb)){ +tempo <- fun_check(data = y.tick.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & y.tick.nb < 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": y.tick.nb ARGUMENT MUST BE A NON NULL POSITIVE INTEGER\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +} +if( ! is.null(y.inter.tick.nb)){ +tempo <- fun_check(data = y.inter.tick.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & y.inter.tick.nb < 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": y.inter.tick.nb ARGUMENT MUST BE A NON NULL POSITIVE INTEGER\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +} +tempo <- fun_check(data = y.top.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = y.bottom.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = xy.include.zero, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) +# inactivated because xlim and ylim already log transformed +# if(tempo$problem == FALSE & ylog == TRUE & xy.include.zero == TRUE){ +#tempo.warning <- paste0("FROM FUNCTION ", function.name, ": BOTH ylog AND xy.include.zero ARGUMENTS SET TO TRUE -> xy.include.zero ARGUMENT RESET TO FALSE") +# warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +# } +tempo <- fun_check(data = text.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = title, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = title.text.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = show.legend, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = classic, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = grid, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = raster, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(vectorial.limit)){ +tempo <- fun_check(data = vectorial.limit, class = "vector", typeof = "integer", neg.values = FALSE, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) +} +tempo <- fun_check(data = return, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = plot, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(add)){ +tempo <- fun_check(data = add, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! grepl(pattern = "^\\+", add)){ # check that the add string start by + +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": add ARGUMENT MUST START WITH \"+\": ", paste(unique(add), collapse = " "), "\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +}else if(tempo$problem == FALSE & ! grepl(pattern = "ggplot2::", add)){ # +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": add ARGUMENT MUST CONTAIN \"ggplot2::\" IN FRONT OF EACH GGPLOT2 FUNCTION: ", paste(unique(add), collapse = " "), "\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +}else if(tempo$problem == FALSE & ! grepl(pattern = ")$", add)){ # check that the add string finished by ) +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": add ARGUMENT MUST FINISH BY \")\": ", paste(unique(add), collapse = " "), "\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +} +tempo <- fun_check(data = warn.print, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(path.lib)){ +tempo <- fun_check(data = path.lib, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! all(dir.exists(path.lib))){ +cat(paste0("\n\n============\n\nERROR IN ", function.name, ": \nDIRECTORY PATH INDICATED IN THE path.lib PARAMETER DOES NOT EXISTS: ", path.lib, "\n\n============\n\n")) +arg.check <- c(arg.check, TRUE) +} +} +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_check() +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() +# end argument checking +# package checking +fun_pack(req.package = c("ggplot2"), path.lib = path.lib) +# packages Cairo and grid tested by fun_gg_point_rast() +# end package checking +# main code +# axes management +if(is.null(xlim)){ +if(any(unlist(mapply(FUN = "[[", data1, x, SIMPLIFY = FALSE)) %in% c(Inf, -Inf))){ +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": THE x COLUMN IN data1 CONTAINS -Inf OR Inf VALUES THAT WILL NOT BE CONSIDERED IN THE PLOT RANGE") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +xlim <- suppressWarnings(range(unlist(mapply(FUN = "[[", data1, x, SIMPLIFY = FALSE)), na.rm = TRUE, finite = TRUE)) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only. xlim added here. If NULL, ok if x argument has values +if(suppressWarnings(all(xlim %in% c(Inf, -Inf)))){ +if(all(unlist(geom) == "geom_hline")){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, " NOT POSSIBLE TO ONLY DRAW geom_hline KIND OF LINES IF xlim ARGUMENT IS SET TO NULL, SINCE NO X-AXIS DEFINED (", ifelse(length(x) == 1, "x", paste0("x NUMBER ", i1)), " ARGUMENT MUST BE NULL FOR THESE KIND OF LINES)\n\n================\n\n") +stop(tempo.cat) +}else{ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, " xlim ARGUMENT MADE OF NA, -Inf OR Inf ONLY: ", paste(xlim, collapse = " "), "\n\n================\n\n") +stop(tempo.cat) +} +} +} +xlim.order <- order(xlim) # to deal with inverse axis +# print(xlim.order) +xlim <- sort(xlim) +xlim[1] <- xlim[1] - abs(xlim[2] - xlim[1]) * ifelse(diff(xlim.order) > 0, x.right.extra.margin, x.left.extra.margin) # diff(xlim.order) > 0 means not inversed axis +xlim[2] <- xlim[2] + abs(xlim[2] - xlim[1]) * ifelse(diff(xlim.order) > 0, x.left.extra.margin, x.right.extra.margin) # diff(xlim.order) > 0 means not inversed axis +if(xy.include.zero == TRUE){ # no need to check xlog != "no" because done before +xlim <- range(c(xlim, 0), na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only +} +xlim <- xlim[xlim.order] +if(any(is.na(xlim))){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 3\n\n============\n\n")) +stop(tempo.cat) +} +if(is.null(ylim)){ +if(any(unlist(mapply(FUN = "[[", data1, y, SIMPLIFY = FALSE)) %in% c(Inf, -Inf))){ +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": THE y COLUMN IN data1 CONTAINS -Inf OR Inf VALUES THAT WILL NOT BE CONSIDERED IN THE PLOT RANGE") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +ylim <- suppressWarnings(range(unlist(mapply(FUN = "[[", data1, y, SIMPLIFY = FALSE)), na.rm = TRUE, finite = TRUE)) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only. ylim added here. If NULL, ok if y argument has values +if(suppressWarnings(all(ylim %in% c(Inf, -Inf)))){ # happen when y is only NULL +if(all(unlist(geom) == "geom_vline")){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, " NOT POSSIBLE TO ONLY DRAW geom_vline KIND OF LINES IF ylim ARGUMENT IS SET TO NULL, SINCE NO Y-AXIS DEFINED (", ifelse(length(y) == 1, "y", paste0("y NUMBER ", i1)), " ARGUMENT MUST BE NULL FOR THESE KIND OF LINES)\n\n================\n\n") +stop(tempo.cat) +}else{ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, " ylim ARGUMENT MADE OF NA, -Inf OR Inf ONLY: ", paste(ylim, collapse = " "), "\n\n================\n\n") +stop(tempo.cat) +} +} +} +ylim.order <- order(ylim) # to deal with inverse axis +ylim <- sort(ylim) +ylim[1] <- ylim[1] - abs(ylim[2] - ylim[1]) * ifelse(diff(ylim.order) > 0, y.bottom.extra.margin, y.top.extra.margin) # diff(ylim.order) > 0 means not inversed axis +ylim[2] <- ylim[2] + abs(ylim[2] - ylim[1]) * ifelse(diff(ylim.order) > 0, y.top.extra.margin, y.bottom.extra.margin) # diff(ylim.order) > 0 means not inversed axis +if(xy.include.zero == TRUE){ # no need to check ylog != "no" because done before +ylim <- range(c(ylim, 0), na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only +} +ylim <- ylim[ylim.order] +if(any(is.na(ylim))){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 4\n\n============\n\n")) +stop(tempo.cat) +} +# end axes management +# create a fake categ if NULL to deal with legend display +if(is.null(categ)){ +categ <- vector("list", length(data1)) +categ[] <- "fake_categ" +for(i2 in 1:length(data1)){ +data1[[i2]] <- cbind(data1[[i2]], fake_categ = "") +if(geom[[i2]] == "geom_hline" | geom[[i2]] == "geom_vline"){ +data1[[i2]][, "fake_categ"] <- paste0("Line_", 1:nrow(data1[[i2]])) +} +} +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": NULL categ ARGUMENT -> FAKE COLUMN ADDED TO EACH DATA FRAME IN data1, NAMED \"fake_categ\" AND FILLED WITH \"\"") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +# end create a fake categ if NULL to deal with legend display +# vector of color with length as in data1 +if(is.null(color)){ +color <- vector("list", length(data1)) +length.categ.list <- lapply(lapply(mapply(FUN = "[[", data1, categ, SIMPLIFY = FALSE), FUN = unique), FUN = function(x){length(x[ ! is.na(x)])}) +length.categ.list[sapply(categ, FUN = "==", "fake_categ")] <- 1 # when is.null(color), a single color for all the dots or lines of data[[i1]] that contain "fake_categ" category +total.categ.length <- sum(unlist(length.categ.list), na.rm = TRUE) +tempo.color <- fun_gg_palette(total.categ.length) +tempo.count <- 0 +for(i3 in 1:length(data1)){ +color[[i3]] <- tempo.color[(1:length.categ.list[[i3]]) + tempo.count] +tempo.count <- tempo.count + length.categ.list[[i3]] +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": NULL color ARGUMENT -> COLORS RESPECTIVELY ATTRIBUTED TO EACH CLASS OF ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i3)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i3)), ":\n", paste(unlist(color), collapse = " "), "\n", paste(names(data1), collapse = " ")) +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +} +# end vector of color with length as in data1 +# last check +for(i1 in 1:length(data1)){ +if(categ[[i1]] != "fake_categ" & length(color[[i1]]) != length(unique(data1[[i1]][, categ[[i1]]]))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, " LAST CHECK: ", ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " ARGUMENT MUST HAVE THE LENGTH OF LEVELS OF ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), "\nHERE IT IS COLOR LENGTH ", length(color[[i1]]), " VERSUS CATEG LEVELS LENGTH ", length(unique(data1[[i1]][, categ[[i1]]])), "\n\n================\n\n") +stop(tempo.cat) +}else if(categ[[i1]] == "fake_categ" & length(color[[i1]]) != 1){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, " LAST CHECK: ", ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " ARGUMENT MUST HAVE LENGTH 1 WHEN ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " IS NULL\nHERE IT IS COLOR LENGTH ", length(color[[i1]]), "\n\n================\n\n") +stop(tempo.cat) +} +} +# end last check +# conversion of geom_hline and geom_vline +for(i1 in 1:length(data1)){ +if(geom[[i1]] == "geom_hline" | geom[[i1]] == "geom_vline"){ +final.data.frame <- data.frame() +for(i3 in 1:nrow(data1[[i1]])){ +tempo.data.frame <- rbind(data1[[i1]][i3, ], data1[[i1]][i3, ]) +if(geom[[i1]] == "geom_hline"){ +tempo.data.frame[, x[[i1]]] <- xlim +}else if(geom[[i1]] == "geom_vline"){ +tempo.data.frame[, y[[i1]]] <- ylim +}else{ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 5\n\n============\n\n")) +stop(tempo.cat) +} +# if(is.null(categ[[i1]])){ +# data1[, "fake_categ"] <- paste0("Line_", i3) +# } #I put that up +final.data.frame <- rbind(final.data.frame, tempo.data.frame) +} +data1[[i1]] <- final.data.frame +geom[[i1]] <- "geom_line" +if(length(color[[i1]]) == 1){ +color[[i1]] <- rep(color[[i1]], length(unique(data1[[i1]][ , categ[[i1]]]))) +}else if(length(color[[i1]]) != length(unique(data1[[i1]][ , categ[[i1]]]))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, " geom_hline AND geom_vline CONVERSION TO FIT THE XLIM AND YLIM LIMITS OF THE DATA: ", ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " ARGUMENT MUST HAVE THE LENGTH OF LEVELS OF ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), "\nHERE IT IS COLOR LENGTH ", length(color[[i1]]), " VERSUS CATEG LEVELS LENGTH ", length(unique(data1[[i1]][, categ[[i1]]])), "\n\n================\n\n") +stop(tempo.cat) +} +} +} +# end conversion of geom_hline and geom_vline +# kind of geom_point (vectorial or raster) +scatter.kind <- vector("list", length = length(data1)) # list of same length as data1, that will be used to use either ggplot2::geom_point() (vectorial dot layer) or fun_gg_point_rast() (raster dot layer) +fix.ratio <- FALSE +if(is.null(vectorial.limit)){ +if(raster == TRUE){ +scatter.kind[] <- "fun_gg_point_rast" # not important to fill everything: will be only used when geom == "geom_point" +fix.ratio <- TRUE +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": RASTER PLOT GENERATED -> ASPECT RATIO OF THE PLOT REGION SET TO 1/1 TO AVOID A BUG OF ELLIPSOID DOT DRAWING") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +}else{ +scatter.kind[] <- "ggplot2::geom_point" +} +}else{ +for(i2 in 1:length(data1)){ +if(geom[[i2]] == "geom_point"){ +if(nrow(data1[[i2]]) <= vectorial.limit){ +scatter.kind[[i2]] <- "ggplot2::geom_point" +}else{ +scatter.kind[[i2]] <- "fun_gg_point_rast" +fix.ratio <- TRUE +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i2)), " LAYER AS RASTER (NOT VECTORIAL)") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +} +} +if(any(unlist(scatter.kind) == "fun_gg_point_rast")){ +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": RASTER PLOT GENERATED -> ASPECT RATIO OF THE PLOT REGION SET TO 1/1 TO AVOID A BUG OF ELLIPSOID DOT DRAWING") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +} +# end kind of geom_point (vectorial or raster) +tempo.gg.name <- "gg.indiv.plot." +tempo.gg.count <- 0 +# no need loop part +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ggplot()) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::xlab(if(is.null(xlab)){x[[1]]}else{xlab})) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ylab(if(is.null(ylab)){y[[1]]}else{ylab})) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ggtitle(title)) +add.check <- TRUE +if( ! is.null(add)){ # if add is NULL, then = 0 +if(grepl(pattern = "ggplot2::theme", add) == TRUE){ +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": \"ggplot2::theme\" STRING DETECTED IN THE add ARGUMENT -> INTERNAL GGPLOT2 THEME FUNCTIONS theme() AND theme_classic() HAVE BEEN INACTIVATED, TO BE USED BY THE USER. +\nIT IS RECOMMENDED TO USE \"+ theme(aspect.ratio = 1)\" IF RASTER MODE IS ACTIVATED") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +add.check <- FALSE +} +} +if(add.check == TRUE & classic == TRUE){ +# BEWARE: not possible to add several times theme(). NO message but the last one overwrites the others +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::theme_classic(base_size = text.size)) +if(grid == TRUE){ +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( +text = ggplot2::element_text(size = text.size), +plot.title = ggplot2::element_text(size = title.text.size), # stronger than text +line = ggplot2::element_line(size = 0.5), +axis.line.y.left = ggplot2::element_line(colour = "black"), # draw lines for the y axis +axis.line.x.bottom = ggplot2::element_line(colour = "black"), # draw lines for the x axis +panel.grid.major.x = ggplot2::element_line(colour = "grey75"), +panel.grid.major.y = ggplot2::element_line(colour = "grey75"), +aspect.ratio = if(fix.ratio == TRUE){1}else{NULL} +)) +}else{ +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( +text = ggplot2::element_text(size = text.size), +plot.title = ggplot2::element_text(size = title.text.size), # stronger than text +line = ggplot2::element_line(size = 0.5), +axis.line.y.left = ggplot2::element_line(colour = "black"), +axis.line.x.bottom = ggplot2::element_line(colour = "black"), +aspect.ratio = if(fix.ratio == TRUE){1}else{NULL} +)) +} +}else if(add.check == TRUE & classic == FALSE){ +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( +text = ggplot2::element_text(size = text.size), +plot.title = ggplot2::element_text(size = title.text.size), # stronger than text +line = ggplot2::element_line(size = 0.5), +panel.background = ggplot2::element_rect(fill = "grey95"), +axis.line.y.left = ggplot2::element_line(colour = "black"), +axis.line.x.bottom = ggplot2::element_line(colour = "black"), +panel.grid.major.x = ggplot2::element_line(colour = "grey75"), +panel.grid.major.y = ggplot2::element_line(colour = "grey75"), +panel.grid.minor.x = ggplot2::element_blank(), +panel.grid.minor.y = ggplot2::element_blank(), +strip.background = ggplot2::element_rect(fill = "white", colour = "black"), +aspect.ratio = if(fix.ratio == TRUE){1}else{NULL} +# do not work -> legend.position = "none" # to remove the legend completely: https://www.datanovia.com/en/blog/how-to-remove-legend-from-a-ggplot/ +)) +} +# end no need loop part +# loop part +point.count <- 0 +line.count <- 0 +lg.order <- vector(mode = "list", length = 6) # order of the legend +lg.order <- lapply(lg.order, as.numeric) # order of the legend +lg.color <- vector(mode = "list", length = 6) # color of the legend +lg.alpha <- vector(mode = "list", length = 6) # order of the legend +lg.alpha <- lapply(lg.alpha, as.numeric) # alpha of the legend +for(i1 in 1:length(data1)){ +if(geom[[i1]] == "geom_point"){ +point.count <- point.count + 1 +if(point.count == 1){ +fin.lg.disp[[1]] <- legend.disp[[point.count + line.count]] +lg.order[[1]] <- point.count + line.count +lg.color[[1]] <- color[[i1]] +lg.alpha[[1]] <- alpha[[i1]] +class.categ <- levels(factor(data1[[i1]][, categ[[i1]]])) +for(i5 in 1:length(color[[i1]])){ # or length(class.categ). It is the same because already checked that lengths are the same +tempo.data.frame <- data1[[i1]][data1[[i1]][, categ[[i1]]] == class.categ[i5], ] +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = scatter.kind[[i1]]))(data = tempo.data.frame, mapping = ggplot2::aes_string(x = x[[i1]], y = y[[i1]], fill = categ[[i1]]), size = dot.size, color = color[[i1]][i5], alpha = alpha[[i1]])) # beware: a single color allowed for color argument outside aesthetic, hence the loop # show.legend option do not remove the legend, only the aesthetic of the legend (dot, line, etc.) +} +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_fill_manual(name = if(is.null(legend.name)){NULL}else{legend.name[[i1]]}, values = color[[i1]], guide = ggplot2::guide_legend(override.aes = list(colour = color[[i1]], linetype = 0)))) # values are the values of fill. order determines the order in the legend +} +if(point.count == 2){ +fin.lg.disp[[2]] <- legend.disp[[point.count + line.count]] +lg.order[[2]] <- point.count + line.count +lg.color[[2]] <- color[[i1]] +lg.alpha[[2]] <- alpha[[i1]] +class.categ <- levels(factor(data1[[i1]][, categ[[i1]]])) +for(i5 in 1:length(color[[i1]])){ # or length(class.categ). It is the same because already checked that lengths are the same +tempo.data.frame <- data1[[i1]][data1[[i1]][, categ[[i1]]] == class.categ[i5], ] +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = scatter.kind[[i1]]))(data = tempo.data.frame, mapping = ggplot2::aes_string(x = x[[i1]], y = y[[i1]], shape = categ[[i1]]), size = dot.size, color = color[[i1]][i5], alpha = alpha[[i1]])) # beware: a single color allowed for color argument outside aesthetic, hence the loop # show.legend option do not remove the legend, only the aesthetic of the legend (dot, line, etc.) +} +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_shape_manual(name = if(is.null(legend.name)){NULL}else{legend.name[[i1]]}, values = rep(19, length(color[[i1]])), guide = ggplot2::guide_legend(override.aes = list(colour = color[[i1]], linetype = 0)))) # values are the values of shape +} +if(point.count == 3){ +fin.lg.disp[[3]] <- legend.disp[[point.count + line.count]] +lg.order[[3]] <- point.count + line.count +lg.color[[3]] <- color[[i1]] +lg.alpha[[3]] <- alpha[[i1]] +class.categ <- levels(factor(data1[[i1]][, categ[[i1]]])) +for(i5 in 1:length(color[[i1]])){ # or length(class.categ). It is the same because already checked that lengths are the same +tempo.data.frame <- data1[[i1]][data1[[i1]][, categ[[i1]]] == class.categ[i5], ] +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = scatter.kind[[i1]]))(data = tempo.data.frame, mapping = ggplot2::aes_string(x = x[[i1]], y = y[[i1]], stroke = categ[[i1]]), size = dot.size, color = color[[i1]][i5], alpha = alpha[[i1]])) # beware: a single color allowed for color argument outside aesthetic, hence the loop # show.legend option do not remove the legend, only the aesthetic of the legend (dot, line, etc.) +} +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "stroke", name = if(is.null(legend.name)){NULL}else{legend.name[[i1]]}, values = rep(0.5, length(color[[i1]])), guide = ggplot2::guide_legend(override.aes = list(colour = color[[i1]], linetype = 0)))) # values are the values of stroke +} +}else{ +line.count <- line.count + 1 +if(line.count == 1){ +fin.lg.disp[[4]] <- legend.disp[[point.count + line.count]] +lg.order[[4]] <- point.count + line.count +lg.color[[4]] <- color[[i1]] +lg.alpha[[4]] <- 1 # to avoid a bug on windows: if alpha argument is different from 1 for lines (transparency), then lines are not correctly displayed in the legend when using the R GUI (bug https://github.com/tidyverse/ggplot2/issues/2452). No bug when using a pdf +class.categ <- levels(factor(data1[[i1]][, categ[[i1]]])) +for(i5 in 1:length(color[[i1]])){ # or length(class.categ). It is the same because already checked that lengths are the same +tempo.data.frame <- data1[[i1]][data1[[i1]][, categ[[i1]]] == class.categ[i5], ] +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = paste("ggplot2::", geom[[i1]], sep ="")))(data = tempo.data.frame, mapping = ggplot2::aes_string(x = x[[i1]], y = y[[i1]], linetype = categ[[i1]]), color = color[[i1]][i5], size = line.size, lineend = "round", alpha = alpha[[i1]])) # beware: a single color allowed for color argument outside aesthetic, hence the loop # show.legend option do not remove the legend, only the aesthetic of the legend (dot, line, etc.) +} +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "linetype", name = if(is.null(legend.name)){NULL}else{legend.name[[i1]]}, values = rep(1, length(color[[i1]])), guide = ggplot2::guide_legend(override.aes = list(colour = color[[i1]], shape = NA)))) # values are the values of linetype. 1 means solid. Regarding the alpha bug, I have tried different things without success: alpha in guide alone, in geom alone, in both, with different values +} +if(line.count == 2){ +fin.lg.disp[[5]] <- legend.disp[[point.count + line.count]] +lg.order[[5]] <- point.count + line.count +lg.color[[5]] <- color[[i1]] +lg.alpha[[5]] <- 1 # to avoid a bug on windows: if alpha argument is different from 1 for lines (transparency), then lines are not correctly displayed in the legend when using the R GUI (bug https://github.com/tidyverse/ggplot2/issues/2452). No bug when using a pdf +class.categ <- levels(factor(data1[[i1]][, categ[[i1]]])) +for(i5 in 1:length(color[[i1]])){ # or length(class.categ). It is the same because already checked that lengths are the same +tempo.data.frame <- data1[[i1]][data1[[i1]][, categ[[i1]]] == class.categ[i5], ] +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = paste("ggplot2::", geom[[i1]], sep ="")))(data = tempo.data.frame, mapping = ggplot2::aes_string(x = x[[i1]], y = y[[i1]], alpha = categ[[i1]]), color = color[[i1]][i5], size = line.size, lineend = "round")) # beware: a single color allowed for color argument outside aesthetic, hence the loop # show.legend option do not remove the legend, only the aesthetic of the legend (dot, line, etc.) +} +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "alpha", name = if(is.null(legend.name)){NULL}else{legend.name[[i1]]}, values = rep(alpha[[i1]], length(color[[i1]])), guide = ggplot2::guide_legend(override.aes = list(colour = color[[i1]], shape = NA)))) # values are the values of linetype. 1 means solid. Regarding the alpha bug, I have tried different things without success: alpha in guide alone, in geom alone, in both, with different values +} +if(line.count == 3){ +fin.lg.disp[[6]] <- legend.disp[[point.count + line.count]] +lg.order[[6]] <- point.count + line.count +lg.color[[6]] <- color[[i1]] +lg.alpha[[6]] <- 1 # to avoid a bug on windows: if alpha argument is different from 1 for lines (transparency), then lines are not correctly displayed in the legend when using the R GUI (bug https://github.com/tidyverse/ggplot2/issues/2452). No bug when using a pdf +class.categ <- levels(factor(data1[[i1]][, categ[[i1]]])) +for(i5 in 1:length(color[[i1]])){ # or length(class.categ). It is the same because already checked that lengths are the same +tempo.data.frame <- data1[[i1]][data1[[i1]][, categ[[i1]]] == class.categ[i5], ] +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = paste("ggplot2::", geom[[i1]], sep ="")))(data = tempo.data.frame, mapping = ggplot2::aes_string(x = x[[i1]], y = y[[i1]], size = categ[[i1]]), color = color[[i1]][i5], alpha = alpha[[i1]], lineend = "round")) # beware: a single color allowed for color argument outside aesthetic, hence the loop # show.legend option do not remove the legend, only the aesthetic of the legend (dot, line, etc.) +} +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "size", name = if(is.null(legend.name)){NULL}else{legend.name[[i1]]}, values = rep(line.size, length(color[[i1]])), guide = ggplot2::guide_legend(override.aes = list(colour = color[[i1]], shape = NA)))) # values are the values of linetype. 1 means solid. Regarding the alpha bug, I have tried different things without success: alpha in guide alone, in geom alone, in both, with different values +} +} +} +# end loop part +# legend display +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::guides(fill = if(fin.lg.disp[[1]] == TRUE){ggplot2::guide_legend(order = lg.order[[1]], override.aes = list(alpha = lg.alpha[[1]], color = lg.color[[1]]))}else{FALSE}, shape = if(fin.lg.disp[[2]] == TRUE){ggplot2::guide_legend(order = lg.order[[2]], override.aes = list(alpha = lg.alpha[[2]], color = lg.color[[2]]))}else{FALSE}, stroke = if(fin.lg.disp[[3]] == TRUE){ggplot2::guide_legend(order = lg.order[[3]], override.aes = list(alpha = lg.alpha[[2]], color = lg.color[[3]]))}else{FALSE}, linetype = if(fin.lg.disp[[4]] == TRUE){ggplot2::guide_legend(order = lg.order[[4]], override.aes = list(alpha = lg.alpha[[4]], color = lg.color[[4]]))}else{FALSE}, alpha = if(fin.lg.disp[[5]] == TRUE){ggplot2::guide_legend(order = lg.order[[5]], override.aes = list(alpha = lg.alpha[[5]], color = lg.color[[5]]))}else{FALSE}, size = if(fin.lg.disp[[6]] == TRUE){ggplot2::guide_legend(order = lg.order[[6]], override.aes = list(alpha = lg.alpha[[6]], color = lg.color[[6]]))}else{FALSE})) # clip = "off" to have secondary ticks outside plot region does not work +# end legend display +# scale management +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::coord_cartesian(xlim = xlim, ylim = ylim)) # clip = "off" to have secondary ticks outside plot region does not work +# x-axis ticks and inv +tempo.coord <- ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))$layout$panel_params[[1]] +tempo.scale <- fun_scale(lim = xlim, n = ifelse(is.null(x.tick.nb), length(tempo.coord$x.major_source), x.tick.nb)) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_x_continuous( +breaks = tempo.scale, +labels = if(xlog == "log10"){scales::trans_format("identity", scales::math_format(10^.x))}else if(xlog == "log2"){scales::trans_format("identity", scales::math_format(2^.x))}else if(xlog == "no"){ggplot2::waiver()}else{tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 6\n\n============\n\n")) ; stop(tempo.cat)}, +expand = c(0, 0), +limits = NA, +trans = ifelse(diff(xlim) < 0, "reverse", "identity") # equivalent to ggplot2::scale_x_reverse() +)) +# end x-axis ticks and inv +# y-axis ticks and inv +tempo.coord <- ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))$layout$panel_params[[1]] +tempo.scale <- fun_scale(lim = ylim, n = ifelse(is.null(y.tick.nb), length(tempo.coord$y.major_source), y.tick.nb)) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_y_continuous( +breaks = tempo.scale, +labels = if(ylog == "log10"){scales::trans_format("identity", scales::math_format(10^.x))}else if(ylog == "log2"){scales::trans_format("identity", scales::math_format(2^.x))}else if(ylog == "no"){ggplot2::waiver()}else{tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 7\n\n============\n\n")) ; stop(tempo.cat)}, +expand = c(0, 0), +limits = NA, +trans = ifelse(diff(ylim) < 0, "reverse", "identity") # equivalent to ggplot2::scale_y_reverse() +)) +# end y-axis ticks and inv +# x-axis secondary ticks (after ggplot2::coord_cartesian() or ggplot2::coord_flip()) +tempo.coord <- ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))$layout$panel_params[[1]] +xlim.order <- order(xlim) # to deal with inverse axis +ylim.order <- order(ylim) # to deal with inverse axis +# no secondary ticks for log2. Play with xlim +if(xlog == "log10"){ +y.range <- tempo.coord$y.range +if(diff(ylim.order) < 0){y.range <- -(y.range)} +ini.scipen <- options()$scipen +options(scipen = -1000) # force scientific format +power10.exp <- as.integer(substring(text = 10^xlim, first = (regexpr(pattern = "\\+|\\-", text = 10^xlim)))) # recover the power of 10. Example recover 08 from 1e+08 +# print(xlim) +mantisse <- as.numeric(substr(x = 10^xlim, start = 1, stop = (regexpr(pattern = "\\+|\\-", text = 10^xlim) - 2))) # recover the mantisse. Example recover 1.22 from 1.22e+08 +options(scipen = ini.scipen) # restore the initial scientific penalty +# print(power10.exp) +tempo.tick.pos <- as.vector(outer(log10(2:10), 10^((power10.exp[1] - ifelse(diff(xlim.order) > 0, 1, -1)):(power10.exp[2] + ifelse(diff(xlim.order) > 0, 1, -1))))) +tempo.tick.pos <- sort(tempo.tick.pos, decreasing = ifelse(diff(xlim.order) > 0, FALSE, TRUE)) +tempo.tick.pos <- log10(tempo.tick.pos[tempo.tick.pos >= min(10^xlim) & tempo.tick.pos <= max(10^xlim)]) +if(any(is.na(tempo.tick.pos) | ! is.finite(tempo.tick.pos))){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 8\n\n============\n\n")) +stop(tempo.cat) +} +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "segment", x = tempo.tick.pos, xend = tempo.tick.pos, y = y.range[1], yend = y.range[1] + diff(y.range) / 80)) +}else if(( ! is.null(x.inter.tick.nb)) & xlog == "no"){ +if(x.inter.tick.nb > 0){ +x.ticks.pos <- suppressWarnings(as.numeric(tempo.coord$x.labels)) # too difficult to predict the behavior of tempo.coord$x.major_source depending on xlim neg or not, inv or not. Inv is respected +if(any(is.na(x.ticks.pos))){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 9\n\n============\n\n")) +stop(tempo.cat) +} +y.range <- tempo.coord$y.range +if(diff(ylim.order) < 0){y.range <- -(y.range)} +tick.dist <- mean(diff(x.ticks.pos), na.rm = TRUE) +minor.tick.dist <- tick.dist / (x.inter.tick.nb + 1) +minor.tick.pos <- seq(x.ticks.pos[1] - tick.dist, x.ticks.pos[length(x.ticks.pos)] + tick.dist, by = minor.tick.dist) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "segment", x = minor.tick.pos, xend = minor.tick.pos, y = y.range[1], yend = y.range[1] + diff(y.range) / 80)) +} +} +# end x-axis secondary ticks (after ggplot2::coord_cartesian() or ggplot2::coord_flip()) +# y-axis secondary ticks (after ggplot2::coord_cartesian() or ggplot2::coord_flip()) +tempo.coord <- ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))$layout$panel_params[[1]] +# no secondary ticks for log2. Play with ylim +if(ylog == "log10"){ +x.range <- tempo.coord$x.range +if(diff(xlim.order) < 0){x.range <- -(x.range)} +ini.scipen <- options()$scipen +options(scipen = -1000) # force scientific format +power10.exp <- as.integer(substring(text = 10^ylim, first = (regexpr(pattern = "\\+|\\-", text = 10^ylim)))) # recover the power of 10. Example recover 08 from 1e+08 +mantisse <- as.numeric(substr(x = 10^ylim, start = 1, stop = (regexpr(pattern = "\\+|\\-", text = 10^ylim) - 2))) # recover the mantisse. Example recover 1.22 from 1.22e+08 +options(scipen = ini.scipen) # restore the initial scientific penalty +tempo.tick.pos <- as.vector(outer(log10(2:10), 10^((power10.exp[1] - ifelse(diff(ylim.order) > 0, 1, -1)):(power10.exp[2] + ifelse(diff(ylim.order) > 0, 1, -1))))) +tempo.tick.pos <- sort(tempo.tick.pos, decreasing = ifelse(diff(ylim.order) > 0, FALSE, TRUE)) +tempo.tick.pos <- log10(tempo.tick.pos[tempo.tick.pos >= min(10^ylim) & tempo.tick.pos <= max(10^ylim)]) +if(any(is.na(tempo.tick.pos) | ! is.finite(tempo.tick.pos))){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 10\n\n============\n\n")) +stop(tempo.cat) +} +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "segment", y = tempo.tick.pos, yend = tempo.tick.pos, x = x.range[1], xend = x.range[1] + diff(x.range) / 80)) +}else if(( ! is.null(y.inter.tick.nb)) & ylog == "no"){ +if(y.inter.tick.nb > 0){ +y.ticks.pos <- suppressWarnings(as.numeric(tempo.coord$y.labels)) # too difficult to predict the behavior of tempo.coord$y.major_source depending on ylim neg or not, inv or not. Inv is respected +if(any(is.na(y.ticks.pos))){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 11\n\n============\n\n")) +stop(tempo.cat) +} +x.range <- tempo.coord$x.range +if(diff(xlim.order) < 0){x.range <- -(x.range)} +tick.dist <- mean(diff(y.ticks.pos), na.rm = TRUE) +minor.tick.dist <- tick.dist / (y.inter.tick.nb + 1) +minor.tick.pos <- seq(y.ticks.pos[1] - tick.dist, y.ticks.pos[length(y.ticks.pos)] + tick.dist, by = minor.tick.dist) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "segment", y = minor.tick.pos, yend = minor.tick.pos, x = x.range[1], xend = x.range[1] + diff(x.range) / 80)) +} +} +# end y-axis secondary ticks (after ggplot2::coord_cartesian() or ggplot2::coord_flip()) +# end scale management +if(plot == TRUE){ +suppressWarnings(print(eval(parse(text = paste(paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "),if(is.null(add)){NULL}else{add}))))) +}else{ +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": PLOT NOT SHOWN AS REQUESTED") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +if(warn.print == TRUE & ! is.null(warning)){ +warning(warning) +} +if(return == TRUE){ +output <- ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + ")))) +if(is.null(unlist(removed.row.nb))){ +removed.row.nb <- NULL +removed.rows <- NULL +}else{ +for(i3 in 1:length(data1)){ +if( ! is.null(removed.row.nb[[i3]])){ +removed.row.nb[[i3]] <- sort(removed.row.nb[[i3]]) +removed.rows[[i3]] <- data1.ini[[i3]][removed.row.nb[[i3]], ] +} +} +} +output <- list(data = output$data, removed.row.nb = removed.row.nb, removed.rows = removed.rows, axes = output$layout$panel_params[[1]], warnings = paste0("\n", warning, "\n\n")) +return(output) +} +} + + +######## fun_gg_bar_mean() #### ggplot2 mean barplot + overlaid dots if required + + + + + +# Check OK: clear to go Apollo +fun_gg_bar_mean <- function(data1, y, categ, categ.class.order = NULL, categ.legend.name = NULL, categ.color = NULL, bar.width = 0.5, error.disp = NULL, error.whisker.width = 0.5, dot.color = "same", dot.tidy = FALSE, dot.bin.nb = 30, dot.jitter = 0.25, dot.size = 3, dot.border.size = 0.5, dot.alpha = 0.5, ylim = NULL, ylog = "no", y.tick.nb = NULL, y.inter.tick.nb = NULL, y.include.zero = FALSE, y.top.extra.margin = 0, y.bottom.extra.margin = 0, stat.disp = NULL, stat.size = 4, stat.dist = 2, xlab = NULL, ylab = NULL, vertical = TRUE, text.size = 12, title = "", title.text.size = 8, text.angle = 0, classic = FALSE, grid = FALSE, return = FALSE, plot = TRUE, add = NULL, warn.print = FALSE, path.lib = NULL){ +# AIM +# ggplot2 vertical barplot representing mean values with the possibility to add error bars and to overlay dots +# for ggplot2 specifications, see: https://ggplot2.tidyverse.org/articles/ggplot2-specs.html +# WARNINGS +# rows containing NA in data1[, c(y, categ)] will be removed before processing, with a warning (see below) +# if ever bars disappear, see the end of https://github.com/tidyverse/ggplot2/issues/2887 +# to have a single bar, create a factor column with a single class and specify the name of this column in categ argument as unique element (no categ2 in categ argument). For a single set of grouped bars, create a factor column with a single class and specify this column in categ argument as first element (categ1). See categ below +# with several single bars (categ argument with only one element), bar.width argument (i.e., width argument of ggplot2::geom_bar()) defines each bar width. The bar.width argument also defines the space between bars by using (1 - bar.width). In addition, xmin and xmax of the fun_gg_bar_mean() output report the bar boundaries (around x-axis unit 1, 2, 3, etc., for each bar) +# with several sets of grouped bars (categ argument with two elements), bar.width argument defines each set of grouped bar width. The bar.width argument also defines the space between set of grouped bars by using (1 - bar.width). In addition, xmin and xmax of the fun_gg_bar_mean() output report the bar boundaries (around x-axis unit 1, 2, 3, etc., for each set of grouped bar) +# to manually change the 0 base bar into this code, see https://stackoverflow.com/questions/35324892/ggplot2-setting-geom-bar-baseline-to-1-instead-of-zero +# ARGUMENTS +# data1: a dataframe containing one column of values (see y argument below) and one or two columns of categories (see categ argument below). Duplicated column names not allowed +# y: character string of the data1 column name for y-axis (containing numeric values). Numeric values will be averaged by categ to generate the bars and will also be used to plot the dots +# categ: vector of character strings of the data1 column name for categories (column of characters or factor). Must either be one or two column names. If a single column name (further refered to as categ1), then one bar per class of categ1. If two column names (further refered to as categ1 and categ2), then one bar per class of categ2, which form a group of bars in each class of categ1. BEWARE, categ1 (and categ2 if it exists) must have a single value of y per class of categ1 (and categ2). To have a single bar, create a factor column with a single class and specify the name of this column in categ argument as unique element (no categ2 in categ argument). For a single set of grouped bars, create a factor column with a single class and specify this column in categ argument as first element (categ1) +# categ.class.order: list indicating the order of the classes of categ1 and categ2 represented on the barplot (the first compartment for categ1 and and the second for categ2). If categ.class.order = NULL, classes are represented according to the alphabetical order. Some compartment can be NULL and other not +# categ.legend.name: character string of the legend title for categ2. If categ.legend.name = NULL, then categ.legend.name <- categ1 if only categ1 is present and categ.legend.name <- categ2 if categ1 and categ2 are present. Write "" if no legend required +# categ.color: vector of character color string for bar filling. If categ.color = NULL, default colors of ggplot2, whatever categ1 and categ2. If categ.color is non null and only categ1 in categ argument, categ.color can be either: (1) a single color string (all the bars will have this color, whatever the classes of categ1), (2) a vector of string colors, one for each class of categ1 (each color will be associated according to categ.class.order of categ1), (3) a vector or factor of string colors, like if it was one of the column of data1 data frame (beware: a single color per class of categ1 and a single class of categ1 per color must be respected). Integers are also accepted instead of character strings, as long as above rules about length are respected. Integers will be processed by fun_gg_palette() using the max integer value among all the integers in categ.color. If categ.color is non null and categ1 and categ2 specified, all the rules described above will apply to categ2 instead of categ1 (colors will be determined for bars inside a group of bars) +# bar.width: numeric value (from 0 to 1) of the bar or set of grouped bar width (see warnings above) +# error.disp: either "SD", "SD.TOP", "SEM" or "SEM.TOP". If NULL, no error bars added +# error.whisker.width: numeric value (from 0 to 1) of the whisker (error bar extremities) width, with 0 meaning no whiskers and 1 meaning a width equal to the corresponding bar width +# dot.color: vector of character string. Idem as categ.color but for dots, except that in the possibility (3), the rule "a single color per class of categ1 and a single class of categ1", cannot be respected (each dot can have a different color). If NULL, no dots plotted +# dot.tidy: logical. Nice dot spreading? If TRUE, use the geom_dotplot() function for a nice representation. If FALSE, dots are randomly spread, using the dot.jitter argument (see below) +# dot.bin.nb: positive integer indicating the number of bins (i.e., nb of separations) of the ylim range. Each dot will then be put in one of the bin, with the size the width of the bin. Not considered if dot.tidy is FALSE +# dot.jitter: numeric value (from 0 to 1) of random dot horizontal dispersion, with 0 meaning no dispersion and 1 meaning a dispersion in the corresponding bar width interval. Not considered if dot.tidy is TRUE +# dot.size: numeric value of dot size. Not considered if dot.tidy is TRUE +# dot.border.size: numeric value of border dot size. Write zero for no dot border. If dot.tidy is TRUE, value 0 remove the border. Another one leave the border without size control (geom_doplot() feature) +# dot.alpha: numeric value (from 0 to 1) of dot transparency (full transparent to full opaque, respectively) +# ylim: 2 numeric values for y-axis range. If NULL, range of y in data1. Order of the 2 values matters (for inverted axis). BEWARE: values of the ylim must be already in the corresponding log if ylog argument is not "no" (see below) +# ylog: Either "no" (values in the y argument column of the data1 data frame are not log), "log2" (values in the y argument column of the data1 data frame are log2 transformed) or "log10" (values in the y argument column of the data1 data frame are log10 transformed). BEWARE: do not tranform the data, but just display ticks in a log scale manner. Thus, negative or zero values allowed. BEWARE: not possible to have horizontal bars with a log axis, due to a bug in ggplot2 (see https://github.com/tidyverse/ggplot2/issues/881) +# y.tick.nb: approximate number of desired label values on the y-axis (n argument of the the fun_scale() function) +# y.inter.tick.nb: number of desired secondary ticks between main ticks. Not considered if ylog is other than "no". In that case, play with the ylim and y.tick.nb arguments +# y.include.zero: logical. Does ylim range include 0? Ok even if ylog = TRUE because ylim must already be log transformed values +# y.top.extra.margin: single proportion (between 0 and 1) indicating if extra margins must be added to ylim. If different from 0, add the range of the axis * y.top.extra.margin (e.g., abs(ylim[2] - ylim[1]) * y.top.extra.margin) to the top of y-axis +# y.bottom.extra.margin: idem as y.top.extra.margin but to the bottom of y-axis +# stat.disp: add the mean number above the corresponding bar. Either NULL (no number shown), "top" (at the top of the figure region) or "above" (above each bar) +# stat.size: numeric value of the stat size (in points). Increase the value to increase text size +# stat.dist: numeric value of the stat distance. Increase the value to increase the distance +# xlab: a character string or expression for x-axis legend. If NULL, character string of categ1 +# ylab: a character string or expression for y-axis legend. If NULL, character string of the y argument +# vertical: logical. Vertical bars? BEWARE: will be automatically set to TRUE if ylog argument is other than "no". Indeed, not possible to have horizontal bars with a log axis, due to a bug in ggplot2 (see https://github.com/tidyverse/ggplot2/issues/881) +# text.size: numeric value of the size of the (1) axis numbers and axis legends, (2) texts in the graphic legend, (3) stats above bars (in points) +# title: character string of the graph title +# title.text.size: numeric value of the title size (in points) +# text.angle: integer value of the text angle for the x-axis labels. Positive values for counterclockwise rotation: 0 for horizontal, 90 for vertical, 180 for upside down etc. Negative values for clockwise rotation: 0 for horizontal, -90 for vertical, -180 for upside down etc. +# classic: logical. Use the classic theme (article like)? +# grid: logical. draw horizontal lines in the background to better read the bar values? Not considered if classic = FALSE +# return: logical. Return the graph parameters? +# plot: logical. Plot the graphic? If FALSE and return argument is TRUE, graphical parameters and associated warnings are provided without plotting +# add: character string allowing to add more ggplot2 features (dots, lines, themes, etc.). BEWARE: (1) must start with "+" just after the simple or double opening quote (no space, end of line, carriage return, etc., allowed), (2) must finish with ")" just before the simple or double closing quote (no space, end of line, carriage return, etc., allowed) and (3) each function must be preceded by "ggplot2::" (for instance: "ggplot2::coord_flip()). If the character string contains the "ggplot2::theme" string, then internal ggplot2 theme() and theme_classic() functions will be inactivated to be reused by add. BEWARE: handle this argument with caution since added functions can create conflicts with the preexisting internal ggplot2 functions +# warn.print: logical. Print warnings at the end of the execution? No print if no warning messages +# path.lib: absolute path of the required packages, if not in the default folders +# REQUIRED PACKAGES +# ggplot2 +# scales +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_2d_comp() +# fun_gg_just() +# fun_gg_palette() +# fun_name_change() +# fun_pack() +# fun_check() +# fun_round() +# fun_scale() +# RETURN +# a barplot if plot argument is TRUE +# a list of the graph info if return argument is TRUE: +# $stat: the graphic statistics +# $removed.row.nb: which rows have been removed due to NA detection in y and categ columns (NULL if no row removed) +# $removed.rows: removed rows containing NA (NULL if no row removed) +# $data: the graphic bar and dot coordinates +# $axes: the x-axis and y-axis info +# $warnings: the warning messages. Use cat() for proper display. NULL if no warning +# EXAMPLES +### nice representation (1) +# obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), categ.class.order = list(NULL, c("B", "A")), categ.legend.name = "LEGEND", categ.color = NULL, bar.width = 0.3, error.disp = "SD.TOP", error.whisker.width = 0.8, dot.color = "same", dot.jitter = 0.5, dot.size = 3.5, dot.border.size = 0.2, dot.alpha = 0.5, ylim = c(10, 25), y.include.zero = TRUE, stat.disp = "above", stat.size = 4, xlab = "GROUP", ylab = "MEAN", text.size = 12, title = "GRAPH1", title.text.size = 8, text.angle = 0, classic = TRUE, grid = TRUE) +### nice representation (2) +# set.seed(1) ; obs1 <- data.frame(Time = c(rnorm(24, 0), rnorm(24, -10), rnorm(24, 10), rnorm(24, 20)), Group1 = rep(c("CAT", "DOG"), times = 48), Group2 = rep(c("A", "B", "C", "D"), each = 24)) ; set.seed(NULL) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), categ.class.order = list(NULL, c("B", "A", "D", "C")), categ.legend.name = "LEGEND", categ.color = NULL, bar.width = 0.8, dot.color = "grey50", dot.tidy = TRUE, dot.bin.nb = 60, dot.size = 3.5, dot.border.size = 0.2, dot.alpha = 0.5, ylim= c(-20, 30), stat.disp = "above", stat.size = 4, stat.dist = 1, xlab = "GROUP", ylab = "MEAN", vertical = FALSE, text.size = 12, title = "GRAPH1", title.text.size = 8, text.angle = 45, classic = FALSE) +### simple example +# obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = "Group1") +### separate bars. Example (1) of modification of bar color using a single value +# obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = "Group1", categ.color = "white") +### separate bars. Example (2) of modification of bar color using one value par class of categ2 +# obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = "Group1", categ.color = c("coral", "lightblue")) +### separate bars. Example (3) of modification of bar color using the bar.color data frame column, with respect of the correspondence between categ2 and bar.color columns +# obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10), bar.color = rep(c("coral", "lightblue"), time = 10)) ; obs1 ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = "Group1", categ.color = obs1$bar.color) +### separate bars. Example (1) of modification of dot color, using the same dot color as the corresponding bar +# obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = "Group1", dot.color = "same") +### separate bars. Example (2) of modification of dot color, using a single color for all the dots +# obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = "Group1", dot.color = "green") +### separate bars. Example (3) of modification of dot color, using one value par class of categ2 +# obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = "Group1", dot.color = c("green", "brown")) +### separate bars. Example (4) of modification of dot color, using different colors for each dot +# obs1 <- data.frame(Time = 1:10, Group1 = rep(c("G", "H"), times = 5)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = "Group1", dot.color = hsv(h = (1:nrow(obs1)) / nrow(obs1))) +### grouped bars. Simple example +# obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2")) +### grouped bars. More grouped bars +# obs1 <- data.frame(Time = 1:24, Group1 = rep(c("G", "H"), times = 12), Group2 = rep(c("A", "B", "C", "D"), each = 6)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2")) +### grouped bars. Example (1) of modification of bar color, using a single value +# obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), categ.color = "white") +### grouped bars. Example (2) of modification of bar color, using one value par class of categ2 +# obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), categ.color = c("coral", "lightblue")) +### grouped bars. Example (3) of modification of bar color, using one value per line of obs1, with respect of the correspondence between categ2 and bar.color columns +# obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10), bar.color = rep(c("coral", "lightblue"), each = 10)) ; obs1 ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), categ.color = obs1$bar.color) +### grouped bars. Example (1) of modification of dot color, using the same dot color as the corresponding bar +# obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), dot.color = "same") +### grouped bars. Example (2) of modification of dot color, using a single color for all the dots +# obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), dot.color = "green") +### grouped bars. Example (3) of modification of dot color, using one value par class of categ2 +# obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), dot.color = c("green", "brown")) +### grouped bars. Example (4) of modification of dot color, using different colors for each dot +# obs1 <- data.frame(Time = 1:10, Group1 = rep(c("G", "H"), times = 5), Group2 = rep(c("A", "B"), each = 5)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), dot.color = hsv(h = (1:nrow(obs1)) / nrow(obs1))) +### no dots (y.include.zero set to TRUE to see the lowest bar): +# obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), dot.color = NULL, y.include.zero = TRUE) +### bar width. Example (1) with bar.width = 0.25 -> three times more space between single bars than the bar width (y.include.zero set to TRUE to see the lowest bar) +# obs1 <- data.frame(Time = 1:1000, Group1 = rep(c("G", "H"), each = 500)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = "Group1", dot.color = NULL, y.include.zero = TRUE, bar.width = 0.25) +### bar width. Example (2) with bar.width = 1, no space between single bars +# obs1 <- data.frame(Time = 1:1000, Group1 = rep(c("G", "H"), each = 500)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = "Group1", dot.color = NULL, y.include.zero = TRUE, bar.width = 1) +### bar width. Example (3) with bar.width = 0.25 -> three times more space between sets of grouped bars than the set width +# obs1 <- data.frame(Time = 1:1000, Group1 = rep(c("G", "H"), times = 500), Group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), dot.color = NULL, y.include.zero = TRUE, bar.width = 0.25) +### bar width. Example (4) with bar.width = 0 -> no space between sets of grouped bars +# obs1 <- data.frame(Time = 1:1000, Group1 = rep(c("G", "H"), times = 500), Group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), dot.color = NULL, y.include.zero = TRUE, bar.width = 1) +### error bars +# obs1 <- data.frame(Time = 1:1000, Group1 = rep(c("G", "H"), times = 500), Group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), dot.color = NULL, error.disp = "SD.TOP") +### whisker width. Example (1) with error.whisker.width = 1 -> whiskers have the width of the corresponding bar +# obs1 <- data.frame(Time = 1:1000, Group1 = rep(c("G", "H"), times = 500), Group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), dot.color = NULL, error.disp = "SD", error.whisker.width = 1) +### whisker width. Example (2) error bars with no whiskers +# obs1 <- data.frame(Time = 1:1000, Group1 = rep(c("G", "H"), times = 500), Group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), dot.color = NULL, error.disp = "SD", error.whisker.width = 0) +### tidy dot distribution. Example (1) +# obs1 <- data.frame(Time = 1:1000, Group1 = rep(c("G", "H"), times = 500), Group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), dot.color = "same", dot.tidy = TRUE, dot.bin.nb = 100) +### tidy dot distribution. Example (2) reducing the dot size with dot.bin.nb +# obs1 <- data.frame(Time = 1:1000, Group1 = rep(c("G", "H"), times = 500), Group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), dot.color = "same", dot.tidy = TRUE, dot.bin.nb = 150) +### dot jitter. Example (1) +# obs1 <- data.frame(Time = 1:1000, Group1 = rep(c("G", "H"), times = 500), Group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), dot.color = "same", dot.tidy = FALSE, dot.jitter = 1, dot.size = 2) +### dot jitter. Example (2) with dot.jitter = 1 -> dispersion around the corresponding bar width +# obs1 <- data.frame(Time = 1:1000, Group1 = rep(c("G", "H"), times = 500), Group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), dot.color = "grey", dot.size = 3, dot.alpha = 1, dot.jitter = 1) +### dot jitter. Example (3) with no dispersion +# obs1 <- data.frame(Time = 1:100, Group1 = rep(c("G", "H"), times = 50), Group2 = rep(LETTERS[1:5], each = 20)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), dot.color = "grey", dot.size = 3, dot.alpha = 1, dot.jitter = 0) +### dot size, dot border size and dot transparency +# obs1 <- data.frame(Time = 1:100, Group1 = rep(c("G", "H"), times = 50), Group2 = rep(LETTERS[1:5], each = 20)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), dot.color = "grey", dot.size = 4, dot.border.size = 0, dot.alpha = 0.6) +### y-axis limits. Example (1) +# obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), ylim = c(-1, 25)) +### y-axis limits. Example (2) showing that order matters in ylim argument +# obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), ylim = c(25, -1)) +### log scale. Example (1). BEWARE: y column must be log, otherwise incoherent scale (see below warning message with the return argument) +# obs1 <- data.frame(Time = log10((1:20) * 100), Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), ylog = "log10") +### log scale. Example (2). BEWARE: values of the ylim must be in the corresponding log +# obs1 <- data.frame(Time = log10((1:20) * 100), Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), ylog = "log10", ylim = c(1,4)) +### tick number. Example (1) +# obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), y.tick.nb = 10) +### tick number. Example (2) using a log2 scale +# obs1 <- data.frame(Time = log2((1:20) * 100), Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), ylog = "log2", y.tick.nb = 10, ylim = c(1, 16)) +### tick number. Example (3) using a log10 scale +# obs1 <- data.frame(Time = log10((1:20) * 100), Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), ylog = "log10", y.tick.nb = 10) +### tick number. Example (4) using a log10 scale: the reverse y-axis correctly deal with log10 scale +# obs1 <- data.frame(Time = log10((1:20) * 100), Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), ylog = "log10", y.tick.nb = 10, ylim = c(4, 1)) +### secondary tick number. Example (1) +# obs1 <- data.frame(Time = 1:20, Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), y.inter.tick.nb = 2) +### secondary ticks. Example (2) not for log2 and log10 scales (see below warning message with the return argument) +# obs1 <- data.frame(Time = log10((1:20) * 100), Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), ylog = "log10", y.inter.tick.nb = 2) +### include zero in the y-axis +# obs1 <- data.frame(Time = (1:20), Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), y.include.zero = TRUE) +### extra margins. To avoid dot cuts +# obs1 <- data.frame(Time = (1:20), Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), y.top.extra.margin = 0.25, y.bottom.extra.margin = 0.25) +### mean diplay. Example (1) at the top of the plot region +# obs1 <- data.frame(Time = (1:20), Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), y.top.extra.margin = 0.1, stat.disp = "top", stat.size = 4, stat.dist = 2) +### mean diplay. Example (2) above bars +# obs1 <- data.frame(Time = (1:20), Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), y.top.extra.margin = 0.1, stat.disp = "above", stat.size = 4, stat.dist = 2) +### bar orientation. Example (1) without log scale, showing that the other arguments are still operational +# obs1 <- data.frame(Time = (1:20), Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), y.tick.nb = 10, y.inter.tick.nb = 2, y.include.zero = TRUE, vertical = FALSE) +### bar orientation. Example (2) with log scale. Horizontal orientation is blocked with log2 and log10 scales because of a bug in ggplot2 (https://github.com/tidyverse/ggplot2/issues/881) +# obs1 <- data.frame(Time = log10((1:20) * 100), Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), ylog = "log10", vertical = FALSE) +### classic representation (use grid = TRUE to display the background lines of the y axis ticks) +# obs1 <- data.frame(Time = (1:20), Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), classic = TRUE, grid = FALSE) +### graphic info. Example (1) +# obs1 <- data.frame(Time = log10((1:20) * 100), Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), return = TRUE) +### graphic info. Example (2) of assignation and warning message display +# obs1 <- data.frame(Time = log10((1:20) * 100), Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; warn <- fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), ylog = "log10", return = TRUE) ; cat(warn$warnings) +### add ggplot2 functions +# obs1 <- data.frame(Time = log10((1:20) * 100), Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "Time", categ = c("Group1", "Group2"), add = "+ggplot2::theme_classic()") +### all the arguments +# obs1 <- data.frame(x = 1:20, Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "x", categ = c("Group1", "Group2"), categ.class.order = list(NULL, c("B", "A")), categ.legend.name = "", categ.color = c("red", "blue"), bar.width = 0.25, error.disp = "SD", error.whisker.width = 0.8, dot.color = "grey", dot.tidy = FALSE, dot.bin.nb = 30, dot.jitter = 1, dot.size = 4, dot.border.size = 0, dot.alpha = 1, ylim = c(0, 25), ylog = "no", y.tick.nb = NULL, y.inter.tick.nb = NULL, y.include.zero = FALSE, y.top.extra.margin = 0.05, y.bottom.extra.margin = 0, stat.disp = "above", stat.size = 4, stat.dist = 2, xlab = "GROUP", ylab = "MEAN", vertical = FALSE, text.size = 12, title = "", title.text.size = 8, text.angle = 45, classic = TRUE, grid = TRUE, return = TRUE, plot = TRUE, add = NULL, warn.print = TRUE, path.lib = NULL) +# DEBUGGING +# data1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10), bar.color = rep(c("brown", "orange"), each = 10)) ; data1[2:3, 1] <- NA ; data1[7:8, 2] <- NA ; y = names(data1)[1] ; categ = c(names(data1)[2], names(data1)[3]) ; categ.class.order = list(L1 = NULL, L2 = c("B", "A")) ; categ.legend.name = NULL ; categ.color = na.omit(data1)$bar.color ; bar.width = 0.5 ; error.disp = "SD" ; error.whisker.width = 0.5 ; dot.color = "same" ; dot.tidy = FALSE ; dot.bin.nb = 30 ; dot.jitter = 0.25 ; dot.size = 3 ; dot.border.size = 0.5 ; dot.alpha = 1 ; ylim = NULL ; ylog = "no" ; y.tick.nb = NULL ; y.inter.tick.nb = NULL ; y.include.zero = FALSE ; y.top.extra.margin = 0.05 ; y.bottom.extra.margin = 0 ; stat.disp = NULL ; stat.size = 4 ; stat.dist = 2 ; xlab = NULL ; ylab = NULL ; vertical = TRUE ; text.size = 12 ; title = "" ; title.text.size = 8 ; text.angle = 0 ; classic = FALSE ; grid = FALSE ; return = FALSE ; plot = TRUE ; add = NULL ; warn.print = TRUE ; path.lib = NULL +# data1 <-data.frame(a = rep(1:20, 5), group1 = rep(c("G", "H"), times = 50), group2 = rep(LETTERS[1:5], each = 20)) ; y = names(data1)[1] ; categ = c(names(data1)[2], names(data1)[3]) ; categ.class.order = list(L1 = NULL, L2 = c("B", "A", "E", "D", "C")) ; categ.legend.name = NULL ; categ.color = NULL ; bar.width = 0.5 ; error.disp = "SD" ; error.whisker.width = 0.5 ; dot.color = "same" ; dot.tidy = TRUE ; dot.bin.nb = 30 ; dot.jitter = 0.25 ; dot.size = 3 ; dot.border.size = 0.5 ; dot.alpha = 1 ; ylim = NULL ; ylog = "no" ; y.tick.nb = NULL ; y.inter.tick.nb = NULL ; y.include.zero = FALSE ; y.top.extra.margin = 0.05 ; y.bottom.extra.margin = 0 ; stat.disp = NULL ; stat.size = 4 ; stat.dist = 2 ; xlab = NULL ; ylab = NULL ; vertical = TRUE ; text.size = 12 ; title = "" ; title.text.size = 8 ; text.angle = 0 ; classic = FALSE ; grid = FALSE ; return = FALSE; plot = TRUE ; add = NULL ; warn.print = TRUE ; path.lib = NULL +# data1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10), bar.color = rep(c("brown", "orange"), each = 10)) ; data1[2:3, 1] <- NA ; data1[7:8, 2] <- NA ; y = names(data1)[1] ; categ = c(names(data1)[2], names(data1)[3]) ; categ.class.order = list(L1 = NULL, L2 = c("B", "A")) ; categ.legend.name = NULL ; categ.color = na.omit(data1)$bar.color ; bar.width = 0.5 ; error.disp = "SD" ; error.whisker.width = 0.5 ; dot.color = "same" ; dot.tidy = TRUE ; dot.bin.nb = 30 ; dot.jitter = 0.25 ; dot.size = 3 ; dot.border.size = 0.5 ; dot.alpha = 1 ; ylim = NULL ; ylog = "no" ; y.tick.nb = NULL ; y.inter.tick.nb = NULL ; y.include.zero = FALSE ; y.top.extra.margin = 0.05 ; y.bottom.extra.margin = 0 ; stat.disp = "above" ; stat.size = 4 ; stat.dist = 2 ; xlab = NULL ; ylab = NULL ; vertical = TRUE ; text.size = 12 ; title = "" ; title.text.size = 8 ; text.angle = 0 ; classic = FALSE ; grid = FALSE ; return = FALSE; plot = TRUE ; add = NULL ; warn.print = TRUE ; path.lib = NULL +# set.seed(1) ; data1 <- data.frame(a = c(rnorm(25, 0), rnorm(25, -10), rnorm(25, 10), rnorm(25, 20)), group1 = rep(c("G", "H"), times = 50), group2 = rep(c("A", "B", "C", "D"), each = 25)) ; set.seed(NULL) ; y = "Time" ; categ = c("group1", "group2") ; categ.class.order = list(NULL, c("B", "A", "D", "C")) ; categ.legend.name = "LEGEND" ; categ.color = NULL ; bar.width = 0.8 ; error.disp = "SD" ; error.whisker.width = 0.5 ; dot.color = "same" ; dot.tidy = TRUE ; dot.bin.nb = 60 ; dot.jitter = 0.25 ; dot.size = 3.5 ; dot.border.size = 0 ; dot.alpha = 1 ; ylim= c(-15, 25) ; ylog = "no" ; y.tick.nb = NULL ; y.inter.tick.nb = NULL ; y.include.zero = "no" ; y.top.extra.margin = 0.05 ; y.bottom.extra.margin = 0 ; stat.disp = "above" ; stat.size = 4 ; stat.dist = 2 ; xlab = "GROUP" ; ylab = "MEAN" ; vertical = FALSE ; text.size = 12 ; title = "" ; title.text.size = 8 ; text.angle = -200 ; classic = FALSE ; grid = FALSE ; return = FALSE; plot = TRUE ; add = NULL ; warn.print = TRUE ; path.lib = NULL +# set.seed(1) ; data1 <- data.frame(x = 1:1000, group1 = rep(c("G", "H"), times = 500), group2 = rep(LETTERS[1:5], each = 200)) ; set.seed(NULL) ; y = "x" ; categ <- c("group1", "group2") ; categ.class.order = list(NULL, c("B", "A", "D", "C", "E")) ; categ.legend.name = "LEGEND" ; categ.color = NULL ; bar.width = 0.8 ; error.disp = "SD" ; error.whisker.width = 1 ; dot.color = NULL ; dot.tidy = FALSE ; dot.bin.nb = 60 ; dot.jitter = 0.25 ; dot.size = 3.5 ; dot.border.size = 0.2 ; dot.alpha = 1 ; ylim= c(1, 4) ; ylog = "log10" ; y.tick.nb = NULL ; y.inter.tick.nb = NULL ; y.include.zero = FALSE ; y.top.extra.margin = 0 ; y.bottom.extra.margin = 0 ; stat.disp = "above" ; stat.size = 4 ; stat.dist = 1 ; xlab = "GROUP" ; ylab = "MEAN" ; vertical = TRUE ; text.size = 12 ; title = "" ; title.text.size = 8 ; text.angle = -200 ; classic = FALSE ; grid = FALSE ; return = FALSE; plot = TRUE ; add = NULL ; warn.print = TRUE ; path.lib = NULL +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_2d_comp", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_2d_comp() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_gg_just", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_gg_just() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_gg_palette", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_gg_palette() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_name_change", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_name_change() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_pack", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_pack() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_round", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_round() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_scale", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_scale() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# reserved words to avoid bugs (used in this function) +reserved.words <- c("categ.check", "categ.color", "dot.color", "dot.max", "dot.min", "ERROR.INF", "ERROR.SUP", "group", "group.check", "max.dot.error", "MEAN", "min.dot.error", "SD", "SEM", "tempo.categ1", "tempo.categ2", "text.max.pos", "text.min.pos", "x", "x.y", "y", "y.check", "y_from.dot.max", "ymax") +# end reserved words to avoid bugs (used in this function) +# argument checking (and modification for proper color management) +warning <- NULL +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_check(data = data1, class = "data.frame", na.contain = TRUE, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & any(duplicated(names(data1)))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": DUPLICATED COLUMN NAMES OF data1 ARGUMENT NOT ALLOWED:\n", paste(names(data1)[duplicated(names(data1))], collapse = " "), "\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +tempo <- fun_check(data = y, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! (y %in% names(data1))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": y ARGUMENT MUST BE A COLUMN NAME OF data1\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +}else if(tempo$problem == FALSE){ +tempo <- fun_check(data = data1[, y], data.name = "y COLUMN OF data1", class = "vector", mode = "numeric", na.contain = TRUE, fun.name = function.name) ; eval(ee) +} +tempo <- fun_check(data = categ, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & length(categ) > 2){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": categ ARGUMENT CANNOT HAVE MORE THAN 2 COLUMN NAMES OF data1\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +}else if(tempo$problem == FALSE & ! all(categ %in% names(data1))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": categ ARGUMENT MUST BE COLUMN NAMES OF data1. HERE IT IS:\n", paste(categ, collapse = " "), "\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +# reserved word checking +if(any(names(data1) %in% reserved.words)){ +if(any(duplicated(names(data1)))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": DUPLICATED COLUMN NAMES OF data1 ARGUMENT NOT ALLOWED:\n", paste(names(data1)[duplicated(names(data1))], collapse = " "), "\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +tempo.output <- fun_name_change(names(data1), reserved.words) +for(i3 in 1:length(tempo.output$ini)){ # a loop to be sure to take the good ones +names(data1)[names(data1) == tempo.output$ini[i3]] <- tempo.output$post[i3] +if(any(y == tempo.output$ini[i3])){ +y[y == tempo.output$ini[i3]] <- tempo.output$post[i3] +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": IN y ARGUMENT (COLUMN NAMES OF data1 ARGUMENT),\n", tempo.output$ini[i3], " HAS BEEN REPLACED BY ", tempo.output$post[i3], "\nBECAUSE RISK OF BUG AS SOME NAMES IN y ARGUMENT ARE RESERVED WORD USED BY THE ", function.name, " FUNCTION") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +if(any(categ == tempo.output$ini[i3])){ +categ[categ == tempo.output$ini[i3]] <- tempo.output$post[i3] +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": IN categ ARGUMENT (COLUMN NAMES OF data1 ARGUMENT),\n", tempo.output$ini[i3], " HAS BEEN REPLACED BY ", tempo.output$post[i3], "\nBECAUSE RISK OF BUG AS SOME NAMES IN categ ARGUMENT ARE RESERVED WORD USED BY THE ", function.name, " FUNCTION") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +} +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": REGARDING COLUMN NAMES REPLACEMENT, THE NAMES\n", paste(tempo.output$ini, collapse = " "), "\nHAVE BEEN REPLACED BY\n", paste(tempo.output$post, collapse = " ")) +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +# end reserved word checking +# na detection and removal (done now to be sure of the correct length of categ) +if(any(is.na(data1[, c(y, categ)]))){ +removed.row.nb <- unlist(lapply(lapply(c(data1[c(y, categ)]), FUN = is.na), FUN = which)) +removed.rows <- data1[removed.row.nb, ] +data1 <- data1[-removed.row.nb, ] +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": NA DETECTED IN COLUMN ", paste(c(y, categ), collapse = " "), " OF data1 AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +}else{ +removed.row.nb <- NULL +removed.rows <- NULL +} +# end na detection and removal (done now to be sure of the correct length of categ) +for(i1 in 1:length(categ)){ +if(any(is.na(data1[, categ[i1]]))){ +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": IN categ NUMBER ", i1, " IN data1, THE CATEGORY COLUMN ", categ[i1], " CONTAINS NA") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +tempo1 <- fun_check(data = data1[, categ[i1]], data.name = paste0("categ NUMBER ", i1, " OF data1"), class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name, print = FALSE) +tempo2 <- fun_check(data = data1[, categ[i1]], data.name = paste0("categ NUMBER ", i1, " OF data1"), class = "factor", na.contain = TRUE, fun.name = function.name, print = FALSE) +if(tempo1$problem == TRUE & tempo2$problem == TRUE){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", paste0("categ NUMBER ", i1, " OF data1"), " MUST BE A FACTOR OR CHARACTER VECTOR\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +}else if(tempo1$problem == FALSE){ +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": IN categ NUMBER ", i1, " IN data1, THE CHARACTER COLUMN HAS BEEN CONVERTED TO FACTOR") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +data1[, categ[i1]] <- factor(data1[, categ[i1]]) # if already a factor, change nothing, if characters, levels according to alphabetical order +} +if( ! is.null(categ.class.order)){ +tempo <- fun_check(data = categ.class.order, class = "list", fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & length(categ.class.order) > 2){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": categ.class.order ARGUMENT MUST BE A LIST OF MAX LENGTH 2\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +}else if(tempo$problem == FALSE){ +for(i3 in 1:length(categ.class.order)){ +if(is.null(categ.class.order[[i3]])){ +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": THE categ.class.order COMPARTMENT ", i3, " IS NULL. ALPHABETICAL ORDER WILL BE APPLIED") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +data1[, categ[i3]] <- factor(as.character(data1[, categ[i3]])) # if already a factor, change nothing, if characters, levels according to alphabetical order +}else if(any(duplicated(categ.class.order[[i3]]))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": COMPARTMENT ", i3, " OF categ.class.order ARGUMENT CANNOT HAVE DUPLICATED CLASSES: ", paste(categ.class.order[[i3]], collapse = " "), "\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +}else if( ! (all(categ.class.order[[i3]] %in% unique(data1[, categ[i3]])) & all(unique(data1[, categ[i3]]) %in% categ.class.order[[i3]]))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": COMPARTMENT ", i3, " OF categ.class.order ARGUMENT MUST BE CLASSES OF ELEMENT ", i3, " OF categ\nHERE IT IS:\nCOMPARTMENT ", i3, " OF categ.class.order:", paste(categ.class.order[[i3]], collapse = " "), "\nCOLUMN ", categ[i3], " OF data1: ", paste( unique(data1[, categ[i3]]), collapse = " "), "\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +}else{ +data1[, categ[i3]] <- factor(data1[, categ[i3]], levels = categ.class.order[[i3]]) # reorder the factor + +} +} +} +} +if( ! is.null(categ.legend.name)){ +tempo <- fun_check(data = categ.legend.name, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) +}else{ +categ.legend.name <- categ[length(categ)] # if only categ1, then legend name of categ1, if length(categ) == 2, then legend name of categ2 +} +if( ! is.null(categ.color)){ +# check the nature of color +tempo1 <- fun_check(data = categ.color, class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name, print = FALSE) +tempo2 <- fun_check(data = categ.color, class = "factor", na.contain = TRUE, fun.name = function.name, print = FALSE) +if(tempo1$problem == TRUE & tempo2$problem == TRUE){ +# integer colors into gg_palette +tempo.check.color <- fun_check(data = categ.color, class = "integer", double.as.integer.allowed = TRUE, na.contain = TRUE, fun.name = function.name, print = FALSE)$problem +if(tempo.check.color == TRUE){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": categ.color MUST BE A FACTOR OR CHARACTER VECTOR OR INTEGER VECTOR\n\n================\n\n") # integer possible because dealt above +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +}else{ # convert integers into colors +categ.color <- fun_gg_palette(max(categ.color, na.rm = TRUE)) +} +# end integer colors into gg_palette +} +if( ! (all(categ.color %in% colors() | grepl(pattern = "^#", categ.color)))){ # check that all strings of low.color start by # +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": categ.color ARGUMENT MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # AND/OR COLOR NAMES GIVEN BY colors(): ", paste(unique(categ.color), collapse = " "), "\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +if(any(is.na(categ.color))){ +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": categ.color ARGUMENT CONTAINS NA") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +# end check the nature of color +# check the length of color +# No problem of NA management by ggplot2 because already removed +i0 <- length(categ) # if only categ1, then colors for classes of categ1, if length(categ) == 2, then colors for classes of categ2 +if(length(categ.color) == length(unique(data1[, categ[i0]]))){ # here length(categ.color) is equal to the different number of categ +data1[, categ[i0]] <- factor(data1[, categ[i0]]) # if already a factor, change nothing, if characters, levels according to alphabetical order +data1 <- data.frame(data1, categ.color = data1[, categ[i0]]) +levels(data1$categ.color) <- categ.color +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": IN ", categ[i0], " OF categ ARGUMENT, THE FOLLOWING COLORS:\n", paste(categ.color, collapse = " "), "\nHAVE BEEN ATTRIBUTED TO THESE CLASSES:\n", paste(levels(factor(data1[, categ[i0]])), collapse = " ")) +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +}else if(length(categ.color) == length(data1[, categ[i0]])){# here length(categ.color) is equal to nrow(data1) -> Modif to have length(categ.color) equal to the different number of categ (length(categ.color) == length(levels(data1[, categ[i0]]))) +data1 <- data.frame(data1, categ.color = categ.color) +tempo.check <- unique(data1[ , c(categ[i0], "categ.color")]) +if( ! (nrow(tempo.check) == length(unique(categ.color)) & nrow(tempo.check) == length(unique(data1[ , categ[i0]])))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": categ.color ARGUMENT HAS THE LENGTH OF data1 ROW NUMBER\nBUT IS INCORRECTLY ASSOCIATED TO EACH CLASS OF categ ", categ[i0], ":\n", paste(unique(mapply(FUN = "paste", data1[ ,categ[i0]], data1[ ,"categ.color"])), collapse = "\n"), "\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +}else{ +data1[, categ[i0]] <- factor(data1[, categ[i0]]) # if already a factor, change nothing, if characters, levels according to alphabetical order +categ.color <- unique(categ.color[order(data1[, categ[i0]])]) # Modif to have length(categ.color) equal to the different number of categ (length(categ.color) == length(levels(data1[, categ[i0]]))) +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": categ.color ARGUMENT HAS THE LENGTH OF data1 ROW NUMBER\nCOLORS HAVE BEEN RESPECTIVELY ASSOCIATED TO EACH CLASS OF categ ", categ[i0], " AS:\n", paste(levels(factor(data1[, categ[i0]])), collapse = " "), "\n", paste(categ.color, collapse = " ")) +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +}else if(length(categ.color) == 1){ +data1[, categ[i0]] <- factor(data1[, categ[i0]]) # if already a factor, change nothing, if characters, levels according to alphabetical order +data1 <- data.frame(data1, categ.color = categ.color) +categ.color <- rep(categ.color, length(levels(data1[, categ[i0]]))) +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": categ.color ARGUMENT HAS LENGTH 1, MEANING THAT ALL THE DIFFERENT CLASSES OF ", categ[i0], "\n", paste(levels(factor(data1[, categ[i0]])), collapse = " "), "\nWILL HAVE THE SAME COLOR\n", paste(categ.color, collapse = " ")) +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +}else{ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": categ.color ARGUMENT MUST BE (1) LENGTH 1, OR (2) THE LENGTH OF data1 NROWS, OR (3) THE LENGTH OF THE CLASSES IN THE categ ", categ[i0], " COLUMN. HERE IT IS COLOR LENGTH ", length(categ.color), " VERSUS CATEG LENGTH ", length(data1[, categ[i0]]), " AND CATEG CLASS LENGTH ", length(unique(data1[, categ[i0]])), "\nPRESENCE OF NA COULD BE THE PROBLEM\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +}else{ +i0 <- length(categ) # if only categ1, then colors for classes of categ1, if length(categ) == 2, then colors for classes of categ2 +data1[, categ[i0]] <- factor(data1[, categ[i0]]) # if already a factor, change nothing, if characters, levels according to alphabetical order +categ.color <- fun_gg_palette(length(levels(data1[, categ[i0]]))) +data1 <- data.frame(data1, categ.color = data1[, categ[i0]]) +levels(data1$categ.color) <- categ.color +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": NULL categ.color ARGUMENT -> COLORS RESPECTIVELY ATTRIBUTED TO EACH CLASS OF ", categ[i0], " IN data1:\n", paste(categ.color, collapse = " "), "\n", paste(levels(data1[, categ[i0]]), collapse = " ")) +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +tempo <- fun_check(data = bar.width, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(error.disp)){ +tempo <- fun_check(data = error.disp, options = c("SD", "SD.TOP", "SEM", "SEM.TOP"), length = 1, fun.name = function.name) ; eval(ee) +} +tempo <- fun_check(data = error.whisker.width, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(dot.color)){ +# check the nature of color +tempo1 <- fun_check(data = dot.color, class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name, print = FALSE) +tempo2 <- fun_check(data = dot.color, class = "factor", na.contain = TRUE, fun.name = function.name, print = FALSE) +if(tempo1$problem == TRUE & tempo2$problem == TRUE){ +# integer colors into gg_palette +tempo.check.color <- fun_check(data = dot.color, class = "integer", double.as.integer.allowed = TRUE, na.contain = TRUE, fun.name = function.name, print = FALSE)$problem +if(tempo.check.color == TRUE){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": dot.color MUST BE A FACTOR OR CHARACTER VECTOR OR INTEGER VECTOR\n\n================\n\n") # integer possible because dealt above +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +}else{ # convert integers into colors +dot.color <- fun_gg_palette(max(dot.color, na.rm = TRUE)) +} +# end integer colors into gg_palette +} +if(all(dot.color == "same") & length(dot.color) == 1){ +dot.color <- categ.color # same color of the dots as the corresponding bar color +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": dot.color ARGUMENT HAS BEEN SET TO \"SAME\"\nTHUS, DOT COLORS HAVE BEEN RESPECTIVELY ASSOCIATED TO EACH CLASS OF categ ", categ[i0], " AS:\n", paste(levels(factor(data1[, categ[i0]])), collapse = " "), "\n", paste(levels(factor(dot.color)), collapse = " ")) +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +}else if( ! (all(dot.color %in% colors() | grepl(pattern = "^#", dot.color)))){ # check that all strings of low.color start by # +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": dot.color ARGUMENT MUST BE (1) A HEXADECIMAL COLOR VECTOR STARTING BY #, OR (2) COLOR NAMES GIVEN BY colors(), OR (3) INTEGERS, OR THE STRING\"same\"\nHERE IT IS: ", paste(unique(dot.color), collapse = " "), "\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +if(any(is.na(dot.color))){ +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": dot.color ARGUMENT CONTAINS NA") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +# end check the nature of color +# check the length of color +# No problem of NA management by ggplot2 because already removed +i0 <- length(categ) # if only categ1, then colors for classes of categ1, if length(categ) == 2, then colors for classes of categ2 +if(length(dot.color) == length(unique(data1[, categ[i0]]))){ # here length(dot.color) is equal to the different number of categ +data1[, categ[i0]] <- factor(data1[, categ[i0]]) # if already a factor, change nothing, if characters, levels according to alphabetical order +data1 <- data.frame(data1, dot.color = data1[, categ[i0]]) +levels(data1$dot.color) <- dot.color +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": IN ", categ[i0], " OF categ ARGUMENT, THE FOLLOWING COLORS:\n", paste(dot.color, collapse = " "), "\nHAVE BEEN ATTRIBUTED TO THESE CLASSES:\n", paste(levels(factor(data1[, categ[i0]])), collapse = " ")) +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +}else if(length(dot.color) == length(data1[, categ[i0]])){# here length(dot.color) is equal to nrow(data1) -> Modif to have length(dot.color) equal to the different number of categ (length(dot.color) == length(levels(data1[, categ[i0]]))) +data1 <- data.frame(data1, dot.color = dot.color) +}else if(length(dot.color) == 1 & ! all(dot.color == "same")){ +data1[, categ[i0]] <- factor(data1[, categ[i0]]) # if already a factor, change nothing, if characters, levels according to alphabetical order +data1 <- data.frame(data1, dot.color = dot.color) +dot.color <- rep(dot.color, length(levels(data1[, categ[i0]]))) +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": dot.color ARGUMENT HAS LENGTH 1, MEANING THAT ALL THE DIFFERENT CLASSES OF ", categ[i0], "\n", paste(levels(factor(data1[, categ[i0]])), collapse = " "), "\nWILL HAVE THE SAME COLOR\n", paste(dot.color, collapse = " ")) +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +}else{ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": dot.color ARGUMENT MUST BE (1) LENGTH 1, OR (2) THE LENGTH OF data1 NROWS, OR (3) THE LENGTH OF THE CLASSES IN THE categ ", categ[i0], " COLUMN. HERE IT IS COLOR LENGTH ", length(dot.color), " VERSUS CATEG LENGTH ", length(data1[, categ[i0]]), " AND CATEG CLASS LENGTH ", length(unique(data1[, categ[i0]])), "\nPRESENCE OF NA COULD BE THE PROBLEM\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +} +tempo <- fun_check(data = dot.tidy, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = dot.bin.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = dot.jitter, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = dot.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = dot.border.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = dot.alpha, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(ylim)){ +tempo <- fun_check(data = ylim, class = "vector", mode = "numeric", length = 2, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & any(ylim %in% c(Inf, -Inf))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ylim ARGUMENT CANNOT CONTAIN -Inf OR Inf VALUES\n\n================\n\n") + +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +} +tempo <- fun_check(data = ylog, options = c("no", "log2", "log10"), length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ylog != "no"){ +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": ylog ARGUMENT SET TO ", ylog, ".\nVALUES FROM THE y ARGUMENT COLUMN OF THE data1 DATA FRAME MUST BE ALREADY ", toupper(ylog), " TRANSFORMED, AS THE ylog ARGUMENT JUST MODIFIES THE AXIS SCALE") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +if( ! is.null(ylim)){ +if(any(ylim <= 0)){ +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": ylim ARGUMENT CAN SPAN ZERO OR NEGATIVE VALUES IF ylog ARGUMENT IS SET TO ", ylog, " BECAUSE THIS LATTER ARGUMENT DOES NOT TRANSFORM DATA, JUST MODIFIES THE AXIS SCALE") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +}else if(any( ! is.finite(if(ylog == "log10"){10^ylim}else{2^ylim}))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ylim ARGUMENT RETURNS INF WITH THE ylog ARGUMENT SET TO ", ylog, "\nAS SCALE COMPUTATION IS ", ifelse(ylog == "log10", 10, 2), "^ylim:\n", paste(ifelse(ylog == "log10", 10, 2)^ylim, collapse = " "), "\nARE YOU SURE THAT ylim ARGUMENT HAS BEEN SPECIFIED WITH VALUES ALREADY IN LOG SCALE?\n", paste(ylim, collapse = " "), "\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +} +} +if( ! is.null(y.tick.nb)){ +tempo <- fun_check(data = y.tick.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & y.tick.nb < 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": y.tick.nb ARGUMENT MUST BE A NON NULL POSITIVE INTEGER\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +} +if( ! is.null(y.inter.tick.nb)){ +tempo <- fun_check(data = y.inter.tick.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & y.inter.tick.nb < 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": y.inter.tick.nb ARGUMENT MUST BE A NON NULL POSITIVE INTEGER\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +} +tempo <- fun_check(data = y.include.zero, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) +# inactivated because xlim and ylim already log transformed +# if(tempo$problem == FALSE & ylog != "no" & y.include.zero == TRUE){ +# tempo.warning <- paste0("FROM FUNCTION ", function.name, ": ylog ARGUMENT SET TO ", ylog, " AND y.include.zero ARGUMENT SET TO TRUE -> y.include.zero ARGUMENT RESET TO FALSE BECAUSE NO 0 ALLOWED IN LOG SCALE") +# warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +# } +tempo <- fun_check(data = y.top.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = y.bottom.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(stat.disp)){ +tempo <- fun_check(data = stat.disp, options = c("top", "above"), length = 1, fun.name = function.name) ; eval(ee) +} +tempo <- fun_check(data = stat.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = stat.dist, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(xlab)){ +if(all(class(xlab) %in% "expression")){ # to deal with math symbols +tempo <- fun_check(data = xlab, class = "expression", length = 1, fun.name = function.name) ; eval(ee) +}else{ +tempo <- fun_check(data = xlab, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +} +} +if( ! is.null(ylab)){ +if(all(class(ylab) %in% "expression")){ # to deal with math symbols +tempo <- fun_check(data = ylab, class = "expression", length = 1, fun.name = function.name) ; eval(ee) +}else{ +tempo <- fun_check(data = ylab, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +} +} +tempo <- fun_check(data = vertical, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ylog != "no" & vertical == FALSE){ +vertical <- TRUE +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": BECAUSE OF A BUG IN ggplot2, CANNOT FLIP BARS HORIZONTALLY WITH A YLOG SCALE -> vertical ARGUMENT RESET TO TRUE") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +tempo <- fun_check(data = text.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = title, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = title.text.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = text.angle, class = "vector", typeof = "integer", double.as.integer.allowed = TRUE, length = 1, neg.values = TRUE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = classic, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = grid, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = return, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = plot, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(add)){ +tempo <- fun_check(data = add, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! grepl(pattern = "^\\+", add)){ # check that the add string start by + +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": add ARGUMENT MUST START WITH \"+\": ", paste(unique(add), collapse = " "), "\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +}else if(tempo$problem == FALSE & ! grepl(pattern = "ggplot2::", add)){ # +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": add ARGUMENT MUST CONTAIN \"ggplot2::\" IN FRONT OF EACH GGPLOT2 FUNCTION: ", paste(unique(add), collapse = " "), "\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +}else if(tempo$problem == FALSE & ! grepl(pattern = ")$", add)){ # check that the add string finished by ) +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": add ARGUMENT MUST FINISH BY \")\": ", paste(unique(add), collapse = " "), "\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +} +tempo <- fun_check(data = warn.print, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(path.lib)){ +tempo <- fun_check(data = path.lib, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! all(dir.exists(path.lib))){ +cat(paste0("\n\n============\n\nERROR IN ", function.name, ": \nDIRECTORY PATH INDICATED IN THE path.lib PARAMETER DOES NOT EXISTS: ", path.lib, "\n\n============\n\n")) +arg.check <- c(arg.check, TRUE) +} +} +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_check() +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() +# end argument checking (and modification for proper color management) +# package checking +fun_pack(req.package = c("ggplot2"), path.lib = path.lib) +fun_pack(req.package = c("scales"), path.lib = path.lib) +# end package checking +# main code +if(length(categ) == 1){ +# new data frames for bar and error bars +mean.dataframe <- aggregate(x = data1[y], by = {x.env <- list(data1[, categ[1]]) ; names(x.env) <-categ[1] ; x.env}, FUN = mean, na.rm = TRUE) +sd.dataframe <- aggregate(x = data1[y], by = {x.env <- list(data1[, categ[1]]) ; names(x.env) <-categ[1] ; x.env}, FUN = sd, na.rm = TRUE) +nb.dataframe <- aggregate(x = data1[y], by = {x.env <- list(data1[, categ[1]]) ; names(x.env) <- categ[1] ; x.env}, FUN = function(x.env2){length(x.env2[ ! is.na(x.env2)])}) +if( ! all(identical(mean.dataframe[, categ[1]], sd.dataframe[, categ[1]]) & identical(mean.dataframe[, categ[1]], nb.dataframe[, categ[1]]))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": aggregate OUTPUT IS DIFFERENT IN TERM OF CLASS ORDER FOR mean.dataframe, sd.dataframe AND nb.dataframe. CODE HAS TO BE MODIFIED\n\n================\n\n") +stop(tempo.cat) +}else{ +sem.dataframe <- sd.dataframe +sem.dataframe[, y] <- sd.dataframe[, y] / (nb.dataframe[, y])^0.5 +} +# end new data frames for bar and error bars +# data1 check categ order for dots coordinates recovery +data1 <- data.frame(data1, categ.check = data1[, categ[1]]) +data1$categ.check <- as.integer(data1$categ.check) # to check that data1[, categ[1]] and dot.coord$group are similar, during merging +# end data1 check categ order for dots coordinates recovery +# per bar dots coordinates recovery +tempo.gg.name <- "gg.indiv.plot." +tempo.gg.count <- 0 +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ggplot(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, fill = categ[1]))) # fill because this is what is used with geom_bar +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point(stroke = dot.border.size, size = dot.size, alpha = dot.alpha, pch = 21)) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_boxplot()) # to easily have the equivalent of the grouped bars +dot.coord <- ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))$data[[1]] +if( ! is.null(dot.color)){ +dot.coord <- data.frame(dot.coord[order(dot.coord$group, dot.coord$y), ], y.check = as.double(data1[order(data1$categ.check, data1[, y]), y]), categ.check = data1[order(data1$categ.check, data1[, y]), "categ.check"], dot.color = data1[order(data1$categ.check, data1[, y]), "dot.color"], tempo.categ1 = data1[order(data1$categ.check, data1[, y]), categ[1]]) # y.check to be sure that the order is the same between the y of data1 and the y of dot.coord +names(dot.coord)[names(dot.coord) == "tempo.categ1"] <- categ[1] +if( ! identical(dot.coord$y, dot.coord$y.check)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": (dot.coord$y AND dot.coord$y.check) AS WELL AS (dot.coord$group AND dot.coord$categ.check) MUST BE IDENTICAL. CODE HAS TO BE MODIFIED\n\n================\n\n") +stop(tempo.cat) +} +} +# end per bar dots coordinates recovery +}else if(length(categ) == 2){ +# new data frames for bar and error bars +mean.dataframe <- aggregate(x = data1[y], by = {x.env <- list(data1[, categ[1]], data1[, categ[2]]) ; names(x.env) <- c(categ[1], categ[2]) ; x.env}, FUN = mean, na.rm = TRUE) +sd.dataframe <- aggregate(x = data1[y], by = {x.env <- list(data1[, categ[1]], data1[, categ[2]]) ; names(x.env) <- c(categ[1], categ[2]) ; x.env}, FUN = sd, na.rm = TRUE) +nb.dataframe <- aggregate(x = data1[y], by = {x.env <- list(data1[, categ[1]], data1[, categ[2]]) ; names(x.env) <- c(categ[1], categ[2]) ; x.env}, FUN = function(x.env2){length(x.env2[ ! is.na(x.env2)])}) +tempo.check.mean <- mapply(FUN = "paste", mean.dataframe[, categ[1]], mean.dataframe[, categ[2]], sep = "_") +tempo.check.sd <- mapply(FUN = "paste", sd.dataframe[, categ[1]], sd.dataframe[, categ[2]], sep = "_") +tempo.check.nb <- mapply(FUN = "paste", nb.dataframe[, categ[1]], nb.dataframe[, categ[2]], sep = "_") +if( ! all(identical(tempo.check.mean, tempo.check.sd) & identical(tempo.check.mean, tempo.check.nb))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": aggregate OUTPUT IS DIFFERENT IN TERM OF CLASS ORDER FOR mean.dataframe, sd.dataframe AND nb.dataframe. CODE HAS TO BE MODIFIED\n\n================\n\n") +stop(tempo.cat) +}else{ +sem.dataframe <- sd.dataframe +sem.dataframe[, y] <- sd.dataframe[, y] / (nb.dataframe[, y])^0.5 +} +# end new data frames for bar and error bars +# data1 check categ order for dots coordinates recovery +tempo.factor <- paste0(data1[order(data1[, categ[2]], data1[, categ[1]]), categ[2]], "_", data1[order(data1[, categ[2]], data1[, categ[1]]), categ[1]]) +data1 <- data.frame(data1[order(data1[, categ[2]], data1[, categ[1]]), ], categ.check = factor(tempo.factor, levels = unique(tempo.factor))) +data1$categ.check <- as.integer(data1$categ.check) +# end data1 check categ order for dots coordinates recovery +# per bar dots coordinates recovery +tempo.gg.name <- "gg.indiv.plot." +tempo.gg.count <- 0 +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ggplot(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, fill = categ[2]))) # fill because this is what is used with geom_bar +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point(stroke = dot.border.size, size = dot.size, alpha = dot.alpha, pch = 21)) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_boxplot()) # to easily have the equivalent of the grouped bars +dot.coord <- ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))$data[[1]] +if( ! is.null(dot.color)){ +dot.coord <- data.frame(dot.coord[order(dot.coord$group, dot.coord$y), ], y.check = as.double(data1[order(data1$categ.check, data1[, y]), y]), categ.check = data1[order(data1$categ.check, data1[, y]), "categ.check"], dot.color = data1[order(data1$categ.check, data1[, y]), "dot.color"], tempo.categ1 = data1[order(data1$categ.check, data1[, y]), categ[1]], tempo.categ2 = data1[order(data1$categ.check, data1[, y]), categ[2]]) # y.check to be sure that the order is the same between the y of data1 and the y of dot.coord +names(dot.coord)[names(dot.coord) == "tempo.categ1"] <- categ[1] +names(dot.coord)[names(dot.coord) == "tempo.categ2"] <- categ[2] +if( ! (identical(dot.coord$y, dot.coord$y.check) & identical(dot.coord$group, dot.coord$categ.check))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": (dot.coord$y AND dot.coord$y.check) AS WELL AS (dot.coord$group AND dot.coord$categ.check) MUST BE IDENTICAL. CODE HAS TO BE MODIFIED\n\n================\n\n") +stop(tempo.cat) +} +} +}else{ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 2\n\n============\n\n")) +stop(tempo.cat) +} +data2 <- mean.dataframe +if( ! is.null(error.disp)){ +if(error.disp == "SD"){ +data2 <- data.frame(data2, SD = sd.dataframe[, y], ERROR.INF = mean.dataframe[, y] - sd.dataframe[, y], ERROR.SUP = mean.dataframe[, y] + sd.dataframe[, y]) +}else if(error.disp == "SD.TOP"){ +data2 <- data.frame(data2, SD = sd.dataframe[, y], ERROR.INF = mean.dataframe[, y], ERROR.SUP = mean.dataframe[, y] + sd.dataframe[, y]) +}else if(error.disp == "SEM"){ +data2 <- data.frame(data2, SEM = sem.dataframe[, y], ERROR.INF = mean.dataframe[, y] - sem.dataframe[, y], ERROR.SUP = mean.dataframe[, y] + sem.dataframe[, y]) +}else if(error.disp == "SEM.TOP"){ +data2 <- data.frame(data2, SEM = sem.dataframe[, y], ERROR.INF = mean.dataframe[, y], ERROR.SUP = mean.dataframe[, y] + sem.dataframe[, y]) +}else{ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 3\n\n============\n\n")) +stop(tempo.cat) +} +} +# stat output +stat <- data2 +names(stat)[names(stat) == y] <- "MEAN" +# end stat output +# range depending on means and error bars +if(is.null(ylim)){ +if(is.null(dot.color)){ # no dots plotted +if( ! is.null(error.disp)){ +if(any(c(data2[, "ERROR.INF"], data2[, "ERROR.SUP"]) %in% c(Inf, -Inf))){ +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": THE data2 ARGUMENT CONTAINS -Inf OR Inf VALUES IN THE ERROR.INF OR ERROR.SUP COLUMN, THAT WILL NOT BE CONSIDERED IN THE PLOT RANGE") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +ylim <- range(c(data2[, "ERROR.INF"], data2[, "ERROR.SUP"]), na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only +}else{ +if(any(data2[, y] %in% c(Inf, -Inf))){ +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": THE data2 ARGUMENT CONTAINS -Inf OR Inf VALUES IN THE y COLUMN, THAT WILL NOT BE CONSIDERED IN THE PLOT RANGE") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +ylim <- range(data2[, y], na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only +} +}else{ +if(any(data1[, y] %in% c(Inf, -Inf))){ +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": THE data1 ARGUMENT CONTAINS -Inf OR Inf VALUES IN THE y COLUMN, THAT WILL NOT BE CONSIDERED IN THE PLOT RANGE") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +ylim <- range(data1[, y], na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only +} +} +if(suppressWarnings(all(ylim %in% c(Inf, -Inf)))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, " COMPUTED YLIM CONTAINS Inf VALUES, BECAUSE VALUES FROM data2 ARGUMENTS ARE NA OR Inf ONLY\n\n================\n\n") +stop(tempo.cat) +} +# end range depending on means and error bars +ylim.order <- order(ylim) # to deal with inverse axis +ylim <- sort(ylim) +ylim[1] <- ylim[1] - abs(ylim[2] - ylim[1]) * ifelse(diff(ylim.order) > 0, y.bottom.extra.margin, y.top.extra.margin) # diff(ylim.order) > 0 means not inversed axis +ylim[2] <- ylim[2] + abs(ylim[2] - ylim[1]) * ifelse(diff(ylim.order) > 0, y.top.extra.margin, y.bottom.extra.margin) # diff(ylim.order) > 0 means not inversed axis +if(y.include.zero == TRUE){ # no need to check ylog != "no" because done before +ylim <- range(c(ylim, 0), na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only +} +ylim <- ylim[ylim.order] +if(any(is.na(ylim))){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 4\n\n============\n\n")) +stop(tempo.cat) +} +# width commputations +if(length(categ) == 2){ +bar.width2 <- bar.width / length(unique(data1[, categ[length(categ)]])) # real width of each bar in x-axis unit, among the set of grouped bar. Not relevant if no grouped bars length(categ) == 1 +}else if(length(categ) == 1){ +bar.width2 <- bar.width +}else{ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 5\n\n============\n\n")) +stop(tempo.cat) +} +error.whisker.width <- bar.width * error.whisker.width # real error bar width +dot.jitter <- bar.width2 * dot.jitter # real dot.jitter +# end width commputations +# barplot +# constant part +tempo.gg.name <- "gg.indiv.plot." +tempo.gg.count <- 0 +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ggplot()) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::xlab(if(is.null(xlab)){categ[1]}else{xlab})) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ylab(if(is.null(ylab)){y}else{ylab})) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ggtitle(title)) +# text angle management +tempo.just <- fun_gg_just(angle = text.angle, axis = ifelse(vertical == TRUE, "x", "y")) +# end text angle management +add.check <- TRUE +if( ! is.null(add)){ # if add is NULL, then = 0 +if(grepl(pattern = "ggplot2::theme", add) == TRUE){ +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": \"ggplot2::theme\" STRING DETECTED IN THE add ARGUMENT -> INTERNAL GGPLOT2 THEME FUNCTIONS theme() AND theme_classic() HAVE BEEN INACTIVATED, TO BE USED BY THE USER") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +add.check <- FALSE +} +} +if(add.check == TRUE & classic == TRUE){ +# BEWARE: not possible to add several times theme(). NO message but the last one overwrites the others +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::theme_classic(base_size = text.size)) +if(grid == TRUE){ +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( +text = ggplot2::element_text(size = text.size), +plot.title = ggplot2::element_text(size = title.text.size), # stronger than text +line = ggplot2::element_line(size = 0.5), +axis.line.y.left = ggplot2::element_line(colour = "black"), # draw lines for the y axis +axis.line.x.bottom = ggplot2::element_line(colour = "black"), # draw lines for the x axis +panel.grid.major.x = if(vertical == TRUE){NULL}else{ggplot2::element_line(colour = "grey75")}, +panel.grid.major.y = if(vertical == TRUE){ggplot2::element_line(colour = "grey75")}else{NULL}, +axis.text.x = if(vertical == TRUE){ggplot2::element_text(angle = tempo.just$angle, hjust = tempo.just$hjust, vjust = tempo.just$vjust)}else{NULL}, +axis.text.y = if(vertical == TRUE){NULL}else{ggplot2::element_text(angle = tempo.just$angle, hjust = tempo.just$hjust, vjust = tempo.just$vjust)} +)) +}else{ +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( +text = ggplot2::element_text(size = text.size), +plot.title = ggplot2::element_text(size = title.text.size), # stronger than text +line = ggplot2::element_line(size = 0.5), +axis.line.y.left = ggplot2::element_line(colour = "black"), +axis.line.x.bottom = ggplot2::element_line(colour = "black"), +axis.text.x = if(vertical == TRUE){ggplot2::element_text(angle = tempo.just$angle, hjust = tempo.just$hjust, vjust = tempo.just$vjust)}else{NULL}, +axis.text.y = if(vertical == TRUE){NULL}else{ggplot2::element_text(angle = tempo.just$angle, hjust = tempo.just$hjust, vjust = tempo.just$vjust)} +)) +} +}else if(add.check == TRUE & classic == FALSE){ +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( +text = ggplot2::element_text(size = text.size), +plot.title = ggplot2::element_text(size = title.text.size), # stronger than text +line = ggplot2::element_line(size = 0.5), +panel.background = ggplot2::element_rect(fill = "grey95"), +axis.line.y.left = ggplot2::element_line(colour = "black"), +axis.line.x.bottom = ggplot2::element_line(colour = "black"), +panel.grid.major.x = ggplot2::element_line(colour = "grey75"), +panel.grid.major.y = ggplot2::element_line(colour = "grey75"), +panel.grid.minor.x = ggplot2::element_blank(), +panel.grid.minor.y = ggplot2::element_blank(), +strip.background = ggplot2::element_rect(fill = "white", colour = "black"), +axis.text.x = if(vertical == TRUE){ggplot2::element_text(angle = tempo.just$angle, hjust = tempo.just$hjust, vjust = tempo.just$vjust)}else{NULL}, +axis.text.y = if(vertical == TRUE){NULL}else{ggplot2::element_text(angle = tempo.just$angle, hjust = tempo.just$hjust, vjust = tempo.just$vjust)} +)) +} +# end constant part +# barplot and error bars +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_bar(data = data2, mapping = ggplot2::aes_string(x = categ[1], y = y, fill = categ[length(categ)]), stat = "identity", position = ggplot2::position_dodge(width = NULL), color = "black", width = bar.width)) # stat = "identity" because already counted, position = position_dodge(width = NULL) for grouped bars (width = NULL means no overlap between grouped bars). Please, see explanation in https://stackoverflow.com/questions/34889766/what-is-the-width-argument-in-position-dodge/35102486#35102486 +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "fill", name = categ.legend.name, values = as.character(categ.color), guide = ggplot2::guide_legend(override.aes = list(fill = categ.color)))) # values are the values of color (which is the border color in geom_bar. BEWARE: values = categ.color takes the numbers to make the colors if categ.color is a factor +if( ! is.null(error.disp)){ +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_errorbar(data = data2, mapping = ggplot2::aes_string(x = categ[1], group = categ[length(categ)], ymin = "ERROR.INF", ymax = "ERROR.SUP"), position = ggplot2::position_dodge(width = bar.width), color = "black", width = error.whisker.width)) # cannot use fill = categ[length(categ)] because not an aesthetic of geom_errorbar, but if only x = categ[1], wrong x coordinates with grouped bars +} +# end barplot and error bars +# coordinates management (for random plotting and for stat display) +# bars +bar.coord <- ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))$data[[1]] # to have the summary statistics of the plot. Here because can be required for stat.disp when just bar are plotted +# end bars +if( ! is.null(dot.color)){ +# random dots +if(dot.tidy == FALSE){ +dot.coord.rd1 <- merge(dot.coord, bar.coord[c("fill", "group", "x")], by = intersect("group", "group"), sort = FALSE) # rd for random. Send the coord of the bars into the coord data.frame of the dots (in the column x.y). BEWARE: by = intersect("group", "group") because group is enough as only one value of x per group number in bar.coord. Thus, no need to consider fill +if(nrow(dot.coord.rd1) != nrow(dot.coord)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE merge() FUNCTION DID NOT RETURN A CORRECT dot.coord.rd1 DATA FRAME. CODE HAS TO BE MODIFIED\n\n================\n\n") +stop(tempo.cat) +} +set.seed(1) +sampled.dot.jitter <- if(nrow(dot.coord.rd1) == 1){runif(n = nrow(dot.coord.rd1), min = - dot.jitter / 2, max = dot.jitter / 2)}else{sample(x = runif(n = nrow(dot.coord.rd1), min = - dot.jitter / 2, max = dot.jitter / 2), size = nrow(dot.coord.rd1), replace = FALSE)} +dot.coord.rd2 <- data.frame(dot.coord.rd1, dot.x = dot.coord.rd1$x.y + sampled.dot.jitter) # set the dot.jitter thanks to runif and dot.jitter range. Then, send the coord of the bars into the coord data.frame of the dots (in the column x.y) +set.seed(NULL) +if(length(categ) == 1){ +tempo.data1 <- unique(data.frame(data1[categ[1]], group = as.integer(factor(as.numeric(data1[, categ[1]]))))) # categ[2] first if categ[2] is used to make the categories in ggplot and categ[1] is used to make the x-axis +names(tempo.data1)[names(tempo.data1) == categ[1]] <- paste0(categ[1], ".check") +verif <- paste0(categ[1], ".check") +}else if(length(categ) == 2){ +tempo.data1 <- unique(data.frame(data1[c(categ[1], categ[2])], group = as.integer(factor(paste0(as.numeric(data1[, categ[2]]), ".", as.numeric(data1[, categ[1]])))))) # categ[2] first if categ[2] is used to make the categories in ggplot and categ[1] is used to make the x-axis +names(tempo.data1)[names(tempo.data1) == categ[1]] <- paste0(categ[1], ".check") +names(tempo.data1)[names(tempo.data1) == categ[2]] <- paste0(categ[2], ".check") +verif <- c(paste0(categ[1], ".check"), paste0(categ[2], ".check")) +}else{ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 6\n\n============\n\n")) +stop(tempo.cat) +} +dot.coord.rd3 <- merge(dot.coord.rd2, tempo.data1, by = "group", sort = FALSE) # send the factors of data1 into coord +if(nrow(dot.coord.rd3) != nrow(dot.coord) | ( ! fun_2d_comp(dot.coord.rd3[categ], dot.coord.rd3[verif])$identical.content)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE merge() FUNCTION DID NOT RETURN A CORRECT dot.coord.rd3 DATA FRAME. CODE HAS TO BE MODIFIED\n\n================\n\n") +stop(tempo.cat) +} +# end random dots +} +# tidy dots +# coordinates are recover during plotting (see dot.coord.tidy1 below) +# end tidy dots +} +# end coordinates management (for random plotting and for stat display) +# dot display +if( ! is.null(dot.color)){ +if(dot.tidy == FALSE){ +if(dot.border.size == 0){ +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point(data = dot.coord.rd3, mapping = ggplot2::aes_string(x = "dot.x", y = "y", group = categ[length(categ)]), size = dot.size, color = dot.coord.rd3$dot.color, alpha = dot.alpha, pch = 16)) # group used in aesthetic to do not have it in the legend. Here ggplot2::scale_discrete_manual() cannot be used because of the group easthetic +}else{ +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point(data = dot.coord.rd3, mapping = ggplot2::aes_string(x = "dot.x", y = "y", group = categ[length(categ)]), stroke = dot.border.size, size = dot.size, fill = dot.coord.rd3$dot.color, alpha = dot.alpha, pch = 21)) # group used in aesthetic to do not have it in the legend. Here ggplot2::scale_discrete_manual() cannot be used because of the group easthetic +} +}else if(dot.tidy == TRUE){ +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_dotplot(data = dot.coord, mapping = ggplot2::aes_string(x = categ[1], y = "y", color = categ[length(categ)]), position = ggplot2::position_dodge(width = bar.width), binaxis = "y", stackdir = "center", alpha = dot.alpha, fill = dot.coord[rev(order(dot.coord[, categ[1]], decreasing = TRUE)), "dot.color"], show.legend = FALSE, binwidth = (ylim[2] - ylim[1]) / dot.bin.nb)) # very weird behavior of geom_dotplot, because data1 seems reorderer according to x = categ[1] before plotting. Thus, I have to use fill = dot.coord[rev(order(dot.coord[, categ[1]], decreasing = TRUE)), "dot.color"] to have the good corresponding colors # show.legend option do not remove the legend, only the aesthetic of the legend (dot, line, etc.) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "color", name = categ.legend.name, values = if(dot.border.size == 0){as.character(levels(dot.coord[rev(order(dot.coord[, categ[1]], decreasing = TRUE)), "dot.color"]))}else{rep("black", length(categ.color))})) # values = rep("black", length(categ.color)) are the values of color (which is the border color of dots), and this modify the border color on the plot. BEWARE: values = categ.color takes the numbers to make the colors if categ.color is a factor. BEWARE: , guide = ggplot2::guide_legend(override.aes = list(fill = levels(dot.color))) here +# coordinates of tidy dots +tempo.coord <- ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))$data # to have the tidy dot coordinates +if(length(which(sapply(tempo.coord, FUN = nrow) == nrow(data1))) > 1){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": MORE THAN 2 COMPARTMENT WITH NROW EQUAL TO nrow(data1) IN THE tempo.coord LIST (FOR TIDY DOT COORDINATES). CODE HAS TO BE MODIFIED\n\n================\n\n") +stop(tempo.cat) +}else{ +dot.coord.tidy1 <- tempo.coord[[which(sapply(tempo.coord, FUN = nrow) == nrow(data1))]] +} +tempo.bar.coord <- merge(bar.coord, unique(dot.coord[, c("group", categ)]), by = intersect("group", "group"), sort = FALSE) # add the categ in bar.coord. BEWARE: by = intersect("group", "group") because group is enough as only one value of x per group number in bar.coord. Thus, no need to consider fill +if(nrow(tempo.bar.coord) != nrow(bar.coord)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE merge() FUNCTION DID NOT RETURN A CORRECT tempo.bar.coord DATA FRAME. CODE HAS TO BE MODIFIED\n\n================\n\n") +stop(tempo.cat) +} +dot.coord.tidy2 <- merge(dot.coord.tidy1, tempo.bar.coord[c("fill", "group", "x", categ)], by = intersect("group", "group"), sort = FALSE) # send the coord of the bars into the coord data.frame of the dots (in the column x.y). BEWARE: by = intersect("group", "group") because group is enough as only one value of x per group number in bar.coord. Thus, no need to consider fill +if(nrow(dot.coord.tidy2) != nrow(dot.coord)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE merge() FUNCTION DID NOT RETURN A CORRECT dot.coord.tidy2 DATA FRAME. CODE HAS TO BE MODIFIED\n\n================\n\n") +stop(tempo.cat) +} +if(length(categ) == 1){ +tempo.data1 <- unique(data.frame(data1[categ[1]], group = as.integer(factor(as.numeric(data1[, categ[1]]))))) # categ[2] first if categ[2] is used to make the categories in ggplot and categ[1] is used to make the x-axis +names(tempo.data1)[names(tempo.data1) == categ[1]] <- paste0(categ[1], ".check") +verif <- paste0(categ[1], ".check") +}else if(length(categ) == 2){ +tempo.data1 <- unique(data.frame(data1[c(categ[1], categ[2])], group = as.integer(factor(paste0(as.numeric(data1[, categ[2]]), ".", as.numeric(data1[, categ[1]])))))) # categ[2] first if categ[2] is used to make the categories in ggplot and categ[1] is used to make the x-axis +names(tempo.data1)[names(tempo.data1) == categ[1]] <- paste0(categ[1], ".check") +names(tempo.data1)[names(tempo.data1) == categ[2]] <- paste0(categ[2], ".check") +verif <- c(paste0(categ[1], ".check"), paste0(categ[2], ".check")) +}else{ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 7\n\n============\n\n")) +stop(tempo.cat) +} +dot.coord.tidy3 <- merge(dot.coord.tidy2, tempo.data1, by = "group", sort = FALSE) # send the factors of data1 into coord +if(nrow(dot.coord.tidy3) != nrow(dot.coord) | ( ! fun_2d_comp(dot.coord.tidy3[categ], dot.coord.tidy3[verif])$identical.content)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE merge() FUNCTION DID NOT RETURN A CORRECT dot.coord.tidy3 DATA FRAME. CODE HAS TO BE MODIFIED\n\n================\n\n") +stop(tempo.cat) +} +# end coordinates of tidy dots +} +} +# end dot display +# stat display +# layer after dots but ok, behind dots on the plot +if( ! is.null(stat.disp)){ +if(stat.disp == "top"){ +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "text", x = bar.coord$x, y = ylim[2], label = fun_round(bar.coord$y, 2), size = stat.size, color = "black", hjust = ifelse(vertical == TRUE, 0.5, 1.1), vjust = ifelse(vertical == TRUE, 1.1, 0.5))) # beware: no need of order() for labels because bar.coord$x set the order. For justification, see https://stackoverflow.com/questions/7263849/what-do-hjust-and-vjust-do-when-making-a-plot-using-ggplot +}else if(stat.disp == "above"){ +# stat coordinates +if( ! is.null(dot.color)){ # for text just above max dot +if(dot.tidy == FALSE){ +tempo.stat.ini <- dot.coord.rd3 +}else if(dot.tidy == TRUE){ +tempo.stat.ini <- dot.coord.tidy3 +} +stat.coord1 <- aggregate(x = tempo.stat.ini["y"], by = {x.env <- if(length(categ) == 1){list(tempo.stat.ini$group, tempo.stat.ini$x.y, tempo.stat.ini[, categ[1]])}else if(length(categ) == 2){list(tempo.stat.ini$group, tempo.stat.ini$x.y, tempo.stat.ini[, categ[1]], tempo.stat.ini[, categ[2]])} ; names(x.env) <- if(length(categ) == 1){c("group", "x.y", categ[1])}else if(length(categ) == 2){c("group", "x.y", categ[1], categ[2])} ; x.env}, FUN = min, na.rm = TRUE) +names(stat.coord1)[names(stat.coord1) == "y"] <- "dot.min" +stat.coord2 <- aggregate(x = tempo.stat.ini["y"], by = {x.env <- if(length(categ) == 1){list(tempo.stat.ini$group, tempo.stat.ini$x.y, tempo.stat.ini[, categ[1]])}else if(length(categ) == 2){list(tempo.stat.ini$group, tempo.stat.ini$x.y, tempo.stat.ini[, categ[1]], tempo.stat.ini[, categ[2]])} ; names(x.env) <- if(length(categ) == 1){c("group", "x.y", categ[1])}else if(length(categ) == 2){c("group", "x.y", categ[1], categ[2])} ; x.env}, FUN = max, na.rm = TRUE) +names(stat.coord2) <- paste0(names(stat.coord2), "_from.dot.max") +names(stat.coord2)[names(stat.coord2) == "y_from.dot.max"] <- "dot.max" +stat.coord3 <- cbind(bar.coord[order(bar.coord$x), ], stat.coord1[order(stat.coord1$x.y), ], stat.coord2[order(stat.coord2$x.y), ]) # should be ok to use bar.coord$x and stat.coord$x.y to assemble the two data frames because x coordinates of the bars. Thus, we cannot have identical values +if( ! all(identical(round(stat.coord3$x, 9), round(stat.coord3$x.y, 9)))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": FUSION OF bar.coord, stat.coord1 AND stat.coord2 ACCORDING TO bar.coord$x, stat.coord1$x.y AND stat.coord2$x.y IS NOT CORRECT. CODE HAS TO BE MODIFIED\n\n================\n\n") +stop(tempo.cat) +} +dot.text.coord <- stat.coord3[, c("x", "group", "dot.min", "dot.max")] +names(dot.text.coord)[names(dot.text.coord) == "dot.min"] <- "text.min.pos" +names(dot.text.coord)[names(dot.text.coord) == "dot.max"] <- "text.max.pos" +} +if( ! is.null(error.disp)){ # for text just above error bars +if(length(categ) == 1){ +tempo.data1 <- unique(data.frame(data1[categ[1]], group = as.integer(factor(as.numeric(data1[, categ[1]]))))) # categ[2] first if categ[2] is used to make the categories in ggplot and categ[1] is used to make the x-axis +if( ! identical(stat[order(stat[, categ[1]]), categ[1]], tempo.data1[order(tempo.data1[, categ[1]]), categ[1]])){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE PROBLEM IN TRYING TO ASSEMBLE stat AND tempo.data1\n\n============\n\n")) +stop(tempo.cat) +}else{ +names(tempo.data1)[names(tempo.data1) == categ[1]] <- paste0(categ[1], ".check") +names(tempo.data1)[names(tempo.data1) == "group"] <- "group.check" +stat.coord4 <- cbind(stat[order(stat[, categ[1]]), ], tempo.data1[order(tempo.data1[, paste0(categ[1], ".check")]), ]) +} +}else if(length(categ) == 2){ +tempo.data1 <- unique(data.frame(data1[c(categ[1], categ[2])], group = as.integer(factor(paste0(as.numeric(data1[, categ[2]]), ".", as.numeric(data1[, categ[1]])))))) # categ[2] first if categ[2] is used to make the categories in ggplot and categ[1] is used to make the x-axis +if( ! fun_2d_comp(stat[order(stat[, categ[1]], stat[, categ[2]]), c(categ[1], categ[2])], tempo.data1[order(tempo.data1[, categ[1]], tempo.data1[, categ[2]]), c(categ[1], categ[2])])$identical.content){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE PROBLEM IN TRYING TO ASSEMBLE stat AND tempo.data1\n\n============\n\n")) +stop(tempo.cat) +}else{ +names(tempo.data1)[names(tempo.data1) == categ[1]] <- paste0(categ[1], ".check") +names(tempo.data1)[names(tempo.data1) == categ[2]] <- paste0(categ[2], ".check") +names(tempo.data1)[names(tempo.data1) == "group"] <- "group.check" +stat.coord4 <- cbind(stat[order(stat[, categ[1]], stat[, categ[2]]), ], tempo.data1[order(tempo.data1[, paste0(categ[1], ".check")], tempo.data1[,paste0(categ[2], ".check")]), ]) +} +}else{ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 8\n\n============\n\n")) +stop(tempo.cat) +} +if( ! identical(bar.coord$group[order(bar.coord$group)], stat.coord4$group.check[order(stat.coord4$group.check)])){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE PROBLEM IN TRYING TO ASSEMBLE bar.coord AND stat.coord4\n\n============\n\n")) +stop(tempo.cat) +}else{ +stat.coord5 <- cbind(bar.coord[order(bar.coord$group), ], stat.coord4[order(stat.coord4$group.check), ]) +error.text.coord <- stat.coord5[, c("x", "group", "ERROR.INF", "ERROR.SUP")] # +names(error.text.coord)[names(error.text.coord) == "ERROR.INF"] <- "text.min.pos" +names(error.text.coord)[names(error.text.coord) == "ERROR.SUP"] <- "text.max.pos" +} +} +if(( ! is.null(dot.color)) & ! is.null(error.disp)){ # for text above max dot or error bar +stat.coord3 <- stat.coord3[order(stat.coord3$x), ] +stat.coord5 <- stat.coord5[order(stat.coord5$x), ] +if( ! identical(stat.coord3$group, stat.coord5$group)){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE PROBLEM IN TRYING TO ASSEMBLE stat.coord3 AND stat.coord5\n\n============\n\n")) +stop(tempo.cat) +}else{ +stat.coord6 <- data.frame(stat.coord3, min.dot.error = mapply(FUN = min, stat.coord3$dot.min, stat.coord5$ERROR.INF, na.rm = TRUE)) +stat.coord7 <- data.frame(stat.coord6, max.dot.error = mapply(FUN = max, stat.coord3$dot.max, stat.coord5$ERROR.SUP, na.rm = TRUE)) +both.text.coord <- stat.coord7[, c("x", "group", "min.dot.error", "max.dot.error")] # +names(both.text.coord)[names(both.text.coord) == "min.dot.error"] <- "text.min.pos" +names(both.text.coord)[names(both.text.coord) == "max.dot.error"] <- "text.max.pos" +} +} +if(( ! is.null(dot.color)) & is.null(error.disp)){ +text.coord <- dot.text.coord +}else if(is.null(dot.color) & ! is.null(error.disp)){ +text.coord <- error.text.coord +}else if(( ! is.null(dot.color)) & ! is.null(error.disp)){ +text.coord <- both.text.coord +} +if( ! (is.null(dot.color) & is.null(error.disp))){ +bar.coord <- bar.coord[order(bar.coord$x), ] +text.coord <- text.coord[order(text.coord$x), ] # to be sure to have the two objects in the same order for x. BEWARE: cannot add identical(as.integer(text.coord$group), as.integer(bar.coord$group)) because with error, the correspondence between x and group is not the same +if( ! identical(text.coord$x, bar.coord$x)){ +tempo.cat <- (paste0("\n\n============\n\nERROR: text.coord AND bar.coord DO NOT HAVE THE SAME x COLUMN CONTENT\n\n============\n\n")) +stop(tempo.cat) +} +} +# end stat coordinates +# stat display +if(is.null(dot.color) & is.null(error.disp)){ # text just above bars +# performed twice: first for y values >=0, then y values < 0, because only a single value allowed for hjust anf vjust +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "text", x = bar.coord$x[bar.coord$y >= 0], y = bar.coord$y[bar.coord$y >= 0], label = fun_round(bar.coord$y, 2)[bar.coord$y >= 0], size = stat.size, color = "black", hjust = ifelse(vertical == TRUE, 0.5, 0.5 - stat.dist), vjust = ifelse(vertical == TRUE, 0.5 - stat.dist, 0.5))) # beware: no need of order() for labels because bar.coord$x set the order +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "text", x = bar.coord$x[bar.coord$y < 0], y = bar.coord$y[bar.coord$y < 0], label = fun_round(bar.coord$y, 2)[bar.coord$y < 0], size = stat.size, color = "black", hjust = ifelse(vertical == TRUE, 0.5, 0.5 + stat.dist), vjust = ifelse(vertical == TRUE, 0.5 + stat.dist, 0.5))) # beware: no need of order() for labels because bar.coord$x set the order +}else{ # text just above error bars or dots +# I checked that text.coord and bar.coord have the same x and group column content. Thus, ok to use them together +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "text", x = text.coord$x[bar.coord$y >= 0], y = text.coord$text.max.pos[bar.coord$y >= 0], label = fun_round(bar.coord$y, 2)[bar.coord$y >= 0], size = stat.size, color = "black", hjust = ifelse(vertical == TRUE, 0.5, 0.5 - stat.dist), vjust = ifelse(vertical == TRUE, 0.5 - stat.dist, 0.5))) # beware: no need of order() for labels because bar.coord$x set the order +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "text", x = text.coord$x[bar.coord$y < 0], y = text.coord$text.min.pos[bar.coord$y < 0], label = fun_round(bar.coord$y, 2)[bar.coord$y < 0], size = stat.size, color = "black", hjust = ifelse(vertical == TRUE, 0.5, 0.5 + stat.dist), vjust = ifelse(vertical == TRUE, 0.5 + stat.dist, 0.5))) # beware: no need of order() for labels because bar.coord$x set the order +} +# end stat display +}else{ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 9\n\n============\n\n")) +stop(tempo.cat) +} +} +# end stat display +# y scale management (cannot be before dot plot management) +tempo.coord <- ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))$layout$panel_params[[1]] +tempo.scale <- fun_scale(lim = ylim, n = ifelse(is.null(y.tick.nb), length(tempo.coord$y.major_source), y.tick.nb)) +# for the ggplot2 bug with ylog, this does not work: eval(parse(text = ifelse(vertical == FALSE & ylog == "log10", "ggplot2::scale_x_continuous", "ggplot2::scale_y_continuous"))) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_y_continuous( +breaks = tempo.scale, +labels = if(ylog == "log10"){scales::trans_format("identity", scales::math_format(10^.x))}else if(ylog == "log2"){scales::trans_format("identity", scales::math_format(2^.x))}else if(ylog == "no"){ggplot2::waiver()}else{tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 10\n\n============\n\n")) ; stop(tempo.cat)}, +expand = c(0, 0), +limits = NA, +trans = ifelse(diff(ylim) < 0, "reverse", "identity") # equivalent to ggplot2::scale_y_reverse() +)) +if(vertical == TRUE){ +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::coord_cartesian(ylim = ylim)) # clip = "off" to have secondary ticks outside plot region does not work +}else{ +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::coord_flip(ylim = ylim)) # clip = "off" to have secondary ticks outside plot region does not work +} +# secondary ticks (after ggplot2::coord_cartesian() or ggplot2::coord_flip()) +tempo.coord <- ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))$layout$panel_params[[1]] +# no secondary ticks for log2. Play with ylim +if(ylog == "log10"){ +ylim.order <- order(ylim) # to deal with inverse axis +ini.scipen <- options()$scipen +options(scipen = -1000) # force scientific format +power10.exp <- as.integer(substring(text = 10^ylim, first = (regexpr(pattern = "\\+|\\-", text = 10^ylim)))) # recover the power of 10. Example recover 08 from 1e+08 +mantisse <- as.numeric(substr(x = 10^ylim, start = 1, stop = (regexpr(pattern = "\\+|\\-", text = 10^ylim) - 2))) # recover the mantisse. Example recover 1.22 from 1.22e+08 +options(scipen = ini.scipen) # restore the initial scientific penalty +tempo.tick.pos <- as.vector(outer(log10(2:10), 10^((power10.exp[1] - ifelse(diff(ylim.order) > 0, 1, -1)):(power10.exp[2] + ifelse(diff(ylim.order) > 0, 1, -1))))) +tempo.tick.pos <- sort(tempo.tick.pos, decreasing = ifelse(diff(ylim.order) > 0, FALSE, TRUE)) +tempo.tick.pos <- log10(tempo.tick.pos[tempo.tick.pos >= min(10^ylim) & tempo.tick.pos <= max(10^ylim)]) +if(any(is.na(tempo.tick.pos) | ! is.finite(tempo.tick.pos))){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 11\n\n============\n\n")) +stop(tempo.cat) +} +# if(vertical == TRUE){ # do not remove in case the bug is fixed +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "segment", y = tempo.tick.pos, yend = tempo.tick.pos, x = tempo.coord$x.range[1], xend = tempo.coord$x.range[1] + diff(tempo.coord$x.range) / 80)) +# }else{ # not working because of the ggplot2 bug +# assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "segment", x = tempo.tick.pos, xend = tempo.tick.pos, y = tempo.coord$y.range[1], yend = tempo.coord$y.range[1] + diff(tempo.coord$y.range) / 80)) +# } +}else if(( ! is.null(y.inter.tick.nb)) & ylog == "no"){ +if(y.inter.tick.nb > 0){ +if(vertical == TRUE){ +ticks.pos <- suppressWarnings(as.numeric(tempo.coord$y.labels)) # too difficult to predict the behavior of tempo.coord$x.major_source depending on ylim neg or not, inv or not +if(any(is.na(ticks.pos))){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 12\n\n============\n\n")) +stop(tempo.cat) +} +tick.dist <- mean(diff(ticks.pos), na.rm = TRUE) +minor.tick.dist <- tick.dist / (y.inter.tick.nb + 1) +minor.tick.pos <- seq(ticks.pos[1] - tick.dist, ticks.pos[length(ticks.pos)] + tick.dist, by = minor.tick.dist) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "segment", y = minor.tick.pos, yend = minor.tick.pos, x = tempo.coord$x.range[1], xend = tempo.coord$x.range[1] + diff(tempo.coord$x.range) / 80)) +}else{ +ticks.pos <- suppressWarnings(as.numeric(tempo.coord$x.labels))# too difficult to predict the behavior of tempo.coord$x.major_source depending on ylim neg or not, inv or not +if(any(is.na(ticks.pos))){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 13\n\n============\n\n")) +stop(tempo.cat) +} +tick.dist <- mean(diff(ticks.pos), na.rm = TRUE) +minor.tick.dist <- tick.dist / (y.inter.tick.nb + 1) +minor.tick.pos <- seq(ticks.pos[1] - tick.dist, ticks.pos[length(ticks.pos)] + tick.dist, by = minor.tick.dist) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "segment", y = minor.tick.pos, yend = minor.tick.pos, x = tempo.coord$y.range[1], xend = tempo.coord$y.range[1] + diff(tempo.coord$y.range) / 80)) +} +} +} +# end secondary ticks (after ggplot2::coord_cartesian() or ggplot2::coord_flip()) +# end y scale management (cannot be before dot plot management) +if(plot == TRUE){ +suppressWarnings(print(eval(parse(text = paste(paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "), if(is.null(add)){NULL}else{add}))))) +}else{ +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": PLOT NOT SHOWN AS REQUESTED") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +# end barplot +if(warn.print == TRUE & ! is.null(warning)){ +warning(warning) +} +if(return == TRUE){ +output <- ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + ")))) +output <- list(stat = stat, removed.row.nb = removed.row.nb, removed.rows = removed.rows, data = output$data, axes = output$layout$panel_params[[1]], warnings = paste0("\n", warning, "\n\n")) +return(output) +} +} + + +######## fun_gg_boxplot() #### ggplot2 boxplot + background dots if required + + + + + + + +######## fun_gg_bar_prop() #### ggplot2 proportion barplot + + +######## fun_gg_strip() #### ggplot2 stripchart + mean/median + + +######## fun_gg_violin() #### ggplot2 violins + + +######## fun_gg_line() #### ggplot2 lines + background dots and error bars + + +# DO NOT ERASE. COMPARE WITH BAR MEAN BEFORE AND RECOVER WHAT HAS BEEN MODIFIED + +fun_gg_line <- function(data1, y, categ, categ.class.order = NULL, categ.legend.name = NULL, categ.color = NULL, line.size = 1, error.disp = NULL, error.whisker.width = 0.5, dot.color = "same", dot.tidy = FALSE, dot.bin.nb = 30, dot.jitter = 0.25, dot.size = 3, dot.border.size = 0.5, dot.alpha = 0.5, ylim = NULL, ylog = FALSE, y.tick.nb = NULL, y.include.zero = FALSE, y.top.extra.margin = 0.05, y.bottom.extra.margin = 0, stat.disp = NULL, stat.size = 4, stat.dist = 2, xlab = NULL, ylab = NULL, vertical = TRUE, title = "", text.size = 12, text.angle = 0, classic = FALSE, grid = FALSE, return = FALSE, path.lib = NULL){ +# AIM +# ggplot2 vertical barplot representing mean values with the possibility to add error bars and to overlay dots +# for ggplot2 specifications, see: https://ggplot2.tidyverse.org/articles/ggplot2-specs.html +# WARNINGS +# rows containing NA in data1[, c(y, categ)] will be removed before processing, with a warning (see below) +# if ever bars disappear, see the end of https://github.com/tidyverse/ggplot2/issues/2887 +# to have a single bar, create a factor column with a single class and specify the name of this column in categ argument as unique element (no categ2 in categ argument). For a single set of grouped bars, create a factor column with a single class and specify this column in categ argument as first element (categ1). See categ below +# with several single bars (categ argument with only one element), bar.width argument (i.e., width argument of ggplot2::geom_bar()) defines each bar width. The bar.width argument also defines the space between bars by using (1 - bar.width). In addition, xmin and xmax of the fun_gg_bar_mean() output report the bar boundaries (around x-axis unit 1, 2, 3, etc., for each bar) +# with several sets of grouped bars (categ argument with two elements), bar.width argument defines each set of grouped bar width. The bar.width argument also defines the space between set of grouped bars by using (1 - bar.width). In addition, xmin and xmax of the fun_gg_bar_mean() output report the bar boundaries (around x-axis unit 1, 2, 3, etc., for each set of grouped bar) +# to manually change the 0 base bar into this code, see https://stackoverflow.com/questions/35324892/ggplot2-setting-geom-bar-baseline-to-1-instead-of-zero +# ARGUMENTS +# data1: a dataframe containing one column of values (see y argument below) and one or two columns of categories (see categ argument below). Duplicated column names not allowed +# y: character string of the data1 column name for y-axis (containing numeric values). Numeric values will be averaged by categ to generate the bars and will also be used to plot the dots +# categ: vector of character strings of the data1 column name for categories (column of characters or factor). Must either be one or two column names. If a single column name (further refered to as categ1), then one bar per class of categ1. If two column names (further refered to as categ1 and categ2), then one bar per class of categ2, which form a group of bars in each class of categ1. BEWARE, categ1 (and categ2 if it exists) must have a single value of y per class of categ1 (and categ2). To have a single bar, create a factor column with a single class and specify the name of this column in categ argument as unique element (no categ2 in categ argument). For a single set of grouped bars, create a factor column with a single class and specify this column in categ argument as first element (categ1) +# categ.class.order: list indicating the order of the classes of categ1 and categ2 represented on the barplot (the first compartment for categ1 and and the second for categ2). If categ.class.order = NULL, classes are represented according to the alphabetical order. Some compartment can be NULL and other not +# categ.legend.name: character string of the legend title for categ2. If categ.legend.name = NULL, then categ.legend.name <- categ1 if only categ1 is present and categ.legend.name <- categ2 if categ1 and categ2 are present. Write "" if no legend required +# categ.color: vector of character color string for bar filling. If categ.color = NULL, default colors of ggplot2, whatever categ1 and categ2. If categ.color is non null and only categ1 in categ argument, categ.color can be either: (1) a single color string (all the bars will have this color, whatever the classes of categ1), (2) a vector of string colors, one for each class of categ1 (each color will be associated according to categ.class.order of categ1), (3) a vector or factor of string colors, like if it was one of the column of data1 data frame (beware: a single color per class of categ1 and a single class of categ1 per color must be respected). Integers are also accepted instead of character strings, as long as above rules about length are respected. Integers will be processed by fun_gg_palette() using the max integer value among all the integers in categ.color. If categ.color is non null and categ1 and categ2 specified, all the rules described above will apply to categ2 instead of categ1 (colors will be determined for bars inside a group of bars) +# bar.width: numeric value (from 0 to 1) of the bar or set of grouped bar width (see warnings above) +# error.disp: either "SD", "SD.TOP", "SEM" or "SEM.TOP". If NULL, no error bars added +# error.whisker.width: numeric value (from 0 to 1) of the whisker (error bar extremities) width, with 0 meaning no whiskers and 1 meaning a width equal to the corresponding bar width +# dot.color: vector of character string. Idem as categ.color but for dots, except that in the possibility (3), the rule "a single color per class of categ1 and a single class of categ1", cannot be respected (each dot can have a different color). If NULL, no dots plotted +# dot.tidy: logical. Nice dot spreading? If TRUE, use the geom_dotplot() function for a nice representation. If FALSE, dots are randomly spread, using the dot.jitter argument (see below) +# dot.bin.nb: positive integer indicating the number of bins (i.e., nb of separations) of the ylim range. Each dot will then be put in one of the bin, with the size the width of the bin. Not considered if dot.tidy is FALSE +# dot.jitter: numeric value (from 0 to 1) of random dot horizontal dispersion, with 0 meaning no dispersion and 1 meaning a dispersion in the corresponding bar width interval. Not considered if dot.tidy is TRUE +# dot.size: numeric value of dot size. Not considered if dot.tidy is TRUE +# dot.border.size: numeric value of border dot size. Write zero for no dot border. If dot.tidy is TRUE, value 0 remove the border. Another one leave the border without size control (geom_doplot() feature) +# dot.alpha: numeric value (from 0 to 1) of dot transparency (full transparent to full opaque, respectively) +# ylim: 2 numeric values for y-axis range. If NULL, range of y in data1 +# ylog: logical. Log scale for the y-axis? BEWARE: do not tranform the data, but just display ticks in a log scale manner. BEWARE: if TRUE, ylim must not contain null or negative values. In addition, will be automatically set to FALSE if vertical argument is set to FALSE, to prevent a bug in ggplot2 (see https://github.com/tidyverse/ggplot2/issues/881) +# y.tick.nb: number of desired values on the y-axis +# y.include.zero: logical. Does ylim range include 0? BEWARE: if ylog = TRUE, will be automately set to FALSE with a warning message +# y.top.extra.margin: single proportion (between 0 and 1) indicating if extra margins must be added to ylim. If different from 0, add the range of the axis * y.top.extra.margin (e.g., abs(ylim[2] - ylim[1]) * y.top.extra.margin) to the top of y-axis. BEWARE with ylog = TRUE, the range result must not overlap zero or negative values +# y.bottom.extra.margin: idem as y.top.extra.margin but to the bottom of y-axis +# stat.disp: add the mean number above the corresponding bar. Either NULL (no number shown), "top" (at the top of the figure region) or "above" (above each bar) +# stat.size: numeric value of the stat size (in points). Increase the value to increase text size +# stat.dist: numeric value of the stat distance. Increase the value to increase the distance +# xlab: a character string for x-axis legend. If NULL, character string of categ1 +# ylab: a character string y-axis legend. If NULL, character string of the y argument +# vertical: logical. Vertical bars? BEWARE: cannot have horizontal bars with a log axis, i.e., ylog = TRUE & vertical = FALSE (see ylog above) +# title: character string of the graph title +# text.size: numeric value of the text size (in points) +# text.angle: integer value of the text angle for the x-axis labels. Positive values for counterclockwise rotation: 0 for horizontal, 90 for vertical, 180 for upside down etc. Negative values for clockwise rotation: 0 for horizontal, -90 for vertical, -180 for upside down etc. +# classic: logical. Use the classic theme (article like)? +# grid: logical. draw horizontal lines in the background to better read the bar values? Not considered if classic = FALSE +# return: logical. Return the graph parameters? +# path.lib: absolute path of the required packages, if not in the default folders +} + + +######## fun_gg_heatmap() #### ggplot2 heatmap + overlaid mask if required + + +#test plot.margin = margin(up.space.mds, right.space.mds, down.space.mds, left.space.mds, "inches") to set the dim of the region plot ? +# if matrix is full of zero (or same value I guess), heatmap is complicate. Test it and error message + +# Check OK: clear to go Apollo +fun_gg_heatmap <- function(data1, legend.name1 = "", low.color1 = "blue", mid.color1 = "white", high.color1 = "red", limit1 = NULL, midpoint1 = NULL, data2 = NULL, color2 = "black", alpha2 = 0.5, invert2 = FALSE, text.size = 12, title = "", title.text.size = 12, show.scale = TRUE, rotate = FALSE, return = FALSE, plot = TRUE, add = NULL, warn.print = FALSE, path.lib = NULL){ +# AIM +# ggplot2 heatmap with the possibility to overlay a mask +# see also: +# draw : http://www.sthda.com/english/wiki/ggplot2-quick-correlation-matrix-heatmap-r-software-and-data-visualization +# same range scale : https://stackoverflow.com/questions/44655723/r-ggplot2-heatmap-fixed-scale-color-between-graphs +# for ggplot2 specifications, see: https://ggplot2.tidyverse.org/articles/ggplot2-specs.html +# ARGUMENTS +# data1: numeric matrix or data frame resulting from the conversion of the numeric matrix by reshape2::melt() +# legend.name1: character string of the data1 heatmap scale legend +# low.color1: character string of the color (i.e., "blue" or "#0000FF") of the lowest scale value +# mid.color1: same as low.color1 but for the middle scale value. If NULL, the middle color is the default color between low.color1 and high.color1. BEWARE: argument midpoint1 is not ignored, even if mid.color1 is NULL, meaning that the default mid color can still be controled +# high.color1: same as low.color1 but for the highest scale value +# limit1: 2 numeric values defining the lowest and higest color scale values. If NULL, take the range of data1 values +# midpoint1: single numeric value defining the value corresponding to the mid.color1 argument. A warning message is returned if midpoint1 does not correspond to the mean of limit1 values, because the color scale is not linear anymore. If NULL, takes the mean of limit1 values. Mean of data1, instead of mean of limit1, can be used here if required +# data2: binary mask matrix (made of 0 and 1) of same dimension as data1 or a data frame resulting from the conversion of the binary mask matrix by reshape2::melt(). Value 1 of data2 will correspond to color2 argument (value 0 will be NA color), and the opposite if invert2 argument is TRUE (inverted mask) +# color2: color of the 1 values of the binary mask matrix. The 0 values will be color NA +# alpha2: numeric value (from 0 to 1) of the mask transparency +# invert2: logical. Invert the mask (1 -> 0 and 0 -> 1)? +# text.size: numeric value of the size of the texts in scale +# title: character string of the graph title +# title.text.size: numeric value of the title size (in points) +# show.scale: logical. Show color scale? +# rotate: logical. Rotate the heatmap 90° clockwise? +# return: logical. Return the graph parameters? +# plot: logical. Plot the graphic? If FALSE and return argument is TRUE, graphical parameters and associated warnings are provided without plotting +# add: character string allowing to add more ggplot2 features (dots, lines, themes, etc.). BEWARE: (1) must start with "+" just after the simple or double opening quote (no space, end of line, carriage return, etc., allowed), (2) must finish with ")" just before the simple or double closing quote (no space, end of line, carriage return, etc., allowed) and (3) each function must be preceded by "ggplot2::" (for instance: "ggplot2::coord_flip()). If the character string contains the "ggplot2::theme" string, then internal ggplot2 theme() and theme_classic() functions will be inactivated to be reused by add. BEWARE: handle this argument with caution since added functions can create conflicts with the preexisting internal ggplot2 functions +# warn.print: logical. Print warnings at the end of the execution? No print if no warning messages +# path.lib: absolute path of the required packages, if not in the default folders +# REQUIRED PACKAGES +# ggplot2 +# reshape2 +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_check() +# fun_pack() +# fun_round() +# RETURN +# a heatmap if plot argument is TRUE +# a list of the graph info if return argument is TRUE: +# $data: a list of the graphic info +# $axes: a list of the axes info +# $scale: the scale info (lowest, mid and highest values) +# $warnings: the warning messages. Use cat() for proper display. NULL if no warning +# EXAMPLES +# fun_gg_heatmap(data1 = matrix(1:16, ncol = 4), title = "GRAPH 1") +# fun_gg_heatmap(data1 = matrix(1:16, ncol = 4), return = TRUE) +# fun_gg_heatmap(data1 = matrix(1:16, ncol = 4), legend.name1 = "VALUE", title = "GRAPH 1", text.size = 5, data2 = matrix(rep(c(1,0,0,0), 4), ncol = 4), invert2 = FALSE, return = TRUE) +# diagonal matrix +# fun_gg_heatmap(data1 = matrix(c(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1), ncol = 4)) +# fun_gg_heatmap(data1 = reshape2::melt(matrix(c(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1), ncol = 4))) +# error message +# fun_gg_heatmap(data1 = matrix(1:16, ncol = 4), data2 = matrix(rep(c(1,0,0,0), 5), ncol = 5)) +# fun_gg_heatmap(data1 = matrix(1:16, ncol = 4), data2 = reshape2::melt(matrix(rep(c(1,0,0,0), 4), ncol = 4))) +# fun_gg_heatmap(data1 = reshape2::melt(matrix(1:16, ncol = 4)), data2 = reshape2::melt(matrix(rep(c(1,0,0,0), 4), ncol = 4))) +#### NICE REPRESENTATION +# set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 10, 3), time = rnorm(1000, 10, 3), group1 = rep(c("A1", "A2"), 500)) ; obs2 <-data.frame(km = rnorm(1000, 15, 3), time = rnorm(1000, 15, 3), group2 = rep(c("G1", "G2"), 500)) ; set.seed(NULL) ; obs1$L1$km[2:3] <- NA ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), categ = list(L1 = "group1", L2 = "group2"), legend.name = NULL, color = list(L1 = 4:5, L2 = 7:8), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5), dot.size = 3, line.size = 0.5, xlim = c(1, 25), xlab = "KM", xlog = "no", x.tick.nb = 10, x.inter.tick.nb = 1, x.left.extra.margin = 0, x.right.extra.margin = 0, ylim = c(1, 25), ylab = expression(paste("TIME (", 10^-20, " s)")), ylog = "log10", y.tick.nb = 5, y.top.extra.margin = 0, y.bottom.extra.margin = 0, xy.include.zero = TRUE, classic = TRUE) +#### SINGLE GEOMETRIC LAYER +# simple example (1) of scatter plot using the classical writting +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time") +# simple example (2) of scatter plot, identical to (1) but using the list writting. Here, a list of one compartment, systematically named L1, is provided to the data1, x, y, categ, geom and alpha. Contrary to example (1), the geom and alpha argument have to be included because the default value are not lists (if data1 is a list, all the x, y, categ, legend.name, color, geom and alpha must also be list if non NULL) +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = list(L1 = obs1), x = list(L1 = "km"), y = list(L1 = "time"), geom = list(L1 = "geom_point"), alpha = list(L1 = 0.5)) +# color of dots. Example (1) using the classical writting +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", color = "blue") +# color of dots. Example (2) using the list writting +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = list(L1 = obs1), x = list(L1 = "km"), y = list(L1 = "time"), color = list(L1 = "blue"), geom = list(L1 = "geom_point"), alpha = list(L1 = 1)) +# From here, classical writting is use for single element in data1 and list writting otherwise +# color of dots. Example (3) when dots are in different categories. Note that categ argument controls the legend display +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", categ = "group") +# color of dots. Example (4) when dots are in different categories. A single color mentionned is applied to all the dots +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", categ = "group", color = "coral") +# color of dots. Example (5) when dots are in different categories. Numbers can be used if ggplot colors are desired +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", categ = "group", color = 2) +# color of dots. Example (6) when dots are in different categories, with one color per category (try also color = 2:1) +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", categ = "group", color = c("coral", "green")) +# color of dots. Example (7) when dots are in different categories, with colors as a data frame column. BEWARE: one color per category must be respected (try also numbers) +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B"), col = rep(c("coral", "green"), each = 3)) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", categ = "group", color = obs1$col) +# color of dots. Example (8) when dots are in different categories, with colors as a data frame column. Easiest way (ggplot colors) +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", categ = "group", color = as.numeric(obs1$group)) +# legend name +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", categ = "group", legend.name = "CLASSES") +# different geom features. Example (1) with geom_line kind of lines +# obs1 <- data.frame(km = c(1, 3, 2, 6, 4, 5), time = c(1, 3, 2, 6, 4, 5)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", geom = "geom_line", categ = "group") +# different geom features. Example (2) with geom_path kind of lines (see the difference with (1)) +# obs1 <- data.frame(km = c(1, 3, 2, 6, 4, 5), time = c(1, 3, 2, 6, 4, 5)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", geom = "geom_path", categ = "group") +# different geom features. Example (3) with geom_hline kind of lines. Fake_y y-axis name by default because y argument must be NULL (see ylab argument below to change this) +# obs1 <- data.frame(km = 1:2, time = (1:2)^2, group = c("A", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = NULL, y = "km", geom = "geom_hline", categ = "group", xlim = c(1,10)) +# different geom features. Example (4) with geom_vline kind of lines. Fake_y y-axis name by default because y argument must be NULL (see ylab argument below to change this) +# obs1 <- data.frame(km = 1:2, time = (1:2)^2, group = c("A", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = NULL, geom = "geom_vline", categ = "group", ylim = c(1,10)) +#### MULTI GEOMETRIC LAYERS +# Note that in subsequent examples, names of list compartments are systematically referred to as L1, L2, etc., to show the correspondence between the arguments data1, x, y, categ, etc. +# single layer (as examples above) +# set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1), x = list(L1 = "km"), y = list(L1 = "time"), geom = list(L1 = "geom_point"), alpha = list(L1 = 0.5)) +# simple example of two layers +# set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5)) +# color of dots. Example (1) +# set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5), color = list(L1 = "coral", L2 = "green")) +# color of dots. Example (2) of the legend display. The categ argument must be supplied. Make a fake categorical colum in the data frame if necessary (as in this example). The categ argument triggers the legend display. The legend.name argument is used to remove the legend title of each layer +# set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = "GROUP1") ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = "GROUP2") ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), categ = list(L1 = "group1", L2 = "group2"), legend.name = list(L1 = NULL, L2 = NULL), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5), color = list(L1 = "coral", L2 = "green")) +# color of dots. Example (3) when dots are in different categories (default colors) +# set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = rep(c("A1", "A2"), each = 500)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = rep(c("G1", "G2"), each = 500)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), , categ = list(L1 = "group1", L2 = "group2"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5)) +# color of dots. Example (3) when dots are in different categories. A single color mentionned per layer is applied to all the dots of the layer +# set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = rep(c("A1", "A2"), each = 500)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = rep(c("G1", "G2"), each = 500)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), , categ = list(L1 = "group1", L2 = "group2"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5), color = list(L1 = "coral", L2 = "green")) +# color of dots. Example (5) when dots are in different categories, with one color per category in each layer +# set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = rep(c("A1", "A2"), each = 500)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = rep(c("G1", "G2"), each = 500)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), , categ = list(L1 = "group1", L2 = "group2"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5), color = list(L1 = c("coral", "blue"), L2 = c("green", "black"))) +# color of dots. Example (4) when dots are in different categories. Numbers can be used if ggplot colors are desired +# set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = rep(c("A1", "A2"), each = 500)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = rep(c("G1", "G2"), each = 500)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), , categ = list(L1 = "group1", L2 = "group2"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5), color = list(L1 = 1:2, L2 = c(4, 7))) +# color of dots. Example (7) when dots are in different categories, with colors as a data frame column. BEWARE: one color per category must be respected (try also numbers). BEWARE: in color argument, if the column of the data frame does not exist, color can be still displayed (L2 = obs2$notgood is equivalent to L2 = NULL). Such situation is reported in the warning messages (see below) +# set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = rep(c("A1", "A2"), each = 500), col1 = rep(c("coral", "blue"), each = 500)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = rep(c("G1", "G2"), each = 500), col2 = rep(c("green", "black"), each = 500)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), , categ = list(L1 = "group1", L2 = "group2"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5), color = list(L1 = obs1$col1, L2 = obs2$col2)) +# color of dots. Example (8) when dots are in different categories, with colors as a data frame column. Easiest way is not recommended with mutiple layers +# set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = rep(c("A1", "A2"), each = 500), col1 = rep(c("coral", "blue"), each = 500)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = rep(c("G1", "G2"), each = 500), col2 = rep(c("green", "black"), each = 500)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), , categ = list(L1 = "group1", L2 = "group2"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5), color = list(L1 = as.numeric(obs1$group1), L2 = as.numeric(obs2$group2))) +# legend name +# set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = rep(c("A1", "A2"), each = 500)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = rep(c("G1", "G2"), each = 500)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), , categ = list(L1 = "group1", L2 = "group2"), legend.name = list(L1 = "CLASS A", L2 = "CLASS G"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5)) +# different geom features. Example (1) with 5 layers. Note that order in data1 defines the overlay order (from below to above) and the order in the legend (from top to bottom) +# set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = rep(c("A1", "A2"), each = 500)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = rep(c("G1", "G2"), each = 500)) ; set.seed(NULL) ; obs3 <- data.frame(time = c(29, 31), group3 = c("HORIZ.THRESHOLD.1", "HORIZ.THRESHOLD.2")) ; obs4 <- data.frame(km = 26, group4 = "VERTIC.THRESHOLD") ; obs5 <- data.frame(km = seq(1, 100, 0.1), time = 7*seq(1, 100, 0.1)^0.5, group5 = "FUNCTION") ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2, L3 = obs3, L4 = obs4, L5 = obs5), x = list(L1 = "km", L2 = "km", L3 = NULL, L4 = "km", L5 = "km"), y = list(L1 = "time", L2 = "time", L3 = "time", L4 = NULL, L5 = "time"), categ = list(L1 = "group1", L2 = "group2", L3 = "group3", L4 = "group4", L5 = "group5"), geom = list(L1 = "geom_point", L2 = "geom_point", L3 = "geom_hline", L4 = "geom_vline", L5 = "geom_line"), alpha = list(L1 = 0.5, L2 = 0.5, L3 = 0.5, L4 = 0.5, L5 = 0.5), xlim = c(10, 40), ylim = c(10, 40), classic = TRUE, line.size = 0.75) +# layer transparency. One transparency defined by layer (from 0 invisible to 1 opaque). Note that for lines, transparency in not applied in the legend to prevent a ggplot2 bug (https://github.com/tidyverse/ggplot2/issues/2452) +# set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 22, 3), time = rnorm(1000, 22, 3), group1 = rep(c("A1", "A2"), each = 500)) ; obs2 <-data.frame(km = rnorm(1000, 30, 3), time = rnorm(1000, 30, 3), group2 = rep(c("G1", "G2"), each = 500)) ; set.seed(NULL) ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), , categ = list(L1 = "group1", L2 = "group2"), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 1, L2 = 0.1)) +# other different example of mutiple geom features are shown in the fun_segmentation function +#### OTHER GRAPHIC ARGUMENTS +# dot size (line.size argument controls size of lines) +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", dot.size = 5) +# axis management: examples are shown for x-axis but are identical for y-axis +# x-axis limits. Example (1) +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", xlim = c(-1, 25)) +# x-axis limits. Example (2) showing that order matters in ylim argument +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", xlim = c(25, -1)) +# log scale. Example (1). BEWARE: x column must be log, otherwise incoherent scale (see below warning message with the return argument) +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", xlog = "log10") +# log scale. Example (2). BEWARE: values of the xlim must be in the corresponding log +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", xlog = "log10", xlim = c(1, 10)) +# tick number. Example (1). Note that the final number shown is approximate +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", x.tick.nb = 6) +# tick number. Example (2) using a log2 scale +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", xlog = "log2", x.tick.nb = 6) +# tick number. Example (3) using a log10 scale +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", xlog = "log10", x.tick.nb = 6) +# tick number. Example (4) using a log10 scale: the reverse x-axis correctly deal with log10 scale +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", xlog = "log10", xlim = c(7, 2)) +# secondary tick number. Example (1) +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", x.inter.tick.nb = 4) +# secondary ticks. Example (2) not for log2 and log10 scales (see below warning message with the return argument) +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", xlog = "log10", x.inter.tick.nb = 4) +# extra margins. To avoid dot cuts +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", x.left.extra.margin = 0.25, x.right.extra.margin = 0.25) +# include zero in both the x-axis and y-xis +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", xy.include.zero = TRUE) +# graph title, text size and legend display +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", categ = "group", text.size = 8, title = "GRAPH1", title.text.size = 16, show.legend = TRUE) +# raster display. This switchs from vectorial mode to raster mode. The display can takes some time, but this is easier to export and handle than vectorial display +# set.seed(1) ; obs1 <- data.frame(km = rnorm(100000, 22, 3), time = rnorm(100000, 22, 3)) ; set.seed(NULL) ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", raster = TRUE) +# classic representation (use grid = TRUE to display the background lines of the y axis ticks) +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", classic = TRUE, grid = FALSE) +# graphic info. Example (1) +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", return = TRUE) +# graphic info. Example (2) of assignation and warning message display +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; output <- fun_gg_scatter(data1 = obs1, x = "km", y = "time", xlog = "log10", return = TRUE) ; cat(output$warnings) +# add ggplot2 functions +# obs1 <- data.frame(km = 2:7, time = (2:7)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = obs1, x = "km", y = "time", add = "+ggplot2::theme_classic()") +# all the arguments +# set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 10, 3), time = rnorm(1000, 10, 3), group1 = rep(c("A1", "A2"), 500)) ; obs2 <-data.frame(km = rnorm(1000, 15, 3), time = rnorm(1000, 15, 3), group2 = rep(c("G1", "G2"), 500)) ; set.seed(NULL) ; obs1$L1$km[2:3] <- NA ; fun_gg_scatter(data1 = list(L1 = obs1, L2 = obs2), x = list(L1 = "km", L2 = "km"), y = list(L1 = "time", L2 = "time"), categ = list(L1 = "group1", L2 = "group2"), legend.name = NULL, color = list(L1 = 4:5, L2 = 7:8), geom = list(L1 = "geom_point", L2 = "geom_point"), alpha = list(L1 = 0.5, L2 = 0.5), dot.size = 3, line.size = 0.5, xlim = c(1, 25), xlab = "KM", xlog = "no", x.tick.nb = 10, x.inter.tick.nb = 1, x.left.extra.margin = 0, x.right.extra.margin = 0, ylim = c(1, 25), ylab = "TIME (s)", ylog = "log10", y.tick.nb = 5, y.inter.tick.nb = NULL, y.top.extra.margin = 0, y.bottom.extra.margin = 0, xy.include.zero = TRUE, text.size = 12, title = "", title.text.size = 8, show.legend = TRUE, classic = FALSE, grid = FALSE, raster = FALSE, vectorial.limit = NULL, return = FALSE, plot = TRUE, add = NULL, warn.print = TRUE, path.lib = NULL) + + + + + +# DEBUGGING +# data1 = matrix(1:16, ncol = 4) ; legend.name1 = "" ; low.color1 = "blue" ; mid.color1 = "white" ; high.color1 = "red" ; limit1 = NULL ; midpoint1 = NULL ; data2 = matrix(rep(c(1,0,0,0), 4), ncol = 4) ; color2 = "black" ; alpha2 = 0.5 ; invert2 = FALSE ; text.size = 12 ; title = "" ; title.text.size = 12 ; show.scale = TRUE ; rotate = FALSE ; return = FALSE ; plot = TRUE ; add = NULL ; warn.print = TRUE ; path.lib = NULL +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_pack", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_pack() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_round", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_round() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# no reserved words required for this function +# argument checking +warning <- NULL +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +if(all(is.matrix(data1))){ +tempo <- fun_check(data = data1, class = "matrix", mode = "numeric", na.contain = TRUE, fun.name = function.name) ; eval(ee) +}else if(all(is.data.frame(data1))){ +tempo <- fun_check(data = data1, class = "data.frame", length = 3, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE){ +# structure of reshape2::melt() data frame +tempo <- fun_check(data = data1[, 1], typeof = "integer", fun.name = function.name) +tempo <- fun_check(data = data1[, 2], typeof = "integer", fun.name = function.name) +tempo <- fun_check(data = data1[, 3], mode = "numeric", na.contain = TRUE, fun.name = function.name) +} +}else{ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data1 ARGUMENT MUST BE A NUMERIC MATRIX OR A DATA FRAME OUTPUT OF THE reshape::melt() FUNCTION\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +tempo <- fun_check(data = legend.name1, class = "character", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = low.color1, class = "character", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! (all(low.color1 %in% colors() | grepl(pattern = "^#", low.color1)))){ # check that all strings of low.color1 start by # +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": low.color1 ARGUMENT MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # AND/OR COLOR NAMES GIVEN BY colors()\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +if( ! is.null(mid.color1)){ +tempo <- fun_check(data = mid.color1, class = "character", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! (all(mid.color1 %in% colors() | grepl(pattern = "^#", mid.color1)))){ # check that all strings of mid.color1 start by # +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": mid.color1 ARGUMENT MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # AND/OR COLOR NAMES GIVEN BY colors()\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +} +tempo <- fun_check(data = high.color1, class = "character", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! (all(high.color1 %in% colors() | grepl(pattern = "^#", high.color1)))){ # check that all strings of high.color1 start by # +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": high.color1 ARGUMENT MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # AND/OR COLOR NAMES GIVEN BY colors()\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +if( ! is.null(limit1)){ +tempo <- fun_check(data = limit1, class = "vector", mode = "numeric", length = 2, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & any(limit1 %in% c(Inf, -Inf))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": limit1 ARGUMENT CANNOT CONTAIN -Inf OR Inf VALUES\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +} +if( ! is.null(midpoint1)){ +tempo <- fun_check(data = midpoint1, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) +} +if( ! is.null(data2)){ +if(all(is.matrix(data2))){ +tempo <- fun_check(data = data2, class = "matrix", mode = "numeric", fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! all(unique(data2) %in% c(0,1))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": MATRIX IN data2 MUST BE MADE OF 0 AND 1 ONLY (MASK MATRIX)\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +}else if(tempo$problem == FALSE & all(is.matrix(data1)) & ! identical(dim(data1), dim(data2))){ # matrix and matrix +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": MATRIX DIMENSION IN data2 MUST BE IDENTICAL AS MATRIX DIMENSION IN data1. HERE IT IS RESPECTIVELY:\n", paste(dim(data2), collapse = " "), "\n", paste(dim(data1), collapse = " "), "\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +}else if(tempo$problem == FALSE & all(is.data.frame(data1)) & nrow(data1) != prod(dim(data2))){ # reshape2 and matrix +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": DATA FRAME IN data2 MUST HAVE ROW NUMBER EQUAL TO PRODUCT OF DIMENSIONS OF data1 MATRIX. HERE IT IS RESPECTIVELY:\n", paste(nrow(data1), collapse = " "), "\n", paste(prod(dim(data2)), collapse = " "), "\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +}else if(all(is.data.frame(data2))){ +tempo <- fun_check(data = data2, class = "data.frame", length = 3, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE){ +# structure of reshape2::melt() data frame +tempo <- fun_check(data = data2[, 1], typeof = "integer", fun.name = function.name) +tempo <- fun_check(data = data2[, 2], typeof = "integer", fun.name = function.name) +tempo <- fun_check(data = data2[, 3], mode = "numeric", fun.name = function.name) +} +if(tempo$problem == FALSE & ! all(unique(data2[, 3]) %in% c(0,1))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THIRD COLUMN OF DATA FRAME IN data2 MUST BE MADE OF 0 AND 1 ONLY (MASK DATA FRAME)\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +}else if(tempo$problem == FALSE & all(is.data.frame(data1)) & ! identical(dim(data1), dim(data2))){ # data frame and data frame +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": DATA FRAME DIMENSION IN data2 MUST BE IDENTICAL TO DATA FRAME DIMENSION IN data1. HERE IT IS RESPECTIVELY:\n", paste(dim(data2), collapse = " "), "\n", paste(dim(data1), collapse = " "), "\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +}else if(tempo$problem == FALSE & all(is.matrix(data1)) & nrow(data2) != prod(dim(data1))){ # reshape2 and matrix +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": DATA FRAME IN data2 MUST HAVE ROW NUMBER EQUAL TO PRODUCT OF DIMENSION OF data1 MATRIX. HERE IT IS RESPECTIVELY:\n", paste(nrow(data2), collapse = " "), "\n", paste(prod(dim(data1)), collapse = " "), "\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +}else{ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data2 ARGUMENT MUST BE A NUMERIC MATRIX OR A DATA FRAME OUTPUT OF THE reshape::melt() FUNCTION\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +} +tempo <- fun_check(data = color2, class = "character", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! (all(color2 %in% colors() | grepl(pattern = "^#", color2)))){ # check that all strings of color2 start by # +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": color2 ARGUMENT MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # AND/OR COLOR NAMES GIVEN BY colors()\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +tempo <- fun_check(data = alpha2, class = "vector", mode = "numeric", length = 1, prop = TRUE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = invert2, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = text.size, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = title, class = "character", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = title.text.size, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = show.scale, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = return, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = plot, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(add)){ +tempo <- fun_check(data = add, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! grepl(pattern = "^\\+", add)){ # check that the add string start by + +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": add ARGUMENT MUST START WITH \"+\": ", paste(unique(add), collapse = " "), "\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +}else if(tempo$problem == FALSE & ! grepl(pattern = "ggplot2::", add)){ # +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": add ARGUMENT MUST CONTAIN \"ggplot2::\" IN FRONT OF EACH GGPLOT2 FUNCTION: ", paste(unique(add), collapse = " "), "\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +}else if(tempo$problem == FALSE & ! grepl(pattern = ")$", add)){ # check that the add string finished by ) +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": add ARGUMENT MUST FINISH BY \")\": ", paste(unique(add), collapse = " "), "\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +} +tempo <- fun_check(data = warn.print, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(path.lib)){ +tempo <- fun_check(data = path.lib, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! all(dir.exists(path.lib))){ +cat(paste0("\n\n============\n\nERROR IN ", function.name, ": \nDIRECTORY PATH INDICATED IN THE path.lib PARAMETER DOES NOT EXISTS: ", path.lib, "\n\n============\n\n")) +arg.check <- c(arg.check, TRUE) +} +} +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_check() +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() +# end argument checking +# package checking +fun_pack(req.package = c("reshape2", "ggplot2"), path.lib = path.lib) +# end package checking +# main code +if(all(is.matrix(data1))){ +data1 <- reshape2::melt(data1) # transform a matrix into a dataframe with 2 coordinates columns and the third intensity column +} +if(rotate == TRUE){ +data1[, 1] <- rev(data1[, 1]) +} +if(is.null(limit1)){ +if(any(data1[, 3] %in% c(Inf, -Inf))){ +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": THE data1 ARGUMENT CONTAINS -Inf OR Inf VALUES IN THE THIRD COLUMN, THAT WILL NOT BE CONSIDERED IN THE PLOT RANGE") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +limit1 <- range(data1[, 3], na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": THE limit1 ARGUMENT IS NULL -> RANGE OF data1 ARGUMENT HAS BEEN TAKEN: ", paste(fun_round(limit1), collapse = " ")) +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +if(suppressWarnings(any(limit1 %in% c(Inf, -Inf)))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, " COMPUTED LIMIT CONTAINS Inf VALUES, BECAUSE VALUES FROM data1 ARGUMENTS ARE NA OR Inf ONLY\n\n================\n\n") +stop(tempo.cat) +} +} +if(is.null(midpoint1)){ +midpoint1 <- mean(limit1, na.rm = TRUE) +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": THE midpoint1 ARGUMENT IS NULL -> MEAN OF limit1 ARGUMENT HAS BEEN TAKEN: ", paste(fun_round(midpoint1), collapse = " ")) +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +}else if(fun_round(midpoint1, 9) != fun_round(mean(limit1), 9)){ +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": THE midpoint1 ARGUMENT (", fun_round(mean(midpoint1), 9), ") DOES NOT CORRESPOND TO THE MEAN OF THE limit1 ARGUMENT (", fun_round(mean(limit1), 9), "). COLOR SCALE IS NOT LINEAR") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +if( ! is.null(data2)){ +if(all(is.matrix(data2))){ +data2 <- reshape2::melt(data2) # transform a matrix into a dataframe with 2 coordinates columns and the third intensity column +} +if(rotate == TRUE){ +data2[, 1] <- rev(data2[, 1]) +} +data2[, 3] <- factor(data2[, 3]) # to converte continuous scale into discrete scale +} +tempo.gg.name <- "gg.indiv.plot." +tempo.gg.count <- 0 # to facilitate debugging +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ggplot()) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_raster(data = data1, mapping = ggplot2::aes_string(x = names(data1)[ifelse(rotate == FALSE, 2, 1)], y = names(data1)[ifelse(rotate == FALSE, 1, 2)], fill = names(data1)[3]), show.legend = show.scale)) # show.legend option do not remove the legend, only the aesthetic of the legend (dot, line, etc.) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_fill_gradient2(low = low.color1, high = high.color1, mid = mid.color1, midpoint = midpoint1, limit = limit1, breaks = c(limit1[1], midpoint1, limit1[2]), labels = fun_round(c(limit1[1], midpoint1, limit1[2])), name = legend.name1)) +if( ! is.null(data2)){ +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_raster(data = data2, mapping = ggplot2::aes_string(x = names(data2)[ifelse(rotate == FALSE, 2, 1)], y = names(data2)[ifelse(rotate == FALSE, 1, 2)], alpha = names(data2)[3]), fill = color2, show.legend = FALSE)) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "alpha", values = if(invert2 == FALSE){c(0, alpha2)}else{c(alpha2, 0)}, guide = FALSE)) +# assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_raster(data = data2, mapping = ggplot2::aes_string(x = names(data2)[ifelse(rotate == FALSE, 2, 1)], y = names(data2)[ifelse(rotate == FALSE, 1, 2)], group = names(data2)[3]), fill = data2[, 3], alpha = alpha2, show.legend = FALSE)) # BEWARE: this does not work if NA present, because geom_raster() has a tendency to complete empty spaces, and thus, behave differently than geom_tile(). See https://github.com/tidyverse/ggplot2/issues/3025 +} +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::coord_fixed()) # x = y +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_y_reverse()) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ggtitle(title)) +add.check <- TRUE +if( ! is.null(add)){ # if add is NULL, then = 0 +if(grepl(pattern = "ggplot2::theme", add) == TRUE){ +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": \"ggplot2::theme\" STRING DETECTED IN THE add ARGUMENT -> INTERNAL GGPLOT2 THEME FUNCTIONS theme() AND theme_classic() HAVE BEEN INACTIVATED, TO BE USED BY THE USER") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +add.check <- FALSE +} +} +if(add.check == TRUE){ +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::theme_classic(base_size = text.size)) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::theme( +text = ggplot2::element_text(size = text.size), +plot.title = ggplot2::element_text(size = title.text.size), # stronger than text +line = ggplot2::element_blank(), +axis.title = ggplot2::element_blank(), +axis.text = ggplot2::element_blank(), +axis.ticks = ggplot2::element_blank(), +panel.background = ggplot2::element_blank() +)) +} +if(plot == TRUE){ +# suppressWarnings( +print(eval(parse(text = paste(paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "), if(is.null(add)){NULL}else{add})))) +# ) +}else{ +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": PLOT NOT SHOWN AS REQUESTED") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +if(warn.print == TRUE & ! is.null(warning)){ +warning(warning) +} +if(return == TRUE){ +output <- ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + ")))) +output <- output$data +names(output)[1] <- "heatmap" +if( ! is.null(data2)){ +names(output)[2] <- "mask" +} +return(list(data = output, axes = output$layout$panel_params[[1]], scale = c(limit1[1], midpoint1, limit1[2]), warnings = warning)) +} +} + + +######## fun_gg_empty_graph() #### text to display for empty graphs + + + + + +# Check OK: clear to go Apollo +fun_gg_empty_graph <- function(text = NULL, text.size = 12, title = NULL, title.size = 8, path.lib = NULL){ +# AIM +# display an empty ggplot2 plot with a text in the middle of the window (for instance to specify that no plot can be drawn) +# ARGUMENTS +# text: character string of the message to display +# text.size: numeric value of the text size (in points) +# title: character string of the graph title +# title.size: numeric value of the title size (in points) +# path.lib: absolute path of the required packages, if not in the default folders +# REQUIRED PACKAGES +# ggplot2 +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_check() +# fun_pack() +# RETURN +# an empty plot +# EXAMPLES +### simple example +# fun_gg_empty_graph(text = "NO GRAPH") +### white page +# fun_gg_empty_graph() +### all the arguments +# fun_gg_empty_graph(text = "NO GRAPH", text.size = 8, title = "GRAPH1", title.size = 10, path.lib = NULL) +# DEBUGGING +# text = "NO GRAPH" ; text.size = 12 ; title = "GRAPH1" ; title.size = 8 ; path.lib = NULL +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_pack", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_pack() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +if( ! is.null(text)){ +tempo <- fun_check(data = text, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +} +tempo <- fun_check(data = text.size, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(title)){ +tempo <- fun_check(data = title, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +} +tempo <- fun_check(data = title.size, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_check() +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() +# end argument checking +# package checking +fun_pack(req.package = c("ggplot2"), path.lib = path.lib) +# end package checking +# main code +tempo.gg.name <- "gg.indiv.plot." +tempo.gg.count <- 0 +# no need loop part +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ggplot()) +if( ! is.null(text)){ +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_text(data = data.frame(x = 1, y = 1), ggplot2::aes(x = x, y = y, label = text), size = text.size)) +} +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ggtitle(title)) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::theme_void()) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( +plot.title = ggplot2::element_text(size = title.size) # stronger than text +)) +suppressWarnings(print(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))) +} + + +################ Graphic extraction + + +######## fun_trim() #### display values from a quantitative variable and trim according to defined cut-offs + + +# Check OK: clear to go Apollo +fun_trim <- function(data, displayed.nb = NULL, single.value.display = FALSE, trim.method = "", trim.cutoffs = c(0.05, 0.975), interval.scale.disp = TRUE, down.space = 0.75, left.space = 0.75, up.space = 0.3, right.space = 0.25, orient = 1, dist.legend = 0.37, box.type = "l", amplif.label = 1.25, amplif.axis = 1.25, std.x.range = TRUE, std.y.range = TRUE, cex.pt = 0.2, col.box = hsv(0.55, 0.8, 0.8), x.nb.inter.tick = 4, y.nb.inter.tick = 0, tick.length = 1, sec.tick.length = 0.75, corner.text = "", amplif.legend = 1, magnific.corner.text = 0.75, trim.return = FALSE){ +# AIM +# trim and display values from a numeric vector or matrix +# plot 4 graphs: stripchart of values, stripchart of rank of values, hitogramme and normal QQPlot +# different kinds of intervals are displayed on the top of graphes to facilitate the analysis of the variable and a trimming setting +# the trimming interval chosen is displayed on top of graphs +# both trimmed and not trimmed values are returned in a list +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_check() +# ARGUMENTS +# data: values to plot (either a numeric vector or a numeric matrix) +# displayed.nb: number of values displayed. If NULL, all the values are displayed. Otherwise, if the number of values is over displayed.nb, then displayed.nb values are displayed after random selection +# single.value.display: provide the 4 graphs if data is made of a single (potentially repeated value)? If FALSE, an empty graph is displayed if data is made of a single (potentially repeated value). And the return list is made of NULL compartments +# trim.method: Write "" if not required. write "mean.sd" if mean +/- sd has to be displayed as a trimming interval (only recommanded for normal distribution). Write "quantile" to display a trimming interval based on quantile cut-offs. No other possibility allowed. See trim.cutoffs below +# trim.cutoffs: 2 values cutoff for the trimming interval displayed, each value between 0 and 1. Not used if trim.method == "".The couple of values c(lower, upper) represents the lower and upper boundaries of the trimming interval (in proportion), which represent the interval of distribution kept (between 0 and 1). Example: trim.cutoffs = c(0.05, 0.975). What is strictly kept for the display is ]lower , upper[, boundaries excluded. Using the "mean.sd" method, 0.025 and 0.975 represent 95% CI which is mean +/- 1.96 * sd +# interval.scale.disp: display sd and quantiles intervals on top of graphs ? +# down.space: lower vertical margin (in inches, mai argument of par()) +# left.space: left horizontal margin (in inches, mai argument of par()) +# up.space: upper vertical margin between plot region and grapical window (in inches, mai argument of par()) +# right.space: right horizontal margin (in inches, mai argument of par()) +# orient: scale number orientation (las argument of par()). 0, always parallel to the axis; 1, always horizontal; 2, always perpendicular to the axis; 3, always vertical +# dist.legend: numeric value that moves axis legends away in inches (first number of mgp argument of par() but in inches thus / 0.2) +# box.type: bty argument of par(). Either "o", "l", "7", "c", "u", "]", the resulting box resembles the corresponding upper case letter. A value of "n" suppresses the box +# amplif.label: increase or decrease the size of the text in legends +# amplif.axis: increase or decrease the size of the scale numbers in axis +# std.x.range: standard range on the x-axis? TRUE (no range extend) or FALSE (4% range extend). Controls xaxs argument of par() (TRUE is xaxs = "i", FALSE is xaxs = "r") +# std.y.range: standard range on the y-axis? TRUE (no range extend) or FALSE (4% range extend). Controls yaxs argument of par() (TRUE is yaxs = "i", FALSE is yaxs = "r") +# cex.pt: size of points in stripcharts (in inches, thus cex.pt will be thereafter / 0.2) +# col.box: color of boxplot +# x.nb.inter.tick: number of secondary ticks between main ticks on x-axis (only if not log scale). Zero means non secondary ticks +# y.nb.inter.tick: number of secondary ticks between main ticks on y-axis (only if not log scale). Zero means non secondary ticks +# tick.length: length of the ticks (1 means complete the distance between the plot region and the axis numbers, 0.5 means half the length, etc. 0 means no tick +# sec.tick.length: length of the secondary ticks (1 means complete the distance between the plot region and the axis numbers, 0.5 means half the length, etc., 0 for no ticks) +# corner.text: text to add at the top right corner of the window +# amplif.legend: increase or decrease the size of the text of legend +# magnific.corner.text: increase or decrease the size of the text +# trim.return: return the trimmed and non trimmed values? NULL returned for trimmed and non trimmed values if trim.method == "" +# RETURN +# a list containing: +# $trim.method: correspond to trim.method above +# $trim.cutoffs: correspond to trim.cutoffs above +# $real.trim.cutoffs: the two boundary values (in the unit of the numeric vector or numeric matrix analyzed). NULL +# $trimmed.values: the values outside of the trimming interval as defined in trim.cutoffs above +# $kept.values: the values inside the trimming interval as defined in trim.cutoffs above +# EXAMPLES +# fun_trim(data = c(1:100, 1:10), displayed.nb = NULL, single.value.display = FALSE, trim.method = "mean.sd", trim.cutoffs = c(0.05, 0.975), interval.scale.disp = TRUE, down.space = 0.75, left.space = 0.75, up.space = 0.3, right.space = 0.25, orient = 1, dist.legend = 0.37, box.type = "l", amplif.label = 1.25, amplif.axis = 1.25, std.x.range = TRUE, std.y.range = TRUE, cex.pt = 0.2, col.box = hsv(0.55, 0.8, 0.8), x.nb.inter.tick = 4, y.nb.inter.tick = 0, tick.length = 0.5, sec.tick.length = 0.3, corner.text = "", amplif.legend = 1, magnific.corner.text = 0.75, trim.return = TRUE) +# DEBUGGING +# data = c(1:100, 1:10) ; displayed.nb = NULL ; single.value.display = FALSE ; trim.method = "quantile" ; trim.cutoffs = c(0.05, 0.975) ; interval.scale.disp = TRUE ; down.space = 1 ; left.space = 1 ; up.space = 0.5 ; right.space = 0.25 ; orient = 1 ; dist.legend = 0.5 ; box.type = "l" ; amplif.label = 1 ; amplif.axis = 1 ; std.x.range = TRUE ; std.y.range = TRUE ; cex.pt = 0.1 ; col.box = hsv(0.55, 0.8, 0.8) ; x.nb.inter.tick = 4 ; y.nb.inter.tick = 0 ; tick.length = 0.5 ; sec.tick.length = 0.3 ; corner.text = "" ; amplif.legend = 1 ; magnific.corner.text = 0.75 ; trim.return = TRUE # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +# argument checking without fun_check() +if( ! (all(class(data) == "numeric") | all(class(data) == "integer") | (all(class(data) == "matrix") & mode(data) == "numeric"))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": data ARGUMENT MUST BE A NUMERIC VECTOR OR NUMERIC MATRIX\n\n================\n\n") +stop(tempo.cat) +} +# end argument checking without fun_check() +# argument checking with fun_check() +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +if( ! is.null(displayed.nb)){ +tempo <- fun_check(data = displayed.nb, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) +if(displayed.nb < 2){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": displayed.nb ARGUMENT MUST BE A SINGLE INTEGER VALUE GREATER THAN 1 AND NOT: ", paste(displayed.nb, collapse = " "), "\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +} +tempo <- fun_check(data = single.value.display, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = trim.method, options = c("", "mean.sd", "quantile"), length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = trim.cutoffs, class = "vector", mode = "numeric", length = 2, prop = TRUE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = interval.scale.disp, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = down.space, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = left.space, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = up.space, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = right.space, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = orient, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = dist.legend, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = box.type, options = c("o", "l", "7", "c", "u", "]", "n"), length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = amplif.label, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = amplif.axis, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = std.x.range, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = std.y.range, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = cex.pt, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = col.box, class = "character", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = x.nb.inter.tick, class = "integer", length = 1, neg.values = FALSE, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = y.nb.inter.tick, class = "integer", length = 1, neg.values = FALSE, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = tick.length, class = "vector", mode = "numeric", length = 1, prop = TRUE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = sec.tick.length, class = "vector", mode = "numeric", length = 1, prop = TRUE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = corner.text, class = "character", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = amplif.legend, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = magnific.corner.text, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = trim.return, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_check() +} +# end argument checking with fun_check() +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() +# end argument checking +# main code +if(class(data) == "matrix"){ +data <- as.vector(data) +} +color.cut <- hsv(0.75, 1, 1) # color of interval selected +col.mean <- hsv(0.25, 1, 0.8) # color of interval using mean+/-sd +col.quantile <- "orange" # color of interval using quantiles +quantiles.selection <- c(0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 0.75, 0.9, 0.95, 0.975, 0.99) # quantiles used in axis to help for choosing trimming cutoffs +if(single.value.display == FALSE & length(unique(data)) == 1){ +par(bty = "n", xaxt = "n", yaxt = "n", xpd = TRUE) +plot(1, pch = 16, col = "white", xlab = "", ylab = "") +text(x = 1, y = 1, paste0("No graphic displayed\nBecause data made of a single different value (", formatC(as.double(table(data))), ")"), cex = 2) +output <- list(trim.method = NULL, trim.cutoffs = NULL, real.trim.cutoffs = NULL, trimmed.values = NULL, kept.values = NULL) +}else{ +output <- list(trim.method = trim.method, trim.cutoffs = trim.cutoffs, real.trim.cutoffs = NULL, trimmed.values = NULL, kept.values = NULL) +fun.rug <- function(sec.tick.length.f = sec.tick.length, x.nb.inter.tick.f = x.nb.inter.tick, y.nb.inter.tick.f = y.nb.inter.tick){ +if(x.nb.inter.tick.f > 0){ +inter.tick.unit <- (par("xaxp")[2] - par("xaxp")[1]) / par("xaxp")[3] +par.ini <- par()[c("xpd", "tcl")] +par(xpd = FALSE) +par(tcl = -par()$mgp[2] * sec.tick.length.f) # tcl gives the length of the ticks as proportion of line text, knowing that mgp is in text lines. So the main ticks are a 0.5 of the distance of the axis numbers by default. The sign provides the side of the tick (negative for outside of the plot region) +suppressWarnings(rug(seq(par("xaxp")[1] - 10 * inter.tick.unit, par("xaxp")[2] + 10 * inter.tick.unit, by = inter.tick.unit / (1 + x.nb.inter.tick.f)), ticksize = NA, side = 1)) # ticksize = NA to allow the use of par()$tcl value +par(par.ini) +rm(par.ini) +} +if(y.nb.inter.tick.f > 0){ +inter.tick.unit <- (par("yaxp")[2] - par("yaxp")[1]) / par("yaxp")[3] +par.ini <- par()[c("xpd", "tcl")] +par(xpd = FALSE) +par(tcl = -par()$mgp[2] * sec.tick.length.f) # tcl gives the length of the ticks as proportion of line text, knowing that mgp is in text lines. So the main ticks are a 0.5 of the distance of the axis numbers by default. The sign provides the side of the tick (negative for outside of the plot region) +suppressWarnings(rug(seq(par("yaxp")[1] - 10 * inter.tick.unit, par("yaxp")[2] + 10 * inter.tick.unit, by = inter.tick.unit / (1 + y.nb.inter.tick.f)), ticksize = NA, side = 2)) # ticksize = NA to allow the use of par()$tcl value +par(par.ini) +rm(par.ini) +} +} +fun.add.cut <- function(data.f, trim.method.f = trim.method, trim.cutoffs.f = trim.cutoffs, color.cut.f = color.cut, return.f = FALSE){ +# DEBUGGING +# data.f = data ; trim.method.f = "mean.sd"; trim.cutoffs.f = trim.cutoffs ; color.cut.f = color.cut ; return.f = TRUE +real.trim.cutoffs.f <- NULL +if(trim.method.f != ""){ +data.f <- sort(data.f) +par.ini <- par()$xpd +par(xpd = FALSE) +if(trim.method.f == "mean.sd"){ +real.trim.cutoffs.f <- qnorm(trim.cutoffs.f, mean(data.f, na.rm = TRUE), sd(data.f, na.rm = TRUE)) +abline(v = qnorm(trim.cutoffs.f, mean(data.f, na.rm = TRUE), sd(data.f, na.rm = TRUE)), col = color.cut.f) +segments(qnorm(trim.cutoffs.f[1], mean(data.f, na.rm = TRUE), sd(data.f, na.rm = TRUE)), par()$usr[4] * 0.75, qnorm(trim.cutoffs.f[2], mean(data.f, na.rm = TRUE), sd(data.f, na.rm = TRUE)), par()$usr[4] * 0.75, col = color.cut.f) +} +if(trim.method.f == "quantile"){ +real.trim.cutoffs.f <- quantile(data.f, probs = trim.cutoffs.f, type = 7) +abline(v = quantile(data.f, probs = trim.cutoffs.f, type = 7), col = color.cut.f) +segments(quantile(data.f, probs = trim.cutoffs.f[1], type = 7), par()$usr[4] * 0.75, quantile(data.f, probs = trim.cutoffs.f[2], type = 7), par()$usr[4] * 0.75, col = color.cut.f) +} +par(par.ini) +if(return.f == TRUE){ +trimmed.values.f <- data.f[data.f <= real.trim.cutoffs.f[1] | data.f >= real.trim.cutoffs.f[2]] +kept.values.f <- data.f[data.f > real.trim.cutoffs.f[1] & data.f < real.trim.cutoffs.f[2]] +} +}else{ +real.trim.cutoffs.f <- NULL +trimmed.values.f <- NULL +kept.values.f <- NULL +} +if(return.f == TRUE){ +output <- list(trim.method = trim.method.f, trim.cutoffs = trim.cutoffs.f, real.trim.cutoffs = real.trim.cutoffs.f, trimmed.values = trimmed.values.f, kept.values = kept.values.f) +return(output) +} +} +fun.interval.scale.display <- function(data.f, col.quantile.f = col.quantile, quantiles.selection.f = quantiles.selection, col.mean.f = col.mean){ # intervals on top of graphs +par.ini <- par()[c("mgp", "xpd")] +par(mgp = c(0.25, 0.25, 0), xpd = NA) +axis(side = 3, at = c(par()$usr[1], par()$usr[2]), labels = rep("", 2), col = col.quantile.f, lwd.ticks = 0) +par(xpd = FALSE) +axis(side = 3, at = quantile(as.vector(data.f), probs = quantiles.selection.f, type = 7), labels = quantiles.selection.f, col.axis = col.quantile.f, col = col.quantile.f) +par(mgp = c(1.75, 1.75, 1.5), xpd = NA) +axis(side = 3, at = c(par()$usr[1], par()$usr[2]), labels = rep("", 2), col = col.mean.f, lwd.ticks = 0) +par(xpd = FALSE) +axis(side = 3, at = m + s * qnorm(quantiles.selection.f), labels = formatC(round(qnorm(quantiles.selection.f), 2)), col.axis = col.mean.f, col = col.mean.f, lwd.ticks = 1) +par(par.ini) +} +zone<-matrix(1:4, ncol=2) +layout(zone) +par(omi = c(0, 0, 1.5, 0), mai = c(down.space, left.space, up.space, right.space), las = orient, mgp = c(dist.legend / 0.2, 0.5, 0), xpd = FALSE, bty= box.type, cex.lab = amplif.label, cex.axis = amplif.axis, xaxs = ifelse(std.x.range, "i", "r"), yaxs = ifelse(std.y.range, "i", "r")) +par(tcl = -par()$mgp[2] * tick.length) # tcl gives the length of the ticks as proportion of line text, knowing that mgp is in text lines. So the main ticks are a 0.5 of the distance of the axis numbers by default. The sign provides the side of the tick (negative for outside of the plot region) +if(is.null(displayed.nb)){ +sampled.data <- as.vector(data) +if(corner.text == ""){ +corner.text <- paste0("ALL VALUES OF THE DATASET DISPLAYED") +}else{ +corner.text <- paste0(corner.text, "\nALL VALUES OF THE DATASET DISPLAYED") +} +}else{ +if(length(as.vector(data)) > displayed.nb){ +sampled.data <- sample(as.vector(data), displayed.nb, replace = FALSE) +if(corner.text == ""){ +corner.text <- paste0("BEWARE: ONLY ", displayed.nb, " VALUES ARE DISPLAYED AMONG THE ", length(as.vector(data)), " VALUES OF THE DATASET ANALYZED") +}else{ +corner.text <- paste0(corner.text, "\nBEWARE: ONLY ", displayed.nb, " VALUES ARE DISPLAYED AMONG THE ", length(as.vector(data)), " VALUES OF THE DATASET ANALYZED") +} +}else{ +sampled.data <- as.vector(data) +if(corner.text == ""){ +corner.text <- paste0("BEWARE: THE DISPLAYED NUMBER OF VALUES PARAMETER ", deparse(substitute(displayed.nb)), " HAS BEEN SET TO ", displayed.nb, " WHICH IS ABOVE THE NUMBER OF VALUES OF THE DATASET ANALYZED -> ALL VALUES DISPLAYED") +}else{ +corner.text <- paste0(corner.text, "\nBEWARE: THE DISPLAYED NUMBER OF VALUES PARAMETER ", deparse(substitute(displayed.nb)), " HAS BEEN SET TO ", displayed.nb, " WHICH IS ABOVE THE NUMBER OF VALUES OF THE DATASET ANALYZED -> ALL VALUES DISPLAYED") +} +} +} +stripchart(sampled.data, method="jitter", jitter=0.4, vertical=FALSE, ylim=c(0.5, 1.5), group.names = "", xlab = "Value", ylab="", pch=1, cex = cex.pt / 0.2) +fun.rug(y.nb.inter.tick.f = 0) +boxplot(as.vector(data), horizontal=TRUE, add=TRUE, boxwex = 0.4, staplecol = col.box, whiskcol = col.box, medcol = col.box, boxcol = col.box, range = 0, whisklty = 1) +m <- mean(as.vector(data), na.rm = TRUE) +s <- sd(as.vector(data), na.rm = TRUE) +segments(m, 0.8, m, 1, lwd=2, col="red") # mean +segments(m -1.96 * s, 0.9, m + 1.96 * s, 0.9, lwd=1, col="red") # mean +graph.xlim <- par()$usr[1:2] # for hist() and qqnorm() below +if(interval.scale.disp == TRUE){ +fun.interval.scale.display(data.f = data) +if(corner.text == ""){ +corner.text <- paste0("MULTIPLYING FACTOR DISPLAYED (MEAN +/- SD) ON SCALES: ", paste(formatC(round(qnorm(quantiles.selection), 2))[-(1:(length(quantiles.selection) - 1) / 2)], collapse = ", "), "\nQUANTILES DISPLAYED ON SCALES: ", paste(quantiles.selection, collapse = ", ")) +}else{ +corner.text <- paste0(corner.text, "\nMULTIPLYING FACTOR DISPLAYED (MEAN +/- SD) ON SCALES: ", paste(formatC(round(qnorm(quantiles.selection), 2))[-(1:(length(quantiles.selection) - 1) / 2)], collapse = ", "), "\nQUANTILES DISPLAYED ON SCALES: ", paste(quantiles.selection, collapse = ", ")) +} +} +output.tempo <- fun.add.cut(data.f = data, return.f = TRUE) # to recover real.trim.cutoffs +if(trim.return == TRUE){ +output <- output.tempo +} +par(xpd = NA) +if(trim.method != ""){ +if(corner.text == ""){ +corner.text <- paste0("SELECTED CUT-OFFS (PROPORTION): ", paste(trim.cutoffs, collapse = ", "), "\nSELECTED CUT-OFFS: ", paste(output.tempo$real.trim.cutoffs, collapse = ", ")) +}else{ +corner.text <- paste0(corner.text, "\nSELECTED CUT-OFFS (PROPORTION): ", paste(trim.cutoffs, collapse = ", "), "\nSELECTED CUT-OFFS: ", paste(output.tempo$real.trim.cutoffs, collapse = ", ")) +} +if(interval.scale.disp == TRUE){ +legend(x = (par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] - ((par("usr")[2] - par("usr")[1]) / (par("omd")[2] - par("omd")[1])) * par("omd")[1]), y = (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / (par("omd")[4] - par("omd")[3])) * (1 - par("omd")[4]) / 2), legend = c(c("min, Q1, Median, Q3, max"), "mean +/- 1.96sd", paste0("Trimming interval: ", paste0(trim.cutoffs, collapse = " , ")), "Mean +/- sd multiplying factor", "Quantile"), yjust = 0, lty=1, col=c(col.box, "red", color.cut, col.mean, col.quantile), bty="n", cex = amplif.legend) +}else{ +legend(x = (par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] - ((par("usr")[2] - par("usr")[1]) / (par("omd")[2] - par("omd")[1])) * par("omd")[1]), y = (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / (par("omd")[4] - par("omd")[3])) * (1 - par("omd")[4]) / 2), legend = c(c("min, Q1, Median, Q3, max"), "mean +/- 1.96sd", paste0("Trimming interval: ", paste0(trim.cutoffs, collapse = " , "))), yjust = 0, lty=1, col=c(col.box, "red", color.cut), bty="n", cex = amplif.legend, y.intersp=1.25) +} +}else{ +if(interval.scale.disp == TRUE){ +legend(x = (par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] - ((par("usr")[2] - par("usr")[1]) / (par("omd")[2] - par("omd")[1])) * par("omd")[1]), y = (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / (par("omd")[4] - par("omd")[3])) * (1 - par("omd")[4]) / 2), legend = c(c("min, Q1, Median, Q3, max"), "mean +/- sd", "Mean +/- sd multiplying factor", "Quantile"), yjust = 0, lty=1, col=c(col.box, "red", col.mean, col.quantile), bty="n", cex = amplif.legend) +}else{ +legend(x = (par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] - ((par("usr")[2] - par("usr")[1]) / (par("omd")[2] - par("omd")[1])) * par("omd")[1]), y = (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / (par("omd")[4] - par("omd")[3])) * (1 - par("omd")[4]) / 2), legend = c(c("min, Q1, Median, Q3, max"), "mean +/- sd"), yjust = 0, lty=1, col=c(col.box, "red"), bty="n", cex = amplif.legend, y.intersp=1.25) +} +} +par(xpd = FALSE, xaxs = ifelse(std.x.range, "i", "r"), yaxs = ifelse(std.y.range, "i", "r")) +hist(as.vector(data), main = "", breaks = seq(min(as.vector(data), na.rm = TRUE), max(as.vector(data), na.rm = TRUE), length.out = length(as.vector(data)) / 10), xlim = graph.xlim, xlab = "Value", ylab="Density", col = grey(0.25)) +abline(h = par()$usr[3]) +fun.rug() +if(interval.scale.disp == TRUE){ +fun.interval.scale.display(data.f = data) +} +fun.add.cut(data.f = data) +par(xaxs = ifelse(std.x.range, "i", "r")) +stripchart(rank(sampled.data), method="stack", vertical=FALSE, ylim=c(0.99, 1.3), group.names = "", xlab = "Rank of values", ylab="", pch=1, cex = cex.pt / 0.2) +fun.rug(y.nb.inter.tick.f = 0) +x.text <- par("usr")[2] + (par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1]) * (1 - par("plt")[2]) / 2 +y.text <- (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / ((par()$omd[4] / 2) * ((par("plt")[4] - par("plt")[3])))) * (1 - par("omd")[4])) # BEWARE. Here in "(par()$omd[4] / 2", division by two because there are 2 graphs staked on the y axis, and not one +par(xpd=NA) +text(x = x.text, y = y.text, paste0(corner.text), adj=c(1, 1.1), cex = magnific.corner.text) # text at the topright corner +par(xpd=FALSE) +par(xaxs = ifelse(std.x.range, "i", "r"), yaxs = ifelse(std.y.range, "i", "r")) +qqnorm(as.vector(sampled.data), main = "", datax = TRUE, ylab = "Value", pch = 1, col = "red", cex = cex.pt / 0.2) +fun.rug() +if(diff(quantile(as.vector(data), probs = c(0.25, 0.75), na.rm = TRUE)) != 0){ # otherwise, error generated +qqline(as.vector(data), datax = TRUE) +} +if(interval.scale.disp == TRUE){ +fun.interval.scale.display(data.f = data) +} +fun.add.cut(data.f = data) +} +if(trim.return == TRUE){ +return(output) +} +} + + +######## fun_segmentation() #### segment a dot cloud on a scatterplot and define the dots from another cloud outside the segmentation + + +# Check OK: clear to go Apollo +fun_segmentation <- function(data1, x1, y1, x.range.split = NULL, x.step.factor = 10, y.range.split = NULL, y.step.factor = 10, error = 0, data2 = NULL, x2, y2, data2.pb.dot = "unknown", xy.cross.kind = "&", plot = FALSE, graph.in.file = FALSE, raster = TRUE, warn.print = FALSE, path.lib = NULL){ +# AIM +# if data1 is a data frame corresponding to the data set of a scatterplot (with a x column for x-axis values and a y column for the y-axis column), then fun_segmentation() delimits a frame around the dots cloud using a sliding window set by x.range.split and x.step.factor to frame the top and bottom part of the cloud, and set by y.range.split and y.step.factor to frame the left and right part of the cloud +# if a second data frame is provided, corresponding to the data set of a scatterplot (with a x column for x-axis values and a y column for the y-axis column), then fun_segmentation() defines the dots of this data frame, outside of the frame of the first data frame +# WARNINGS +# if dots from data2 look significant on the graph (outside the frame) but are not (not black on the last figure), this is probably because the frame is flat on the zero coordinate (no volume inside the frame at this position). Thus, no way to conclude that data2 dots here are significant. These dots are refered to as "unknown". The pb.dot argument deals with such dots +# dots that are sometimes inside and outside the frame, depending on the sliding windows, are treated differently: they are removed. Such dots are neither classified as "signif", "non signif" or "unknown", but as "inconsistent" +# unknown dots are treated as finally significant, not significant, or unknown (data2.pb.dot argument) for each x-axis and y-axis separately. Then, the union or intersection of significant dots is performed (argument xy.cross.kind). See the example section +# ARGUMENTS +# data1: a dataframe containing a column of x-axis values and a column of y-axis values +# x1: character string of the data1 column name for x-axis (first column of data1 by default) +# y1: character string of the data1 column name for y-axis (second column of data1 by default) +# x.range.split: positive non null numeric value giving the number of interval on the x value range. if x.range is the range of the dots on the x-axis, then abs(diff(x.range) / x.range.split) gives the window size. Window size decreases when range.split increases. In unit of x-axis. Write NULL if not required. At least one of the x.range.split and y.range.split must be non NULL +# x.step.factor: positive non null numeric value giving the shift step of the window. If x.step.factor = 1, no overlap during the sliding (when the window slides from position n to position n+1, no overlap between the two positions). If x.step.factor = 2, 50% of overlap (when the window slides from position n to position n+1, the window on position n+1 overlap 50% of the window when it was on position n) +# y.range.split: same as x.range.split for the y-axis. At least one of the x.range.split and y.range.split must be non NULL +# y.step.factor: same as x.step.factor for the y-axis +# error: proportion (from 0 to 1) of false positives (i.e., proportion of dots from data1 outside of the frame). 0.05 means 5% of the dots from data1 outside of the frame +# data2: a dataframe containing a column of x-axis values and a column of y-axis values, for which outside dots of the data1 cloud has to be determined. Write NULL if not required +# x2: character string of the data1 column name for x-axis (first column of data1 by default) +# y2: character string of the data1 column name for y-axis (second column of data1 by default) +# data2.pb.dot: unknown dots are explain in the warning section above. If "signif", then the unknown dots are finally considered as significant (outside the frame). If "not.signif", then the unknown dots are finally considered as non significant (inside the frame). If "unknown", no conclusion are drawn from these dots. See the examples below +# xy.cross.kind: if data2 is non null and if both x.range.split and y.range.split are non null, which dots are finally significants? Write "&" for intersection of outside dots on x and on y. Write "|" for union of outside dots on x and on y. See the examples below +# plot: logical. Print graphs that check the frame? +# graph.in.file: logical. Graphs sent into a graphic device already opened? If FALSE, GUI are opened for each graph. If TRUE, no GUI are opended. The graphs are displayed on the current active graphic device. Ignored if plot is FALSE +# raster: logical. Dots in raster mode? If FALSE, dots from each geom_point from geom argument are in vectorial mode (bigger pdf and long to display if millions of dots). If TRUE, dots from each geom_point from geom argument are in matricial mode (smaller pdf and easy display if millions of dots, but long to generate the layer). If TRUE, the region plot will be square to avoid a bug in fun_gg_point_rast(). If TRUE, solve the transparency problem with some GUI. Not considered if plot is FALSE +# warn.print: logical. Print warnings at the end of the execution? No print if no warning messages +# path.lib: absolute path of the required packages, if not in the default folders. Ignored if plot is FALSE +# REQUIRED PACKAGES +# ggplot2 if plot is TRUE +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_check() +# if plot is TRUE: +# fun_pack() +# fun_open() +# fun_gg_palette() +# fun_gg_scatter() +# fun_gg_empty_graph() +# fun_close() +# RETURN +# several graphs if plot is TRUE +# a list containing: +# $data1.removed.row.nb: which rows have been removed due to NA; NaN, -Inf or Inf detection in x1 or y1 columns (NULL if no row removed) +# $data1.removed.rows: removed rows (NULL if no row removed) +# $data2.removed.row.nb: which rows have been removed due to NA; NaN, -Inf or Inf detection in x2 or y2 columns (NULL if no row removed) +# $data2.removed.rows: removed rows (NULL if no row removed) +# $hframe: x and y coordinates of the bottom and top frames for frame plotting (frame1 for the left step and frame2 for the right step) +# $vframe: x and y coordinates of the left and right frames for frame plotting (frame1 for the down step and frame2 for the top step) +# $data1.signif.dot: the significant dots of data1 (i.e., dots outside the frame). A good segmentation should not have any data1.signif.dot +# $data1.non.signif.dot: the non significant dots of data1 (i.e., dots inside the frame) +# $data1.inconsistent.dot: see the warning section above +# $data2.signif.dot: the significant dots of data2 if non NULL (i.e., dots outside the frame) +# $data2.non.signif.dot: the non significant dots of data2 (i.e., dots inside the frame) +# $data2.unknown.dot: the problematic dots of data2 (i.e., data2 dots outside of the range of data1, or data2 dots in a sliding window without data1 dots). Is systematically NULL except if argument data2.pb.dot = "unknown" and some data2 dots are in such situation. Modifying the segmentation x.range.split, x.step.factor, y.range.split, y.step.factor arguments can solve this problem +# $data2.inconsistent.dot: see the warning section above +# $axes: the x-axis and y-axis info +# $warnings: the warning messages. Use cat() for proper display. NULL if no warning +# EXAMPLES +# example explaining the unknown and inconsistent dots, and the cross + +# set.seed(1) ; data1 = data.frame(x = rnorm(500), y = rnorm(500)) ; data1[5:7, 2] <- NA ; data2 = data.frame(x = rnorm(500, 0, 2), y = rnorm(500, 0, 2)) ; data2[11:13, 1] <- Inf ; set.seed(NULL) ; fun_segmentation(data1 = data1, x1 = names(data1)[1], y1 = names(data1)[2], x.range.split = 20, x.step.factor = 10, y.range.split = 23, y.step.factor = 10, error = 0, data2 = data2, x2 = names(data2)[1], y2 = names(data2)[2], data2.pb.dot = "not.signif", xy.cross.kind = "|", plot = TRUE, graph.in.file = FALSE, raster = FALSE, path.lib = NULL) +# set.seed(1) ; data1 = data.frame(x = rnorm(500), y = rnorm(500)) ; data2 = data.frame(x = rnorm(500, 0, 2), y = rnorm(500, 0, 2)) ; set.seed(NULL) ; fun_segmentation(data1 = data1, x1 = names(data1)[1], y1 = names(data1)[2], x.range.split = NULL, x.step.factor = 10, y.range.split = 23, y.step.factor = 10, error = 0, data2 = data2, x2 = names(data2)[1], y2 = names(data2)[2], data2.pb.dot = "unknown", xy.cross.kind = "|", plot = TRUE, graph.in.file = FALSE, raster = FALSE, path.lib = NULL) +# set.seed(1) ; data1 = data.frame(x = rnorm(500), y = rnorm(500)) ; data2 = data.frame(x = rnorm(500, 0, 2), y = rnorm(500, 0, 2)) ; set.seed(NULL) ; fun_segmentation(data1 = data1, x1 = names(data1)[1], y1 = names(data1)[2], x.range.split = 20, x.step.factor = 10, y.range.split = NULL, y.step.factor = 10, error = 0, data2 = data2, x2 = names(data2)[1], y2 = names(data2)[2], data2.pb.dot = "unknown", xy.cross.kind = "&", plot = TRUE, graph.in.file = FALSE, raster = FALSE, path.lib = NULL) +# DEBUGGING +# set.seed(1) ; data1 = data.frame(x = rnorm(50), y = rnorm(50)) ; data1[5:7, 2] <- NA ; x1 = names(data1)[1] ; y1 = names(data1)[2] ; x.range.split = 5 ; x.step.factor = 10 ; y.range.split = 5 ; y.step.factor = 10 ; error = 0 ; data2 = data.frame(x = rnorm(50, 0, 2), y = rnorm(50, 0, 2)) ; set.seed(NULL) ; x2 = names(data2)[1] ; y2 = names(data2)[2] ; data2.pb.dot = "unknown" ; xy.cross.kind = "|" ; plot = TRUE ; graph.in.file = FALSE ; raster = FALSE ; warn.print = TRUE ; path.lib = NULL +# set.seed(1) ; data1 = data.frame(x = rnorm(500), y = rnorm(500)) ; data2 = data.frame(x = rnorm(500, 0, 2), y = rnorm(500, 0, 2)) ; set.seed(NULL) ; x1 = names(data1)[1] ; y1 = names(data1)[2] ; x.range.split = NULL ; x.step.factor = 10 ; y.range.split = 23 ; y.step.factor = 10 ; error = 0 ; x2 = names(data2)[1] ; y2 = names(data2)[2] ; data2.pb.dot = "unknown" ; xy.cross.kind = "|" ; plot = TRUE ; graph.in.file = FALSE ; raster = FALSE ; warn.print = TRUE ; path.lib = NULL +# set.seed(1) ; data1 = data.frame(x = rnorm(500), y = rnorm(500)) ; data2 = data.frame(x = rnorm(500, 0, 2), y = rnorm(500, 0, 2)) ; set.seed(NULL) ; x1 = names(data1)[1] ; y1 = names(data1)[2] ; x.range.split = 20 ; x.step.factor = 10 ; y.range.split = NULL ; y.step.factor = 10 ; error = 0 ; x2 = names(data2)[1] ; y2 = names(data2)[2] ; data2.pb.dot = "unknown" ; xy.cross.kind = "&" ; plot = TRUE ; graph.in.file = FALSE ; raster = FALSE ; warn.print = TRUE ; path.lib = NULL +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +warning <- NULL +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_check(data = data1, class = "data.frame", na.contain = TRUE, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & length(data1) < 2){ +cat(paste0("\n\n============\n\nERROR IN ", function.name, ": data1 ARGUMENT MUST BE A DATA FRAME OF AT LEAST 2 COLUMNS\n\n============\n\n")) +arg.check <- c(arg.check, TRUE) +} +tempo <- fun_check(data = x1, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! (x1 %in% names(data1))){ +cat(paste0("\n\n================\n\nERROR IN ", function.name, ": x1 ARGUMENT MUST BE A COLUMN NAME OF data1\n\n================\n\n")) +arg.check <- c(arg.check, TRUE) +}else if(tempo$problem == FALSE & x1 %in% names(data1)){ +tempo <- fun_check(data = data1[, x1], data.name = "x1 COLUMN OF data1", class = "vector", mode = "numeric", na.contain = TRUE, fun.name = function.name) ; eval(ee) +} +tempo <- fun_check(data = y1, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! (y1 %in% names(data1))){ +cat(paste0("\n\n================\n\nERROR IN ", function.name, ": y1 ARGUMENT MUST BE A COLUMN NAME OF data1\n\n================\n\n")) +arg.check <- c(arg.check, TRUE) +}else if(tempo$problem == FALSE & y1 %in% names(data1)){ +tempo <- fun_check(data = data1[, y1], data.name = "y1 COLUMN OF data1", class = "vector", mode = "numeric", na.contain = TRUE, fun.name = function.name) ; eval(ee) +} +if(is.null(x.range.split) & is.null(y.range.split)){ +cat(paste0("\n\n================\n\nERROR IN ", function.name, ": AT LEAST ONE OF THE x.range.split AND y.range.split ARGUMENTS MUST BE NON NULL\n\n================\n\n")) +arg.check <- c(arg.check, TRUE) +} +if( ! is.null(x.range.split)){ +tempo <- fun_check(data = x.range.split, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & x.range.split < 1){ +cat(paste0("\n\n================\n\nERROR IN ", function.name, ": x.range.split ARGUMENT CANNOT BE LOWER THAN 1\n\n================\n\n")) +arg.check <- c(arg.check, TRUE) +} +} +if( ! is.null(y.range.split)){ +tempo <- fun_check(data = y.range.split, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & y.range.split < 1){ +cat(paste0("\n\n================\n\nERROR IN ", function.name, ": y.range.split ARGUMENT CANNOT BE LOWER THAN 1\n\n================\n\n")) +arg.check <- c(arg.check, TRUE) +} +} +tempo <- fun_check(data = x.step.factor, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & x.step.factor < 1){ +cat(paste0("\n\n================\n\nERROR IN ", function.name, ": x.step.factor ARGUMENT CANNOT BE LOWER THAN 1\n\n================\n\n")) +arg.check <- c(arg.check, TRUE) +} +tempo <- fun_check(data = y.step.factor, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & y.step.factor < 1){ +cat(paste0("\n\n================\n\nERROR IN ", function.name, ": y.step.factor ARGUMENT CANNOT BE LOWER THAN 1\n\n================\n\n")) +arg.check <- c(arg.check, TRUE) +} +tempo <- fun_check(data = error, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(data2)){ +if(is.null(x2) | is.null(y2)){ +cat(paste0("\n\n================\n\nERROR IN ", function.name, ": x2 AND y2 ARGUMENTS CANNOT BE NULL IF data2 ARGUMENT IS NON NULL\n\n================\n\n")) +arg.check <- c(arg.check, TRUE) +} +tempo <- fun_check(data = data2, class = "data.frame", na.contain = TRUE, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & length(data2) < 2){ +cat(paste0("\n\n============\n\nERROR IN ", function.name, ": data2 ARGUMENT MUST BE A DATA FRAME OF AT LEAST 2 COLUMNS\n\n============\n\n")) +arg.check <- c(arg.check, TRUE) +} +if( ! is.null(x2)){ +tempo <- fun_check(data = x2, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! (x2 %in% names(data2))){ +cat(paste0("\n\n================\n\nERROR IN ", function.name, ": x2 ARGUMENT MUST BE A COLUMN NAME OF data2\n\n================\n\n")) +arg.check <- c(arg.check, TRUE) +}else if(tempo$problem == FALSE & x2 %in% names(data2)){ +tempo <- fun_check(data = data2[, x2], data.name = "x2 COLUMN OF data2", class = "vector", mode = "numeric", na.contain = TRUE, fun.name = function.name) ; eval(ee) +} +} +if( ! is.null(y2)){ +tempo <- fun_check(data = y2, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! (y2 %in% names(data2))){ +cat(paste0("\n\n================\n\nERROR IN ", function.name, ": y2 ARGUMENT MUST BE A COLUMN NAME OF data2\n\n================\n\n")) +arg.check <- c(arg.check, TRUE) +}else if(tempo$problem == FALSE & y2 %in% names(data2)){ +tempo <- fun_check(data = data2[, y2], data.name = "y2 COLUMN OF data2", class = "vector", mode = "numeric", na.contain = TRUE, fun.name = function.name) ; eval(ee) +} +} +} +if( ! is.null(data2)){ +tempo <- fun_check(data = data2.pb.dot, options = c("signif", "not.signif", "unknown"), length = 1, fun.name = function.name) ; eval(ee) +} +if( ! (is.null(x.range.split)) & ! (is.null(y.range.split))){ +tempo <- fun_check(data = xy.cross.kind, options = c("&", "|"), length = 1, fun.name = function.name) ; eval(ee) +} +tempo <- fun_check(data = plot, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = warn.print, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & plot == TRUE){ +tempo <- fun_check(data = raster, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = graph.in.file, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & graph.in.file == TRUE & is.null(dev.list())){ +cat(paste0("\n\n============\n\nERROR IN ", function.name, ": \ngraph.in.file PARAMETER SET TO TRUE BUT NO ACTIVE GRAPHIC DEVICE DETECTED\n\n============\n\n")) +arg.check <- c(arg.check, TRUE) +}else if(tempo$problem == FALSE & graph.in.file == TRUE & ! is.null(dev.list())){ +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": GRAPHS PRINTED IN THE CURRENT DEVICE (TYPE ", toupper(names(dev.cur())), ")") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +if( ! is.null(path.lib)){ +tempo <- fun_check(data = path.lib, class = "character", fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! all(dir.exists(path.lib))){ +cat(paste0("\n\n============\n\nERROR IN ", function.name, ": \nDIRECTORY PATH INDICATED IN THE path.lib PARAMETER DOES NOT EXISTS: ", path.lib, "\n\n============\n\n")) +arg.check <- c(arg.check, TRUE) +} +} +} +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_check() +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() +# end argument checking +# other required function checking +if(plot == TRUE){ +if(length(find("fun_pack", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_pack() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_open", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_open() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_gg_palette", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_gg_palette() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_gg_empty_graph", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_gg_empty_graph() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_gg_scatter", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_gg_scatter() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_close", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_close() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +} +# end other required function checking +# package checking +if(plot == TRUE){ +fun_pack(req.package = c("ggplot2"), path.lib = path.lib) +} +# end package checking +# main code +# na and Inf detection and removal (done now to be sure of the correct length of categ) +data1.removed.row.nb <- NULL +data1.removed.rows <- NULL +data2.removed.row.nb <- NULL +data2.removed.rows <- NULL +if(any(is.na(data1[, c(x1, y1)])) | any(is.infinite(data1[, x1])) | any(is.infinite(data1[, y1]))){ +tempo.na <- unlist(lapply(lapply(c(data1[c(x1, y1)]), FUN = is.na), FUN = which)) +tempo.inf <- unlist(lapply(lapply(c(data1[c(x1, y1)]), FUN = is.infinite), FUN = which)) +data1.removed.row.nb <- sort(unique(c(tempo.na, tempo.inf))) +if(length(data1.removed.row.nb) > 0){ +data1.removed.rows <- data1[data1.removed.row.nb, ] +} +if(length(data1.removed.row.nb) == nrow(data1)){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": AT LEAST ONE NA, NaN, -Inf OR Inf DETECTED IN EACH ROW OF data1. FUNCTION CANNOT BE USED ON EMPTY DATA FRAME\n\n============\n\n")) +stop(tempo.cat) +} +if(length(data1.removed.row.nb) > 0){ +data1 <- data1[-data1.removed.row.nb, ] +} +if(nrow(data1) == 0){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 1\n\n============\n\n")) +stop(tempo.cat) +} +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": NA, NaN, -Inf OR Inf DETECTED IN COLUMN ", paste(c(x1, y1), collapse = " "), " OF data1 AND CORRESPONDING ROWS REMOVED (SEE $data1.removed.row.nb AND $data1.removed.rows)") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +}else{ +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": NO NA, NaN, -Inf OR Inf DETECTED IN COLUMN ", paste(c(x1, y1), collapse = " "), " OF data1. NO ROW REMOVED") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +if( ! is.null(data2)){ +if(any(is.na(data2[, c(x2, y2)])) | any(is.infinite(data2[, x2])) | any(is.infinite(data2[, y2]))){ +tempo.na <- unlist(lapply(lapply(c(data2[c(x2, y2)]), FUN = is.na), FUN = which)) +tempo.inf <- unlist(lapply(lapply(c(data2[c(x2, y2)]), FUN = is.infinite), FUN = which)) +data2.removed.row.nb <- sort(unique(c(tempo.na, tempo.inf))) +if(length(data2.removed.row.nb) > 0){ +data2.removed.rows <- data2[data2.removed.row.nb, ] +} +if(length(data2.removed.row.nb) == nrow(data2)){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": AT LEAST ONE NA, NaN, -Inf OR Inf DETECTED IN EACH ROW OF data2. FUNCTION CANNOT BE USED ON EMPTY DATA FRAME\n\n============\n\n")) +stop(tempo.cat) +} +if(length(data2.removed.row.nb) > 0){ +data2 <- data2[-data2.removed.row.nb, ] +} +if(nrow(data2) == 0){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 2\n\n============\n\n")) +stop(tempo.cat) +} +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": NA, NaN, -Inf OR Inf DETECTED IN COLUMN ", paste(c(x2, y2), collapse = " "), " OF data2 AND CORRESPONDING ROWS REMOVED (SEE $data2.removed.row.nb AND $data2.removed.rows)") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +}else{ +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": NO NA, NaN, -Inf OR Inf DETECTED IN COLUMN ", paste(c(x2, y2), collapse = " "), " OF data2. NO ROW REMOVED") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +} +# end na and Inf detection and removal (done now to be sure of the correct length of categ) +# row annotation (dot number) +# data1 <- data1[ ! duplicated(data1[, c(x1, y1)]), ] # do not remove the dots that have same x and y values, because they will have different dot number -> not the same position on the matrices (so true for symmetric matrices) +data1 <- cbind(data1, DOT_NB = 1:nrow(data1)) +if( ! is.null(data2)){ +# data2 <- data2[ ! duplicated(data2[, c(x2, y2)]), ] # do not remove the dots that have same x and y values, because they will have different dot number -> not the same position on the matrices (so true for symmetric matrices) +data2 <- cbind(data2, DOT_NB = 1:nrow(data2)) +} +# end row annotation (dot number) + + + + +# Method using x unit interval +# may be create vector of each column to increase speed +x.data1.l <- NULL # x coord of the y upper and lower limits defined on the data1 cloud for left step line +x.data1.r <- NULL # x coord of the y upper and lower limits defined on the data1 cloud for right step line +y.data1.down.limit.l <- NULL # lower limit of the data1 cloud for left step line +y.data1.top.limit.l <- NULL # upper limit of the data1 cloud for left step line +y.data1.down.limit.r <- NULL # lower limit of the data1 cloud for right step line +y.data1.top.limit.r <- NULL # upper limit of the data1 cloud for left step line +if(any(data1[, x1] %in% c(Inf, -Inf))){ +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": THE data1 ARGUMENT CONTAINS -Inf OR Inf VALUES IN THE x1 COLUMN, THAT WILL NOT BE CONSIDERED IN THE PLOT RANGE") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +x.range <- range(data1[, x1], na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only +if(suppressWarnings(any(x.range %in% c(Inf, -Inf)))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, " COMPUTED x.range CONTAINS Inf VALUES, BECAUSE VALUES FROM data1 ARGUMENTS ARE NA OR Inf ONLY\n\n================\n\n") +stop(tempo.cat) +} +if(any(data1[, y1] %in% c(Inf, -Inf))){ +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": THE data1 ARGUMENT CONTAINS -Inf OR Inf VALUES IN THE y1 COLUMN, THAT WILL NOT BE CONSIDERED IN THE PLOT RANGE") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +y.range <- range(data1[, y1], na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only +if(suppressWarnings(any(x.range %in% c(Inf, -Inf)))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, " COMPUTED y.range CONTAINS Inf VALUES, BECAUSE VALUES FROM data1 ARGUMENTS ARE NA OR Inf ONLY\n\n================\n\n") +stop(tempo.cat) +} +x.range.plot <- range(data1[, x1], na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only +y.range.plot <- range(data1[, y1], na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only +if( ! is.null(data2)){ +if(any(data2[, x2] %in% c(Inf, -Inf))){ +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": THE data2 ARGUMENT CONTAINS -Inf OR Inf VALUES IN THE x2 COLUMN, THAT WILL NOT BE CONSIDERED IN THE PLOT RANGE") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +x.range.plot <- range(data1[, x1], data2[, x2], na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only +if(any(data2[, y2] %in% c(Inf, -Inf))){ +tempo.warning <- paste0("FROM FUNCTION ", function.name, ": THE data2 ARGUMENT CONTAINS -Inf OR Inf VALUES IN THE y2 COLUMN, THAT WILL NOT BE CONSIDERED IN THE PLOT RANGE") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +y.range.plot <- range(data1[, y1], data2[, y2], na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only +} +if(suppressWarnings(any(x.range.plot %in% c(Inf, -Inf)))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, " COMPUTED x.range.plot CONTAINS Inf VALUES, BECAUSE VALUES FROM data1 (AND data2?) ARGUMENTS ARE NA OR Inf ONLY\n\n================\n\n") +stop(tempo.cat) +} +if(suppressWarnings(any(y.range.plot %in% c(Inf, -Inf)))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, " COMPUTED y.range.plot CONTAINS Inf VALUES, BECAUSE VALUES FROM data1 (AND data2?) ARGUMENTS ARE NA OR Inf ONLY\n\n================\n\n") +stop(tempo.cat) +} +if( ! is.null(x.range.split)){ +# data.frame ordering to slide the window from small to big values + sliding window definition +data1 <- data1[order(data1[, x1], na.last = TRUE), ] +if( ! is.null(data2)){ +data2 <- data2[order(data2[, x2], na.last = TRUE), ] +} +x.win.size <- abs(diff(x.range) / x.range.split) # in unit of x-axis +step <- x.win.size / x.step.factor +# end data.frame ordering to slide the window from small to big values + sliding window definition +# x-axis sliding and y-axis limits of the data1 cloud -> y significant data2 +loop.nb <- ceiling((diff(x.range) - x.win.size) / step) # x.win.size + n * step covers the x range if x.win.size + n * step >= diff(x.range), thus if n >= (diff(x.range) - x.win.size) / step +y.outside.data1.dot.nb <- integer() # vector that will contain the selected rows numbers of data1 that are upper or lower than the frame +y.inside.data1.dot.nb <- integer() # vector that will contain the selected rows numbers of data1 that are not upper or lower than the frame +y.data1.median <- median(data1[, y1], na.rm = TRUE) # will be used for sliding windows without data1 in it +if( ! is.null(data2)){ +y.outside.data2.dot.nb <- integer() # vector that will contain the selected 1D coordinates (i.e., dots) of data2 that are upper or lower than the data1 frame +y.inside.data2.dot.nb <- integer() # vector that will contain the 1D coordinates (i.e., dots) of data2 that are not upper or lower than the data1 frame +y.unknown.data2.dot.nb <- integer() # vector that will contain the 1D coordinates (i.e., dots) of data2 that are problematic: data2 dots outside of the range of data1, or data2 dots in a sliding window without data1 dots +# recover data2 dots outside the range of data1 +if(any(data2[, x2] < x.range[1])){ +y.unknown.data2.dot.nb <- c(y.unknown.data2.dot.nb, data2$DOT_NB[data2[, x2] < x.range[1]]) +#tempo.warning & indicate the interval +} +if(any(data2[, x2] > x.range[2])){ +y.unknown.data2.dot.nb <- c(y.unknown.data2.dot.nb, data2$DOT_NB[data2[, x2] > x.range[2]]) +#tempo.warning & indicate the interval +} +# end recover data2 dots outside the range of data1 +} +# loop.ini.time <- as.numeric(Sys.time()) +for(i1 in 0:(loop.nb + 1)){ +min.pos <- x.range[1] + step * i1 # lower position of the sliding window in data1 +max.pos <- min.pos + x.win.size # upper position of the sliding window in data1 +x.data1.l <- c(x.data1.l, min.pos, min.pos + step) # min.pos + step to make the steps +x.data1.r <- c(x.data1.r, max.pos, max.pos + step) # max.pos + step to make the steps +x.data1.dot.here <- data1[, x1] >= min.pos & data1[, x1] < max.pos # is there data1 dot present in the sliding window, considering the x axis? +if( ! is.null(data2)){ +x.data2.dot.here <- data2[, x2] >= min.pos & data2[, x2] < max.pos # is there data2 dot present in the sliding window, considering the x axis? +} +# recover the data1 dots outside the frame +if(any(x.data1.dot.here == TRUE)){ +tempo.y.data1.top.limit <- quantile(data1[x.data1.dot.here, y1], probs = 1 - error, na.rm = TRUE) +tempo.y.data1.down.limit <- quantile(data1[x.data1.dot.here, y1], probs = 0 + error, na.rm = TRUE) +y.data1.top.limit.l <- c(y.data1.top.limit.l, tempo.y.data1.top.limit, tempo.y.data1.top.limit) +y.data1.down.limit.l <- c(y.data1.down.limit.l, tempo.y.data1.down.limit, tempo.y.data1.down.limit) +y.data1.top.limit.r <- c(y.data1.top.limit.r, tempo.y.data1.top.limit, tempo.y.data1.top.limit) +y.data1.down.limit.r <- c(y.data1.down.limit.r, tempo.y.data1.down.limit, tempo.y.data1.down.limit) +y.data1.dot.signif <- ( ! ((data1[, y1] <= tempo.y.data1.top.limit) & (data1[, y1] >= tempo.y.data1.down.limit))) & x.data1.dot.here # is there data1 dot present in the sliding window, above or below the data1 limits, considering the y axis? +y.data1.dot.not.signif <- x.data1.dot.here & ! y.data1.dot.signif +y.outside.data1.dot.nb <- c(y.outside.data1.dot.nb, data1$DOT_NB[y.data1.dot.signif]) # recover the row number of data1 +y.outside.data1.dot.nb <- unique(y.outside.data1.dot.nb) +y.inside.data1.dot.nb <- c(y.inside.data1.dot.nb, data1$DOT_NB[y.data1.dot.not.signif]) +y.inside.data1.dot.nb <- unique(y.inside.data1.dot.nb) +}else{ +y.data1.top.limit.l <- c(y.data1.top.limit.l, y.data1.median, y.data1.median) +y.data1.down.limit.l <- c(y.data1.down.limit.l, y.data1.median, y.data1.median) +y.data1.top.limit.r <- c(y.data1.top.limit.r, y.data1.median, y.data1.median) +y.data1.down.limit.r <- c(y.data1.down.limit.r, y.data1.median, y.data1.median) +} +# end recover the data1 dots outside the frame +# recover the data2 dots outside the frame +if( ! is.null(data2)){ +if(any(x.data1.dot.here == TRUE) & any(x.data2.dot.here == TRUE)){ +y.data2.dot.signif <- ( ! ((data2[, y2] <= tempo.y.data1.top.limit) & (data2[, y2] >= tempo.y.data1.down.limit))) & x.data2.dot.here # is there data2 dot present in the sliding window, above or below the data1 limits, considering the y axis? +y.data2.dot.not.signif <- x.data2.dot.here & ! y.data2.dot.signif +y.outside.data2.dot.nb <- c(y.outside.data2.dot.nb, data2$DOT_NB[y.data2.dot.signif]) +y.outside.data2.dot.nb <- unique(y.outside.data2.dot.nb) +y.inside.data2.dot.nb <- c(y.inside.data2.dot.nb, data2$DOT_NB[y.data2.dot.not.signif]) +y.inside.data2.dot.nb <- unique(y.inside.data2.dot.nb) +}else if(any(x.data1.dot.here == FALSE) & any(x.data2.dot.here == TRUE)){ # problem: data2 dots in the the windows but no data1 dots to generates the quantiles +y.unknown.data2.dot.nb <- c(y.unknown.data2.dot.nb, data2$DOT_NB[x.data2.dot.here]) +y.unknown.data2.dot.nb <- unique(y.unknown.data2.dot.nb) +#tempo.warning & indicate the interval + + + + +# tempo.warning <- paste0("FROM FUNCTION ", function.name, ": THE [", round(min.pos, 3), " ; ", round(max.pos, 3), "] INTERVAL DOES NOT CONTAIN data1 X VALUES BUT CONTAINS data2 X VALUES WHICH CANNOT BE EVALUATED.\nTHE CONCERNED data2 ROW NUMBERS ARE:\n", paste(which(x.data1.dot.here == FALSE & x.data2.dot.here == TRUE), collapse = "\n")) +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +} +# end recover the data2 dots outside the frame +# if(any(i1 == seq(1, loop.nb, 500))){ +# loop.fin.time <- as.numeric(Sys.time()) # time of process end +# cat(paste0("COMPUTATION TIME OF LOOP ", i1, " / ", loop.nb, ": ", as.character(lubridate::seconds_to_period(round(loop.fin.time - loop.ini.time))), "\n")) +# } +} +if(max.pos < x.range[2]){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE SLIDING WINDOW HAS NOT REACHED THE MAX VALUE OF data1 ON THE X-AXIS: ", max.pos, " VERSUS ", x.range[2], "\n\n================\n\n") +stop(tempo.cat) +} +y.incon.data1.dot.nb.final <- unique(c(y.outside.data1.dot.nb[y.outside.data1.dot.nb %in% y.inside.data1.dot.nb], y.inside.data1.dot.nb[y.inside.data1.dot.nb %in% y.outside.data1.dot.nb])) # inconsistent dots: if a row number of y.inside.data1.dot.nb is present in y.outside.data1.dot.nb (and vice versa), it means that during the sliding, a dot has been sometime inside, sometime outside -> removed from the outside list +y.outside.data1.dot.nb.final <- y.outside.data1.dot.nb[ ! (y.outside.data1.dot.nb %in% y.incon.data1.dot.nb.final)] # inconsistent dots removed from the outside list +y.inside.data1.dot.nb.final <- y.inside.data1.dot.nb[ ! (y.inside.data1.dot.nb %in% y.incon.data1.dot.nb.final)] # inconsistent dots removed from the inside list +if( ! is.null(data2)){ +# if some unknown dots are also inside, and/or outside, they are put in the inside and/or outside. Ok, because then the intersection between inside and outside is treated -> inconsistent dots +tempo.unknown.out <- y.unknown.data2.dot.nb[y.unknown.data2.dot.nb %in% y.outside.data2.dot.nb] +y.outside.data2.dot.nb <- unique(c(y.outside.data2.dot.nb, tempo.unknown.out)) # if a row number of y.unknown.data2.dot.nb is present in y.outside.data2.dot.nb, it is put into outside +tempo.unknown.in <- y.unknown.data2.dot.nb[y.unknown.data2.dot.nb %in% y.inside.data2.dot.nb] +y.inside.data2.dot.nb <- unique(c(y.inside.data2.dot.nb, tempo.unknown.in)) # if a row number of y.unknown.data2.dot.nb is present in y.inside.data2.dot.nb, it is put into inside +y.unknown.data2.dot.nb.final <- y.unknown.data2.dot.nb[ ! (y.unknown.data2.dot.nb %in% c(y.outside.data2.dot.nb, y.inside.data2.dot.nb))] # then dots also in inside and outside are remove from unknown +y.incon.data2.dot.nb.final <- unique(c(y.outside.data2.dot.nb[y.outside.data2.dot.nb %in% y.inside.data2.dot.nb], y.inside.data2.dot.nb[y.inside.data2.dot.nb %in% y.outside.data2.dot.nb])) # inconsistent dots: if a row number of y.inside.data2.dot.nb is present in y.outside.data2.dot.nb (and vice versa), it means that during the sliding, a dot has been sometime inside, sometime outside -> removed from the outside list +y.outside.data2.dot.nb.final <- y.outside.data2.dot.nb[ ! (y.outside.data2.dot.nb %in% y.incon.data2.dot.nb.final)] # inconsistent dots removed from the outside list +y.inside.data2.dot.nb.final <- y.inside.data2.dot.nb[ ! (y.inside.data2.dot.nb %in% y.incon.data2.dot.nb.final)] # inconsistent dots removed from the inside list +} +# end x-axis sliding and y-axis limits of the data1 cloud -> y significant data2 +} +# end Method using x unit interval + + + + +# Method using y unit interval +y.data1.d <- NULL # y coord of the x upper and lower limits defined on the data1 cloud for down step line +y.data1.t <- NULL # y coord of the x upper and lower limits defined on the data1 cloud for top step line +x.data1.left.limit.d <- NULL # left limit of the data1 cloud for down step line +x.data1.right.limit.d <- NULL # right limit of the data1 cloud for down step line +x.data1.left.limit.t <- NULL # left limit of the data1 cloud for top step line +x.data1.right.limit.t <- NULL # right limit of the data1 cloud for top step line +if( ! is.null(y.range.split)){ +# data.frame ordering to slide the window from small to big values + sliding window definition +data1 <- data1[order(data1[, y1], na.last = TRUE), ] +if( ! is.null(data2)){ +data2 <- data2[order(data2[, y2], na.last = TRUE), ] +} +y.win.size <- abs(diff(y.range) / y.range.split) # in unit of y-axis +step <- y.win.size / y.step.factor +# end data.frame ordering to slide the window from small to big values + sliding window definition +# y-axis sliding and x-axis limits of the data1 cloud -> x significant data2 +loop.nb <- ceiling((diff(y.range) - y.win.size) / step) # y.win.size + n * step covers the y range if y.win.size + n * step >= diff(y.range), thus if n >= (diff(y.range) - y.win.size) / step +x.outside.data1.dot.nb <- integer() # vector that will contain the selected rows numbers of data1 that are upper or lower than the frame +x.inside.data1.dot.nb <- integer() # vector that will contain the selected rows numbers of data1 that are not upper or lower than the frame +x.data1.median <- median(data1[, x1], na.rm = TRUE) # will be used for sliding windows without data1 in it +if( ! is.null(data2)){ +x.outside.data2.dot.nb <- integer() # vector that will contain the selected 1D coordinates (i.e., dots) of data2 that are upper or lower than the data1 frame +x.inside.data2.dot.nb <- integer() # vector that will contain the 1D coordinates (i.e., dots) of data2 that are not upper or lower than the data1 frame +x.unknown.data2.dot.nb <- integer() # vector that will contain the 1D coordinates (i.e., dots) of data2 that are problematic: data2 dots outside of the range of data1, or data2 dots in a sliding window without data1 dots +# recover data2 dots outside the range of data1 +if(any(data2[, y2] < y.range[1])){ +x.unknown.data2.dot.nb <- c(x.unknown.data2.dot.nb, data2$DOT_NB[data2[, y2] < y.range[1]]) +} +if(any(data2[, y2] > y.range[2])){ +x.unknown.data2.dot.nb <- c(x.unknown.data2.dot.nb, data2$DOT_NB[data2[, y2] > y.range[2]]) +} +# end recover data2 dots outside the range of data1 +} +# loop.ini.time <- as.numeric(Sys.time()) +for(i1 in 0:(loop.nb + 1)){ +min.pos <- y.range[1] + step * i1 # lower position of the sliding window in data1 +max.pos <- min.pos + y.win.size # upper position of the sliding window in data1 +y.data1.d <- c(y.data1.d, min.pos, min.pos + step) # min.pos + step to make the steps +y.data1.t <- c(y.data1.t, max.pos, max.pos + step) # max.pos + step to make the steps +y.data1.dot.here <- data1[, y1] >= min.pos & data1[, y1] < max.pos # is there data1 dot present in the sliding window, considering the y axis? +if( ! is.null(data2)){ +y.data2.dot.here <- data2[, y2] >= min.pos & data2[, y2] < max.pos # is there data2 dot present in the sliding window, considering the y axis? +} +# recover the data1 dots outside the frame +if(any(y.data1.dot.here == TRUE)){ +tempo.x.data1.right.limit <- quantile(data1[y.data1.dot.here, x1], probs = 1 - error, na.rm = TRUE) +tempo.x.data1.left.limit <- quantile(data1[y.data1.dot.here, x1], probs = 0 + error, na.rm = TRUE) +x.data1.right.limit.d <- c(x.data1.right.limit.d, tempo.x.data1.right.limit, tempo.x.data1.right.limit) +x.data1.left.limit.d <- c(x.data1.left.limit.d, tempo.x.data1.left.limit, tempo.x.data1.left.limit) +x.data1.right.limit.t <- c(x.data1.right.limit.t, tempo.x.data1.right.limit, tempo.x.data1.right.limit) +x.data1.left.limit.t <- c(x.data1.left.limit.t, tempo.x.data1.left.limit, tempo.x.data1.left.limit) +x.data1.dot.signif <- ( ! ((data1[, x1] <= tempo.x.data1.right.limit) & (data1[, x1] >= tempo.x.data1.left.limit))) & y.data1.dot.here # is there data2 dot present in the sliding window, above or below the data1 limits, considering the x axis? +x.data1.dot.not.signif <- y.data1.dot.here & ! x.data1.dot.signif +x.outside.data1.dot.nb <- c(x.outside.data1.dot.nb, data1$DOT_NB[x.data1.dot.signif]) # recover the row number of data1 +x.outside.data1.dot.nb <- unique(x.outside.data1.dot.nb) +x.inside.data1.dot.nb <- c(x.inside.data1.dot.nb, data1$DOT_NB[x.data1.dot.not.signif]) +x.inside.data1.dot.nb <- unique(x.inside.data1.dot.nb) +}else{ +x.data1.right.limit.d <- c(x.data1.right.limit.d, x.data1.median, x.data1.median) +x.data1.left.limit.d <- c(x.data1.left.limit.d, x.data1.median, x.data1.median) +x.data1.right.limit.t <- c(x.data1.right.limit.t, x.data1.median, x.data1.median) +x.data1.left.limit.t <- c(x.data1.left.limit.t, x.data1.median, x.data1.median) +} +# end recover the data1 dots outside the frame +# recover the data2 dots outside the frame +if( ! is.null(data2)){ +if(any(y.data1.dot.here == TRUE) & any(y.data2.dot.here == TRUE)){ +x.data2.dot.signif <- ( ! ((data2[, x2] <= tempo.x.data1.right.limit) & (data2[, x2] >= tempo.x.data1.left.limit))) & y.data2.dot.here # is there data2 dot present in the sliding window, above or below the data1 limits, considering the x axis? +x.data2.dot.not.signif <- y.data2.dot.here & ! x.data2.dot.signif +x.outside.data2.dot.nb <- c(x.outside.data2.dot.nb, data2$DOT_NB[x.data2.dot.signif]) +x.outside.data2.dot.nb <- unique(x.outside.data2.dot.nb) +x.inside.data2.dot.nb <- c(x.inside.data2.dot.nb, data2$DOT_NB[x.data2.dot.not.signif]) +x.inside.data2.dot.nb <- unique(x.inside.data2.dot.nb) +}else if(any(y.data1.dot.here == FALSE) & any(y.data2.dot.here == TRUE)){ # recover the data2 dots outside the range of the data1 cloud +x.unknown.data2.dot.nb <- c(x.unknown.data2.dot.nb, data2$DOT_NB[y.data2.dot.here]) +x.unknown.data2.dot.nb <- unique(x.unknown.data2.dot.nb) + + + +# tempo.warning <- paste0("FROM FUNCTION ", function.name, ": THE [", round(min.pos, 3), " ; ", round(max.pos, 3), "] INTERVAL DOES NOT CONTAIN data1 Y VALUES BUT CONTAINS data2 Y VALUES WHICH CANNOT BE EVALUATED.\nTHE CONCERNED data2 ROW NUMBERS ARE:\n", paste(which(y.data1.dot.here == FALSE & y.data2.dot.here == TRUE), collapse = "\n")) +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +} +# end recover the data2 dots outside the frame +# if(any(i1 == seq(1, loop.nb, 500))){ +# loop.fin.time <- as.numeric(Sys.time()) # time of process end +# cat(paste0("COMPUTATION TIME OF LOOP ", i1, " / ", loop.nb, ": ", as.character(lubridate::seconds_to_period(round(loop.fin.time - loop.ini.time))), "\n")) +# } +} +if(max.pos < y.range[2]){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE SLIDING WINDOW HAS NOT REACHED THE MAX VALUE OF data1 ON THE Y-AXIS: ", max.pos, " VERSUS ", y.range[2], "\n\n================\n\n") +stop(tempo.cat) +} +x.incon.data1.dot.nb.final <- unique(c(x.outside.data1.dot.nb[x.outside.data1.dot.nb %in% x.inside.data1.dot.nb], x.inside.data1.dot.nb[x.inside.data1.dot.nb %in% x.outside.data1.dot.nb])) # inconsistent dots: if a row number of x.inside.data1.dot.nb is present in x.outside.data1.dot.nb (and vice versa), it means that during the sliding, a dot has been sometime inside, sometime outside -> removed from the outside list +x.outside.data1.dot.nb.final <- x.outside.data1.dot.nb[ ! (x.outside.data1.dot.nb %in% x.incon.data1.dot.nb.final)] # inconsistent dots removed from the outside list +x.inside.data1.dot.nb.final <- x.inside.data1.dot.nb[ ! (x.inside.data1.dot.nb %in% x.incon.data1.dot.nb.final)] # inconsistent dots removed from the inside list +if( ! is.null(data2)){ +# if some unknown dots are also inside, and/or outside, they are put in the inside and/or outside. Ok, because then the intersection between inside and outside is treated -> inconsistent dots +tempo.unknown.out <- x.unknown.data2.dot.nb[x.unknown.data2.dot.nb %in% x.outside.data2.dot.nb] +x.outside.data2.dot.nb <- unique(c(x.outside.data2.dot.nb, tempo.unknown.out)) # if a row number of x.unknown.data2.dot.nb is present in x.outside.data2.dot.nb, it is put into outside +tempo.unknown.in <- x.unknown.data2.dot.nb[x.unknown.data2.dot.nb %in% x.inside.data2.dot.nb] +x.inside.data2.dot.nb <- unique(c(x.inside.data2.dot.nb, tempo.unknown.in)) # if a row number of x.unknown.data2.dot.nb is present in x.inside.data2.dot.nb, it is put into inside +x.unknown.data2.dot.nb.final <- x.unknown.data2.dot.nb[ ! (x.unknown.data2.dot.nb %in% c(x.outside.data2.dot.nb, x.inside.data2.dot.nb))] # then dots also in inside and outside are remove from unknown +x.incon.data2.dot.nb.final <- unique(c(x.outside.data2.dot.nb[x.outside.data2.dot.nb %in% x.inside.data2.dot.nb], x.inside.data2.dot.nb[x.inside.data2.dot.nb %in% x.outside.data2.dot.nb])) # inconsistent dots: if a row number of x.inside.data2.dot.nb is present in x.outside.data2.dot.nb (and vice versa), it means that during the sliding, a dot has been sometime inside, sometime outside -> removed from the outside list +x.outside.data2.dot.nb.final <- x.outside.data2.dot.nb[ ! (x.outside.data2.dot.nb %in% x.incon.data2.dot.nb.final)] # inconsistent dots removed from the outside list +x.inside.data2.dot.nb.final <- x.inside.data2.dot.nb[ ! (x.inside.data2.dot.nb %in% x.incon.data2.dot.nb.final)] # inconsistent dots removed from the inside list +} +# end y-axis sliding and x-axis limits of the data1 cloud -> x significant data2 +} +# end Method using y unit interval + + + +# recovering the frame coordinates +hframe = rbind( +data.frame( +x = if(is.null(x.data1.l)){NULL}else{x.data1.l}, +y = if(is.null(x.data1.l)){NULL}else{y.data1.down.limit.l}, +kind = if(is.null(x.data1.l)){NULL}else{"down.frame1"} +), +data.frame( +x = if(is.null(x.data1.r)){NULL}else{x.data1.r}, +y = if(is.null(x.data1.r)){NULL}else{y.data1.down.limit.r}, +kind = if(is.null(x.data1.r)){NULL}else{"down.frame2"} +), +data.frame( +x = if(is.null(x.data1.l)){NULL}else{x.data1.l}, +y = if(is.null(x.data1.l)){NULL}else{y.data1.top.limit.l}, +kind = if(is.null(x.data1.l)){NULL}else{"top.frame1"} +), +data.frame( +x = if(is.null(x.data1.r)){NULL}else{x.data1.r}, +y = if(is.null(x.data1.r)){NULL}else{y.data1.top.limit.r}, +kind = if(is.null(x.data1.r)){NULL}else{"top.frame2"} +) +) +vframe = rbind( +data.frame( +x = if(is.null(y.data1.d)){NULL}else{x.data1.left.limit.d}, +y = if(is.null(y.data1.d)){NULL}else{y.data1.d}, +kind = if(is.null(y.data1.d)){NULL}else{"left.frame1"} +), +data.frame( +x = if(is.null(y.data1.t)){NULL}else{x.data1.left.limit.t}, +y = if(is.null(y.data1.t)){NULL}else{y.data1.t}, +kind = if(is.null(y.data1.t)){NULL}else{"left.frame2"} +), +data.frame( +x = if(is.null(y.data1.d)){NULL}else{x.data1.right.limit.d}, +y = if(is.null(y.data1.d)){NULL}else{y.data1.d}, +kind = if(is.null(y.data1.d)){NULL}else{"right.frame1"} +), +data.frame( +x = if(is.null(y.data1.t)){NULL}else{x.data1.right.limit.t}, +y = if(is.null(y.data1.t)){NULL}else{y.data1.t}, +kind = if(is.null(y.data1.t)){NULL}else{"right.frame2"} +) +) +# end recovering the frame coordinates +# recovering the dot coordinates +data1.signif.dot <- NULL +data1.non.signif.dot <- NULL +data1.incon.dot <- NULL +data2.signif.dot <- NULL +data2.non.signif.dot <- NULL +data2.unknown.dot <- NULL +data2.incon.dot <- NULL +if(( ! is.null(x.range.split)) & ( ! is.null(y.range.split))){ +# inconsistent dots recovery +if(length(unique(c(x.incon.data1.dot.nb.final, y.incon.data1.dot.nb.final))) > 0){ +data1.incon.dot <- data1[data1$DOT_NB %in% unique(c(x.incon.data1.dot.nb.final, y.incon.data1.dot.nb.final)), ] # if a dot in inconsistent in x or y -> classified as inconsistent (so unique() used) +# removal of the inconsistent dot in the other classifications +x.inside.data1.dot.nb.final <- x.inside.data1.dot.nb.final[ ! x.inside.data1.dot.nb.final %in% data1.incon.dot$DOT_NB] +y.inside.data1.dot.nb.final <- y.inside.data1.dot.nb.final[ ! y.inside.data1.dot.nb.final %in% data1.incon.dot$DOT_NB] +x.outside.data1.dot.nb.final <- x.outside.data1.dot.nb.final[ ! x.outside.data1.dot.nb.final %in% data1.incon.dot$DOT_NB] +y.outside.data1.dot.nb.final <- y.outside.data1.dot.nb.final[ ! y.outside.data1.dot.nb.final %in% data1.incon.dot$DOT_NB] +x.unknown.data1.dot.nb.final <- x.unknown.data1.dot.nb.final[ ! x.unknown.data1.dot.nb.final %in% data1.incon.dot$DOT_NB] +y.unknown.data1.dot.nb.final <- y.unknown.data1.dot.nb.final[ ! y.unknown.data1.dot.nb.final %in% data1.incon.dot$DOT_NB] +# end removal of the inconsistent dot in the other classifications +} +if( ! is.null(data2)){ +if(length(unique(c(x.incon.data2.dot.nb.final, y.incon.data2.dot.nb.final))) > 0){ +data2.incon.dot <- data2[data2$DOT_NB %in% unique(c(x.incon.data2.dot.nb.final, y.incon.data2.dot.nb.final)), ] +# removal of the inconsistent dot in the other classifications +x.inside.data2.dot.nb.final <- x.inside.data2.dot.nb.final[ ! x.inside.data2.dot.nb.final %in% data2.incon.dot$DOT_NB] +y.inside.data2.dot.nb.final <- y.inside.data2.dot.nb.final[ ! y.inside.data2.dot.nb.final %in% data2.incon.dot$DOT_NB] +x.outside.data2.dot.nb.final <- x.outside.data2.dot.nb.final[ ! x.outside.data2.dot.nb.final %in% data2.incon.dot$DOT_NB] +y.outside.data2.dot.nb.final <- y.outside.data2.dot.nb.final[ ! y.outside.data2.dot.nb.final %in% data2.incon.dot$DOT_NB] +x.unknown.data2.dot.nb.final <- x.unknown.data2.dot.nb.final[ ! x.unknown.data2.dot.nb.final %in% data2.incon.dot$DOT_NB] +y.unknown.data2.dot.nb.final <- y.unknown.data2.dot.nb.final[ ! y.unknown.data2.dot.nb.final %in% data2.incon.dot$DOT_NB] +# end removal of the inconsistent dot in the other classifications +} +} +# end inconsistent dots recovery +# unknown dots recovery +if( ! is.null(data2)){ +if(data2.pb.dot == "signif"){ +x.outside.data2.dot.nb.final <- unique(c(x.outside.data2.dot.nb.final, x.unknown.data2.dot.nb.final)) +x.inside.data2.dot.nb.final <- x.inside.data2.dot.nb.final[ ! x.inside.data2.dot.nb.final %in% x.unknown.data2.dot.nb.final] # remove x.unknown.data2.dot.nb.final from x.inside.data2.dot.nb.final +y.outside.data2.dot.nb.final <- unique(c(y.outside.data2.dot.nb.final, y.unknown.data2.dot.nb.final)) +y.inside.data2.dot.nb.final <- y.inside.data2.dot.nb.final[ ! y.inside.data2.dot.nb.final %in% y.unknown.data2.dot.nb.final] # remove y.unknown.data2.dot.nb.final from y.inside.data2.dot.nb.final +x.unknown.data2.dot.nb.final <- NULL +y.unknown.data2.dot.nb.final <- NULL +data2.unknown.dot <- NULL +}else if(data2.pb.dot == "not.signif"){ +x.inside.data2.dot.nb.final <- unique(c(x.inside.data2.dot.nb.final, x.unknown.data2.dot.nb.final)) +x.outside.data2.dot.nb.final <- x.outside.data2.dot.nb.final[ ! x.outside.data2.dot.nb.final %in% x.unknown.data2.dot.nb.final] # remove x.unknown.data2.dot.nb.final from x.outside.data2.dot.nb.final +y.inside.data2.dot.nb.final <- unique(c(y.inside.data2.dot.nb.final, y.unknown.data2.dot.nb.final)) +y.outside.data2.dot.nb.final <- y.outside.data2.dot.nb.final[ ! y.outside.data2.dot.nb.final %in% y.unknown.data2.dot.nb.final] # remove y.unknown.data2.dot.nb.final from y.outside.data2.dot.nb.final +x.unknown.data2.dot.nb.final <- NULL +y.unknown.data2.dot.nb.final <- NULL +data2.unknown.dot <- NULL +}else if(data2.pb.dot == "unknown"){ +if(length(unique(c(x.unknown.data2.dot.nb.final, y.unknown.data2.dot.nb.final))) > 0){ +data2.unknown.dot <- data2[data2$DOT_NB %in% unique(c(x.unknown.data2.dot.nb.final, y.unknown.data2.dot.nb.final)), ] # if a dot in unknown in x or y -> classified as unknown (so unique() used) +x.outside.data2.dot.nb.final <- x.outside.data2.dot.nb.final[ ! x.outside.data2.dot.nb.final %in% data2.unknown.dot$DOT_NB] # remove x.unknown.data2.dot.nb.final from x.outside.data2.dot.nb.final +x.inside.data2.dot.nb.final <- x.inside.data2.dot.nb.final[ ! x.inside.data2.dot.nb.final %in% data2.unknown.dot$DOT_NB] # remove x.unknown.data2.dot.nb.final from x.inside.data2.dot.nb.final +y.outside.data2.dot.nb.final <- y.outside.data2.dot.nb.final[ ! y.outside.data2.dot.nb.final %in% data2.unknown.dot$DOT_NB] # remove y.unknown.data2.dot.nb.final from y.outside.data2.dot.nb.final +y.inside.data2.dot.nb.final <- y.inside.data2.dot.nb.final[ ! y.inside.data2.dot.nb.final %in% data2.unknown.dot$DOT_NB] # remove y.unknown.data2.dot.nb.final from y.inside.data2.dot.nb.final +} +}else{ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 3\n\n============\n\n")) +stop(tempo.cat) +} +} +# end unknown dots recovery +# sign and non sign dot recovery +if(xy.cross.kind == "|"){ # here the problem is to deal with significant dots depending on x and y. Thus I start with that, recover dots finally non significant in outside and put them in inside (when &), and remove from inside the dots in outside +if(length(unique(c(x.outside.data1.dot.nb.final, y.outside.data1.dot.nb.final))) > 0){ +tempo.outside <- unique(c(x.outside.data1.dot.nb.final, y.outside.data1.dot.nb.final)) # union so unique() used +tempo.inside <- unique(c(x.inside.data1.dot.nb.final, y.inside.data1.dot.nb.final)) +tempo.inside <- tempo.inside[ ! tempo.inside %in% tempo.outside] +data1.signif.dot <- data1[data1$DOT_NB %in% tempo.outside, ] +data1.non.signif.dot <- data1[data1$DOT_NB %in% tempo.inside, ] +}else{ +data1.non.signif.dot <- data1[unique(c(x.inside.data1.dot.nb.final, y.inside.data1.dot.nb.final)), ] # if no outside dots, I recover all the inside dots and that's it +} +}else if(xy.cross.kind == "&"){ +if(sum(x.outside.data1.dot.nb.final %in% y.outside.data1.dot.nb.final) > 0){ # that is intersection +tempo.outside <- unique(x.outside.data1.dot.nb.final[x.outside.data1.dot.nb.final %in% y.outside.data1.dot.nb.final]) # intersection +tempo.outside.removed <- unique(c(x.outside.data1.dot.nb.final, y.outside.data1.dot.nb.final))[ ! unique(c(x.outside.data1.dot.nb.final, y.outside.data1.dot.nb.final)) %in% tempo.outside] +tempo.inside <- unique(c(x.inside.data1.dot.nb.final, y.inside.data1.dot.nb.final)) +data1.signif.dot <- data1[data1$DOT_NB %in% tempo.outside, ] +data1.non.signif.dot <- data1[data1$DOT_NB %in% tempo.inside, ] +}else{ +data1.non.signif.dot <- data1[unique(c(x.inside.data1.dot.nb.final, y.inside.data1.dot.nb.final)), ] # if no outside dots, I recover all the inside dots and that's it +} +}else{ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 4\n\n============\n\n")) +stop(tempo.cat) +} +if( ! is.null(data2)){ +if(xy.cross.kind == "|"){ # here the problem is to deal with significant dots depending on x and y. Thus I start with that, recover dots finally non significant in outside and put them in inside (when &), and remove from inside the dots in outside +if(length(unique(c(x.outside.data2.dot.nb.final, y.outside.data2.dot.nb.final))) > 0){ +tempo.outside <- unique(c(x.outside.data2.dot.nb.final, y.outside.data2.dot.nb.final)) # union so unique() used +tempo.inside <- unique(c(x.inside.data2.dot.nb.final, y.inside.data2.dot.nb.final)) +tempo.inside <- tempo.inside[ ! tempo.inside %in% tempo.outside] +data2.signif.dot <- data2[data2$DOT_NB %in% tempo.outside, ] +data2.non.signif.dot <- data2[data2$DOT_NB %in% tempo.inside, ] +}else{ +data2.non.signif.dot <- data2[unique(c(x.inside.data2.dot.nb.final, y.inside.data2.dot.nb.final)), ] # if no outside dots, I recover all the inside dots and that's it +} +}else if(xy.cross.kind == "&"){ +if(sum(x.outside.data2.dot.nb.final %in% y.outside.data2.dot.nb.final) > 0){ # that is intersection +tempo.outside <- unique(x.outside.data2.dot.nb.final[x.outside.data2.dot.nb.final %in% y.outside.data2.dot.nb.final]) # intersection +tempo.outside.removed <- unique(c(x.outside.data2.dot.nb.final, y.outside.data2.dot.nb.final))[ ! unique(c(x.outside.data2.dot.nb.final, y.outside.data2.dot.nb.final)) %in% tempo.outside] +tempo.inside <- unique(c(x.inside.data2.dot.nb.final, y.inside.data2.dot.nb.final)) +data2.signif.dot <- data2[data2$DOT_NB %in% tempo.outside, ] +data2.non.signif.dot <- data2[data2$DOT_NB %in% tempo.inside, ] +}else{ +data2.non.signif.dot <- data2[unique(c(x.inside.data2.dot.nb.final, y.inside.data2.dot.nb.final)), ] # if no outside dots, I recover all the inside dots and that's it +} +}else{ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 5\n\n============\n\n")) +stop(tempo.cat) +} +} +# end sign and non sign dot recovery +}else if(( ! is.null(x.range.split)) & is.null(y.range.split)){ +# inconsistent dots recovery +if(length(y.incon.data1.dot.nb.final) > 0){ +data1.incon.dot <- data1[data1$DOT_NB %in% y.incon.data1.dot.nb.final, ] +} +if( ! is.null(data2)){ +if(length(y.incon.data2.dot.nb.final) > 0){ +data2.incon.dot <- data2[data2$DOT_NB %in% y.incon.data2.dot.nb.final, ] +} +}# end inconsistent dots recovery +# unknown dots recovery +if( ! is.null(data2)){ +if(data2.pb.dot == "signif"){ +y.outside.data2.dot.nb.final <- unique(c(y.outside.data2.dot.nb.final, y.unknown.data2.dot.nb.final)) +}else if(data2.pb.dot == "not.signif"){ +y.inside.data2.dot.nb.final <- unique(c(y.inside.data2.dot.nb.final, y.unknown.data2.dot.nb.final)) +}else if(data2.pb.dot == "unknown"){ +if(length(y.unknown.data2.dot.nb.final) > 0){ +data2.unknown.dot <- data2[data2$DOT_NB %in% y.unknown.data2.dot.nb.final, ] +} +}else{ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 6\n\n============\n\n")) +stop(tempo.cat) +} +} +# end unknown dots recovery +# sign and non sign dot recovery +if(length(y.outside.data1.dot.nb.final) > 0){ +data1.signif.dot <- data1[data1$DOT_NB %in% y.outside.data1.dot.nb.final, ] +} +if(length(y.inside.data1.dot.nb.final) > 0){ +data1.non.signif.dot <- data1[data1$DOT_NB %in% y.inside.data1.dot.nb.final, ] +} +if( ! is.null(data2)){ +if(length(y.outside.data2.dot.nb.final) > 0){ +data2.signif.dot <- data2[data2$DOT_NB %in% y.outside.data2.dot.nb.final, ] +} +if(length(y.inside.data2.dot.nb.final) > 0){ +data2.non.signif.dot <- data2[data2$DOT_NB %in% y.inside.data2.dot.nb.final, ] +} +} +# end sign and non sign dot recovery +}else if(is.null(x.range.split) & ( ! is.null(y.range.split))){ +# inconsistent dots recovery +if(length(x.incon.data1.dot.nb.final) > 0){ +data1.incon.dot <- data1[data1$DOT_NB %in% x.incon.data1.dot.nb.final, ] +} +if( ! is.null(data2)){ +if(length(x.incon.data2.dot.nb.final) > 0){ +data2.incon.dot <- data2[data2$DOT_NB %in% x.incon.data2.dot.nb.final, ] +} +}# end inconsistent dots recovery +# unknown dots recovery +if( ! is.null(data2)){ +if(data2.pb.dot == "signif"){ +x.outside.data2.dot.nb.final <- unique(c(x.outside.data2.dot.nb.final, x.unknown.data2.dot.nb.final)) +}else if(data2.pb.dot == "not.signif"){ +x.inside.data2.dot.nb.final <- unique(c(x.inside.data2.dot.nb.final, x.unknown.data2.dot.nb.final)) +}else if(data2.pb.dot == "unknown"){ +if(length(x.unknown.data2.dot.nb.final) > 0){ +data2.unknown.dot <- data2[data2$DOT_NB %in% x.unknown.data2.dot.nb.final, ] +} +}else{ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 7\n\n============\n\n")) +stop(tempo.cat) +} +} +# end unknown dots recovery +# sign and non sign dot recovery +if(length(x.outside.data1.dot.nb.final) > 0){ +data1.signif.dot <- data1[data1$DOT_NB %in% x.outside.data1.dot.nb.final, ] +} +if(length(x.inside.data1.dot.nb.final) > 0){ +data1.non.signif.dot <- data1[data1$DOT_NB %in% x.inside.data1.dot.nb.final, ] +} +if( ! is.null(data2)){ +if(length(x.outside.data2.dot.nb.final) > 0){ +data2.signif.dot <- data2[data2$DOT_NB %in% x.outside.data2.dot.nb.final, ] +} +if(length(x.inside.data2.dot.nb.final) > 0){ +data2.non.signif.dot <- data2[data2$DOT_NB %in% x.inside.data2.dot.nb.final, ] +} +} +# end sign and non sign dot recovery +} +# end recovering the dot coordinates +# verif +if(any(data1.signif.dot$DOT_NB %in% data1.non.signif.dot$DOT_NB)){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", FUNCTION.NAME, ": CODE INCONSISTENCY 8\n\n============\n\n")) +stop(tempo.cat) +} +if(any(data1.non.signif.dot$DOT_NB %in% data1.signif.dot$DOT_NB)){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", FUNCTION.NAME, ": CODE INCONSISTENCY 9\n\n============\n\n")) +stop(tempo.cat) +} +if(any(data1.signif.dot$DOT_NB %in% data1.incon.dot$DOT_NB)){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 10\n\n============\n\n")) +stop(tempo.cat) +} +if(any(data1.incon.dot$DOT_NB %in% data1.signif.dot$DOT_NB)){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 11\n\n============\n\n")) +stop(tempo.cat) +} +if(any(data1.non.signif.dot$DOT_NB %in% data1.incon.dot$DOT_NB)){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 12\n\n============\n\n")) +stop(tempo.cat) +} +if(any(data1.incon.dot$DOT_NB %in% data1.non.signif.dot$DOT_NB)){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 13\n\n============\n\n")) +stop(tempo.cat) +} +if( ! is.null(data2)){ +if(any(data2.signif.dot$DOT_NB %in% data2.non.signif.dot$DOT_NB)){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 14\n\n============\n\n")) +stop(tempo.cat) +} +if(any(data2.non.signif.dot$DOT_NB %in% data2.signif.dot$DOT_NB)){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 15\n\n============\n\n")) +stop(tempo.cat) +} +if(any(data2.signif.dot$DOT_NB %in% data2.unknown.dot$DOT_NB)){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 16\n\n============\n\n")) +stop(tempo.cat) +} +if(any(data2.unknown.dot$DOT_NB %in% data2.signif.dot$DOT_NB)){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 17\n\n============\n\n")) +stop(tempo.cat) +} +if(any(data2.signif.dot$DOT_NB %in% data2.incon.dot$DOT_NB)){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 18\n\n============\n\n")) +stop(tempo.cat) +} +if(any(data2.incon.dot$DOT_NB %in% data2.signif.dot$DOT_NB)){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 19\n\n============\n\n")) +stop(tempo.cat) +} +if(any(data2.non.signif.dot$DOT_NB %in% data2.unknown.dot$DOT_NB)){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 20\n\n============\n\n")) +stop(tempo.cat) +} +if(any(data2.unknown.dot$DOT_NB %in% data2.non.signif.dot$DOT_NB)){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 21\n\n============\n\n")) +stop(tempo.cat) +} +if(any(data2.non.signif.dot$DOT_NB %in% data2.incon.dot$DOT_NB)){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 22\n\n============\n\n")) +stop(tempo.cat) +} +if(any(data2.incon.dot$DOT_NB %in% data2.non.signif.dot$DOT_NB)){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 23\n\n============\n\n")) +stop(tempo.cat) +} +if(any(data2.unknown.dot$DOT_NB %in% data2.incon.dot$DOT_NB)){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 24\n\n============\n\n")) +stop(tempo.cat) +} +if(any(data2.incon.dot$DOT_NB %in% data2.unknown.dot$DOT_NB)){ +tempo.cat <- (paste0("\n\n============\n\nERROR IN ", function.name, ": CODE INCONSISTENCY 25\n\n============\n\n")) +stop(tempo.cat) +} +} +# end verif +# plot +# recovering the axes data whatever plot or not +if(is.null(data2)){ +axes <- fun_gg_scatter(data1 = list(data1), x = list(x1), y = list(y1), categ = list(NULL), color = list(fun_gg_palette(2)[2]), geom = list("geom_point"), alpha = list(0.5), xlim = x.range.plot, ylim = y.range.plot, raster = raster, plot = FALSE, return = TRUE)$axes +}else{ +axes <- fun_gg_scatter(data1 = list(data1, data2), x = list(x1, x2), y = list(y1, y2), categ = list(NULL, NULL), color = list(fun_gg_palette(2)[2], fun_gg_palette(2)[1]), geom = list("geom_point", "geom_point"), alpha = list(0.5, 0.5), xlim = x.range.plot, ylim = y.range.plot, raster = raster, plot = FALSE, return = TRUE)$axes +} +# end recovering the axes data whatever plot or not +if(plot == TRUE){ +# add a categ for plot legend +tempo.df.name <- c("data1", "data1.signif.dot", "data1.incon.dot", "data2", "data2.signif.dot", "data2.unknown.dot", "data2.incon.dot") +tempo.class.name <- c("data1", "data1", "data1", "data2", "data2", "data2", "data2") +for(i2 in 1:length(tempo.df.name)){ +if( ! is.null(get(tempo.df.name[i2]))){ +assign(tempo.df.name[i2], data.frame(get(tempo.df.name[i2]), kind = tempo.class.name[i2])) +} +} +# end add a categ for plot legend +if(( ! is.null(x.range.split)) & ( ! is.null(y.range.split))){ +if(graph.in.file == FALSE){ +fun_open(pdf.disp = FALSE) +} +tempo.graph <- fun_gg_scatter(data1 = list(data1, hframe, vframe), x = list(x1, "x", "x"), y = list(y1, "y", "y"), categ = list("kind", "kind", "kind"), legend.name = list("DATASET", "HORIZ FRAME" , "VERT FRAME"), color = list(fun_gg_palette(2)[2], rep(hsv(h = c(0.1, 0.15), v = c(0.75, 1)), 2), rep(hsv(h = c(0.5, 0.6), v = c(0.9, 1)), 2)), geom = list("geom_point", "geom_path", "geom_path"), alpha = list(0.5, 0.5, 0.5), title = "DATA1", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) +if( ! is.null(tempo.graph$warnings)){ +warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) +} +if( ! is.null(data1.signif.dot)){ +if(graph.in.file == FALSE){ +fun_open(pdf.disp = FALSE) +} +tempo.graph <- fun_gg_scatter(data1 = list(data1, hframe, vframe, data1.signif.dot), x = list(x1, "x", "x", x1), y = list(y1, "y", "y", y1), categ = list("kind", "kind", "kind", "kind"), legend.name = list("DATASET", "HORIZ FRAME" , "VERT FRAME", "SIGNIF DOTS"), color = list(fun_gg_palette(2)[2], rep(hsv(h = c(0.1, 0.15), v = c(0.75, 1)), 2), rep(hsv(h = c(0.5, 0.6), v = c(0.9, 1)), 2), "black"), geom = list("geom_point", "geom_path", "geom_path", "geom_point"), alpha = list(0.5, 0.5, 0.5, 0.5), title = "DATA1 + DATA1 SIGNIFICANT DOTS", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) +if( ! is.null(tempo.graph$warnings)){ +warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) +} +}else{ +if(graph.in.file == FALSE){ +fun_open(pdf.disp = FALSE) +} +fun_gg_empty_graph(text = "NO PLOT\nBECAUSE\nNO DATA1 DOTS\nOUTSIDE THE FRAMES", text.size = 8, title = "DATA1 + DATA1 SIGNIFICANT DOTS") +} +if( ! is.null(data1.incon.dot)){ +if(graph.in.file == FALSE){ +fun_open(pdf.disp = FALSE) +} +tempo.graph <- fun_gg_scatter(data1 = list(data1, hframe, vframe, data1.incon.dot), x = list(x1, "x", "x", x1), y = list(y1, "y", "y", y1), categ = list("kind", "kind", "kind", "kind"), legend.name = list("DATASET", "HORIZ FRAME" , "VERT FRAME", "INCONSISTENT DOTS"), color = list(fun_gg_palette(2)[2], rep(hsv(h = c(0.1, 0.15), v = c(0.75, 1)), 2), rep(hsv(h = c(0.5, 0.6), v = c(0.9, 1)), 2), fun_gg_palette(7)[6]), geom = list("geom_point", "geom_path", "geom_path", "geom_point"), alpha = list(0.5, 0.5, 0.5, 0.5), title = "DATA1 + DATA1 INCONSISTENT DOTS", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) +if( ! is.null(tempo.graph$warnings)){ +warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) +} +}else{ +if(graph.in.file == FALSE){ +fun_open(pdf.disp = FALSE) +} +fun_gg_empty_graph(text = "NO PLOT\nBECAUSE\nNO DATA1\nINCONSISTENT DOTS", text.size = 8, title = "DATA1 + DATA1 INCONSISTENT DOTS") +} +if( ! is.null(data2)){ +if(graph.in.file == FALSE){ +fun_open(pdf.disp = FALSE) +} +tempo.graph <- fun_gg_scatter(data1 = list(data1, data2, hframe , vframe), x = list(x1, x2, "x", "x"), y = list(y1, y2, "y", "y"), categ = list("kind", "kind", "kind", "kind"), legend.name = list("DATASET", "DATASET", "HORIZ FRAME" , "VERT FRAME"), color = list(fun_gg_palette(2)[2], fun_gg_palette(2)[1], rep(hsv(h = c(0.1, 0.15), v = c(0.75, 1)), 2), rep(hsv(h = c(0.5, 0.6), v = c(0.9, 1)), 2)), geom = list("geom_point", "geom_point", "geom_path", "geom_path"), alpha = list(0.5, 0.5, 0.5, 0.5), title = "DATA1 + DATA2", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) +if( ! is.null(tempo.graph$warnings)){ +warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) +} +if( ! is.null(data2.signif.dot)){ +if(graph.in.file == FALSE){ +fun_open(pdf.disp = FALSE) +} +tempo.graph <- fun_gg_scatter(data1 = list(data1, data2, data2.signif.dot, hframe , vframe), x = list(x1, x2, x2, "x", "x"), y = list(y1, y2, y2, "y", "y"), categ = list("kind", "kind", "kind", "kind", "kind"), legend.name = list("DATASET", "DATASET", "SIGNIF DOTS", "HORIZ FRAME" , "VERT FRAME"), color = list(fun_gg_palette(2)[2], fun_gg_palette(2)[1], "black", rep(hsv(h = c(0.1, 0.15), v = c(0.75, 1)), 2), rep(hsv(h = c(0.5, 0.6), v = c(0.9, 1)), 2)), geom = list("geom_point", "geom_point", "geom_point", "geom_path", "geom_path"), alpha = list(0.5, 0.5, 0.5, 0.5, 0.5), title = "DATA1 + DATA2 + DATA2 SIGNIFICANT DOTS", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) +if( ! is.null(tempo.graph$warnings)){ +warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) +} +}else{ +if(graph.in.file == FALSE){ +fun_open(pdf.disp = FALSE) +} +fun_gg_empty_graph(text = "NO PLOT\nBECAUSE\nNO DATA2 DOTS\nOUTSIDE THE FRAMES", text.size = 8, title = "DATA1 + DATA2 + DATA2 SIGNIFICANT DOTS") +} +if( ! is.null(data2.incon.dot)){ +if(graph.in.file == FALSE){ +fun_open(pdf.disp = FALSE) +} +tempo.graph <- fun_gg_scatter(data1 = list(data1, data2, data2.incon.dot, hframe , vframe), x = list(x1, x2, x2, "x", "x"), y = list(y1, y2, y2, "y", "y"), categ = list("kind", "kind", "kind", "kind", "kind"), legend.name = list("DATASET", "DATASET", "INCONSISTENT DOTS", "HORIZ FRAME" , "VERT FRAME"), color = list(fun_gg_palette(2)[2], fun_gg_palette(2)[1], fun_gg_palette(7)[6], rep(hsv(h = c(0.1, 0.15), v = c(0.75, 1)), 2), rep(hsv(h = c(0.5, 0.6), v = c(0.9, 1)), 2)), geom = list("geom_point", "geom_point", "geom_point", "geom_path", "geom_path"), alpha = list(0.5, 0.5, 0.5, 0.5, 0.5), title = "DATA1 + DATA2 + DATA2 INCONSISTENT DOTS", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) +if( ! is.null(tempo.graph$warnings)){ +warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) +} +}else{ +if(graph.in.file == FALSE){ +fun_open(pdf.disp = FALSE) +} +fun_gg_empty_graph(text = "NO PLOT\nBECAUSE\nNO DATA2\nINCONSISTENT DOTS", text.size = 8, title = "DATA2 + DATA2 INCONSISTENT DOTS") +} +if( ! is.null(data2.unknown.dot)){ +if(graph.in.file == FALSE){ +fun_open(pdf.disp = FALSE) +} +tempo.graph <- fun_gg_scatter(data1 = list(data1, data2, data2.unknown.dot, hframe , vframe), x = list(x1, x2, x2, "x", "x"), y = list(y1, y2, y2, "y", "y"), categ = list("kind", "kind", "kind", "kind", "kind"), legend.name = list("DATASET", "DATASET", "UNKNOWN DOTS", "HORIZ FRAME" , "VERT FRAME"), color = list(fun_gg_palette(2)[2], fun_gg_palette(2)[1], fun_gg_palette(7)[5], rep(hsv(h = c(0.1, 0.15), v = c(0.75, 1)), 2), rep(hsv(h = c(0.5, 0.6), v = c(0.9, 1)), 2)), geom = list("geom_point", "geom_point", "geom_point", "geom_path", "geom_path"), alpha = list(0.5, 0.5, 0.5, 0.5, 0.5), title = "DATA1 + DATA2 + DATA2 UNKNOWN DOTS", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) + +if( ! is.null(tempo.graph$warnings)){ +warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) +} +}else{ +if(graph.in.file == FALSE){ +fun_open(pdf.disp = FALSE) +} +fun_gg_empty_graph(text = "NO PLOT\nBECAUSE\nNO DATA2\nUNKNOWN DOTS", text.size = 12, title = "DATA2 + DATA2 UNKNOWN DOTS") +} +} +}else if(( ! is.null(x.range.split)) & is.null(y.range.split)){ +if(graph.in.file == FALSE){ +fun_open(pdf.disp = FALSE) +} +tempo.graph <- fun_gg_scatter(data1 = list(data1, hframe), x = list(x1, "x"), y = list(y1, "y"), categ = list("kind", "kind"), legend.name = list("DATASET", "HORIZ FRAME"), color = list(fun_gg_palette(2)[2], rep(hsv(h = c(0.1, 0.15), v = c(0.75, 1)), 2)), geom = list("geom_point", "geom_path"), alpha = list(0.5, 0.5), title = "DATA1", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) +if( ! is.null(tempo.graph$warnings)){ +warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) +} +if( ! is.null(data1.signif.dot)){ +if(graph.in.file == FALSE){ +fun_open(pdf.disp = FALSE) +} +tempo.graph <- fun_gg_scatter(data1 = list(data1, hframe, data1.signif.dot), x = list(x1, "x", x1), y = list(y1, "y", y1), categ = list("kind", "kind", "kind"), legend.name = list("DATASET", "HORIZ FRAME", "SIGNIF DOTS"), color = list(fun_gg_palette(2)[2], rep(hsv(h = c(0.1, 0.15), v = c(0.75, 1)), 2), "black"), geom = list("geom_point", "geom_path", "geom_point"), alpha = list(0.5, 0.5, 0.5), title = "DATA1 + DATA1 SIGNIFICANT DOTS", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) +if( ! is.null(tempo.graph$warnings)){ +warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) +} +}else{ +if(graph.in.file == FALSE){ +fun_open(pdf.disp = FALSE) +} +fun_gg_empty_graph(text = "NO PLOT\nBECAUSE\nNO DATA1 DOTS\nOUTSIDE THE FRAMES", text.size = 8, title = "DATA1 + DATA1 SIGNIFICANT DOTS") +} +if( ! is.null(data1.incon.dot)){ +if(graph.in.file == FALSE){ +fun_open(pdf.disp = FALSE) +} +tempo.graph <- fun_gg_scatter(data1 = list(data1, hframe, data1.incon.dot), x = list(x1, "x", x1), y = list(y1, "y", y1), categ = list("kind", "kind", "kind"), legend.name = list("DATASET", "HORIZ FRAME", "INCONSISTENT DOTS"), color = list(fun_gg_palette(2)[2], rep(hsv(h = c(0.1, 0.15), v = c(0.75, 1)), 2), fun_gg_palette(7)[6]), geom = list("geom_point", "geom_path", "geom_point"), alpha = list(0.5, 0.5, 0.5), title = "DATA1 + DATA1 INCONSISTENT DOTS", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) +if( ! is.null(tempo.graph$warnings)){ +warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) +} +}else{ +if(graph.in.file == FALSE){ +fun_open(pdf.disp = FALSE) +} +fun_gg_empty_graph(text = "NO PLOT\nBECAUSE\nNO DATA1\nINCONSISTENT DOTS", text.size = 8, title = "DATA1 + DATA1 INCONSISTENT DOTS") +} +if( ! is.null(data2)){ +if(graph.in.file == FALSE){ +fun_open(pdf.disp = FALSE) +} +tempo.graph <- fun_gg_scatter(data1 = list(data1, data2, hframe), x = list(x1, x2, "x"), y = list(y1, y2, "y"), categ = list("kind", "kind", "kind"), legend.name = list("DATASET", "DATASET", "HORIZ FRAME"), color = list(fun_gg_palette(2)[2], fun_gg_palette(2)[1], rep(hsv(h = c(0.1, 0.15), v = c(0.75, 1)), 2)), geom = list("geom_point", "geom_point", "geom_path"), alpha = list(0.5, 0.5, 0.5), title = "DATA1 + DATA2", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) +if( ! is.null(tempo.graph$warnings)){ +warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) +} +if( ! is.null(data2.signif.dot)){ +if(graph.in.file == FALSE){ +fun_open(pdf.disp = FALSE) +} +tempo.graph <- fun_gg_scatter(data1 = list(data1, data2, data2.signif.dot, hframe), x = list(x1, x2, x2, "x"), y = list(y1, y2, y2, "y"), categ = list("kind", "kind", "kind", "kind"), legend.name = list("DATASET", "DATASET", "SIGNIF DOTS", "HORIZ FRAME"), color = list(fun_gg_palette(2)[2], fun_gg_palette(2)[1], "black", rep(hsv(h = c(0.1, 0.15), v = c(0.75, 1)), 2)), geom = list("geom_point", "geom_point", "geom_point", "geom_path"), alpha = list(0.5, 0.5, 0.5, 0.5), title = "DATA1 + DATA2 + DATA2 SIGNIFICANT DOTS", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) +if( ! is.null(tempo.graph$warnings)){ +warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) +} +}else{ +if(graph.in.file == FALSE){ +fun_open(pdf.disp = FALSE) +} +fun_gg_empty_graph(text = "NO PLOT\nBECAUSE\nNO DATA2 DOTS\nOUTSIDE THE FRAMES", text.size = 8, title = "DATA1 + DATA2 + DATA2 SIGNIFICANT DOTS") +} +if( ! is.null(data2.incon.dot)){ +if(graph.in.file == FALSE){ +fun_open(pdf.disp = FALSE) +} +tempo.graph <- fun_gg_scatter(data1 = list(data1, data2, data2.incon.dot, hframe), x = list(x1, x2, x2, "x"), y = list(y1, y2, y2, "y"), categ = list("kind", "kind", "kind", "kind"), legend.name = list("DATASET", "DATASET", "INCONSISTENT DOTS", "HORIZ FRAME"), color = list(fun_gg_palette(2)[2], fun_gg_palette(2)[1], fun_gg_palette(7)[6], rep(hsv(h = c(0.1, 0.15), v = c(0.75, 1)), 2)), geom = list("geom_point", "geom_point", "geom_point", "geom_path"), alpha = list(0.5, 0.5, 0.5, 0.5), title = "DATA1 + DATA2 + DATA2 INCONSISTENT DOTS", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) +if( ! is.null(tempo.graph$warnings)){ +warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) +} +}else{ +if(graph.in.file == FALSE){ +fun_open(pdf.disp = FALSE) +} +fun_gg_empty_graph(text = "NO PLOT\nBECAUSE\nNO DATA2\nINCONSISTENT DOTS", text.size = 8, title = "DATA2 + DATA2 INCONSISTENT DOTS") +} +if( ! is.null(data2.unknown.dot)){ +if(graph.in.file == FALSE){ +fun_open(pdf.disp = FALSE) +} +tempo.graph <- fun_gg_scatter(data1 = list(data1, data2, data2.unknown.dot, hframe), x = list(x1, x2, x2, "x"), y = list(y1, y2, y2, "y"), categ = list("kind", "kind", "kind", "kind"), legend.name = list("DATASET", "DATASET", "UNKNOWN DOTS", "HORIZ FRAME"), color = list(fun_gg_palette(2)[2], fun_gg_palette(2)[1], fun_gg_palette(7)[5], rep(hsv(h = c(0.1, 0.15), v = c(0.75, 1)), 2)), geom = list("geom_point", "geom_point", "geom_point", "geom_path"), alpha = list(0.5, 0.5, 0.5, 0.5), title = "DATA1 + DATA2 + DATA2 UNKNOWN DOTS", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) +if( ! is.null(tempo.graph$warnings)){ +warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) +} +}else{ +if(graph.in.file == FALSE){ +fun_open(pdf.disp = FALSE) +} +fun_gg_empty_graph(text = "NO PLOT\nBECAUSE\nNO DATA2\nUNKNOWN DOTS", text.size = 8, title = "DATA2 + DATA2 UNKNOWN DOTS") +} +} +}else if(is.null(x.range.split) & ( ! is.null(y.range.split))){ +if(graph.in.file == FALSE){ +fun_open(pdf.disp = FALSE) +} +tempo.graph <- fun_gg_scatter(data1 = list(data1, vframe), x = list(x1, "x"), y = list(y1, "y"), categ = list("kind", "kind"), legend.name = list("DATASET", "VERT FRAME"), color = list(fun_gg_palette(2)[2], rep(hsv(h = c(0.5, 0.6), v = c(0.9, 1)), 2)), geom = list("geom_point", "geom_path"), alpha = list(0.5, 0.5), title = "DATA1", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) +if( ! is.null(tempo.graph$warnings)){ +warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) +} +if( ! is.null(data1.signif.dot)){ +if(graph.in.file == FALSE){ +fun_open(pdf.disp = FALSE) +} +tempo.graph <- fun_gg_scatter(data1 = list(data1, vframe, data1.signif.dot), x = list(x1, "x", x1), y = list(y1, "y", y1), categ = list("kind", "kind", "kind"), legend.name = list("DATASET", "VERT FRAME", "SIGNIF DOTS"), color = list(fun_gg_palette(2)[2], rep(hsv(h = c(0.5, 0.6), v = c(0.9, 1)), 2), "black"), geom = list("geom_point", "geom_path", "geom_point"), alpha = list(0.5, 0.5, 0.5), title = "DATA1 + DATA1 SIGNIFICANT DOTS", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) +if( ! is.null(tempo.graph$warnings)){ +warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) +} +}else{ +if(graph.in.file == FALSE){ +fun_open(pdf.disp = FALSE) +} +fun_gg_empty_graph(text = "NO PLOT\nBECAUSE\nNO DATA1 DOTS\nOUTSIDE THE FRAMES", text.size = 8, title = "DATA1 + DATA1 SIGNIFICANT DOTS") +} +if( ! is.null(data1.incon.dot)){ +if(graph.in.file == FALSE){ +fun_open(pdf.disp = FALSE) +} +tempo.graph <- fun_gg_scatter(data1 = list(data1, vframe, data1.incon.dot), x = list(x1, "x", x1), y = list(y1, "y", y1), categ = list("kind", "kind", "kind"), legend.name = list("DATASET", "VERT FRAME", "INCONSISTENT DOTS"), color = list(fun_gg_palette(2)[2], rep(hsv(h = c(0.5, 0.6), v = c(0.9, 1)), 2), fun_gg_palette(7)[6]), geom = list("geom_point", "geom_path", "geom_point"), alpha = list(0.5, 0.5, 0.5), title = "DATA1 + DATA1 INCONSISTENT DOTS", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) +if( ! is.null(tempo.graph$warnings)){ +warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) +} +}else{ +if(graph.in.file == FALSE){ +fun_open(pdf.disp = FALSE) +} +fun_gg_empty_graph(text = "NO PLOT\nBECAUSE\nNO DATA1\nINCONSISTENT DOTS", text.size = 8, title = "DATA1 + DATA1 INCONSISTENT DOTS") +} +if( ! is.null(data2)){ +if(graph.in.file == FALSE){ +fun_open(pdf.disp = FALSE) +} +tempo.graph <- fun_gg_scatter(data1 = list(data1, data2, vframe), x = list(x1, x2, "x"), y = list(y1, y2, "y"), categ = list("kind", "kind", "kind"), legend.name = list("DATASET", "DATASET", "VERT FRAME"), color = list(fun_gg_palette(2)[2], fun_gg_palette(2)[1], rep(hsv(h = c(0.5, 0.6), v = c(0.9, 1)), 2)), geom = list("geom_point", "geom_point", "geom_path"), alpha = list(0.5, 0.5, 0.5), title = "DATA1 + DATA2", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) +if( ! is.null(tempo.graph$warnings)){ +warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) +} +if( ! is.null(data2.signif.dot)){ +if(graph.in.file == FALSE){ +fun_open(pdf.disp = FALSE) +} +tempo.graph <- fun_gg_scatter(data1 = list(data1, data2, data2.signif.dot, vframe), x = list(x1, x2, x2, "x"), y = list(y1, y2, y2, "y"), categ = list("kind", "kind", "kind", "kind"), legend.name = list("DATASET", "DATASET", "SIGNIF DOTS", "VERT FRAME"), color = list(fun_gg_palette(2)[2], fun_gg_palette(2)[1], "black", rep(hsv(h = c(0.5, 0.6), v = c(0.9, 1)), 2)), geom = list("geom_point", "geom_point", "geom_point", "geom_path"), alpha = list(0.5, 0.5, 0.5, 0.5), title = "DATA1 + DATA2 + DATA2 SIGNIFICANT DOTS", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) +if( ! is.null(tempo.graph$warnings)){ +warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) +} +}else{ +if(graph.in.file == FALSE){ +fun_open(pdf.disp = FALSE) +} +fun_gg_empty_graph(text = "NO PLOT\nBECAUSE\nNO DATA2 DOTS\nOUTSIDE THE FRAMES", text.size = 8, title = "DATA1 + DATA2 + DATA2 SIGNIFICANT DOTS") +} +if( ! is.null(data2.incon.dot)){ +if(graph.in.file == FALSE){ +fun_open(pdf.disp = FALSE) +} +tempo.graph <- fun_gg_scatter(data1 = list(data1, data2, data2.incon.dot, vframe), x = list(x1, x2, x2, "x"), y = list(y1, y2, y2, "y"), categ = list("kind", "kind", "kind", "kind"), legend.name = list("DATASET", "DATASET", "INCONSISTENT DOTS", "VERT FRAME"), color = list(fun_gg_palette(2)[2], fun_gg_palette(2)[1], fun_gg_palette(7)[6], rep(hsv(h = c(0.5, 0.6), v = c(0.9, 1)), 2)), geom = list("geom_point", "geom_point", "geom_point", "geom_path"), alpha = list(0.5, 0.5, 0.5, 0.5), title = "DATA1 + DATA2 + DATA2 INCONSISTENT DOTS", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) +if( ! is.null(tempo.graph$warnings)){ +warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) +} +}else{ +if(graph.in.file == FALSE){ +fun_open(pdf.disp = FALSE) +} +fun_gg_empty_graph(text = "NO PLOT\nBECAUSE\nNO DATA2\nINCONSISTENT DOTS", text.size = 8, title = "DATA2 + DATA2 INCONSISTENT DOTS") +} +if( ! is.null(data2.unknown.dot)){ +if(graph.in.file == FALSE){ +fun_open(pdf.disp = FALSE) +} +tempo.graph <- fun_gg_scatter(data1 = list(data1, data2, data2.unknown.dot, vframe), x = list(x1, x2, x2, "x"), y = list(y1, y2, y2, "y"), categ = list("kind", "kind", "kind", "kind"), legend.name = list("DATASET", "DATASET", "UNKNOWN DOTS", "VERT FRAME"), color = list(fun_gg_palette(2)[2], fun_gg_palette(2)[1], fun_gg_palette(7)[5], rep(hsv(h = c(0.5, 0.6), v = c(0.9, 1)), 2)), geom = list("geom_point", "geom_point", "geom_point", "geom_path"), alpha = list(0.5, 0.5, 0.5, 0.5), title = "DATA1 + DATA2 + DATA2 UNKNOWN DOTS", xlim = x.range.plot, ylim = y.range.plot, raster = raster, return = TRUE) +if( ! is.null(tempo.graph$warnings)){ +warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) +} +}else{ +if(graph.in.file == FALSE){ +fun_open(pdf.disp = FALSE) +} +fun_gg_empty_graph(text = "NO PLOT\nBECAUSE\nNO DATA2\nUNKNOWN DOTS", text.size = 8, title = "DATA2 + DATA2 UNKNOWN DOTS") +} +} +} +} +# end plot +if(warn.print == TRUE & ! is.null(warning)){ +warning(warning) +} +tempo.list <- list(data1.removed.row.nb = data1.removed.row.nb, data1.removed.rows = data1.removed.rows, data2.removed.row.nb = data2.removed.row.nb, data2.removed.rows = data2.removed.rows, hframe = hframe, vframe = vframe, data1.signif.dot = data1.signif.dot, data1.non.signif.dot = data1.non.signif.dot, data1.inconsistent.dot = data1.incon.dot, data2.signif.dot = data2.signif.dot, data2.non.signif.dot = data2.non.signif.dot, data2.unknown.dot = data2.unknown.dot, data2.inconsistent.dot = data2.incon.dot, axes = axes, warnings = warning) +return(tempo.list) +} + + +################ Import + + +######## fun_pack() #### check if R packages are present and import into the working environment + + +# Check OK: clear to go Apollo +fun_pack <- function(req.package, load = FALSE, path.lib = NULL){ +# AIM +# check if the specified R packages are present in the computer and import them into the working environment +# ARGUMENTS +# req.package: character vector of package names to import +# req.package: logical. Load the package into the environement (using library())? +# path.lib: optional character vector specifying the absolute pathways of the directories containing some of the listed packages +# REQUIRED PACKAGES +# none +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_check() +# RETURN +# nothing +# EXAMPLES +# fun_pack(req.package = "nopackage") +# fun_pack(req.package = "ggplot2") +# fun_pack(req.package = "ggplot2", path.lib = "blablabla") +# DEBUGGING +# req.package = "ggplot2" ; path.lib = "C:/Program Files/R/R-3.5.1/library" +# req.package = "serpentine" ; path.lib = "C:/users/gael/appdata/roaming/python/python36/site-packages" +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_check(data = req.package, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = load, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(path.lib)){ +tempo <- fun_check(data = path.lib, class = "character", fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! all(dir.exists(path.lib))){ +cat(paste0("\n\n============\n\nERROR IN ", function.name, ": \nDIRECTORY PATH INDICATED IN THE path.lib PARAMETER DOES NOT EXISTS: ", path.lib, "\n\n============\n\n")) +arg.check <- c(arg.check, TRUE) +} +} +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_check() +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() +# end argument checking +# main code +if(is.null(path.lib)){ +path.lib <- .libPaths() # .libPaths(new = path.lib) # or .libPaths(new = c(.libPaths(), path.lib)) +}else{ +.libPaths(new = sub(x = path.lib, pattern = "/$|\\\\$", replacement = "")) # .libPaths(new = ) add path to default path. BEWARE: .libPaths() does not support / at the end of a submitted path. Thus check and replace last / or \\ in path +} +for(i0 in 1:length(req.package)){ +if( ! req.package[i0] %in% rownames(installed.packages(lib.loc = path.lib))){ +stop(paste0("\n\n================\n\nERROR IN ", function.name, ": PACKAGE ", req.package[i0], " MUST BE INSTALLED IN:\n", paste(path.lib, collapse = "\n"), "\n\n================\n\n")) +}else{ +if(load == TRUE){ +suppressWarnings(suppressPackageStartupMessages(library(req.package[i0], lib.loc = path.lib, quietly = TRUE, character.only = TRUE))) +} +} +} +} + + +######## fun_python_pack() #### check if python packages are present + + +# Check OK: clear to go Apollo +fun_python_pack <- function(req.package, path.lib = NULL, R.path.lib = NULL){ +# AIM +# check if the specified python packages are present in the computer (no import) +# ARGUMENTS +# req.package: character vector of package names to import +# path.lib: optional character vector specifying the absolute pathways of the directories containing some of the listed packages in the req.package argument +# R.path.lib: absolute path of the reticulate packages, if not in the default folders +# REQUIRED PACKAGES +# reticulate +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_check() +# fun_pack() +# RETURN +# nothing +# EXAMPLES +# example of error message +# fun_python_pack(req.package = "nopackage") +# example without error message (require the installation of the python serpentine package from https://github.com/koszullab/serpentine +# fun_python_pack(req.package = "serpentine", path.lib = "c:/programdata/anaconda3/lib/site-packages/") +# another example of error message +# fun_python_pack(req.package = "serpentine", path.lib = "blablabla") +# DEBUGGING +# req.package = "serpentine" ; path.lib = "c:/programdata/anaconda3/lib/site-packages/" ; R.path.lib = NULL +# req.package = "bad" ; path.lib = NULL ; R.path.lib = NULL +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_pack", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_pack() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_check(data = req.package, class = "character", fun.name = function.name) ; eval(ee) +if( ! is.null(path.lib)){ +tempo <- fun_check(data = path.lib, class = "character", fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! all(dir.exists(path.lib))){ +cat(paste0("\n\n============\n\nERROR IN ", function.name, ": \nDIRECTORY PATH INDICATED IN THE path.lib PARAMETER DOES NOT EXISTS: ", path.lib, "\n\n============\n\n")) +arg.check <- c(arg.check, TRUE) +} +} +if( ! is.null(R.path.lib)){ +tempo <- fun_check(data = R.path.lib, class = "character", fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! all(dir.exists(R.path.lib))){ +cat(paste0("\n\n============\n\nERROR IN ", function.name, ": \nDIRECTORY PATH INDICATED IN THE R.path.lib PARAMETER DOES NOT EXISTS: ", R.path.lib, "\n\n============\n\n")) +arg.check <- c(arg.check, TRUE) +} +} +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_check() +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() +# end argument checking +# package checking +fun_pack(req.package = "reticulate", path.lib = R.path.lib) +# end package checking +# main code +if(is.null(path.lib)){ +path.lib <- reticulate::py_run_string(" +import sys ; +path_lib = sys.path +") # python string +path.lib <- path.lib$path_lib +} +for(i0 in 1:length(req.package)){ +tempo.try <- vector("list", length = length(path.lib)) +for(i1 in 1:length(path.lib)){ +tempo.try[[i1]] <- suppressWarnings(try(reticulate::import_from_path(req.package[i0], path = path.lib[i1]), silent = TRUE)) +tempo.try[[i1]] <- suppressWarnings(try(reticulate::import_from_path(req.package[i0], path = path.lib[i1]), silent = TRUE)) # done twice to avoid the error message about flushing present the first time but not the second time. see https://stackoverflow.com/questions/57357001/reticulate-1-13-error-in-sysstdoutflush-attempt-to-apply-non-function +} +if(all(sapply(tempo.try, FUN = grepl, pattern = "[Ee]rror"))){ +stop(paste0("\n\n================\n\nERROR IN ", function.name, ": PACKAGE ", req.package[i0], " MUST BE INSTALLED IN THE MENTIONNED DIRECTORY:\n", paste(path.lib, collapse = "\n"), "\n\n================\n\n")) +}else{ +# suppressWarnings(suppressPackageStartupMessages(assign(req.package[i0], reticulate::import(req.package[i0])))) # not required because try() already evaluates +} +} +} + + +################ Exporting results (text & tables) + + +######## fun_report() #### print string or data object into output file + + +# Check OK: clear to go Apollo +fun_report <- function(data = NULL, output ="results.txt", path = "C:/Users/Gael/Desktop", no.overwrite = TRUE, rownames.kept = FALSE, vector.cat = FALSE, noquote = TRUE, sep = 2){ +# AIM +# log file function: print a character string or a data object into a same output file +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_check() +# ARGUMENTS +# data: object to print in the output file. cannot be NULL +# output: name of the output file +# path: location of the output file +# no.overwrite: (logical) if output file already exists, defines if the printing is appended (default TRUE) or if the output file content is erased before printing (FALSE) +# rownames.kept: (logical) defines whether row names have to be removed or not in small tables (less than length.rows rows) +# vector.cat (logical). If TRUE print a vector of length > 1 using cat() instead of capture.output(). Otherwise (default FALSE) the opposite +# noquote: (logical). If TRUE no quote are present for the characters +# sep: number of separating lines after printed data (must be integer) +# RETURN +# nothing +# EXAMPLES +# fun_report() +# fun_report(data = 1:3, output = "results.txt", path = "C:/Users/Gael/Desktop", no.overwrite = TRUE, rownames.kept = FALSE, vector.cat = FALSE, noquote = FALSE, sep = 2) +# DEBUGGING +# data = 1:3 ; output = "results.txt" ; path = "C:/Users/Gael/Desktop" ; no.overwrite = TRUE ; rownames.kept = FALSE ; vector.cat = FALSE ; noquote = FALSE ; sep = 2 # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +# argument checking without fun_check() +if(is.null(data)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": data ARGUMENT CANNOT BE NULL\n\n================\n\n") +stop(tempo.cat) +} +# end argument checking without fun_check() +# argument checking with fun_check() +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_check(data = output, class = "character", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & output == ""){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": output ARGUMENT AS \"\" DOES NOT CORRESPOND TO A VALID FILE NAME\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +tempo <- fun_check(data = path, class = "character", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & dir.exists(path) == FALSE){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": path ARGUMENT DOES NOT CORRESPOND TO EXISTING DIRECTORY\n", paste(path, collapse = "\n"),"\n\n================\n\n") +cat(tempo.cat) +arg.check <- c(arg.check, TRUE) +} +tempo <- fun_check(data = no.overwrite, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = rownames.kept, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = vector.cat, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = noquote, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_check(data = sep, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_check() +} +# end argument checking with fun_check() +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() +# the 4 next lines are inactivated but kept because at a time, I might have a problem with data (solved with data = NULL). These 4 lines are just to know how to detect a missing argument. Important here because if data is not provided, print the code of the data function +# arg.user.list <- as.list(match.call(expand.dots=FALSE))[-1] # recover all the arguments provided by the function user (excluding the argument with defaults values not provided by the user. Thus, it is really the list indicated by the user) +# default.arg.list <- formals(fun = sys.function(sys.parent())) # list of all the arguments of the function with their default values (not the values of the user !). It seems that ls() as first line of the function provide the names of the arguments (empty, called, etc., or not) +# arg.without.default.value <- sapply(default.arg.list, is.symbol) & sapply(sapply(default.arg.list, as.character), identical, "") # logical to detect argument without default values (these are typeof "symbol" and class "name" and empty character +# if( ! all(names(default.arg.list)[arg.without.default.value] %in% names(arg.user.list))){ # test that the arguments with no null values are provided by the user +# tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": VALUE REQUIRED FOR THESE ARGUMENTS WITH NO DEFAULTS VALUES: ", paste(names(default.arg.list)[arg.without.default.value][ ! names(default.arg.list)[arg.without.default.value] %in% names(arg.user.list)], collapse = " "), "\n\n================\n\n") +#stop(tempo.cat) +# } +# end argument checking +# main code +if(all(class(data) %in% c("matrix", "data.frame", "table"))){ +if(rownames.kept == FALSE & all(class(data) == "data.frame") & nrow(data) != 0 & nrow(data) <= 4){ # for data frames with nrows <= 4 +rownames.output.tables <- "" +length.rows <- nrow(data) +for(i in 1:length.rows){ # replace the rownames of the first 4 rows by increasing number of spaces (because identical row names not allowed in data frames). This method cannot be extended to more rows as the printed data frame is shifted on the right because of "big empty rownames" +rownames.output.tables <- c(rownames.output.tables, paste0(rownames.output.tables[i]," ", collapse="")) +} +row.names(data) <- rownames.output.tables[1:length.rows] +}else if(rownames.kept == FALSE & all(class(data) %in% c("matrix", "table"))){ +rownames(data) <- rep("", nrow(data)) # identical row names allowed in matrices and tables +} +if(noquote == TRUE){ +capture.output(noquote(data), file=paste0(path, "/", output), append = no.overwrite) +}else{ +capture.output(data, file=paste0(path, "/", output), append = no.overwrite) +} +}else if(is.vector(data) & all(class(data) != "list") & (length(data) == 1 | vector.cat == TRUE)){ +if(noquote == TRUE){ +cat(noquote(data), file= paste0(path, "/", output), append = no.overwrite) +}else{ +cat(data, file= paste0(path, "/", output), append = no.overwrite) +} +}else{ # other (array, list, factor or vector with vector.cat = FALSE) +if(noquote == TRUE){ +capture.output(noquote(data), file=paste0(path, "/", output), append = no.overwrite) +}else{ +capture.output(data, file=paste0(path, "/", output), append = no.overwrite) +} +} +sep.final <- paste0(rep("\n", sep), collapse = "") +write(sep.final, file= paste0(path, "/", output), append = TRUE) # add a sep } diff --git a/cute_little_R_functions.docx b/cute_little_R_functions.docx index 47b55d52336562766d24363174e79d72332af420..eea4a0e7cad0e96f8fbaf8d34d84a5da80998a96 100644 GIT binary patch delta 631538 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%0D=`qGoqV-Trjd^JU;;83ZyD378R|tOI)50W!E*tu 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	Kg)K-iprWV9{jvake(J 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ΠcQCoxWAES8(jq?@b1virKR~od zw^WSs9sxc!q{qnckqu?MnOUgpu__qt^1NPduZS;M`V(nsT4VjaAj;~Jbl$KWU@#M9 z*WB)*`$gd$I2m*}D)y%?GQbI6y7|XJ5$CSbUP;xX#UuLcUu7AK<>T2+tg_zOODen# z$TrIE_cDI0*-~g(_9Zs6=OoVwOE>hdzpsf^s<GA8XfCWy{{tkcL=VXFPzTbPgyF_| zdy`#efG6gJn8p8vB<Y-afWXfX)j#Vy;qm{g-@l+E_OiUL`-lG;UE&fqIvaaifWM~J z2O?KVTnNrwGH8VrLQo!aP`$UZDs0!p4`vV)Wj>y%YEeB&W&4oBt3WZbg02&iiaEYC z_uheuAj}xx6Fqi|_jvPe60jMF>5}C^iX~g`w|RjGn14SNmwh03VPZDN+vMgf=SVY} z^AKoQkKdnU4k`OtrE(p2)wLfyk?B0rLQ`h4UV)tq(u#mulsG%BS8Q2Vuume}*P72~ z=Eg^COBr!zzSqN84>|1q=<@y9*kv{OI)4$z3-}K3n05~ze5`-%XGZ`8`58{X%ABEH z2iVbkiyc7}p#a)z@-jydnHDTdk@JHT2)=oyj3D;Sp?#)?>ZFR_yNUhUSEIcp(D{Js zF_Qhd_U)ZY;iJfPXTXNU{0j?y=rY(11fV58R}_|*q)-;REHoZ$&4N$+<tcGS{0wFT z<Y2@uMuZHptt!-|s{Lz6U7waj1w0LYgzb^ZZC>n%c?jsSIS$O@-F?;vM@TqO0EI3# zVfpdK{1sK->v!vkor1v-1^b=3+$_FT?H)FLr<sZf<5iPMtR%N*Q=k-tQ!;baI$&PP zA=K!1Xros1zYApFIHAG!L0ff}AR&lp3XYdQ3rZ&JNngr15JsgiWDOepA`=G8%S97u zzl4nfky267aBR6~J5n|rdYC|KNB_XL7LKpKE3|tS+Qs$q$+I1V{4putOj!gzXHa6w zvQ^=8m4(nQ=p1X2MT1LIPXCZHUv2UJTnh3sbZmKz=xOZ^Q1%6_KbJE8X$t>}60OMP zv(LBY7xVAWyHX~BX5UpI$$PoFQO+@iI+ZI8@Y$^iK2EMcp}S0NAQCyX6>O9e<N;Jh z6UWG|ANeNgw0V-%M0DRFPpH2!`#ooJ2%Q8?F)hgE`s}08b?OX!J%Rb$nCZ*iu+fE^ zNzh!x=%R)z()gfl(cPd?V+g*k=4YHl>;z!pq?AEaee|I_h6Z*l4#DvW^jHq|O>5Nv zfjiZKesAkkVb8H8F_`FK22bL-Q~%(r1;O9_-`++g>IK{B%=KtCVEUNPsqeF?Ygw(J z!QW9XO-bQm<Y6zVdj!evZj2*WJ~18rJKP_4Ofw03h}ZgByr{8%OsU-=6`RR3#J?wG zF!TQMwwZ5aLfO2d5_$YLJ_;vYAk__^HvhZ;8DC*04s=(g?h^h7ioZyW=!mmmgQP0L zXm^-4PGr_`|7C6W>Du{R`s5+$NmP^y1ZC}Y1{<{`3#@4apM8U8=XhAqSk8s`DRJ({ zp#$r3bYKe2LPEI4)n?CJlV__pqg0#CWXdT=n`J{tWfRQ>?*@e7PJ{%&3?x#wpiNa4 zYlv|r6Xu{{s+}l=blz(@x7p@&HB7jh9u|G5QV|N;{Ws9BzN?45GH0-8FOhInGe>A5 z*fZ&s?ft`=KKex!Tg=zg4Y8xc+{^1niA`V=Y;iZ(+xdJ;a}*r93#cMxYpniZ-{gcm z^Bka7);l_u<_9GW*M`PCOni(j4BDa0?Z+qM2V@2W==SgW8`p;h-~S%CwTX(eDP zv8u|bRY>Aov<ryssi!tMb`3H1R&UEc$TN^M4xDvlC1vzD=VdGK${^sVT8OK747KfM z@IT0*-6p5<d7F$4Ojs)OcQe08p)eH`sLpF@Z^`hAo4|O!ek#pCCS`0gSk+E9IJMoK z6LSa3#Gkgok(VU&jci-mA0f+H%}dUo#Pln&wp%Y9MaDJ-(j>w0=ak-_3Cq2vWu43M znn{jD!F-lst$wdi96vnnn-RcFM2YmSy_{j%uN;JU2NC8rjoawCOZVfwPh)r^&9Yb* zFpK^>X@EnJyMYXJeA`x4KVwa-oaNg4kc|6KW~8`Qfo*mBoLB0TGhT=38E{FvW&9GU zcBlnbgj-t@VaVzGjcZkFF>nZBIoMqdDRv&ZbHD}sr?0;8CvQ??KS5$2kq!Z4^9+7_ zAk?7KX5@6cJ@)c&d6qv!c|m}~9^EY1VTy3HW95N#k<bL-{Z+G>d@Y>%;CjV9y4(g% z%v;T0KOlMB((zr1)_YxbCKNsfjD@#g<ORm#J}`5rF6XZEC$jK;Opb{K`D+h+8s1j% zBYgRLVl2Gvuf-Cqj9*jxcXOZ6$XzG<BXP_~u)TLZ<S(EFKurpD2om)iZ`*V%xwxE> zI(OacG-$vgyvM@hV%|%_W`@3vk^ONz^0s&nFrc-u$$k0#lA0*_9R3}l^6G3EmA-6F z1N@0#d-5}v)-lXz|8r3N@-<!?g+oR74wM(RNa7W4f8VTOLdX$twCfk?$O@v-W*R>6 zeB03KPVloT-X-<Y&l(C){&${t?16$wvNzSmUj=x@IFrXbo4IG;TBPZ?Ht9}j-B2TV z!EV~iJWNNvzEHiOLMb>x6~d*+>Nlk`NQDxobNXOBm7luSOF~4wovGhzaL)Y9(lpu= zTMdbH-0jcIe(WC>tG1+W5&W5RSFAU)g~O+C87?ShV$&(B*hJ;8vQaub@losa=vaAm z{tQ$z5pR?54H$g<<aq`&@UZ}Q^Rj>wjORzUwE1;G&^R39<hs_)hi@U`<jH)51nnl$ z@Gga&V;q;!(4MbAJcV}#YaHk1X|8CpQ?7C#<|uTR96+}SO^wky!|GQ#0B|;Yf(hEU z4GU1{ko!@o#IQU3M9B9y^sRA5zAh*0PX|=h7;&PWpPt8VA!Sm(h28DEZDISYd?AvB ziNT*Uczh|GLPu`(_zN%qdPtMd2@2R#v%eVs&2%7dv1>W?wTkbWl~(;+Ba*9<a9b$j zbhO#wSC3gM#N5=%6d3Pv{nP%L8T`cBok}ZGQD~E+?>yWoOjS#egEYK*e&3HFt_Zx@ zm$H+5K>J`gVRX7^gkr6!saTs+mnHr=GOKD`BW5e!^f8eyN-@~zd^rqp9j#m-3d3QR zNzSZ$&t)gbv}LEE5LOvg#?b0s5fOdSCXULxd+&(M#WiqcD{m;YF8p`1_p#pbHP^w1 z;>6ScOAGAl9sgqE+5{`Q;DY-r3n36A-O7}zop@^@%nF01FYIFfH!EfP!hwwsMAnCW zy0o&amdCy1k+A+blKQ2fd>aNu4C*C-`@6!cFI>bh2}_Dzwe{eVRsJ%hd;3S09!B<N zx8ugd`*jP$AHn3OJ=~bE6?5E?cSU;JH={&79K4Jp<h0U_Uv5YQ9nrn!W7&Y{{1@Xf zE(9d%Vl0PAa~kJ=F(2#iF{)ls>?Da7&hL(Y-t8U)+x<C*Q-eDfw5mmRVt6-YJA^qT zy(<S<LXSHyo&rR7@-Ck8$>eX>w}(;idBk-#ejU}@Ry%%M<@#YMjk)G(wQ;H}k6dex z!{j2*k|*%9pMvjdYzhC4sk#Vo6Y^ShOn)DZimr<gab(_4xcI1lU>~<4*J=mEMa_%s zlKRQ6tcojW!O86P@DGhW@7G876uxQJwg&VfIIw1SzHD9`CkM6{CdUQ@zJzA4q!0AC zS!G=uX5Kj6g7TB$kUPKkFN^ipMD3*sCOD%Lvw5V@7D@Ei@w&-T_f7%Dgfq5Zh+Un~ zsNGOwdappDm54ABj!lqhRQ;v{WU{1cSASbOYuJR5p|gVhtadW!TMG$cGt|QOoAaD# zf)3K9Gr~u|H=ec4pH+BXNx`6x!0RtLl~sVTO0%zRjqf9Ii}Z5DQ7TcP(tl=C-SktU zT6pzjRx0rXn1f({oU{Y(2OSi~vWl-KF2x(-YzB;zsG*pw5oh?y!6UxNJF#{8kklBk zR*bMZgA7<V(5-)Dx58GS>GZ-F93$QSB1>2EsXql#8<u<<qYttf)Rwp5qF9u=={d?& z*@+Cjma;=8OkWvCJkpmk;gA=6AQPpjC6>tzGm>ran>jyn7ApfXh6wUIP#BpocE^m^ z(HB}^<mJ-SB=Y(#&D|slD9t(W(mF#4zzI>9runyE`&`8A<GaAQXvDP*!@v2fPJZSg zNBzU3zUKS(lq}X|TvsJFN=G#&q!Mvn>xdLq4$ECjJD6hu_7n)OLu;j68(d*yRi!C- zf*6C+D-l+NN6QMB8Lmcj(2^LcsO#XBf2Fxi6q6<Y5eyYq^S#jB*oK8_2ECZDPD^H` z2Me(rM~@H8#s3KQ7m3)U#YWF%$mxKeN4xDE3V0EmA_NgcUIe1n-HG;zi?}pB=Y;K; zpBR5Vv@L}TLzvuL$muBQ{OW$<+GC~Is1Vc0*dlwtp+p`44VnGw4w~@j?^Aq8we2X( zXAH90O>1Y1;|rtV<~f;lO($czd$O8~N3=1Pmm->r)<nvm*h{r*-=i_3qgEy5x1c~{ zxy=-+W2tfTnB1bAB}I*^r}a>%)8y33QhkmX-p4pk#BbfC`yhz{$pYdZnX^Fkd+?OE zqd7HZCkW{7es1snKLFD}EWe7rwuv7{Y{+G%=j7CxVL|Y_(8ES+0M8S7|1QEn8a*<a z(^2}&=(p#+D>i|d`f>C?c*H?2v)^>dBQ}AEJ>a3XnXnhH99xMq3}y0ya3?WGr+j8# zUD@NyPx^5Si0=ZzTD(Fu_CtsVv3eMfzf8o=eKS*>lls9Ye=+AI9vLfwNz$}G)FK3v zQNJ2yZ4|_6wK{McA|4q7)45IP&dCk-m3|^oNSUl!NaK!2V!l->Hc)^KmT06VPQ_Cu z+I)lCH#ShC(QFKl@VHO0SV`2to7#!bl#CAhnu?A7&D=oBSa#2XO<rQHOr={yE<!@M zxG_Lr6JvJne?jEZ+bB6~vq+SDE}d1d>>?`-Um$itrIQ01{dy16;I1heBF8SG<b099 zB>P4L=;z2NU4AO-AAT)mS@Fslvo{jN;TK{OB8$`P#HCIe^&4^t>g6-M6dp9>!YZAt z#OAgy3};Fk*<nOz<=t8H)s!DmgjaVqwFtyINzsfXf6k@iF2fm~&1^(vd%<O;h{}#J zU$K~6q$4%WY^-D|=1CXxyv0Kema~^m?cQ15PUo=tS+CV&T;@u0(n&5OlbDj6WReT1 zm6ABZl)z*Zm}37jNqOWCeuaaVNRyQmsxM`Hk{MqLiI<X<WU|^o&sAP|5r9Z>aeXIS z#;=Uxe~B?=C~6cJ*YcZNF`<dDiHi%nnI@sQNRyQfEL+&6RXQXrjXz5XOR|hbF=IhY zNH#%|*OY@}=V7)WRMuqR4?>_K#%d3YM&!2jzTO@T@zcC1Vyw~_Z6?RWV^P?+3SUl) z6%1L2$7YDJhPK}64@0Z|NT(Kjt}K#wC}J#0e~Z&(Vk{!Th`9YC1{=wPNywvg?bn(2 z?yVLflG2X}1JGt>9K9apUYS%Y7FnL}Rp6a~dIdg}RR1wg6L}tfsF5AYa3v_ic|&L6 zYfsPW95vc_c6}*h7YIAUL6Hmg%X0C3PE>la1hRCO*Xx6n0Z>M_d0DsXopu+|g*3jW zfA~};QJcnbBg1)c%T0{C9>$jO!&5Q}i^gWn^t;mi<+t#FzN<xNexHLNJ+d;WEE>s) zwR4aBY3I0ms2Teu+zblL8!NV~Izg+S0Oy)J_wK4nv+jdW`e)E|N?ru-Osd>_2Cx=# zFNmqr!Uu)YZD(dvV@?+y7-zkepcyCHe{8z)s%JXrfskNLNYE8N3g+pcar|ax&MxM3 z;embGmxBo^kaz~4h(@*vN}diH3gMJ;h&XU_i`ilc(k{QG=T2>LKlOqr_wzF(@&g)x zj?HHSiB{;s7_YX6c8yJ{Vvm+ewN*YrZ(!eIG&(%HAE&ViJ3Ap)cuwZ%duYrke>q%2 zjJ~phf@}`}>>q(tN<;2dLOV^*BlUix+w34}B#HRGN+`AT1bE*lz?iTZ%G%EuP)3wg zR<Q7V%#rbD3K@yQm@|iu0kN1ja)*UyWR8tr)EPjF@Z30ME3WX;7{<c$mPgKMq+`q} z!-L}#w3)&~7M_ebtTJ74sl;$GfA`33lg?@~jWa<>xmmU^Y-LJkskOEm!#<{Isy*T~ zW4vjotVlzLqB&cxrZ;0EP(^cAQkt{!SZg-sv(P0m=T<qN^f@1Jf@b7LQ}U&njW0jS z$fBm?i&4H}xP>KPOGBIngHCtYL)6|#Z7?1+TOGZD=rqok#W#0<<b&<<e;l!G{YV2C zT_1)z5Jd<mAOvL6+c07xEy7bc0>hIrhgG>ef?R&)d{JZ2KCU7hgU05E#Sw@hAxuji z(4|9ab_MW2MY5<!79W>Wcd3nBiJ!z~lEo6{5NY1F4Dn{>th}*1zj2rD%}3|f?JZsB z&wr52&oeiWG?q}>=`)69e~`ClrcpU6kzxb{fl9`ET#`#phSu4oo#wIv-osGNei@66 zUQC=Kr`xU~d_+^t19j(jXF0DuET?lXO_|$AitrH+^ewj9)Ro?H7;PrUgxe#(oba*R zYgjESq;(uKgpd3?l<+ZliFhzY_=t}1(N8k;db8U_v{of{S1Z@6f2~~irmBmG>+pnF zN}`h#TgxOcF+Jy`x|}bT_f?~Hs1XLv=bzqEM$YG-BR?ATgOIS3@XajUhbnM5z9;O4 z9|*CbHwB6!c%zlV>j|IjlmB1<|3Op)Xf#M{9wA|=(W0a~Yil9AJYX=<)AB*D93CPy zq0t-7LCe6Cvzdf;f2(o@N*$ZRz^<vuSs70E=aWK#xWFIzyu-xD(7zd#7=5sko@94+ z#OT~Wl9boXr!)hh_J}+wHS~b|tzS7%Qk8tWDo)f!-07M9-X0B<L&YJyknDumVKjd! zyB9^rKExA<l}udSlrcm<XTc^faS@S94Tjw0Ht>Mq6k~SMe=p?H+h~B;N?4PSG=vdO zOy{LUCRwFGMCMIzNM$aXo>TIYP+niAbASK2T`yTuve6}Co4=(lF_n)>S(t<t7A&qb zYOQ@UFqAn*gb7T^Om3PW>J**X!<_?JN9@8N<q#!vh=it#Gy>l0(BFh!+`gF?wwyzZ zgOrekOMKAEe|%AiwM~&bl}+tMY$^(*AyF?9cJIl^bfeuKH0y{O+un5YXVQUu6b_w) z6vLKc*y?whEksm);&@OxOhJ6i7{^wUKcWt{Z}eJyL=Kh&_2_|+$Mn+aWp*YoB{|tj zyjn(%FC{s-BqxpqY3yCdC0L=9SC#TPPeqs%jqhPae~5H~Heg4pydPg&f84v|1zjKE z$)`T5oZHq&NlW%=N`}EmxTTIf%B6%iQobpQABl-=prvJi{Jg0*bIE`<$yMkNHP8JE z_Wh=Rlb5?m(T>QsYc=|Yji)>pXQA;8E$mjADzjE=V70N!jH;+Jzon}C)~MG7o(Q=V zBRoWce*^M~CpzRljgkks?8+xBMYiKsfTAVMvzCLm<6*Y&f+1VbV&~=tejr;wsYeeu zY0y}$BHO8$fsoTQ8k<-X^1HMnmcwW>IVL_`z(#-ea<ZLzzi#vl5!nv^4kg<OULqc> zykt8O4d@vC9->OXe50+YH7F4crE{TFCutUbe>7+h2JN*P_$X~1+u7f0<g~S~OXuFL zrXJUBHJe>L^_}@w>S@X#yo9g>0L-youh$PXpSc18atgCfj9TZ+zPhr<m!I_G*5|`D z1x+2OdXgR}PSsC%dhec{LBO-4QQDTI!xOyfs5G`wCQ+s}NvYJz-~$4pnqOz$ySLfM ze`;_C>qM(fq<l#=+%l+u_>uTbH%W)bY3HVhxF_j|<uP&KC$eKL*)p0jrMdGBdFI{% zkA7_qX({9{A<GXSM}eI$W{YKrAidLgrjl+9Q$hnEiETN#4EODL512|qb!V&^jZjU( zQxbJkXuiEzB{y~=%A}Lu@20Ci-DU0jfAq$?1FsX6C2HkV3#gJ0`-lyY<(f&;#~~~_ zbcTp<n|-8)!!|9LtdaqjPN_6<&nE2roD!Q#Qc?xQ41^}FRLnpqEle>3kz0&EE~%Xj z7jtg~$-lFjOs6LmxmKfmhqze6WrX3-ZM|kh12Y<bAx=3qmZ2z(OmPEYv9XXFe<*5J zEFxg{8-4o-Q3a+SYR#krAx#crz3a03J#16kV)tG`(k3&81hc-v(A)h+50S5!EpGLC zlCvOS{lI8<bVOW6VntMpT9SjLict$vCaLQYv0?c%TWJmiUHT*fuvs5(mz`FMxc%Ue z;kko8btz6xn5H}^stM_xQeOgxe<1Wb8-W9C2{Z)2>3lMKym4!PyUPW1srRyNflX}U zsQ6U#77sO8mtQ)yduMq&oo|>rXxnv2vk}z|v6?{@<dVV1Pl^-G&sxgiQcA&zmJXiO zTMfI7h&IHeTyD|Y2e~6m+q%GMPi87L9ddD{<iVtj(~mmCBlHx=q3<IEe*{r;3oBG| zTBF;l+la7AGd8=)o~9hKOHojyy(mSD*zF*yR1`5HB58@sX@)H^&HY<;v)9JdsNb&} zD@lY_%#Y<`ek^we-5a!xIwB8h#wZZeT&7~`ytC%3`0VFo#gBvjgDClz{)+xNrT<?2 z4axd9XLeH2yOrRTKA9%ve_opb8D;pIJAZq9Nk00I^>~~o4tSa(dBiZHn;^VR>%Q0k zNmG$LDw4<V$DZ%FXt-x_3T$kEisVs|Jl>4ykV{i<_6<B(hB)3Nha2XMp~3o?Tlq;I zyTeAm8D;nDcRT%lV@>%taKAc_Gmkta{^OMSF?fl%I}!7v-e{6ve{=`=-E@9?Qfak2 zeikVIauKAT!HJf<S_IDrO+g3Dk6$0>6K}ehYlLZrt8~aIsqn%x#^pQ?5a?bD$RN?F z1+6*4nk0v6BvCDN|M?W77I~in@)WU~3^m2)B=QN@IE8_t49yXN^>*dC^+d)`PO<Tv z%30NB)0J1fcf846e{JH-W>xpE2M36xfG%ToLMP%54nBR-KYzw6I-moq9#r^^rYz1% zg{y+>vjA8JA`{S`<r1B2t5dgC(vldRg6C6=lPg9wmhQhFr%RX7kI9`o`4jR;&Z`NX zf;})At)VDc;oqS-Z156!Hm{t+<{jo4btp#id4FMopG?2Te*(6wU;ceB0#utbcYf>L z#SRc=*M7#)88mx?qPiv9izI%kuhaQWHFc%4KWy2(qNWlHInv|&598*K$>RQjb0?7B zA{SQWP`h8;P(sl#n~&sC66f%7-8;}uPP82j(r>S5vDTG&@E=aUvV<$&OBfcQCEa{t zSf{R&U$hGxe}+E8A`9){xfB=^a`^Tnka_O?!vg9vkKVHJmQ#abO)#GWh!FxUD5@*J z&wrnvME)VK+2irWSUVlXhENNX*j4~f+~<G`4P7S%LZBEeiS&-OvHicVPsjEkCY~_t z5d^SI;T(_JRe89hSRb*K$;853g0C1}kNQ`q7bETTe^NU?y}Udfy(gaG>VvI~HGA~i z>G)!FZjY|eS(lmQ{h}uct%{53cvLcyIcCXT7zFO+#rCcfl^m@AWwE`272N7NQQ`eh z7GZM*ZK&&8X}}I!hIyy^C^g`}oX5%{b0yw_AojfVQK4yDQ<iQol6ZBIj;8q@wcl<J zZB!5;f8c4HCy_XNjf>>=_K*MjxbmV02m=}y<q#!r3JF|J-K92iU%XGUz1_!3B!vY2 z-~s@XR`CX@kU(Ft#d{c3g%uL`lEssFVAyLUP^BX4*pXslTR{kMjSEr{g$0HQWP$ls zKHgDbfyc|$G*}kMaqvcAfuv_!l;?@(rwR+)f6A5f50pt-3v^&PeqjO@DJ+m#R8Cz= zMk!u3S;z0IgLi$&V*B=(Ks?)1SfF$wfdu@)nYo_FZ%RQr%A*hHra0AL;G=>AzaPUa zFDUZN{R%ss`mS^A94am*^zsI&;6McjQmo$()J24A1qaquXA-<lQAK$?L43|e6e6e) zf59!-^9yl@FCQ4&YItbZ*-DP^3X`?q!GjbcxbGUE5J80q=5h6R5z%KKcWqTm{uNsC zgf;1p30a<0kl<qO5&Bj~%E?-_E9`gTQ6<?55>&gwv1L?QYos_pqaZ;A2^Kl06W2H< z9Z{H|!UPp2xKnDAeMf{8Cb;h!kO33qf0?4kOg+NCBN>PE_9#^ehCtPnpmZZ?=~IGe z340!#$)9TFRsm|h+s)hgl7aRt<a>NX3fS(G$@ln=X9-}t?piBAO#x~OQ2W81{~U}5 z9FLd|t<2<mqF9ax#8o(&!qE`oXnZcRU75Y>EM?zOlo#V@5n*$jMByTY0$LDJf3s!4 z(Rcz)*1-99)IApQ+lhC(+Q|cdig{1U`Jl}>TK&lAHnH7fLGQ&;K$-&5UKdE?L()bd zjsJL-2)64KH3uw!S^EfcG(T}evaC9T8x+TINt+87aeZ`d-QLo5{-kQA?zf0~Ts&~c zUeBzNb{XC<AG=x%kJj<af+67af6=elh7t{y$8vcwoU5tZEp{E#wgQdfla%Uq3#ZiU zZ7;^y_?$FIVFRL{P}doZjsJL-6jt4CQRJ+2%yDO7v>P_{UZ+XE7G<$y#LK@!#T&dt zg08wNcGvW2aq+5IHDt4DYJc?=_E(pS$N5dPS`Gaj*GIxrOeiutbYymXe>mNU5Aq++ z5`7gu7>foeL{&MUo21RPzC2Fda!b7@Di^xHx7?~k<h2qJHES0_p9Q*#oSeJ5<#v6u z1)q+vqd5FKGA1fp!KQrG%``L%RNoxGFv(F~j05r_-G~G7AJ3uz3I~)92W+-FmOT{V zfc!gDyunMv1QZUaa6rAAfBA01co$0X*nt%-CF}#oMFsUz?3UXQNF#FvK|@H^$QVD+ zY64eXC}>cP4!-W_ARl2jLWBIrvjk)X4Jv4m@K%1yJn)dX#i>2OOr%?{R+5Tidpy1v zYo{Z%gNt(q*M|m~3}59Y%q{9E9fhr`_8-bk&<RO_p9=g$xM<8Le_Sm1$-g6GDz=qZ z+DGt{7io};M_y#6<oI`}1_Z0h3LX2w1Sm(9CGdBKMPuP|d9&NLyM_o6<v%W&%=;@^ z%ueaQb7+JW-tx%%3lo{Y(O_#!Te|;#oWkms7B>1dx+^-J-*T7_IUzMx7Rwsgt+w70 zNuPg5Nq@WD^J1jGe{@&w@*7D0`(k;s(!7P{d|OO!v@eghE3Nvtf_J8K&AXef*1Ey( z=VZ|dzf$7WflUthcO+93AMpyFe!gxZG$Zc$$O;PcDGu=+q3+at-T8Iqy?d)os+Ec3 zxwkdyL16qc{Bbc`EXj{I3$Hd|f4F!43SYmU&dFaXGEzGoe+{31xV-*Iez=7h)ra+8 zp8r4Kchtx)c9%>4|K;4aM&xtw8~Hab2jt~T`<(o-9!hg>^~leL|MOp7jr{J1#p?NI z_?5xW^o##hdm``o|9bvPPk($}F7E07d2qrf^5@H~hsmJ?h7!CaK@OF-gF+ooi}0#^ zHWeh?x^1+(e;rZy<v%W&S1nLkc&{2fpJKdf-ly<0GG}@Fc<;_VaS{f=NO(fhN^IzQ zzuvE)IbXt#Y}J7@^nP(O{W^v4F<s2HuZyMjuv|R2OO1vL?cSLKvjBN88GLB-sMG6M zYqRhptlnxELw)@s<5>BRQ(FmMlEATUpMmh8Y2l7FfA23$%;LMVoI^e0PmgP(>$9`X zr3vo=*^HBaM>5}-_v6DTZ?T&I&*&#uj2i5yeO8RCCr)l%bKkgMpzO+2bo2TfqyoK0 zyV-4s+#COK$<%%OC!6Tr!a(V}e+ZS$=CGhpnYYn`&lB4Kt*hLd8nFd(#nURy7Iydm zwijc(f5Lo2vjE;eIJeIvL%xgy8$go|nLlLjOy(lBY3FSe7$ceKx`Bnde?0(XvV!Ec z8VzKV=T{Cjic0(px$l>mdw-xE`gMT7<R{gbGg$xE&eFN3{^1})w%qBqJGQWh<lmu@ zBX~)c#JEUE&K~F;qgQ0a$l=?Q?3k)d)H4?2e*~#b=kvA20WPqX=xM@Gwi{lqd=6-m zL11d5yX51_>AT-Jo}-;;<PSYb7=F;jVkTmJJKRwPk)z?56Chk%fp98BI<>Fh>l3H5 ziM<%z`k<>L@MD$3sHS0cV$pN3?yECw_uIX7p%zpp4a0^$D$?`L9cb#zJqMbFCoy{x zf1DlZF|WqgHb#E|afl{^Ae^w8@{>dDo#w)@bJcY-q=|aB0h=ppy=AHp{vDboHoBcg zuR--$hSj$mf+ACWgc|Le?op%N?i30v<nZlDnkeAG;!lDlk|Rxc&9JJ|PENF;b#`fM zzdH91?=)xrRK0n8n33j(dsC&jPL*a}e+Tf-f4E>m)R4H(hfs7R!XMT3w)GrR(oHk4 zR{Bf)eYz=hU%nsD+^^nAMK9A53>MQAr>5)qgrFwMyix)K37nsY`Gn(GSe8Bpn}h3* zXQzGZ${uL_i?i$Vkv6i<?Mv-q=$9p$HGY46ZjY`w1BroxxRn5*+(s8ynss(|fALRy zaQr(N>7k0txwTJ8?(Q?-U5nYwd04rmz|krPpuFXfubH$8mSrj^*~9bi(B!Ms9$tRG z1yQ`Z_T5`0)=IYDkDYuj3CbylPKEACeYlmp1%=cGTi!KAOb(BcDWv4L<qTU9L8%+& z<4p3+zq4<3v8pE79X`Jqnj;D<f36u+`(&{l<!ufQE^&Ax=&3~0*#f=bRy$(+U=2Z# zo}ynpbb6{2G+)IRd{VaH^HH<sPS7`Z;?dm)n4+bX)8r0j04APGwk~|`D5$4&3Jm0c z1qU@XFaF4jOd#anp@ER8$`wG&1`2qlFTRvCCv8#y@#qJ4adQ$t0zjPZe{~s4Du{z5 zpVK8IEI(=0C+(N%{1=VKy|;qBU+!=e?7e&LC$UDXp_4*j?=WPMwn?jLw1-{!o9>(P zF615{gz>fW>&q*xXKNOV_Y=53$pNAgVun#FEP~t}l+8R5QJRR`YZqAf<rA{amqOWm z+zmEUA}_La0oS+AQWq$Jf3vkh?x2#H2fiK58-|gVmA5}C6TFi}-njAY@DU&z6yiZ| zrlC&aZQJPBdL2R1<j$anoKn&<hvDUf8@LY7!W>WjI1?*;vrIh&niw9K@iY88)Xy+# zTfRghd<3{)Sfpco;;L0OUZiNem_d()7F(YVwWrTXwIeQD5i4DMe;A$j1bVC4X;|{d zYVqla48vYUREpAvH1UxtPpMeOz|f6h8>_s6Ax(6mGQ)w=4TFYQtjR3R8r6EyE!N(g z14q(wI)Ub9RNZ(F*eLH_mGmyq^!KIm**@Y^dX~+Hf2aJQg8Xvl@dM$;ilw)^N6!ph zOzp<ML&X`qL=G;hf8EN25#h!jq*qOGR;Fq<DQY*daDsv^8s-aBwVa3M$WkBAq|G3z z<*Y&r6i!}^t&l<?mRYicbNQq$^<lHEKgT+*84zZxOaSCRP6J@@(mn)0rr|5~G?Ut< z)^H8Wk$y-I$WV?9toTYW$GgKwn3J=uriMUFf-w)YUvIs4f0_{$Lg>di=PrL3%+hA# zmk`;?`{j`e_xJ`*A&b-MVy7(S*ZfqMgv*M>0$#HtBqF4!9B<zm5nh20)^E0UelfPS zs}I&lGuTPdXJ&|!c;}rF25hJ=aC>bOzUW1S0esy3kts_h@b84k?6nrH@|d#Zaq^8y z!0XJu!RlyGe+9mE0zjek-b<W)(BaFZFiaAUH1(DK%xU0H;^A<&cEZ|+IiCDtij9@} zgnMavsSnz{&JkLO=%>_dAI6J1gO2=%Go9J23_>zDBVVZfpxF24zRk-&qb#`#?usS! zwPk=Iip812Cq<$XQ`5-ZIoc!WDctB~_&d}5IvNpPe<q!x3??huxRyWHqZ9v0Vj=zk zP4ZLIKG*<oo?dCEmn?xQ^&5&GRX9(W+@#{)DSz@Hzomj6zX<N+)4z>KmlAjxNmDz+ zre)ir+b8&UsDTGB5mPANz_9EF4wH4>*qz_FOZVm@+}Ye)y3U`JslYRNcvI-fn?^%t zt{L$Yf2yWo4En;$P5F;g=?5=KApN{=#VnjUH}5Y@NF(29aPOhJ{N}<X6N}}I_+E3N zDp*Fl-Z&E3JpYa#)cp@jAoaXRUJI9YUSBkk@D$h=$lWF^v6~MLCFSY9wGZr8yV%RH zwi@w{-&7kac#SCdDtb8C9kyp?x@3m8Id%?=e}5;7HR8tS<QHgQcuBWxWRf?ZM{gx> z!)SMDzulRW8;?&at#+qEy^p*|9pimNl(7upPO*5b{Fb3E6>=+PtVt-p+|;E)6?gtN zo_g$TMlcBSL{kJcHF6Ixzy7}%G)t_V__&@STT`;F$WOY+=ipmqYsjyFl;4&!pkPXz ze?gFue*n^_v8yc}y@y9Hpb~(^;XerK@ds=Z&u?800XbabVLn`t;l{9tHu!Z&eNgXN z^?cB=-PPmMyg(<WK9k?#zb=;5X+wki(RH|IcYf>L1syP7Ykr>2r_q``MiLOnyO6`? zCY3}eP<x{}+HA3S(7c8A#no1iOPBoBe{=qXKkr=acCon87IT+}&x*!{Rc=#oZo^`~ zpV%MBCD=X~@oWR1rj5^^0~gA@_pn%b<V_A*Rk{%`2~l~)0Hu6NQiZ5X%p!0<Hbw#_ z!>+-<lcoCUHd>{@E`!q-5<|Y^71<MG$kV4pRSCTY=O8ew&v4n}&p+(ve6<I1e~WHk zI3!^mHJa9%gQomyk5t3`p!eNb&Y?{b1VVaydc9g1jxWx&;q|D0b$T(<fcX-NjEOg0 z%qd4MT$6qrgLT8k1zp;C?vKmcbV)S*(~<V{ywP4|=82!TzSr*`9MWs&xeNj_Y?460 zV}c#>OSomo9%*Cy<C)dB2U_o6f8=>`pARh&{)6A=J-csRU)tLE^zwg^>Db=&dkucc z<;A(JjjVI~Qscj$1>>7z`_dl&2EY8D7vq5j|MehMJcCBV>KW^5F0ki*OCR**-`5fE zfxuIZx?@%$gA+?{spi!OTV!q-&K4fG4ANY?p0smg$uG=As%OSkMx^J*e^&X`_2qcd z9;e6hi&K~kOuv!^>*{n>n?KHG)!;J+VGIj?KGcHTVf{12GA1;J|JlKgRR;Goi2N$E z+x~)r&<cjo0+@uZ|Ktgk?6KRAgm%<vHr0zysoJ5?5xM}V(2<XRJ5~A+CN3xyI^u~R z44@Cb{jaZ5mJ%U}d`E?ne|&>kOoft^DHto1gmxgL4>0DAOJ3YfMES)TKpA|?M4==n zTxkl9cCzAMqCMN(I=85%4|a=^sG(X;74y|QXd7l(E$3%H0wM{+FaE<Mgat)j+A~)& zE>_0k;-|o>a5!iVdI<Ou#Sdm|zqiJN)6x6XHf)+vNFVpb2j`{(f705Ob*lpxgktTl z2jdIp_UJ148dL&&VNqk+X{YlPX+lG-uqJK4(Y9P{0$fDx^?TZrKqJ?A+9`0$lU_&> zohFJ3IqmppgcxkN&>6*;s-~R~w}5vG6d+F_!z>!tz>_Hndcbp8ZP?*d9A~e3g+~VT zAR<oRCKQtyojxuce<>=4$qZ=i*4vveWix9Jn|h}mnea_k2ma%9Vn29^RAmAR27QP3 zpy&N`k*dSo(QaJNrBnEtLv`bR@y(fO)wF!5-q72+UQpGUw`3A0@^4^QGX^Xa0~i!= zCUd^{&TgVEzS1Ss$zr(#aRxW7YVa!US!c)rd2?lBH~-EHe++p!y}k2JDsSml0NEo) zNS#%TLgct<My~Q99ED_*)=4y5E_Ta*Cd!5W35vAp6a0(ZKYzfl&Z5|iJIJ*E$(z@9 zh8NHvD8nndQJ5H2mM#QP_olX7e6P*F1nu0kVA|_6tyZ(3V4A0&d7RItE3Z0p9v)^- z;UAN#Z>mWre?;bYSbqb{2(YZEooLjvu7CP|H=W#NSvXL3Z4#~6O|_J#qBADE3Jlm+ za^?-N?L&<ZNu&gzl}(5tk<Nuu0;EbnCC*9z?e^jiP{o&waR&-S70Vxfo<f=S9Y}b- zLTZg1ZIwO|6}M*#Y}hm6mU_wE99i1HzOwsQuoe!}f7?OF8kW%g)?iXTAn=KJQ-lnM zlwQNlSSO4y3;;!d?*OgQ0AxD`E`X00BRYyPzWC=Qa08rQ5Nd$xrEP0J^Nvv?{|)=v z>L7JlIT9i{A1VLi+cC1TJD$7!oT-$gkruHDW~PsSM}cw2&T2B9@-xAZ9^F~<Rs7Xr zhllA9e<xXM{|^@!R9yhsDuBNr73eISAg6qb#JXQ+-n+Nj==$tT$vlv+-t}+BD5cCp zKw$S051OM2+T8)Pn`IWC55&PNe&ogUxNUSAhV8deRX6-)A-jl%>Kly=N2rcC<SU*J z+R^H(m=dfA0nYR8h#MVS7xI%gkDB#nC!B<#e@VDJ#+(-vPV!bPbPFcsC)YWCa=&eS zkRchb!v(#%@R~;c9V+PHC1MsLudNF7Vy_x`!L&pFsMT-U@^@CnAhX|cO5Tg{akApi zxYbRQ?|Y;c08bKt*`7(QlB<<ajB<RM>d`M9w)u7?h}GX=1szsctH1lJ=xeD}7m4hj zfBCK@il?7#kcM~GK}K#_`mi?$Lp3{HBVd$H_w9-&uF&n+lxw%e9<snTT$(BslMv^X zwIvQFL6a`YgOR4(E1h_&=n}h3P^>33<YYNKQpt|4&wKWmFg#Cn(!ARTNt-l1l2D;@ ziqeM~A?@y4SN8jh@xOxhdfIXOy;h@Ff7DEV;m#?Gb@KUE5Z95KEZAzAFqu3=?kN!J zT2pdk5?OSsIq0J0D4-WEWRMk3?KJxrqbuulbP2aWWH_Ys)|O6-|4KPdP9Y(~q)FNV zLj`4e63tH27}C3;maFMa26RhRK!sL7o-BLZLOnXNI)i7>o2{hzk7v*$HMUx?e;#F6 z?&gISpe1%oZ`nN&TEc(4{4x&RrH}3f&qez9CoX^~P@-qpMXJMOItIktB-ay9?%c_r z8x|gM%Z=2yuz!@T6Hxq7x58@nrxQ@TAaY75KSOOpbc<fU2YMFX)0b2T?8+4?Jxc^} zVbYMt`ocl|#0mRd2`wj`gf+_ve>4JCppKPqKxD930#tIpxN*q~a2Ng3nRqUFZSK@2 zi@E2(jpQfV)%e<`*GYz|9JyKYVL6?9@VTLNc4_};9TnJhm>4j1)V}3L(x*ZGowUYl zJF<LiLY&j7Y>sN-5PSgXflIXoAeNZQ=H!!<nSxy-i<~N(TVnGFdzH;ae}l37NyJyk zHA(&%{pMi?h|58UgObXlcfBRZj8)@QBtkgmBZ@yiEEiv9?mfBFlayfEug?9$JO3Jb zBl>2RLF}Wt-nR0ApOLq!kgA41k_S@(L3t8FO61n&lgK~hH9N_-lEH!Au+gy)3=Wv% z@x_=-T>&f+0Uj#H@M6*#e@hWRLJ7b2A$I{9;xx*Hz@LO9CJ7RiMOJu_4~E=v$`06B zD%$z=<(1a6H4E^|{uQ_y_+S5nHHIHx?DIF^;JFwlIoQa9Ajt<wydT2HL8O`-b@_KP zG<}grUHNMg2(7`jEATg7$%V4zq3MlXekE|pphVMI-qvWRJIJUef7SIXFe3~}_sf-F zk2@Ek+ryQ5Md%1ntZWe;98Fj$`c1f(ujTqOQ~O+Kma@f(r`p;QP#`5X{P$s(N317w zwIFp%!m2mhdPDyGZj&vw(#k7gvW9!nCBr@%8Zpv2yuFiOh6BrAHqm9eb;%r%)qb!p zp{%wEdF|*odrX*Yf3Gfr8ar{GiWJPK?bO_=U{EU~vK5GuFqR&*+O{PmOX97Cf=B^> z5=EjEsX0rS0|n|1NJ=@MF2s#mZM|J@t`|Z4+AH!RgCp?o$R*=xUfauwom(s^ns{km z{^(6Ef+BZ7Z5-A@BZ$wR131s0G4U_a;j9t`$ioOG#wx@^e{EPKBd$e1A0!r{94b|a zDdpzB2>a6;z~nS%wsf7FC(Y4(^#k)FxAVE$eBs@}9eqF~0`~@n!}hB~xJ~dI;CY%e zf$Ift-~;61L1*@G=X`O!=>)EegqPhVr@z9e(oSSlG}?yU>4))#1`x%lDEs}u!*;XP zqL(|8{qdl=e*~9<_Ug|sGD!meaVq2BrKCh~hZn-qBw?!|0-lX1F<Gz&ddKJ$iCX1& z3gR*V#OEx#*vORcmlwNp?I(Jt+v98&J6RaDNSWVh){mNfM3SOOQjP9U)#4r*libWq zH)rw=g=Hk*-^t=?aPzi?Y8&)53wJU3Y&Q98T03+ufBAgv1gGL(1ra?>C>e?y;$N>X zB*V?^s-eU-TCjVSCY<tl`%v|8IR&wG#re{t*F<x@$V~3d^=E^H`^g8|JI#fwajLGH z0h@32J3Zj&;DsA`kx9DwcW5LGUP?;3%M=NjqsmRBx7#E;pE&4;Z+6dvj`sLlAW5z^ zK$3kWf0o{c#m)%ukom25w`awJ(BmMLU>whr{vhVBx8A!Xt0LKDqfu{m(O!3;8GP)6 zY89u#nHeS<`7vv@aD8#OMm}+mQ^w-3@Z#mS)V;AZQ!l<&$tgp4O++f6BZx(<S>yND z=l19-NlK+ibDkHE&Q4(k3Am=tt^d)^?9uzHe-E0mvy~$zi5J|sgxmqjpLc)_zi8!% z4`FO@<HKHtT2#rlV4m3ZF3}d-MalAR^&8!e6+#sm<gIvt3zqkPxwV{F>7Iq7ffp)k z-ot^>>~tgIrW!z;T=`r#pSuR9m*1b$s}iGmi~L`^5&g<IAAdqV2{e}av4WNAXsjqx ze}md+=|_WM=n;bfnaGO_R?ojf<7Mztk^}8F==BX`dJD#~PAaW-$G?1CUbH)LForp* zyx%?;h?%Zx^Zgqi;XN)Id42jcjm8f2;SSBi|NOZKPbs*&v(wiH-6J}!B}g?JO@Ag4 zsi%})U&U!nfxF&;0pN5=;-^KH6r+wRe>~rA<`MIOO#M5a)8-J_Q<YGVuuyvb(HdV7 zfS6v(nI=`E)wHc{kyEBQNj0$mBf42aDbm$-xESyH?5vh*muMttoqhaZ_3W$DzIB$a zlF4NY(ntiHX#*fj`{(J|8KqMD`0?!29%Nxh3-XH4WijQNU>8~?A+Nf#BFQdvf4$Z2 zF?Y`Uy})1tPM}Bp$7$Igyp&M(?=YFoZTXBT`=xgw{+{gfa%1Cjska;XRn)Y=Q13Om zgEoR(#aRJqUT|4ZY)nt--|?L_U+tRsoIq!ZGhTE(0*iJfo`UoA(yN)c3QbIPi$7d$ z!G@^XD{ng2+YS4f4#j_Vks^sne<j=8$7u=>yp)gv7`Tyt>21SYcgmglQ}yQYVFr8d zo_iAuCSg9e8-OO??bz%<4X3~I3r`{bpq8%{<KxM){0eihA*2VM8^J-gnm&JV7}{Ya zn%j~nQ;CMo+jnowoT=0eXmQ?F?DV<xnlFARQ6RoSKwX$)PAhWNaJ@Eie<_StI1`;% zXzSs6t#6G+7gyQ`>o;2)Tmxj=w+KsT|IE6)v@glsI*F1*ma))lbX0OVM1U=+<nmRM zOCT#-%x2C5TrU7uf@_f$PO&66IdxJY2qgs|T$zZuvmKyxGz57XDt&TAfPxq80P%$c zyCfjk0aCJk)uw44J3tX+f0IkT!Xk@-JNb{RLFXl+YwXv+D6r@yMKJ<~_6(yA)9CX1 zw#2NP(_;D0;p`oqVdz;X_U@1WhA$zLouH-&Pr@8dejQAm5sXYyArny?)($0v>mUi3 z%P-UUFRA{V8Eumq9W@{4(|<p@KBYQ0!&4fJzYJkFK@I&I<TD%)f2Z-8n}Rf!tVt}s zWYg0&`j_HQ{#wm*CL2bowHwlt;zgGe@RpjM1gAhMBG|Lb;5FsXAQMl4E6XyoP-*a3 z7>knesWJsfnEb1J`;ENOsYX2I35GVoaV#a5-h#!MfojA{T{MY>wr<2HMHb&D<2F|< zWVuT}B$^4ZU^oJ%e_WCdL=h$1==ECiqq7N$X`k8a<=SwjhjLB+KL22kZSC|*JH0&q zeZJprCyc821%8||>BF2ZJTS6cQHJ54oGL78gjrYrJH8V_Dzyzoad0^4^EETID8?<K z&!0C=3x&$ZcoFGECJu_pvyh0+Hgi_q*qy^|lJ3n%=hp4Pe@&Ht(!2RQ@u@2$$e&%G zkH|16^**1b4G=pW^Cj2*=&56(%%cf40ax%4KNUZs#EQr8h|H;_SN0$1=P<_$PmD{b zW+~kkoJ!3-*6YcrAOBAIQ9t>8&r9bXc?x6}(G|#cU^Iq9i`L-fLv-brZ60%vfe6DW z!;Coc?@(J#f0wt~=q{T3JPi*+!)!tb+%xQW2ImPC(@%d=D2ROOjo{-{TbU>Fy51=_ zRtRSCQ-1G6OBZf@DM@`f*-C#falMjGL4@>BaS<NE&4J&*f?;zhNt(2FDc!~6ydOf- zOA$bP((7U}o`<Xkjt|_*|LiwRuLJ>D`g0^W=_H?3e|!YWEeA-vA^c6uBNrm2JP%?n z-Nh1+Qq8+_wXe>^TP!&Vk$i_7;vw|DB(_8nL#ATk-;pZ^%$@vW`)8x7xmVp<{O@K} zS2tA!h1;?aSC*Si61Kif;uKtbZ#O!v_F#R(4&%;v=~H($Y&TmiBMER*m(T4KfDwA& zL9fxNf72_CmaFN_*iS5my+(ati)75dLuG7q8iuVW%2;nS$uCmZfKZMf+F0GS9S0H$ zlM-LX^@iT_Z)l-{XY82&xQsH+aj%4dsQBk&5A=@FqiS8yAZd=LAP#-{HMUn>U=+&t z%O{jSKWQbn_UnDG0#*-t7O0UIkbutITNt~be{<(tW>qYqPQG$8vt2diM~H}hCFT(? z_dlJwjyT3do=f3=C#S(fN`JUR&CTa)CwQ7)XWqNFF+d`e3@zi2jBe8|G9Kh}K=bS4 z{Ex|<JNa{$;UJ&yE*1_!^>O3(KM(>!)$^0J;**gg1sI=`EHE+2=OE?;<|0YgsPfGv ze=r}6I^HjCC;{I3nhSUhY>ftR_#pgs;!PL+&j;E&&Hd)gs;<ie)WRB!4|wbh3;&Lc zsdx^Ln@Pdt*9#stfm|&#R6j;^EU261KSkD=h9i2O@QA)I>hxQ^h7bS>czlD8Q*EvL zzkxgv!A!#r0ifL40K3uFt<v-@!p&~9e>mUMiL-`az#*EThPq4+8fbEX=9=$8{lf86 zh9iZi^extEw_0rsM87k4e(T*;=~4k7HzSU=c**4u*9a(+c#RpOf4dV_ZcZ?<sjJaT zfEM%FlfN3GACg|_Jhieq8ny@hf_Mw_JhAB`Hrm{|ceTaW;DAzDW1hzqyVXN&fBF?> zsu(-fPEIr<p5ljEO%y$laQIU3Ua9!!P;RX@IIR{IEkR}%%9QCJ@b9Ri1?EM9>m6R} zf*`(V5sI^CxAYe6)G>X)<Q@_KaVq2BrKD7U*L}dPQm^Yv7PDtk{!ra_1<T}kioNX- z`LbfvQ^tN?Qq2ZeFGPmS%GV!)e;uw)BRYdnALz!w63!rSAE&-2_zg+EXLtRf+!7DQ z=M++(=JrJsOM&=&C+|E10ZV^6lQvW6$miVg9+!UZA2Ul~RPA<Jz0T2EiG!#Ck=E|5 zUt}^T{^N3Kc5Xu}jAru+K{60{E`=yWZr?sp-Dx{i&wx7B@i!97B)1IRe?=y`6qGvT zgf<0SKr!FMpl6&5lHSw^EkmY8+}x>67IV*;&Y=}|HNLi!dvk}{!*V+J;B!Ok?9%3O zM&-p%Dtea`Ki`jM&iocE9om>D6?gtNYfXgTiyO*|Q_q0tjvVF1m-32?_2T~46pT(3 z>amX+#;{Y*m|_PXCeQD6e|yxqC8;G%v0=j5&$54hST4TI+<Ve`;E-x2(V=|@Uk#{b ze3aQhNXDZ1H*wGt8te(lo0-VX6P2Df2U=IAE4^W~yTp2Sv9-}((QG3(K!Q>JVg#S} z7bd_gv`yz841_PqU8{@biu}0HZg2m1aAvOOxtx{@lT=>DV=m7Rf9o{{YT!REnMzQF z$e|`;R3Ur>!E@=8o@9|wL(afG^$InLL_wj084?z^l@r}Kr^m(Eb6(m;?3m7xbH-XM zT%UuHBqCagG9jT=p;)if%oW>DLj5DZ!7z~3VbpFSJ{vW#@Qh<cPbt5Qg487X#mgif zC`hBnD^M;uCkHo+e@Cc>YR;+_NU8>x-YvenHvtwJJsD2H0g8|pW`H3kn_&saNiR$4 zk1EUG$`tsa2`1Z@)pq$WOcF-H)^@}^RjJZnJT9ltQ*@KnNfK|yR@%fjIFi$10G$XV z!`WrA9%ZXz#dR(dm{ix>mT*YHGMWRc5n`(pIS5`NRwqDEe|N~UTLg#{F-Ig>s2Lyz zju$ku=miD!D%{@i`}`#G4|#2u`dnnyIv!t)wNrXI1-FtZyxWhLZJ9;{`IF%utyy0f zXF<!pe+BY||MfpuWB9=yYrom#wH><SBGs21?R0cyzfU|EPRW`{ey73@U@#q=;-T8y z!bNhj@C@wle?&p^JdydZSgoc|S!!S0iSxK}wHw!&dC_x3^s&HnHP6F|VKmM8viO#z z*}`W>zNYdQPOxkI{5x``OvN{ygVPsSljY-($$G8dV6MU6c(;_L?p9g=Eq0~|=N$tY zEy&}R627|{G-LZ#8|bLR!in<_T<2cKX6#lKC|_7Je;QJtOW5iQ$4ln_#u+nWnMxqv zVh*+a&_V1_2_f(ej3CUvxl1n`NeG4!{J{h+`e*lwP=K`CeUa|>j80cyFCJ3e4_<nG zIKhvNIjRz)`@DAyo=-8lLmS*Vo`T?(Oy7=E3C1dz2`t=)O)wN;uRlELD;_?dY$)N- zgkA1=e=Mnb@B9^`nF}AmdUS(WzS8W~WIE-6Yj{wvG(_O{(v~nlNulh6mnXZb$>h(I z7Bg0wv$M{y|1Zo~^=_+g3CF1UkJG5lY)Ofl0BWL?WIy8G)%M99pJI~${YC?J;k3{k z2)7u=T)>GE0@Ai~vqsnG7{WdC{ocmyAGP`@fB0@QI5%FBK{;OUw~f}ikI9zf{Kqpm zw;l2r77y2TY<&O)SuuVg&skf+=!EoNI>Cwkq*Y;LD>0KM#RL;xOR|KFMbQ#u_RDns zi@&WAjj~9!a8*6f{-1WcbRTBb2M3l;mSmZ_@_*h4h9kooPif|>-pO?U|L}JcGx&>N ze}5NgWjkod0UAlT?16p-CRxBoYAX-6_itB(fDvX~{bd+<(E+^j%aitovqdpJ$@lJ< zLiWXRf0t`=c}31d2(m~;$t`OkmCcJMo60g9@*|T?%0a)TgHA{ttnvHnb9;2f3^skR z|Hm3|&I>%b^ofLN_fOBQGp&Dd26Ib0e;>r!3MPv|CJDld3MEW^iVv^3dd<r#YkYM& zdaw2V1tiVZXz&j*L`UT|vd-;G?fvO*_K3XeH~OkPCX7NGk2OeD>7Z-%aX$U`qg(ol zN`4P<02EG(+01!>`7x*_v<kdXDTz&GoN0Vv8Y-9;V~YP*#?}i+L*>`umkx&Ue}zPV zHwO827(SS~Lkax*u_IM`G>;juh!QaJ=HF5H@={8ou`D-a^OD@>9)kQ%9NGoW{HaQA zlyy{I`095O#E?s2mJ~5CzvhA|+F?(41DSQyXj<!LZU)ba9Kn;`>clm*kKlcGmUDn| zBm0TN@x{3|ydL$hPA^`##aA}0e~X-_XLp7}L;h~8SkT%U=}M~j$Qjd&TzU;R`xm1t z>vVLfjjRlZl>a=5#W{Xa@sL&?0jJq%8pHL~6)NC7voyTcWUDZ$Ouv%-4VwEs!kk6$ z89<`ANEBd)_3(WFstCdZm?HNv$Xqx>&!R_rT>Z)K@iI)19d$bOA*DoRf3L?%yrPDW zXc^qX4kyTRYuXdN55}Jhk#TNcG;uqd&dA1yze0r0FE;k}nwpkTZ|mz?Y6G@m7>y&# z-|`Ru)X24)SBSRV7<L=QWaPV0`EZ`bjVZqLRtz_=l8Z;V=o=e&!Yv<qv22XsSD0e7 zJIz+Bv)-xn-Bsj8Chy?if1xocc!|ip^j7OXEcsRZjW$}q4K+T$Jq)>xEbZQzJGbt= z3zycwh}-S$!))OhYf=tpwsf7FCvEB819t_#@*&ilz*qBL?f<j)HO^@x*}nfu51E;= zYZD6b?M#_h0z~XrHlzU0+_{svTQbNtH(0PBCzIK?|NA@LYJpmGf6H>*EvsdvwkD2H zvUH#CbAIQXlYXn+=QijXMyuA_*#W{g^ie+fMhS~Zg>oz^G-t-_VUE{|l)g$1r`~Fb z){6U36?C(Lx%qfcltXZ#q&FEhkHe;F(WT&AMug>k{i(}6QB!zC&U#FDaFeCfF?UjB zu7j%_*vN&JuEhy=fA)2v9BM|ZSAQL@AiWnQLM2yY+#FF|!EivxcftY@LYd^G#Y7td z5ecRwN&sC8$yl~2h3C>6e*gr`hV3SQEGmEgDPlmTw3m5_;+H#cO;c!c)E`i$9ftnl zI|p{%CQuuuVe}hj_5<Q1GfOlh(lJ_Wk@K$ydx>CO5SV{7e_!0(0No%|a3AikAsr7P z1Q9+)?vk7Su2HYo_leI?JV|vB4I>hm{uFEN(j)<2l*$~ZL@N*euQ!ICf1v*SBgBhc z2n#<GxTe=hu7<TQ^6@n@4Ve7xg9qrJ%$u8nfX70+`XU@FO~J&}CLnwbayvHiITsu$ zypqpB?#jCZf9wp2apBR%o<Y0r_AQv}FHq@3_H4G=%rUqI%mSnNBQ8H1ztM1y>U<?q zA@kxo_Hun^UpwAn1_lrg>};5`a;;p;G_2M>(d8R_v6W+ACsvL=!q>yenx<&wq#2Kp zm1DDlDmg*gx5qu9#K2J{kAE)TZ0vjIh&-mz2W=HTe?^DJFhM<^<pWkwf;$U2M}uzb zq_<n2P_Ru#A>O{a^x5P`Mt4N?WE}aG=t-&4K>`5&-pGJ=89kW&6R{GTCt}6=uW>9| zIWb!GXgN?D1ukMyt__d#S^|a+DPs;QJd{AopAFBv`0{z20oln#g~u_BrndzvZsN27 zo1J0(e-%wn{Ky!hlR>Rl+qqnto!HM!;skkai3&4kOK3Fkvyr>TfVksoEwymm>6wKF zql=5tZ+PwknYA!^Pw>S4jDonc(^_0$%`|h*MAkgwsOe7N!@&lh+%xl63w13RrD0B| z<MZy-)as+@2s6XPLcI%fGO-vgpfQLbH5o7ff6j7gt<z<sFtzb!j}NC_un|jgw^oe3 z;PjppZtY7>d+KDf_k^(>fj$X^N30emxvG<DtvzUxk}fAaN)gU2Ee#?}aSkdCkQz1B zYiZver#Q(98o;!@P9%>uWC|mB;vBq?s@|wsA|PiE$P?_guW0n4)MKMlRh~p@9qct@ ze|5AW5{uPwH><CH-QgI$`}x-U1zoNHyMybsclMW8io4Q<mi+wXaY7`PFmJ~=YD$uH zQngMJM}%Sn1FuuF6DCMwXm+BocR~{n37iy7$#+=j7oAl%Dt^ZV0_KPTK|@g>E2$(3 ztQ+-eqalg{3!uy4Iye4$Cs{KycR&{re;W&-aJnSU_=c6%0^?4tH$G#JSc*F%o2SvO zz;yt+4RjErn3Q-uQqwTRsN|MRd;xs>f-b96;w5nC@~T5mg*3z`F3OF7=FN5<?t2SJ z)b<DJHstcL2BmQMG73`laZ&!*7P501CFl@k-Fe-dg;*o2nZxi00sy+u`@zare{Wh5 zn;M5)(u`g)>nU<VtXv_%OUHkHuVtj^=46(!(rr}h{@5>0Njz7{5S3|osqQ=!!x5}b zCAE~0l?*32<07?2qheK0G${Qiu=jbI-GSAtHnd@tPYB@Xn>}r0=@|WN->-i`al({< z52-Jsc^*eE+VPV%*zb(fe%eqff1!h^jimhvV`3uE6D}N-T?_Td0M<v`lXi^^DaXy@ z&=r1KYBXCVQkKYW&O>{|9$ze}p90&A{aBu~0#uI3r18_pFFbwR8h`KFSIYn@_cd^D z5@cobppbVxFX+sikmisJYxrS$hMQvI6ty;VBv~6Y9{q-fSC?IDEIO24f5hy3a-oR> zolnsDus0fyt={zFcLZ%5qu#kmn>#GCcjotY>^hu8hbP(gno(={@apX9U*TjD@%m1D zwu)J=H3k}JozPIan3RuRyvjE@;hr<<!r$BL_43;h>{-G~S&0pLq`gubcQHZkSQ}Rn zeE2v$q76-Q=EC#E?9ZIUe_J^dpxAv@dPz`{#Jx7Utpsr}*x=A^aA=Lj%fVCIs-5eY zIr|wnFbYSzXqZi-a`Pc9T!EIfDZ6uOIBfcapc@K;zi4}`g00$&d(L43mS>VMLA6Py z-4>a${VG58sAkgJ`ftY7O|Al(_12(Q-|fK(0i4)@2}!7*UY=B1e=ANXPnvz5PkhTn z^WbqVft6lX<7fV?{2+m5eFf7#GJmKibOUQozz*w^gi5=@qfu3)gpAS@hB&eJ2CvMK zGIRKQCiBKgJIA!MkmYPCcWEdWt(1F$I!wJ|K&EZfHC$6owmsRJ?8&xWlWpV7)@0kZ zYceO>w(WYmpXdGX`}%tw=iY1Wg=l#PCul9h#x@YbTw#21L#8#A2OP@9=KyJ_7?GU= zJ4!KGG6eZ-pjKp-!!S>nz&OoRz3aBDSfB%HQj$!6M*~R?D=*f&X}k>kkMzpytUjIU z4KmC!h3=q`V=K$s1t`pp7qjW8+aFt>5ijOVl}8$cHHoOg9yg~j5Y*}Pte9XZ5M*}5 zi+@@bYjv=z!Z|GWd<%zI%ITsikVjI2yfTxh{TtF%fKC`+JofBW>1QVvkF~f|gWET_ zjffWYljGNs`ynf^{-0QVJWb?;p!KdF<%!@;$*`b@w|qy;#7`}1s7@MZ5=w~KMs=b? zUK_sW|4y406N6%MgpnY^K)5Lg^0U3e$yr7`#>ikFK?Up3llI8;YB49U!*$)Z8IFTY zJt*5!fEaZFDMcM>Uy|a&jT3`<adeKG%oOCXK!&32zx{aq#nOEYzq&3jrCnc9jEM8G zB1zY)DtZgm39rw}iiO%|W+!J96E#&n$@XH7tJ42@p1wV``MRjwk#D&wC#Vppr{N%f z>mqhz7)+M@=BmW0s(x_H&9{cqD+hP#65D=r0qDc^YQeb%h~au3aHgMYm7I9nCutc? znt-7DVP3HXUkcV~i2hYrCyIOTZ(T}iOkI?y5Fj*=NqIC^qD~dJP@R^md{x4|nzZLW z5IWAd9JddB4tl9?pub)Dtz`W~)(@6CQ}Hv1cmZ{V!;)wvdO9rC^(hM?b}rbU7SzeM z6X5P9HQ=T!z^}ruyT-(=GS1FG`HgN}0@GK7bsx_&MqubCYvDW#hnMlDmGjS$MGujt zzl}vM?cIfD3uJwd-zd#B6iHNEm+M8MM|77+*$E^O+0~_!3ZI*wjQ+5sbU0sX3~$Hz zc9z*O{9gp@PqPYu4@=$9k^>$ic9%&d27r5;PQMWD-7SiP1(jdHa`{PZ7~-G9m!4D0 z(tU+qh5J;sBG19~gUq+<%>}_h2FYfY8CK?>6fE)*E}Xo?w{U}7NSxIRj{3qzn@e$_ zQI@v(s_C_7^W1GHIkC|KHG%kp4>J{kUH=(OcBF7_u?XvBZ*}^ZBW~X?!wgUA2Ox3F zkxLYM4)k{AvEQF4$-p=~(0fj*djo|+p^}r0_?Azf;&=<q1#9NkMB=pa`!~5^xnE5= zcfaRYQ&dkPnA{q}hD61p3=dLMv->EE^d?I~ieRg6j$6j+bH>U?(3~qXt|+*EM!UKv zG@G%Aip}p*NIxQAPmK@3BhU1V-UCfJ#b@VM_E0MxRFuhjA9%fPmtigiU;qwk5e69? zLbeAc<JfBNY-j$^%&an0znl|C2J%!eBvYrj2_!|e3l)K#OMda}+|oAV$BBcwsA+7a z(4o-@PuLk4JlIe)LE`?*Mb5JIY0aHq5{^i5k5wxFS{2)zfmE<O{Iqh89gw|Sz2N4+ zD!{A0aJ8*6s(?_8qwo|;KT0pRV}$UkoD_PPz#gW#qGfy5;%K`2kAJ0E)^&F&d!&rE zTF5#{|DTqAs1R$?Kg)3nCzMlihnEpNVJgUItCZ4}ueqemDz577z~4IuVYyUqm+5Zi zujT1H9g>pWKR`H?e-Y&TCFgu&k@{zBtmU_%v3y1&8OoOZx6-%h>RT>CqUsX3w_nLB zJMv%UE~%a-f22;%LY5b(2tftO+2X`CD>j^Q(CXd~CmdYXx}hJKV-!c7Mtb$1VtZjo zVqFU6DpB~(-iN~J`36V7{2Or^Q-mC>&|kS~Rqm$8PU+391Bmv-?Er{0WI!Re@i$IW zoY%8}a>B-T!5`73$#8L@(@`Ct+X%4l-Fg>zm<-rj)=ftyjRMS}m(3Fxl{vSw4;fl+ z5NW?saRnJS8(*F_D}Gu8tg7_Dz`!=ZUhwXr)>LCUG>#Y%CFtpKpHcoE0>$&8zhG0V zHl2(3UC_v5)@@=$J_i_W6Kaq#svZ2{rn>)A53{ZCK5g3oSB~*SEeuSFG1w-n{NMsZ zFUxX&vjx^y<AkpsY@dLS-wbk6qV2-jcZ~W0?oELTU_H!3-ma`Y)&8kDl!!6aVxbB* zk6wxp#3<Ogu4Rhh%G$z^MYNx{4-eUvp2u!kBv#z>@&5#-w}3xcD-8$~A+FiFY>X%O z9$LmHnpJi##4`0nN{NK6hK8V3kd}?7ohx15zS}du-h+A6ADn;t9p(3aGe#Iqwu*xu zvNxuUBW|L?OFkp|RSHdlcWpSVz*&?fc{IIC+sjox*NlFs$hpe;bC4JX9w~_`96~jP zFYzfT2phZTH590WPF>OA^tfn(rw2Pec)bbm-A2E24K6T`$pjv6D<2~^&o~9nOahLb zyf!-1G`(5yiN?+{pNCC|bkSa!7@R^JGUPwjc{i4HPn*)BbdkvG6&eNY;~mWalxf4L zbIt-9QHLx<!&VL3UX=RLrE&48YeC^eOLDGDRJPK;NB|RAHd{get=vjLk#p>_n#j4B z0}rWVPW|<^*4hujNJG0S7E2{j3dKn4i)?J3e50rV@}RhsANNKHUj1Oa16ir*(_2Zu z`?sl0TfVbyYDff1bSUBX%~w<umS!~k>q3VXB}Np2R!xGJ@Si_YX_p~Hp9uK+_SIQc z6_zeq6akHdIaqm2uh6+n-lQ}5=CkTi7f>hAK7VpeR9^zZ`OrzaY=v+1pkZ1Q<1N~4 zjvX}>>oeCm>nCFpEN=xw&vx>Z3~qW3mwfW4*%PZi6DeI|YtOY;({C0B*4k0s8$Be6 z8x$(p%UP!^xxQjfau=?|x?e!&e9s($`I*`?V}NOfVbG_+Kf9!M-!<Uzvx@qC;zZWz zh~QJB|59v6{3h31!^<U<XXK+BJ%+jMj0>7ywo*;M@v7A+cKa^D!XaA+5{aI92(3~s z_~W(pD8D9c9)~twVYt+xB*Pg}e1Zy<o6jR&X6uU5sCRCT4A<mHrl`;S7Yr4tgs-Zl zZ7tx?yyZ6@Eg8=z&Eo%=RGc5PM{yeW5u7bdhcDIEw9IpS%GiFLQ_BA;?EhTnBM0Y_ zzB`f=0WP2}@Aipeq)v00eSW@Y@?iXuDME~(d>4=Vu%Gr(@tW%(m%c<e?o2G3E08En z&mZ~e(Y)m25`MNiIyuNo_bLjjTfqzkdknNCzK_n!a|U_yMvyUw(PI3ZID1$3&R01v z`$sI!12MiT@-Ay#kYVf3A}!=|B$|f7eVcgbN?{>|XLc^hh!QZ5gGQ=-j645fb8f&P zGSZbLJW`OHm$2}Rr${d;tgwQK-bB*jUJxh-o$)*?0QR-=UfaR$t!(rS65Y~XB>=FZ zw5`_&V`T~TmBG_BZQNL+_5VygGR|E|#-hwgOlJRLlED$3ufi^8<{(B&cO#M_L3={9 zsPI6a`QFqQIZ5%q(ueT~UjC9R^-my5#RQj_n!z+ZsAP-H=+Ya<e*-b`wK_{Z+%m0# zm;H0P42#KktpJ&)P4b<BRvU2xHwC~%r2$>ZkzXndc*Z7D6P8=p34szeP=gJUxoa|+ z&Hj~#eF&R#o663=V<#(D3PWQB>?x0qw%TPZ`x4)xbT9US;M{s25`s#&bvj*KOaFQ= z!1W|PGJW-VkNEq&0f!Ia<BIzy(d71(MYz!DaRt3OXHe`=Zg8nFV1P&8g9h+n25a{+ zT629v{b&(<)zE^I`YYb_LnbMfwS%r72AO%eJOeHbhio}4jwaq$^R|LsFNW~w462i5 z<ihDoKP9T}d_|uvj=Dxr*@Y;oSd=gRl_RBLE??w<n~1~9>ia9fWx4c-YQBZC4vx}A zro<5CeaD>`u|I2im#QFQ?*(}Ex(D%-Ti!^bDja=qXni^PXCBP#@sk%C5*kdSRSTci zfdUEy`-IH?%^CVNG~6SJvL+=YwmMs7+4wKxbR~O?)4rxi&WskX6~-%_Qav3vdG}%d zp`%i7?Iy?HK-8a++GX>UC_&)2+HuM#?R#e$PpKB|3*B}>Xqs=z1+f52V-ky=zULo> ztUR(%^PBpN?&wRin4x^8EIud#d~hG;wQk{+;au0_PBy-c+{|H()+{-0CwJD=o%MWj z<uy;GAEa;9t|rmjhznRv0lTJDCpw8<;V~|JfxL&k0p?|H!Z1bsI~3i&MG;D-rvI2= zc6-67yJr8D3lcESDyau_t(#$?h^8Bv>j|3>(zqXHBC<%-_UfwD^zaS>*QTg<zC+9! zmc@ST5iu?=qUuK|-9;4`U<uh{jG?@LZ^aDiNyZC`gk<J77huF(5Rt>x7N9(#ZviPF zdDZ@5Xvvt&>|rv?@)#j5l+p9`HuwwFgOl+ELhb?uO=9tIKMw&r#8baw!Q=7+`N<&+ zJa9z87zp1Qy^JW#ABas)A?O2yJT|x*CK~}^Y2)wxAEwtn9`0b9Y?4M~bng7_kzo=Q z!SC7CfpK;G&GLlmj+@f~3*ZA3iMvx!;CPr_k05#Zp0Cvb+VyP0Uf<qSVB?<WE8ug` zC4O?&^+n@G2;Twc^~&X{HV`z^nq>>%eKN#*_pGtgHh0oCC0}ouN$uuY7EUWtLDq3u z4=Y(?<Ht}YWLF}s@}XnF#;{Vm>1DyR5_hmhwDkok(tDQ*enVdT{^|KbH`Z01^x0|G zQTCkNiqF(|I&C&Z@2sc7QL8vHj}tiv!lBur%5JZ{xh1g4O}5l49{cgJ*7S}$^n|_* z#}3!V;>A^OQ^v*~S8%1x9BIPdHmFJqJFnTv#sOUrIQ;D$lQF=~h)4vjy#cS&;Z`h< zp3`bFM&v<otGdp(4mKAY_Q1Xz(tR&!^ht3-;{Dxcza?MzY2op>0a<M(6vefJLqjDm zyHG+|8y`R{H`~<d%jde<LfG1%t83mnT(+pUZ#qrn)@x~oI=FeQ{<+wXxcOVzHD^+2 z1K%`)Ugd+KdPzAUF5xPofq{AtlhEXLexoG?-)o=T+_Gxnt7)EDKbl`#N3)NLi<ttl zCgT@g4eOLvkPDq<DER^!!^^vJT1xUlaR74P_AFo_b2~witPp_QUd2lG{KmuEp4K7q zKFyL8bWd(!>%@d3_e&ON1WAK9`*%^7B`w<Ncx#u;O6yAAj>Uvz+nj)G`<;zqyR*&- zv6vrp3rcR5=>zILh(E@lgY}6>$`if@Ei_vmnt)VCMe~x)BETD}GWB&pS0=;gcwE1I z=?8ETnvjtCh@x*~u*P&(H0MWIXPUVEaMNV}vRvDH?%WL9bPLK8l41fSp+LXbth1({ z(XUWb9@Yg`mU<mx;G5KWpD~L3o?&KFXOiZA&OyxV#dqUs`h6m<dW@#iq)`F3j(?jT zLN}Vl=hfs7iA;9ulP-GCR==k*kI58SbuYl*@b`^2j_JdE`$L#UOl;`rGj}zrUYDTK z8qs8V``Nkh)4lIl8{R08H1bjU?{q#q&w|&@(MDZlS8ksJ_LSovI5$$k-<EA?3WYar zrF*mfpe<A3;P*%k_xdF}=NN|zITFj+#@`UFyK{8_AzQ2)M><g0YIqv&hmW7CsL4R0 z;gG8!87Gp{CRUjdT54FsM7-AQ-RbjjzjH1x&ef5KTo<oUJDlFs+<>@?@U4O?-R(C1 zXNA~c?Uc@RL=rw~rpBl7Lw>_d0;B5X+e`;Xj?98wePD?>+!oRQ4=;qhUvZJ*C;QOs z)z?hZrbwwvapoxLZ`J@L<;}q<(&N{6UQeLTfS4_U={Pv#yp+aOBGFx=Xrq`N&-+*S z#duWFBl-xEq$29w_M4jc8JO)$Jw?n?M^;f2&X0xe2(iZ9oJkx>)+>DvliU#}xZbC* zoZ1~&hk4EN`Ptlbx~_)>{?Z16X_p1~>_yJ{K@6_!yxWo25)5GEE&1?NNE?L2d@3K( z^|~680{oGCxLC-a#pC3c>xnT=4%*uYZ`51wB(V}m7S>jMF7N^N_OHGpL)9X!6-u2q z(4QLW<G!;qlMVrvUru+Ox)iS<$C69<lEU=LVSYA8<~xIc9GKLIsj)e0vHe3L$Az-p z-#->r_zrS;^DsbFZS>T#tCId(PtNM$ys>-Df_K=7@%770+*&T0_d(dCt7hs;hmrbe z)>>+n_zi<ea{K0Cvj~A_$s3LvTcndw7VD2ij*PU!K4_dYXoS@FTc`k<cZmTLD<d-t z1eAyq59uR8rR2Dn!o)ofQ`E5g@Xp6G%Z_61lddr81ycYL3zm#UHKzSK1TnONO=$05 zw)_i>^$~+L&Va*{yv~qmXpstTgQZ0oxOt72FN-4rb?ow?J%I76qx(cA`;flNw&^5F zG$L79-w_FV^c$5)Lcz5+WodVC{GIO4$(=XfmvO&}@5Oxr8i5DOGS87Y$9^F++hMnM z9r~~|-JU>5(N)39Y?GsHyYIg?SABk-?j&2=#j!*+Z((oC@n+5<W5$Oy-EUJiAMn;0 zo+$`?rX{I7g$^^ejjs-(ITkj>31(*I8Xi3P)(W{J)?DFXPSo|S4PXqZGioE-1@5rF zW65Z#TLfrapT}*-*m6uSC+w+iVAm`3bD+26nh}8GsUMG^)!ljqHc*IVWqcp(8bK-A zf&KUSi{~fPo(jDl4*Mqup*OJk!U9QkpX;t<Sx0J!cuJcxv%wffWq5_(gK|XVia-?* z$c2O_b10mj1dwge&|b7omgS1j{h3N!r-qPHVkqYm?6T%Avq7DI-17{X)rw5~B{(DV zH~0jMI+k}1zKetZiF~yK;3F`ITu6emiBug<*IECAW0HAADGS31*zd<rbzBm)U|t;d zAw(~Jx8)J@yQeBAXS3!))A7{PB8ux}iz1ann%2rUdD4kvhaxB;5ZI8o&pgohpl&i{ z0c(k_kk&V(H~wEl({~cWCflA!AHNZrVIZpqPx7Z9ij!MHjD}pOg(2BLy4$4x@61vJ zEqiE{5@3HGGj9oB;Y~K_8rA<0;+=^Gb423B``p)1Fa&)wk2gQBzMp8z#uz`Jjqr#e zXIQ92B0HTcXcW&5F`JPT=@RA!CnZnYjih(BZ$4tbSu4}}l-Hs}rd$RfmP!i^?ITA& z*$<I0T6iD7-`GsD#GInB4G0(4$ZMfODMQ^U|43tA$m?ZqK0zJ_wPh3)4_i*8Vt-q` z!8Bub<aPz)4d@}Tm7qD-cd}=Cfp2bl4G`?><8@UWHg_`GV?;AKLL3M>E_gL4JwVfp zYFBgOqrM}Mqn&GKq(B8|OyDg1+edixc!}!fviCBm8lm4}DR9!h#bz=I&5n@&SZ(GH zkjytR3rUJISq}W5?Myy9l>=bN8xHn6V~gNLdV?BD!Y26m@q<UFnQIU#_>7Pd=Z%ze zQBWkteLLe6Qza+jBoUjG4{TKR-tp#`JpMzqux;AopjcqoO91z))CWxl&L27rcho`) z%|eF*`Z^y@eENGHgIP&b_vv_JJ#W*I-qAwYIM8>K>SeQYQ$9wGn(lh2Vwo>8kSh2C zHf2hLihM@rO>x%;N)D3q?nzNvKIwVmA7mo~o~{8Z+49LH6|pMUK;J1EvgHDbGBgH^ zS{ZA7ZqdF{8ekUMbM`^7Pk8m)?|mz8DsR686`2zA-Y@rGpDQskeRJ73^@!M5(%C7r zlLhDiO^(}TGw|5-LkL_b7D^3?q^*En@7MKD6XvJ;t&U&UAW;a|xKt(Wmwx4q1}X~q zZ9<~_7$mjTsQ6#Nmq{^L^eexKBuMa(Hr>YDMy|xS7$ChRIgda=^G14|5yxI=IA2$Q zTXDAS<Q``GeMav(a{f5@FUqFTlEoE<te+HuRtC1Oj3B8f{tkTVr@|7sFpL7{@SDc- z20HCxR?h!k8Y00>C*PR3ZBaA)qXt-uw+f9Bn4layOk@@KiVAhLk$g=*y%>E9@%qet zwS)m*aJo*eZxs4RXA%1dQ|VhQ9^n+U@1SqzHv2Hnt>7BLTcJetao#xO)jxxy(KF^^ zIGm>&@e!($rXHIe<z>N*WSTfrlR?S|bRq|dMk%)J;LY&+(V=DYslpI7!S+G~A?&ye zbLB<-W^<38N2rp}D4Zq6w9OKK6AkPG%pO3j)^|g8QC`bS>2P!gbQWWHf426Z@bj&P z&eZLD`H+muzGFc-fkBetyB}@%JRVE`UQPTRw^g<T$cHxhVQ>v=<0T0N&(4xzgLkKG zKLiy!audA4KEv3cdoN~==8vcr{a?cgWR=<s!~bmI*uJibEF+a~wd{Ryg~5#{J--1Z zer0H^ZyPZipi*1^F@=xyF;mBTopKVmf;Gqq2+Wwzqo5I!|Cb|lwD6`BK1lHU;g{v6 zpngS2r1EGgo1mU$G=%q1x`kv)+`MyZ5uA2n=y!)oqRoMH%$Ol=iyIZLFy9UTy61z} zm+;46vNwopsb>mTN9Rsqkr)sd9J(&?G|&l`EmO17uu9#8fAsjts8+s5D6A~j-houE z)gtkW&0DJWY9Q%ZzgO!Z;7qpGm>|RRyK%NHs9a5P-9kx2*&xEnkrs9RvKb3xdq^%! z^m3JQ<vP*{_&Z&&LisKLHK`XgQeIprTCYMJfNCDFYEt9CyY{YcYYJcs5QZdheAyLU zm=Irl-aJRTawvXyb*eJcU67JIpb`@Dm)xJo>=fC1ggS~CmfJRz>A>?S{%*}DFg?(S z&yLRnxjZuecHH+zaKB)sN(*Od|DflcLL=23jW@cezb6sh$s<-y%`NS8L-mBkr~B0{ z;<=fU_uIowR2IGeWHOM`=Mf_KBEHfg%k~@8G_i|=*|yQ|3+q^1Y(b9A(`Bh4$i3Y_ z@&q_*{LnC7>>9G|j$yW~z4`Qt^btU4aTbe?{}IlF+vt&B=V;@#v-nREr~$AZ+)@_9 zSPMSCb#2kA3x&-P-+3LqQ|?iP6+gWYs8+fg4h0!JPP~!OCIDx>-+L#83*Ee~i3V9v zRmD$u-SBH!e>Y~EfMdimVHTZufLfe$ZK&@DXv-h>N+DyT{@`MN0Bx7axA;nNkxJsb zTwT#v4~_0mA<$7S|8>I%pMN-aAf6d?%Gvy9oDy=W#%ox+zc_q`wgyIhEv+%!{HxH8 zeq@JDk5`)^vkvH_Q}RzT@E<?1G&-!&JPKYTx$Z<qYC3)z<+^(YJ2@`Z;Hq-e`p*9W z+O(II=jYDkM>1;v@){+&xo5(%EEfvM5u$%|{_C*9aZqr(_Q5KT+TJf`_roNlWVcGw zydRb5EKW4P8U1X((qGRQ-mxgF-^{x=Y245teSXGi!UF_onC38H)rk|T4fH5pGQLKG zd+ub&gqmU$%li2a$OGqUU5t3|@Fh{4WoLK=T!Ae6ih3zR7HpT!+xecXGhvaQKOE0l zg$rAR2C1g<VNSgT_nQ8&k0RyWW4JG>g9_eeJq_L+5BHG=)tzM>9A}6}CWA+Z_G@lk zj3$S*I55iZ#DTNDTy<n0;3hb$E-hOX$=VV`<@0wso$e`5A!Vl*&6EgjuofNrC4*U~ zf`?(@fvMHc2BxrkNlv_9n9!IEf*kZ0hCelxlOm~?0?!E6LsTB&)Nd^pLj6L~gjsYS zpjANUaMi&+d#5?s>2*i~!@EWh^}%CFE-qB591!H9c9_1^XDw&Ns;Z6^+n47&)s4<j zBA>uJm0=TrkS9Vd%Ao|4I)_YdLxSRJ8PNFsZUstFtrL|cs3kZO_6d2ukYjQVaziu} z_a3M&_yQ$GjtHCGM3z7~c+8Q4@|V$>#j$sslpmQl;wzeSi0`&DmJpN}w7cK4LolX$ z1&IA?z%Z~YalpLlU64L{)*LCSQ@Bd`ESx50d{i9tikgO>+0Je|&HZF+)M^Jc9(k?Q z=uvO+0^g~bfXZ!Un5=r_2fpj9(TC%dp3M?TfLTA<mDP<<%;%_<XBT|Nc$$*>@lM$Q zjUq?1wj_S0jV)R`by3gSP{o-@qTYNp0{qWvUvcfm68v1~MoRwV`ARRI(r~AnPQH$) z!vp?JT&gi<NQQ3z&xRR$zM9_YCUZz1vQ-r}d@;ElF&jG+Guhiixx2lwOrF?mdh9WL zKUZWC&#OlSE8ZJIvbf12Z6+?FnCU6{7WyejP*EOQN1NT@6_w9vLqYP6X`>*J^K^Yl z+6C7F#m%_mcXvkdZ5L~8o~CO7?p2<aaI58^G=Eebkt$=HVF|2lcYXC&D#t~8xx^9% zq+&6;=P;HPxe4|Is-Gyd<@#@HXl4Zs{Aj+O44Nc21DS50xWEdJ$)8GClp_*Z&M1HC z7cMT<ZeJP`{2)kl+TJ3apPVHD!<$eyG(ri~ZzOHzvu;hARcwB2!N`#4DKbLfqP>~H zPVQUWU!Q?k5@iA!zNCqMG|Yh^IqmO7aevqaVNd$ZncZUv<D|}oE+29K^@SsrI!c;e z2ZG^&r7`CA9$n7)RH>|5L=9zbw?ftD$F=+KWrq@7jnBO@7CP(oj*pB3P6*`xz`uR2 zw1D0TH0p!?p1+y=hM&`<K!vZ|?H_+A(xw9Ed8U?5*TQ|F0)Z$5g8AT#LO&%Y(vssu zUZ;&1K5hox2l2}|{zOaBO|+ZQ=c9GmV*V+zaB5X`*PdVvQ+Zdl`3N%Q_<L3G@bqxR zhJ-(YDLNS4RKzU8*{Q@GAina8Gx6Ia^(?}E^}}EgJmjCBANo9P!U5$5wjO*ab7x@{ z=ViU9mf=Mt+UtOMt5UvY_>s%5RpvNmG5D|ra#(FpX=8eTD2X#{z9Q3>q;BckNEEkA zz20Rr1hj5Yu*!Yyu03+fMx{w*GQY<yXl-bTNXN!wIu;_TOY_YLfc`di?TWk0>iFbu zS2p|0+tH%8Fg01VVq%yA(fNqY(MUIvuKtsoE&A&^-RZ(6w&X^zo7gm4%b5Wux+_)w ziIIxx<x0#Nk2;h%$y@!0Umfw}Q&*<w$YGA3FoQo>c+7kygA(EP?*xU}3^PN8_(^C) z@z0egQIa;u3Me}$V2d7s1Qn|^<0t`vJzQgrW318<?XG&(_1F2!mhp>eirbc9vMWIT z!=$1j^Yxw@DmI!V6I$CP(3sYlWHdU_qtGOcJBA~p*--a!*ZT7hrR^j2j<tsYPW$+E z0IK@75}?V7%*62O!eK&mUSEa~iUMyeU-?}Zj-c|!CFr;rc!Po}fjIgFehAph-B=fw z#KHSmEQ$}3H;xc;?vo@Ap(F)hG3+0kubDNJPMwt13T6DWx|6OzRwU#tbe5k`CwVAo zRmk)&=&5=`Dr|Al_BxUgXx6+_u8wGdJa^;#aU$jz`mu@=W4F0I^`b932{fAB5^)jc zh!vskX=m62*L<TloH@_365IU?Rnjk-;!y_r&m`2F1lxf=izlgSsIU&Hzb;@Mxf%yw zH5C9O8Ket=jly?{Fkx+l`&-A8ecjr_6@$3dKRmV{Ekcn`<FLFM%7+nqg5@GpTv~WG zU~Qf!(Ld(%vj5C=EZbnMV=%x@`Uuut-66a1aqMmb;diT}Dz))atQ2+LX~$0C<$S1B zc0_4vcc!eHv}-|-D%H5(es<TdN^bcZkbeA)8vWc_+Xb%lUR>utu}?Ii$$4vk3i=hy z(Lv|U$Qwj>^M;9|k7~mjUr^vG-7P7PAxa;GW|40lW;|KE$&(4R*BawQnKa<aH6I&i zw)7YQ#G{7VB)r}*&ydjgw^+I1#T5hiC7X<Cyh{1gN%kbW!jR*Q|GI`Vcv@jvC>Pv5 z-hSn&%`~xCoG3yT!uky??+fJjru#=HjtxM|@iY~w?QVk?=^{+o9?mkyJ^mKR&h=vC zIF99i+xrHU(oJX}yS+bDPL%+a0|x031|psh__E!|oxQ&_50`X^sK8N>)4#vU*+}Ce zG+C41ncd0GFhYc1t~XyGog(FAZ|M#fc60g8JD67!Y5My@iPRK6heCKiU~3&cPNS!3 z_aOc!Gk{t%qVO{9*3%io$r}+X52+pW&Srm?jloyNKQPpd<a^3^0-%JD#lrQ~5H0|e zkC^<Q_$5uTH0V4x)(tMv1!i^DcY80E^~ByXPNeY+cd1P(r7Yv#;>t!mzwCDmj0DdJ zIvIn0=C1VeI0sUszvQLX`P*hK{mJ3q98NhO*(XcYShT2*q9HEb=9`83CD<mOyCShm z%2D38K&x9YmG+{po=DBxk6*!G#y<!ULzkmD289y+T=}S(DIh7-P*p(up-Ke`-574% zD4jo4o?M?DyF=g|cu!ZXYg53Rp(-fKTR?%Pi43iW7SG(ZF1`JTSdmlU=tUzIaQy4a z4kvdZ&>kj{rA{?2dY8^5J0Ef;1k3o5Yk+~_cofwSTO9%;t8&68PPnmfJ(dR8&Jrx6 zLt@}>H@J^dRXOh9f!-uI<@Ohxispnc{*#@&!ElLScL{1-vs0d-yy`4fxDzjoseX1p zxtz)TnsJ~i$hny*hu70><DKAUpny5?9X_*~bo^S`titFq*iZqCX;BLFHfX;lLLfJz zB;loRV0)vvvA(S*vG2bPaRT@bQz13fd4I8$`sbvF>~`<#97E$X_Ru6Pr`nV}Hm_!i z0GS?LjS#G0oK?V>B|pJuU%pt@N4@n+P^gjM0d-UAPH(We57u|~0fp?R#ITmKxM!GN z%J+VSN5&kI`G#?e$}jLyI2vF6$_rM$sye`>fD<on(rIgq_YhD@0R?C&hu!4z2__UU z_^JdotVoz+h--Hoz#*sPbLv&hi~0k|GZ{T9PorY&N3fggw_2de*1iZfa6^BIFo?{+ zK=9$_oPJ2;aIx`o<0GMeY$?0%1bDmFA2n#s*s*t@zchxJxjEbW@kNs#8tL~v+gW(m z3=#{ggKLN0gV@7?odCP9p_CJD_!4>u?#Tnh`d1C0Zo=1M*t1X}l#j)Ep)e0Q=qu-& zopi(Ft}52|28h`Dxy7}Sdh77!XeQ}qE7xV<?YK8hb&`((O@5?D1Wly(9luo+LM|%_ z*aSp58a6e)eH#2_0R47ou85PZLOom>mm!q`!|SrvT5o?qcn)Y4x7(jh2AbZ0w{&Z4 z%EZ=%a$Uiomy(7_sa`H}#M6BJKa!Y2f89~Dqu={1KO;bE2c7FETrvdFA&D=>7c)pq z@(oct@$P451JaEr)MENikW{1NBCYPpdkCZ~2}nj`R0V5zqoI!B<fZIZ;>y2?Ohs}Z zsjgu$_YZz#eE<Zv#fsJBbnK^nrkhaWrkGXJFphCtbmc+>m9ur#6!M%RnQUMnLS3G@ zO|s>cSHh0?e%s#og&N+&MJ)(p7HxJOneW0mU=dtaU8gm)sAy*ja|T4emZR+YdSDg` zPP^R#W9fTHD!*|;U$i8FYAdvW(aWyDRZqFbb_39-HNd^Dv)#;I?&}wnSTBwVE!njf z)7xY=gYG=7@ynyO5Y*e8Y$}!()#DQOCCnqk8q~h??LxD6m;!6FGaU<QRr*+6uGrbt z)zR#Jb|^5AC~;JOZ`B(giB-gcYEM}n6EDxrIA{{6SFAi6&#rzYK@`fOd4;YG`_iDS z_CqMl04O{mv4^88{Zk5skA&i{4@;Ns0T@-hw-|a>h&UY8nW^s}w>F=>r@_{)7l{6i z$-ahZfKa#2@aodVgGpnn>p`UE)*!1&is01hWY-%)Qtqc<&(BG%RnmClCyzUsGmdZ$ z(e8%vhR7>KIIslqG#>L2$|*#S4Y_wN|DAni;AtyIzz?7^%3;gL_HEm)Pfs)%Kf27L z6s4dvfIv6Bd;{@*zo2#rbdC;-^l7?W{A(n&Ll*mtWEE3h?8%SCFt`KH0afpMq6`F! z6K1hX=x|&F_Q>?V`rYXvVc*|zNffMSKKT65OC7>>zAaE?A4g+tWpVJ^9pkUjdpf8B zvT5N5^QBl?a2|$T;Gt@NRD2t9-%rwc-SG4N9@6ge&E5?;z51hxpz(e^{zbn=FQ;^4 zp`8ELhHB6UUMizG{smr~F#s}47ZR0AsaRRgH1<&a^ZUV@vZcROC<?pk`=4<Gel4-2 z?lDMu1ieeKw+;^77)QW~?Cq&<zK}HoFo}3M!OkkPJDbUO<=^zUMwU52$(DGKd&e-U z6EHRH9Ks;`=<Z0tldgb$wJz1NONBhJ<W@hJXRap4h@=ugSKoC0;v7{yf)-uBf|_08 z;55UOu0bu)km*GNPZf{1A_TnxwQT3h1A>c?Z9;GdXF5avUkzFfR2%^9y-C~#mg*zB z03Mg<^UtydDr*`oJp9-Bmmu6WZX}{(q42JTWk&h7{2%5(>HI&>35oB{@_hR#P+#N( zRu+0um#QvYHC!2;(lG`Cbm7}m#@4B?7DUD=#mOCcI!FLI-k$;^&vBEnDg8VKxDf5i zu?anpF3Qcmt?Hn$lyyKph!rtm7CEkQqhi7T`Ve$zKY*nj`9T3e`FBs@GC7>{&pbU1 zxl!?SRXs};&&~__HfWKCGm3tl+!)40y#>hRK@>qkZQFLSZw<XVL?_}m!={P4CS7ZZ zr-_G^7qBs8?b=IJJW0KV*RI-Bm-=xBwMRTlY$XR0jKoBfB18b9)LZY;s|n_W4eu(= zB<8Afop}ZdCTwvC{T;7L*dkUQH*VWq<UvmP^dPPe9XWSaxp11n0_J4LKN4(+tO~v~ zi{kX1TZlGjeD&>loL!aX*pf7S{5$$1p&#PG2aznk<O?YT5BDb#@$BKhB)pPO1D!J+ zJj`Grlbl|H@UQ{z2H7}2hKlSH(>F_#LjIDgnF`vkdKwz<KwC0cbJehD`Ot%kMWIVE zTv5slwKfr&7^8n7w{1Fa@1eX4GDqF+=yIK3=84Sl-x#SL+g#1YDZGzc`ap8G*H=H5 zXuS!1UX<-`*2yl}IUaB25_d#fi~8pJ!zlLHEc0m)I8tDmg`Z3;H+^SI>(r~neK_0W z+926xZl~n=2(<AUb(^+FoxI8~oPajwBB7wBb+rO#{)9d-PrS^d5W|8Wu}5ubF|4OB zrtY`hK8BzAMCsFGp1drn*K1$6d<RDfe}a+c%i>Iz&oPNao>CqPK8<4o`>=&Fh+$Lw zs%e;+hcm#9u0x<Ho(~T%Ksw6RyXG0`quIir8+W_tv1`>V|J5|dxeekb4PCX@Ff&Z- zbTN&)S2?v-n|yTI+b;CT_GbEe{^8NM_OmY1QKLTrJPk8{gaqXZ&qU6fH5^=q=-*|j z+B!;CXDmgXQbLmBX#ap&=Lk8})i-xz9&xf2NfF?ybcdvvIAPLInI;7-=q{F2h$tTG z{l?rer2w^*(nXRbw6vNc!LE`hAjLcSBc^_h>(eBq)y_dO`ZXH=2U=cfmj8rY2!<>| z3O*nu#<pm3JEF?Lxm<)pk={88J$Z2k52x$O_NT58FGr#O;pc}<PHPrwF2;9_^O<DQ zU2-5{mZP(Wnu^8wBo18;gqa2^TWFGY=0{)4jzz%lk;E9=>1u){+(9TRxG>V}V#+;b zY7wH4JbPAgS%LiZuGrg3%009oyvW+uD!LAHOB-m7=DgT?z2^9&9u)~TfoLJZ$6ULR z4O8Y~jEM<h9o3*SGBI^75$I6~Mo%^rDog;Ip?4`2FJg{LQvOTOXHrYPUZ&e(ifwXO zAVla8R<B^jPiE>0^C%7WcoxBYtJ)%u!J>>dP(MJW<oiu2$0bq?>N!Wgg^Y7Z1Ri46 z?A7%$(by+WS!OvGc2{2fivk$1hePQnAswoCHT$0h502?;!E1&`u8DI2<tFR_Zn+Nb zOg8kd!t%XOt|RKNF_=BE(J^=-vgN+cwGg2c8r@kc(u`!Wj0+vp2%VDon&nOI_#S7c z8V$kq^A3%my5xm)M}Ny$sC_<!{d1AiBs>gYRMJKbq00^BS;$@P#js$#|5FB)dH!UE z_|J<l5W!>~HgZTDl#C+$?f@_x>d!Li4e_)cu2isCiUJfOob3q{h{Yv)RS4hF>P&<? z^*bmL_cRff$RW>+AglUh5&K_}PQn<}t`HHuGIE}SSi@p8r#vb*0vm&rrQ_76?mX7M z4B(?u-U6^?q6&CdaGUC9q!iRlD;h%qV6Hy89)CL`vS<iRwzg`#P5^=m@kvmX>kr4^ z5_PBR)&)@WYqtOjYW}ZTwJCQ<l|X1ohvpC^nMn^vD1Ih?K#xcN|IDkR!+awDDGcg- zW}c9avz12#xGo>yhqA;oz3n2_nK2=JY*?Eb;g#&e>gv72zRG4^7AIbGk(r(S2eR|{ zHF##!;Nd4PfFo<*_j-BMe0z-jR=CL^N;p+us;hpqKG~ebVb@2zUOj*Eo;CWOOr^1t z**;oQJLQx%gq9*GDtQcpl2*P*t#R<bgDkI>wYJEND}0{w1VX4b=>l)*&I&5v#4s5} z|6BIa@Rt}hT3Qz`6=6|JV{J<S>wkpMzUF4Y9sUwTj~j>W^vZ^ZEZGxYMvB}81*RA7 zLF4W&ZH?iIP6xH|8$>(|bxaVm4KyRo*Ia6rqf`(;o5VNOqezS3BksxMzx=&D(L<rm z#lB%aBA%}DZByL1N3<Dv*h?(>C{a2Gf^-J1-di!nif@?G7cH>!rcHslJc`BtC$u6E zLUqImxbOeo1wRW_Y_`u^HDj~5&q+Y~URj%sMD|7QN_MH!Gu^SjZKPg2Nce6Gj__}U zl1K-`BzVDal5602Z`0|`e*73%2d}tz=pp)D-6?;>p;4aN-W=%Ey<~qlF_;Q8*k)b~ z*7BpG@1TEp)zZ_~OI2|ZsNV1Q2894bOvU1*u$$GY-^Y&-aBH#k^(cIJy_KKtgY@*C z?w`Jg`rZGrasb2V8eiC~9!gDXL2>V#XG}+ra*%8COm7wsn)J+dhHf`G;*eax8NcYB z3XS_8fP;)52A$RbUGQ80E+zz3NRb<3Q=rw7<#=kP3wEB<OT$G@u2Zkd1khy`*mQaL z+GN*#G2z5X22Oh?<;*eMg*I&>l)+e}B;;mUP7^cswyi|6c$r#XM#04q+)yyyV+olQ z1qxF_kO+vJDbVr-3zkP~%UlJhuZJ0kATI6<+e11)8Tg;0!H$g*#aN=n$zYxob?ZAP zWF#mn<(<yHmupw;9N!&4M)w$zI=uG0Ab{C=ID0e|Kf+V*>=KWpjKIgiln!6t4kjnB z32ROGC7kxYQ&9a`jY8U4<1H5?EZ%b0`(W&;hpAU>Vf$*s4r{=pht)+voWED%=LDzM ztjMJ0Ik#mP9OJzng7WeyXz+v)a@9%^a6(#(;O8%fzx=P=!)qPT1ozJUg)6_s(68jR zV`lrr7X4UbpPz@~dk#DMxFW6Bu2tFO3g(W5#%oBWmwuf8m{$rvB5RpI3YOhKCTUw| zZmV;p9__Z82kY0H9;-~gLtD;frr9p6U9!>dBY4N)osc*sMBGiA;HgyNK;~nxwhsv= zIE_eo6w!QmyK4lX-tH;zoNv3KFfa<+FT5)MeG}QC3OpV=Q`c`Tjw;>V{}Z{QWi%yu z{au6I9v1fi|BN{kpQAzqA-L-<ZC+F+8dOdzQ_5~a$U+;pZ(Q!2hwb7u1S}=L7fdP# z?m^y$eZs@Np^0~LxdqGUl|P&B9SkHr#v&-m_%5nVvZ4VfKo!-gnv!PVPc6J5g`Ke` zIwbWf61JT>n@IH*-N-yI?DPGJIDdVC_s`1g)EeW0?#;xO$LSsZJ%CA4JuEhd+>YpN zIdJA}&!SP{fpbm37ThapRxyA1hTE9!qdyzYW*44nVM}$6xnYxoG$i-EP<S8viZ1mJ z-akkZ!yZ|H<nL7pqvbzF2yur8^fNb>K`;q{LIPR4@u)cTlA`su;V%~h3;sH3B0q(a zBTrOaMphkpj{Ke7axw)^9s5fqY@FA?_5kd>0C%?J=M(sCiNL@g&=@hqiyb}031l;N zEKq1vkmLuCQ~gbp#4W#?C@JRMAb7=o(abpaq_9Ci4I?YUw!OaEuABF|na4nE|G2@p zg-c#}QewyQqRb?F>*1j3EJV3Wjf;DQ*FD0ndG7J2K%qGJw7w(}>adK-?RwGYmi^F? zN<qL8anR$Xo|J5;6KQsXY#JDAD_!acDxYf}dnBM;Ap76Ou&%6JAR9g>LA6%(>@Xew zD;RK=%e=b^#~=3eraq?~E=G|J?D<WiPWi3f<I8*&%;)vw#+0V&njRfai6S^k9L}=h zbK?zt?1m&$SI!|DMsr6&R@fFnd2{I-3u^y$8NUh@6I|QU@PX=zz&5we4<$BW&jUAr zY5h9bbcGU^e)p-1br66U;_phj`Xlj3WdKaEd=sxEg7Avr@@Li;+(RNIh1~ue@71xo z%-|GN;Newy4p*ApinMBq;0!u14TO-WRQv=Ux*AKZjkI2??_3;QQknY=$JE4gsrB}F zmC0hi-CVd*b5oF6894p6iXjtBDSf^)y%!OsYYg;FQW)bUB=2#dWT<?tw<-9e?g}V8 zkuR8Qswl?C|LzOop!{Lc>|oFIbAZ{e<obH#`q|d(iu(t+XPbvK%m~*dgC0)Ftxx77 z<ozC|YK)fMW?}UKmS4Y<=D-{OSnAC1(XdpnT_b(mhox_=E?(RA0SLs>7+?_TYSb#Y zYW7%JCGP3D#%&ay+!<)tJ|B&jaSpKIlH@1LjbsMbGt>z%WkvL@G^9@8kvO*&7!z#K za!fwO@h>QGmA4L{orpw+c>}foh`ek%oBWTl0e(qMQbhWuXyZcH`VSUKYXw$X(Ug$~ z5n*WgbRCn5dM*6mv;3>NPwl3m5aPBShH&7|_D*JD95Vjj77`t~)%%AUW<Z(3iOFE) zv5n1@A>RmHMaSK}H=2iQHo_PVcvaCCu*VKrth?Iz`GJq)5R=}g8p5c6=3wi2@gedu z^oomqFNb$rAhKvMxQH03JEka36z`ghu0rOH43>!INNd0;*-fiSyZ8`~UzFh{rmb|6 z#K1ZzM|9<-c-GeNSwqid4ZucH%QEH<?mIpoiPTzhdQnuvl5oiBU1BT@^an!N=0!-p zG*QJ(y@eR^qd;`%R3_U6Tz<#L&$a*TYYqA^->lg9%NB;x*Cd<`0}GLFM2$+8Vn<oa z<-EvxSbX|Su)$6GPq>LL&EeVPMn_FRNs=$Z=;q_3tbT_<R-=wI9AKd~#^C$$Nk(9I zin@woOq{^`J;vXY?<9p_Ell7+X|B8$La60-kSjoiH>0Mcpk?O`7E!xYP!Vq*`Ak|d zD8&uLCG_KVSOH@Gw`A>bRP<!U_Q3J-<&o0o4m(o!^mPqj5LH8|`(`rG|EHO{u;-gw z-Dr>I){(|%zOzAQE-+o{94#x$5PSa_Gs!S9vSgyn{w$WmdCFre5ie{SJxih99oVVk z=7@aGy&s^8Pl@ipaV^q|^jPyV814D@C_<vf(~w5iFHR|T+{z>fj1RJrKbqs=UfP&D ztz7Q0CYNs|ia7!Sn5j;>1hoJrNT*1m%!cm{gDt}aVN&I}0bqxDsTJ`(Nu-csB9eAd zm-r(-j|M(}zHBk*yf@>RPW`g?E2ve<oMcoIM}1PSs?3W8UR-gDh6+IR7+m5SF7+Wz zhaD*lWjCw6tG?cFsYAY;NnL8L!H!|c@9kBq=x~E^Kha)pb|h?#=)WUmKigYrzP<@T zVOJaR#+9_^24t}qIyD>w@V`~f+e^tIf|kyoz~OWT<l<G&nZ@C*u5z?=m-3zE>;5*B zUO;gED$4#FeHfF~njWl{xwbyPK-tr?guB<1xgVxf35N*0pK)4VE&|IFZ;R6o4xYQT zUQg5af8Tu<*Y|s04;cRXoqsx?Xm3nh!Na>5a6WeF0CbC+3!6m~F|PbLth;J&Y8PO8 z`<fM3y}0t^ZqH^*Y=mW4%++VPkHes0f#2p=9QD`l<OtVHSuXaoM`~ba($!!`*|Ni+ zi}kv6R<gLCzq`$`*Lh&WN^?DvVTN^fV!e)0zh4?A-1zG{$X+&W@SDA5p6UToGtcKm zknV#}z*4=<O)#m0d5a1G>|db+JQJlnZMyR94eR!Ia#0_RXDd0c$B=VwyWdmyQ)@ci z16>1X1_h9|^I(?W3DxQ4(bMgI1tMWNrxA54?<dAsA!d4gTp1ufOEsxqZG+iePX4_g zzI3d<s%{rsd_aWM;hOOG!NOQx_rUrcUZ#RX1|-a}_rEmGV^)hBT4891dGxAQ8{We; z`awdUU#<>dl6q|m?>)ggbo&>WJDILoIC0}9DRG*q+Z8*~a8~2(jCW5dD1BF@1sl<t za^#!~>w!}qm;k-7ZdaqfTl+l(f`v2(o<w6BHQCdH$o|lq#fc@n6Hs`Dk!#?@m1KvD zp{6G{ruf5?j#BX(rg8%m2yNBbh$|9Et*Q~SzkI6!hm95(4I>)FE<66Vky#qdThe<_ zfD@)8&-lZ&=9uagTl%<YeX3F-3!<bUlNN_4dR&RN*4fH)e)7{l2m(NYwPiYBvff1B z;>R2dxst3uAugA)Z@uDxtLxH;Qdx%U2oen<+;EzQ03({sAV#3XS>KXZn9GJ06Rl6H zz@fFyg+c8ZLk6pK_*Jr|{ysP-t29bnNk;q#7I~0zY{lOo(VlA*O`2}S<&A#l=OD(b zlX%;Xza^dO(b-fSe>#9;@kj_F=^OHgudu9$xKW~Rjl2SXX4SI0o7w<}ha>2-Jt~!n zR-@23;#4;%>92MNtdxFM<5Cdvk&j*u$-KmXVz5xUJ}mh3-r<&cyeM~&Ki(}Me`?Rf zu)-tVc?oBVV-b^x(!<;PTF;+N<%Jv;ChkywjRZ6r0u&0I7=Hj<Tv2%PvC_U=Y(f22 zgL&@E5H6)*jH^o|t!`ZpVfuxOvlafb4ibnlYZeaFwrpc0H%x4lXs^9r3z!4JAm7)I zCJv~TQ!}trF)WR+TX0;``*aNrq0JCje{uy>)%1Qv)%E*!CXjyD(srZJsue`ZX>b=` z5__TM<(^dhr>+S6rqAFOekj$gJjWd(5t*0rl+iTJxW_3gyNYkt2^b>P!R=`8OW3cR zL;>0OX&CTjtc<`(0wD&$%Qw6Y60K*lnRQ;^+=g)oMNuPN8nN<Z)8b}kyqM4S7nHu{ zMLST*$MgF6SNNFnWA|^2kMTx+X&&*xqBoC_XW+*RHdzVq#8bi<A$H)VY#>xtnAXQO zi&diIb&)XqD{T3eOm~u=PfeT)RmEAvdNFx$vD&T0-cM+uEbqHj%peKbu9R{wOf}YT zbU7>aT=!1uivh0~wE5@~JSvOQj}5WiNeU#BZ5B&HI8|%-)%_8ecsO(j0vfnSovTYD z0c2;zPSF@ZPxwzfkhY;*JO}bJy-yb83cBZCEL)nr0YNOG<s=DDLi>-6w-r?k1<^@T zCMt1{k4j=~nyPW`f>lDBO5>zR$s!d$F3t!pC)$i!`N>VPcrLb5(xM@eRMgn@GMz_@ z)7Vd&=_M0=fQzN$x(0OZ^>$ha(Tj?2j#$a<)rKCRXYI({hG*ativ!xjFR<KLQ$$_i z)~eRk#4J$!Pl1W|$4mW)q^}=ze#rbISZBIw(`Fi*WAc>@<`$XF?j8F38-I}wEVlXN zCJ4U`?0%1y(O#MZd2_4QU*YeD4a<$TH7RrqOp|BXN{8{;`@mpe-hz}uFy#ulQNr$Z z1TQd}oFYZlVaf98r(NAtV`x35Nq3aH@rH~7caQ6-_xP~@Z}P)w?}uEkj%X0FI+l{i z=dTAZUFYJOOElHIiSl;lk;2*IMY-bq=;o^`i8DjcxkyEn7V3`L>P_ot&ERjK&Pma; zNCKcy7LD~08k9BPLEVYMVHvVbs4GzONPhsbbQ=axRcL7#`FT%q5c#4H<0rfxq3B;d ztyZ8hH);8m1TH-*C+pj$SDGN@9;$K`Y-G@nbxvDmeUGKXyzg9VO2oB_lUF^J-L$Y{ zPsoZcxQ5!c?6~Vu_1+^JTwu}E$T7wYSK9~qlI^pF?6naM+@YJH=qJ5<yYLU%;TXWl z?IvHX#}PMsxiLH(f|g%{KWm6=r{?qI4u3@cF!02BdUkdPho7A@`f-3j==;Jx!B>Vi zc!eTDIBJ53#`W%XeS8bS#V3}(d%eU}FS`|j>SU1lf5`f#;J_KM-Fn-t?RIP1wr$(C z+f8lTHn#27-r9Dzw!Jk@zyF;7>dfROlgwmtk;$X?ef&hrOjzG$1Oz0?EJ)7aVs_fj z1us=uQ*R~x3bWHlTV?uh(GK8F^P<Oq0!}TGE1`x}E>223XS_Qsb9i_K35=H-AeLT! z_Kz^3LN6SFP7x`Ogp-6CZ(+v%KD9z^obp)M#bq5uXJ}uTDt5CoB>@TgB-UWa-@CM` zQ}Q=2?qLHI5RUt?lu7NNx4#4*?uWT|m=+C=tZ`zl=mWP{$UAQLVmxkO7mHDVbxVEu zl8ZgFLJoXP>@4-ycs|zP9BE9_zF~@d0w^8RW+Y0GR!z>+CWvmng`D)%E<VE#BE~|? z*woKL&luLS9L0p5&#}5t#?O<po<eKRaB_yrcZIH{Ls5Q*o0-jLqhveS&1a|0rL)Oi zL()KkXAeouNqyqY92_yssh}W0m`lTvgk<}I{g>&n4h-WpNHYzFPt<$BSPRNFBb>Hm zd)f>RJNHF^<l3`Gcw<AFyVTm>7<V7u5vt&%nuZAf;=Vb0b%WpGaB{zLMm@Mg!&7Zq zQ$?pj9m)CKd4$<QGv~>wgEDCY_&q?EiFq5{$;Sz&GPl$z;Z!`)5suP<f8uw4Ryf-N zsanqO8VW$zNB&R+4&@5RDqTcfCYigMsbU^)^L_Zl=qgqurp?nJ7pa%2O*d6((!V#d zHHk0q>y3~1YOT!3wnA6HoXq{0-^1GxZaPZIQd`K{TQcmN^)#~$u*Jmw4LMfMw*mW> zYT`RmYs6YFn^_HKFi-#k^yAvrrViEVm+{*keTSE3@45t=LgGH7lpA9lFGf(ZnWZ7r zi-Tk%H-Lx5X2&UJ8cvDJA9ZJlz{c_pdLxt3e6u<BkK}T9K4q-b7wU|(^X>Y3g1@jR zCFXRfOcEi3qGrv!;>)AM;Gi+0&okoUu-?|SDWS453W@a+(=a3lgyQw~VbO81?QKzM zT9fM-2=8eAI8~)om6;!`7d&yqgyTaQFR90*WH(|nNctQ;d-bjNCo_6aWwM5uRsY!Q z(AH6uJKMo}{jMnCTmA&eh(GN^PTdtG-}CM`%(DP80CXA_{$@Lm<;(N!6JAx_9%H@u z$efe}=aE67xh6pa;5G=G7V!d0#`c`Rr+w*YJQKlnjC6hF;K&zJQbupxk!58T@~H6D zyS!#>BBXsg8PO*aZRr+N<+uk5N-w-FZI#SO*s|+aC9(*=J}R#p%!QS|5)IhRqC-1G z@35e9Afbn%aS(j6N85;_Ws#(N>ZIB+KmGWZDZ@a{i*S8_rar0TS#V6d;n%}wPPUDQ z6t7WR*&O8(Dif|1Xf}dlZ58c<r!iK|aOX;$M5SKM95#FQ8gqF~J%ZVj6rMZ^WL5Hi zD3t0ya-?tR7U@GNzlW<PrCG^jp_M>~?j_yF)WsmKQ6&rs-Q{O2Yn!d!xNB2E=-|4Z z$e!y=3w<;JXT8npu3_WE*A$)XF_75-Z=tzz{1pH~TyLk#`<b5E!-UqRFSvhn5uwFt zy5G7eT3!sZW&f$$P)@t^Xq7Ey4zyj}QBoZJNGb6wsicB_{Y*{jOoL*`xyAE_*T4mC zzkFF%n$hGARpQ(!nUz<K*JU0;nQpy*2Ojfp#K9#%0NujWS0841#3L-|!Pm`BpfGA9 z$lI@6S%uo1h{%?s(UGm~XK>JxQ2#L^2Y=SkuS#s9dCTOeyt>#Z5=pEeF>A<Vw;=f< z6F2rZxD?{&xFj$zp9oP89%kgSOv@u}!EIAojL7oP*-XTLNO;QP5h~>8><noFPDT{c zg7NAA&G$l85_URrhY8n%{xZCLuzKr44yEo2d8GS3?&hPZtJ$V^a1lWS=Z{vm9qI47 z$U@^Zx8JQAAZVdyz~g*CgqO*J5fk+=&q~d{*YPx6`I1u9;&C+jVVML7|EfAPLut&7 zz321%p`7{Y?sYa*ruI!0GV<MKI-p5ez%P6RkU9`3_}Jpyk9t=;&Z9kY@qxTPL$1s> zP=vfb?rLe({D4%*;QM7C<n*{L*y<MzgjuFC*+0NXCHJe>;-ZaVEFdwK#hTAn$vp|K z(dpV3+P&NzaL>2v4~_kBgeC(Aiy9LJ6~G4F3hGjetQ}SiyGou1!F4{x|DIVV7Q>hh zh=)$Px9}fVs7%W@m1CD{gqI<rZYi~+5%1PZ5z(dx**9#QmXib>VuH;K%PU$p)ADk# zhot|0m9nSFSYe&X`1RBdF<Gr)miqiaV64WEhyF@qhDDYtaQs~4Lr2iNl)@6o_)S1> zQ-2Dd8<?~uJ{j|q$xNeMWfX#mtrkiHu6LUJIK=|oI2tBZ3a(U=URDHZgFmbwU#K{U z=y^9N-g74fs*A@ATO6=brT^{alV$Uk4WZ_Jf0n4HWhzV^gP}ISk5ELFHXJR7>7=W@ z@QdQy9U21x@yJ+Vk57k!6OVBxscl}m;Dfrt5N{bp<A)-Mkm`-Gc>0F;E9y@YaC3!c zA*A0rY)M*=Z7N6zgmyOO81jUD?I=oR7*Ng7LnVEE<AK;efnS^a$pNzuljs+c`sFlJ zHwWE&0)735u^~PHLIFo2K=->g?dzAcf<!oaW1J!JN1}SG%|7V|WfrM2icl0D3BQzq z-&NFM|C-;*RYy)yf|K2fh=f1j>@aLR4wX(Q9%fbDEXPb*AygO06OPLz4*ibcLKe{V zJz(OE=ir{lH_b5M9pO`~zWDc8A6jMWB?Pr9UKI(Gn-HI3Hl-P_;(1k6eQ3+0Q#Ora z6Id7&(<utE7E(iD2-Hn2!C#TIJ&n|;yiB<A$V&HE2;OnT!91_h7xP+R_JVaN%UnYH zLz-V=49I>VdBMHDLqg~CnPmUC_)F<M_Pt+(p0W;g-GvJ0%mg`q1z|21I$U~%Jr$ov z!rJ=EcenG9$){emy9>CNEQ!rlt_(@c4tYWFM(m}U1at`bw*{JhVJa`5kk1as&RP2{ zzsQ3c&IS}+s|EAj-`uG_Lw4u-@cx#kj}3cAoaN*T-<Fh#;Ya8U9_*@(Q|#X7WJHXp zZ+q@uY|7k_!?`1dkh_R3xgL#p-rxHp94n#ki#!~IaB=Q#vFtc>nWOX;oHG58*0Tnw z4M?wC@!`4hh{&Kt-AHU#{JU&w@7h<Y5KpqdUCe!Ee9Tt-(w2E#(lcceowL=LeqsvT z`diaY{GEC`qo$fnVuvxgVu)oo;${9~GV~GOmvec{s3i6W<EMAGh>WN7*U0kNY}q7C zDp$Wh##5g+$ZAO>eOnO!MkFOU_XQP-fw1a;d^{{s3vRrg@s0dxyJ>+SSoW#4jGw<P zrVKAuwxnVfI2`bNl=|(u_dTgCKuwsUXKkbZwjmUbRv3l9YdGdP{zqog>yYT75Jho2 zSWHx};BT#8e*TQeoc``aEZ5#R-phR_gMu&Zw4WfiT}hb;Ln4~yN%3kRAk&))WHvk{ zh(gQFtM15FMr3v5=4n4Jq+U>&w0d!qrN7FcNS446j20zQQUzJ>)b}J_SBmZguE1HB z^aZIjb2#mtK{c~PqQoinU>WpW7Cau`^!_-^4wTfT+cP>9tS}608NTh7;vz28b8IBL zX&^IBfjQ*yQ}8F&jNmksjP6|oocWD+Hz|}c#~2%1LMX1a>y^9=VeYQ{SU-Hh!jXqk z9*NefY8<x9q8g?#90Y<7nm&ZemXR@{pFLdt3Jir(ITqO<;w`xWt+yAC2qb^c-u$Py zp0~w--Mf5Vehs{T_0<}h-zoV$q)qb&&XEO^2alv9P}U%RK?{BCvWQm!<9!SS`+CG~ zy-y0z-EjfygBl69Pd+Tzv-JG9(#5C|^rQ#|Hr>3knTMNQ^aGW!)1dXNWWp`hp!0`5 z#d=T~WETQXRld1h61dguYb`3CW=vfJGW3yDLrFxp>P7RX0@Wwqo3`(+EW<kuk)C&z zMfP!sfi+Mpt|bGJ{aOuRP0l`_p*x9AVJsU-cb+E+huENq_!4>^$&0A1kjS})-XkoL zI0>aU0Ed`irZFIN#K5G>!1h!G&!d+z<?GB1v>|jPN`r0*>A9*hctw>=c;C0@t=zzY z!<jFLifXgHT~F56qph4;J2rq!&eln#(Y%0CMD;*~i=apIqz4$N{53dy`T^>}YXjS% zjnF+%W*IdN8l8&sAFY~VJaV3?ij$C=H6HNpP`R?jm^dNU?~U|4cb;ludDibom9HLu z8Pcygd{pCpRwX)erG7PqI4wB*=4f6q6Dxks=y~IYb}RpLOY2WEgLwOnsu^8;1-S~Z z1*Aw|ibD!qGmz90zmu~4#<S**vEuGMuR4xRKmn)PNc#Qzwnj1v*?DO=*_w5?wMjs8 zrftMwk;kr=Ax>N_plqhff#*a|uTo>)+Apg!85VoDtbGPD`#-l+o3JI_-Mjbjv2qJR z)tXEO4rbotb@1hBY)nc$)RC3^mFlbYR4K>)%TWb9Ql9l_>Ry_0SM%C>gz<T+pYE6o z-Wr*G>|v9R8%k6)I~^T9>r_3@4-jEad}RmP(CA1Hd-%@RF-V4G^WFc|{eCJ~>FslK zeR<xUKZ14jjTIl>t9OG6!<oH-X|J2&FPvw>`FWg|S2W*{;1)VmX2FEUACK1AY&~O% z_?H?uH$S>5^+TH~8tK||3`d%T<BI$@I<|al6=Bu=oS2m2yYlC9_!>hX+VbWqc?%P5 z^IYKF)GT<fz>Dr92X11KLWRJ&{jDtg`7F6WhjQh;aY%f*QX`VQmUk*ZA!s{G5BpM^ z$r}tnO`Q8$Ivbm(91qv0<hMfc+0Wm7!o>j~k_|Op_xigo=2P4g{6=~(-Wk-y(^O`p z1)r^)!z8P@cKxI49>}^I{H2Mi85)mVYUz_VEh<4KA66p>PCgo7GvXf#_`PeW!dr0e z4|aW4EU#rd!VU&`@a?pw17X4PL~+%%lU<kFnyLMpZ)``54$mIY4j$K24c!^f$(2CN z`Q2YqXMNd(>W+;6SPmBCBAEPIn@4%$d|G%*v6(bx_t?hHdfROrwGc`xe51yLiJYk4 zKeaoJRCgzTxh3gBm`nHKt|-g4P?Ex9>o$1^i<1xhMJ#Liv^qiO-w-eBkn2$YX4W!j z0ZyBrY7LCCOy2*D{3w;}KXL-8H~^{xU1oG($rA=KCN!C6m{)8U^Jj6Si<yFNyh}St zAgsEGCQ^#K`DO~yUsC+Bf7G*A45DSLTUv3>=g?K$#e8!kRd`j`i$Y@*|GefYGjMvP zb^m23i-!cr-wN6^x+S&a==}O*YjR8C45!cGAgi+{bLGlLMK>pn?1SerCk2ESg=Rf- z$ah)Mdx2WLFMTU)=scS<SQ%B<@I;5s295583KPs?Oc4wrsU2l<L?*s5IV>X1$Ge0p z{n%n`Kq&m1alZ}d@<L;^@j6R)4s||?i_5}k<EeOVmp~#o7qh!Q38Q^t110LCVIpUQ zELjdXBym+^OZG=y+~E|WC2#?z?0|Vm*n;qQNgyDG9|^Ny+Aum#0_XK@Zz=yy(P$4E zKAB^|pbyX`xw}*{d+NKi9u<!Y?sS+(Ym;@?%urN2XC$mh3^x8@2F+$yn@aB2CGWRl zPlX2A3cHoTb;g>h*<OwiX9?BGqE75+Dt)Q~Me&Q$zT~gzp#-|c4G??vO_H{@CnDtN z84GXKR*G~a;DI)B=0qKPYXAZ2B|Sumd+YD$(AEo`$pTLJi^Wsil{HPdbC;^a%=gRz z`U^I1Ar18ZWpf*f@~X}1D~8h)gg(?+-`7oLgko0V)YCROX`{;j#Le8Cew5c7%Jiu3 z5HFpZi;a)r03L{Y--c50A$Le1CH^m$+hH-P5K!T+*0)%%ps|oL9cC>_KwzRb^2z1V zQPt`ov9NuZJshs%71Mu%WXnHh$}*BM#Uq&OiLX}iXRb1Fmueidl7}NzpX3dP1bOJ{ zv)1=u0(ZA-wdC34m^SFITFjGfVCv`Jajr|yjRx8@GBw_Q2w5%Cjh4rc{r!)Dou$By zvW3%l@GB5YPX3U#B}-ASM!^ws&ZTOL#GNDKFXp&aWn3+=AkGfm{88<B{GU&f8}w$g z9CU_pe2Mc=*_$VYlkudfS)Hfgnc8o{6kv_@<oa&I>XOQ_1tPU$Ih6}elX);Aj)T$w zWb2ZNu%kzOC*d3K6>iZM?ydW7bbH%Da*Y_ULnO^{?%GcM?B-8qlV-|TeAotXXFCrP zH#m<#(-J^PFPfYBcA%T@Upmg@*8aMX&|KjwUk;;YqcFxm>2nu>)kr#%;9RkB74Hvo za?Z3UHxHI2sVCA_3MAg~e894uv2v{jCQBXdA0@iDux!0CJeoQyGA*N2ETxz<+mTh_ zCs;V*X+}*F!~2=`g^E@k5YVm5I&?n<!~#e&7lOkktOq6r3ysVtlSfMi*CIDXpG&!g zKA6!l>rW?x^z}C?xdeY0H*@_*&rE`;r#ft2!%&N;vJI++c;|cE<L`!RUi*PilSzJU zebCUO{8ewS4(C#{d0xRI-q=#w0wYVblFf^I1oj+g$S5!~6HOvgdcvBN_YkKf6nUjl zYsT0~qUCV#^v0iTW|HVxdP~-KND~R};SOmnm%iF=f};h!#uq!-jd}c}EyaI{3yun% zMmRLL;Zet**Y!cC5Wfk|GL!>g5^fKhyHFtvivJFV<w7#e{$);v(Nbp{+*~0|8Z#J$ z7TZQ_4B3mV238iE&$7rpIX}~7TNiq>8~kd>Q9J#!LE^+<xn78H5{CLjP+h$RwPp5A zM*5a7N$g-T%?*U(@5W1hnS5@#wbJ~X)QEBdzq}*Io>_thmr>H>L!u~fqCE6z=JJp6 zWtm;IZ)Ft>eKJ)zhBHd8Unh}#kVDZDU)%GB>R&R8V4_d&=4P3lKrgnxGY0M@`%KLb zB=7#lJ6A6sE(@6w6k2ht6ve6UiKRz5+34!AYQ4AezFMTGO?}MenPU-h{8*_zol@*E zb5316=N^j@K9e(ZM2rl8=wqMHy1O!>nn|IiZvPmJvJQ+>JJ@*Te6c2*pV>2rAPO$F zJc$C^M`ppnh&GXt=I?7M_A(!<!t(6W0HW1xAVsx|u<v$3P&`mc#F!EnR|ZABJ0AW( z6R$e$8)^0{-B82NC{Wn5`C#&83L4xeS=+GC=YSuz0hLc?#y$+d)GF4XkgQY(J5-T) zN5Zn*&3_!wJtmC8&=O3;Afj>S2Ieg&tn7jT|8vR-V?V@4x0p-_=eJQ7%m<to6*b*+ zJ`xvi5(KG&rcflbP&xZ}j|jCS5k9hNe4uoo@UX*k4c}iX3Q10mVAuvvt6+_oG0Xgk zVrm%~q33WqsvSUzn5>>y`K`A5QS8p>f<K!a7^C9IAZ`qc%?~D648=Q;VD6LV0k@2A z{GxqUj*ehyNFX(^cqENm0k0|S)kdv6!9S6En>jB$ay2*ONt@QLI_t>GpB0IFOen8B zqTzmq8HosG<BfSddE~}l*%rB+KG&lNaB3TB^aHb^!9Y;+q!XxkF)rKZ#_{xTAEuWH z&4*NzPU;hy4i!sl4~m(G%puUFB|Tr~<OmSsJ`#F`t}caIA*-Qc)=5d_1WhI?3AXs` z5awgf$~7*OA14`Q#IKc4;Pui)z#2!@qooF%15&yXh>G1185>I|mFgBjScOuEf%$}} zL)!OIb$~}zAV&N0VvcM)eYm;}4B?pJau$|Ifxp+31%J=GWA!-Fo#~Ennz7gHKGW_k zDl#XIJarvRtHjOnOBf&W`uJ<2yL>mj4HeqpUYd8F!J^6Y;E`DUYV6Ss`m$<Bq%*Di z|B2*3I8T4Nb)-LCItyU{Ln6~7M%F!AMP`k-ZSt^uGFwFoGjV0T0i<ZH;n?HDDAt!C za%ghFCI))6<qlU$pQg#wMyC=CAxCn&s-rhFGO;o!zenrbj~t3f=Nl(yL@zZkZM-Uf z(hTQ(aJ{tr+W`+0kcm~W*NDhHIBs~sX1;3y?-mzJ9o(39uUH8MVBkuoeVAOzV_V*z zp5MUWX<h%9=IRRLP$j@;PEPd-<)W%hGh^SZ=ZA)tk-)w~VZ866B|YA_y7KZji%Ts~ zrSQF&E3awnfXAGB3U8fi%f(QjF<wQ&wj42NoO|+N6&yKta#(U0aWgYcoZ!R5srH%I z;Nh?PCKmw8K0(hM7X7*TyBDEs{39cdoY)Zp*?+FZTjX1y+Zt>>%WtPB`G0EKhqinn z%Qe~oScdyAYU_BNzkK>oExO5`Nk>eY*%J1w@$O|78?3`u#gEeni)nvT85|~^-F9SJ zY1(+26V|lJddQ6PFLo9)qr|-5@(-B$VSy%D(3?c4#KhbZH8#T-%hPZxJ|^i6tVy>+ zB}%qTq-6b~%%Qi^9ceB{gj`597AmcMw3>-ydhX6F<p)|{Qz@%8VrUGJ?LUoB?WDB4 zQ%GFEmzkH3OMt(pPCm59!V|i39+ylB+gq08Wf9zKz-&|bDHSU-Xanl}{s0>D(2G_O zE*E-nM!qFV;wA{QZGitg!h<6JJ3&Y$#ssM+A_ZImbQI*+>G6HhSB@^*yL~LQF-gNb zr-E>8b0DU+c73YclNNLYtYcB9CV^>FQ=b|bAgTIm8XkEh-#-KQd4q4l>5#N4GBz8? zS5=3W2G)5sXlS(+W5Qtl6jH@TySNS4IHR-7Q)2|UbVRc`mxh0PbfP2h%Gpg|BZ&Y- z{>ddkfr6a3VYi5=-9~VgNP08n-KD!+`m05nIIO{CP-90n4JEg-D*J$<ee5UrPl7-o zQ7eO*GBVS7W|1^vsG>xDMkBHj1qrva{K!{zbzIRRKEG2n4>eh%H^$7D6qTC2yrR<> z8|IsZRV5!DI|8jX$fOl+Dd|=eOyQ$Y;)v43W2yFfkkD}XQIm+Wd9uWQH69)^jq(e- zKYi<v?_=e-5+Re_5y=X8)&TGB6O|WWjUzsv#a~=(K+pl1&rXq4qDogqnX00!R)e1x zO^Cc4BtL(uX*^T$G>R2hz)M{hz0x;NW=`duX6;F=7_Tjyy>VSGmX@CM8eVzye59bw zhq#QjGW1Ku>ED}J)lqU-39N(VBpg`_YX^>~R{?i+J}oM>f+elOsgN93!p~xW6Ek3K z{>i`>bhxX@(xXoLTs+x4ozw7#&(O3)Q{#XN_S@d>y$TM#bi?#SFk@K)r6bkbu#{JL zSMWvLpAySpuNe7kp6o@8%I^ip=GQfOO9M92{55n`C@Y}BT3+$W=fp`nok+bQamxdZ zRx{6_q%-+<7Y_<s*Z;N#0!piae3$8RLct1pXt#yH`w0sFDQhKicK+4gv7cpHSG?yC zicwExb?825;?;!&kYqtAk@a-y^~s1Qd|aP%7hbhFKn8GybzPFW6v+oK)>a*dBf^y& zKXppaw^4F5_$~j|K)R4AnKunhvJNidS%-@e?QZ=A+73O}B}v`fkTVb{<SM_MQ>mU8 z#Je$tlyx=N`_l}{B%{)PKZaBkq!zP65Q8XGEN7z~z%u)!$b0EqB3zA)sR@tt4ihLH z8`xih!M@6TUsx*^8+Jzqa*!kgkA&Wil((%jidOco{@zc~TI_rK$%#C;dqjSqz4x4) zf``sZNH({66p8b=_2ORu<~0S4Zm$&FJ$k!uJ{7)BCDYHG)Jk52T+JwpQ(Oi^swohM z$xRECXJbco<U^lHg)OiInRb^Hma1V|q>k9-y#Q3~1D{zA1*a2THYvFxtKz91$x3&u zu7ujo!_8kLto38x2CEk?p*vIwo1Ren7mTjA)Th9`=`Toc*D5Ap)aafKZfl^|rE|M* z4IR>nRv1jy-HVS-YG#=+cgvXiIXb30w4l~#pKXa!OEt@ioQ$q;gvmZp*7&~J>d*$u zS9fA9id4U!Qc4hgAQf%W=xBKX8PN}(q{TYeRBURd6j^CivAw^iC`tF<FQe;6+17r{ zm)`--KFv=eC9OUHbVsz>wydKyjqONmC)S+f2Y%tsV5jWa7#IwS&##rDkwF-l*N3O> zLEQc4=D5_BkJF_i;aOUg0^&O=Wl|$^l7TnfC)$fBV}4ZnPnXLcAZ%C7Yx1<Czq%`B z(BdDMJ*Jo1grj^O(FojMcQxs?1iyID3C-gaF@v$|?LkA}ILPs0XLXyhU~oD1wf1~P z<Dh6!pu!QNa~**on!6vg%ku~IU$&JEP7n7BLbXk7Q~b=X^tPx~r4slkZb?JpE_hAt zf%ulMjv_HD%RSms1y~1!X!k0iR$=xZDuQIU#*~LUTLn}XQ_zCjvaMmsQ6Dm?k!+ON zL8VjQ2f)z)L^@39E5zG)_+8=Hq5>J83qE`7^xxkQiAk|)g!~pZtFIaA3?-wO?waA| zx+$CC;%K+vv7JszHR<v7?VNb>G_H;=<w{9Bkt0efd2F#a)PaT<8q%S+;f8RhmdzhM zl02<+jT%8%9kO7YCMgclZ^W|CcU%Zge>52fZzoTHIfZQe!dosZ_u(%2Tv$BPBv!4d zv@<$qQLxm28smk)U=;BwMYPS~C>G3nD7sYWfk~07=efrms$pWI^XXS7b^m>jxDX@9 zkG%o?-)Yw@sH6}=pw3-pK2(#iA?rVppp>*=?E2|j5xXi2fqYUP93-(BN5Acs9?z72 zVoKux>4I9(-=-IEB`g+Ow`g-7&#-c`SI0!{hvVTz%f@{_Ye^CpriBGp$%k~L(UmBl zDT1(0MD=c@e&^p5iBi&fZ7Bk5iN=9a7|dWK6{!c95-`P_U>axo8W?0waS|MZI3?tF z6O#*R=Bn}!iivPP>A-^qnu(KA6jgc#AkxMGPGwZEZ-g?o<T3?*Hz<zzs?_44#*4zA z2lOAXa+SkTRetvfA3cxR#bG<FUFPG~kk9g1`P(kVa2bjXYFp|Fw~*-rHl~8p&T(&; zkTY_$aITl<Q~C^!ev$4M)wa_fr;B4x=l3Ky06(@qUS4kg82|sui#v0?*uH?&ZELpc zemdUavnBn{2IKm+!eS(c$QO&xm$zB&Ho^Y+q^OUZQLfpauHK=4pz}YMKd)E0hx;vv z`@mVs)pt|yIxu4r-U7Qs-3BMtAW;7dBjyR@4w&>8B4aj)9S%CY!`@%*Arj7vo<QPg zYLZUJNi1cseJ8!1|K@pA4cr0@G)$Jt<71-6QM4n(WY_sHlf1Z!N<3QJ?>fP5@J_uL z-pY^Pw@6l16;~}D9*~dx9+6!-&;1<hOnvEYnZlPiYqRuXpW@HOoJ}oPaK3d>9ifq$ zbYhEBK4H`|`h0akyFl6r^ydnz(wd&riPYCwPB9*y$gQjN3p>m)s(;zkeT(0F2B;)Z z8dZG7`B1_sRl?;(8`)rwH;&OdKB}Wxe%&!OR$s^IS5MsRi%iNY$>#KxS|^dE4q8@} zF_DWt!FDuv2l$9$TIA8u+r}kJ^5lrOc;zb|5#<M5_Wi>b$IVL$kJzINVzNfyj>)Dp zA8*s2nIe?A7{CD2es2Yi{FkOCZ^OXxKkm40Yw^F=@3;fe^<Ow*YE0r1T^4NOYR50_ z>K#*{#aCAZA#S7^G(`|y_F3K*5owp_sp_s@%SB;#`5==wdU5S0JEUitJa9D0J1!3e zCU8eXE(h23=w<o1SRog)OrWnZ?J5$kOz@3IOZi99Jc%3p1_SV{J*@MT%~6P3P?Iuv zDg9?gAv7j-bUXTzidR<#>XkHzg=bA=<kdy(w?RFjLgYO-PK(M%TC%RWl><Dq3ak>d ziI$+?usas%vSYZI(xb)k2OJ(wEx?JMRE2c%5nc3s6lbIexru5&iJA`xQyHSYJ$T0! zBjFA8jI`V6x&(|gO{Uq3{anTNjAeb@5WyQD<Mb!?2{+uuOLEcqZw=5Cj!p?eebxD; z;0Rhs6uy?~q|y*fBZGOq9WF8Ym-%4bB9B?DMwff!i40$3pSL=F<=~R|T%c@*Kjdjk z2(Rq74cCz>%hbuKV=WR5gA2JHD8U2d4h&`Reo%fCEdy$OEO_7zD3&0{iZ1z8!R^wN z9nzNfYa0Y~mtOXDvRQEqts_PAjob>Wb?T*RG=nX<T7}Z>R7`cW)W7h3KuO15UoK1$ zlnbRtu=EQ&$4)=IiDc;0u68Z^f1xX6DV{hixt#iV^D9s4z-0g0(=AO%Mh_md3(%qy z`A|=FqXi;Xvu}N)C_Dq+LL|qTtP`RlB9wvy)%{!e@BdX(20k)EB6vJ8WOCkC(fo;s zD>X&m9*QErcWLyRp6k~XBx-hR2b0|+*8?^G$=hFvbrGKE++bm4J%M~73#obZGMHtY z7Pe@Ghe7Tj-^@0PlVwct1WLN_Xy6tggV}m*m<A98!NNlvazYIgs_a;6WxJJ_IG$J( z>z_=F#V+x1wyLcY4LV($b^4XyI%T%()62a<-+Hc`Jn|IUWxnx<I;_fYUSQf@TQP2) zGOH_Bl46d?@!X4{zI~McwQRYqew8d8>CoFTg1y>u<tk4z698g=B%7WZ^5?NM*NclD zJOSu?aoiI>+JX$}ZuCQYtu|S6>%XpanLr~>-Vjb3OKCwgvdK_`_QR<01)gF(>N+RG z!EEs(UzL@_!&IkjW1{b|MMxxkUfY;{L)fICUeUwTxxnS6)D_2T%IqTQs?jMv0CUQ> z_k6kelKM3>UtYuZ;t+lO2p^uwS6eU80GT_qP(Mvvo^yb|C2(@kRF5sEcwEr!kA2g9 zADla<MSk72w0*8czOWpBgpFPWdl(%E760;!1;*w`|59jPuJ03HL`>v~dLnMcxf8_q zd1wA=L#2_{WxV@g=UXoP5Im<0ycNh*9h|+(#s5iBoqGPls<R}nGc9;9`M?KIqC<rd zbC$O7`Mn;K_gR@_Jh=2q@aocVx{{s1F89y^<@AQ|1iAj|54{B*c==vQ7_;{gDAUs` zthFdih;I(8w-pBe**1?xD`3UU<xi?c5LK~&WZem3ABSvrI)|(_fxyZ6hog?Dzh?9E zq;MuLZfG*d-DR&`i*)|P9c~98g8JB7h@ao`&(lhP<7&e~SbsN~c0%ARZ}}Qx_K3No zXDL2z3;#}s2Z6z_AT4-8m=(@e&Y0}4s3~Be^UKIHtCxEJsy2Y!I`$AI9VF|Kp#H9H zjJ3s)-9f!a=mX`=pRWwpbOX}1;2)mpXSD75;*bIE=OE8!%thvnh4~hs^UKffACd03 z&0pJ1c0}B#;RI@aRrpggYw>0s7b@=GdQSwV@L#s&1{TtzZ9KU}3{uf`KDhyoLB{Of zJ)~+6#Lk;vGC6<RG}{nK??5vO>(GeDNOv?xnWcEDpj=Gtu^z42Y_?ix1G(BP-~E>3 zUGVy!>~;+e?h#dv5m{HD0!?U5<TLyEN{R0$hOA8ux3*4{I1-uR=E2-!8i!J!G!9Ng zQ{&;={j&STkpA>~$dV%Q0vCSjC|5nxczMB$O~E3I;<TRdX$uyrJv^hg9h_HHuyFEp z7*KuOt=U&2qV1J&X?S90!#i_q+BPHQ&v)!EvOt*n17VBG6$J};juNME!6{fpnV_92 zVXP~em1^Runw9E)sp|HST2SNXU0ewp;$N5TNNC<Sk&W@Qv_xr1t#SyIfss4i4H!j7 zWaW;aX`Ms-Z3oXdcT5@$!3Unhd+dJpZf{Cm&Jh@dP&64;a3lY*XG(23W8>z7QGZ9J zB2>$AO3`AO;sgc6^L63j8|0cAi3Ng_D`m$r&>Si3Huo*OW_F}cIF!j>C|GofN=O{< zo;UnkTR58B9>FMFDJ|!HmKoM`DOJp7FXAvHp6zog^-MK)zL4!MdVO}ruo;0Z#-BzN zk0#2=QvCqU_~aB$8T@_go%oUI?D$_o2`e{~9uuM6^%sz86Xt`|hfTft$dpe-jDPYg z@g3?MTlAOnUs$GQBNLI3PQi-X<$OAYMKI^7N*z<p4(^KG3y0V8?#F$$Su;QJ*W)q0 z*6yHk;2_Lf`0^XB?#|)@FT8#JH!scN6+Hbyi(LXFZ61zsLIm08=_5z_MWHK#Rdzj* zVc4f1w2460N^V2k<#sKCY`F6$=QQLb*(6Ch)hLU$ml$jYg%)SrNS(F0PJ_?iDS;Mh z4zAM70J~%wYNo1ImMW@&!%w2X?LI}muCh5>a;k2dkANBKwLk=I$*NNWF8c3Dy-Hn+ z_0jO6(k_|iJw}>+_>*tLC+uV|xQU6q8eOJ8me&A_0lC%r@!5<6DRnUWN=CMa-R@KG zrVzQg)vkf;m?XcDlNkTP)x}Lo-N_HvCV&p^Sj#381)WEN3K~oq#sI78+#H?S;#MRa zBE^2l*z6c3ECa5j^4I?$KWSG!#xF$+FPUgn_HPUTowY9!m+U6px3`zHb29pT^Bm#^ zFu&<(*^@&%Cg*}MkhSiV^IYQmwd71R_0g7ED7SKvP2j2!-3>k0Z`!QncufpEvGY-D z3m}h6CEX1<4>+)_yCa3=*`r{fINGC8Pn_4%456jV{98w#UNh*1afK4p^d~fxEcUDQ zdAXw|0C^*Xmw+{<*D+}>OuFrh#y?B}`h8>M)CcxA>iEmXkF?Xtv)%ut&ioSOAk$Hu zpzBNUkAyOB14}M=b?W>&UCKV#GHD&`)myqRI>yC9yS6&7L#J(Suh3+x+q!I=2e}Dh zzNQ42`U{X9E@{m_+|cENxf=M^^UO_qsXUjUx~T1nR?Ekk9Cf10O|wE3K}vvF(m%1E zI7&be*-aMaOl|n+$VK1#-ckjW##qFN@6P_w*|H=j0XVm}s`#xJ<8Q7E%l(2`2CA06 zj6ybB5ApYG=D`}|wxNzcNh8I*x?HVN8=JS(;?>N`*4z*KI9n(F2Smq5Je>{r0nIP3 zBi&lU$+0}Xyu%WLd$wJjdO|=D^^$`t*qQj!)cUg#gW=T(`lUX6*A-;s=QbWrHZOG2 zMYxS3*+j~Pe#$)<uosi`1Nx>s|0cS8TdaD^7$jc{v0!^>YZwfq=2jv_Tp`@+nku=S zI&a6aanVNT=$yRu=*K?D4h)rVgAuED&GsJYqe%}aj~a4uL2@5OpdRoX49C!-_=Y*u zwpElOg)&;|sE4gQC^+d7nG%p6Mi8^BK%~2{59dee(!W3ehbvN*q#~UZ=4r4&Pma|a z_>qYF^NCzoYlL<*Phl$Px1XvM14mdf3zFuPE)D%}$6WprFnmQk?=M|1t27ONF>>yL z)p{-v&aCz6jk_uSO&)0ZYtOroD9nWMd9x8w4~DKWUp`Cinu$@jqJ<v-uqLY}tN6-P zig)xKd@vVxXQS{ZbZw}==QmXxp6!+n;98(m)^qlf4OiKCEdP4kFdC$b-AUl}-&qoC zYVYhO(<nX0*@w?e6L+fGxWHe4&6+nW;fxt@X8hOFqMG6D)ePY5t*SKDf%DL=b%Ai0 z#z3BnEvm5u<=+-ue3eeJ-6_xDosJyhmXiz5rfcde$C8$)#oAw(%V3DfrTx4B^tL>f z@bWzRI&d6I8Kj$-)yI5Mjux6_VaPztYn%J~c;W29U>mTsGLz0qO~GFN^DUEZ1Ak>D z<~dh#BO-fX04n#@L;Jn0i{%1vPrT$;o#gSs-5xV1Ex4pYC~DPisQkxcHc`X4cox47 zW%5{dg~3;t+jA~UDFO~KHpIKkU_54T2`RvO_50|5YCr^jg<%Ub@y<h5=7(S1Qiw*f z|6qm2;j(Hxa0exOXw#V>P3C8i!TRcyhYtYRl3YF&0EjX@ZoH)H9g&Q|0J%SBwXh6* z1GbfeVGS+%)2yEC1|gd*qRrc-T7lSp#x!kVYRY}QqMlX;?bi}*#o*SD)*jpYtbaEm zAn43EZ#)B*b!qOSmT;jPPPMIkN=`-p<G@0kadD#lj$;=HEg`+#Whe*bv9MsVHHhvP zc}W9S=pTJ`t85MYWkeIK$O>Zi`vuKOu+Jbrl0Q9r3&mHb8E5mTOL1H@HC>=0O8=i@ z0D|?(<E7b6rDMg}0ZUoIy>{zjZy?^|mk-L?p&otFT~T)tNQK|Ycj3-on;OsLdlsW? zjgpZZi6#scBk!WSPA7bm9}xS@{*(ixNHYb?Hob?W1RHE1??x9M%9zpZ@J7UTh7z>S z5k9<~G?+(r7~&hu_9Z!No;^{!nmka2K(2bhPr-}asKH<t{XTj+%k_4hz_^%QJ|1Z6 zhj*#1VeFK&iu=XKy$aSDfOPZYki|%R>)%mqUmN%HhwdMpz;%+KZVnvA#ZN^*w@gcY zf6!4Y;FXh(W+v^sqI$eumHdGG>fPu!%w##p*yK&Yi|w*FL;T})A&v(ykOf?egaTDQ zf~LP0#|cp*QA9V}TU6<uBM3sMgF$>Dz61Yx!!FbdG;dcmm<uHHH730gu@1{m0uSBY zZE~c4U#spZRaBg7ija>NbBBRSVU)~P>iQ$6?2e`ssgk;2Gj?W6(BYejjjNvu96#n~ zeq_)5Mj!`F@f4X)`5k)h5ca<DGo<Ay<x!)<qAh=+A$IT`0i(?P!4Hsz;bW}dr~{C5 zOKdq|i@|JR-CswjqYn$5;nR};76DEtjO^+?-_aVHpTwJ2FcQB}7hscwK#fXI-D3)o zC4~vgy-Un}6JTlO)Ezn`&Y6CCuP0eOuR#&CS$aVa)&9f*=Nc0C0FsmjuVI`I3*U`{ z9VJGy!bYg-uBY$2%`pr8k5gf}uG)<G?13WA9}gBc`C=j86g*rbDNj-r1w_^<J|`TZ z+FjC)D_fsk?yKk~9T<d5vf1f$ba#H(xzGt`+DK;ynFb?^g`s*P3f=k#(vLDkYG`)v zTf}$Llp^$PS~qBRj%}HSa=cisG1;jgo~ODFLcW`=cR7DIo3|0KjqY!;`MBM&99g5P zlSxX~pNO<muyirC*J_hpC|-?m{ajY>cOk~>lpSyXN3z;%IzYqy`8&w7Pp0(KLxwFf zMCc{_GL&#|)9EaK@9N+)5A&-ddmAsG0Lc%G^>_((Os6nm<te)8kNsCxWg!UPwP+Q6 z9#Y9h)H1xjaJ?Y`-2L~1|3*+vD-BMQWc<GGQH~zq@*PM@t4=c`N(Lmm-@Jx-ysVOW zy^qg*!XtQA00!As4x?8+pEnP0$|b{oWeyNGe1keI=6C*<7V`^i*X>e^FDhaZrkSg= z{L=-3>kWtKduCr@Q3X|m`Pfa%&!VLIUwNQ9)`rj@65!apq-jUj@xGpjx11lCNfJ-b z#9q9)*!5UrO2kvT5XA4{6e>jp_lzBF9&_oO9`>sF0LCBF2Op_ux?o--DB|1G{%Ju( zjBiN@1#Iby+UvMdv0FYgtj2<fb+{Xs-{WI>R)i9u=m;)`F=uWZD!+0lr0#7i)aVUg zFR=wU%qa6Ir~GmhyiGb$h?3K!!j~6NBz~7scJ^&6or$LsF<UcIb>y=_#<cj519eh& z=PW1z&Rb!|W^_SsZ<(<V@r7G{1X>7y=~D~e9a9HN@^QDoBqH;O5+C4D)bAnwbV@ga z-Amoa+;e}|84D7YZ=IQsk=BcZun5z(C_F7(XZj4KI;TTTcDDm$_OsLb4!sO3?}s-G zBQ>9A_j5{CsWsl1mOd-=j)&{+P{?VxkT%<Zz|+OzxjwnkgsZxNatmP?+=bfbrJ575 z+4g;<1OMTi8w;8wcUwO-i~MGv#NAkwDNb%43PBn~>59?C9EB%i>k;Jqf+cA6>A4%6 zfqJ=J5W>xl)Vz-PGicnJ&d3N99n5pV{l5na<gUw4UK~yyF~FU24PY_1{Gun7S!N5A zv9QqSC?~lqD|+5}v*OCW{$47TX{|&yC{0Kq+eM6sA)F&|e!9yiSxec;$m2V!O@>c2 zQ6{_2SrI~a)fP=Igf6dgWmUrfOLUY}A6-Y8rQ%jY!V#iS5L3pf1haG_cdmHmm?#g8 zqkN4FMbYRl5huxZwI7&k!cd6FzZL~zj0-pH%RX0laHAq_2^s!?^C%o&5?2>OJqCp_ zN%twX)O=0K4DTWG?@~jYMgBU?AxY5R*<#H7PH1+F?zUp|PRv7-k=(ChxgueEuhpT@ zKA6ana7=2}zx@2sSIu&aZ*+?}fo>E1DO)ilQ`HzA3t>urC>pr{5;#}Hv;YOLQRDrK zJT3y6jrnV**O_2co1(g^^k>3X*kTTsQ0`h3P23iz%Ms$c^F`L4bBLFYEmp}=XY9qi zRCFju%bc43G_Ns@#+~yT`=Xe?ycMJ0>{@!#{z<$|Y_Xf{EDdX*bF5Z#MPMBh9O$j@ za(!AU><M_kxu8EuCK3o7xt$&G(ppV^xPR-AF2a0q|Lp>s#Wzq;LJSXupgpYRM;N?& zD7*&7{)arlqqrz%I=@5cpZbkcvJl}BCL&bQUs45_WVbeu^@;CBMZXUiQJLNUZuAPO z!$d-`<IK(q(Tx$*ge{GA%9r$b-I};K4!Y}-5@kaT?vuu*+fL`8-^>01dT}&pOg_wH z%1qcs(ie=G=H>4gnJ$6~ap2%y``9jFO3EaD;ahL2R5VE9nS6^TfQ+5_p*Z7wuDNQ> z$^t7-up-MMPZ=T}*}{EO2>l_Ku;RzITg}V!qgev)M#*a5VYD_jo4jV<Yu^$R`}%O~ z#_x#z`Q6J~wI4_Q`$D)AkcD*834tca%qG3)1mdQ^d4gW(zgfI-fgq|+^?7)Z55kM% zZMSk*DF(}>-7?gJ-;y$V#!2#StOm7~X=0=L1ohn^G07Y8qZE86(2i&{Xs5Y3uBnX5 z0xm8-<m5USG{njhkumCiyC)29G?+Toqs&_3Y-MnA$+#(5c?b~<5JSh$HjbO=-c5ig zxZGV4Ko;LchA?0bKU&Fhb&-xJC_TjJ5)T{u7FyvSy60oLhZ76jISZN&;DBBWYd{Ps z<I>jVBs=grcR<3K6h*9@#-lbujBzU7@+OcfB~>)N?nx0UsjVi-9o|b~BQUxB;ng1Y z+&JDVP5Ik2UpTG-{6u)HS+8^BZiI5V3+3Y`HJEo;DO!*<TEI)VI#ME!OKD8Y^G!mg zEWNZTDQ*r|83xb7xh2ivwmoDkKNLjpBKSRkL;*J`2+g*?x_4`^rkx(^Xntd6cV&5a zkU`Td@s~*oUS`j~DY7m(N%6$!T(9<b{CpZV7cpmpO;P(Ou%(&9nru`jY6giwjdV}r zXTDbZ+?AyI<HJ$w9998DHh(D!+WpU@5tHe_Zhh%D{v0*Z;tmljhK>nl@uy?zcxj)F z)t-zf#AILj5%fJO)-loZNF@(0itz|lWp*Mt1k^$2tlqX6G0wtRa_J`XTiX$?`pff2 zP0MBDo-{^iK%lhPvp?*YRLkXgSb+{FGfdNA4bSW3s~>d4V$Qp3XAGXAVsl(`(bR`# z*4LxrtRA50Hqe`%>Jm38+#l|G5xa|-`lJNVXexN9@>Y4u)`~CB5zYS;xS^a)eIS?M zi&j?<N=!a+&&jhMWX>2j^+~&uF4Sz%bHVz1PRY*#C`s0;C-xP~ViHO1|9F}sAD&~{ zIRokXLeLw$+x|5eVHe>^D2Ufv1=uIMcWkML1f4u{(7Ivs8<R7STx&mowWc7ra$Bi7 z>*KZ$h;76KnvPlgYgfwEoz&DAv#U++H?e~tW3A_PG^^A=MlNpt+)`@5c>a)t#jG^^ zJX?YTJVF`Tq;hRPX=b~^MhNP-Af@8?<~$Yzm;I}i{i8{m?zbNhXwt?JQcW=&iLzED zADIo(ANpJ;2MOz}z0Wg;Fx|C&ZuI_XN2gxzt<zh3hMc<LxBY;JeF%wT4)lwhJNdmv zatu*_ejrt}ObF3M^lHF|ndB}ylttn&SD)(+c#G&p&3CTDC{-@;W&Yq+6z?OAGv7fb zc|u?Mw0W;6l&K`6`D;BVN^1DgDdPTe3L*ZvgUn)5Z#n5O@tkJ4VY7Kc-B;3s)pE8q zg7+uLV)CTTV(ssvw>`CNZ>i(Q;W6bvAHLg+I-$puBRp3^@=&F~QyfbYHvbrN#-ipr zfTsuPArKCMm+ouDvFx8b>CTc~-Kg7aySKy(mm~1B_qD6l?{<9b^TO?RM<5)m;m@O) zl>=KgJ?lA1^PQUwA#pi-rOqn~dh8p<W}Uo`?(W<sK6S<KS2E*nVuz>GrS6S1zQ`tr z4b_+uvl~cD{i(@tF)OgfXnCuJ8b5{tps9A5V4^)P*I{DxV2hE0!#8<nzmli%pV@GO zaWg^NSBL_Wknm__ZEzUq6x1vx#_KN<G4&ELh^`J~!`G-gb~_OkG$pbIahz=1>TFi0 z@m$T%(vLNqA1CT@JJ#y6OWCJ!jp1|iu-w3xmZ<zuZShJ#hY=*-L{yA!7LKkC%%z9~ z!JJ(xx}auxPpyWq3g|OHJrrGf*MV7zN=ApF`oPz!`$yZ<;ZA|ZQlEA9kP~o<Y^m94 z=uuF2d#dk?lWEduXK3*#;}I@)vT-Qj*eu`6K31(_K_YlZw;U5pP8$B9T-U$DXyVa8 z=?_s`)=8DaG>`IxwatGodFJ~CplAr7=^0)Kkd>aPQpIB(Qw@C;l>dA0RBeEFZpQZN zwyDukfM(m;((GR4Bz3WXEON2D<_g}EYT;9+W5rP#grS#UEG%Xz>B9PDLANW1|Aw0y z2}7vlLzy|Q6|=ABiXISBLD6a(NaVwk2Zt*+u;cF?D6_#hL3f0H#Vvvg+*8;6{dKwW zZSOY^o3?2iy~Bacs{z9@B!=H*qXb_sq{&c6?)L93RT{(mGZ=aX+dx<Ya}<uxH{8Py zn~M+6Ig5)GhQaq?3_&{9GBVq$I57PB>!adjb*LOl9JJ&u{)cVYaQy@!f?2g-El67v zw2yHyx{!ar-@;Q{^Y0uUfapUWn-N^f3;I$v+1>Oxnr>%p?Mc~H(}E^>M$hkkH_b=5 zGdw-)x&V(#%VMu<x%eryEj=_9c7&^J#|@!HcDH~@<XE@z$pz(CtLGSa?MTYb99`l7 zh&`j;veOBw0}st{j?m+AJq(rNK3`L9G{+(BulrC5znU`9?0!umz&ANzeWj#;=GEM! z8c9mbQJ|jW>T{iLjF8N3X>*~KR_^G5g;Dbojo582<5*8rB^)EvK~OsBL*jt++quvH z2x}fT0j+m%62(9$l6W=N8C!H}ltvC#>0^d@<b_$1dJ$SH4sY*c+fLRv7)2#<y#RF{ z0!$4ImE%udv`M%?KwaPUZp3pTB*j`pbS#~n;}E~RPrB6_<(b*_{Mdw`!~ON$9uXBw zJL6%l$BKFF0D-JJ_(v>1Iu{8JNjl`^Z%#Cd;E-Ff{%>ZhBitBGPe~EZ#YLGH?TmI< zAW5($!nOEZ0>bzwYd5r8&gXRGSCSfGERe|FtDa+C)!4a_fCt?SJ{$4QQAmSk=A@6! z&K3yQG=HaGR+UPJo*Q%aZo!F)8?_q$iek%CbmIz-`dQ9#tPF%irO;A%)ZKu`iVBZ3 zE+Tl`55r~SZ{ytP%2<x^RTi;BLEY>T!b?WKNqi}X{ZsM7LZN?YGD>kfpkt#}`juAB z<vpNMAQBdG0nbqTT152T{EaO<?fMxmds8eC^?_>4QQt<cdJSz|5^B9@gzTA$B(RFG zWTQ=gC|W3kra+`(iG}%5=l7AX8Y>?`710!oODy}B9$U6FwMkl7p*nuYeKbc(ae*DF zv05Rh$KUm3+eoP=*C+)XGTA+7zR}$dkFoM<BE^Sj0O`QiRaH&~DH^#@=OE^OhWRB` zeSPo9TXQIZThPnHVi`fb^A`&DG{&Io%NwD)in*%o+A{z`{#!=0D7Q>=M9`eL{_&E> zGhfts{=RmC5GE1y^K<zXw;!<cs(r`3W4o)=$GyD0#0d1LrF(TV9WZDpAF0jBom21V z|EL0vzsXYur-XG`d91A_ui3t(cCQiG|M07pjQZrPnuy@yn$``}ZYG$lo`7)>iuF)= zphU$^;o4l+%*ew`<?xW(dh@ke@ffOvLC5=3+RgUZ95P-nRxR%3wfhJ3&k(BdKiFR9 zb~>x5Z>-0{6Hdf1@T1#6s=@yO$v`&0Y^}^Cl(DjPP=B0ajDg`Q(ejYMd@ZmjTZnly zX38FuGJ`FChHK1yGru%Y@AlL#qS*f^VAE>x=7`1hv(CiQ7uXmuGZ2hZdyEdr@($vj zpeHs7MfTuxpfH;hqq^{c78rQ=(8}`s+>%^$a`#fK`xZ-pj&6az%vCT*Me+cCW$Db| zNK%Pawtpv;ms<)!is70ByoU(0IM=z60BolZtRQK^WV87Vu{?IvE5}{HH0vPoZ9!Zz z=y%AXJGGVJxf2l(nFdq>D~#N{BZhbs_YuY3RV$aLhtrNeQzdy-GRQdA|EXQ*FO-(Y zk)}E!F*B4)V5y##1Okhh*f+ia45X^szPr6LU4Jk4%$g3JyRr%+cXwt7I+nf!28yZc z{6k|S^vJsAm>BGnL9W5Uc6d!Kj3Dd7-cW6eg2nusJqs3>9cGFJi}8d~tm`KE3E)V} zzFVzweL8d@Kh~byf)MpOX`t|s=iuOP?#m11FHx-!OV;pjnEVYiWu|u+#t<cI25puK zx_>e3CG=sQG<y9(g9%Fc4ajBd?wI@~p(Crz!$Wl`ZPZL0w)Ila+HJTiNeHxTg`4S9 z#v82ToyMFfrDFcEG-mnCF5&E>O{@;0a#=@Xr7OM8Sj7|t54*s#&J=_{(2*<Gx+X?p z1V_X+|3U07Z0qF@kB&z@GjA`8IjO)^n17h8mp||9oul4#D$CuIqD5(iWZsD?OwBFn zfLbyQZ*Ey9jR`EFu=Z!|;0x^luY@3uKIQ3}2{NcAw)okV)HtD=_>>Q~kg>@hYNKeK z_AF!S86LdT&@V2|FIuN(v&^2TfUel=g_y1|tLWC)23jjc+4mp*coCF^MRrlWG=B*0 z#(j>SB^sgf^mK3B(L0az(E<BUX8mEOf{nV>5NjZQkZ0d46FVeD+OLtuy`j#)`(hSq z#KuP7<PhytBv0yr$_`s+MlrW^UH1lU4gW;sxnbKdPL?(y(;B=jcq%+IAKu4y5kZk} zt`Dcpdb8nplTi)KOZZR@Zj`{)qkqDqy{bXhT*nR@lZv4+G|&bE1E|azHre$1kS*1E z)u1pd&x`VCx$v+Oy7`b?-TAOJh&cA@A-Be-8sw!uAB*inkh@CMh4TJ;*MV8f-v9wa z#i<4T(on#4Z@~bq%=rMqN&~*0C+rnXJdBke@NZsD`45jz!dsAIw`F8R3V*CCX~X)V zLDK)t+3di5oH0W9FVI^N)uAYzE`>kH>rmv-Tn1KqMd*GHC=dCr?GEj6XWZ*;@M=s2 z@NWXj2Oq8}Z{9N&*K9AHViIp5l|%WsQGiBnV`<Xq0(lm2)>elw>kJKhXQ0_8osi?g zDii0HP`>x+LIS$kgg$3OUw>)!;L3R5J8^`jQPI1amUP(?4`Xt{zhQC_KB~4{@TM_# z<nl|d<OmC>NWR#rI5)Jlfj$;$$v(6xA8i)lyc}+jqd;U}B0AHO>B&5`$P0A{kE>C{ zMSfZNzrB9UnFPs`&sTTWYSA>IgRcoI!926+o8RcD?6u+fCOm@Q+kf!vcI~v5OE!1m zkSNES2W;M85SWMYTo40<*gW|MY0&1!pJ^56M{vb*eKFychk_=DyCkTU4D<Ag_zt-- zz6M<<1sD&_fk)om?XBTHFe3}i<aA&RM387p5w*iD^2UT_&?wjhF=F_cxaNQEEEi_k zMb??s_LKV?80hxzJAcoo=#|hWQfA7{1$SXZv~<3CR+Y|F?PV6u*A5E>v%7??p~F(Z z8uLy_e9s*JX3yM{vh5g^fj?ZPB;;s{vcE7LT*WsiEkHT2EN-F37#>!|>CV4lbPpfV zn-K*hs?iuDhwc(gBCMJW9Wx;L(?vYUnDNpbr$7Iuh}`dx{(ohQ5mvdU!tPrzmipv` z%(S=f^&-u1YPY8il4ICQ^t@EH&*GkSWRk0j4tTa~&ZPz*Q2CIyXt@i8!*sE_588Dh zq<p2kuiFC0m!sij5Y}{IjZ5B%v|e}EIg%7*lyRaBtLB|5WK%SB5<92q5^ppIV*5$9 z#&WQcY4ma4Y=6)aDj49|U|C)I!?yyQ$cJRHDa=vh0Jh6s(e<(x?5=<q)ZA}oRx`)! z1Rj26)O-Pi+%PUg1U<*4al`=jJ^AdF2>>QfE{ADl_-}3yrwg387I~jMNu+gR5*a-T zowp!cg670xJ4u67G_1+&O%&s#IV7sBoY<?X-_Hti0e=^88xYuC`~fNEF>D<A!ax{6 ze2Db7u3b8II*bBSr=K*Tzbd%9)!nU4zO^0-ToQ7Afo&vthpga)IH^EOf@TxT`Ef4U zgsy2@84S8(N$!n=gO8FRYlAX_ANV2(v2%`GIyWgPc49ik)3lwt<qa_)e?^OA9Xp&~ zN)_2RvVVr2@!+Guq&!giDLz4SC41mE$>8c1xxBgaVC#WHY!kAJV3p^vfCZ*qyR0RJ zQ^&$IVnVuOX+-`_fx3=eMi<MDfM5+X+pcq;8;6QzhRUx}Dw_&hL#A@{jf`U)ke^P- zR_atIN{EOu-<^q>wR;_9AgUC8x~?2{STWr$GJi3Qy}iG{LxobOlZG-3h9Y`@O`wm0 ze+KL5meDiQe*NJ+{V3>0raEFelJ|DQdy&WjC4BqLR@I=O3wme5GO@7mtMRA(r+t$6 zMW3;O66ExZK#cPG&YshiXJK_%BaNhyUdrVg9X3$XB*y`neK?z3o}QnP>FJc5onMj* z{eSYq#Tn7a<ox17pIoM3VZ<IZJ|f=$mBSqQxjLj|Bvb8DBeM(bUGAXsai`NilA5e4 ziAF78xv5UxXz$78IT`EZ-TCx%cB)S~pc`}Ff^Zxb1vSdjISt-FErR5OlXnJfaMWv) zbsUtAg%xBo$A%Ey{c%YX(n?}(&v({gy?-%Sqo-56_T6L>`6~3^OColGK1Ci>#w)=1 zH??b?Zb7?wLSvc?_s=u^7VN8DG?iM8V?IYw|3V_%Dp`&_<959=7cE*o^KZ+CB!1{d zK<)1qP}1p*yO@T}ZjENhhx#QGZ&UM>SDqI_NNm*N^$tK{G%_VlQqe+MB@wzw1Al#N zRC4cZP!x0&XDwZbbfK6<q4XyhtNJ<>5kVt-EDRDFvR{c>EfXdt8{M)Y8kt(t?8!48 zWI*Yv8M6PHE6@Bpz>Q52-$l_=q`;##X)cX>&yYb8v2LtQ+Ob=5w6I(sMohNaq?H@t zEth7as+lw>dAI(e12C!u7e}>EhJVN>Lo8J=<kB@^R@a=$P|!B=^!z{o7xjVK@6JRC zzc4x%qRTx?8kAie8LL&n<;JmI3kXMMdfu5mC)EI)Vf6g5t0EOe$4SqpcYjxdo`-}6 z*+p({O~<n856VTSVvpiy=wO2BW?29)rj_u}HJ!UFa6IJEnUw1hohL@Y=zq};0#Ie! z{md#)SV#gndDfCwfXH%qSi)gr;rar{sw823sG<Ji(bg9hd1Nzi3)}@75{vb5tlj|H zl$R#$1TyXPWQ&O8nc^Kf3}~)n<P~m9egu&(s5Lj?1{Wz6tqTY76h{F2hm~b#AKt#@ zt$9uBLd`33RGo~}CzOV8dw-}zH84ep9ss#^TbcA9r@a4=)bFr;sch5~3k^laF}NRe z(}RM}r6ktD!`{?BC%-*%k|<&P3d*|vb7wXm5eVim7LZB#$d*f0j9PR+`(Zfb-~{F% zwCEJBrRg@Wjk)i*O?U#c4@}pZV<%s=2q$)lKBm1NJi4%w;+5n&Jb&cK4A&!t3ZFjl zt^%fda9EjqkoxvKP6(l`9R4aBfab+0nHu=0euC*OE^LK>{gs<1Ft7(U4YL_9x5k%X zuLgVRxE5?ggy}rNUK17o3;ve!iH`Y6{jG1Wjc-<gx#WDC*^f1#?a*N;+Y^g9400H( z>@Q5msMs)&&P$;dUVmz8hldq7i}!xWAW9V-9=taG;A1T$*8a85)<OdI+$CpE->@k| zWgXC%V}vF?@gs7g$1wZ2HNP?EU%q2Z1(qme*>{T)RD6X{$n~D_zz$cM)I0#dlC>{^ zW0KBHsEO{};+Y9;)|(CM%tTBl)Ih!PUg@%>l6p^7#2{78On)RD5agl*t5A|B!V`61 zh%ou}aT6pX*PuY+D0$GDPHAs)cfl2in$m4L!N_t^HZL6PSts={)t%Q#y@_+TPXPfC zvro_!-e|%2+n6Yc5ECAKSg~|phRv!i)}DzHl%LStW}V#>=P4PQth1X@G&pc{%XW8T zK?gkgx=!5GiGQ0%R3t|*XdEbo3-E|Yo!#{2wUE?80?{Y7_9V5=gvxiF-ISv{Yf!N- z`TM#@<fO4@5tJHK>>EXDA*qGr|J@&#wAv#EDj-%WDwk0qPf?dl{lNY?JZ@OLWNO|F zQ&57!xkJLe<2ZzGekf8_^Fvj2bww2&pSQcjWiSw$OMfN{X{-;s?S6kV+ArutQk8aJ z)iw`fgzqS-GTf~GV)OpOe}PKRI#`8e*$X)9%DnbZ8Y-$Djo-%^yD9foH}GGWdY_xk zlN{}1OD*WomOQGXIjT4z6`ICKE2cJX(rtJJt_Jxn#P^Bjo%U#=O!R&O&1py6a@4$& z#njS1?tiFG3of9yW44L1z^VA^r%+v^A!3H$o}Nw4&)%QDztqnr|0-|^*w34H#Qt<J z8>oonvY&UFN|>9}9#v{d8i_P}85oPdt(Swba4WSD+q9Y|1tE4uqqep~NzPlqbFSL; zt@QTH@11h5=>xsp5qZ7!l>0qjSi>gPMpN!Pd4Ebc96zzI%Id@WcmM+Y`3$W5%gX=l zHGwHoOA~QtM|@Rkk=+Dns0O<?f;fz*f;qxDnbUL8jnGgI$<+gF8ELRS38>-r9M|7$ z9VsA=(Uk;%B2>h3sJ+X<JDaJ(!RR-SP7E$^8)y#BS{hTC=ZKh@{9O_H!dyRxFr&lK zRDb9KmO1sPPNnQNl|pwZyUu;e&c^v1^_KD!V3MPN$}TbwYVCe1u;p6ob%&j!y^W@& zK;I*r<unVX`Fdj9dO-e{G|5l7MsPCg>0?YQ;vgmQSzUadJGX1J<Qmo5ZU5@J#WEBO zO%`;D*Y@cC_(rpzb;id>R+^KZiyF};aDQ<6TDQ~I5ZR-jt%Yg(*4$XN=CA}8e#Wcm z4!(P$(5&6-C<9S|kcan0)?n_sET)7qMC#ZC1wJm%&f&dCM2#hU`^;F{reKCIs!SD* zoWL)d@{5;NaMcJbfxkn!ka;PWZ}c#_ctB<!&L)?q=VxSkIwfc4m*hgf{BUtbG=Hd8 zxVX?Km$`6GzGqa<Jv?G=Sd_X;kEoolFUAUFs$FVicA>q~lZ+XOFpbiTJDvWKRR5@) zLylUkK!&{0-jmC7GS<nv^XcjARG(&@F0i*)6jZ9jAksPCF#|I=d1ufb3^w(exTbBF zz%wzEwfEL3C?MEaqdH0b9ZBj)sec8`KUTWk?hp~oE|9tAQ_*pO=HD<38neBE(rjhW zRw$T-RhLW4UY<01{Q=EBLYOIpc{9NJ9(=<1;jZVhvo6vFyX-GagO#rc-7*QAH5bk; z-C$i{TLPHoajz$GIrujPT#j9myX;V}baI#dg(<lUNOOBK=ylW$c>}ejDu11+DyBL2 z@s}gwyjs`0{r=HZl3JG__hM-ND&;ld(7cqheQWVhP=WDQ=_258t>4kwLR8AXDZt_C z4zr<U^F~ao@f;rB0v?8VCCGy(T8^guL09kMk=l`E8@|b#=-81sMn*#@u__{lYZBL- zI}p4k3z+U=FUfl4_&)ui>3^AKN>xSdN`nV8MePnA%~fzQ;X^bR6N~;(<(6C1g6(V> zM9&YIpi@Ct=E}J*;4}*%SHeog8eaJ~1q{+IVfM}pQVqGDl2|O8EEIB4&+!Sci}wyg z*cHY@BIO<9a{l9t%R?`OYH(5PK<P02wu{(7*}ho}cFD0%Wq;v<&VS^rtq!%x#+i(f zmw&^^8$Q|t@|G<v(#c!)7pCM5LPM;WG{BwY*07DGc?+p_(!6%uC~UOBWe`Oo^ttC7 zK3Q1adSyHmFn@feI#djahcV9K-!RT;YXg1UV?h3y6+_vCh;dG&Bg2SHx2Fvzh<uk< z)H{#3f&+T=j7;dG6Ms?&-|hiwc^m=~qd)&<&*)#ao{iBTi(yz9o__(@z;w;UAD}PB zu4#N>_u`MBZW&4~ExK-gwQ2^vHY>+1RR1#522)KKq2b>!ju`aS_B6<|h%~|u(+o97 zfGq*KQ(`l;2zwT1+S~Vfk(#IWP|@{dFggb_avx`mps4D2kblVtyA0JyWQ0g@2BraB zjuE(nGYGMm7Him<^!o!vlBp}3Dik?UR=;vw(10z^`pe8a+hjJ-j%FKxjFW&F(Hs!; zcGlT(9(2T`*#w_ff|jGdIg*L7Spc^qtrN#)+?zlFch$ixC@dCO;$6;S+Zi^;rhvur zYj~cuw4<SAL4Og@a@nFQDWX<l_~YEU19vd!{oZ^gc=!*ZzyhV^lKO}0@$u4hZa=Rb zXi;p^7G&tf<v1-NOtCr<xAf8vSxSFvyFX5~C+3eshzG3KG#_*FNMytGK6^e**EGM; z?rUlazd`pkYsG$mAM$8^)NR8kN94wE#2U`Cj#(uJ*nc9yv+<x4^Wbrwd{ki5CpL9I z`k2L?6m5q)s<A{H{L#v^m;OzY5h@d(A?3d8t}RNc>5-}_tX|UftOcJ@!9%~pEN;X} zGqJHG)DhgGFxCC`bJOENsd3M9aH~YXeB{#YLQ?~FNfdML+<^e?7S63ESf?ts!i4>q ziZ7#XHh*tdNrH{l`evKgIXG&!C;L0&Ry>u19W2X;QYM}$U1;w{?pKMm6ReY%-)zxN z)qqJ#<~U=VLOM!}DUQW|c5tAwV}TI%7c(eH7u82`)8`RQ2`3Li9^@{wGMS#Vr$gJP zzDp$}<D}+-ST=zumw#iz@CgFr))o%2p|at|_<x$4>Dj#!mT>+I9=CjYD{v)bWiBE0 z-^va1Rf7}WKz+kw+|z?OB<5$Rd78VXZ+?bKsXJrUJRoz!rp$3=f^-1yT$ytNexO4a z>20x4Au*v~f^idP!-bibycAQUR$}QG{^NB%TtXMAj8sC=MM*q)`S?#M+_1xmFl8&N zSbyPEbQL>*6%x2Xta9t*oKdtFKdQ*6XmSqbI)6_dE-*bOV4!?+StkU*`@oQ87Au2K zkY<OZtMdhUgjpQkC{RgNCCv_`tWyQ3#W6daO8ww!M5C^))rxahb{oFg8P3`gTC8T` zqe|*Dp5=I%8GtHL^W}v5)y#f>ob-G-;eY<Xvtr@CoKP`I$4vJjqF4tHUEJZKA|t-| ze!2L-KK@PJNoSojCJs!Wfgv<!<~>bbJ!R;E1eBT}Zwz%)-$Hq8c0&=)7?~?CH)#fK zoc+!iPwSUBK0^}ikCzu83Uxn@hdsTMYz`ZaJ6ccM<WXY^JEVT7zxFKKv$Obqcz-`= z>R-hyBPG5M1z)rmr%3xvb=DK{=DZr*Q6%Ia1ojnJ%0hc@vSKx?GNUulChd(z3H%Fe z7d2{R9TDky9<t6;ldO#C&l0eiSd-^RgZoEqO&w#GJyu1W#jiN!PfSeEq=8=LnvQ7x zZS8oLZ#g!6V$<;&J^Q?H7O)ig-hW#7v{v=Xa9iwW_-j`%TIrkRk&~?3qtZScLko2u zJqm8n{!f?<HUF}(Xh%U~4wIxzx3Q%G2%9C!;G8J<Osnp<R%{Q{b|*G(yGkOIuMc}i zU2XE{-Bjt|G-U={pC{<mL){FlRDq`XO|!b*>2;5=n{n6t+GJyEa>wyhlYdF8LBWrQ zAwE$)f#bI@p&Hrnf)NcY=#<$XT^%`vm3N!Qw#KJiZ98l$T5`BpHPA-Bk*x%}7<o6& zeJhu~lfh7Z+>MD7OTc&o+ED?(fep>eJMU2IPlp}kMo5gFnWGf>PkDFHo+uOLacn43 znl~R-*6m026M0S8Ps*nQ@_#FxpV|U{v1MOn-2l?#W_JQov!o2VlkVdT=^dQ0>|8}& zb0F-ucp&$t<<jOL=pnP9*&e!s*s!cHUJuM4whhs_Sqg#e7q=cP$6!zmGLy!94nI;W z58Y^V>QWT?g}(>mn9a@Nj25}Px$_RmDQi|E^y9P{>A4*f3D^C&JAWffR2XNq`vWaG zwLu9U%E=$eIO@kefbBBQ6`(la>=!`7ZLqyKsI9WL1bs!jY=hQG$63IJC)YK-wPQ2w z$D+`=J;*aags|ibjckj-5VVvt>>DCOXU*cyVH>h*-onnLSTF7&aqQItd+^w{9QL1v z{{o%Od`MQ74TBv`e}CTMy+mOnsxWV%4wbe(-2l*7X#)T8x-<cEw^2!@30Yb_z<0fA zciO=;^Ldl>5qE-bL=RFuB$cX`qmU$|I7bCCeb`7RR<e+)qLXd~0eeKmqP?B1a3ljg zO|@iBOt?ex)mYt`RL-)FOR@i;-y16fNl-wB<ZT&}AD)M=c7H;5NEYH?ek~g;Nb*L= zqoiVD=|!S`w=?aJbxhmg4KFtW3rkqWog+j-Hoq}kV-7_Ll~NtK={$5aTA5#=Y&?%Z zlUb+Nn;~MmTmqp~;%wMP9*u<d3S07RR512dlh6ZTVt8|F{~Btxrp$}S-q4Ym5A-C! z2s$mAdm41K5q}H;0|Mc3K3#L&Oa(e3_k?9%y6t`!la;<&LFsDJrr{w7L^R@6%bCC( zX#h?bnZiSz{2Vww?Uj_1xa9W+{c$%r3Km<~aO*$=z1vf}Q%PQkgoLX&oVI0tu@Wfp zh`NF92p`H3J_#ouZ6b!uXfZvX)Rs)WWD99<@QRS!fPb11I-WMX7DyH*r5O)tDczFa zKH^sCC`1OYx}<r3W5LjS=o+F#3dZ9>Dx9wA08&8+)q}<&x{KYvfzRAJ3+p<_|MDLV z1~$`%;H>)znEGf8AtG5pNeMS3)?@i2sfW{!K9jZgLBbhFWBs4nh5ix<cO0pqu&ymw zS%O$2`G3Y2$WBqwweN1POc#E3V1z3S@1)O|9D6V^BB<gEPYZHvkZXucJGqhR_E;VF zWyRYiuyK~C2Hbs|B63`Dhi8o*1-hyl7XV9B@2rI=_Z*#;S}x%Qge5q5?DM8>f*tvD zkgRS(36tx>6||sk0us3^%k!IInQ9RJXY1rcOn;Ue_ffm;&NS(3V7n!;oRAw>LBN>+ zVX4+|*qt4vS}OU6u~IGm<E&KcsNJL8ZIr1*E1cCn+u3?!*h?rvK56v&g9gihmp_B3 zY#o$2B|f|bJaY63EC;Ishnf$M?U%3?4-5=$=a7)Tk#Y%CX?8Im|M8c~AyRdSi~^Ei zJAXIhl5k)5qwZxpx<6mtS*u0U1h)^ie!HI8^v!QRsNXd#C^0h@fh))S)^Bh<KrOF~ zH8d7Lr5pJNX&k_>pK0p?$BD6Q1IKV^L@q-qzoKw%Q>N^PQW%#`?iz$Do0qT)?tUUE zjj3$@<9jBMWwUao%0?%UP|+0z<e5X?^nYNT`sx9M?sn|}?gwptNM;|-K#XkHxj&%A zQ1k~jzDog_BEKyC--wbZDS94;+To@c#!%j0AP1nRP8zT<K72BvNoMZZ3Lr`J%(P$g z`vsnnkxKaXnLTA8`xt(x<eBnrHyeN2f7&OBU-X%NadCb@PR|HLJg@KUIc+9r(SKr5 z$a^1?cjp&6xqPFY5tU5N-~FLoT)xxKF3CSnFW-=}i}QaH{r`W^-jd7nIB(K_?(&VE z>A!IbO^(7ZTkX&-GBL>{Z%^M}lI9Gq?(%f{FETy9g!?(an4X?#m-_pI7W`?dlQ-IX zdNpGmE^>N0JJqM0^53luEK6|cRexl0Q-gQLYGw4OpsKBmMxO7iBim*8`@jY}^h?Xu zHqU6Au0kKX92+$fl(Ced6nO8n2;|*0LMibctHTYnzMmo67Ilo25TeBF>c@{+SUAgY z(oiVx0P+439(a+9_CN8XY=knzhwkEY-T4b*;u21arq}b#LA_def*X@^Pk$)N`Y*@y zLYjAVb=vN2dTs+`t@OM7;p1eZSg3&iIAerZsPmZ_L1J_ljTR6`l>!Y(2ZzSvcN}-5 ze2L*vU+ZCNp}kF>2My6irVI03H{>}aceeGPJ2OmDK_G_~nKv73GYq)dY(C4uCmti? zrytCzp`*qvI@HxO=YG2U7k>{y8L5)|7=>N~C5ukJfb&8Ygdn}=xHPoShKg-r#I`oj z$Gr*`GRk4cvaQ(t@e1-U7cc}4(!Gm6jHNk-sg7S5YVyVA!dTGaFDNFV4d5V<Y~*x+ zyE9{Q6h~L23<?WfGpLtc_Yx=`n20v$%36w3KKJ^gq*;jUV5E(bdVdx<{Wjy;f=zHx zyJgzW-SUPQkeH{lcpN*dt)+STZ)6QK+=7n=1z`z+4Q9644zW!W#M*&WqU}L#jLQbM zad#*55VD;C{!QQ&2A%_@z%x4o61_q>{8jcBrVb#a2wBQ6f&UN4Phl=_gE<e1qyc$? zhjEfwyVrq97!kOMIe&}%$BXdCu7hkP1SvCvYvH{}WR?=XJurzF0)#QOlG1>jmH|%% z>7~$|<Sp~n4rpe5a(Q}wMy97zat7(U3;puL#Tn5cb9Zr}PcBnPN#dbP3>H(hkx&;E zp&prPml~N}Xz%pzOs`@Q=^sk3@>)Ao@|{5&Kx3`s5vZ=GXMa)?6#pR$UX7$F9#vf+ z#Ggp(gic@(lo6n|p{~vzcahW~{{0&{!e>F%q<M~L$|5p+oj%UUqZpxv$=_7eUvPXp z;>^HhlAw6LKF^s-@*tQ=BWA+<MJZvn6c7Ej0DsK%8-0Wf8tnmlOk+Sk<68k1jZTeI zd1f!RrS_rS?tiwAWHo2Yh-ih`&+3!y02Xj11K$NsjYrqyrbsJ;T}F@UrfAkQ^XzpZ z_4r1E+{H;_;@r6wWH8Rmdm59Nd;B9#@mTCn<-|%yxpPDF94$F=DI?oPw}l0h1fcMQ zb%N3<A<)l9D>IzfE83FRx_0T5^Kc&oz(0>PAzvI$B7eBMwaK^E!?UR^3D+ZrfzYp! zd&p{y2Z<>tG;A%VTXw2Ec19lmRX%$j9XECZ$f>+%3H5}Th=p7EH+vR(<BVzv<}{W# zmBU|Uf8lsSJy+WY0aQGP;-faHcp{#IJk~XAj#Q|wftS0jbq)N-i->7m*T4hxOw3*) zRu^0Rx__==b?mK;xp~r9!|prN{c1KwKUUWe2MlAqtIzt9YJFuW^o^om9c8=JeI=OC z%<7$3sY9Nnl25I24mqmpHCWM<us)NwMqBGO_>WiLcu7PrB{BDtJKuQ{#``q+H${kB z*K1@45M|h#r`K!L{-Mlr(UL1CA7?TJO?q_bQh%WdOT6TUS{#<wPx@m~)gAxwB7(j{ z7o_a4Yb;U_VNImD*ueWpLNbXas$}-wK7|imS7S6pB5JwaBsEe?)o_tX`N%X-lGl(6 z&`0GH<i&$-rxR$1YSC`trRg?<;nq!f0!>h+Yt6BfuUdo?2V<bEJ$Xz#LRLxf!b^_K zVt+%VP~lU0z5^cFpd)*eti)TM5ZcN)QrQ4BJI)4UvuTg~NA(kQ)4HC&S-e1>K<DnA z7xdgd?q{GMcc6HMmQ#>mf-+mS68t-g_-}oCZG5x%+LI!&pdWG_cjz#b?P$jw2008? z_7|q9MLILpOQ9BCYS5wU+TlqhzMfLTCVzv^Qic+bh#Y*Zg=7y`AXhOekVG$tgoMT% zBQ)`epW+=ohR%o9{KlMrDKc-Fk2U^Sx}gRYyG=L19wb-=_RGru?RBt*quqRV9;j1J zyX65kLKz&BXj=qh0JaW7Ei&{aA^w3ot<8F~VV#+XIT|%kFWi_R1Jza$gM@m!a(|hL zB(_2>I?z~}JP{tW$c#bq>*FR!My^4D#8L8~HJyq!)5*};5F@2suG!hVaQ9H1)H^o3 z`TjZn8G=@e8Q-1y+yOrjvro`_+-N~7a!iy&hzXBAOhqv(X|rlk+A~pt@)Mfdth1Zq zJS9Vub#^lvO%Q;lvY}Hf=zvFG*MEtd{ljk~5d^?(M@K1KfJa2??B+f?Ikk{*qjsL# znPGX0D1}vLH$4U}N@zr@K}9r7>bW_*E}5!JreJ+a2{KKq3TseNgNpdHJUK2Y<uuI5 z`>|vSVx^*T85Qyrb;;CU6A#?OuLkU!RfY}5N=3KQ<8i~{B~$Zen1YHBXMc<f4*7yA zjzjq72a2ue`PY$e9UH9{J^G<i{ko#+87iv&=90-m8tcPuyWijRZwIAQs?zSO+U8-5 z@Et`}hMOfTtf@Qv7Z~^a!TR7W7|#hS9nEY1q@kiJr~G|PRR&y?OHYEp;o!e8wQ-y2 zQ5@}Kt9Pkn=TUuM)nMwV;(y$3Xc{A}*!a`_(>{s)qJJ)MHOOy4zqmNRAg5;p5~_Kp zJ(?&JeSe2xrD#67zO(1P<=8D6t<O7IOf4~C1__usHVps0--}9x^vS?(AH!m{sb1hz zkxAy%HFA~(Zk?Q;y+3__sh>^$Rp1h^pEvJ_{pnyfQ1^C7U7C9bd4H#=gt<v=tfQ8s zkw~+bfwB18dN~*iw^9ps+T}?>h@H`>t?f_}r}-Jxu5YEIBTt`S7d8y(1HIi5dA)pp zQISz*I}CS}JxKzA*Zbjp+)bxm@8gWzTn*e;)!xzGqN?<<d~5NLJkY+{kMy_iguZyN zkGdw&9+p?Bha?CXRe!P0D%?)iVBH%K2=N@(Cnsd4y?w9q7$6oN<7|N(Su0y(g96Nm zg}owPv@0o?KIhRrNW0M}5>Ckqol;3W-fz$XD~_FVY?0O6f&Eq-wS@j94^Mt<`oRu? zOOWRc*`$P80+hf7dfsi<xo_6iasRBNSgCeID_qF`k|y~nrGHr?)kJeHlUYw6>xjT7 zgxWu=i_dfCcFpM^FqU$(YuO5cItEo1tPWnX1e1TEVx_`*4>NgKg-Lq6XQa;pklfe0 zowkNZqy20xOxw5S#;P@kTp;|6SAy!TVL^45_X8DQJUh?Yy^b=F$<8H!+)Q6@Q}@Bw z2BzvCXek8ETz|zY1h}L+%R}!_F3P!-CoTvpW_HxJGSsIsIilR<2V%fVgNU6JG?fV9 zN}}jgyVS_+LVK565i#y``bSb@x+NW_UJ%9{hawS-0A6$k?ZIGEYxrYfja^qEmcTQ+ z31^h>MX8%rF9>7KYk6Q~taQ8GAs*8+`rfSTlY*Cus(+3L!L6(XwZ=OPUX~r*j!8R@ zO2hk+W3J0SMJ76ZwIlqovjfqzN)jaFCftZ+8!Q{PKd>wjg^e^kQ(&h<D3<*BLk$)^ zj5QJPA7|whgTC6HW(u}4Xe+cX<HoR;mc2Y_^!kIq``gFTUOo{X6Kpv$EF)@KK$*9D zK$T?UNPjlX`Hu%QpR}jFF*9)jWv(b4hW(J!JYxR<(pJ%`tKFV9m~6_Xf`cX=#)O}L z!x$laM8)Ho8KG?R5fgr%5n@L!Uxk%@irT7s*5ZO=Y&oi20^w+799dZ2dS&pHWRx|T z#6^rrbCmr_M^)5>EKjH1{%p8;7?WlG<3$Yl4u6$;*_RoUWjxe}0wCXb0s~COo&IpT zp>@FXiH9);;NLI?(54VG4dQVxMVW`UfQc(W8<;LJu6_8OVtjIS=M(1(RLq$-w0)O7 zb8O<@m}I?j_&k|Vb%b<}v`LIfI{mH!X~OW$4w%F=JYVxH<MPJ5HBTD1mhHH2G~2W2 zcYk>D?40k7kiq{e`XVO{(|%ooTM+$w`+P7O4TPd5D2B1<qTAIfHF-W_5o&M-M^G5^ zls-2sS3uQni`v~}kf6Ahz;e_=nP^@K#Dn>rzM^WIFh5fd;fEPKNr(A<G#Y^6UcU=$ zU^p1eg#hh*0pT;#H5Y#vOLOd+#upaEV1J4uDK9TuTf|R49je3eQ_5{{@IzMZI;@Cm z_|CeKWQYnX&;oN>cr6(^qf`?f30GY4Z$hQY^lXMwRevydQWmdSVIB<_pBv&-EVBlG zEBYe&m@AU2z`^NFx;<5SLb5ITpX@mh6W4<no@XuXXh2F(H?&-`ff`Xa5d3lO+<)1A zSWC3|Oz`j@M1f@um6uEL?WNA0V5MQNJA6vs76~hjf<55s@p0wpJ~C|E0r;LdUM5f) z)9GLcv9ju!qm;u|xg&}tducki&>q<E|Bt;Z;cXkq(tm}k7y}t?t3{ob8z!K0Ccw1Q zaFSgN(%FEPX_+0F@{n?Dcklf7eSdXHRb-K(Y>^U+)tH%fNX4Ui^^Wh|&hrww1)t&P zFt0ON$Fb6Oqt$CFc>mY7586N6dA3#8M?sXDoDYtkqsEP0JQ4kRtI=pGc=d96yhsE= zIhA0&%-wrfLv>=z?Q3TaM@H>WK7gQ`h(2V@ptV5qM74rw0qf}H#ApDb4S(D}9k_TL zx<fyo7}Ldk;lrcK_1uO{<VohB*MZ>@L-ovoTqm3ucYizvsGB~CCgxeY*)2`P!o79o zfm4OnDcoX&1~z}X`aF&|CP;s%$~IQL)-EG!SSN;AGh?SqsC?ydn&L-^H3g)?Vw3`K z$%z3%5@8kfpjG6E3_vOFNPllQcc*6#2HSKl?Fvt28DovD6*JyJZNZc6JLeI|kUz)o zg#zBf@Eqp`P2d6N+VQK$#x0;r>~BB;hBLJv11CZpCM$b&HZrD{6&rG3rze`C*Jut} z+jQs_L}IL?=P*_(iA=zJswFNm!V(cC0=xaaqNa>_Uyhn;#spLY0)I~KEzB!G6VJgv zb&}Ns^(7e9sLbrkFU^>4*4=XX5S;(~Gq~&1?+fs{Zs&_92wdL({O?Bx=(g~JpSz7t z^Q_hT`RUGHp581@vD12LdpD;Tl%hvZcTk&kZ-0lrl2iK>)w-QN2IvnY;UTc3wD2vI znH37(bY)Aq3g5)O8Gml7AkttoC!fD&zs@kHj>`Rzhhsp^pCBut!<VnnkEvmmuU>Av zP~@v(UxQAr9H%I4>40eT*HtXUY=s_jT2*|5OItdlcGqm-*sG-Gyws&Flv?>Kovh72 z?QGzhRt5DVHPw_)m}K%yML3AQDG*a-soNDULX9ap6bsj(34a3cBxHb~!a3G2r|JsU zsI|A56jTt;RIcFP(#>D!gQIwjpk_FfQ$|KWr83w{HL$sl&_+G8b8kPR<|u&)q_(Cv zZr06pTQp~D#5ZYd%^Rl|?Mmddt$_~p=r&mZ4UEE)qGQ?*g=`6)r~%lR44_Yej73hN zMc=(qXEa(5UVlhtEczRe97>RJvsK5<zOS9Jz>a;$WzZamVYrV5#t0qrS5aAt5#lyd zt&OW#T+gK?+yu)&l(pvHh=Xah_DZudI$6j$CR2}}{=?!sybeQ^Eoq#4xeD9HHY%&a znD&$y4UV5eN{djg5KNYEz7%RoKv+d7KHhX>$vP)x?|(Oil^Hh7(MY;+O;j6dW8?&; zDT5vmb0$(W5{lbV{1$6O#E)y{Iro)SG8pAbn^oA6QTm1I85OMNhV54zSV}inj47Wz zxNz+MT7rK7AIKw*)SIzqGvAp(i(Yk8mzFvN3Hfzle8l)&P>w2a{Flm01=@11Q5(`< z&o#&UL4TP5g7tI9n=S9EP$1*Xj#1jtJpOC$2Ft`$v}Oq<Rl^Zp^SGhgLRI&vEZRVB z6^@>3(83i*16)0*FP;oi@(;FUFBuM4U!WTgsrfJF*RRK`kW|C~G_(Oga^PdjuPP>p z(E{24l=kYi0Vt=;^HxD4fD$VG6$3O7EHHjCJb(M%398snJWh5Lr`6SF_zLI`82Q2g zMl!yL|9k8=G{{%MU*bO}#^m$mhDP~uzXM)rF@^_hz-cgTHx7s^7n(Q$ZmaodXb?_^ z3g?yvvf~pTWr|tj!G5GM1Q2QhKgFg$hC`UWR4<0Sq&_W5iW2Q5FcLHDhwi^^bx!r- z_J3O)e?t^sS@u5uq8Xey<wZ+OX$D8@0}`wi(%(1<ff5!JdR9=)R9Kz!98e_Ww-pBf z4ix8Qr2#|)A;zO5@eR)GbGcnfg=?c+rPGYF1UeQX3Ahz+r9%(OidG{|p{RZB@~E%0 zB0wyGepLop{1q&@7<!7sj^eXbKq6h9LVx_rulv7YQ@dHo_v$Mgd`twoX?EyCORNKR ztC0%S)*)mav=40uQ`fzy3>S~S3yZKWohKgR?V%(}TR~O~wi#+~vVy9zckEO-<WQ=L zc@k}Z92`OfL4EzO&`>=L`~Yi|oO)uR8$Ele)jm7C(!8+thhmi?cYa0^>MfK~Pk$<_ z7EX-Hw_AU4UqgW>fY%k#Tu6g3&9T`YbrJOO(V}CnqgZ@{<1HNJG@@oCQ(TmE(4Jj1 zQltHGqt#b2`50?F6lZUpm0EX*X$Du&SD;y`u%D!!QzSs2@Nt<AS6rJV=N{F&a|CjQ ztCnJ1vA&9q(iyeP32fA5jKKk48h=NjZwk~xoaNX>t{h7}Hd_18;@|>siWq+&+bHED zRqJ&Uqi)k{SMNpxkyu(t`}kNQO3NwM7qZeqP{d);Dc!=%(z1hGaU4Cvl09hUPGk}k zUm~NN557xzN7*{{Y-wzHYw0X#D!r&#J^)Qw>}0%Vd8)3Lu*|6Tf)ssN&3~(>=U^od z?1?AKvdbDgjRAh@UADgJIKeJ0%(cYiYS`Z)cAZg&gdJ(fDSz?EGB6ZBt_!ww+$|pG zH?ZE&SbR5@3q$WX4BJJ<AhF<BRh|K)V8AXm&WIungP6n)0_XmE?%>sc%cq5LV=ryv z)<?bFt4*2Du$~>F4z34dVSfU&Rdadg7_dn)s2QK`9)lC($$^e;&s!{wJNpN0sJd}H zvY8tkH&_uT+(Y`HF%9;yTjPSpVr;NLLE|hZl5;_0Ml!_{Fl330J)c)s99Q)hj~jxe zs#b1VYupqYSXZ1Oj-bh*2Og1T0#MiGWdby#u6GRoq}co+ni86>+<&3vDfQ-$a;57? zhZ&5vp`CKHaJ=%n_q%ry`UgE5UtN8;GTvVrFc9bV(VL=8x;0b*2&JXxFw5rS`wy4K zhe>i2ztpLoUZ>G(^%Sfl;^SSh0Z+A!xjeIF^e;ydfym#-&l1O@ME4rX3BFS(?x8IE zmo&s1$MVDBhpW;1%YVNcpFTu*pSgNCrcqjBptdT6@J%VzKq@PU7@sOaCJV}QL+vGw zAJjg2oPyMt0QZw|qM#lmDk&zwNq*z~N8|FtCj)T6)p+<RPWaLN51P$RZyT5BuI~lW z(G1f-oYwF&VyL&FUicNLe3ML9Tv|0a&1h`=qyG`Xn!(uk^?$?Y{p9_46n8qcRhtzT zB}mg(8VX{)B~zl~RVp?d2Ft}mbrqiylj&&^a&O_Nl1+wF&+?|&8`vLooArsTzh~I) zm}e$?qf@om{&A^V_1Fb3FLs`3wO*VxM_7e&jdCQ2aZ~;_U;c8M7{CdM5kWkvQi%(4 z#-=J&<`TSUsef8|hV0LJJwgg`5u+T+at9u(62Ia=Y0f|_p*ewhiogjeh@qSnvB*>* zvASOh)<b541MA`&jJ`O9p~nh|x>VJ2g_va*?C?mHQkbru5T!$-ipQ2jhaZA)>fQ5~ zI1{1x)ygM^Y0>r>2^7D7^+h|zn}!|au^3r#$2rC|Qh!gWuO}=mQ9ubcozxx{fq3n2 zN5nLHg2<;4aY@vsHk%vbv)XJHeNci%#Bl?ow6lvm{?d#iR}L2?AYu#+VNT;}Egk_* z_H#<$w8Ki0Mx%390XT7Ido$OYT~ykgZUxs7(HbCsvhbG09!SF_a!Uf7(i8)X%(HP1 zU43}UeScqgL&DMIQ5^U#7Y`|?sVvf>?FKdP5!$rlVst11-EGx-t)YUwT#oNA{MwBh zJcN(0+;z(h6ZGN6Ry`0mqjT1(xA(C-XfLx`-bJX9KO^kr;I|7ua&%@T%E$-^n;CyR z21~=fUclUx{p*Llumx6-k;9jRF|2FbSN__q6n_(dL}<vbMiSqo0gZ25MZI-L#Pu-1 zeogQvFfE={Yn~BLC-`%S930`<9Q+~n%<)b?e?%VzN8<IBq5J&8s9PC8-rVtK%eyKJ zKX7Jv35J<w_=b43Z@Toi_AP8fLwenBQ<m~e7q#A5uhVavTVUdCPJvl=hpdY@fwUOB zUVowO`}?EmXW?&O@GCLtG?GWp{r96&MJKG``EC(!EIkT6gljUtU}dA&ZGC}d<|oDs z23S297ciZ#=6aw}9lv^OPnQe73QxSpd&hUDMZZ3^E>7<G!hZPhF^eN)N{Ux;uVcd) zpu$0guV3F#y0mWtgoew7SxLkR^}0Fi41Y3$Zo3AcNn?ev8u-%qYTUX$L@L}{81)J! z2|aNGG-UV&&5^ygzmplVN>ODFtG}-t@5b?+o8Ro2Gw>bzJI2jR3sYg?yD$;g^^Do< zVGiSO(U4t29#c-9=TrOH&DR}%t7qf@5&D5^f4Xz-or?+-VJ-ZBprHXcxtG`U0Dq7! z_C+o#yK$S@?>pp!#Y!ektguPTRWvb-ZV13Xo~-!rD-1+sJejZ)hy-8@XGXNgDGurY zIoY>yj3AZbVBSd0RQj)85N%>5uaDDOz;%4%(s@G0Enx`Gj^k!3#+|}QP(4us_kLwq zc_W)@@N_8lO$4uD);kU9o?P+cDSxsc&0YuB;Jmi{Dqkz|_d!e+MD(gCebTeiK2Na@ zhy$0<C~OsmLcd-x_J5jsH8Rc`4Xz3wiQO71>^ZB$p2=;BJNA9b<hk5vYFYTWh2cke zn9}&|>cill<6qG%@=sU)qLXI(A3u(Ng~xbn44%78ur{()5s1ewTu@_$A%9C`_!{Er zN+`r5Z!{7r8n4Ll&2D`#YV4!{Qfu*7MH$`%&qP~<wD{KJ(?n~%*Ti-a{1UE=I=#*) z!od*p{KuIGPKr$=^>%aI8OyYW_$CMJR|L|&if8hL7Gh}+;)Ue4L+yNP=lks?WQflq z_$<9z-M5Gwf6+qXMh7zQ`+r(=gbGr9tH|KKZv&NBzTOEff_Vom7UQh0LT=)kE%q2j z=hdcn&h&el!P(<U(>!a*FqilSV=np#sZz<Dh_`xbMYt4=xmapo-wHsdJ$2d>^w17E z4iH?_m@AlS%=NfJIHWZoiw1!rJ0>N@Ty#M7YN`Y-P^U0Uz@ce^<bT|JTDpsyW)E~^ z>-9ZgMSzdU)T}pKwgkq3{x_CG!lS*{V<FU;7838%kktUwYZrFcCs*<%RPb?hW296n zqR0-#owGP$t)%z~cOZ7gf?iz2ytDIgM=Z{rMXCYcbef`Q=;Q)H?jjjA3d*Z;7n&W4 zJ7;kiRx6o0&Ag|-vwwn!r92oaX)xp&m?n;uBZdW4bW5jB#tlHrY+TH@B%snlEgqqE zx-A_sv0x>QBi5?p3a8hWmli?nUKQ>x!oiRumh&J#J(C4xneyu>z*R@ktr?xn($JGx z?D<87jp#``j)&P*rO<AAWU%jqR}!=>=#?ltnI$f;SI~R<Qh(%GE4VB|tqX~9g^(K% zK4@|Dn}YXb!HkGwxRm&5M%0bdLygYuLrg%&2$~kN#X40EuyEhd2*eBp04g<D8_S83 z3^5f)AI4@9iU}gLD3NWx8+JbIU6f$_9-8eGYW?Hlh=l#hI^7AQ6g~7v4?Q}+#?@i3 ztv>{-$>OAvX@5?!brNLgQ5fX2$P7x^4JYmKV7$fHHTE?Qd<c|v`{;dZ+<coZ?jPdL zPgGN@*&g;93Q{1cFy;g|sjud75I{8L@<XIMfcPU^8#|qt#XsR@dYl-t7fHYT_{e1w zxoT6`Zsd58)%EEiSW#H>74c-ks(RW<xZaPcGJ!tnIe#W!_!RAvC*lIKrl*}iaelhO z#eLtIo_6wg<I@L2PdgC@+NP-=AX-XKJ5fxF>uD!XnYuS>mz88O?S!ji)19}63J3MH zlR|_zWoZG??I_#~=t!=hI3l7uZx1o?X=x!@^#X%#$k#=U+7UhN1kzGFn06x0k>jTl zif?fFw|~Z5ufpm3mK8lbOAm5bSEuMf4x#<3sPjQ%E{(Z{TnU#J5}A;cc-l!^f*lnY za6{nI<#&pb#ibeY@Y&P5(nUFF7)pmv%z`2Mw!I}<UM??9F3fGm^#)55T;kM6-a``K z=y{OgoL721p*<u-t2b>Zh=xc=<waPP73WfPz<=$a0&aQ+x1I;7J){|+pC71KJhE>V zhY?EbA?bOL(imGd<?yeHLl*^~>v@p#^Wedr!e;FU-w7Q5hf}d=u4m&sNNL%-qz#&P zX~juDSEPooa4CN|-j$qF4G7Flqhn_*=*2~9HQ0H$BNpe*^n^&{a{BnfBp1mZ6_i)C zl7A`a#qCzf6a-48ZZT(4sdRu_Pl&{tnUti)tWwfQ@v4xhBPm$Q9f--fR^mX3f+%t8 z%Skwh&#tjN>be1nNxsC58^pmedU}7MC|vN$fxbl2o6SyhFqAE|6McU@<@fbT%%U)o zp7Q&OQLpLs$-Z;hX?Kf{&sz0PXQdK|o_~lRztA)r+*(Xh>_C14B8{vC?~T*I^QEIW zxZqXc^?iO}lzduET1Z3-3AcWzJTBf%>?9y=zyw+ZQ2E{a-MiraL4Qs`nu1e-pWTpj z+TPF{jyqe-1ll)y!?dI6(p`8p)XtD}GOE}LbB`7v+jC?1VKh#0Du(<8bzPXF%75cg z#{0|Rhs%%eKYkit4*!*c2t_|{(h)nO?xefTtgd~_<yq2cl0ZgbZqbril1gYEq`Y=C z!P+uO=2u?|A1@EaVx%ahQiJ`Ki-&5G6j1D39ERTrB@22}+s`xNq;u;?NkcEV$$7zz zAcRtlEM6jC%`d)55eR$h^%fys^nWTxxCjSB4l@}YyPD3KsKPt#MyuD{!d)r~5w2|? z#*)H<PeFEA0Y|FwHAOk<5#BmM=evfF%P<JaA?V94e3O^l(<B^#7LX)eKixo|9<CKd z01^so)jKS?>%@DWG`WyAEqhhAnYT8*bEe<J^ic2KQ|Nas;3~B7Y5}*9G=JlSHG;Ec z5%6PJ$MTn;$I^IuLd1fBy|;MxO*QhHj1&TW(p!anN1s=bDlYpc@Wxi2%>GaFioE4n zy=%5cTeznCJ|&-`6ta4;iLk=(qulK<e!KcG_~-anNOT#WuKxA@QXDTI=2s??uX08A zeYrb`C+ztMF?ZO%9BHo+EPw5ipbjjOj8hA0JYJpG6Jy2Hb8L3ngJEM;P^GbjUvT!= z=h6e6TqyXEskCL7AyvX@4H~7OLX;vQ^;VCh2w_a66H@E=Y&!`PQkF>%ii>cuo60)L z;DaQxlrL+;?5om!FDc@=`sT;IE&TsNs{@+CJ250lJmoYZl$O~`l7F6WC8<7DErJyz z{Q9C-asLh5(+eW&mQLoRN#>No;2(o-Pf@5j>Y0;aYZY!GA*f-yW1g9-hnzPhzQNuU z{S8Q&WYE7>1j*yPDaKj?9o5sbj_)u0T9PeI;w$CoA&+%0oo9+VXjUzbUWzlz8hs`D z<E7#lm_}httCi;pB!BC0Jtg{~r2K&snYH(qleqIE$GlwJQF?Cp`1v=@4RpkmRXP3| zM+~)1hup3j@5BtUv~DR$Uoeoy;ac(I8rO#Bw=j|^&2Mu%SYA2ajpI8vzu7Zq;5+tr zyu)f~C2#*j7D{xDXf~TZR1Wc4!~<AE+;S?YjT`SYW0aLKV1I`}JfbfjTWkdRN?Vqt zRbgv}D_CdVyI$>K5r{5dMnHy3Yv=%7DS(WID;0okAWo~U4h>fzJimECZ~5$!W(>j@ z8m<WXg20u8C{)Sdiv64tuEZB&if>XBV(Q}Eq8IN9zMmA`icImgK{Acb8A@5-+1||c zW*3!qr;A{~3V#JCP~(AUNQa52bua`@QcP6tjM~tpCo4=4-(c-RA0a|X{GNtpmtyaq zhPgvk<G&0ysCkd`dG%(2lI`<_F94N5YQGk}fb=t$4}sh9xZUft)vNNfBBxePKg1-1 z{$}4l{KD~pU~@vZ-)+@<t)YUqPrR5LH+Tpiza(q`vkb(fAa{TB1gdvnDrkF~{_b5> zp1Bx<WV66Dw%sF?A_Z#X&j@=t`0c{ijKD2CMbT!%zFz!rB4kmHBdmM-*#I1101se| zXh0jipb)q8K_tC{8$jh7XO-?s=Uiu~bCmW$*0qXFfpIu<f?%ZCZMMf}>Hj5S~W za(V#zBTKeM9%z5bZ@-LvLZuXQ>*yJ^hX@)@Y8t7YV;(eDFefpMoKlp<TeN8`cD!Y+ z923j<IWC~tR|Vp(v3^!eXGi|fIzQ7`%G)oaX)NbOr!|cOvwqf;?gACx;8X;Cgw%pI zjp`}KZB`(ZU}|y%Q!97lazB}L-<N(We#CAlcl~tELaKiO%Az%(Z6OV_-f8q@d2I3H zDU8Qk$Cd4KOehyhWG*I2)=>JSXPkYW0!5DW0Oh(KpzJ!nap^qaBBZ_-xEGb-;?d`x zP6P1~j?xp)?RprzK4zbGweRZ(C~u8g_AQX>XvG`Q$es@&M;V45p?nj87zH;UuO6W+ z!Uc*h;zxfdiyznMf;EV22vP1?50KTUD~KVMdP(E<;yv?awc?u;9H6VPi(ZB8%mXLI zrWcVjc%G5udgzA{K$irx-s+R+GKe*jOu&qp)s%6G@Q#oq43$A}Tu`1|&yBsbYq!3A z??hIeruSEiz~Ng|M3jpWk|TV>QRhs_9k<Z4u9bg*6FB}4r()GmzX2&SyogjrF>eHy zicQ+%VS5$oBk?VhJXB6!#CWXt_QS*cr8@b1X(SV?tg=J-f$>clnIx)Im6Hw*Rz-qR z?CMLWGOQz{Ns|nVRtkRL-q6@ixhzMyltOG&vxG{43}7gwTG%iNw^UfcIx#%E=HCNu z{B(cyc`SxLOA?I;_4Y~wzSKrC6u}j0i*Hf{e0A`y*a2U;54O&Sc4^Hr7spz^?3@_T zM3>6BEu)hH#Nj+ypj5d4O03sXMqa>vOX*l37Ne@o0@l%LBG?8*qF&TO1YK$12jPX# zK<s2p!a4amp{O1YT`!h*an78;Ey^8T4#$6L>&fXQY$5BGlNGjF`h#LVoo=h!tA}z& z^r3QsVxgJXtE^f{IV5TE562M-UcUVtcjer<S$u<-3}q#u>|!9dnXm>a)#@KH;zjc& z8jQ|Bcz)RPi;Cl&e*TDz3M)clkDvho&^@l?LMWdO8Wm+u*@ZTn7yNWP_4ZjeWQ~96 zL-iCgLhKw$jZ@BQgZEVXeKcPXy@6$*B--M5<Gg&0-H|OR6HmN)#ZL&ZBnQg4Qd=D; zD~Yzz*kp}NQB}IeCWs2hUo>B6z5rK_^V=|Aq{SxcIW3TmjdN6V6bU=`Wd>xaml(wZ zGK#(^?!eVldLlFzEK*OUq}WOmzr=q?vX#c{*3I4kkB*k$cfFOS*u{5gmKcTNMZCLr z)@rm?y<%9qaPdXWF6wEQ&=R9K@Iv!l`&wa=^>A5~^~JlJ!sl1-!jF#)vayKmty-_{ zNi|L`UU{_IonC*y(i2#D&_{@hGUcHsau<6dccg|0$<g|uAWR6OVLo6XGvt2{#WR!m z1~ZceE^6akG$zIXd&CseN+~mqwcfS2)>#6Nh5B)Z1kI?Z!&8jY5!Eq2PDgyB6?M4a zKs|<8>ttH&Nd##9SP&zrs;0ukw0E-8Pz+U_<$kzwsA_)yslY;<Cf2UQ`G)C!tPJYY zopbM8RG<uX;r|28Z$(&o>(PII*$w4dxehWzoXU9+EswTI>5Je>V3U%Ps#23A`UpHX ziEp&`pgzJ$5hZW*&E9ar;uAc(h;KBzsLw8BVam$Y)Yt{(?GY77!JK;5hQ$zAaA6%m zI8KFJdZW&0)R8KWNw?Dy!=6;1AS&vxr+T~uOPwKGu<&oFGrjur7kGc>_|?^))2{Lg z!D8Yug&uMaxA+E|t734RcDO+!%x!P0P8g(_*MS<!a_a|_=i)3Fin2F|hEh)u5f#D* zSMQWW*GP0pB*;P)L;fVlQm}#l<?VRTi?>`D*Nzc9`VRW>&i(=azJvchEsVwWAI@|c z7_NsO1u!n#!0Oq!UHE@SVwK+B<RxP=S~X)Z{-6HU_}rM<p0`*U_RURLeprB)QylCO zu}i8_Cx*$~8^>F^Q+r;ugPQ9tof%m8wfZG1_fim1Iia**gEvQ#HRzf7i^m6u6<#}2 z`w>!lPww*0z<B!vi{f<Q`%dt%@PM*Y2R^oZavaZiHf-<4z<+<)a03IeCz53(xB_{l zp`fN&uMf{OJm0>%Hh;d%xR^&S$Hd_m7>P5VNZC;qQjQ+hT7z+F3kJunCH6U$3mlR$ zY7Jr+Ns1rGUJ6HIiC_HIxsO|CN_M#Nj!XB2tR<mOdal~%DTu3a|FEb{?Irazst<M$ z7MsGHMy?B%PQ8Cxk!?J~Bi7C%+Z56tw<wvswIaaF{8pMEe9?@TIWU->7<=Yq`Q00% z560z(PsTs`|2;N7{bOu=?EgBBx&uW&<?zElKmU4Z3_o0c8ee{jyH-Jk7v{*8Omr*9 zDW(L9Ch3YCKYm%E_;GE)R9#jm-ZP&V6yFpm(wZg4=CFTGdYw@e%ed=2GUXsdC<)}% z-B#*%TXpJnbKMp}jZWwxm)sHGq%b;%!b4dGFFBRNASp54lv?@gp)5}u8}WX30Itbi z4(>o?Fd4+E$_RL6mw~g*u4gYD(HED-LPZTi70#g5p0w7JTseg!zQGDdmv3u@gO^Oc zGtg#^i0FSQr*5qqH+Y!aFM^Jd3KtcPkQE|*vFsryTxY{}yDK(SYvJOAD}PSP(lbKw zQ%E!jTolSObX0AjW`%Vr4$tI-LO4|^vg%(<K@#=kAY5>nM1*du-fIo<ND^Fn3^FrW zcu>6YRB-ojU1gedd}Vcl7?OosRgld~d9h;qvD|;e9f+3Si@%CW)1Wrd_~S8vBCG2K z)TKd=Es0eoW~Vc0>_G))Odl(S!)kWh-Bx2&yhC6?=pl!x#W&btJ?ojRehX7i7G*t< zIU`w;n#0th;8AMjuX(dPEdtu_j0eYuTF!gt1`0misdH}Jx<1Gos_%R;VAH^(6BvJ+ zEq{NxsN=#jk9#^_{$jvWR-(4><}ZeA1g<xmJLIn#_I$p0g5QmP-5n8R@7DN%ei8&( z>LyZ#6t5!mkYj1_O@UZCOK&QcrIp1?b`ZET4^`Zt5|yQcDsg7B8k({T98CWxFrSK; zN?y1DRq&4<D@tOtpbvjCOejVT6Gjw1RhfTAPOaJOVZK;4&d+h3H^hyrGiQO8SXU4( zfhAAR@N<}8`P+yr)d#W>8w;Bh4?!Fy_Breg8f1O#Usm^i^g<ATQU4m|_A;x76M#Zm z{@ojvjaM}Uc_d~uLXNtY|3G~fI5Fn-wKE5CzkT$+L2Hh86G>2L!w-@{x6P>$cs_r6 zIWZcM@GCQUsGM61e<_4NaQ}2b_E8$YhJHSQT9P?LG{6(Mp4-#!l`t$)PZylf@XZAb z7Y(1b6cT|3tA-D*-ZfW$I6iLFMcZdSU40&hk6ebkmPZ4ku@UvIzg}zW3wHts*KI{F zoM-;VS-U>2?;+QevEMIeeqfA9q>F#2Mzh%+cE;*a!#YiphjQ^iA_JVYyJv&8f((E` zA5=Dq`Kq!60V3XyayCz{?@maLQWD?ewVtZ(pPVM{EyBPNgs9Er159EekU^VCmP_Tu zM4L$;g-KArNSjHhQBux^SSJQZzWTP(iX4%Nx#B6{Lp^uK<zaFh0Ckzy&Xa%bL#>#% zFgyp!yB4=(EMWB*S9;-ONw6vm3%gMH%YVjnI`|Tatj~Y+Yy=J&HHXJT3OAmnwvQ|0 zqoA5<7F@>1l^q>$Wonjz8C}Mw%lOuAhA!i~s5su~=Z}@2$-I4%c8(cwtIPOcZi+7B zi<a@_k3+IF5pc(Hye1U#36_636vb?Inv<@ADGlpy(5VnUcu6i_*KEQvxV7cfHJc#w zC8*hn)@+tU-pj7+=g{_Z1(S{(-?{nCo;d^GvA+XKL<mTm0e(GINkVtJbQd@ufgc}h zz>?g$ymVLFfODTQ0G`&b0squ>FDk>uqwhMtap^pv2Ks`GS(STxr3HWdkc889+H#)Y zi??HHI3Rzi3pv()A}ZwgNf*2c(4i#O6Pn=hd<v-j(iKk#Hzo$xwV*^RLzNR0THkW0 zRS+3R)epAnCF88V982ixk8sveSAT3>{Sg`f%vFETQV;5-7HE)mmP&}L{!q`hh|5Ak zDapM}^vm)(V>7kLH~W7p(d(e}U_qQcmtF3~07a)lhEuzYIw-`oHwM}ZZSbgE%|Og$ zL6*6U%n_Ow8q%r5R%_hd$DruFhy)ZS8!$vX#RS!Er`|s6h9;;|VlkD%Ar<irMk=G0 zIT`eEf5QRSsb+Z%98zH<BQ{D^rh^Hp?~Uo5GyRSxsNTVz4{m=gDB8unnxbah*)YMF zZQ~X;b;C4~$9oTkioj-cFVbk5Kjh1jLr@~VW_-GP3{H&2cVoFQ(0X$q%RT%&bKnP2 zWh0J46nJ3#gsi$KdvpMqIRBO3Kq!73iz>&D2P~>tqR?1T<*Mz~n&+e^!=f@6d00o6 zl<Si68K_v8_|1O^0e@ndaP~+nx3|`&E)Hey*+I=xe<DLxf|_zms3^pf;7eO#AXlAb zsVQDd`%$vEbJ$8P0D&oRZ$H-_7NS4Ns_T>*f2jq3mHUPSs2%{Tt4K)+ZT|jv)-Xm( zIxp$EiV)NtS=N(K0)-0(QT5L$nTv}?q@^jH3jGx_IYob0mK;`je#QYnIgZwqCAzXC z6kynXu80`w)j?pspFtAE(LrE6S7crFu7ki55s3|%>$xJht9Bh0N{$LCn^r1c5Ew81 z)Vsh+I9FmV?B$LDyIvV%z-5+u9RfxPPh{ftAOS)Fg_Auc7jzu~-YNq8)AkWy?yu+w z@FD6|9RYuij0Kqn;v+m&Dq}k7-omYW3&-_FebQQ$@pBdX<8iy!X|p%Fw-6WSa1mhj z65C>LAv$WLlzh-?Pg-@x6tt8)^pN8r@lAnvC`(1f@er%hr-h%eBDX)l4Kevvf@OKy z*nsf6NatPt61A6u!@R}F(aX#TXlGo6Aj<KA1totU4|DrP2>VNQY<#=F_$GxqMSlS+ zYj<|Hyr`Tu&>!w>Z{~Wli%PrGtzcM|PTSn|y&yXNO^Wm0P=fXM0s2lrnAh9eeSA?A z?)eYyNZ)+H<Fi)1(+L^ThFR}4`m2YW5p9|c^K1pt@U7F|fXy=rthk_5p3djaEnIV> z(K&z1^`ftb0p_FNPxubFC&D}<oE7{z48qUmz<=x+>?PR8h41hSql;fUC@(&>Bh83# z%+)fpq+3s~?Y8Fa-5xcj775J?J~gTjFizO1S1Z4Jzk3(lKj_bbSO8fhq$xNR##dJ# zu8jAWMkRSRU~gy+$DJ);-k$H=x_$JfOLu?a)jaz?vemuF_Xu&j%DFN8FiKq9uCn01 zzZ`zJ{P_Okr}5?RU+Rl!1ZMKw+ZlBy-EH<Q?prQ<DK3m1ka(CBWE4ixS~5#gITj0` zr65`=w4H9ZZ8l{XOZ<3wFjm3YBUmmTs!38nv2$@4ej}7Ds34~hS<$=Yi;=}Q+V6io zw*%QE_O0#F4*WIj_X-jyRmaUv%dD@xTf)SlhrG)xd>mhR7u@6K8Ai>L5hSMB#2#{P zv5hymRpKf>L@-(%A*y3apF>q%;we%xLTA`)m^ci@Emj(hTAc|FS>T5pBZwczj6feD zs_dB&Xw>6vLF7DxUAz9m=+566D4u_fW4Ng!oK%)YZVx@=n7|x>0T?sbc3|3I*EHp{ zK{kTF>n{vUAdd>YGhU2fYR{cSuPb!z#4>Qoe)qBI3<zM|+a9dXx`%mWMs;d?-eL*+ zyx~8$3qLtx(l>jpc1E$F3=S&4X*4p>c$mZgtmz<Nf>69qjXO^PY1@-_d%S<rTvvp- zTM*AT*OL=DMJIk7E4o&*)tF2U4)(wdKA03qgZ=gTpx&;tfIoY>MG8Pf5}XDUEd(W8 zHfj+kFc_-K@_5K-QZH`->)#C$J72X&ksrQYKf3dqssqUsh^qU6Q$@W5uw(;=*jb>R z{F>Pe2WC$U^L+JSx_I<ZgE@a3WNtse$iNGu0xMb|baH%r1X;+%<MQai_MG`Q`0e(6 z@a2p7Rcuj_!g#>o=4e$DMEN=NkmG0Z&4KZ=pdGWkaE_mg&$@C0K=_Urd&19g>Yu2< zQN7+6jxsWPxk@tRM!w;5SLg0MNZAYg>%{QZ>u}tl<~`2m)tB1Roqm6>dDkG7bH|%4 z??9w++7M}hqnFyf{l~)p7Qk|~sRN%`e?Ens=?$8bVOTCh4>`FM-)Om9B_j!UQu1UY zthuQj;+z2h#Zz>teKD>dA@}Ys?|@MkvlDpb27un2z(A1oY2klAH=;&Ive{|U|L4cC z@i+Va;TQa?j0><Z@GF1KI%Gd9D{F>D<J<E$G_2S49v6>+<n;^x8Vr=6JEV4KJnr-w zYX~JM6^0o&eiuJ}VEmq&y5j5*qme+kZ1_F5;~{=eHM4ee-+qXFdHxi$4f|nETGW+$ ztTQK&q$qRBk<&HWxE%mo5R_inUmmqlt)2n`$^pfs1NXYE-dTURLQWabDCdMw(a<hb zOTXS}nj;}_x*?vRRg1So1&cdMu;mp`fN`5i;w0i9>b5H*P8O8iVt=cOFf9i}kN?8( zGdMqA`nDH*11x-RFRPU#QgxM4weAf>quu38(rMLZ47r}&P@PE`Km;M`a0Qcy@^S^_ zYL<6Q7nt?`tv!DqALGh>SYRw@kVZu-5UoJYg9m%+TyWEiO07WTI+f&k!O&{8f+0p@ ztyK~!(r)&8xl|ly>AJ@j03`afV{&%U&Z>h+d0SEn7O=cUigT)Z-4!ut9g5$m4YRGk zR`Jp&+x_AA)njpzK$sdb$shN-gO(B@u4oge%I6omH)DTI0Zny6qj!o{LB5er=sjDt zYeAPC*SC~tXY%Xn*{zL@5Y{s5TPxV2N>%jmF^xdRFHm|4Js>OoO4h?_Yo27Sn~*Xs zequrHmShl87fpGZRI(1K7c!*oJVSll4aAkF)jAB_J3bMV?=G@4nw3!3O9`qHpd`$N ztkQ*X*)M+?7v)y$R01x-IV_y#LLNr-#=S-1YWMyaLuvz*RK<6|`wARXV#TsQ@s4Q@ zwLiICf2`jDTauiAKe|vxjaoBcefr8(C6#F}-zd$hB5;)IcbYqw#xU4JU3GSvvYKC= zSYMio#erGxw!)ntgK?`qT2E8tct`v=hM8PX)SiF)9&;<{i`D9saK-mqEQk|>&W6%( zdyXm>K3#ntAOE!(YDzn(+U?f3yBZY6H_(e8$LvHo43SXAPC0rlxmk%4u+y#!V5g`# z;oH>qmrmf?9tIqMK@jc`m^2jP><_zxNiHL<b{ljPO&6*t7GXi?n4?a;rAA$5;xR*d zg#dp?`Y;<6oSRBW0*=$U`vAONS=`=M5Oln=e>g_qKr6$I?Y|hPohLA$kuCtNO}bxw zX9i=^k_4kSX->w&j4F8#fNDZ3i9iS`q84EeElkv?=sYwcQ&dYOFk@*asY>}Lq^^=t zwT3~UzC^*xMy2QGG$5;;4Gg*kgTN!8kl%k70tX>B)K*hl&6q(cVgshOnq-7@UQ;Dh zi6zWo`0^FZVsd=v<~JBdGeDhXSnI-M^36=u?6yb!a0_|8-53s~0V?t1IHEuw#YGfy zoX{o!;a3g0ONqEBeX_BbyFLXnjPJq@jKCOS3)b&WI@|0c*=7J?2B(u30T@;LcIkik ziA6$fa#9w=r?$Fa$G29wjZoA^{X4E68!+b}#W~fwVGKx9oVqyrDFmsdL4!`WJsGS= zNOJz2_y!v#`se_RlHdUC)+l9jzq|gz$o_C6ZxRPz#W6L}%#B97-|l4;Ma$yY(UB@| zpW_uKQE`|cHrPyVw^{G>npwq2v$%g<Hc+j&H}Z;6aJ_b?IatrqCs!AG$f;)W4OY$c z(E+IDU1QPM2rYMHKh;9)JtJ!H7raH-WiZf8Dd@Cs)QsO?lpq@?70L)|)6FlriuEUp zqqU(@A*|pSn!c#i>#!Ge+#46jCX-<i;Ug92J|Ht0{_=&s4?H|Be4^r92Mm7;5Wc)r z|Fy<-7-Gu?^3b$PA8Kt(vZfK`VmPBIejFQ3`Y6t5=2*5PAgL_NFgR<P13P4S6668B z2wcKN+^B2Q>2?}f4Fu2a%FscfM5qSELlAi*Er0muhzZd*dQlm|%vTrabm=@H)vyib z%kxI%;Z<CLzDJ%GuzS|R`woBA0o^!ItBGf*x*o2#H|%FO5J-?-`47!bf3U6#E}!xT zQejt!)A9_)5RFJFbm)qLodc;p*K=#Iq3OZ#nC^Q(`!j>;@ez6aN@f|DW~*5|X4##H zG9s(QEDOpTlwmH6Q?p*LZ-|jmPRK?mc7I<W6mshU{W%a#m_l9U)J1>e>TcaBdH^H3 zw20(e22l_-3p>um_2FV<C6>`17Eg|E)@#t#OLejx)Ld`r%wS$g@OT|8eb<|@EgJ&! zaTpy1I>vRV`pzXhoi&<);dgNdEtKiq%o7$_%W&)Z0a~I`g+gs$1RwUOETJ?2ZEL9f z{`*g1Vq~LT^Mvfy|NVdd`)T-Cg@jj|?^teNpcj^I&WR&~mgxyBXDHy%W8C~4UKhbB zYofynf|Op%-vFR|Xh{J-6tDTfX3kjL8er;-@iVOFfc1Oq1NAfG)?eHkrt?$%Ob`cz zr;)aMV7dVbg&2KgHR5G=K{i}e(LIw5$BV^Ru=sE32C!(11p9vgTzQZ8j_*z>xT-#b zkrjB3lT@vO3#@`q(DGLw!73B|xIjH~8epxvY7}>@G{Ax(Ml^;A|0=K`$7yHPe8FSm z)M#kjxPpbtI|uFU#pXK-8qHdxL182Oq>*F(Yj1~5D78Dwqp~LJfKw#Yy-t*<5$}F2 zdd6NHU?<<fUL1drW$8kakqe4LF3FyUmbs+y+RB$u+;9h+gI0XIEsuGTB73}U_F)lF zk1W}`_q$EA-&8@zfam$cnSv-)VKfKC_HkKRwQ+932v3NL{I7}?C{-@I0gJo=-_VV% zWJqB0)i>0uI0_%Q_=0Z1l*iff7c}J&yzEmm)F;KoQV4%qS4W;BD`gb8OhH~7UyYx% zyh7Csl3L<RD{#f7mDjLiEd{CLVRJa{t?HmTkSe~>CC@4Zm!x<!Soll2wt*ql6DX~m z!qkcYDls64tTBwTI&sqf=g090nRY6A{!(=j%0zPNLVTmug#zkg2R^M@`9$KuD(KUQ zcHxWoN9=#^Tp0JR7xCEnA_b+Z@f5(pbVC6YqWl7dSoaT$8ngB|E(I5CKkExd3B&?t z4v)WvwUe46x;<18a;J<a8o#975ur@&1e)`2doK}9r+|icq14L`d2+|b{~7;fz?)l? z%5uVQMLCKDFO|7<Ig~yAODu#-<MQlWk2D&cGu(e{3f&aoZeLW|FvuR4rtf|*Np2PI zh>~=y3e&X$;fgP9a*iUvYO1%Z5)Kaj9HMe|So(BPG0(`eO<hBlX~tm~#aPISS*0o* zU+W~Sw01kDPf?v@C2inM&q&=fv)NhCMo9+A8^$^+J_bcqMoKZJnqotd0)u*^GnvTJ zNt1tebFkj9hU3GO&kz<kq{UZRsv1h4Y~YX3Exv<O#I~5c6JaywHlTQ~IQx}#D-p&h z%)w>r-~_uII&^3t1VJiAyKO5pIg2}EF%KjM=}_Z&vw(4mODMd)hlV}F^^B<v9aE_O z`ucGO?y_;~K07zUg-h)xt?mga!Pw3`@#BA337)lEt>FmQ`$?2wp3b45KC&!8j&%<E z<JO>)%QWFEj~A;pcfAY8_JD_N2<prn=p}{D`M{ao!|V=d1bTr#3f#+yGSbnR_TuIi zWdKUkIo2$d5qD;yz7*##xOUh&qHi993{fR3bMw}Tf%<o8oC)m&J$kPB5IS_A+!%k} z5eAUIhU!LKhAeq|Z2WAT#g95tOJ#^b?=9@Q0?tjAhA-Bx=ZAx{JYK9_Pj-hw(UiP_ zbjB31Bnu)#SYtedee3I(fMNuQbuo~C@wD*2qY}z%XKFu!gMsFOASZ+F2SUz<fLNru zD9N8@R*s9&Ndhg&F}ia37^T)lNvwaALue*rT_hL99K9|<mP1;w-fWxA(JC^km=?62 zlg?g7w%g!_DUJ$=i?PWoKY(cQUR2UaVr)ih3RShF+(2!P*=S_}+c>nc07M~#wh%=W zR~9cCR!p6X%7gC&j{n1{SfSY83m5xKB9&$nRc(qDjrgvaLKg8&6sg9zK4^a{8>_L1 zw4?}jD{gU9M8K1Lwp~P>%p5Djgv|C13S$l+(7l6GyfU7h#27imkalx$D@B1DjTB0l zU3`PfIJmH)q>RHfn=NF3?((kj-vPBaX3yq&g>r!%eBoHW#;J-}*E@%ZTy7_Y9;a&L zpoO_T3pXrzkMnt?ON$9(F)x2Bx^l2McY;^6_@rmpyA}Zi7wRtP#lVmt+!#$((LyPe zw}|X?EzVtq$~dK2#l~5^)0PhY5#M0z*6w#Fok3iYVxCZL*DAD#)(zDrzlickXVRs) zcvvUV8V*+OFqb(N-{6a<ynt9=0&DWj9P5jZ+uR1+082+8*8+2DFOq-DKF6a@yKZ7R z&bYaBH#pAvboF^0j%z8Vhll2%-C2nvv7fYDk)a(<MjOJ%iHwp*aWZ<=Z0F^A2!3{! znKe#pGa3nm%Yj9*JYK8^gA%Gi4UG~G3k4$s$_Wgc=2;i}oBn$Fg)$Ye@+2Brc9TSv ze!JNp;!b-NsbU3>4=8_25d4qrdr)!~Y;c{FVF!y_aKsljztraTwKET5JryJ=YV(9# zQjTMFM-D19HwytO)IvMLVM(}q3%hI|=S#FP97N>Cox+c()62QDf4Hzk0u^QAfml;o zPk(R!vGBhIunZpd;odkf@&5)@aV|Uq4bd_@2Y&WZ1KA0*j{Se2KMT4?>T)G<8`IyM zsTV(fV5VMx<5}85^-VpSNJPi?FcS~sd;iLVrzo4nz{h5*jwb=+9=YBvPyKy>hK~R* zVYf#)o)V824<Ct^+rxC4qV^j`2y2-QK`0}k&!PgW=t*BaoklcVbO1oSODldH+c~Y1 zito5Z8EWh4G$MazyoQlzxFp87HFAuNXut$9<Q+u?QzY+`VjvQ%Eq)y9AQ}zVtb_by zRR%LyxFzAn4VH8n*S%wVRnir`0^TQvXV-i*Q2~XY#Q=iTv1@kQqdtzZMng-Q*~s`m z$4fhERvl)8k?9MRGLJ)yC<N7Qn-G|k$N!5T#<r&4Yn*?yt)=g0BQ`*ZsM73oMy<NC zR0(Bo<M<<ofLv~{B-SZ~8fA0$I(FQw_nJe-K-!@D%np@;r<mde?X!9BCek;(ey4AS z>)zEdM1k|~>MD0g_EN4?@rkj1Gk3h%@^1anW3&;E`{Xs6E5#8Psdg>9bigr8)vCAa zZ16G2n=pU&c<WKf$^|Juf8=AZC_%I9*8Dg-iX?mtLr8`uGYDcVK>?g4%z}%fLn(BB zY<jZ<TyUXpp5N5RFi#0?o}c}wnV_UhP;&9-fGME<I4MwH8OZB?HckgE1v(IUBzX{v z;*c?RWK$^^LBm9D%{v21<+ypV*bfiSO)?g=`AL6K8d(qyN;<vbN|209P9lKX*DuEk zC034df+V+9b(*bVUEOSzL|>v9GMy$~UfH3$2UykkMnj@Fn}~@3t}qgLT&2{aKPT!@ zvCmq$i1b-KNi!%8D-va4*lZ2D>UN@uXO|XCiJj&m>oc6qb;5`rC!H{4d_i1wUa5BK zs*``GmMjy<h<^^Jx-++yIQ0|Ca_qh;Z!l=hXOdk?DmhmmO`N(*7-2SX)_|y`6`(~- z<M6X?9JWLg9)j}uvqf$yGPX!@i&o+!?b2#?n`9DTv`{=7iOP|5b30gGL94U_J=VY3 zGiTsC_IF%g%C__|PnqwpP9j$sIqjhO&69uo@O1ms!dnL5uh_xVbuTJI7#QF>zH#Y1 zp*pj>z86HFP6P3SqyRh5GHl&%PHHr-GbFm${HPrA7LONeHEG~j_nWh#;33i$LRs(} zCIYi(&>|HftYtRiEM&2hwb7I6e)Feut&<Q8epQ=rl%e*}Z>|AT@dp<~`xH|2n~Q%T zYB5#<`W?G_$r0_tiAZLMi$vNghl|AHp%#}_^VBZ;%{8+j8?g~giMLS#X5)%m<C?BR zoyRGgZ#Bbdh6~ScK-!ICxOJcHo|{cIuWDYE@TxpFxa$s7p$!vyrMb4OI5!?;+WMpJ zsIy+iP;Ad$G`mPmyu_Vdv4hHaOl*Id2R)hGb)tCzBq5t*SZ<CDVtTTd@jj0Ak=Rdq z&1M6SSIsLOm?s6~(m+Qdk;xpTmW0^;tFp2NC`!K6Jl1L;`j~AfpIy!O5#uezR~~ZF zNxAD+aRZVlHfpoQ?soku2E4?@zGC$fiu)jq@W8^bNPWEBNj%WaSi2pYE<%6#5=78a zMEXN*8(dIde3PO~T`$hVg)%8hVqTRI6uB2+@)XxAU2h!fUgGXt{5ZaI`UvZs-+c5h z*Si7bGk0#67Ztq<`0(z$Rqu8h;Tf#;c4IhPH+6D%E`A)}Iel~hcP<os?m%o}l|H2p zI<imL+@I{M9&XpC0O6No>UV#U7QKQW2!$QuVh#lL7471zz?m+*8{2;&lPbffEBJ*O zRr_`cRippU-nS^XjU-$C3YPBZpmrphZ%OR6Iw*<ic8o3i%JTGX%+7T{Bt&8a5^Mmp z#NN37wBN8_wkNX+1PTPjheTR{s%LDI00^L}vhtlLlfw$tRk3JN0%d<@tS9~c*l~ku ztHnv*-@2w3SiWtJlEci*h|>8-agW-6B?pzSwYzof@f=!rX4dUwZv}hsu-vTHk|nu` zgE0+2J;NG+JVeuy(kXeDTHkZa&V?F4Y{*&zh$a4~+cVF-EDKed<r+Xf7H(?zXnAcJ z#?Tz0+-PWxf`yEjd_I4jcICL9?9!37sW>TiImV3cmH7Xy>sgCrPi)AU;nnFf*66u` zLE1!YrB@iWDugq)&?`u-^Rq^KE^VNCT5BIi4aH+pOTC<>mOS(Vq?Qty+@{?s=Vv>6 z;<-mbPAmI%N6ObWUY@q?qP;3Co2;$J0v`2Fc8gl2XX{bp=<I)V21Os+p>5?1?@)PY z(GEQ<Gp7BIZO?jfK@pX($O(K`DRFvArtS`QsS+`H=8@3$T^VvgdS~k8TD!gT1eoU^ zc=|pWd-f<OS|E_(*z|m>7+4Ph0{@Tmh|}Y8v)0MMq@0XVByVBpv%kxjf#KLK_4}of zIkfhTN^5qY>rQ`0!QQ?B5_Qb6Z&5-aGPVnQ`-`TFmA*#ptdWPwN~fS#Ln@H_)DnE+ zI7KtL-Z|ily<T!qs=}V1JRmtQ}85a3pNDVcVkFI1#xt=ksn|D{@G2z}*XC+;OY zq%pjooarP9V58L3Ak|8~ifQNSnb%`K?|{Ug!QdxddsTn@Ky@W$_GtC2Q8|xNN}sgw zyEe<7Vg6!n{w*%}GrTA*v`~@nO>blaKjUX7_~pQ0rMg@!TwHznXk2`~JiC7X>C!0d z8@H2DH?ZB2RIm#z<MW44*TyCOeEI#;AD2e^i*eQYkFT9C*PZjnl@duKFMomxs-Rkh z(+OUG)U1Cu4x?O{SG)^Ubu=?8pSmgRTg!p59oiG}8km;KM%oYekUYO{6bO_BTS&Pq zsV}TTTu-8-iond<xs&S|nAL8$>WvI8KEn&M7*&{H>hc~PH`|S<on~x#>xb3y*{qc= zYe`2JwX=GY-8Zi#HhythtDc^1$z!#%Q1UCxj>~`A!kyfh-dvC+b<3XBq26}V!Vc;g z-m>x#DLOxR%PRK$GcdSJa%A`dNhX)reQwBDlku}T9RFhcHzO(5_f`l(scRlLbJa7e zP{XdRoo5txnWP4(o-s+l{#ilQSJ(7utF5&$;-TqDUeC>}R@BDoM~4@cna&koUiA!b zW_f=|v-T&#^ge?uqU8l^_pD&zjY77*3ino*^=S*Px%Y1OvpWgKlR!GHW@++@$u;MJ zZ`LZ*GH8o_r)QL@MAc$k-)<(hvn0+}tv1??ogjWZ(}qpSUU+Iee<hDfV$TbA9YX!* z<y3c_dig4x|3@(bC1_VJpOzb2$t6<#d2)Z^cCe$iIXv2G3O{jdKbT7w3`b7cA??%Z zQ8S8iC{&dF$w*Hb@dH4Rzcc8c#}Q|m&BN2PXgBR@a<)t%>67AFL-)JYD|zmHX>^0> zQ4j3Lzx(RxM-Z%bHD#f=`XN)-GXoPdA~xPn^zCu7D%UIJcBG!?Y>rOM2g_fiz7T)Q zxj3rU&d+C#r<@HxeRqL89-ES!Q-s_Zjyc7rpT_3Ma=szm(;WK$MCagtJvKA1kysXU zk5{o*q&tg*%wv>sj_R%B!`H<|!kh*U!Y-PeoDs>1q=!YrC6SVES~%gr`(xuTA2uqL z2%IEu6!5?2U;^SMOwJd-uxR1)w#t8M+#=@l;vIfeJ3NdM4Dvnp)OfAxz|lV5o#a|S zlaEk%^ov3dR_T0|wHDOA76H7R9GmBkfn_p8y8_Z&^`chpL^3><Le)8MUL4Ml3fOhq ztTlmIxhRFI(PX_i8wql1qpl3BuKL0&hGaXHMx`D(J>sjYoZ;1#7cU6O=3swyQ<<Kg zBEroJH^3@WB;-P+Q>`D@XNK^)q&5B$OaYrBtF*7}z_Y3xa0%Z8Z3tcWZfJUUUjo2( z;Yz#ru25%XjA~Th6~0}&-D;)QtRGcsqU_rX6?E~6ozrIhLZm+~0^WNg{+l!TV?hWw zdBfL~5uv5+GLh^5t>6E4<34}PCB?-Q%(<78_(e-^54bOS?WBetd*@}hSl}*9yJHwd ztr~JTsQtY$yLWvLb-_JCMez;$7Jm9aCpLO+CvFk0VTZv-<qASJuR>?*l2jbvG*jG4 zg@_F|K<X4V&JSztC~y{=BK1t(82TDhbWv|sj-q}Ru_;o|@D#~IuS|dD9aXB0W@OgJ zrbs>WI+VWDjiydS-0oG+yy7Wpp8}kCW+23;NIk<-BoDo^jiye7o}!c{2#G0Lrd+C* zFCeW=l}nZybIN7?xs}U>TB=k4H`h25+7}di=$ir;dxM*zsN>t%bH~ZME_?rF+ULm+ zQebH;u17_<&|v55RU&_jBc`oZY4KAfgi498XK$~eis>m@YFj6!=!deu8d>vm?62`! z*`FVHc5Zkd52iaHPs-nnp=FNV4z1oi5_*cg&c2mZIG~{21VP7a3-wIi6z6TR#oYVc zS0}B-F2@wol80gj$EI2#J2~grV)M1K#qYN3*b7r5vgXtjqe*{ej;63dwgOhCRh1%_ zXoor4<C+ad;eyJM;1Q47Lqt-cmdMO1w5~**gyLfPq1qvPdgj>R;cI1s;DHNK@3Y1P zX)Jz9T*pMz#_~M$mVv#z0*_=<VHF;!wZi#spq+NTaUOMliA|Au<`pZ>>O@Gyyu`sQ z&YMy{^vodGp?rUt4?GKci@6A&v2~u3ezncvQ6kJ6<NOl?>2<E!Upgh@?9<23?W>OQ z$NTHwjnnp(@v+msG)_AgpK!2!c@CVtvrqr%Tp54--o7?|2k_o$r*mn1{B-{Q;(Y>q zPjfTqBaEbPjSkctq>!>wr>NFJ8Dp|e;<(yuAE!pI)ysdG#mPf411_@x{`7g9+mVg4 z`f20z#n#uWqo9o^^IVegfgP}vjWT5C2e4d;%i5YO$m|i|q#*`rk*Y;2`^FTg{$^nH z<v*q5LWZV@&}U!xRH&9G$TNK^x{m4lCD-er+vPihAkmi<zP<2q&r>z8Y00trXu`&D zv*AEr!}@;;iY^JAW7z_ejeXW=9-r@|Q^iJ1YmTf>h-sC4`>!SD=L;v>xpAd$*Cpkc zjpOnujHZ_=apnejQpwjIM3Epn2ueNMABSv49=adc{+;EO?(JSMz`1g%v2Req=xlQq zd~^8td{i3EM)N#7>zhu*7Ql;X+=1PjVj?cuAHIKd=A}+%h&X+aG{74h_~r!TQ7g}n zFOS*;4f@}9K&`Whz^kC}#|irEv{65Oxzc7{nV=D7dPs9TIGub+pc3JVoqEFxB1>6b zSgb2egz1b21iJG0gk(+fo-k*gI`$Al6B_Z<ar^i}oa*thN|Qb_yz2yvce;?ENgu2= zo9BP^a&|<{Nnm&Ha<)i9h)7a=d~BK9Y$bctbtXNl^q1wix!hyv43;-u;Eqe^wdk28 zRCe`kz>Pv`mcd=8r5iU0+~M5WeMU@E^-ID~3wd*WnZ#Y2Ls{sH*!FGndVqG`?+QbE z<a)oiN4`zzaRd7Bu5ji~yrs?7*$KX>(T9I$g)j210N?AXVvME+$~ZyIRhLc83*S5Q z%E*Ibl6D!&sOU?+ctrXJGQL|#UPiZh%)s^4SL~<9N4+-TuT9$_{@tcDE>f#yg8Bk~ zU0?^O6GhKaZUFNz+xHbvH??gonWH{m0E>ftdv+IBOB1W_*}dpnh;SU9&GhumZ;pSl z84OB}9d3|S5S-PpOFT<SJ+neUrm{ms_UCRr5=OERk=c$S``j-qqMq&d9~BZ_B@h=2 zkFUSPJH+OF?itJI5=&(6i1o|D71UdgJ<GR70kxi^d~O3l+6l6F?rk{Rf`Mg>UEjBF zY{w3!M&KG|FP_U|P-+j30({j2Kq7yaacf$7S6Gm;rz&4rq@{F~;*D{O<gSp&{IS)w zZ=qpOi4@><eamVs(J|1buh}@<lCk{UJb<|7APB~O>+M@PW_HP95BL^Bg8jEBkFdLr z<%g#aXiEIjAQ(Ek-5pw(lChQE-eenO@y7V0eRcW%@;BApr6p<~%MhmjWS@TvB2^4X z<G#^#M}cW`+t$mr0XIaC5+eQy3!)h2MC|<wqSSGW8w;|QLCWzF+!BJ-bGsH~>j-%h zENx9gf`uAIuuNR$xc4i-t*QFg)0A(mneCKcERv=G!m%JtI9=L+7secqEz@I3$~qYm zG7R^2iA=4v8_jYfi!v3e=j49|(cR%&igdDA4JGMY+xMZKzO5b|9qv|?>aDTUtpOGb zyJBE|w+z!DCJE;Zj25s~&qA&l4&IvG09q$9bSA@5$U)_m?7?B<L@1*$U0}*k)d}sJ z02u}0@4&P<&&hxvc`}3{WSG7&8QFhMEW>i(xy6y<$Q2h=iN~v#@0EXy3%teb9epdH zM-Z&l*y`~Pe!@F1dCyzhgNJtZn*3%JywMkk5Am8TMAqIYB2lk-UOh~QW>ZDZDqbDE zdv?8h?v+)aOA?lgn;kzD`6GOiif~*<{J=Mg>V6cAz#TbL!yV1GFq(sddB_x^*-kIo zC96cr7bO<Wj?(V!6X1Vdwbkld?(iFaS=`$*de$x1H(6$PKz9?rD;bFIq}|+fe0TO6 z;y(V^?2=X&+*=kShxo=#a*Z;x9O;_N)R@rH7{!Wl5X}h~()$rPj%;!WEDJYejWE+^ z;sN14mOl?e^I=X=%lI<02({)$1ryKn?VhZsYFt!K%iGF-*oJ@Y9-?gmt%w|<ncbQM zizKkR$-4`nqU1=_b;`$nWBrbp@(sa>nh2^xGMEBe^x?pKfFcE@E-+B7fPf#ev#g*C z)=zHBke_Q)+sU!x8umoaG@^9Dqo_$1Ky?$wNV>ih+`FL};VZgQl6PcWa?O;y<hZiU z6HgS~blwCNs%n37%o$(H(h>zEAA)T&>mp}MouKIC=rX=}p|-#jTwpsT$C~*~t4%?K zk7-p!j!?$eQ=5Va0a9ZJ)9>2z3BBv2LT<yR)u!P3reH$YfIDl;Fwd4@x*f&gr=dBT zm=0XYKs+7wEp{@L;n?)q<BMPrLR2!C)U!l*HYu-F-K2kxW?1L748~+pD$%{8EWcYM zC2(jK0WzNxyx!ItwQBw7xEjW253qwMpYVXZ=Lgt7_~TntZhjEB2bBYR<Oi17J8*9g zsCGq}v8`vy=!~dc2cp_nzkU7KxxCgXQ5$ekm3_32%k_3UL+s-XXGAGGJXCx|JAr4! z3fqSMv;==<A#3ZAF6!o!b2DR<oR~~tw;pA7#Io@y^eYoXV4=vAcFwAsMuA?DV8>B9 zx*nkba)XMWvEP&<%dUteP)1%N(ky;oGR`Mshq9fK?jfH^i6*`=a*<5pKwc)=nQdLh z<s;c5+pI5rtG$`?S!QReO<PGmp2ro+@B&d=2IPOlA#aqrG$0K_I%ha3InJ6m>^T)t z(PE5ij*tN7q3%)eOQdaFDhCin5Q)r4%Ja-VWw*gHBH%Yl)dNZxjv_OUa$VS^Nwq=z z6HbLe0`$bkZ*VCk*YIV)!cgIWHEUccQ9h3wFUzcvH^FP*ju}=J(*^Q(i<5}KDU;lj zH9&vjW$Embmt5+Gk)}Dj34ZO#3}x`qj}uDMMQEOK`k`qiwN1`U_K_xc8zmCQR7s<F zJMs9(o^@-XJ1#L%q$%?|R1mMnxe?zLeAgJ`AtL{oMn&wo!gr38Tk*KZ@5*X1|GK*T z0Z6F<N*mH5kxw(k5IFmp#1G2>WWsTd&D?)WE!r^zpL29x>s(YbWa^%FQ2NzL4k<h8 z9kSG!R**IYxh+<nIx-_^%0l{7;O`kjB4afrpH&4~>1i6>#qWh}aIF*iH%jPNh)SzS zT15g4WGs4o!VIOvB0!)fD@2X)<WZ;1u(||zU@&_?<#QcBj7d_31l%>aJ$>P|gqweB zre(xbh6q;z$_o0V()G{<*zhaT7g4!{62CEO<+;d;QgNjOA_2s}61dQ}V4(KcVihup zstKfC6DKFY^9VSn@U={o*v`-`@D^sbi`OT!7|Ij90)sH39D|{d1Wu#z#brNY^j2LU zVnAb~TMI`ae(8~CPa$8;lk?A$f%ktNT%qum^zYB`ew?BX@s6R{79dV#-k^;`zboXf zx%C`!-;Yl8nHio5-=9G5Hw60GjKx-CJTwL0pV*_UbB)u0A-X?ECJobotL(zBJ^&3E zNhlHni++qU+R!qMF0LXlL!bzJkCO3+XTz6RDA1)Szm?<gtUo6<HlRX|n)`p|pZn&P z$HL9ydI~vf?)u`mYnqpk7cS(s#97Jrc8drJRLmHA6_<s|De5%Li4#yT#zoRMRA*Ug zOb#@-Ul3S{E5SnJox2;H2qP%fqY1(>q$ewUI0;Z7{W`K)g4Ab)FS3O~-95$Qh+)Xs zQ4x{rP;DnPIDBKzPl%o10*ZfO_R6GAhkEzS9Dv)fSf$%XvnTH@M!(M<OPaYf@1Ri> zM`@y>z?1L0T^sY1Q0IA`6l*|vi(33GLbohUe&T%``_7UsuY0&x*-a~L9RV_dp9pU- z{cVV>gW`<^*d8F9%^)DelBc*~d9k9)sDn_<dg34OaM{lWs{^tSxM6=7E!jLHIC23n z#!`|4YA|T5F-?Wcr{h~CLV!SD!$2GtRuBF)Z;-)fcoQI#(dS73u{!E=?R)HDv1f$= zKM7TYXCdMz>tx5KgET)28OEaKn`nS)oskqtFDinFhB@SCOIniWd|V{RTu|jw0+%{Q z%rPl3=ByqDC~q#t)w6&6u4ms6h45%a0CGG=5-03Fv7wY1lTJ^$Bf}B*EW}Y!!;SmM zy-hET>SjV7QQX@)Ie3G#w(PjY-w<CHz!5EQ+*p7d@e|J-8fBs@uu<>^+5#j6h>Om_ zz<`Mn%mgPPNt`daBQ*u(oPwg(MoUs?I_K!zn4zFodQ3HpbS8hb+U#ul!k6>HzJb3> z*PlM~r_RR$wsmqus?Rznt5^8a`8e0vBs*(|70cH$ofMMe$<AW1W+(jeaN<Ng;0X;# zdvVNHA@`L2eJklu@)s}xJrBARsZ`YL#To)Y%0eCjYf^;U1%0Z_sO1#a0fEUMLa%~V zT$!B#uqx|ba2|gGJWPgv5Dg;x3c)4%F+GDXQudnmENahU24n5iVvg-ug_yNpF%y18 z;gf>k>{&>qlSzKkdv^nu4Y?yIZyFF*599!X)oD_oo~_S#vxZ_#B<``p$0$U8C-yO| z>z;xZ4BsJ@w8R}#(o2W;p|fFbSkJztG({k%G8Kx5{Y-xgpqJ+qaQLni0@d7hC2pG? z?GM#|;6#Ms+=36XPl*<&DX@WpNd)5~)@PFN{go0rL?<d#2rwNp?j|mxgb{cc!-n%r z{H8IYTg-AhxXlDBnzCCH6Bws|Kn-w*@cfBK?Z-To^kTB%>I@S~qpr97zs?BEf|2^y z?O~!C!})(Gjm&Zm2a&jFq^xjRtp>a}H2_i@mJLEPVeBN4b_cif4I(P=Fk?M|Ybjuh z(IA^bSQawqM5mpZ51L!>dW2X}GCG7-3{rq~BjO~S&o+i40hJ*Z;liDzMMYk0?qW<I zgy9tWw$YZ`xFlJRzCH+rP$dG=Gl<Z*B{|}f%z}Rvdec%pmr`8_&!y%(s1PEU32=aF znZKxEibE|epnv*|20d@ZM`!2k_}D3_@h&jqc`JF4W6KDZ^bSq0>jS@PX|J~K{m}`4 z#Ds}!E3~X-{fm?JY6uyEm1Hw5oMu$_E&EBWu48S0N$HRPGn!GoJVtdR$}Kd%`XAuX z7cYMrL2`~?iM5NdEs?2BNN((&K^TTunp|RX?ZoW^;pP!lqh<JTs3V@pn~@bbZMYbz z#D+{0$D;O6oK?eTVT}X>N?T*|gn%nN*D;FHSrqz;&>m{ySvsjE=fOpyDlXw#YJ(6t z1~5d>fCo<L?vx7O$rhd+!fDVh9dpMfa1DR=!^}(A<jz!6(gu{IrS8j;y5thlroqb= zwN*90)Ms%jVVa~j57Jb`(fB+0|EA=}<D_(DdDry1H4Yo?dXtbrse_Yl==buFyx$m8 zgwSGfv=44yS@D>yPxvXaMPp`yg$q(ieZ&k=EsmHssexiM{5prxrb?T$^5JQtnH_)V zm<2<BY;`p{&OI@!oi%n(U!oRF8^Qu$RT4BhWFjSIjCPYSQ~phOIpnf-OjMuP-8(LP zF)0>q2*L)yI8gHzce2S55>mKF^TV846#NnfEl1qAY>UW2LMn;^J+Q8k)klO5rYzgN zg!2_|hZ&X}nUlaB;yQ3VN?EYjD&c>48a)S<fdZ*wmac$kTl^xRfB{+2LkS`EFb4hg zNi&e;g`(`_F^;0P^p!mv&nt)ZYL@V(2SG6QTW{a?;V4+vLj34xA-Z!GY4k+fsoGBU zzFP%!I!tc#%xHlp)49qMMQ${k=k+Z0lqI2`-Nh)4<{DIot06kX=Of80%P4<cQECth zp9vWy1iP1@Tf$;eNN^R`fLPwcW}{KBg<gTHa{*ou6ONJ^Ub4SH6ywX3#*2$G{wr)f z$|xsp2W)qn!@F-SL|vJd>`~X5^sExaePUjTa~IeGQT`cJP`=D4FE-j^Hjc_&ax;r3 z>DaJ&9WC2M<gEfGpD>RSCJujsDvIgCaXr{9vMe5TTfPs3wY9lcCK;6f7wAAqxYkM7 zUF%%|rmSz}K%WiVafzxI&C(F2yFF5<I_9+18kNO9y&s)O=c6J8E@wdAj9s`~php4W zC%CtOh*uW*sC$rVy$}`^t{GlkVBgT{`T`^yHBwyROg<TshFqQ!l|_FE;1EF9^m^<v zoJDiU$!!8{+xYLsw3MVA6kC=0CH(5fFVao_S^bxBU`!t;sM=BO`0Ow{&T!z)4*yyC zm+H*GHratL^$eVNp~{rHpnG90GFF-ZVnCh0V|m<?<yCltv%Z|1wXWzmv~|TkhTtNM zx0ySb+GaZD*x(eYd3Ug~e^)Vo&a|3?T73>wOE+~s+z{Dz+ugVU!WUZ8$&R2pK?N6A zn5SqO6upG%B2q7DVI%RR+0`p6mU&gc=jd}Clqh7ckhwO~UR)hbXgUoo;7&*{xIp|Q zrZra;h(cJ=ev3Of6p^GZf8!6_`w@UL3edp|=vM^3hu=$uoIc*#eWa6rBO|yETM#9- z9-uS`S(Gkjgi*$+1%8lfvS>warLtG8$i1vQVd8&}v%W^P**v_+kV8S2MY6H|vU8v3 z%8ZEh5;2NepCVG3#xCFye1^jA0y#z^#fVZO=&Fb`$)oVc@vjs**8EuWW6*#w&obkE zI>{qHR`zAMB(hrfWpgQi7zRtEV?JC_8PAA`nwXQ@VkSvw^~_NhmG<vvvI0^jMS|dH zc(FpPT8L;Nl0hNz;Fvm*?}gXdn{y4wx$5bGLxQsX8Ap*t{a;$YH_;_UGptwUpIw-w zr%*zs^sK37SXi%@tqZ3xELp28J4zDt$6{thTG<rMtomrFGg6g*YOQ6hq-ABth<!7w zUW;W4|067DgX`S?)etGNtq^3Id(FiV1L>kLO_VZADM@PI5I~r*Gz{Zsb2$EG_BbS< ziUK-@_T}r?XRlrLx>PFjsioZ0H!0)u7*ENvHzG|>C(+mU%<(|9Wmc9@%f6LlUmnSP zKL1M{W#$5J0Rl09I{22=;2W*pT<}fvD(zfIFEP&puTrQxQw|eg{X1&C99~~t5*?ZP z(UnDEcLx!0l94H9v%GvWl&jF^Yu;E6z+yg!-68mQ0u`?7PS9rC>pE`t?%qZ!gy$kx z0tsp@6e$r}R%ANw8^_{Mh#<3XRF1@v$(S2j_mBZ+SV0$m2-GT24c}?CXB^Bu<Y3WL zlwGFv-Ies+Ectr6)Ysnb##}vLWv-4qLlN1bh4e{6G(xGJW8YbOziP5rU$w{*S@b=- z7o&-uXWqxS6o_C1<N&03k#&4ycJKNgcpS<jT{N5v!0V8KYl><~>eVTD;jby(XhI^B zu0Ksy`6erW&jQ*v#2%c&qQBe~A7C;PP8RBqG_*iLzUDC-xP3FjW707imw8oA51ZBV zEY(Mk&0tV+?3)(VfxFHmK&?6sg_%wsnjA9@&=@=vAQ}`Uxn+<_$y<8@#Rs~bgAQK) za{kypZB)-1X(&KvwMMmb7M@`gpk}REF4s9bTsGi;K&?Cs5y!d>-W3|nL%MnZeHT^s z;yZ)!c+Z~x$G5#X^Eb!(`R$Z|f+*dGUXB!1`I6h&5zqa?C`CW{ujQ+&u3;SGNj>vA zRyWlgS-b(%Gp~7yj;r<BdB_Q5S$3sUtsmEC2V-UHZRK*FH+hKmmfUCKFToVnfdt37 zw$T88zRK8L(N?^1-8<lJ+<ggPOW;bo_pTsd%tsLU?+V|p-EOr~Yu1m#W~LslB8YSO zik;JD{o;(-)uJ?-H{!oJOvQyalDrJOCwzB_IOc%ug@>%sfy!TKyQ0nQw|@WI03A$* z=8_7;*qh4-F1<Y(>C#vfo}hZUmfa#<#Li8B4J~4D5<<_);TV521Q3GV16GQEM`9@y zR*6>%m$k#9LoTY|#bYLraPA2@Or@nb15?i|pt8)0r>|eq#8WB*D_<Ozo2e39J@bmE zNTn6Y9onbO)ALFi18bgDFCy0Vg6D0U_<#`~p5v<ZvrdD#s^m@2n9HW<N!uJA@vt|4 zfwj2egSbz%UavKig0FL$lkqR$_ta@iqM0GXN&sIKC*u+tETOt$*n`dC+5G{6ztI75 zGRyA?Za*U)n$Kpr(&?PewwwS(%lUlrggrJX)lTF1;yAC9azeIYoKy-Z<s4Xkf#I<j z;-2eq7=whogQ67QASyIgaOtFO(W82QrCo{WET)^PXEbXMbuF<K<?QUh1l~GpCj}J! z7CigG0N|cz|8^@tx{8RP`LG~lZP<IGKLI2uP$EKI7C-2^!?8msfT$<ChLkXDv|WJ0 zYIz=hy)uNUN^WuWRXy{93Go?l^Fmc3U43oW+m%^!Dyf@Q+J}wPRBY<9ayid`n>-XV zE?<J$uTXfod|GZi1)5qlC&LMyO9PPew(AZ2%)?{d%s3lZ-8<vc-;=U42ZKW*Ji4Ev z>y>NtU86mA9miFMx%y5ytyF5~k@gT1b(z^I8*!M08)66K@eD7#u0yC=t{s6(W@c~; zY>S_r;FkkP<58E=S&BV0(^BYvUUgV)%dUK$^-CXOWj`$EBqwDB7F40IKj%YJ)viwM zumLkOGmCrTxc4QNZ+Tn1xrKVEYohuGiJO4XZk&l#*iWvBN^8|>qun@uv9vZfuJm0t zw@&IHrBKYy;tlQI<IDEKN2E$)B1gd=7WQBh_T~#8)vCmZt#?1L1MEG2V*t;XUP<0~ z&sX5AIE6P7-fOHRx-4NGfm3e>B)vtAGxjF~ltoAKwaDpQmejNAYz|o9(^tqDWS=b6 zYVxtUO=mpdNhp^ZNVXYKo;6JZR~|1@>|Xd3%yaEoQ5Qy7siNtq9Uw?AbXfjeN?eiY zZLlg=AQah>Xz3gFJmQRhe3}_a2O?21`kv`|nWKwz_P{Rsa6$;NH{_O!22UZNv*X(K z+IMe3P@GWPs?yj)c}KXqj}7m<-8gS|vaVj|j<1Djm6AmF{*SVTt9aX<;#h-=juWMJ zkr^p-B5mFZ&!8*CT+Q1tr=I(Th4Z-m{^M?!_^`~WBzlPpXEDrwYlR^{8%>HOPG+ES z(;kW-k6lzK-Pn#DOv%G8^3s4t#EEH|D)L=1;#=sk=J;-F?S+=vD4lxk_<7<f)oSyI z(mFEE6I9n)N6b%_WC0hWwTwX!j9YKt-rqx)4+cFG9;)G63#HYzKX`j@-`Q^^M>#-^ zMfdK2yG%G-cY7dzG6@c3g1~`y;Jdd0G(+nENdX6BCm(#b{fX(=fAJ4CBtBWi9nSbu zbPi2?y!F~6-=6Dk()HCt+muqAXd*ht2@6sXq7O<0UUB!1q|>d4rwrfzi9{3%jQMZt zb#&)Gtk&Lo2O(94#CK~ySiJ+j8EDjTy#tg`QU}Weu832AYksyCP}_pqmTqOLuKum7 z>ROMZeY3M2lD_6|7@Hte@cgmWwQsp4E4IcynoC>rpkX1;6jHq2Kzs2l)%}rhBAy_} zTng;o6r91gO0L&`D{JZf@bm#qiC-E7LuYMC^Aw??4OwntytCbL^2TUi{r2@^=kof? zZWlTqY*1x?3R%O*!RqfWL1qi`{A5Y=H*4#WF01B6QD$tT^Z|v<nq>Ag(w&J4ja$N5 zKz2TLKSp^szN2p_xm&s}1;u=*tzngV;tn@cRfn6)TJ0cRzkRwTr};Jr8?!Jl$5yq~ z8d{DDZ=EHD`=q!6RI-{z8c$(Y&#aJ&UC~kn66ptj1C^z3`gtIY%y2PO81=1Duf+M5 zik39TXtc!n!Nhm62r-#NOl4MpBRnNyU6mEp=6@VxK+Ru>Me4Gx_vVm8h56E2BYwu5 z{%vS>i};hM<|>Mo6e7`@n?=7V<G+gwRI^INPq=caTu^W@#<5$Qfk_wE`C<Ez<425W z@+7x^O&;~Gx|pBrs3~s@WRc3W=$0rzHGLr4$x@1naWe_n?@2}#F6|-nE=ESN_F%CK z1YM$Fm5%i!_?I{+qXO|KPz5VxD9g7f&HA#0oqFiGGSL<H9H9i;?vGrg#O@o`cWcB& zwX;D`VXaJ$MVofA34?*`upYh%ZU_4iF$(H`{DO|Zw&MWskxa(Ga~(@fdS6Aj>%D<s z6()+2Hx^3#4DO8>SuWiibggEx0L0otl9#GFW{{9X=6=hl8lf9XB5Q*u*^*0H#1x5w zBtxW+f=$I3F2K2GJ<bC2&SDlTBDs+D!e9}%UR%OzVeVy`&VYd(T*2pHK{9>@4Cg6- z(2MVQGcLlJiv%mU8$=~!yF#8MyCdpkvI0eVa5RqHQIBP-%LEwd5VQ7rC8KRnmNH!> zkts+ti<ES$Cxx~Y>pd4h%p};OyHk=Js}zvpq{hnH7eU+mkk?&v5@LL_EEk(Zq54d@ zJ*8?xpwuYBH%HSURGh?a7aG+tZAwai#z%RWnE+LV_yNIJWA4-+?6cYfg$MHo%?sqR z5EpNC<)>V$9hIvTrPqdm$LfDL6+$`8nv*Z{VZLgT6J&cm(%nzF3-jIBBh#A-uud83 zD-O+`MO>`Ricy7~8l1q^v(d+uLwqn<h3W&F&Rjb(nDS5^9lURue%GE)Q~beyzWVfi zP~0mS|1beGU{r`wh!(17-3q&2RVY}UuFiB6qbPKmvbYu^@v<#cZs2Z_7ETI?J4Wh0 z>ZnObKF(9549t%6CoCMDIa;8DTwi_d7)5ag>H)##>UeCPdl*2{i){h?Csw4ffr#!a zvf&ABDEdCnB>_T*<K^%=-f!%GM<dtTWn0-St7wwi02P|!vo|K#Moi)j3R<WLy_GN- zi=2W}Ci6{*YN8zm-wxoW06ME@jk;4!8#yj`N|({|$sDRiepaj18lsKI^CLKKV+Tm- zsgQD}JPxrAM(-IyLO5IqD8E=S4u0+jzeuIKEWcG&>6xZxU`g!Ea=l!CYqzz3VAg6P z;cJxhlNsG{)jgh>0iDb+M3Ng?WmEZBsHD`EI$m<<*;zf`{)?Riq;1eja$i4o2`gh- zMGX}WJI$~jkLG4=AHd9EtRPr919a!>QhP@qNZbfdNa7c*`}iVFGck+T|0`-M6!tVq zbnRI&=PzqClS3g#&{-vag}kA%=261U#Ch&S-8_fN=@KF)4WSNSB*0UEbmeP5WQ;4X z%7HVZ!mY||Rc3Wwu2dSe3{`1Guzg7`oSBt6i8&6w0EJNcjal1Xp*c>%KcKz7nezGy zjL8@UT)6=n(y;3&Y*lky{(t`$%_Q9J-M#Hwnk4efwqaL^oUS;3Nj#|^dV)V_b9|NL z>a3YoAR9tzjS<af>a9lZ8@9vk?yr>S%0RXpiWfu{h3;jjdOy6}bkLKWs=;B{`}_;j z_uZ}y-h^i0A`vlnC`1UR8Dr1=Zue-Ab}(>JtwHlj#qf%Lk?QzDv*hM^)X-|#PE#-E z(rS5#RF{<A>$xm{t<Ks`TUD>lj`|5yXN9(NYW}8pDwD&`(3+u{*uBgcCsb}qZZ<+J zty^>-pCGH;DE8a{SXz_=jej5vkU5Sbub^8(g4b#1kM>okh1letF`Q62qiDenwr3Rn zRxtie$IM%D?2;JqZ8S?nOaMqB?&O9(jV;bb|8wF(UoDP*T!VYX;{M3=f)ALUO1aUV zXCr%FYBl2N$OfbLw|dA6D^}&>DK*|7Fxxc>d-C}=)-8=J^#!02Q<lB)q!(b(R;=wA zmf0Q5npTMkLGsPmv$_^Z17t83<ovc;1*3@9;*@Z6)CEvkbgJvRUhmtjV~>k_m}JOY zdiOaWITgo$nMf(;v(c}4i3-w@&MSs;yb+dQ1bHkUpCnq<fImJfH)`$d81U)rl%{29 zq1(O88XQ{Rx~RwS?JkZbCm=h!HtdP!hY6C&q2zKck%Np*aNkLDOpZ4*OSgzjU8;2T zEH3>3ivTN*7%L!wsk}EBK)0Tygff6NYHbJsl!}CZx<E4S5rc_ngQ{q|C^iCD1)BgX z=_33Z0bhHT^<bmQ7Mw518lsyh6P>E8R%_Mcc7%Z}l-0z+m@i2^!^)~WL~Hn3l-1af zvyoKwhHW*`+9GZoB2XL5%s4|9bW6ca0?T@^x=f?L8ka7lAYG1xZ3y{95t?cPrczqM z0TCmAD)r3k0hh`++gp};czW2Zo@WV|HS8SHGRzy_btd4vbSTVZ@GO9ZqY4xUyLZrK zp+oatz?K-X0@st647aY+gS%uo^HmA|X?Sb8?+B$q?h>x`s`DRT-(PjkjnD0~zqfzu zXxP>bJo2il+c+&>oNue8(iXCn)Ahl5#+Vs@PJfbSU9KX|h2kjJFI-eD<FgZlT$Pl= zwG|6qsh6AOZM7KQ!iGHw;as(F&T**>!eBGueDU@2?E3wu%P+>o)u)ff+1KmNw-4{H zuRnCYU408r?v@(z2+@{T$sMvg>StL#t{&Ahq@A3=ne?qYu)23eg}^gaPNmZmH_)no zGox>=t95W&*^5T!G;7<Cd<NOwgsXtZR}Y&PM~7*(i0T>PG!_@<+i9GcT?l=NM1|*0 zM!i**TKlb%Ra{wG>Z{K6*Q-l~8LeXBYhyk;#ymE(IYZcolbVv(qTr)U^3xQMZxh%= z?hSHxlsZg%bn6OSLZk+b=15}WPP)y1dbM_zCi_)Uu|jMwpUq6g{A5W={6uhHh=k1( zk=;eW>(*VHeF%?XN0SO65s}1|h(w`_L7AUSk&5|X`AJftW13E|wgAJ6<jnI`ean56 zDLUa=wid_A1+FlQqoM%l-Y48-&h!g0-vui1`VJsvBZa%`De9}1NhI2TFh(VRblRW7 ziW5OY$sDAT@fFzBT{A#-C?)2ihGUGh<(}=29dlaZ1{P}i(xx)3eOT^96&_C^t(>&k z4R@K`dSZUE#G5+*v;Fb&hYfN##EA0%)Gcr-rNFwlpl(Nnt#_T+9lGl_hj-r!qz|p% z|0e5oivm0O9bg&(i1Sdav?|SiePe{zFy0w;lsquv1U?sjyJ~;_-KZ2cm2{f;TC3tV zsC?=b6Q3;ne8<Sdn(#E&yKk*+n{34O;vHOx`Te8);cKUm!VPf<h;t=It9fTM_9g!K zjGubexY#XL_RI7?uv22GG42|oaK97P&ik_R438u%ZcXu;;y0%F9x54sT`I*Bl6^xX zLQ8EewK?p%SY@2CH?TO#=+sYfmZw>oW@#I<Gz$Nx&|#P@+iDFhCqT~_wq({LOHG%W zE;pu2%k$vKlb!CgpcTOc?VFK1Y9-v<d#D);TR5)owGmyA7Fr>VNF+D*H0#r>Z)4WC zKqN2nCWdsGF0vmrmNlJ!!Y#;QTFqJ4<E)Q(z0>J1;RFY>+%nx(I?c}U(JV7bL~9ZU zWAQun45ur}Lln$<N%$5|3};M2k{2C{MWAOhFM4c(wv2|c^D(oB^Ua$##^w974r<Ci zUv<88F0b2EP_|qfRf*|J)85gmAhSnzk?@)O7987_)g#cgUkvwu#;+JZJHamp%neJo z1h`qe8^TxZja+Y7tRNJ-Z&dK7296n^LF<B3eWdV@D|C{b<Artwp7lbzTENd5<?^0< zT2(xaSntAz!QsB>Ve%9|tQtM+H-6Y}%EM*@z5M#&Lpau-K2(0X8~(G}s{Kn28x2B# z34LM63<>~sHVdDBQW9(N0}YDiY2WxjkHp6+#`J)X(fPvN5X0s3^bzN$>Uo;E*%kZ+ z*WhthU%gID<LpW?P`Y0%c!6KgnDBdU?-+lNdJ8keuW{Hq!ms+4OKTZ>Q9AOC;rFA5 zM2GMb?gFU%rd$edich!#n0{ewq$aTa!moVg13J6o_vEU7F{*U^gJa&{K;iEn@yG|q zr6CtaE`2ElcK5C{qSHiU4<!baiXWwej&&Q95RviB(hxXSz&v?p@YSB(AEcd`CSPGH zUcq_*oE|{j+);51%gibkuHSz|cT~JerTm`<RooQVcYB3By!BMRDE_IGalth9R+tZb zb;l_$H7(tL0Ik&>rkr}1Vt8F=(z8l`S)PkQP&^3BD1hbU_Z2KR&E3;Y8?9MbD~P$7 zX7T0y<!>K4#&4ZZA3N7q@6U`6?f=!e(#plA2AL+mmB}vzbG05!26ZKE1l1x^0E?ob z31h1=c&T8J2z%ap_KHy0nn$Md$VXMgg{1+RF|;0k9iGsDAJKWMt;3m;Tf~>W|Ev-o zJv3Vg=Wemkh8__6>y*CAzd{AKvRIuIN+c<cLR};ku^@Co&2%?qx{oe+{^@yL6a&Q* zu!Ah=AL2KWNZ~W#0)X#?Z~=Z|&l<t_fJ{MSa}qx{=(G@t9IjssrA^8B-SRA$Mze}E zcSO*CxI;9k2!^=NzTr<{PQXD<cXX!42xfH8_y7wC6|b{~4tNrYGcta0<^e{8v;n1| zMp)BqewB<fz;k=1H>J0mjiUmygl@oA-R$D1lyYEx2ih+q0!u>!u;CW4eo>pi50)sA zT-}17S%6awcuYWQN3AZu7`?F=D1)T)50zJcjaj171Wmra053NkpI?QilHn>xY`1Cy zXU8soExeyWct<W266566fb@<IKH~MkwU4@Ca6Z-NvPx`BYq{xKt~SM1H^qdAhJd7A z9VMd^Gsz-(D1B7g1S6g4iAv2YS6Pwx@&Zk;$eUicaVFL(6;Yb`YUUf}fvqoagfn7) z5%Yz~5;0%J7}2f*?J7tunA(&CBWA3S)?5>|+?WyRK9jis_;#Ivk?F93Jt4S;Vt)vs zwTY=w(S}Btk+gmi-ujy^`##C_$1G&sg@<H>0ejNs%?WZlk)MjtGelyTVL52QMs0sa z(lbRaFGUs_F5Frk^`ur<7fmrI&4o38*M!}wwKc7+ZA)82_s08y1u}&N&3;uPS^M@D zv<~{^G#}TqEm+r=)T%NVpx>29{+YF9qkfE@>xh1g!o?cG$7tHt8lTqq!o9l*R=|tU z_(;zaZsTP5S4M#-9L&LH?R?M***f?~n<`|BoDcPt#aTPl)x@nxT|;u^2(eFpiXx83 zj*X9qNFpdIB9IV}TAXQdrp4K75@#{rde`+#N6R-Y-+rWgYpg8aE+@kq^izegHljY; z++`c7ETUDRsJ{>fU(fQXL93Q+TDED~_Bv%-RVTJ>oY=O$1@n5{=!>kj=895n-?+D_ zwK%7+Is{e?q-yD-oEpUdNvE8Dx)}zUs;!Eq?2Rcq=gB_nZ`@^|I655deYXlHI}S&$ z;hc=DIaI_5dk$qVeb2H+D4f+A@TMB@`ddlMz+}$q;d(NVMH~z`{Ga!m!T1Mc*G-0_ zl5yJkqkYwBEfST(33^<?Dnv>7*y;xGbVkB+Bn(Hr9kk$luCRNudQstjv^rbs38kAX z(GY!;&?QNkwr^NwcYyP?Clz_lMfoB@O49cya2?GqHf9%EdOp44<LFtXXUFuB@)8*L zCag-uW2(t~V=~v~<iXc36gz<KD<R(q2~Zo2nK2qozXavj^6YMr#U5w8XuDBI1a}b; zl!=v8p0B9SI%9b2?bb4XQ$Di3CaEp60^#aeFJ1=4percZ^6W$V%a_g<osOb~&n|>d zR1v^<5Vw{YOt5X#l6#KLF-WIlBSLp)qvi#*`Se9+PHMABI}-~#$Sz^*T437({SA#% z>p(Cj<Rt-qoN{hQC~>pm&ccj80Dvw85!R&xPsQa}U-5gr0l4LVvJ40Ykt`dV$T(4C znNb7^xu^+{g>qd>`~YBV+Ciu#otAW3(jl#cvFX7*w50RdMPu{dA~$biCZQ$W>cO(* zl8&msDWj5Ubue$Xm5dAX&iXbrrU&K&>f*@zXxvPVo`mBJAv%$F>Gk0nN6C1YT0(su zgrwvS2D9@wmgC-kQ(;|qV2=7EM{QpV&5ieij;iUX8gTuB73;(+Ef|K<94z8XDopq( zk|DzmI}1C^Py|fWgo}<Y3<=J?WQdt?K{yFOW-9X%5WkEXom9|cN5?dD@+AS^_<w~S z-N&3I>uUib(6L-1QUUo)B7WBr@xDc3+8*`a6&lS$;cI?>*$wNoMAQ=T2TQ~VB}K?a zMItg&Nt1}N)?Zp8qPS~gop^oe@M^uG)TZ;}*ALh4lfAUQXoYN3g)HX+=+WUVv_#$* z3PEKz>3@CZLaJv3o(FtAe{$nne@@6-A{(Um`|MirMZ6rD$FUAA0;M6*rNy&=&<E58 zMkw;RUCRf5Saw#>Ey2EX4SzsR7BpNzMF17~xFa-;L73vk3hq(u#-~D;j4v=MVUoq$ zy3nnZCDVy!Yb2VjPbIHb1cf+UjyXj&cM%nB;ifRm8~3}VT>~2{LXWcQ>=WFh!xIMo ztd;UQJ)^7Oqzl?Oi&Nwso86gId^&JD8GY;bzdhc6iCK5wdD+eb&9_$%FC}`_A=NLq zcMWFaI^R$8?DQ;%AIh^4v#1(BJHamp)Gx5aCG*8Q3RZX{*Bcfq<udxH*XU1_H8+21 zbM`Mg+|zrcN&<QQk(O-X6{7j-EUzx=$sqF%T(qNylj%cs7Ks`2Av`v<Wt+UTTx#f8 z%;uhdr$?zf`wG|k(otw(BIhHmPn)(dwU;Rsb@0)hv~As9%Zb7Yav}nOh)JIifkFx% z4XyOVe78sULG~reqr<~CPfu%k-Ol9nIawrQMF(+m1*@%DO2#$0ht0t1&nNHs69Ir< zGCm^z4-iwg^p8YZ<ksVO++;}ojp)v#O-lfODnJY?GW~Tq`W@2`t}OW4;hO(!_N`OT zGVj=J9Q=RwzQsFjBw7Do=^-<7@Lh-S@H@wxBZKU4*2cLQXLf#**&G>UTPGl~lE`EB z&j0?aZb?|J2LaTQ)wt%~O&q{Nt?I7FS6@}NO?{+04jqh6F;4d6fKlmVojZx*aBbs% z;ej@BP7`0aDl~xe{c%(*HDK#gKv2WK?i%hyr)dV(7>EVyoV=(?!2wh&(vX&FukBaP z(7j}Vf(pe~A*{8n`K&=>*NegR?fXW>CnSmp-~Fqz$e3Nd$*#Uw%36S~A2$n(=!2@b zkW=M7ji+#)J{-8|U0<cw7%e+IQ_-V;oiHDattJ<o0R6v{k#kz<SaTSVW|O}D)uYGV zb+F!nHfP=#0u>E2tUBY4RD-$(=1gH(!sa4G%eXKnd09rk<)hL7yHHV>Iq;i3?$?1( z?-BR~+e`mDFW7fpBz@;%+0Sf6pQ_7Ov7<ggGyG9jy@x2e!5cWx2x#-lVds~BL+h*B zyc$U#gh!_<c&wcCk$5zeWYH;Q?_eZ}XnwiS{7@u`_Og1(B5Ia84pPHG9{JhrB}S8I zSxXW@FSo3#j^JB9tO)R5L|~yz3)5rE>RgwG(RpUU(QX2|N=w>9A)!2WGd$hsZZg*? zRLsC&c*C1^1dzeqL>qmEN`K^k*B1y>%AXVx4bHAUu^lJcf`3#90JGHW$iIb`E)T7$ zu8*rP9lcG8Mp^G1-;6?I)k8F$h35F=*E^z3XX!=;KFuA3@Yaj$0#?#40cIEliWzat z3}E9Bb8Kws&|uD@HPMFS1_#g|U+=iaWJ1P<Goyesj4Nd4kg_g*hF^Jqu&gnqJwZ{m z@kN`^!fL32exg6r$juzapgD#+*IdIg>1P2Bv}`*0(C4sy)oc^m+>j|HX+6NLur9Bx zTOE4H8+*u0O|ASVdg=1OlSrm&7C@U?4tBG{MX_N2V*zO!VnQ!ieC9+lyFbd$^6xJi zvo6LO2AOUVS!XVJB`<A%^#@yW8AJ6Ok9V+UeoTq3QI7_qW0YbJIZ5TO<&bv|3`h6| zz)r9smC&&8$!>rlY9jctImKsvZ$^H7zy6w+=MwT8TL~Tx^`&ebI>|s^-Z3~jtgqp8 z?iw>-fMc1qm5HOcRL#o2(U&f-6c7peFl=;a$f5zrzqJ-Tar9<?BS>rT?>2vC{stI# z4BR#j+}5{r@+-ad*X(IR9L-59#xRqQnfyiX6i)*`Metk47!OxohC@wnGAB_M#ae7q zC%K?0_#C2Lv~XzQa&1fLS-2nf&4(%%7GLiBk!6iMwLG<KD2S#wJ4O2&ba)IM3Cgko zP@QZ;C`!DKRPSwn7#*>g5aYFfBpS>SrI~}pWkS`^-fy_pi~|05mg`zmJQ5opiKS7W z{Qlk2<&`3+Elt%HAf_#^QyM$8eycRffCHO8sy2_IMH&sin4NF2*DCL>2fhDS8@?N; zH}9@5yERrM7JU(F#{5O@#jnp=u{B|CDZA_*T(<H-9SnPaou{h?h2Z-szYUF*s{r#t zC%0WvuhCodZ~E|mqHp~hnw|MywNJn5{I=g2_OAQvD^}{}84AAPNBS7(bAuo0t;3JN z61b$7h9Bt|)}_(8e*wR8o2}gg;Mu*wk8pt>5)%E3R066Zy^McFb{Y0MTxeyCKDeMK zXX@0jJM-j!L;uMx%l^5)iHoziet1@p{~h$DU|53xJ@h3ylZAfO58BxIS7tJ17xaFj z_X|H!X)Fd1!B*L;)5jZoWd!LG#~8uy3<tL=)Z4>%*Bs+7on7T{A8pOXwr2fcTYdwy z{+fM&fwjhVZOwFMnhlNIzt_k$j93r9;=5I2I-bveE86pXqdGWVUkt~%1JECQqz18O z8uXrrhBHqN+C5b3)2$6{=($UR%SMw3n%4{{U`qIK2V87s>t86@LL(0kvx((4$=&>c zR3BY;=A68F^8kaC=65y7K)i8{@po|b9Q}>|$v1}M%ys8Yb8o+ir)c9-wA7`M|G+F= z9(rtlFO#VmWbvtchpGcrM{=X-O>M0O=z<MQ!+RL85}MFL35!AQoZ)!)y5`Pdv<fuO z)7iKcU=@1Z@M!4Z=nr%nuE#cn7e<tJ$T5tla>hn$D>hnNUzqaSzV+A43?iNAbv=Bi z4#>qodH=50A<E$5_Dby!airJAx^jJ4yx9GJN5&8_un@WW6fFlVaA1F%u5C>m?-QU? zS=fPAeB+(D)I)x`n-CDUhKCSxMt5szy(vudFnH^Mt0#vGM6}vGIZT}YO_P@u_Qx6h z$^Rq3Z5!#cj_6bOV9uurr~wuUY9T<*5H>^Bt=B3uziHpgc<!%=1|>#hs+myeL*4X$ zlb{WA*qf)I*tgg0lXr8#xWLUfV2Gm2+F#Q*zq2<v{en(?uF2?^YtQ_R2nh<qb!tTY zrcEh}yV^k430)__00_EHU-U}5M6S~!Q~4Uat0oTU!m{&v-tLnNz5UZ{PIHIhowQim zebii^mo?Q~myW6c5R~Q7gODHnBkT!(n%EO`eN4?u_+e;om(@Nsflu`slX7UE3b9WU z>w&<u?TOCCLr*<Oz6HHTrgO&yRxyEJ*d;8#_tkJ9nm0!l<oalmk6k9z@q<LVfq2|z z$~(4o$oiR!iCGwaVfcmNS0zj3Q*w`#QiWfjXn-FK>Z4Jw;ECV(#INu1y<EV5FUhzy zfwXz1{-zAn69R3nfIb<t(P9WeVCH-p3N-Zrddkc)$23xd>tQ5@kr+l|FUVAdYaD1v z46-FL?^*<K2r1If#GFs>bUPB7J(V2LSPIHOwTb`1fI<lw*xAgsz8Qcg>S(dhVxh&_ zZi`i;+M;IOL4<XHu@%Nvxe`c!ybMCJeS);s+@Yb8MuVlMhY6wuLJNczXuB;Cg<3p# zuL*S5Z)lJVrh_x~^Fpvs_hPN34E<#W2}Zbv3{s<x771In9tH7x#|f~EKsm2};E+#I zfer?aUOqm>!XiP!2~83-mqe2U37^x-`FS1w3v@tK12}()(+bHk5)5m9OE5_%tUVj; z1p*B|0@@%;KaJeUcW6ukC?9JM2c8z1F>I8&lrDf~%(wAB@*5@NO@xwBP=bh)H;^P) zh#hla0ERi%?C;PAFgYuQ5FbK(2=N6`WRedlza^>}CKRWHki9)jHDRi$fK(H2e!`Wz zkZz*A6<O;=nr@<9u0!#EQF#6&ve8G*X{BS$Z39|!^<fG&liXd$VSfw32A1l$mrFy% zVyp6lgJ|2tse$#;hnK4x^l#8C7`mv~4~7YrZD<kgi)D;i1F+HDbuh5PzzPGaEf1_F z`n_9YnxN)s0@fLy76N~(*~Y_T;+q(JVenNz@C60FllfRDf9bY=Mf*~~e4s~`s`5Kq z(2(o<YiI?AmI^HuTB_}~RNnyuWa^;C)PXnA1q~4zq5=%jgRRZL@)+(!hwiK3EqU#a z8RVxwz;t%#H}A|~Y6}`7G(?GpXem4y<?)rMcS0~|tincw0hf*L{-6)=5p6{bXM(b? zS+jaNF^;`b3xBMC0R!QjN9$|NA3TJr8>!ia@!)LDfy`l`p8@51gwDYZu-QhB4q@X; zzvv^^vJK$4O)UsEU@VsZJM^FQ7xdt_VeB4E2+=-6-v-BmNs4qD-!6>Iav>;ztHS^5 znnP0@a1H(2%(9{DFxZAi_=67bg1^brm!ZYLQ?T|aSiy{cI6CNOI#>!O`o5);EB!wD zF{5IemOZV)piTG>2whE>2nsV4{b`#?Z_?{6u1=>?(ic+ZY%c30?;kHT19$+|J^<_I zcfOu1ZzUg$2(@)qOAyR_s?LE5{a`~n#M`G-r~4|KK~Q(v=ri?+Xx5)i!-iQXv?s!M zuQxp<t2r2doo*bRE>(0dH)Z#v&bdev$D%yjSd>70cv^yvqh>1OT)Dha@%(Rm{@2&@ zFIOorbP9%C8|J;m_3Pnu1bsd@uMohQRjRJg{Jg%sp)5VvHTHX(?i<=s9?efaY_d&) zD6fw(22mJ96%s_z<DX(^fC&x3kLEbWgXs;-rKnebv;#NdT^V;O+9b3|)D9O_H#&D` zfNcLdao@h)1m*ko)Ru=eLGT;z`vwb;Lr5)EE%qfp`?>-FlfXAEqEEof4Vbj?m^?hp zCYIZzJDbgRM-JJ>vHF%9rlre^#znC#3(V+UBvpzX*h_agB<BC&@AQ)sfTySWCm*n? z?%*VU1k|=gbfVEF6P6hX2FjH|(>7Xr6_7q;<e~QE;k2@UaOgb>AMCKtVa`46(4{#e z!{BQd>F+6~6Mq$p9P^BDQa#^SPf6+3Q{J?leoDgo=`F^2YJd`j++cN7ttgb=R8g80 z$dm8ap&h@MU~hU(@>p}V+P$q!^(q_H{**$0hbuxoMPhdS=`HqU&8IKBU|)8@eOWB~ zP64@}FB?C9p8nB1Y5nPY>wP6XF+VXJw|Yqz<)!E^=~u#!O<2=6`0?p|Zv;GhpZ*B% zf9Kz)Q~`J(-Y3{U;4=YXEOZ_3F)lvoEtFo*<Ac>qcw}&8$|!)}XFUSL_px^Z508C+ z$>GTn{MLhRP5B$4uY8(WP)GUnB~LHGuV|CmqsIMCy%t;)eu7VgrrWpR#vr2`klffO z7ZY5)0j{(cjz&9PSN?egUm1itrbYh|>QX@W*tb~k0=ULE;KC);-Ox9Zi*DfI!|Z7I z#!)r6h420?40~59j6U0e@BSW%xxR;g?giFMDb#!$1@D=|$E;bb2#9_jDlS}Wn()@Q zL^?KjIw5*sqe(p<pC1T!7iR_nfiO-CggpQmdj}F4r-Y@^_@vryK+jsdyWmvS*m!OD zHE&sqh?C2MgmR^)m3qCgzt>O?Diq<CSoc#m)PGhqtbs=`9Nem~@tF_E9!EKU9)f`M zOR6DYkYjCT!zN#0v0%n+#~2UZ+jJXr8VB8TrHE~i>l5(gzQXDY*zb8RbeE*9(Gw>e zY4!N12yy1@^0a4~`v`iC8XJ0y*QXS8^?PkTahb03o{GQo-_w`s%AV5j)Zfg@^BEMo zKcVL7w9<GkKUu)u3E-_&^4|D=jDE}wz-NTd$cG4ZGm?qHv&M?hmLi2qpOLSId7ng8 z4(n=*;uOqL2^~QG<1a*!ha7j$$otPn8dnA~=w0>f_Tr+~zu?@LL=(l!c#ui@hxNv@ zz+D2(xb)IbPTRg>2?Gkpa61B4E6=uuNq@HSt=c%Dg?=!TeFCe2M&oaPqbmv&nVhFL zS$;9G@r$gtT1WL}5pjrsqeel55F|%8Wu+1oqBPqwMP6^WPGV44%YslQuREA3jWRpQ zD}N*ClueCsNM>Ij4Htz5CNHO?n;@Y*LN~0C)NFl>2d(TfV+jGO7%6s!rmW;A4Adga z;-SFu&P9n)iODV&&4bf_r1F*>H$Tepr~r-KI{iOL9Ph#ZLNQNl)sn{p%(JA@jM=(i zVKj?yaMY?F)+Gva?j}&a9o?Y8ioEz#y3j2qAq>^RE$2bH8`HM(RF{mKlB6$#?I`5| z1J+FRc;R-GVLKWoOaTO5eB6FZy&oAl26tr10|1^qhT<x_xEADpJ`|M<qT;(UHc@CL z7aHTnIwOsB*rbF`lvv3nW?Qc2QZhUG8(spt+>ri)A&%mbL0lnfJ8Hs`Yr?0>gKZO4 zbUop?xVUN(F_2XIEf!6HwNCP_WEN|3VkVZGkQ|ZQIx0`3)`L?txpPFfpwvSu*5s>2 z>k&c=VAmG5U+8pywtw6`kd7nH=<>n*Uje2pAlJuO!VT~F<fG|CuOhXwF=$fbl}dXp znYay;+s@BniBQr8BN^(|=mG+R%WZ6F1lQIaDAR-5df*9+fF}lBFRCyD0y^Q<ptjsO zWfA7i&L4j?{`@n#a(NaB?GILK93!%N0WA~N?<;f{5uiwaDF^%&p%bkFos-2nVFeTG zDUfQNB&=Yv_5aKb;J!ZXkI|z(`V3ukIIXr#?y6`T7}^f<Xnx~9X0Xe8^A~5)&eap$ zd~hFQ3*bGD!|vW$_b?|CTlPH^U)4R7>Q`f|uV7KEy8pO&w5Q6nq`CQt=@U+w#Jqax zL<QY%*l;m_;86y4HPU{s#2$Qn=k1WwQ&Nx0sI2-R-pPLFzudjAVywKVq^UrsxFa#) zc7a8?O#2A%4nvkJP&3?f$#Dk=xO?i`y83ixL3HLfHs-cLzDH2Z0#cA&KcudFG(VcB zk^ksx>R@m^AiaJ;5O5yW4peBMIvETCq3D)K?}QA0)c?Kh4b*N-Ji#fG+nC23uN?J6 zCQvcK(iOPJGTnO2$fanC^V@!B*t_nN-VM3x-P}Mg3aS@|?^H4%YX3uTaNWOB`@;g) zEk-l8({x{SCBd00%5r5AYkWsW{Ki#$7g>6TWH%f9DG0eMWz{(R4O0)rfnJ=|g`2WM zzqbf~)aq?(KSB!jdZryvApVLw0CvFNoW{!ifTMWR;dRmbksfeF(lYf^&n}X<P5m*F z);Zr-&tyZ=W<M-)MIdeUM*ewhJOt7N^fp8wEv8VDlf`TY3yQWD9;!EUfOA<8NE0<Y zBoCeQ;(@fSvE^kAYU2)8m5*cdRS=l~msmi5jyM|R6DYP8Rq+9~fH>NCl@82Bdnp1> z0pe)EUPm0ws}uA_MF=cG%kJpJ6!$7PTJ!MW{OB+#pU=O;4!HjkwYtwdD?{|tlJbBf zjus31)@g8+eGkRmyks0r9yb*T2A^zeZjP7xI*6JfYIYQiPVLY!p<lEKOiS`#TRH}R zgk}I%p`Y>g$DdM`PCw&6zKXdj+8-5wJB7?t;E)v+d<eLEq@N-EtgnBi&gR;7TFmxK zhBB7W&m^?mh%^P@T8_dKvmKGK<t4u;xs$iw;b~9&J7u)&h%~Lq*y2U%`*!J!E&k)H z>;R<n6iMlUY1QrkN@jH^i+ry==x4Tnu6<_V^(I^{&!gQtI#7?ANx&3O_hY-kf2jn( zRL5cKHrSs6tVGD;&&QmJzG3R*d-c;VuuxX?!<1C|rbTSs(d{o#CH>X1#}526D4Mox z;yxPAqLhULn&^7jAr7KjR`%gdXbxWT)I&pU9wg(|FI7DxJ|CHMhGsv^r@HBXl8x)> z{jIUzYM!%kpHfYY6%9w{t~*5EFtr?CHQR(v3Ld2@KC@~S{qS-!lzjR@MtLXWF`x)) zOb3LvL98%PCe3yaMlUGcBxC*VZvL=IyAV&kowW}3j$YzW?9}bfTfSDKvA1_FPs@ko zGr;!0KCaQTK)d5P%g#c94?whkhwFt4@dLuSg#hUBOZ3lxJUU>b^NyCRv|Jlr7tu|u z>;4Iao_7%ZIEH0bqlRqs^vW(_{PCY>wskkrr#ocVb9)nx{HPjJ28-X;Y;DT)!w%0c zUByxI%!%4<95&CS!&$OBpFCYE<UR4K#(zHfs2b6$pc@fbLA3Rv;nbpkI#ixDc%vqx z_b<6%s&p=BV`pa-@&gZIgtH<1JFB3d+r)Fo|1=7~Z0RXv+C92~b3A}zZadi*^$lBe zHNkN#rZtP01-2={jhWLTTe1kccd9?2S3grDX~N))x}^JUx1eC3Szj@-Nj^9uNQ^lk zv5IHUpzdrt#MTa4`I!KJ*xJTuTl!F?%ZD)(I*mqdGoEwbi>6i^S*EKQra$f@zSz>M z3#z@n4)CW7Jk5)K$XlWV1+}W{>&HPaC(Pc~kcaOV6VSh;DACa;j!qH^IRfXZD0?oD z!bII)=_63;WYz8gUE$}F#E{7R0}{cK38K)bCz7M`7rX+DpQ)^WmeyE2Bbp_~pT_uE zbZMy|xnTV4j0_`t-Juw9B!`_cdiIM@`N{A?xa^HBfPkgNdLNg}_m>-3&C%eC+1zsX z3FOjybXq`x6P5*n2`iOq@;M2g&fn_P4+TvMXad)hW+)#ulP1znD=>q=t3GAZg}^Bn zHf1{x;x-@4`OhVPm*Xew?jeRtwk@xS<J$9)JGXUW-Twg3%yX$hP$6>3ZAjcdYBRlg zax&E?Zgq!Y?Ia!su99BQ0xK1`;qOE#3ye9GHJbv6F_X#X6mxdg+%|NZJa55qJDjuo zW0y2yqc3^mkUyN1=cbb}@NmD+bTDL)q%%xcf6#5OJ7jWysKJ3|Xap*{`MNYY1u+{N zfhTdkv@q9#W)!vscmgBPL?dvbl?g^`qY;3Ng0SO?kpM;l)a_=GrLbMKWk#TdMxb0q zAUTeXGTq`KP7uH$MXVG7cPd4!(AW)#f~*3)0K{6Df(@DNT)=5zH%cu5Px;C_6mMWZ zA)0?#GE^mhfa3*4;eS(J9L}hw=g|3U%?7KXa~#+vk45M=Pc8r9#?d-d#ZiOh6~N{w zu}tSSUIn|&qjfk3A`p!fBx5?;m{koCWpHszhZ~ct+nXUdQ;7miR<6`RuS2es;h^^~ z0#niz(p82EIUgujD!INLzP}xk>vJ|C*-wxz@}t3jFy#WDjUWqy!;)Edq=W`rSrXTU z`@I77SE}9IJKH<k-<PMONPDEYSq3P-oDGngypqS_F6}Wf9Nel{5Vh)Lf{+3ztNi&5 z`vL-C0oFbwRz4n*g=~R2Y0ODeg(MO{OGdkWwo-xKyg>hrYQqUIc+4>)?=+&Tkn`{- z3o4#}hRD%k3DCh*Hj5IE(Id328o7*WwW#oD<W%9|7tpp2_Yb;qcDWMp_|XJnMjkWr z6(A(QN$_h%QVJa8H-Xky==3qMY&3x7A{acY0X#cy9iMfiGk~Jo&88Z{^W)}Wqgz^x zFCO<N^bE<-1r+S2Cl^POU$yD%ZPaZq>#AaZB1!ht$xnp!<CJAt@toddMT4RoG>%%w z@*JTQdHrITzYu0X9Vh_&Kk{Jfvq^QPxe&0>-dUA@ze;H2R@Pnma>Uu@fo`c1w2|)3 zaPK@=A)R%K^yrB#$ahEbIW?l41^_Qobj2&LX*WzX(p&;PuV`^J6sS8%rP0!?wY{o; z!ru}hI<98B<nB9p#o1`;DpHxvf}@y_D)+!8|8xeQ!}O`_+AG38BQuz9sMo98(&jXc z`l1d7!2apskm~2H8Bew~C$U}|`4|+hXva698$r*TyPUGQImwbrBH3}4MJm_yo%%1O zt9E)<$|dPsUxI@8pmv7v*UeBF414{53v%{5c}0|d_YJ)0eWDM<!5ebX`=IveyFoBj z;6vDG<HjQT4d-*qwvF2rK6F~e^LaT=4zJEq0mPR^5=7TGluZil3VEzDG6%g`-2!Yy zNd7?-$eoX}Zi=|Y+w!_Pv9iultO9P7a&90?1PKV31!m4+CRo$~<M(Q_xv%VhON8II zr^a~sid2vFlcSgf=f%9leRNUs+<%O6kmIcjIw6~kV-wFQle=7;*CR-)?u2>|3U7jv z0y_LUao@g<VMKvs7<PT!Jla$9%+Crsk`lN2N*0b}oU*uA2$mK(WiUO<f%8<Z&SlR@ zsusy9E6@OnP7iNS@Q0kT?1MdjGDQS2&6{jb0#4bgY8jbXQnYE<R&gRTD@!ACu?i(R z&jXoRevcjD8bY+2LE*erH3TxVIQTt?g0mzo3m?fL@Z4{Yhl<QBss<=PY%^#zM|?HY z{^OJ8^q#RZn2@=Ff~B&mL6MEpk`gy1v_F$2*%Av4+sMp1<^Q9+)~Gmt1Jlp>17+2k zaTyoP%#zE=;f+kHlY`7GV?03D*K?SJhk1GMrOU?5DiEB{{y2FhnyM9K^JuW+xrTlG z_LRoKqKAWc7D~}w?gj7#QqMQCP>_YvIHE0oHfW(w0SjcIRKhz50;$J!n`mVMD|kCj zCGu!IJR%JRX($m3D3XSMQlJGCogYfIgwlDsNJEi}hO)9=MjlED;fD-%RyKJe5e11T z9KdAw;Q=_eU&8Rh+B3JnJxxhDZD)(1l~q16QMk-gkdDd%$ICTihc_?V<D?=Jg@)wF zL|GRT5rBE78XI|f1o2v7EpSJ+a5lv+Kq?A036iSebiq^<xx5^Iq@s)m*dOy`qL~jt zEUBBXc`Fz4ealKf<F_$2%VndY6bR6BNPz&iEhPUS4CG?NvTh1~7t>9#ev=??q4ied ztlnItZ!!hJ+qe<(=PU@$$V!x{iS6PPzx=6N(!`h=ZUg(nY{;QVRd@OCaskTvE7)?! z9l$U_-PXtNwFmuw%+|Hf%qF-vkP`=TQfrL^IhQ)T)K&15=<=!zNfbg#hDYjAoL}^j zYuQknH?_t(9d2XJr@C#7;FZN>&Sp-NIWxI`+d)Z}$K_A(^!Ok~J!rP}n-X*vV~Lxn zLdsDPLY$El-ShLzw(chSl$@TDbLH|z^+u@0+Q8+wJi!rvg=T(_%7))(O82m_znAAe z6TG5W*Hw9h;Tdn@O+>5q%==yP8vfkbJSI|(_ZyvaAqaq6wTgWBnHn4U&qtaqk{m>* z<;H(FcqXAqfW$e?<cH%Qsvl@M@0>`!4;DGj=whW=SG%M1``1I5YtkPoFd2!eKSGBj z!CxPg%Ukt-Cc3nUwUSJZsS{5M&i=`z-1)Rgs&ap6h3M-Bc&>KmP|W~;!zp5f%!z*Q zQg2~qIj5Dq`r)2G!#((@VUFQl`l-{3Tze+fAt<YE<TrU4bAv@=0s<ntkgh1J-1&{V zS^95XO%OiTjiNJs(uh^Sjcz7R%;rKK2#&5z%Xvb7N0|5h@`tqrBNYi4pEOD-Io1lz zzJX3>Gs`eBp}TQW{4;KJL7HxxpkIOmKjwCpayBu0Dp~Jr!@v(uTP}w;@;7mLN@?pe zw~aDpZqc0&w^i{-rtD8KTYUp^rc}|HK%Y0{&`9Iw{$QeGS=SK<kEn@kMy*R(Z$FNK zY@Pyt^=)PlD`q-;MI&DM9KPUDc(6kLK83(lQ2YeKW(|g`!jM&YxARnUZR1<?{v{WT z#LSCC?I^i8HlmGWQICZugamkSA)lmZaSOP6styrkIWJ|4K8gETwtYOM6k1WtF-gXa zBt#^V7qS>j>Nys`>w0eALX6njQJ#EsSvf|3FoIT)6DH(4?|Tj9xFs9EQ&=0Yko7MA zMvy4o7l#j+myt$)|B29mtiYowIHH`J#((B|m6^MpfPP)yg<8}C*Ca^Y?EIIzXL>^D z(U=9^ZEDwu)?urw9*a>WN3DH&p+{)XV3-f5mHmT5ud0=0@F9_3K9?<|N`gn_saXGi zxs+bNBs&HhQ^UDk6pX*ir=6;xou5Evk1k@HBwHv^Uyz8dl;NQFF9O7FrfbR7?ah#! zspLxOs^t2d)QQsXk_Nf%U;a+2SIW&l;Vt?rF-0t=Buhj0E?PlnGT6K~lB%eY?(H9n z_aPh4Y`>?r!z9mU(HlU30tpE|M`J91aHmpqE{A?j82Rxm&>S~|fL+TNzxu?{iOlie z66Z24C|vG)NtboRl;iWyQ;yRDBnBO*2iyRfKxMz!vO`iRV3NsF$F@?khV%P7K$Ehu zZo0-un^ecflp#fpom~?A+$?nAf~-;mDS{ZE52{oTTh7J23PXUwyrxL*RV)P}=}Nqm ze@<*Qatf=hK?P|7`vq~z(@Ib&vb4!pC<@|t0OFMFeCKk=MK+#mBTfnVi1H=^Xu#&< zl-=Hy+P~>t_v46VudDWly^eB8lp7zTB(aY-YUG_dP)Tn{dN*XC-n>^k!`=t=^7oUE zCTxQlw7k@1c42*2s2PK2%YO=Y$;g^af3z6{=Fo<ZRKT07Y?V+NTOyR@A(AXs50U@B zz+G8)=o=#ciDMozk#rIHPpJpXgeUMj6_NkgGZq%{hXSDTdl`Qt@*jhhx{br;nM4gm zrAPiL(p<Z@wW+?`my#|gBXj74=zq3$5}B;^dg#AtTVH+1pZs)6pa=ALkp)2Hf1eRO zSD(r$%nw+G{M)+osLk{y$$&P$U?&@aWnd^qZDskLO$3%p4=i_;p+e3FFp4z-DZf)b zsAO>c8|mL(ov8z&{_ibd%foB(esJBr?F=b9c7ZS7(0?)hfDb)yInEq1!1A5Stp%Fp z_k)r|6Ww5P+Cqez5pE80tZsXxf4S8~ArPMyT7`G<f<56JoxV%~Y$0%SCb>5cjwCJt z%u()w*n8{G1kNH(xu(PO@J=XUz#DVv@J?Rl`4(knQct`9Xf`Y@4<fllFgNh^M02n* zz!BL|l-0&Ak3*zWU4;_l1?#Q|Q9gH<S#H;<XpJt&pTah3<?G2o9S3Zqe<sGfia939 zwKnl?W95&Z79G=`*b$IFSq$NB<<zz-OAsb`f6emm37IRjy*{9^V(h3JS$-jG;BEPh znmYBvLk2q8jxio&I%&m`WQFk|Qelpk_gr$3ys*1ZWplhDj%&|H?%dXibsx*h^WJ8j zOAUewkxOm|M3s}1sXlS5e>*IzOX6I;++&X7HoUM}y3`Gye{d|unZnl1CF}#ZO)<wG zyQJ}F)C1r(rYvV=djb#l`%DKz21SQ39Z`SKZI8B9Gl8ECuR^>#at+I5|HfP`FuFD? zhnHnzqY*$OKwWcTZV@$L6w?4*!V(E!1e$0BL}jT&d46aF1a5hZe*{*qzYwWslASV~ zlxt-xZ4#toB1WKvMxbOyAUfM*Ny>o>;&KOr<W4~60(6R0n;VRb#h$;i_59t!T+*T$ z=Jrf`f#9h1CysnMktt&)Ockew4YD+qO7_1Ol^(t$&brLitI*x-qj?(nkG`f32G;{x zj>tI~`Lc@zxwu&Ie_HyA*WtU~pi4T}m$z4aR>YcC0lRz*%v0ekkBP^+7Rz#Wu|f|k z^sqv&;`8P^4x}Zy?trUieR7QU0>;Ni#;TACJq!zF3k$I!T+CwUpQ+7skmI#%SoDQO zUy!}(2rv4=aWJ|~`uf*3TZ(yrfLM7Xht>-O49CIHz*AVoe~?H{ZHnZ!W*iJl>oJCK z46un%`=p-VLp%2s0!WG6dmiy-Gy1k)#DG({{UOu*W|jojnZQJkfo_g<TOYsI9`rL? z*FLitH)Tu}g0*g&9&?D}Vu67qGEb4Lg!8$RP3IHz`qY6i(!CI{+oypzQLP;uWHyz! z(^B`3@@)RSe-T&{kMV}r(PiWaG>N(AWa*J*;==(&Lfu$lnMumwO=?bv1By0{4#ga? zM4?0#MWF9EhpzP61M^XskHUNu=A%ZB`snj684hk$KGVJm>lE`*n2+);^vF4_#D+i# zKx$)o)nvDq#nrKH7(RZx++t%s%0uAul3+a8N|*;7e**)glL`(e%2ov<HlNd$xB+3Z zhVymVVm3l^CpMg@QRt!tg;<gPKXFAMby|bGB0<lWEW?So*fIz>CFyu13?)JS_9^nW z#U-JI?aS0&RuZNJ+9CKDN(5L(0djSFGbC$GEPAN}i<*249pt(E6sIu$gvhO%h;eQO z@XQS?f0EKSO3Dc=4`yY_p(6Z@@H4{C6)cCy0zYR8fUxO73S28FuIGo>tddR0BF-%t zSd?ShSTMfE3S0imIU}pc*aI?}%Km|<*3ELC;{eOyo=c9qK+xfi&=|RGAVbiT0<o5{ zbUxF$jb+c;E0oZee)}a$uTZollT_jvvEe(_f5%#s!Nu*B+8=tL3lJ?8IwD#f^g90R zX9CR|lrYQh`gZvKmJN)iSMky2MT7D4+kR)*yY5SOL{lTg=t_!Kp_xRVa3FceXcZ%x z#ZfAJsEEMF6-of)sG|hlFy(bV=P=%)eWOf|j@OD(%38A@YK&0jx8fO97q4tevC4AR ze=#UxrKQCYTMCYO8?C)UXD+|2<IU?Ms>;_FuTPL{9qu1=si-pdU27CAa{&QkNR<bV zz<(~?#$oeJg6bd^?neF299<9r4?Q(0jqRFC(XKf;hV^?m7r50j>GXIsGqNU@-HhJ9 zoX0*{L{bmG96f5bHgeezn#JtP#*#+Vf8;IEp-)#;*VhkIJtcp3+&Vt%NN4=~ZZE>R z1*96m^W)}WqnoD@%yh)#UeMNdI*w|s91Xl!kt8cB@)N1b)VX;xW1<{1j#|g^9G?_f z{bHEE5N13bm<suS<iXZwlj=-!L06k}c-X&R0dg<P4t*J-Z1W~D-@KPtjge3uf5H1` z(pjY+l@a)ENIp7Uw6l;NyuBhGzUV$`E&=UMr{x;vgOfBXSDLl9SBV<7M1YQ~*)F;J zPF``!oVtfpUbEmBvhFF$p3*p2xXzwG?VrrxbBGVy!K2`wPd=NU@%03&;s}?51SAA* zf8=Xi^2D3UG=?CP<l;^Zaw$fJf5Df1!&!V>cQ~D3sjOm5WOHv)qJ{*rNP$`-licFC z!aMa}N>}alu9QnUKLThjAJone{<;||gJG|KLC$`Ma!RG&eFHCgpXe)B>J7Q*eNg-K z-5`J}@F9p%og0!}WZTB=3Li49;`O{72ZuK>A;7S#z6^iE0?00$2N$??e=lbP@H$b- z4Y1(5l!O6Obh=!iO$^CDI11ePD63ZBcQNuN8b{g7y!Z`}e{UQ?UJddl%31P#KQ})y z9I?ozMPl|;awH@fZz8TDwaM&JL*7KWCUz(9wGlLZcW6rPi#~EK8$h7=VDB)uqQGEO zp!Y%THZ)L}!9r<o$O0E3e@0J0TMN)~HB+1Fumt#V<QkUu@15+V78MztiDMhkGs(56 zI$0qhqZ1jOUScYb^ps(K(QOx9lXAHx?S&UIu^x<(HUT#z>~x^*d+J6SIvWCfi&R(! zZ6Dgcjj<l;Zevu=br3H+l^l=CUHzL|bBw?AX!s*19+&Js7D_7>f1rR_o@vb(9L*t` z!^vqyH(w_m^6AWq9`GEKD`Jj7@>#}E5JSO`yDJzEbPaccrm(Dm;4{?rAq+Z07&Jxz zUD9s@Z6DLl6U}^p5CRHoQ+yJMLqTsQ_9<b;qE?_^CED0w>{m|m!UFkRG5?COAI5%Z zdKL*v<vimO+rQ+%e_VQklJjVNtvQfr!T_+W0U%}qqxpk;BN5C5u3PDc;osJWe_Lw) zY~7vPW;B|`G@v&+c<qv3F^b?BNig-jdP`9jtr;@as1;qKB;etvnm+%zNSZ!l;o!^2 zq4BCqZn32VS4A&TFaSB5SnhIzBa77Nh{=GkQDBfFl~NYCe|bX6IY&J#@P;X)2f9i^ z!$QNUne)k{s*T4xk&a$;RdhMaIwWP1_+h<4?fE0*W}u_iX$3}9d4-#HKI2;jKERN~ z<yLyh(L;I6vOt+FXMAp>7*ou&JUR-r(sLVR!5c7Sm}A+rXW*06I|t4EmYArjXmu_& zs*>hVBx`K2f96bS{|qIhcN2X|PEX0Xa(SbYU$yD%Em->KLCSH#0whC~b-X3-$B+Mj zvYQ`jg+sN`ZS3XQqFB%hqb?UT9pvp$o+}a7X&q#hyeXl1Sg3hwAsbNSqT24GPB)w1 z@)iE_JBj{-TT0%3a^VBy1Z?h9|2WSLeaEnV0e4T8e-G29HJBymqf<eX(Dd$_+@_GB zeQ0|CZT)(E0xA{K|4-%myQFfmJxVr3HSwJs<&z!j(HOn$;*5vLvz8*E=;F%nu>95= zzKh;9iiC{>e6EDm$I3rGf;Iyc#}s&VZW{lY>kRIKP|TW4w3$Qul~hP&2lU={NH4Xy zX~Eq<e<k-^%CB%Tj=J@_8~QF;ps2Dyx+rjt5EUv66XccV(CyRP1PBBLg+)1@da+ny zvfK2xJ^_RFBH*Bh2b!^Mo}6quCX~yT6p551Z^aEJuDoF56WCwQDCZ)1k+B=%BtJ?~ z$%1&LoMFjvlH^r&uKPm;kgt!Gg$?;wp-@;ffBq}``2&)VJJ8LsZtLUs+Jk;(>)L1L zcDn8J0j!c-pA%K-ydxJE?=P>1O>%zQ?+km_eT<1uPfsbBi!m|X<Vy>rLuh{44}{ys znD{SnC0M2V#?8^B5;(@hhHjHS6b6XJ8;aQk7!z+gts;>kvGen`2gAk1Nkv4+TSbr{ zfA@xIIFI_6j$18u@R;Ptb8(v*gMZ#PTI%>x6^kSZh$63UZ-%nP#%ZLq^IpGq^Nvoh z{8-t+<S>N67zm$Mf>>#(J}AZ|7L+T*Ko|pI`=Q1dxVvno(E2W!pBxrgdtG#ufWY{& znA0!thN=7VH)po#5-5b1TTNflrS+Mfe-=MZR|4_!H@u>Fj~e@mdYDw>!@u+Xv{JA8 zFR?x1Rbd+D7^0Jje(!>jluEpO=kbtuBhgl?(QO{(SuG-PlY-2XQ(DVPHgg2+#V&2h zL=LHB#_v3OPQ6l0P8a7}B9KWivHMTnbL6XLo3)v3nC@<LX>!XeWxb203enY;fAxgL z1lji6K|~iIx47Cd;<h{jDPW9P7FLy9CZBhZLMFeg`+>h<YAN`>9Lvw?eto}l(2>V= zY0otGu{JU8qRWy;JkgTf+#@Osm}%&;q_JowPbYT%k}dx-?>aD@G<>QbH;?vIi4Nqm z^nK1Gv6xGfEU}c{CxNg$U<>spf2ED&c)V5=R(v8JFQ=AL@1EC7d#qxseCm_AtjUWk zMliO#<P(?A`1ee{>vq^q{w#F&5BBSa5}gHbXrnv5=oJads4eTT^V~};!loA6MM&(5 z+8T5@92<5`|7JL@Q%#FRir$)nSIMXNWP%vmv0Im26#wOP!YYBH=au>ze?C}#77JK7 zEl%Ke4xu-}qu`!TSuul{yTnQo()tI{5)^d+Br|Ta$aHX1yuo6tsWR=m7zof#Xo)1P zeA*}E;|~TY$mUZfZ@F%7pmv7WgWt(}W%v%t`MSN1GE}>?uy6QIjTQItT4ign0Df89 zAzF~=K)F(f>VR~w)f>{ke;yL`U%i{*4Xa~}o=yG{pky~38j?w=#?2t~SBiGe^9nF| z&kr4?jsqK*tKcgED>c(*h+Ehks`j!t$_=TYBK~o1kE4uaMVOmfA|`sKGaokqDBi6W zZvxO;))<{vpp<r@ncu4mo3umQrw<3WYSghT>w4m6ZG&Mh9=g(Kf9~zo>q&Isy0WJ< z4uW?WUD$t#J{G@!8b=o{(5QACR{bulW;bM1<q^8$TC*zeO#_m|M?=R)&2#lQr~Hv< zDWuY!p|!kexsNb6h_Hrtclt=1L*qL}MumQ^^zhOu<gtFQ%_lA~%+&Bdciu+!hZ0v; z>AVf8q#a)vzk64Se+4tS{o7H{AdiMx-v#un(!p8d=(rQuo`Ebf=Z-$Ko3^MjW|942 zy;WE0Udxt^($oCW$=zHPwi4=$y&{e^w?}%l(m8o^>*%)g=0ejaZ@SiKKGjVZ{%N?M zzQF5-Wjdc+>l5hyH)H*7{y;~`!3);J`E+mDpX^U#{mbhwe~nu64gHb(0DHL>OT6$3 z)ZcjdoUkGvYBFYC*&%O<4m%PO;<ls15TS1_n9r!+%RiIOA?)6~C@4ifleXj9pYAlr z7<~fY{}U^fr5k4X^0$0T?CiwEzpcCfZEU6dM&EKtzwC4WbmG4n?&GJlGhb|Ykf)D8 zE$bp~NL#Mwe{OA$hJQioyuHH*Pq~puiZs#5Zp+Ko+pl8F-&O;y!Bny@nyV9ldK@w_ zOc=-q{Rk-1Lx=MPW6MaDs&GJr2q<+gLLjtb0nr@NzrDQNA+F_j+I#u{jPrBn4!fRl zPcQeKJZfKba;NL2_hD#cH+Lw+l%_1V)HcNU+VXF&e+avD6<o=)gnLH^>QPf};9(<t zflnzEi!TVcVGl-t*60hB;GJnW&fIBUeJ3=U2M4NxJ7JOPu?tWO!gj(;8-0cb`I~Qo z5aif7-&fDnU?;4S2t$~eKCQfpczIP7ggI2=+))pu!kFRa(wPHK-M3n;Myr)mcFgO~ z?R(FHe|C1vRtE@1>Jp`+L)!X(YX0$EL7w?2rR<{P@p{;#DUnS&_!^RESr-{QiOGu` zRV%jcJZdw&2~7K72n(ISxq^U$4elLS>2~vv3eO~vve2#ka>U86R60w;gG=Z)myM;( zp>l$}i&un3P?>#aPgP?8Wz&|Ll7`Y#4LDRIe`~CBCVF)>pmrOF&9fkAl7_*N-SOjn zqLB1?d*DAGX*@gHsEpRs8%~Ye5xHd@L`#CkiBrwBjc?KWms~Ja+WV-nvq`5iPf<5p zd*|m}F-H|Cz{MgTO!mt+bhEjy?B~S*&f%0M$B^XLiTn073F63;lc_#&V`zvx>U0YQ ze-}x*gzz^`&*USc9NgiQjrfYVwq`m&H=GiUcqRo1=a6#L2$kx+txa{pGL+32z#+}z z+at@e$A$^nSmy`&#WNq$tSm*WK*gC)V~rD}SylUGNQu$`C>0>OCFPM5P#f$q)fc+y z81DDzLU?D?cg>_(-Rfs+l}Iv_gIm8Ce+_eR#d@MElzOy|nn#C?q(FmzhoxBkm+00{ zsx?IM7Asx||82{q+$_IVc9n`#UaVmdh<|4lffpEAiVkW*AW%M<T=Wf7tb_$9f9#UR zpNr7ziw8BZ7gtCR@G{OOeLU{P9`_ZrId77ELIuLUQP7`v=wyU_qb{mEIt;*Se{&9? z^~9JOZi81@F?d2c(X3*DBZoATM~xP^SRG6=F3_eVFvP7t$uEZa3mH{==KU^t4S!|; z{X0jkJ#{b17w5Ok3UtTjUV}9ddDKi=j(b|!KREO%otZ9#gLZB~5icl0%^4ZSX{7_z zzJ_iSe;UD~0+Dd+)g|mf0om?ie_S#FH=4>EW8KMXbR-)sS@6*DpzG}U;QET3-}XDh z-gTcObT>VT0Vuqg@^?p$nm*4*lhplF(xtG&Pn5yM?Uf3H**n+$q0;N$u+vYj2LzM= z`Ji0hLX*stwx?xV_=;?@;k(|T3+uhSz3Rt#f@ND2pY*5U)9{@#B)|18e=k|{(leEc z?xxpO2Tu)Z-(Nyo(}B{zP-FA#<UEa$1kfrFpO+ar1{U_-J{qHwoN6o>J|ITpwi7Lm zaZlSaQE~|LxBbrm!I!gAyFe{-T)kfP-}gJjf_>sX23`#pa;(0Onumv~B8YT^-fpqp z?)r!W1~Yl83&G7my%0Qre-a^5&_jXEE-|$lq|?1dZoA~(Fb#?{v%YS;GKhuk&2H=L zppjDvPm!zwZqYz=nOa|Ts8^m$Si+Nrd#rew{;hu-=`-kZcTX&H@*UncV%gt(Jfs|+ zN4o}2EG$8D$w+hbUGf!v)S=lEx9m62N{g<11_U7J2(?SBxjUP?f6NblOWy!W#)A%* z8tYS!d(l_e!`aZ12n>%4?=>yJ&|`QEPrzm5ZBNI_>5wO<;|mUtb1@{`u?CxvkGd1+ zHz$kYDYEaulnZEGL0<p*;J)>uLUMi12xX0@PrXxa$eF6bfD`4PYM%|mU@mo)Hu|xx zxjB}Y66v`J(n+=re_;-g$0phg+LWA<3aR|SW03`1+c=!>9v+-`1hq~mIt+VZ#<Qg1 zJcf38S~S5HIbje0?=C6b!^ZwzP9a(z+!tp)qk)F=o0na2BsQv$L5x~d$%P}aFnkas zA&t91F5fSzXw(myVr*^U(?iADT7FwMz2_onT;Sp1Bfv!Xf5dKdpxP<?w-_l(Gk^)X z-dL(v(r41SzIuO4=R02Zu6m(VC`Es~6zDF*Mjhq$CO-SI>`R_NUSt5Z_qwf*-$UQ3 zGh5d_Gs~9JH^$HTvP8d^BVMlMWjPM*Ak`gRPT3{swr`@hyiE#8J|zM>NhJUR`y`3$ z{^jr6A)t1ee-Vh_4y&h4&yQMX%DI^Id-LFkUPw|dn4Cuz<{H2tsD;nK!%wSkgYI7I zsM8X%4GPbB2n=b9$$bdCVVbEZID3xe7-c6%c+nx2V_-Q(2BNiKB^A)arp9<?K?O8c zWQ@aAacdLr(aL@;Rt+yUt`Eyhb<OmPi+BptrY;!Le@^^b?>y5V0$@k1%793T4K~!x z*D>;YGS@+F+R5VRM?r+r15?S;c;b}s%#$ls=~Lo~pQ;GpII`8u6M2P;<demOa=!w- zyVvL(ivhC=_pbz4ree?w0XIrfi*nYIWFns+GE%Hd{x_QkpFlw=y<KL*8D-~eE-dFR zIhM{de`@cLpHAsiIq9jhp+FSas4_~Tz|A8V)!LZ4gTX!q`&eTlq$7ynBfYR{1!^TR zF7=Os{i;V0+YW=b5R;@f59;4{NcS3gcl4nXMCW=iP;cH}_q$|xO(<FxU@`RPC?2y_ zg7g+Au@q~xQwcDQZaT`PN+_ZR0=?|@Rb}wfe|vi%9wUvHgLq7=3)$Me$pm^L#Xxxi zZy1S4ep0M)<n_OsKvRO$M46Q01)z=mL;@lQWu7-TA3P+Iom6z4sK8?r+6X-VRJx9& zv}5IV%m`!6X`0dSPjc~OXcsDQMp%($W}^GmgpO*C`2~Txg_>lhrI&AIoDo(=7-|az ze;4T~5%1=;9mAw>Mi_4@w|9<FZoP*@n=WbzVqN04Qc5@@OkBV99Cl$!iXvhD-v4Ls zTbSC$vUUH;K2D!0bB8#78|cDQwlSI1BqT$~^trdEixRT1bs}3HNe<9c^WX2cwziD6 zB!d9S?Jd+bLyTk_t-aoFvbM;~S_Wi#e_W~8<tq8Iem>XPXBk_fDZ132v@}T20;dt$ zwSIGCVn5)`k!4(a$Ca&@?`3#eN;(>F|Nqb(VcYa9vmQI7B*M9alC&eNnahr_lHFgn zHzh;)lrq$Ra@c5e?+3E`O{tNKp>kXKPKwnt+Z6Fxn?g!+JeCpplZmc1-LoA(e_RTt zZ~Z2>zQr7Tf#Q6kXIY~NRKCGlg@bQn>gNJ;sxhb>FFbRxvR5v1b<HyTb>I`z)g1%3 z`86p3m%C+KmZ5LC4E@RI7315Qok8c2p4D;97j^>|1Lwg}NavG}xX9XuBc<q1VVO>A z3vF%)8Ck)va7@e}wWVcyHMt@ve~l=R<LVklvJi;xu}5i?oupP!8$M;3%Z?QIJ-2 zOzsXw{naH&l3RE&2io7DDx>gh5ouYI-bQ=i&6eh)<p5A0h7622(=t8m-FOYiViV(P zHKkRR610UE#96a^aRjmEy5@9I72C-q6&~y+g9;Bz>Gga3i+^SfR4-4bf27}=M@RmP z>ht%Ql~y5zb4vnSQ(ct6410blNiUTQg}y^;0G;UbZ_zNwS`?DyADc@az{9gvqt>{? zCu4FyPfde0*}$V9F!r8o!e$71bu4p&sgVMr0L5zJv%k;g+Hy(zqmS>Emu74%6HpSD zm#*hTZM{%fG6a*_*i7cmf9h?~c#{GvuD?8T?^m&S_CD=+I{5f?yw95Zu*iNZJO?M^ ze4pLDN~AY{_g9ScYZJRd3#N!AW^Warp*PpZhV+y&cGM>Ev`H@eW)v*t&cUfl>!N1% zP0cc<Sl|(bOmS2}oVWyBJcAjspcFNJBheX^9Oz`ein(C<5MLfKf9N+pnfW}#?4@Vg z3pTOY!uG@_Y`zWJzmMh5{?==Q!B_EShG*)`z7D;ERVOxfL|f(p`=kv|ugOITWu$lH z!q?&RTc6shT0|cy>+mm^mX~CXT}~ZsVq#%=vufEl3C3AIEc){B*83rKFoRL}{Co;; z;rS5(w`^x)TtrPhe~>Io_u0&x&Xh(N0r09YhH*ejBMi^~s_><(t=ta=PemapqH<J- zrDB8V*NA#0I*ZTIQW|0YB(QyUMGG)pfTD~28k<;+!XgJJoi-Mi?W!#mC(B<Ou}GFW z509i#u)n8JNFjf5ZhDPho9ZGb*_cIXN|7*?45X!9VH7wdf5!bh=RkIV-9khg!t>q( zC*ylF!*2I*ppa-uJ{w+(9M25ws?14nK6!AJ*HjlwmG>iI$TYDjRVu$<9)^%rXQ&=* zS4mfXV2YbOcVgOL*c#QNt#gr!AwrPv@D>1ZiH=H)pe$f_wCr+)Ko)^3C%ah)S(Ed| zYVxe(kyEM`fAnkac-;h)B=6kaRQ@9>W_anyeFC=mSha;;c97}=ex`n(Y1VQ^#beTk z&_npJ!O}fw)q8by?EPe=EYkHnriyZvO%|GOhp0x_eV#TH`J7|Mt8&t4I$4Z`r+dhE zN&y!{=1T#0bmS*of_~e}xwcqoR&|{mB(I>tMGdCke<SO)GU&=ChNFl=yVq%U6)HhU zmM}0qOx~f~WXBJ~+ZuG5CnxGi)IJv|MZ#b|vPLFWU!j}^(5rQ!;2*-%>9{u-j})T3 zM~1>GhbFl+B1Cp7%E3Ng2lsFN!Cnj@+|~9R`dpvA4$e}N68BmCA?y@`2n!}W9zxi` zNpsX~e<-A=(2u$@Ck8Ct2aP2~{mV4Yq&yZQ>`XSAjnSYNj9n?6$sC-?9LhwKy`1>$ zg+Q~D-iXk^7N|W3!27Q!A~?lH++{o>_>g2)5ykNo*Mq85MG#}DkYx7VXCe^FL(+VN z+<jb_8@ULMCPow4X3kfX&4=S(2Iu1=RI-~cf6CtxrlJD)8{7HL%xiWwU`xkvQB92c z7(>@quED~g{XI6*T&6J(eJI94zw<}b&6ie`dGbk~<skQxDTYSs8S|xg$K0i+8!pHN zQ-8hL3a_q=nfAkA6Z87oaBxx<PGP1k{B!b5%c$<v*jK~Y82$4pN7x6-98`bic}w@` zf8D#OiF3F@8R`6;XHM=gp3pVkiMb^2OxH!|^Ifan>_{Y0=9~+*rRzUWMz2ryt#R`d z4IzR36iP443aFegmxIBaLwY%LyHU4oXM)a_TVoQPZWM|fO2nj$3{6%xFfwR@!rhZO zN)_hGn(RVFI)NPV=|Qm_Qx;|vos%Wye;AW5+SC|QMKV7uFLSn%h%3fO&C_P1-BBp= z<fmirE**p0AJv#^laEZunv$t{OMdh;hLS|=0SA=AzzL2*Iv;fiA@c~#)H6M}BT?2@ z=S2APM;~8tEWa$OywgT<*3vPg=hdNEZGsldnW29dlesU>zl|jlPA}m{r|s^je_8rU z>*8WZ9Wsz>vOyHl9o8`$Okg`75VsaNgENCTBH+aaZ+7<W<3~)lof!-GH*&5z4Hvw~ zq}leiZufU6CTZS<`}^}}VB|vuSqo^<d?1OpI9+$@jh;gNP5r53EG<lG_Ao$}2p78* z#L#6>^4vgyC$V!BXk{?AAqau;e@#+Vks84?Z0eia^>)2A7-XWXw!UO7Ti%roRB<jj zl1Bzlzp+omA3}bkISU%$>hEI`Gt4We=bt~Z({E>^iw~dA7}x@Bkvff4;!Sk>ta21f zf$aP#^#3WZPAPyilZ02nq}D$x?CZt(hqL$WWPC9mU5roIhckBZ*Rgt(f0rzl$&ebH zzyJ1We0IU!{%Pv{3;-|2=VybD?EU*MA3t9-3EWTPH6wl{duxs)BpaNa#EwChP0c~~ zq%l?~?8ia7)Dbv!O}${W42*3NqHL5#|F468jM;EJJ_A_}pa}jk01xi7i_f^ozI_Eh z4*xIbN4!3df+rKBDvGjSf01p!G$ztZJekrOGLI`GTiQ#iyYeO9vEe^6BJ4zyM~nhD z-P&ShSyk~Kw313@(moRw(v23S_}#aExS<Ez?VpQ(E@0A0fbDHLcBwe!=ZNf#*X+W| zkYbkcYVI^bPNZE9kxFc3;s<VX^=?+OgAU5y6Q5_WG9w}P^dg>@e<-rX7B@m>9qHN* zS~F(r61~=O<%QFSRr8RLci5uQkukyE>!FuMBSj@p;9<N-Y;8M}kl~?*#8z+=Y8FRq zh>m2uR8a~qRIfDGxOC0mslQEKp7M-auSQTrK~S3@o-@=;BK-jTQZ$rxQ}Sw6KYl8) zOB(m*C4{tfPd6VOf1`}Yo2*VqR3^y!KvD?t(Qdc8D$TK3XRjrSjwQBETfNTVK%rcK zVIj@2@Gc2!>e{@?lqjr@weF5it4kw~d~zMu>*MiBCgGTE3aPB?l{Ol}tx;!qsM2sC zDn+R!7RD+reM`v;nJhwwJ3Udf{|Y4U!@5#Ap~2-vZLLnCf6yr|IilJzX4?oQm=Bm) zt12q0#Iiciu@_Ur@q5b&a}v_h8vq$b!nSDu<QTw@*z?WKpmV5@-AgM6p)1#BeISjm zEN$_<y0>4_Nhs?7k{WEq=|sClodOs9CAHkps==G1t5T|fH;l#G*x;PLPc41`q!cYB zu|W9oW|jwtf5p`K`mF4zrHr7e9*SRT3&W~iY5I2>vWAgKo9&c8-b~qgc~L$=cg4+= zE!Py5MMyUk41S=1HbW{USN7>eNPgft!+x@Y;9O?({LAGtCInO_QS6%bMC?kV;UA^} z_(q<<#5z624B5Kxp=40lxiQtTJ&MT_JP{sSEoo4tfBTEyndr(1!1U3vETzmJRVS9` zX&0ZEk`u5?$6R<-11=C6!7<>nN)gycGgQOFdbhQee!4tyP8`NNSOB`~8UD{YPGG*Y zYtyOd?rj{cFX%A!Jp|$LP?omD$XN8uvp=&+Bo>LVd_EC)DXNq6$t06YtUgfI)y1I; z+V>>7f1kG5+!UB1IU~0}nMiJFJdsow2FExWn$F@cvnf%@1yfF0_q>VrKXN~6A;c`o zdu6Cfla6b-(my~N2Z_$j)3km6U>As|80~JdC9^#rG6PEI;U~j#jekp8{dI_v49@Ql zbpA4UdcwZczW(&_MKoW9o#Fpq|N8ltGdB3jf6m8$|2F=L85hqO0+D@ObK4Pz46vd; zO=U9~BI`K|*%Mc(zM%SMgN6H~@gsq!ngOeD_4T;s8nqiIqj6G&zkG*p)DV}*-4SC7 zOk`<cQW@7CdZmkj^DRV~GD0uHDI`v6Jlq&$M%bUU`SNG>UzngO&zVUxn^DGjcp;&D ze<uw!Y+Jo#$U7l5qYgC)&9a^=RPz4Q$2X{h?WZTkUs4}ciuNtnJwUWOhPR>#!p}~4 zzX;)_^xkfvi@oxeD^EC?>!L_WhR5;=-Bx4RJ5Z?kz=!MdYGqoFq)HUq#pLx9vb`_O ze?BLOUGn@kvcwtL?-I}Zzx+f?W+kpqe-m#kv91u-7uwu#t3JB-er^0FWPW94Xx>~~ z$`iy(>~GH1DCwoaunYO-e5G`Bw@cnQFGwS%I=-6B@l8p*$BepGw>>yeXhKYKNmC%z zqOhuiw8~s_zn8)|)D8P!;#^5#yyYND=~Hjjr%skkepsbynXXqQ^^0;--xkASf2Lc* zeY8q<d{7_uRGM@p91Bak!>gZokKHAzlC`<3tZ+`o?5{AUf7@q#xi8SD1IKgIYvAhs zV->cDZ=NVL#UUAfHa90r8<pn`Wf9xoX98)>-%t`RQX0gR;^njJ`Z643QU=4f91KsP zrn~h<YgkW8V?TN4ZKvC#@0p=Ye-K;Cjw|##ub$lf@mi%3R;kw;_1;N)$fM#3MG6JL zZeo03eAql}4wD!_zQZ&3<q?^abHC<EKAmvIgM5ddo47<ytRSuBSMSa;ATId0iwo0p zj3#f!yl2HL+x|Y+obO*f&GGO~b8=j1a}h&vf#b^Mg{?OmaQhD$heFWMe;@FYmHZp= zU(BKjdDam}?fsCx77ru@nAgXu#mlITfG2ZY9Lq6S=&;!yK$<?~E2q=gH$LIx$*`hj z%)7gsI@)rE^=1TkBGgo<iS|0rW)st0!p>#aw!`>`8UJw9&<!v$=EX|_AN~<7>7ke5 zvyjQ)5dwLgjMW=<>&-@zf9#R(ykglSA4Hgn<U9O`#3fFO{z%VoncYSW_P=@{hjdIf zHXH@5mVohm*&I5D>}@YGcyVEWacukgMeQ+oY6HEl1J~3N=VM{vq<3yCCWd27zGzcp z=os2}{ud{Xb^{|5m|h;43qG3<GR(Vx5U!9k^M>nJAJ?x)M1$Fue~tE$w$Nv`^MN$V zNf$G?8)N~{4P#<@bh$MiG)`NG+#FgSK}>=&n0`x@Q8YFH-=p8*m)>Ew+3|-6;9b|( zhVG61_fq`tu#S7oTfcJfs@~}0+7({44tv2TC$|2@VI)wy73OQV4|4#_x||l5NBY^1 z_ax3u{S*NRgNR!@f8sJ)T={6zSg6~%wQ!Gcm^05?9=&_#>R3vuxix!fEN~CveXe=< z)tSB%Cpfp>HS6{6ySZjA@Tct&neWEHT>=t3qptuT{`)Wet07QMD6WK+gU<k9Y3eBZ zF`#?#>InZAkA+t+{<g)BFD4M=e>G4ca0NX2xWZlf+pI;$e}z9t=n|jM=uv#+#1HrW zydB5BK^}901&jWf%ir>jewCi$$}*Ryre)FL(QD=$8S^Ux6a=b<Jw(?*wI5wiyz-Cr z-_3&onJL4!qfUMFwq5Uy-wqDjy|=ykxYw@3lo~Zg|DjKV7gnx;C)cc#r5WJ3(T*MF z+|(W0wXeOJe{Rp;+1J;mZUoc?+G^AVZE-`-H}UwR!Lqu4M7$&@=viGyKL_#QB=H(% zp{LL2<u!m6*YW1{4Sq8Bhe7A$!o*}(H=pbYj6`ka+59kWubnx44<3+#je$GxFMk~V z6c6$?{$TL&rQ>?<4SUY$1r8fe%D-OwfuqJV<E_D4f9S6*Y(f%;#agf%@OKL$frDmS z<|M!%=Tl>3IgFo@ck2@Y;JkkqzS&yf4+J2Jm-v<cRUr(BgTlY#^;$&I>!Y>gB)gVh ziJNY+YJEiMzE0EaN!D$>-D-{7K>OPLNoAL0ue(8r7{@6zcm~BdfwM;ca_9m(1gup* ztTzr?fA=dXebb~d=yito7efU&^4qyRCob*Sxk-)X_4<&MJU`fH9jNSN1_v6;Zi{oH zqsW;o@&u21Yu>QY%+SBH&wq=0(ggtSi0PK0VSKpFrZyWaF`C7ez)a+nVY}JuB=!=? zcQ{jsOFPCCdD4Ce;+$ze11N~ZDNKa8PACi`f6+jUxtsOYL8Hs{gAxFeH3&0H(_vuI zJTSxg0mEC=;{kZxGwp>u8;lzpxy!DM@E4o=AHo=Ewqd(9YD!@~C#NAM*#NWwU&oAQ z(QG130(8)AwCXL@33GE6o5R?wkLtd0rUdixplz*4SnG?uTaAqseuSsSL3iBQ-TFS+ ze~#OjhIp738;8A4PkBWUY(F6B@-V!`5TqPlzU&qC76%VQET}l}lYFPBQ}2wrySoi7 zM%tKD=*?=DdG(MKDh9s-qYo)bAAhRZZ~Zha?Xv431%WV*=%gK_tx`B8+bsOadM{MS zBhSY_&H90TAA9iOlf;~P`<>gI>74b6e<_OMAZf2Hf}H)7CVe*<pZ9%ZdNZamp5Zqa z*k@)?nd1aC7xp#(4f(T)eZ#7h^EVf+hm@E>aSKZQnAdl-0nI~#!v8iMf8@$w6g*y} z81lARcF1>1*%6;|^OV^)S#yGr9p~@AeHx!#d@Usi(s2iVa5qvLB(HJ`Nf6nxe;XXu z+k?D{-gCfya-<+$J`_Mnj#+cm>@^gEkvq^5Y3CN4$^k?Dqv)dtxbSV!Vo+SHUM&EU z2yT4R=#6?gMWymUnLb0?h>pr4+AoT-l|TifpV>u~$0mfT$Xv++BvfN40h?%*4*Y;z zfbmd@P`<;B2XSdbHl!d{X>b%pf8y}XIz_}pn%!>iR3RoOOPdFQBnl5@4vK`mqnLnJ z$2nfC=7xj%FqGP?*4_~JlXx7u3U7&bgSjaj9TBh%7&IiS<U3qeg`&F&4Hl)WqKMKT z?ENIGuehvIhuV2?x)e#-<!85PAo8L<7Dr*C-6WDJ39?AOBZ4mL6m}_#e~vU)H+L=) z^D1RgM>VsrH2JtL+->=qZ1R~NqT$c5`TRnJ1UV}wcYT}hzG|Vka#k5@D6L2ha7z)G zVXxaf;cch9&C~bd#6@KQUuW!(n0AGxf|X}5O5z8RD98BM%0!nHF6!SAl5+Q%d5!Fk zhtv?y7EO$6ZDo1r5Vg>be<e4DZm>o&t7$FM#}CYn$ip0c!xyf6I3J&|FN4wF2JgpZ zD(D&WyaFjA0$RiR=}BH&N^_usw6ani87QVhOV02UWml)&Yq!hN7taN4@1)a&_7Yka z#bwv&x3kg3htFqU+3ES`Pi*w<Vto1W!^OqN@#XntaPuY9@bqGae=Sb3%UUE5r}$0v z&g&3t0hD9}qGk4=t&s5MEhuRI*1vD54I^u6qe_$%@pqX6!$pen9TD^5CMhYb(ic-E z)E;KT(P?KqRE-VErINIaQspMqEpy=(ccEo1vqBnD9iy1+rHgOpXA*@z(JB@dV1iRi zS*uJcVO=^bVLw!}f4~D^es{7uBu(|t5<qFl*>}>%0}Mh*98d6cd!iVUEKtAF`KUt+ zZ`k;M2A{rsOcTLs9(GPb<Jf$NBNsyz9`YS7^~5DLEzA{A&BxEUC{eVGmy|t+&LR7r z+GnWkr-Q~T;Uyswk&1978l${+h;0wVH=AITsDEep{aJ`ie~x4#^EY220chM}@2e#j z;igd-AxZFb-B83hkkFkwLn{w<Y=FO$$s%6s6==XvId*VKFo|jn5b5WWgkV+%ul*`7 z<~(MVv(N1P`QXc6D=B<fS(~3r;x9mVh~<U&7k5hKAIgmvRQc}={Xa_w_TOyO^qj{Z zFn!eqJXy-Kf18=fOCTcMHyac`ua!)Y0%c((5l_(-e_^%!&T#f)rdmHu6uQ*lrTY%~ zEdmZ0G#PbmcZS?c4W2s0w9!vvnq~3IM9rC^p=;r}61o!=`ANGs95sW%HQ{Wre21I! zhpk5Yzz^`0*<$6g#lFrKXx$mce^k#s%`*>?=uU)Le;)-eR*VwZ)M}zD*|!kU2T2?$ zmGZxjn?zwKBD(hZjHF<E-zJF3&)LRW74!L%#O0ARl)yOH1Wl3H4fx}YJjV*Rq*r*D zvLSEH4kerlh_6C2T%%qrj>B5nVAQ7=gqb3eE@#6;B)u%G;1(LWC5c7Us>RSyXMZvt zetZA^f5X{(iRKd>uiQzZ%%{RMQ)G5VU_>gJTa2X^CE^dMY=Z7!)NArxT<fS*hI;~@ zQ6uu0f0pdeu%9IhxzS`lKLqq)t2G+tHBWzgKnF%;V4C3+9)dd8N#<LFngbnJW(SXe zET}tRXWvFujpWyj(Mf~8)9A8LO@OTB(v(3Lf1^ZHo$%Tl7Hp^Cn;RvDPJ?Wp#v8-V z;RzOXLaNi^XH_U5ujOwcr6-+FK4g(K6dMx^0j1Pv$EVnBBoPeYRt7|fIoC7lkHlXE zVXFfbR@+)w_FKhPTYXl;s#2?J+%C1nq&BfV_xN=1@#}bR@7G@&zx}2z>h@Wsx|gPe ze@)gu%E+axt(%aKoew2v{lFBeeZ#QlIuq?wMp_CNX<1L_33L+Ut=(wTkfd4~3#K$y z6jIvebxdLBBhg-NRK<5hS;k`O&0+uqR<my^_D<SE4A)Wzs%vabscy{EP|zpWQ4x6{ zifRtHJduP+%&J!oRh4}<#}0Tn_LV?xe@3jR9k$@({Iti8k6A3gw5yyGPewmu=a?@e znuAWacaV*{y~R8MXVquzZ<Wt3WX{U6Q=ChV6p+EwlWpr^5wZ>M%=5kIsF>M#05*ih zg-c!e=i;A><H&z>ZG3+I`J8<?i^Yv|1o%q$CeOlLT;@Q82BMRPLEwrO1bavKe`CU; z5CvSOwla?yUg}VtTw}1qN?I1w8zYG<m^H^fd}W_LeEo`?Imv~KzmC~C8=w8-!};ek zTDTUa#2iufECCUNx4%jDMIi}zO48^#f|s=%lu0soM|<05%8QOmrizfcva9%&ADAo@ z*Rz-C8Wv{C(~&JXvjMG_p%#Tge=Yx!Bv$SWzQx4v%R>e-zbMJzWhCvmGO|~Wi5-Mz z1|KK>lxne;(@@;Ecs!Dp>$JyQKtd!fY1(6;5hOLStJ*P+sWOoE2QrQ<e92fT18E|( zHliuyd}7(lmNb`vG+!g=uB;?{5h)HkderXkPdxt3?r|AN!$j&lZRKp7fBobzXv#oZ zVRX4VYCAGBBVQ8BFoLjIP?T{r*^<m(alHtw36|v3Ln|+eqLgtoN}E2Q*I$I+xM^C( z(K0+xB?B!_kE8icaT|LQ4-!YS$W^UnSH;c^mlw6G85Sw}B+(c*y9f7+7hj|Zwis{C zx;i){24w9o&L<y(G;1g*e{k`J1+$vU`qjt1XW4oRQ9(Wk&mkU~>@b1`YP{S~^wgYv z`}lE7B{KOC^|kG+t7O>3xVl<RpHrFb3%y~h+dg=W3n(^{yDaotjYhkDs!qXhG7oV2 zHzqaW1!^yIAL4~A9>BI3L`t?IFd>5|cpx7+mj{T?;&)Z-nXDCqe}bCKLi6M~`m+pd z$o_)u*h9zAzVmbO`bN+jipE37a9z`0RHG_RzrRA$#!zPR)6%i8EMvaM_I+C@K^W-O zn3!09T645HmmGVkA}ZO<uil~|{c^&S0~87np8UXMGox^U{TDOc+G2&~R+>Jt_l*4C zW3q<R2g%z%c+zQ(e<+t#Olwd-Ij!%k84;s{WHW+`k`1lt0lW%SF~^{NV0&!<mTxT= z1C0~S)6k`~$tWTW4h~zV2Sat}6+Iuf@(#Y3m8Tl+FbhwIA>dL!*$+eaY$sF~qtBp` zb<dz{e&ZwF*5KU}{``pJwTtMhZOqm&P`XexjI0&-pjjW)fBpGONz#1V3Os|{^L7+> z1`kRKJ4FCoU`Q5a<5sWJJxS_vli$t*;DyF<<Xlb~y=JbGFC)ZrWgL~^`S`HhOv>i5 zlMRcVuqm<u@Bv#wQRHke7jlFq!=xsONU{z1khv(gsLA=sEVLi9=W;|)MywLGZ#LnF zEYeo5+c_NPe`%3s1l0W$fCcu1IHoR}Xi*q<9!tsOM&@M(mS*Fy*XbpWwv+GdSQ<XZ zxIvEekg-^ego<b=eyUiJjM?zmF!>J0xwu59lH^?!qu@%`L#jEd$pWH`6%``nr@rw= zaw)2G)n>RqFft@d=tpF?sHEE@ySE(~%254nCqk6re*>qC6v_K#gH;+EBSrGtg^l)L zZfDy#&%mY+;aV0O<1$hd>hSeV;%!BW)-&X)#ZXXXc*3LRO3l^Hm(?3*NPzulc;XSy zJ|mY{u0Ic}Sou!r5@$du8LL>O$3AF_yZgE!KK=3H{M$HcI;#_(ct+idXas1s+x2=< zYV7G8f4Ic}Mb?#uA;U)<r1Oq2ImI2T1UNiso{kT53MFTa1z7IM0T%X#Eo^Uw(r;#1 zuEDMhU0dPbrDHBUR09z6va35(h+k_f%VXvumLUl2+1zV(UVbQYxi+~o_a<OeL<L~^ z+`Qx1jsqrBFL5FFpaZA~S+X1|ZG>E>8DwlDf21hbh@jV}<L<C=a5&0FD{avYmsnr7 zEi|u)Au7Fkt3Ie#o^P?stdqOC+8QJz-QF-4&b4k-E2E=#-(16S-@Vri>)na1BdfUZ z@T=)v{=jt<fV-ETeF@qB4&6YjDRl?nf^E5%XcfA2E+@v1w?7)S<~w>Ry@6k@oj)u< ze+A*?V*_mSP?Pm&WiP0WTWXGL@S5ibsv~`79Q8oGdF>I{=9yp=rE__uxu$-JE&_ip zKM~BUCW*bhn5k4$>fgL&Qqnp_1)tZ%zFNM&=lC1bn_X_=`R%#~dD;k)->?bXqDlBy zB+mPh_O#q)P;FC1Cz~xX4Hfu@uR?CWe~E!#R1JkL5A%oS84RHwms#e*VAwawDAME2 zjCGd>tC9#uL})$p0&h01J*K&gCLZiD&-Ob%LvL_B&0D$r`^;<lx;r-0eo!dMSOjgN z_)8RG+9WIssvEYn&0?Ekr2q7|k}pciQAyDSk6Vy685Az~VFX(92|JGm4W2&+f5)eU zMzh-;57Z7pWpJ?DjWlKOz&<6=q;L!qcs>z?y1K=9Rbg|Ksp#EHMN@j@q1o^WX#}6i zTdh{3)ygS5=2r;`wU-fP$8>dI32y|kQ}2wrqn!m&j%yS1V%A+vu<t{Ln8+LCqn=)l zx)@v=Je!AG({~)m*l>YlAoXfxe>z=Sw%4re#ap+EN5M<Yo7F7yswCfbv)37~Z75&n zDkqShfX;xH71b`!^_ogsS#_`J#rAUPG{I(ov!pU1%r(?a>Gni!Axcw}<70m~>YW}W zHn_?~9<RrRlJ$W&pItRsW7eElE<N?<Xo|TNFy(6IVq*TNkwsUNcNUklfAYk|J)!VQ zQD{ZCSE$MSljZ&VmenN_I6Zar8uj)#abV9*OA;x>oq@-{kvhcr<ReM4hQg1?AzQOB zj0v-Bd&y9RAWtw$LmHuw+)h)$%Yz59B;H5`%IOnKcr&Mqs@O@!yXI>`yNKzl^lMmv ztl#5b{4;AHf*^tkM@RmPe^^W`AGXLEt;80Q6n-KXoV0txQR4Ov`OfRHs?@=6WNgSY zC(J&>x)!8CC-quJiM)DgDA`(}Mj%QJbn2~PZ?Lmj09oNdGA0L-r-nVhqzPw1Cp0xg z*RC<I+o<09LqYH8pGTt1jc&Kq?W%Ja{k6g?5{mnp;c~3q?lZ#Le;uZ~YFCDZmwXiW zL$DsU8tsDvg)q3!T=REBfR>^GUO8bVhmLcrMa;zrlPK-wHdyzdJ!m&MaVF{BE%qa2 zeOe(;L>(I}MGu<5SYiYwxES(2<+pRY`&HmPI10%gRfiC=_dY$Ex23TA$)8`6ej&3_ zQ7or%se6Zw;mQ5>e?tk<fXGAqF29}gySTK;zbb}|4~{}QpV!OpQASbcBv9=>H!gqJ z<|HPp6vuI~%}#mdoETBp9CS|__eC`!IVHbc!~=I_L|xWdg^(>O)37)nb+|JlyJU{o zxk$UM;{}}YWu8y;Z)D05gf^_#$D5LH;iYG32(1{Sfn-8!e~mgr45?6u(0IZ=(dJVI zhUB;);wn+)ETalTu3A_CqYRjjNBn%7>=ffl4;2dQ_6_W1#6%B2h#SS3GU!RBLJ{GM zLM2n8azca4i^Pbf;^>Ocy^t{_)L%YOW^E1mH5Qm}VlSqKgZ5T!!K3IBF{V-dkC~Ia zpqtL53~k;Vf6WF9H{K1UyT_GL^0eTL$7`jDb;zYM<@hv}#;3WfCEt7ei{>oQnC{A! zd@NSiY<32nyk<RSol78z#m6^R<8x_vfzXCBp~jJ16NFqZrl?rj5<>#8J(B&IRrc_o zB>0M!j*9TKZwq#t?bBA`%slxHch~CeR%^U*k!7dLe}kh?A~av^xI({k{PXH|oaU*G zsccY}8O^YMkyw;F?LuLJd^GpV`9OYP;)4_^stC#@H63oUDjIg>%8&rN8!VadK|G@A z3d8_UI3fYHZ0MfWTL-6!lMdv!Zy>GZSMSa;@ReA(dtA9NJ;!M9NtXe#ZjP>O`}<sT zzJK*lfA@=bnv>&7`+)ia7bx91u3TQ&db82$whx+OMkWo;#JI<a2t|oUB#z!t8uTXe zUo0TNKihxrXv>+YGt>~#PGQWGj3|oWQO6i1v3^kSd;o+%d%q&Z$>$TMIQh<olS3N? z{sv91@kK0tQA6ZDpW;Gtt2`o*H*edoqaN*Ear@f5F@J8h58Lb3+0eNSrMGj^5|=`5 zSprk~tn~;}9wstnLumgL{1@Z9fRPDOF-e2IMpzOSObon(iw<M)Hm(|Jw1elE^9Y+d zPxy}HXiasGk;r)Pc~3{3R@*NW^!k&eNAUWlyR@`B1_)M$%dQ=J&NTL~m9{|OM8h~M z1GgMgyMKa+q*+!33)6Jnb|y4x3WKU9#x(|AO_;v&-rCpKZsgA-2&6+oN1{NIX(KF< z<U1Rv<~0Z;`5?+8N|?CbIOvW?t+nhC0%_3e4DT<71d{xAPFmtpNFeP3X-U&IF<2f| z(Robd4kVs*ZXtP<m-mz>cz%3wG&A(??DO9uB7Z6@j8z5hi0PK0A#!T7sm%sUgcNKE z%rx@W$M|Wl*Bdw1>=WXYq)Ae~Hs3K$$+mZK3$&lX0~3jFvNi&i-e|4~oGSxqvP~q) z2XG49HQE?%3>||q5cjE9WM5)wSfP(2_OO21P^i;j17cIatqdlUL7e!8xG||Mt`G>O zIe)N^%$kz?C=qBlXmq-#DzygDz*@_wardJp&Y<|n27*rqAHR;#H4J~MHaEPP9rMp# z3vVOqQAtJW%5Zp}V-*f@f<OFfMD{V$tMyvFv(M_a!(Jzr(Mlk1br8Id6>Xm3Ky1}q zU4sB4(Un4O1wc!dwlZKRYc2@0q~((VsDCONTgiZ?5>f%!K8AZIjp0}&eLS&m7Bv^+ z)F>NWul2yb6yT3sS}j8tTKmi~r?c>Tn)sOQn5dM)w>0({xWlVi#*_wJ)7Q3o`|QfT zt$BA#p7pk%0JQniGOuev4=r|J;Y-9t?H2R&@lE`i>rHC6H3yMb`Ye$ix>IrOE`M@O zH*RZ7dVqSZ$&>6g{7L*ebALcEb@1)=+5!K89Q-ZJF3g1jPuDyXL4sq}Mq6+6VhRpd zotf*Ys9Y5&EzR}LL3M^>Ouk^C_Rul3?>q(W^$E`)%Ec7B7(iPoaH}?Nzd)#|f^M(x z8hWkpn2eBaJq^U_ps?2|J_6GOa(|S;Sh8S2S(~#Ub&6Vr!XtFU5%{icVA%xr4-BHY zHeHz4W-3{w3?1}KjB{%<1+}Y#(^nyl{V<$kcq?ZC6!O?y3M|U@plUgk{@%YO7}I13 zL&?Biy<I<9SNNo;$Y^YFszBELDfeYZIVFp;eqcZ0J^1kHB`B6_P12ya7=L}T`AFw{ zQ0y0EA+92lCy`371(u09C>Z@==pNR&<9~AvAGs~b;<$pmC=UfhiujVNLqo|{KeX2w zH(JfpoO*I|pp|43HC{ld4)IezIBT;h)kM2Thygn0QlC+YwtX$wfFgt8tB4wY58s`c zo{i7X=YDnL!gl7G#s2>HFMs&zl0}}*BI*#&8wkwnYs3W+qyCQSK9|TMNa|qEs$&Ea z6}7E4x>2#f)x+p-yo(bYie*u2b*<^9MTN5dhF5K&S$8gC)p!?uKq{TpxRp7lvRT*g zJp5ZySg|RL(+m>)9OnUTVW*?*VrMU?M5t^*U?Jj?i>T8W=8{ed{C|>=wO*QXS$6&9 zpq~40kP$;Bg6z3DD1wUZ7tn9P@1j7T<dW~F;yqY*qhZao`*c<H7`b%Xy>`2F?lNi; z&4*mh$AAC!;e33;PQRUvE<Sud`^rwwKYwDQZx`dsj~^~BK8`QXFN2$<t|_ptNo(5& zih*h}>W9sP_E;VNg?|?}>r}xXtLs(A>XfUX{usqxj4)h4%918ihY;Sd!TI}dpT=hw zU!N?QeULY|X}nfjPbP_6!|^$2^i49H>i&;{s2*HS9`&diCY%c=*8Qmt186KBn!LZ3 z5TuL+;8a6!|GC1y<aFL`9m>HJlhY+d5F_`4RvYU{6|&dX(SHq8Q9cZsYMh)bs*lu_ z#>oIdKwm+}tb^(I@v0j8a4lMtG|Lj9PCh_DiksHhXVOwPrfZ;J-Vce!zLcV+KN3`# z%;SZker2?DGF_l+X@&si!#rIg%mh)N88_5Oojg);Yer;XJxa{Uv};tmGi1ajnEByi zvTb~xP#Ood41Y2!RT7faaCyX*j{U=&_(`lFqe>E+oDa%W%r)GEBG9l0j2bpK@jeBX zn!R3q+*8L;NfvT3@urN>?pK$#hqR^%)qIC!!O}o_a^lN?y}yv=7QLsKv1`ni-kqP& zloL`9;GRA7{WUhADM846ifTGaPlPFm8k<oXJf{`PG=EC_xv8$wDSDkwkveQhnLE+i zeY8nlN})VuK-(ZOe{oFIK~yTFI4E`L82?(CXuOI7uQ;5wm}-z+m120aH$F1whK7F7 z3CAhDW`BP7mbsJI5h#Px{!HVQJ6GZQ9$X4l=LD4+QMxT6npxFez)FaMsth`lMUi8` z!kELefq&f-1+9o!yhdHGs9mI1Ysb7=(QMeg8WS?vALwWqmDq78gXuoaniSJ2Un{dl zX;~fQU1=_O5p|RSC9da%*4UZNQ2B&d#L{+M^NI>8?--mH`v%jH*jEE?DVb7Yo(jW` zZTm(#i8NsfDNh{8fHHQm9!FCoOH}2e_AseSM1LMj2o=N5R5)wWZw7%?Uo^c2bTKkD zqJXNShA1#a941#}uQQeV%+U0ik5%Xy@5Vr$qt0t_H_itslHiQHw(6kv3=xMF85xK^ za3ShX)nmuhgkQUuZH!qL34w^Lu9g_pexI||t7Jzx`wY973@5%cP8|dzlI<AioQQ;s z3xBE?c?_MSj*B0TJ#__dvYUQouND(*7eFtSXqZ~d=BSDZEOs@SwZAE(qzv~ZBal_m zf`Z)P(sp>fp<r0sXE#{3Gou`uFL^jq2Dl`e4M$tpcLU?*su8ncFE*S>b)1iHX`qd9 zBzxu2ai1};)#l(0^#99D<JnD$x#=DPseeQRQ7%v&;biiY;VjJLD0qcLENUKp^R=(A zoPMQ=m1}in-0Ic}(d8QZMg<Z4cq;2$iEnw*XvuoB!__w*fg6$|hn@dsqYpy7P<=&^ zT4~e{yX^lU!y=t>`T$p%7BAD{*=@JXp+aqK3Z)pFtf;Yf6i7-+lu{pW5c76J1Ahi+ zq(HdioBidP9N%rU54%mOGUN*fvj}PPalXfuxBOeTvC=PVI@{PPAP!4$jf~k9>oLto z%vVz=p~gU43@?$$2t=Vctk}DWCB8AJ0&@37M5EnmbXw|^9QMg?G8gD(b!ir)iE$%S z3~ItC68IFTjH^Z#K&RLLr8KBu4}W9I5l%&s2FkL0pJvNPpI&C|V&KRhm#=cJ>$PAi zrfHPXpZytDF8q$o_L}t?SV~<)CC8FVLkFg6Y3N`FeK42O{e9#@8DjF&{k7-Ksw{>Q zeS;ikph*3EnEFmn-)H+*A+UqY2%li#7*kZJ^6&`FQ{=Ae4dyV~H!;C38-IkQuQz$o z*6)Ux(Od?3oS;2-Hdwgkab;w$kc(bl{ezo!RW4%WwDlTfTA+@iu&U!Uyc$%+)QUPd zDjmBcp4CG%d#7_-rDIn{ut}<1mH8~Vtg$#ec9JA>h{~ppzveWm|7Dk@81A>i(d%Tg z<C~jl3?ZL##n;tpRL01vSbrOukdmvh2bQDyiO6QJ)98*AN<?bbjdtf!&JhiF21a?= zyq1X;?nY@^8G9)i+dtDHVgc^GLG?4kZr~`SGWRNo(<nfSqs}K$!&zdJuc@yr4fTlk zbow*H2I?rp%A=6O9K<&z=*k#*C>~zM$aUkm!pqa0A4UaRB&Z}^?0;HUSY!9s(}6Y2 zm4r@0o%I}ZB4b)fX7plMT8!_zxA?wT7$Oh_k^oS@sEan2_~lQmdTlzG5EfWr*K9sr z#%(W#ffk_;d9#(v-l4v_`P`Yxf=~kLDXS($^7RY;1$_nQ;#;-F;HtQnDMQ(6wogyH z3fb;g_HE6(TRzg*T7L}WDXhwp-H|JraT2Zitg&(OTz{ETJHuA1J5-2LD|Tg{RV@0^ zqaQl`SkaH)D$1(1{(kh))y7gXo$_!1x*t~-Z7f6&)GgYWTw{J^(FR0xg<<JCE-Y=h zX1MRyW$2jp!z?U0G#m^B74sBO+FV&wn2WdI1FrZuzEC>G(to=ty_+Wlie;9o_j)It zfkJ|jI%&=8nx$c=mBa=GwZY<QTt?t&yFMP~v{c#T%brb<n{j`~UzSSiQiKxT4{2jG zM3hKJdgx};9fPDDdSoYtcuiu_HGk)0IOw%!+{UWha|y}i0pbR=01r+$s1n_l;=2^z zuTFd?WlLnaR)16{Oomc5>76XvQi*g)=;alV%R`*^!&y&iNan#t37qsYyghE#dnaY@ zao8%L(@Tt^iNnf8@n>Ff0vV26g6mCcw>7MYnPS|F>!Fujb0)MhW(wN|4eYROZr_sh zlbhG`;)gt-OqK!c;{4l~RTs7Z76u%0k9%b0@#Pt;+JF9U`BsgMBqoX(@XDbdon($} zx$IWEjb&YwA>s|_jYZyAm17*ESO{E(nSmz4Q$DUk7oEy;6Aq=Qj2DCzMpPzKSv=vO z4BPZc^2f4{vbCq0KubnapxvUvTP0K_>E(hUuV0!O+ya4_5$NTjVfb~K8Fxu$MsV@@ zW=1*xt$$ea-{6Gl#%*os!T%Bw<)w`Yq}+3-sgp~6hD~~fGtk2Wl6bXGR6onMh-$kK z`aV*lKq+H%B->K##>6&gY}P_x09g^fU-m^+TBS5Ao;0(q8gl+es2i{lO+irrexr#1 z5-+3=L6#&^I1;(7Ev{;O%61JS4Zk0SibGv2c7LNF<Q=0s?s`WDX6PXt$uA);>Bl6+ zYCExv(z2(FhrY2C?f)5$%}4IK*qXM$?rZ5wOG3;gg{hp1e#7owN{DydYuz#-mZi;4 zh%^=>F&mFG%I2|hrOhPD(ZsTtdNWBJ$FeHLz+b#9N*PZ8BRmO9>jf@c2Ui<Hz0#t0 z)PI3;kAQb3X$#$0Yi-IOMu$PsHQxT>cZ6U*ZoSqK-!{`M>~_K%{J)89U7n7n+_fs_ z7Jx)A>Fvl;Y8F>&qMh42NB$O0>Ew$xHHL6bzw>Iq0uCgAHT%f!l~Nn5XMFAC<gemr zgNSFvwy77OIQX(k)NpXe@VSZmGQd!*0DnVr=rV3Wt7Czo180Foo1`jp*$q(61;>st zR9?}r2W^5?DtHCskJhH}sddzP1i%B+)1MytO!Keg@{-GUdbV6YXcgj90VFDqImHU{ zd8(r8BnhXCm`>I^B)t4S8VRLo{MIaH78Gi^lX7JL2D^Wz3-j8Hdu+;(b-&2g$A9yr zQX1x!R@((uTFKG=^byfMvD5lES)9k+hyb@f!dva$K{KcR);zi+`m~U{<`~|}Sx5>B zHitSQ>IfqX2m;@I07P@cU(86^U%ql2zoQp;Ww?J~XWu@46z|7XzWesUPcS5y`6>BZ zU)eEw2jrm^>E%IZ+-QM30-AY|Jb!4k+Vn+*((vMZ)S<jL?0kIj?fgvQoiz0DBGiiw z4~nB+B`j;q!q`0oB(QzUTwoB&(N;0uY<3R{!0akv{HKu2r((8X2o9f2N=j3x1MLb^ z3rk{n`UWfYh(TX@_Vu-!NDbm1E6E`;btUaWGiAtOlVk7`lFn9*ON}+5@PBajjg1o6 zm0#898=;J<-|60JVe*y0^m;uI)zCdEoORY$<{G~B7OS*0>+W}Bf&xcw!<Itl6$l-8 zGBuxQkShU|2m-QKo@-9-2N015L*v<aRW07bFyMY-T$>BHI7Dltuu2hy$)_oXKy6$u zt&E65Q_)Y~jir}FIVM)2fq!tgWXhjv{HRFpq%j<KOSkuaa)?T#H2$B#r!ODJU!SaR zeB?Lltxmg_4f6k>)rS6@o@Y&z+paLl>_ML~;_J9lua8bU<KZ};`HWe@*1ujYE=eg$ zG#$&c3b~aFvt|iSvPoK<Xr6{iCwjGU)Tm>%4gIsXPi4AGOS^+%v46P2ZL%fz(R{j? zT86JMYT_NZ$p@tD%kfWEnH$=o=1wp`MKUbtPt|Mn4wdvC_B!}efjLs+ojLq_@uf70 z1&?9h;7gVo>V=Q-fgV0aJLn^qf{noZJ=g=n3qwNhY2su4iYB}R3t&Rq5&Vzz_Nf7l z&(X#OKBG9uw9`;d`hQf7zC>K)rOCmy(0C-g&wp$_IKv+*vA*Uvd*W9Ntly``H|l`H zuQT@t4y1!`uh$Ov51dJ)`w4Gr??*dP=&NwJ_eJvjyYW3ydfj=_{QvA-3vb)Tvi>W3 z)S{4Do6%dg0}GI3ISt@AIgZnF&rO4XmS~wL6seF@Z1>#$_kTOPBxNoidhSwOYKy|L zWX0j`yl1|d>0-EQ^dODsF@l6R<u2s^Y_S2+xqswjP2mHr)<Bqvtr0<rN}#j?`6oyl zcn{P@wsm@zx<6c>Ct3n4QlggqnwY1!Hb=+qRH2Z?DO{S9Yp2hcviila|LM(}x7Tkd z`ytD16JRz-`hO&><ivNAIIOaFT5a|Onxvj=xK_b2>h1dQ@{~_J!Uc|jU3QAOMZ#eu z(+G?b9f6?N(G$|{pJ+r&Irj2H_J^HLL!?Eb2~lJ8gj~E|9%7b4vDZtZVDvf`ebIa? z8cCCHfw+zV)M>?uMTrKwG+v9BPG#!re4nePs~a@5K!4Z_RYnxZR9QsTpV->KLxKi1 z!e}ZldRFmOee^_vQ!hQ!8a=2a-N2f|GWfjoh<B+(cukVa&UIe^%tHwkDI~eha!xL) zfYg%Gm2+~%>wA)9IVagm`BjoC=cI~O$E7~ZyZNHA3sS&xE?_}vIe?Z(f{8(}0QPfe z^b&2y4}aNP<ZrBt(n{<MPI5LLif7Sda>?H?O<iN4TqaMQX}Y(78?(9|jxkCrDM;IA z2&EvAIb*5#@xoP6{Y@_fdMC4ic@L+SVzZ-qkc*|w)MiCbB(`SnCP3$-CzLeX-gfa| z&2D7J2G*03W;qXvqx~8OkS64!H&{A@$?;)gcYjTSkHzJ9T=d1-;|7ZXw*!3`nI^^y zoyLP&$xNBRe}X$6L0WgwF(ge`&P`ah4P88BE8N%>WjC?KDMf2!l<MR{E8M>fYA@b* zhkha>CZXSa<mxbua;)9WClhG4rbx=Yg{c_*c;a|5K=pv)raIL&CbriIUF)|_FT|Uh zLVq?d1!Bf_Y6h+N{QKd<7OYQ^ni35-MZuhcelgtF$JrEp?l>H=JA++ZTD44Ze5`Fj zG{SXNN5KO?%P@*<^q`DX!zgP{Gu0d`W6O2U$(W2v<@4v-moL$i3&Wk=BUCC^O0rWt zv>vx`(+goV7%a+TVx5{N?cqtC&0r_#pMT(c969HuaQc?g&n%Nkzy-GUeXhg4#1~c= zJ!qqEMfOao>tySfh@<57`<QLc>%+h4mw;pt8wDk0e-~}+0JK-wxoGw;I-HvRcjuw_ zsbEa!xEyOy4Gx9ps#Q<xCrwUs)fjkz2}gqYYDAwzy`kV#!K5d_NCne_rWTCPgnz7U z;I>B`CT{6l9-LRf+blAw$L;?7^ejb)r@EE@Qv9_}8pR(<*=w~sWTd_g<4|vQnst=n zHU@HsY%Lcpkah1~I9db-Pmd|@YSWnoftc$B%oH2&6+t!!NXdcv(R1lf^H1|U@*jS0 zcysgq2EDyTpojtmMDhj@yPd%<l7D}GdV4dxh@}q#B8zQHVs@V+o9>jpirYgvsOHO{ zJ3V?#$EGmq<)`bx?c4X)=<P@J?(N5qFq8|k<?Zi7bc2T1f4seUfBkNFeJh+`cGE;J zdXhk<D1#ynM@HP1bxfyFR+6C<;JfjMsO6QuF|mb432RnfSV>y{tV3+dL4OZ;eJ2jc zFvr8%*A$Wi{-!k6`ZSk$z38fJK2kq$2%9p_>*4G!!`z;y25LiCK*nf>e}-y+^$myA zK%fz+`w@vxRC_X?Y9{Qo+cxd%9sQ)y>Nieh72w53pjpGeA7NM{+23C^Xw_E`!kn_Z zoc*~4Xsk6-DyRTG>h1$<iGSK(DuBaL$=VL0uQEyn@HoTfuK3}2-E`t4WN!H=mfgby z`hjs`66$N{AE=BGA|pd}9I}Ol<k?I9hQCq;{U1vDIiBG+(QNYb#9!bo0)(Ic0)XV# zq!N+z>nmHQ#V=3mo!SK(W1e+doKL_{8*~4D^2&|zEWjcG;N!}I{C_eP8gjFCtjZOs zRxT}9w>(Xr;o%uFB~~s;<Ke~T&}4TL^={sL$~b+@mQ*R{in3l2iTCc)$6M4NqF&7R z6i07f1NYs$9iTskgIg%L!T-TK?|Qd4Z~rGsM~)|BQ*Yd|tRbAilVuIO2c~v{kyDRn z`-QLW?q0_o8a8E(>VHXV(2|W60t8rb4%oJ=ArqC+vIgyZ6g5%F$24=u3?;jaxSkXB zHfX}h+$#l|hs((fN1seGnR|UaQ=O5n)7=a}m_2Vq>~5ZWl|?S_;=oThOxqz9ExOho zaXxs@lDkCFrdmhtU{?-4fUI!!tL-){M)W1`116&X7Ix%(9Dg1(%)kfmCKiZwGX#|E z9?{YTBLM<1`hin3@la1!NM+V9G+ckWx{67rFs?ZCN8VfZ0%4D*cEH$<ZF(a;|DoRL z3_I0;sdsBP*%!OR=uEg0f6;KK+Nk!bUXp361SQQ@Avy2`|HiwxMy=LtUW(Jpmu#nq zU}$3n3ke?b;D0O=k_<0^g8@svfH-_e995942+q*lf#&JEXJmg}%=G!{T9)BZ(K_aA zVz>gbh74Npmc)11eAt1txyB_}Ef~=P^FM6OabT!ZIcoeyFYg>7QiA_^W?OfLHm#r| z4{({F4Myddo>=^C)mEoObyT(uVVliHv(XUS1Z`z$=zk1y$kODM=jaE<Jm+DGbVo7g z04oY_;@$@8vy-|J3e}V9WaO3f^aH0l+eD@KJ_KcLAWst*74Fe559JCit=`yxjPRYi zpCK-+7^4I80m4!WIv+y;@zj7H+Q_x+&=`RL6nKOT&78Oo@Sz&%?e)fioiBnAPyNG? zLG6bM(|@P5Z4JR`yLr)WvM~fgX#<*60vZC~A@>IAK^lzh`Jhg;zOAX>2n!Pv5#~6e z98i57An0ke*6#J0@IxKCgzztVP)!^xpO;|Bf)^u_^f72BcB_5Kx!F1df$H>Qb~y@x zWPX#2X{@e4)yAO!s(N4;&*T7_lI^I;=jhEa5PvZ2zy@$m^nwk<69cY>Ff-tG_-1&6 z{^(tO8lpEh!`>~ty8XR(jcTZOeSxmu-=5)V7la)|b_;Z8W~k2)_nCL#4_Jnw&KxpG z2*pM}<)5Gxm^YFpm{Io3TCMH`<c)dY-E|O!={A)9$r|Mh!EI>%Sr=vo?J^f36g}sk zwtqW`!an?EM)qcDLJqH|+%|ZsU$&bAMp-l&JmFYjiF?VAd$AL;IdC*2>#{7(Jb2rQ zym33dIeEP}uhVJ|8sg2i*gbVcUtuU8LOX2!{ctqwY#AXrfI7gGsZeC3osHD2fS+7l z9%9r6&33;f4rrk3K(frx6v*q&HN_A0mwz8I=Rz5yChQhiq`(bpqQeFSi0NN4-qF+M zRof&T42l-Ka`n<SEyo?_TnuOno2t~LZSq_&VT3-}#aPQWiN>*AveIm-!7!n5R7s2N zV1P-oW_TwXuFH<fC9p@OsivBWGsfS3pR1;;8(IlcozhO7kum8B*fkkLK_CXPlYg{R zFDxSNwu)GNNo*B&aCT}mcdh$-8i5<aL{Z90aBt%%qwb2`^GxxWX%PyhqM-`sYAjrc zI+U_)YX&|Cu0ur6DGXDB_ax)qxvgt9>5%lKWOrGiBSx8%y(t)sRr(XYtIQq?$hL~m z#ltvl$jB-V<SM<aY*bl`O-z}R#eYR%61$PFE8Dav?=hggED_tmRZ#bnS4W06urej< z^M65uq@WkWdW5vzOdV-5YRYX{G#(~~6R$_e)Fxhq6z6Nn!u6;<&a2KzI++ZfWbl+c zq*Gd`v>rgA9F3UJFHOecQ8v;-<-9l=BPoPXi@Y8*ZAuFzV<>+<PRamgT7S38^qx%b zy?8-j-8LDrw|lNRrp}gHsQFCVCuyI&YRCRrRhFNqna8sHGy$H3Z2fsjGmmL2D|37Y zk>j)V$%71`s?tPB6LpvabcM<eNfUK|Nj?kULZ&NAP_hIi11KmsJNkHyc_;-L?=G!V zZlykEi<c~65Q>bOCHSE4*nd?FSU_!#rHRTdv&LvDYfw-|kvKjdOW^!9a6m_qOqi@e zmAbOETCmn?vf>;7UU$}$;y%v+utzoNTDUdWz+XD}%Lsp&<1b(E7gILtp3MRmMK<e3 z*B{f4o~*vh>bo%2cXc{5^n1ln?=(Yt=h8a|CBJ8|h^)ZN3Op=dlz$lJ1iZmvCXjp^ zr9SD7G*Qw-NfRY&957cmuT5EWFepJ{2LTd`b_@o&lB`;nw;FFB<J7L>j+H0HhAm6l zzE8B%)P<yC#$q;*922|7>R5_#18$Zx3FJ(Ip*V*3Fr%e?D{h9S=vkVgGdr(-Zjz0a z!v|gx|FU&Pw$6Cddw(&E1SBJ60de45Q685tLcg@NbEG{fGl@&iZ>}Oqhs(hO67(fO zUr$rxj12ZVFU@Stfr*Wp1bvCu1nAFcgRQs<0KY=Jf<_Ojt&U(4C&0U2G+s1z62=V6 zqPZ-Z%c6O5lYU`+?*P*J1e?DVGFDh|_0hMGmcwsOB04T<oPX328e8)_m`1ER<QKu; zQB=dQ9<{NYC$EnQo{?VEdP9Y4K@2Ao<T61n6XYNb`^FIZe&4gyjEmtlNwL1n*UEgY z1X@a<rLQir_XwT3=EQxFK+D|Lxsw$6OA147fs&1CYi0suqnd0~d+~qv@3k+jC5oGx zb+nNZefl6_K!0TsgvmB16H0myHg1g;d{Cm?A?bBj$eiD!Y;#Ay81C!i*h1Vud&?b? zi#?^%dw4v%<1jkEJF;vOsxhwi<QB_`fRgp1B|}!@F>U3N6FFc?VvWXhX;tu`$j__> zV^-u8MA62Eh2ddI(21x~7KUFXWK2TF)=U)3CUz|4UVkT65c`RlxeFj;Q*~nM_j)`r zDUSLoY+#g}U6ln{VGFWyeW#3UWn?QOTTvt1z-e%8eX7`+JGaeH?oN(VStE0IIKXfk zofLwYh~ru6_hnI{`uGSZ)qF0i_Cy&yXrpfxbbgL*Z$1r0IS<V}xN*MnU+US{Pm|Z` z&1SV)3V-6Yog}bRt>Itv0E4k~b8=p4wL2wJ?6E(1QQ@U!x_Cc=>Wp;#oJuU<zt=OJ z_`4&A{vcI7(#fl>W~tD3D5L~Bt~D!HD8fVh9gxxsy-!c-m%~#|LBYTw_s@(9sTmaX z6EZFL0k{fjhNGc7ZKTfO&zTLqTYm2qx_d@r?SEdK8!pn#{Z*rPzm&MTT6Zo+&Z!+g z7|p%wsI8qeRISm>N<&e4>QFV*-;{D%hrFKFI%%}}jZ-#ODMOm?F8ZlfiPq}={qS)X zS)U?RtN#>J(t;ldcDKcjL=&zythY~iO}gPgxGp%!^C_%NMZ{AE158PDknYdDf0xRG z=zmdnA5w|N9lFMYWa-X=FyhtS+%ND9N4sA;IUR^?IA9Emg}r#PMXpnARC`q~jM~bJ zpnWdxaSp}MJWqn7-k*?T&Fzs^E)C9JeS+~r&Z{@7X1uzvMnq}BOWpnY1K!sy)A{OJ zUm<9CHP-It6C9z!8<ydGy|?VI_8!z4-+$XNRL8vmgQVHo_=7sp`nINiBTlK?{W{iu z9RH{(^;b50OWg)}Te*o|2W`cCDa$~e@Vz59xrkV*pw~zP@hi_%+tJDxRSH4o@;e!H zKvXla?40ie#+%z;?^H)0eFfw1jbp?Nv;6o4XNgKBM*gC5|LfRE4@&qCTkc;Z9)J7A zU(;khTfdmM!dp1ZX~*?^%i?JG15)SR3LQ#h6R~pU*krfmu=Vy{l1Y1^GYsU^f2gj8 zpdjKPLpL>~LgES6L)-@qfi{B=SSBiy)P`xHAcq4V*6v-TI_Ub-)l~(#mY3BDeZX;5 zckYnir{CjW_lzFYAGqM6ncjzC)_>jH!G)MKWm!<$kWsNa)A*TIjq9i9{VZnS7m8An zq3(98WXhW9dC{`G$@XL~8kGTAQggirm!6jrJ-~1il1NQim76Nj8HD$2cpb8!QxyOY zBWp~rqg#jiqNr|JO^0+hAnr&ncp0}#63|*{ssh~fsk8<BYbVNQi1d<_2Y<?w{#b9y z2F#xRp^aS2_PBuZ!llHAmnmhe+F3IyE^uv*pV>*QGla^pzAeo9J_>=4<!1fBn7kx? zpp53OKSAfg`BAPaoz@Ym!T)r07D9I72)hpDrXjC#6Nj@VhZw0z1TW*-X*b&K3qIgg z{-D*Lz$L?#eCr<YsIWr?+<(y6dAaZ^%cFH2%>Z+wjW;$l6bS`O6)?NOkXj0^zz3>S z8>g)SAJ+CJEHR2MfQOZ-rka$Bs(UJ`s+^=MDT@5LXY&;GlqAAl_7h*pZ?BG>!;%YT zoRumUJXJokr}u5Q@_nwFu5M_)Y?Lgr6TU>L%8=bIxJX2goqM7027mN(s7Ehc6ve<2 zq{?fn)9MfF`L|=q3Vy)=is$CwvKhq-+{(qo#b!VltcpltAo|#}yCF82&<Mh!D#S$a z6}ukr2l-0g@!lY>apY80PRSSVTmPNYn47{yIk7Y_$qXCgPMXY@?Pj~z;3SQ#%V)s4 z$%hoU@bqF*a6NvE8-EeiC#cdxsr^ASW(csxP)4^bQbEU)0;af>4jBOJ{=VQ==+5UK z21+kvjX26N!w1G%I-y^l7T%Lut9{w#B)l9_I$g}funiIN8goq<>(0zjpQC0-82Tiu zB0L%3vUl}yh<<_Ll&}3IxaGO2f1hh!2A&jRYFkubyl|jbZ+{OU5fHG#PWjtnlx2de zpzcR-K7vMq@}2t(T?8c)b}2`tB<mw@rGx2CBCOJ$RMHqhj`SS*{%MxB5H;(AGS=a= z8@W!PNHKA6dMV_%zYV&wf>}?#5)?+ryEDUb%MgCdMh_s<wKhz8vJ5QUj}N-5frLL9 z>K%R!-#!Q5Zhy`_l2HU_lw_|0H<Xp1FyjDscz;AKf<U4GjfPq^29Fh6z?11#y0&7b zTNpwmA8BH%vj=??JC@kw>-y11q-@DIo5$GK_|xqBQ;rDwXR3}hTuN4v7j~hset!?m zy)c@A1YoEPrUudrfCw9u0VL$DsxP}LEUfnfmC6w+(SJ55R-6#d5XXuw!pLJ}#)0^x z03S%hMy*cs*!o^_qtULn7)|{tVkqq2k2oA|&E44o++^sETPDL%r<(g<;Rq48Asr#| zo}U6;yb03^3?=a=Bx|aTy|k0F_zT~(nM=R7EgLpZI~VN}HW?X-sKfV|Jj0PkO7d?! z9&qznn13wdEL)#ExaXzgIzDk0GcZ||5JTB?+UqNvz6oicnA!>Jnj^GF_0#KDdmS>S zkR(VXYud!%(X8oT5=T?GRf?2`oZ}QJbmJ=aeBvX7g5KO%w4DEgB<*MB_|!WEQ?X2S za_k#g#jM<eBY}??dT&*lzR|2-^e%bU>$c*-*ni=>Pb(H{^FIh%YIe;#g&?X4wM5CB z#psgEl!OzbXQGuKe|kyAD{1C&jADgmytumKsNNYd*mFSyMJni>Hv;S)O~%B10|hNb zMSENk=`#}fgAx_m?h6z2Yz>AwJ!zfx*reX-Fld|P@Cuif@h>TFDkmQM0^)I1=)wOi zJAZ{9@iPe-dc=>R+%NZ>M59ZxsYbs{+}EhO@1t&I`QkL&LaXkQJgmc#iTx?iO~e)w z*kr?0Y9f0utaj=rJTo=hJT3u+<Hm3==>(YKU=9GDJ6$dTx^h;ke6D{%$0+<p?Mnr{ zqTXqIp;&yKitE9021m2GEfWB7A)lrDIe%hI>dNO4(0?`tNJq&X8KuhR1onWZtybft z+9qO*(Uyln^~W;<R?va(Oa^~JB8S$cscOQ%tekMjic?_ifmy}FT9Y1y%?sWv_#s~E z{Ld)3`#V_LRw9u(`xSuX*Xp}87105Ih%GpBz*fEh{h$HmDV-mK51llc{dSF~&3|Kb z6n7LoNdB+ih(0nMsEcy<DPD7Y)kXd(a=e@(r=3m>CP3!@9K`zn96e0#pF5e8rjr?V zU!$j?g+&<B{2D!npj3&`gX1|iafxFNPu%Q9D)g(e7^3LmRZ!seX{SHz^U+>AjJk@^ zCs_-?^4?4&hviAS5Otx6{zHS-eSes#Z)oNO)&v6l9>2mE5txzh!1`fpX4z!eKKzJG z;>WE$N9dbrJ>tfG_d#_LXh8%c0ALgVStNx&<|yc+MSd3<-Ru8C8wUBq{EAla??4lS ztC}MM`^Wz-nIvG&r+2W>EVS)dLAUTjN1vGZfqv*?|Dhq^Tl`i0FQBriO@CC_9RNE5 z@L0OJ8~z0DXam^W1V*529!Ge=rjJVq)H{pdVn3ithFU8WRRs4!U6wGqH(9ow`D|uu zj`J_oHi6-tGGN`xj`p3(VAXI2t5!w7dUFt8(p}I$Nhi8~OZgbA_CAmPWypb*Yv{L_ zZpr$Z8HGWsDkc0uKMc7ZhkvL-R!U+ft-H#{5RER$a$JGlFk*%DzcdiFOzgEcEr~JL zUH78Tp0z$;e4rz+>|n>CS2(LpR+%AbVr)i}sye8*FL;fX<1ow$7BPfG=(>l8KB<Ob zJrYL`uV(@$(Tne~cS*W7DP~=#ZgaqCeYl?GWxjmn?}Nt;(zQT&Tz}=+*10~&N=|Tx zSTg+S?zE1`FUjpG_JOyf_)d}2UU5%58NW5lbeEk@XUMg(!SEDV`ZwR=;Awe@hU;Sc z7*+ZlL*}hwIht)T!2$TT0-4SqU&ZJsE8w>L&%sz0g^Wt$9JVSd6^$;*QK`i5Y4_^f zfUfdtwO?(w8;d!SAAdq`VSVU(M>_0*g)$0kc|9*l{9b8b&23$?(e=vagiW+eV3LTY zUxMGGVmmNn9PQS&kH5l7<rg;@g+|J|=EvjSU58Mo^0IkfwgmK&B&73Kbbo80dqW9< z9I916@RxwzYzF^?m?6*Ep%}g;?$+b%umtpCiQX!FrK@)#wtwKLBN#krkRguRRhpTF z0W(QJFU<eynT~$GK>)&rjZ(tsObfbfPSTZtUN30P6(>nRukZQiiYl=>I!AN2Nv0v@ z@X+=dn>`8WW!@OY5(b-MPb8pM0(uLZjb5R(vWY5KtJ$S6-4$72(GZSZKVcaSr^K;} zEAY|<qgS$#S$|~sSzy9BlAckxvv-;@I>!pUfN;7*NW4JY&t8QW5RER$Izyt^AJ0^A zCMhnU?c!SMdi2rhoULeL)s;O4_N8UI4v=woL6SWN#e*W{7jTYihg&1gWm^eW<cHK_ zz@Fm5G#&t@qnL8qZ0A?Vw{0b0*gaJ9SF7!(HGiEjHGc>6-Q+QG!qIVWG;<8=9LFEj ziPnepL*EDjYWwC9N%8Q4Y5o$u8O7b?02XfxQpaNjw&6uL2H_>3%6)uEgD9FSw0n!J zI0?O`cX7S^)ZYn6c57QUz7+B^*tG4v!fU$Rxowhn$ppmZ(OB-7pu5FLUv73gKF5)H zX)>s4tbbpk+^;I%IDiWt7ninwLKnmSr#EljUcaH(5<WA-`RG|7xuI5$;4St<-s>>u zO>`r^p6pwFcciqZoMA`<S=Id7TWRX8IVH-eG}Tm7amFS8N4{o@sXFu;Ewmf0>)<CL zWp{h?X}B>{iQ84Y4*$f;wlumnm8~v^?P0skXMeVuH{pcA(_?)STS*BF@{8fVJ|=5) zH|7RU#Z(8K_F&Ofw%dH@y~ckGE;*G&PMXb&UPAyDfxcsk5AxG=wn92Fe}^2xRn;o~ z1PMG925bdqOLq3rKjOGt+5zyTlVkOo?K!)pQk4I)J`fv%ZSR=(Vb1VC4&48Ur@n(i zjeq9Z#9?LMrSmMT15-ZB-a8eF!?Dd+&zZmM*PE?FV~hk2pcR6DD>-3{;Bm1zO6cMH z8CtWpq<*JS?X)`wwud9QPAnveA)S9K`K11Cjd-4W-9K$qYxM$<oq<_R<pTebIC24l zr^hOxIPNt%r}P-uX<988!@*wVUia&*+JDI@&$y1YdmW^amQzm{f!aF#&CttkG^?J1 zF5I3_|B~{rSJN|F-%ShVD3Z*;B4v7nuoU>-_z^Ny#hyau6{kdDh_N$H{>kQU`!4Cy z0yCB8(d3?~l2b0~9p1iB{*mp7Yew#eCk#>5&yf<0trsoE8J>g9{U>wOmfDEaw12bZ zLdMh#)v1IdWn|wDj!du^t**#6>(zFv$t0dDu8Ht3iKAj-Bhb)%KACE!D<1ng(MP7E zH(>~nWwnYC&lJlDf3AIrvQqxVc1x2RJ*c2E<LykU{5*H;&(S00pLWgYBa2CeWMA+L zY`Cf_omL#AnSa6*Ot00&(`(5*wST3ui?g7Zf<{)HOJ$ekC@>l~hwC0ik)?%thS*ic z-r0;Wi*wWFnOIp%HIM0g6u*}GH{}SflY!YKAHUyS2n<5c5W(~BOUgPqI9t1q57>PV zBds)2fvCl+lT*q?C=~SfxoWz)p+!$XyYJ#57oz9MzZR3=1h#f7!oeO+I)C?UkQ|k# zBNn23PM^9xtTuZ?o`@p`G{YfZpoR#TB6_CW6K&<vZc*rv%zcmowyiry=n!@}7$9q@ zVO$%BhW6(f-r3#RHrVwUG`NRdVxQs`nnjV~ZU}ZH6)U}yZ%<h$saWyU0saESR<Wj0 zZJ}*fl|A?$n2rCHe9+{yb$?(ZyeujI6S5^~cY!0z(92|egjMaz{At35>$Zl)^)Fk! z=B0$i;U>3Grk0jW|B~__Jo&IVr(AGfMHGT08-w&9Fl)ABtWD|25D;o<(NwH!O%#H5 z!x*mS3u;KpTP|V)Odc=45_L($maJqw;?1gBbXR?@7f;@j51t}~>wh@e{1pvjoq7OH zHh-Gz+sT%*1h78NaH0$&f*%spg`wU`52U!apfWrKE~eqh{L5X5%TA{=tnsW1vOkid zn|kzA9D`fN2iUwYvr7$TzxXqTR~HgWacB*Aw3peb{-l8aQml)Qh0n9P1GGM<UetyK zNOkdH3OYjaFH0Ow!GF1jsWw)AsK#7#76Vqj$#0)SBjL_r8n0?7;amm9P(oqOR^_in zBV%&B2bm;c7G=kPo8AA5vX|JBmP{ftJ{wEj#C<I#jMW-44mjd2q>1RRpmi+hE*{i= zQ7n9nr8su+n>KS7M)4ptkvI1>V)#KVNxRQzIU*OW1Sb9$b$>d0y)Yy&A74@|&lJnr zj>t${KQ9gFI@`#h-||G0hk$0B3N6q^3XZ-4t2DP}INIiEm0g^|A__Ad*NHsCGwLVi zo`q9_(w&#=Fw7YipW};>Y)VNaW+)O2LsneFy8d)^MLqpG0lx=Hmh4~BmJD#<s1_OX zz@cUVD83gevwy#p)b8YwNtfG3*WS3MC1DjSmz(0ubu_Z1EkN|+z~NTwv~$4|e!+;~ zIjv;x*DGakw^(!%Hx%*rMj1Rk_Rp-jJ6kLbH+0AKwkCKxXrU9CRH}oGwDiL5;HL`= zFy5;jDQ?4OV(;N?<g}mb|E6#S{RoA;2KagCm2!VbAb%VNbQYgWJs3_549C$0W^nB< z;zgO;m=zI5S8OhJULfahg$goM(wFdjiTrc#=4p541g~|fHG-Ne+?pl+yV4lxux+`Z zeOawG*(|*XxZpuGC%QQ~FSTGPCMh%#SU;%LON$ZgMJK<O!PSMVZtf*LIfH#aHvz2e zYBs<c6@O=>8k#cJotdFN`wQgZ10z?rUY2StH*^;l?N*=b-aH0m!&V#Go|K@eQi+~P zRAPb?9X(25kv**~BzdAo5|lct29O9tn?P(F#nB9nXorH32=Jwak)YyIX_X*d_G`^r zOMsLewn2Dd<>5$=BuzS=ijiYONAR&s#Oa{cAAj})5DpqH1m_Uc?62_1{0NH6;h4oa z*kS$&1#yCdEEBob3|aSRVym+UdgokLwWbUL#k;iwML2ZMy3d0r!nA`fW89MKhjh5- zxbk^aE=?!1(h({>&Bmq5<}DjuMA5(Ow1!nCO^<cIK%95N(jk?90bB%lbN=(GT?W#E zD}OsGSMwIzhS{<nb$s%Ev#`ERUg+75;Ds;;;0qPPVF^F<5dw_~(skVvjeqH@hBK|% z+3u$%0`X)~-N{VJ>jP(PEB<(9K=v7q3E9x|rO3SCD#S{wCFg+EC*3JK`WR0oU(V6| zQ&fy$iH&`qhfz>>gjAQ<bK<*^1+RGc;eX4k`j^TPGSoY0w1Cgq+N@jx*RBq4dPB>o zbT@!AjK{I!>Z5P?)75=n5<?Ni{?E2rt~%(n2ZQ3evfFAm|6ca&;jVc4!147=^JVYq z<M0sqfT1X1_aG7YCJI07YVG)+Gh1uN|2%B0T{7K#6Bv{=%BrLMfZ~&7lRZQL7=K)h zW<|kgLIo-UNc0x3EVp+2FNrbHJNrHl8=`l^{!0o0u@i%xRqP3c%lF{VBzZaez8HqO zco(-uX6U>W<(~bQa0UVU?Lmev%B4Aa%v$u>=%_b;na?~YJ3B4GZZpjcM~@*H7T>^j zsd~w<47151GOQw+R)}O*a*8hq8-LrwOV|4tkHA{XbiEy1g_o`u1OsEJj(ek-W6jpa zAJmD~hc>%!q?X}!7diW!S>x4Nx@0ZAqVOOH#oX?>q=z%o<8#C|-sQ<SOR}O6Bn*Gy zESO|5HY~;{aa9<RA4M5UNUP~~%P(co)FNs0sCy1#rP&0J-R)wk2+}xPXn!{*`EUWM zKsedy*6C7kPJ`BMl|WGah|+~t-?H_Bd+WujWf?<gj%}ahzxN_p{Nrs`xi^~K4PZ|E zLx7yr1O0;r+Cix75CfMTT#RH`3x5V+@bpYzPC}8Kq11>^dYSfPHUwn-g57GrOs4(L zR5m#onf8m#1I8*}rv1QOVSmJ8jI3~B(tgXsMq#|7Df$gL=vVaJwCt&XV+0d0kIN~; zzZr*-q^t^ybIM|G`Xwl~;*6w+f{!+q2%AL$YvOeZMfofD@qBV(Le`GYHZHHS5$zOu z+=B*I-9g#5=H@u2ii5<1P*@DNEA2|&Jh0;0mAon9xG99*QsJyew|`QQG7uQ>pcO_q zBBYp%=s5&65(g3#%39*yYl%4xnqu4OljU8OtRs6?bLGI}X4!%$<V68EdY-(wSZfMS zQRq?_L%E_ylE0c}SRdV`%eda^4C?jb4o?a4fT0@lo>fTjL;)lKP_KB%BOT-5$HmV% z3moe6QnlKzw%d)DL4P-1BBs@@xBGo21PoR=*tuQk5!_vfn!yE8w~-?f|4msiNmpQM z=dXbSWFy1cYA4}ry+CyR%Q7{xMjBG4w*C}Lm*$8CYiCW031bxyUx(!Ak&loGsgm;u z0C;`rsWkzzc`3D`rxpF%$Ps;EQ4Op&EMp<s-0<y!gA>xmaepM-CcqsKzeP<I_v%<v zeYsw#4eHHaohNX5%g0a7Zjech)p!h@!|R8qtSNX3ub>3LW22_3PHuc`J(`L$Q%4#U zxV3vX_<lYMz9SB)_o8yN?-Q?6f(=PZ3aderI2?Z8XW3GGx|XeLW~`x=cE$M%|Av%+ z@=MzArmUZQ+kbn99dE8;XcL$&fL_5&^H?!2>w|1gf+|s4ApW6=pGWA<eU7D;vOdd} zL`f0wJL^etVRGTVMSMdFC7%ZJ{@RlQ=p%u3mO7mo`aM2`W)z4h{$Ry@pJ+?r>H1W` zr`Y!qHk1@FCr|1Vw&MCdjPKTB82~}_SJ!dJ%9CQl1b=;Sz)Ct^En}BNBL*0h=fY6q zS$JwJXP?trz1eT_j0-oF<-<rq?66pjhLVNyv>b!ub%+>i@}eI!D6%Z)$CF00->&VO zAJ;gF8=Li#|Lb4jY>9IB$&PV?Kb(Jx950uK(@v)bWtse+1Lq(sKSvLf`{z#PBuGts zu76pP5q}bfG`|*vDlvL+<gQIZsC8@wtO<f#kvVZ6qQsyh6Hzqqsu8yB(@uZb=cBin zc~0PvB+EbgDH~p6d6KR>GSEc-p*hHX&>(q_nGLU(#jm_IRgmVM+1AXmT^+X1!jBBy zgr8|o?h*QCT8}#HZF3)BOBPPe!ioqTR@A}|$$!Tj1%0&0?}AbRyifLCskVkxNPV_~ ze+TD8Rdb{TuSr70oKNpG+d+5FXsq3<bHi28Ej*N?PfYwkKVWT|_t0d4TIi8c+0-Vg z3x`6`4~3vg8UDn~uv}QvHG#uy9x`~vSP-|)<;j7Rrek`F#!H6ch?q{om&8%qZWUb6 zPk)bt3;jNp_YvTs9mSj*MwU;$lW~h*I|%&@Fa+9IG4G<*E&umVtBx2P$JY=7oP%EW zj-?qt^fJ)mF4&D=(R6<CiQB5Xi;G6}WbX;F6;F@VorClBAa!HaRsFT(^g=J1wb$VY z&no&i5Lf}pCN>fO;6A8J%D-X|(khND+kez-1-qY7lOiS=QUZ<hb5tr-Hdoyg4+b}~ zlc1h7TEq{|E#7>EMhv;H`IpH<VQ&J;h84?>t5wUfI%fXq)VsPufAp?C4L_pym+1EQ zA-d?@_C5}8(Z$=3AFg`;9$pkfJ#|acS@;X|Xs8b&sW)PM9TezfN>S&Z;s3_y34dvh zn6g6tseX{=D5|(6nM#p{`VsdD4FGTY(-e;o(k%$gTWTw;%pttYJq(2=!M%y*7Em&} zmrPRro5iGasE==?Lcl%LMQ4TNY!+l1y|QyTl83IKUncJBSWP`^Wtd^zE9;{%s-VhD zB!i0--rOfkcS5<zdn+pK@uuCZrGJ5=pdSI^1ghNtaXCkqy{nHy$}@_UkA*2F<{|x8 zpb|vZ9M3>)35%dPl<ZY*YK4tv)tgc#YlUb0b7Y6Y-gK?7Km1qkW_X6)Utj$jK^x@0 z%`8WkV&6w&V>^<aMo91m1ymsCOVt$h-o3wmLn^93+?1#>^q2kWYxJt}pMSIW>&4Lr z7t=pTrZMVW_pbi^zr%}M)R3hUiLSLr4CUF=JmhX(YRJ+}(d>X1q?;0%a=9Wyo8B5k zxhYY#o_~9EAl@V?EK48qMyxtxvVReB1Emk?Rh5aJkv`;^4gG*Lj|Z0`vCu*{Eo?if zTf$BX1v`;wR5GF+l-i*KlYbMcj}edo<%{nHqEwf;haleESMEVJyUk%7@FMKr6B&~I zcq9v01RBO5-yVXP$dp6ou=N!7rZPjNAo)O=#)4)sbp7dFe|UqN$^5pm551e-yWuUo z2X&CK24l2fdZ{zNb6nk>yQ>D7@`snmx);o14g4?7JdTaONM?o#%zr>Fq2GHSQGYnR zMz~|}_PwlQ3NTh7nVy)M|N8yy;CJ-)BkJ|v|1l)B%a}OJI%SUikDyM8jtLw&)Wx&t z=9MK(w%$pQjuR^ny=@6|m!zYtR=$KSvRWytm5}&yyM?P(!lDA`c$Kk1f+O8sHb+iO zJCf{6CdUR;`V#sGa(^G!Cm${Ws>$&r8AhiZPr<<D!pd^P808R<iNXn0cbym|dMa8u zUN#!T%L@U<wQk;Ww2OaTq~c8eb<yVa`<-Z8Z+k<WWkX5^4Jp~uwzzX2gc&WoIl;Yj zPw%vI*^$%L$)4s=#f~=D{w3vKr8};z&qfcb?PfWvoRM!Fz<)=UyH3K;0*`!#4Z529 zV2#g9|IuAnvmx^GzB#Wd(PQSHyPDBQ7F0@(&<_pvYm8LmoQwy6RfvW@Js*|Hu3gv@ z4u!#qZNWZmQ=P)v3q1c9mRA6OK!Cq`>s$q#kot#e%vbEy6-KIn5YIq}^OAscI6|PC z&ufK|BG_>pJxlJDSaN?xY(?v`Fw$`@>EVoY{X7ac+8ATUIBAKufzM)7@;M3%+viUa znpdz^svhMyL4AU36I}uZ%=DhvP^iR_i?<3a=m*6~_xri2*z-yGc{#5(n)Qp`W$u!) z@$<w&2U_O%pJONO5<ic5r|2d`M+)9p7o`zL_F{Yt<sKr1YKDK$&qzErSAAaUs9miN z+WkXa%ty0vNFUO|=wA{?E@r|72CV<M(af=CYvT{<MC;p{`i&sr-R_<Bgx5I6GD`G8 zh4GP>wIs!60}4XElpU!@=)tn}zbw;*RLAYjr{Ss@P3?=;MU~S^*gL{b`oP(~!Ge~# z)cFtUc)ZqWhmC*Q<*>@r;Ilm~mc&Qx30s+%3&2squsuX_EYV!WnYGJSugcXqV|&al zEZK$4e<RDt&>>)Zgk(wq_rakQV8sj%wv~-rvkjzhocH*kJKrSZG06i-#yc<7P7=rE z$Bc1zs*NSvNw)JQ+wt!Y027ogyYW;8U{*7<r)(VsXaRpXB!@t>AgOCZdu*)!D|o;V zlNLG~AsmgetlY7c{**AGdW480YPip!+g234g(H{DnQpUwlXe+HIa7|xXe*;lKPavt zO_4V`Vyda;fn-ASMwD1Q58X7Ts@PM|FF3imxlHbYXBV)9OJ87)#gBf_)I6`_%VdU* zGb3%{jHQ1Li7c|+7^1TkDPo+pvkviUp(mYMwO$pv7OHPwm!WS}B*oHow8>O6U8g*a zYLQ4l;T5|@u!)%#hZsrW2_WT*L4f3NC|+d9KPRn<*~F0u<8hp2e9cHERzNFr3QeGG z0S=vxaKTW(`!4|&Ce~#js8yh2qZrJ^cVD>ZBxZkpMQR*?eu6eD)udB`*bBkunFSO} z-Fhv3x5RnmT$sTF0WngLMf2T~T?d-2#hp5HTvJZl=-1pIC!YIrqMm8~MdJt{VyEC! zqu-*>9;ibK!<+j96<ailBN;{FE&*e<WHBMCpcs0fD`qHHoKRYZa{FGNAw#*F)KIQf ztMz{xf={#Y8zh*8&7pKWZJjSq8p9K=?GHOO*u@h`6I-1<C{Hk}!!P{7CWdn5=ec8l zuASAtL@gX2r<OH&mSr{WEgJ!t+bvg+YL3zO@1|u>;l-V1SdY|k*UxseFRRsNlWC>u z0q|wIIXN%2+8qxnOvWiesCo&lM|e!Kx@&(|J`ZW&!yl}wXgG5Uo03RlEG!mN92i%l zDR}-aMfg}MuU&1Nwgx<#n%HD-l3i6KV4gVk$h4XjoFEuk6Xm%4OHSp#)HAQ69(Mr) z)&1d?8E8Ug8Pt$pkbipO5e^Be&`_Vtc+MJWy~p3s&aotWDYgztD6)eA46PT~dO3gH zPNMBEjFh5H0$<|ZFw;TU$q5md(%CW3rqyZnhjn2+8-gEBJ0Xr}>zz(@*b(-8X-D%4 z4fRg*blA%O;kq-JgrQZ-vBH1uZDg`T{qED%?b{Dm|9*S@23__Bx9@La1vuJW6^2lY zePB_>6O>Y@{BGF0M!&r}MjtOK=skaIBpmdvh9A#XuOt+PW<<DFK%YCUdZWp8(gT|S zwhP&rsp<~OFe%m?m%ZG~_ql4ix}iCWqrvnCSGP<UCR?vmJ|CBBXJtb(C+<Tz=~L(! z)hg%}d^VQI5>!A5?#obTjs^`H;_1`wQB<*rNrz;+fFfHIMZlHd?Kyv%|15t7S-PKk z*SBv$zoWt#vW4j?2&ISx_DolT=9X&C%JDwgQbneO00nC-+mJ0(O6YIRaI}oGyD|k7 zZq}12pylF}UeT2)Adyl)QST-9d4=^;slp@-z~dK=49Nl4pQcR3vB83{tUe^uN~Yqx zq`geVMU{`3DIl)}Q>NnVJ!5}&Q?!jt#a(+dBlk4}M5f|Ism{t&oB%cSR5d44am7l- zQQpxyU^~yPJRQ{f!yZ!zx?O;+;<Rt+UsC>)4u5aS1%uN@Pw>st2icX7tlh1-JDa<T zt4(KC%2+;{zfYRYi(W$jKp2J|!$uipG>@-9%D;3{=;$M4Ywp}O30!|V3D_?viD<tf z1|0P@4HsfDQvvB!gP)LV0pUg#Y^{brp%)0YyiYMdTKD(#Y>M@5Z~?S0vpis^{z(e} zPsU;P^nRllWrZ^p0q-P?dp!w@d)f-a{#Pq2VQ95QYm(<SGZfjNUny(1nVGf}Ut~Rp zDJr#GY!pjXlkEMiz?6RrBb(lg_pmQZ5lEU>$X_^r4RA|0^dzUQhN4^d#h2C1L)=|D z&g5iy@N@l&0RJsgc!tE&Yzz?f>mD6PtS{}g(@wwMkO{31Hkl+j!+*wHQ2&y0Z{fN+ zrSpXV#^0BTzdY642WyP}0qqts*bE)n2t$l5yyabVZ{QfqZeM>+-M+G;8!NzFe5m{@ zP}$L~kI9TO+0kw5FTUKq&>g~dbay`vuZDx$;RPCex;=h>dHE5QKis_k@c!oZ?fYxm zS&g|{!a#gOkd6!;FCOX2q>Q|{bdh~+`R;4WP*@l>%#-%rm`;nHgAP=r8hbojk_2I_ z#=@D;pH~oOP`!Vs4F#y*FRz$N{k$)?tmxwvX#Z@TWTH%5kl2>l&{&prudeJnuAP)f z>u+&-$z`HKCMtCOycF(k2lsPd7ST^sME$M;CH#c(=0)r~?*3`Uf-9LY+I{vsKYW`^ z7>#nIev2NEh-X)1!ieDt4K8X-CX8Tgvmld=WkNsS34MQ=Fgoz=SQh!etP%a5Rnh&e zSPTk9A+#{Zz?b0zd;K@!IahME6i5DIAPAVR<Z3A<+v7YX#fT=fndS=*W~`<*ADilR zp4A$STEEQ%-(L4;sqV*4F)Wvd>=cby=v`I^ty7+bamHL>XcG+<7(^`?eX9Ctt$ooK z=TymkYEOUA=CS;owSKKv6=23rw~QNCO0fI1RQX){0^1|X;dkorPTD~WziUVs8d4<0 z%Rf94&I}ibib;sbC%o6SFO>@Vm3~K(-FBda>02pLL^p-()^tpf-FqD-`{JE6(e^H) z7`plhJ+IW(C%xKfQv?uNST{Gnpx<b14euPTwibVeh9R+Se2HpnOv12khEHH^U9Qn@ zH{mZz;=kx@(TVSA<QL+5uVcgyK9*(d$R^xP_M`EhvgI~N7{bO#LdQL#MRUpYI*LU- z9CKf6!_(vgc`@rs|3EbAbw{x<To^*ZvzMm2d4&F1J3{ZYv999p8%JoWJ_$PEda9`= zS;&7`Q%>8?xO4;--rEj)3lrGjuoDz4C4cE+t9rfoKDLK0x*|X{RA3=w>0R)foiUou z4OgET&-mBft0UL4;U6mf)88byqLE)T4o?<mxRT}O<f2}yo^qWQ$yRH1pZ_y=+~}Ev zk>zA6fx4|8A;W!+o=a?#8LzSkL#J-7SfqbQ=DWCZ5Qjh`%QzRusK4o#pv4198@4yX z$Ay(rhH_^;McGUk0;F+N$=0wv&+uFfYfq`OVu4zgjVHs#Pe$u#zoN&HjBJlf_z=5e z1tVA?=@cx<jnXP>7G&(wfs=aYKA)FN&>JHSN{P|)ag-*uM@d$SF=a^8>$2173~PTp zE5M9ZhB}=Y`n{4Nl^7quOL9b?pQZ|bMb4J>x^%uRtG4L<z)culT?lR>jGEbJ&vcOp zPD{LK8K17i7l{Z`2v@8nz6c`Xm!hS_7r9=NfLNkHJ4skse&z^-kby5i1+NJG0xR=g zOMDUF?6Hq+Q{3z!sf4LwhqblD7g2xOS{NEie9;7K3E3;5naA`FiPVheill|;#1DW& z0gB9fE%8NFVF*j-J3uo9{*q^5M2qH<Q-|?1wlGPG<O4~35reT<4AWn@8M0XTqGY}U z;LoO@qiBAZqvSDxlo|k`x`Bo>4Jxo7)QQ%I0j=N2U_rO*!>hvkEt3FL(IbBsQKd>q z)UH$c*s7mod6kf;-KQtArIUn2F`pU5m_QN|)ia&Ad$nZBJ6i%IYclXW1cyXnjF5+Z ziuwl}T_U!miB!jhj~2T$WJXxJB#X?7+>>aby}&r=t>_~GP1+-#>9WM|WCCasM>|7H zx<VR$oY{Fzskfr~Ozb!`VtjwrfoA!G7uc=84fb#D2fo7~zab`0i(=$;2*1myLb>1i zWhdei-OGR(an^JndrRu=6EZAJpFFtdrQ<q&k=aIFh90?)!mQs@(i{LA{GHtST&^Q$ zQF3&G7%7riy94d*w5yHN)_`Yw0Go59gbKGepN8VeO{}=gk&PJYRcwEkHlIbgi_fv& zv6Bq1E@YBu`4cYNAYtJmLW;vcLkSC~fQAwlo&=<ouy6?rXSIWip&d;Hl*+M_#4HtF zY=r@kN?5prh2tUL;hCcn77lTc&<#7W$X)DcE;*|rVd23bC7W^Hm8~Zv$4<uKSo>N6 z9Y%nYk&|*(<VZU&&1`?o(d-{usVjle5*Qr~sh5;d8EeW|6-1njyPOr7cPlJsMeY?C z4QN$@fzGfF$QEF?t`|<n8vI9yu|1`n1<5O_;6SIeS&-tG&4NYh5|S^{Zbot4&174& zqGdut^78@7ryT_0pe3}*=8b3GFJ_%#d>g_RiDRDkfp6aH4r6~l1Q%T5C74Wt$)F<0 zxXQv6aU9Ju&=M%YWD-o~6}WTB(=e$=&KSiK94yL74tFG&OoGXrk)EIGa!72$cp`7Z z{L30!?{#d<WbiS$!#F$+Ty!L%1d~ZHnKifdm#*ZEu`di`(j~y`sK+c!k|NnTkTXUZ z*hRLSSFjnQxS)T%7$*u~vZw&jA*X0*-v4LsTb$d(mc0KJ)|opc?{zc?J?)g)(leXd zjAzzK_I_2fQ&U*NG8+jrfMR>@?*IPvc_4G(fUpe;jkr}i*?{b*Pd`uhue;@1Rl~z- zcvuY&8+)MJbd-K;KvufmU#tvRFP<`9zn+_!d-^bM-&B9Y!%6`U6RV4m0>bS^Yd}a1 z2nk*PsI$1C|IOEa$-}i85c1k^EoaakyOl<73TUp{V9n|ojlEubOb4)$orSL&oAX^K zx#duP#R+K<w2zQL)Nd1n8KgCTqzXLFeGX?mqwy&ln$ld9gM`u<jW1;QRBaEs{aiG? zN(>Jag=v2UKcoUZSWZ$vYIA}h1TF4m9^EL9>K--=*o-n8e*83z_kbUoJ^2Pm2?QGt z9#9-*pGfMs*X^8Z<sXr#Tes%QGh@PdXln9hobLIH=0nqkJeUc2aqEP1d+kYyqv2RA zCsBHHC)cC6wJ4B~oaO5=UHgmoL;2DpXV5X&IXr(NM@-rtu`Aw$<tujju~=x)n-*^! za*9$#Pm|?x`kDm9_q~?nDA|WeMCAB|$-VT>^87tf;PAXZ>kkmbw1(IGX3l-bZ7dAm z5TzKyMGF#}Ys0ePl5ql&>kV0&N^TsU`DbHo*)^A5n?}#cJf11G(RA0q88T5Gz$k0u zp=N(hIhZ4lXk#2p590?@wWoFv7`&BfFa5iwv-P6{6&T;<qeXH?fle`+YJDoRKAkE* zDJ>N&-^0oxcJP4Gmvi{DbdAkjlaO&h8j94Qcy>j+grEuL9#+N;h*m6nS9;5)|Ch1a zno)5=$_0o+AAu2<2-z?(0ZQiYNu8ikhm(J^s6>@s5fWTHtZ)XsUb^OELxlyKhrFic z>^#J;UhO=|i+tAm5dkK{!O#}k!{kSD_@X2)V%)4O+icu{sFI@X=?`1aCG*(@Ev#7{ z1Dzvg`R&$jy4z*r`8;MQgx*Y5JDpsi8VA^@X;B>Li?rs;CnV}Eeo>;{)@{9yvh;re zM0{Jl7)96nC@-JU29<+~6U{k&{#HkB9@+NLfQ7Fq83p6m4qzS`Og@LRD{=G_H;=>> zTDA|<_>EQ5n;R>$xv;#=%6O!umF6vkMe!O-mT-v4!uhy0nhtYyl~q_LALxc~NaZ)v z|M%>mSRgQ<`ZX5e`xcS&H4njg2#0@EekmX}!&oeu^R53{BT-8Nn+sNcrpo}$qWpH+ z?f$G+WHBw@td2Zu^>7TJIFWJaP-Qjvw^Vb;UYbVXDfvJcYhS>8L2w={DnL`W@O;<W z%<l|0jxsC1cY{WPuMN*wZ&v1_DFnIkkpNgga^%_;C8hkF5RD1m(+9Aa>EC}j3ycL- z&o|~@<8?@!hDjdgDc?-jw;<nf$s5}q0U2^Rhe9Pjl{r6;e&;H2Dvon0zY%LS+tpwR zS<tz3o$aP+8*7tblnG!NFJk8!{Ji4aDv<5mnqEbCw1e&-#O|Ca5Hnux+h&O+<T_L4 z=0jAfN^h<bJY<v(oK7WPTC9KhaZl<o&z=jMZ}v?GO=)fp31`pu`zI*PPYOWYDxx{! zRV;hWuRrb#I@7x5M@D^wiov4&<cCyxW26UQsi;tw?VF2uGy-6FjDBU21MQAB8P1BV zSG=fN7^fq4B|S79ud<wRdh8npIcUNK{A-j)1&US9WKe8`8vXtvZ_s~e`AcnmYt&Uc z`A)4W71jsrcNEera(K||jQfSQ5I$#eXYh5w{K*59ho)~n_{xtf|J~bIH`k#l%VHlx z6ovOxX}?DmuRz1`%<m~bdFAiXZ!8}7c-ESzg_h6rA)^smI~1j;JUr0%1mUGSZT)xU zZS*(;0U<*owSHfn_P>93v=Y+B1SwCVfmJihckDQ%c~63@e8>7b=^SRJf-M@0%0+D| z$O&Wz9fvfJm<rmfbW-}G#VEJ`sx(??4j7-C6K@(2UYExbB)GJn6!DZn6*CTT?sq%m zk%~GKRz%lW5Z9D6CXkE4WA>ZVxvCD%3%wIQGnCiEK|5>){kwnCh&(xh*t2|G3B{hr zx4<<N(8v{TPkI6aJEK9bX!!b?I_peIbfsfv;`9etBKsRy3GjRPoHe#1|JUdjE`2x@ z{lcXe>hLvGvKBi^Pk9)i$JDRvXT9eOm(OOOD&gy1uss{ENR;q|qlX!hVRl6-MCr2M zUG@hfZ<NvWAH#p^X>(6l!moVanV#6RmU!p)zniY9zzo`xJ^U#!NXgEh4D?VdAC6u2 z&{Yb#%Rm>PI~UeB%d;F?xp`Fldq=r3=f>7E75|R#(18Eb0Hq7_4Lt>*`(Mq40-uGK z%A;aDSl*dp*bBvWe0VI5tIM9rm~>m`Y8Q1TBYUoO4_AN4sqr;FqAlZxREX~9_U#EW zhFm;ht<PmtMauupuZGd@jFbgpq?BC|`(y2VGRsvF4*<Aemi{?NhL`FfKc506IY%mp zE)qOO;{iG=7&IeYyo;wUOJ;EoZwOT|O%zCaj6v55<V#N9obaO>OpvG5F!obz49_>! z#@umj)1`lTc+q^u+C+=jlYFf}603~G|3Fh>>!3W#momN8+*1Uu2Ctw|4mujZ=B3+? zSx23YFo2HN#?rQKt$FD!cpP6GG85^{z$STn^MNcjEX2p=9>FC-RFyXh#i$xSy~Fy> zhE9A_7+VF7W)GXYgVyAHl55ypy*YIJkP4BXLhgUBw0B<&1+t4oZ=_Ayqgo_V+m!er z;SdSIHpF7W;z@Z`gGnqyD~|~?%_l3K)SNC`nU)h5Pffmzd&zR*;%Ur@W1_YF{_ws1 zxd^!)9rQ|-vwS_K8@l4xkLF8{oI%Ghhp|AnnlFo}N!ufK=*CDM=W=4Cp5_^Gy{e9T zM;m|Fi|G(@YP?igpsjgPXd!-4QZxATPup?V>AtPUm|K2gs<+oN%9yh8Aa;S$D>%@z z^x=10t;4&nqcS8G@3APiJYbDw{>!Eyan_I#v7}}})>}ixwi?{gVU1;!lG3vxqe$V@ zm-5eGi>bzo_<?3tcMS7cHvNeE@=ER6MQ4AW^w?5boR%m-tziZ!I+i4m5~TwtpQ__A zB-kC1C6ksqn6|%n7ho)np3x(+9nVprE6|<1DzBN5s1w&*0PH?WmB=?V&b}T=e1Bn- zYGDpO-2IE3P4OD?Dq|3jF^_g6F_y$j1OS(%CU9h1r9=;hD*Yb}8WvNWS$NFm$V`8S zZFM}(70-pEGv<5n{8b=v@e7mE4{T{qkG9TLZ8R7Z871fJOBUAcZIq<4hQ)DD*!Xj6 z*uJ$g8-~~XX3l-brK?^6<-T#9n?0LTurVtky17)yJ}9kw1~dKpUC}HR3w+917S9yh zXu4~j=#NUJc&)+4JN*<dV-n=<UoL+YHOiy{O-H__Tu#&JKlj|Gx$`cB%p6)5VjfFQ z=9?ImXb93BGELy#^2{^EbX~_)mL@dY8NRs?WHC!T_L`Vm(|Q9E!yO>>Vl4?dihn5F z7LDp~*w)lSCw=8e1%u+OEZf`@lNEoze-W@K9?e8z7(t$kb>uk_03$#`mHL0^_eU;k zqW{ifU-)KZrc?p-uQ58UzS^pQ(J92)<ZdO2efd8@hO_g$H&fM42j?9>2U`$wFa`2D zhc8OXNuGag+6$OawD{Fnnj_aVzWzkMHNEXywr{$yg|q3w4qmglu)K{R67lXWwSC?l z7nuOah3tg2D+<1pf4l@6SXzH(etWnXLLhHZi7UHK`TFTUh41_f!^yZ6u<$j`^57AA z4vLA$aQbxPp2R+`j7OS-qkG3lJowVU>3rN8O^3NU(dzZW^Fu1XNqBxJ^%~_5BIW8a ze9-AkhULTI#BZ~tPG&3?&H2`kUC_%fuEcQdESTWTVj&+Ijy&HGze;}vTWxj&vX*!L z<;h#^pf}eXOA{fd9K<C&v>fz@{X%!0<w(WLuCsUr;Mk(Ey`||%zpcW$>++jk-?i3F z*Yvlp9W}hA|MK#Bi*m_&mtJr!dX)n5bYT^Opwe?*XA;|Rw*F@8Ki}0dm!h>>qjpZ4 zxW23ZJvQ_E{OgSnLj-?;#cR~P+oKDv4_1-PF*vD1EQpX*b)@!s?Hx4mSMo^hwA)j* zqm55U*nILIS0)Gyq@^!UK3l$PYU&B3tb;=&e-d-K34|*CtFP1LEU$l*|DND`Fo|zX zwGM2Z3m%5PiTLrCk`LQT9p~%XaKC=?4cCW%$68#Tbg5CbjkSMydGg0+XRfu{z0N?> z$iea2YC=x@4gX&ZGZ9e06<KYyVTWSKPpu4l37?^CGVQl9Yz9f7{gD#k?E86ntl^o< zwQ2i?4~rNYrwaM<iQk+E#%$beci28}UylLi2sysaex+h43s}xDUpZU4xxrANDB?qX zWV3?DWOu{DyoG;qJROG#pY)Vl*IC003fTyLZtHv2f_*0ZRU_vRuy6{$b;m$1<1yJ5 z<t8lK;+q7Cvgp6DGH*c#D_}#V>fdU&`yJ{YTsZz~F0!qbs<vgCD1Q8i&rK8{er~N{ zzdMqioA~h(pBwbU0d$HRC*pX(K2l5gqPR^oZGj((CCY#JxrI!mJ9BKX6S*}$1tCe1 z<Pn4TMj79k^RLP;{}HiUZUu<D08?!muHrk&(ou#RXSH$!GUXNqVwC~S@lgvCa_eAZ zLT{*2@JG~=v$;=bjc`WU@6Ott*(e+y6easPXfP4+J;6!IzkNz*LCjvr32JJ4&|>kA z%SVtEWR!pMVT?TLQ+{0e@7^lFv^fp@Nclq0Ssvq}AW?^A^oQuT54c8R*3O_i?iC8M z2^>j2Jkw*VB@W;wa{B5i^OkB>kl1<dU7n1ct!tUCa%JALFzSW|Q~64fT=SFr|0#Rg zy>92pE3>%2!ye+1!3Q=1wdrkER&41J8ZzYkOId%#LKrydwI@B6|G{CqufBZz7`5HV zS(Hh|(9ozq#CGKfzO@P#L#}GDoNLp(HAt6eYDx^9eT<=YkA$JAT%620=iPHeH?Ee7 z#csyHUUGd)x0~oZ+hdeHVJ+j-1dosgT4`}sKpMuVL@u8YdXZ=aZaAqPu@bD6pFmcR zh)sW2<<urGJ)|;?-(Mh7(Og_e$@4%l8g<&Sp5{iTaNX-_r43qQ6v-703~MZw3Ckun zzR9Uf4{tb)0og1dz?N**WqIU)B${8smWkDNPX9qmQ^fYTHysy>md!UgNH&?L5;SSI zyWR4F)x|Oz6rf(BbLyZsQVXpMyeO$2vzmWYt+eLmrbz%bskiq*TRra<TAs>>Bssg3 zldb*LcJA$zF}1{u6i;Q&+V=3+oV$+aHNTR=^`&z1qp{w+J4qZrei$MPWo4SR)Vf-) zU+CbNocTu}YiR^k!&-u1($&Lhl%8wdX{%71nKSFol%;EI?$T(Qo%b{q6WF3@*{Odi zh~cO`Y9Vso`Yp_4OydwXsY`Hg=@|udVz}2>jDT<B@{TvnC5RkNx?M~aSGj1qFxLhE z3Bk^+G+i8@w@1Z>n6L5x@#y*9aP8*Ch1nBX99*~4?X?78eyOl)G4ka6Oiwm&y$o*V zEZNXik)fnEhJV*wS+T8X0a+x7u7-aF0=bppBmzQ_CX2GPw~AokaIZ#R?WmJoUr+{^ zaEmuM9-`rG>`_1$8_}A>H7kUXF9tZ0_ZMcU_u+@11y3SHf=4o+uR($bV_a$$OCW{? zuvqSU(i_OS6K&RQ6;!e)fJWUCL^#x?Li|gimCgdFk#p>p4q|O7mPeZQ01JN(t$5J- zsLUPLHNA~vFD&Ryga!{7rp(@Zrmr}+@ab?*U*q2L@8H=3{NQT4wv}5zPCdLe9^m&v zTjSP*Uk~XoLwO8;fc(x!_96CTFpVFc+39E<hI14>AU0;urim=A2N)$yhi=k^xw6)l zA8Qj0*hc6ow77RL4FaKNDr0}R&K6{xDhlaorR}e27DVf{&bvk3kq<}z)*~hY?7_;S z#^N3l-Ojy2?8MEZA|SG<5qM~Z!6aZ>*zu8b^PLU-$c^Ls&=9;KUD;r3$SZo9XY?)q z&5vOW5`FQQ{F_PBF8vH0aT5Q{0-vP8N^(3ZhA~;<(F0Cr&RY&J#-o37*H;HCIW^Sg zEn>8(kQfwm4)I4gDuHMMw)K32u>j%@hr)W+3Ls4`jAtc{xLAUra^V%8t2B+J$gm9W zDYBq05p>}xUKiX~<f76VbO(i{sS8k$_-bx6+>-0I0+YVzC=(vauy`l<i{*NL5+|jB z$UtrP$4?VFLRk~>4Gn)p_#<+Hd@4}5f4)wP-6uC@79rYilz$AbuRdJ8|0HN^;e4(G z&V%w<ZU>Gj;OuFz1->YFauJ#diLl)uD&ki)Wd*~*6wg}P)~z*%<&lbGQx{A@B?=ke zxSLN!E&8c)vxPgRYbr3uN@<Y)+^h_k{lb5aED%v{t>xA=#i4(X5q~|@I<tOJn3N)p zjwJ0M8ezftjd8PjRBp_<vGv&SF6Qpw?d{6g9pYc6>p;lsxR5e{m2Bj=ly4+;XeyR1 zo~r^sMgM_~<5^^8#c5Ode7E&r38bUk8;>MA2^WR=YD=eu!KWGjC_iBZoJn~SVx(Yt zBZoijsGUhsL(_kYIDB#zCY&^-mI$9~-jWqH<Wvmr306rzr*I&t;V$8%L8KR^v4W{e zBzfy?=XdnC2*>kG&(!a#gHe~*S~55#O9WC4&lIFJ*>$N<kZJ)!^a^){n{YjrMhNI3 z`Dtzof=4)c3u`dR%@M33F%F)yHhpUimq~7ANmVB1$zXpwpSgimS0t~?otK#01=~x0 z8w?aB>ogUz8X9bl?XMm$h>LurZ(Vckd@~nK<x^l;=wsUiYXg9zIru{lTr2!Mu~W=G z1N!^KhJTX(O@S&>2pCTND|}Y4P!R(@>%o-D=o}Ml3aMK*cr?#~M7f=cKCXs{iVT&y zobj+dWP5*9!xOp2y~*G_@HSzHi1_g``ypWf;S9C`s;`-^C}PCON%Bc$Xi_LJF_CwI zJcTrYodG)mnJ{Ao0cI$iBXOWFJ^-^3{F2y48PS|`LBVr8G`8gpK~X!1h6;JW0q%i? zrKc1=U>XpRatr}+QyeManHz&_ab7*rkk+P<0bqYOTnvc2pnJxkazHK$q;?n*6edvQ znqs<uPgsNJX$1ddBIJO1eRN_Xv>ip|Bv1ho<Y?1ge}Je6t)Hg$KWL&$VBF&m51<}J zTJywKN9B{rZrbJp^p?TIcP{<{+ofJLxuz|?$x_p<F_s5SF@m2QUcdkH^YrR-hFr49 z&TxOEB)-YQ=qldWhv#Z%I79?Zd_$95f`-FI=l~Wj2S_ui@5knx20n>dY;63H2Q(M4 zr~(ax<ODH@C`;%@WiMbL2`VN%buhq`MTOh8Z&)@1vT+D21dlQV>(g5vkTQI$a2$m@ z+u8<$xZMpQMIw&Wg{Sf<yWcTuibm)4)KP!hg-%H<fIV>+gNG3pf;9<cIIH9x@j6F+ zeg`RtIcb~qU<W11k~5GpNzSx_4hOPAD%1yT=nyS=g6#S?zYqXVUJOTkP}9+I60 zpul0@ld)Z8S#~JiN9vo(g&PD`Rnq-96b6rRPM_{t<ZQ^=OA;f>r`!8_?IrWuKU05% zXg$wMvfI=#cuC&Z@G3XSC(nz%A@VSU4CcW*|2WO^g=W{wkipfsVWROW@`x(#CIg0( zs4>LB{5O6SVGzo;PofAKUD)Mn%J<KNd8ZA#Fis6m#GmYJLy{N}$Rbs2;we|b*ex|6 zlF)rVX^jRmL|kML+HVA+Y%BJ5wSs^DtWDRNvo3vQX?=t1Y?>41BnPKZvpSEJqy-ov zxiphb>NM_-2I{P^eR&6?5@h-Yax;*Wp=c0D&<8Na2QKH#O2>`@O}LOgnj{hjR!K*p zCd1nPNxK1&X3EK3{*8cL!LpGTtaif(iWoOugP>F!{HITqpJL1pOd2ulqrQJO=wK>f zrH59WoPa`{0-<LNttuh?`YG|nyy-WXsA2tOHkE(y@fz?KNUP2Pg6+Y_?#bAk&;fzv z<FBIT9*vEYd$4A;^!5W<_UJYNUDEk1%+y9H39JpVr)?Nc-zjP=@xkJXblDrU`r~#{ z3pfu(<3C&r+VRNDNyWOQ$ZCJr{BvtTM_D@c*f^{YeFc`+LrbP(n?d}L?nOC?fm~PH zi(=!a+*|OmP#H{9%~fx1#nCjS#Mmh7E$HnH%VNaF<4VC-k)W_njU&Q}zJWVmng&OB zi_|WMhT^3WTPKdO7^yTa&IYaC=(rNcmC(|JD1+piygLg<OcE^)qDg;tZBGxI(Fwwb z+cdeZGLzHjM#si<kIKnG9usHus8yEPOQl7}<iH>XcV%pp#g@WVsl8(3daESW3D&tm zlcR*@Adw2BL(cTpB{PQkP$31X22SX2e-{t##`Nz^NU@UN;@>}g&`TZVRAJF-Dj#lB zQ?a#4EZ=onuT3H>)X{&=l&<<W5~T%Zu}Vfzf3dj>SxBg%J{iWpw{{1`&n@&xYFnWU za1X;dgr5=(qckZaq7tu#i+d1zgfcZ8oWS2u5M!t*sRl8k>4*z>ODaPl4&neYKBnfP z(nK0f<uz-i9UboyI|f3M7zn3ejnJ?zAp}lyaD!gIe_qt$@PmKVEj`k02R<kRr6Py1 zk*^CIRWgu^U3SSTDH3q(ZxHFU+Wi@($+=DC`Bi96q$tGvqKSspSv?FkjwYC2I=(D5 zZm79xmv<XY0#~13g^omr_1y+d6`BlhzlM>xWVH6L#?l-C?(!?$^y<r{BfWJCUF3WW zx1Nm2F?763z4d=+{k}RykIc*x_TveTg1bz5k&a(nkOzVpl@8l2P3{!vIGBXHj5I?U zDIlc>419D7k@GqkiZU5GQu~A1ZhZz%i1UYd%$Mo9j+>U4s1}B;5==|5S7}@vjN8y8 zhpG8FjhYH`(RDVCOXs1d9RNCZCQkMz$$U<Y7#yLqq!fRlq7q<A;=J4tv1mMm+}NC^ z2JscvPXHp^!Wu4<m)uF$XTxfm&9l@4!4?tgu(>&~LqM^(Z4VFzk{zjO=Bg6%0Lu&% zwW)TMwQ1O%(*0W+#e=Tanj*rC%e6cJNAKZ(>OmkYSn70Owm^~evd5=p2R<uw*%RL| z<jd2D?dpGC_JX5ewRmhp;bBDs8GtG<9@UV3E&A1Q^FwZs5D)3s!}IuGKf?Zurl;=j zEZDmQ?l_70B;xFi`@J5f^}ckaEcH1MdyotqAJx2awhQIX@S?;bkEO|#0s3PXCd{Z_ zTeg|H=Mo(=VF*g%lmdZ~wVPdn$%gq?mnWwEHgSJBU=_`Jy#9(trS%6bv1Erc5|Vq~ z*!30<hn_dun6Ht^V?4fi69|vT7vI!(gkVm%Tk0X%a?QYOydG=gRc?`c=Jpc4<*Jd# z)N;OuJBT+z84mFcwO;%YaSC;Y<HEo*o+oa-0*15bCB#@9EkES0sA1o^oIJt1jw$cS z>ehenJnBjhHkQ*Yh2fft`LJ2RQbHKzNi!DrhD#R|2FtCD8)#ppZP+Jl$@K{zc1zM5 zv0oM}PKPuR$%O!nm2}I5w_`Vg5)AoynzDxK1T=Y{2v_RZGBR}94BO(HjP595c<vuB zU^SWeF0k98f<Q$p%xx|?@Gsa7tTMCbtF3=WcBvDIT)4))&E_V6kU+(f$ZGTy17lC} zgk!Zgn_-%x+>9>M_8^b8a_$8prD-J%3bMTxF(fW1SomfpzM-)Ve^kdd*qT1}#Wo?v z;)rb?9-DL5@x10&m@6$vIjT}soiIa~=70giQHcx8CvhHRCwmWlYXZGIkZlFKl`DUw z8*mTl+N9M*H6QTC@$dGG>Etv89A>wUsy41-W1u__nPGf#%~gDjt0a^UtWneeqqzgg zCH4$9VG#Vn?h+lPFEBsE!OVK?Nq2w<!Ok!7X*8*trnb;K&G1dt`?n~)$YnG&=)uN6 z{U2z#qf-#c$&bc*^X`OVpXj=<AisY`=EHGNG6N3T$^&(XkPJ!P0gcYA1bCX0|7FJj zdtHFW7t?=4Ngrr|>bE+wq>uQ9CVlv$I_XoLqz{QAw650cPY^{Bo0Ss-ccO8rM_R@T zhppXVx8K49zFj#>Yi_KX%CBf+1^I0QhH3k$(HuHfEnQ=C7v)k|_=cnQ2-AQ4LQkzv zVdIZn455Z+_{#jwoPT{P=ZUu_X~~LHAFwwB#}VHgPxOMu4ax-}xjIDx6?CdgjZxFG zo43}=j2b26tctfC1!{<rRXZ2|o;VNymYCof!8<yNp-?u$iur~4&6>lI))mZ7TRbYx z#)QTc(M*NVCFB^o=beFu2tI!x*UHog0h?0FNd%bCZ20lh^h|mG<pYI^Fz(W<ifKSX zmgzFV6Meq^0-pnLN%*4+vS0Kw0FUVBJcc&0JODsF0#XUG5d@Sp-?}c5D`W1%Zsdqu zrSDm)h9rGh+73Z(?W-PE;YJ!Zht=R7DFRb15nP!xGHYq=srm#aVzqx#t<@h5&t=Ib z@#8dH<ByIh*~HHWO<(~1;Vz67HQftk=RPL@s3U++_Ci@Z3-jNI(d5>ZCZg$77-m#W zXZ^><A-7Qaa0!10)4ANPshNZ_AN;Cs=G=E&%UIFhrZjG><<fMO&El43vsaG2B<-RL zW^IXWSzD_WWPo9z2b+J>!Em6=ZolLktPS6_=1<?iTN|rY=qtb)=Et;u|4g~r!nS7q zMVAmZxCSh#CN6>a2RHov$V1m$k_0x%bHU1|)rz#jdVg+7*^>k$-yBQOz(~+BYO8|* zq6(T0NM1OgCE@k$*8XF;WFqkgk)g(E>ey*cYhY^yJA+1#<RO1aYSe{|$8r*P!IbB$ zARZ#3@4GNaW&@IL&mR?-xO1~I*PsIc&hZ>rkN_c9JWfK+=qu3j5UTwcVk6`ndqyBM zoU{hx-Y(|h2CA){%L5_t<1`TBkI0c7OB<QS&IgT@Kp;e#Tbdh^PY(q{zta3V?|Xqe zp-)X5Okod(NSS{R=6p*g8>VIvTC-lSJ(9~1nlqAn0Obl+QPNWavj<n|phswJdLB%v z7jxgzo5uNhr`vr}uuu+Id_#4KKdQDaAs31C9Pp^$(<c3hF7StF2-i1;f7e`DHy4U= z1F_E*E(7FIU>02S&#guBBpYM?m8iiPxz#}57YUI`l(c^^Z;kB=E=|q~TH!=3iQERN zk$QkezB+Y;q9G^2&Oak{q{8%DZKvTOgU;u}^UEH~60r{_8T3}0Vw>&^duiFr%abm& zW6-51<v&W|?0#kIW$@UwH_G+&Kfipqo=%ishvWYkzMp;)G8Iw}J|6b8-dM(P@eO4- zf0V@VK1+W(B4@am&ghQR*<^|bpCz{dakq{}tmOnPmn1)@9YrkzIjhKhon(La+al4$ zgqxtdoqngYL(109$GSWjJ6qR+H29TSiun^E=QI0qHU9kJm#a_8?E06VmGPI)(?33b z`26|f^pER5f|sw622oD3NJH(Jz^i@d5hZd%9`}Dtf&V2C4)q+Cgdp<1Iw_%0C|zv7 z1R5)@pJvd_QBMseRzuf>V~rZou=gcu*kbHPPUA7ucEZN98e9v)M{!2SGw-teDER5H zh~Y`5C6ygb>kY`I82McmxyGgk2jf|HI>HtlkfgHUUr`OpX=I2E#0VgKixc0}T3EVU z+)ICA1C&}w@WoLr#OyltEQ)y!<0@j+yWvRdYg1YNSNu5DR{n^1mFoJ;Kn@sMgr5%@ zM+#_&0LEvmOy4)NNQP*buLa73<4C{bg<{QGGRiq_nM+0nvlp;jkOMp#01#GhZh+{! zS!BPbb%#S5>(j}bjONJ0knD?Zs8!^Tj>&&2hDa`dG57w$f3k{E@y8?9=6d5l{y{sO zqC|)ai;g*2)O6JEj@vU?oFcxV8p$73TO-j(?$O*T<}1g;+i9HX4k4D_!k2sT4ZGae z_@J_tXg`0sz7o8LG?5CR`5u5?M7J^-w$59_-NR5!Bz~N-o<B;kz^!W3V=HZeds=^s zAOVrn=$YT3-ES2%h6|#PDf24#p~q0sLN0(o`AU$yEJinEUnQ<p?P=}th-#-K-%{IG ziiw(gB20>ck8j2v{nMiV_5K1UM^~J-1`M3+{WbQY&sG3o4xYtUp~Cf2uAS-CtM;Td zoObcpS6COlvOL->>BC+jKy+uQ$ijax(@tO7A0)n^F#~^;5Hr*j*~7{-q)dLGYpxSp zz<H{yuZ>ZSbaTx$tiD<_UFW`O-w1XYQ$(O&@L}aZhX+f@p@sX#G-37wBTrdu>AZrg z;XCEZxH?nbez0LAv8#|j$YyVtf&)_yprz@dMIJx4pbdJpUBldl#?_aPA6b9TlLEgy z_>CD#zoJryZ-?TWTHQ-m`aK49kG1Ndi7i3d1HGo|UaROUgEkU@BW&=Z9$BkBaw+%O z=I4<$>XEhDBj<HTtJS?ktwNyyy!Ob@ZY?I;LwO(ZO@_RBeMdg*9r-1BpWdWBnP6HQ z^+WWE9F&DfgVway>h_)zJS=}Dz#rm?uJ7my<0zeYzW;^t5dHEJCZVB6u2yWFAjCwD zyRd8+;YcS;l7TF+KGG+nD-o}tO(5BKHf))CmDroURH4`DjAlbTdGQ3!-9k={S`|7- z)Q5Dr(x88D(W%x%Y**&3ufPP?4V7&AQro?Bt>qnin<4KOvBIGcLVSNiLx_-dmXwa_ z5TXtth@;4}Jf_D&2sExp|CVHVk%l_BBOST1h43diIG|RREX`&XmD2B}j`zjpf%FW% zX5rl1iN1zJ8N?4|@HFC;G+f~k-_)1YvQ>CiFwgrMrk|QH+VEExYdC^EDqm@S?M3i~ z>Re-)A?M<Y$1$<myk~zcZR@rPbM>Qs3J)b0bgCw!1UCJ_Is&>TfUFNNe50i_tftvK z;}7{xT@pW2Q!d)9==jYcELcUq0jQ}Am8Ih>U@g*;tY$E1<=(q<wyOo5OG=CXhW(i8 z)w=8~g1kT#rCtiFoAmnQ$y0_ZbT<;;P>;nQ5#6cpM&Es66v2NaM9o?y<Tpwb9$RfY z_MYl9I!9U^7YfW#vbj;q_N)cl`62P5Qad{AL!+#^YyV*WBjQv-##Q_{HLm<o*^Dc| z-XK@UQNXkQd9Opg1w<HYb4=b{o*45v_}yLr5Dq^4V#si)94*>2ex3)g2j78e)`!bM zrIt;%uE4d^_DO&EdI8Z56Ubl-fyW_=#tpzV1&b+_PZ1=)=VlrLU)O&AyZd>0Rwo@k zU*A86V8g}!2CyXuYkAPg-Arp%$9X0>PC8?ncvgyve#Tu?YNf<GN7zb<Z|d7fT(-aS z{MrB^tqHy;lyN|MrH;k(2Z%oMX}i+v+lV)}%BLtSp_hMl8_|TM-V1IcU6?;S>F#bL zp^Jz3hT2j7sB9OH9F!n*k-($1ys@mdqi$J-_iyd5HWUb}=GZDw72!)*A>}_$;tqjf z9xiW?gV9QCm=@|jG4p`Nz{#((JC8^1O^KBno>pVt4LQZEipL9fP|YJXJ6JHhH0fq= zQrbHseJ+1dxyDX)1^KHJR#uEpr1jZQyp;uDVi@jV*#MEDyRIGB7S9ULgle)KJ{>Mp z4cqHILMnDm{EV?$#Vg6km6GOe%!j$Tfi0f5is3G|q>>)9Jz_R~2qp7A8?u69%H_g{ zDrrCvU8XbWjnpw7WVKEbjGG%$9Z)Wl2xATt8>fE~LWGkjm1xvX&vb>r#wHyvLlPv6 z0AZs-7Pb);ac0iijFE{)muP8)U4{(TB!P;zo!>!e-``T~SCts3H<h2Ag?0N#qA+qp z5I}AZvE;NwSc6B*6?EFYZU@oaLY-cTn%-t*#W0)!Wf-sc`k8VJ+#|U8=B+XJ9k)_y zd8U6n*188EscWRVcMROCsO}|&Zv4{fDS(kzJZA+H-~2mRuFP}9g87kx4@68JU-L5Q z^tx<sJKcW~s-%e@uOWP&2>uTamgWLNmAAl4v-pFb=K-S4?+fA6nz=*xl6O&wZ<r{u z#Z}~-YY5+Whwu?_jPYQ4tn~lz)_4HJL@s}ukL>@o>|1BQfohGqgV}D)dtjgv=gx~C zr&7Tm)lyNGt?)l^I4_rs0NlGaJr9}?y{7WTGr^(xjZ-@M0DRd7mf9~YxDOeRO$NGy zjIHe`{6{lL5nDSUn&s)RuTI-Cz=#MOW>Rzviz}q(a{#xMPX!qa&h-BcfByC3^wWQS ziI{+|7>stz=Z;!@7z%vEk7tpH@3qfD3;|{!wrcTB3jBBuASy+YN4pUO(Fs90$)yig z8V=j7LzGJjCNtqakwm+o9r&3nr`~)p)|-{7m=EA*=rntpeB@OO8o7kSTbhhLqmN0B za_%}_q$n)CaEXRQKzj?ur_3fM2XlWN+?AwfB)VT7^G(&RI(Z5NL$+D`_>ml3$TBhQ z<k8Flv@-|xC*r;Kbolf;gKo6pu*V*vAzb%NzX_dfi$?2IdB<@jm-Npj?YwL}D3^+B zJMOyCRn=2Sy9$5b{m^gSi~gCS{jU7D^54Bxu7>=#Y4CAUFOvPXGew0TiT;01@-)fz z6TgS;h~)+z=nl?K`>oZwXtmFjR&aW-10n4MW`oYSJvoHuFH*ZeKz71M@Gq&8GC0YR zI{~x8WmUHKqi{kl(aOL%kd4^kx?+RjyO`zx3NeE)pgNf^LaH+HWMK2hrD7X!7iR}@ z`djOFFhH@V8a#byhU%2?V;X;$mWO620}szy@a!@AIncXD$>&Vh1?=Y~u~4kseVNLI zNI<~7V7cWp#s$_hS$Sd8Q{4+d>eOi;y>YEP7v*mCfy5h6CPU*UBleV-jI<+Cv0)LZ zk=lz!4CM_(hjF-MLZKl=3=bDjNeCYg+ru8F$>z2Lu{j-}mL{s4bpd~+%=KX7XB^2G z&=V5bvIcrFM=G~X=@tiLgc~DVe|T)t<Wuu2G%SEAPF2Wu8?xS*6!L%5^so{PluPbO zy69?Mt=C6%AJsRj_&mz6y{RxOK_@?7f0?E;^nB7D4m)^aV14Ntn>zq}G;ghyIEyKi znk1g2+MG=@Pw03$8-9QMG)<$Z!n{mZ&*@M-?;ui7xl?gr;4?reE)~k?bc!p%YJFq) zcg>Y`12o4Ip3>sepxYUYT03AssLs?GYLm$hFGA}~=W2gc`JL;5o33`93HeQDm)EC7 zr6e29Sg5vJv(6MztU+`0QJRo53@j2MOID<dmgh*>DoVYml<I$|Kd5j96{pzBeQ;7~ z1C2P-l7&oclWWVo^18E8aaSC=GjKOk?m|xSg+>&|5X(l%W&Sl)#U#T=la!tQ48Y-d zREG$D5<xf_PJ23Yt@%;|dCc`fq=JxM2TYQBqQ;Q;8ut+OXUmNohfF~Iv#xZC(J8jd zn4G`L35Now7Fd6(L2G(y2%EmfOJs>vC7iZbF0jW`LaGwqj<{Y_F*c?JJ=H4?@fwNf z`#DMz%@s{<O4I$}@fC-7kpvA_Ur-0)r5&j>2M<HVA@SpNafpq?fVAGsv3(B?%qZht z0=c%wn~=~5x}2b0;<YXg#nvNz=M^$?hSkL(Z)42O%aebNYkH>p%{<W)vEwXe#8%Uk z^Sv$(EgE%kh--gJ7h09>Nv|mmWo<c&Uc}J&bG?!kqm12ubtMQE&8liOuF&b_p}Kei zjIKmmkvy=eizj4oY^B_GwC(6e7@za5t~uaLdDJzBa^uZ10<D0J(NH(YRgy@eS~Ulp z)--(-LWO^8D5;WpTqP8wlKcE-8gVpR5dYM3SATWs*l<3j+6`<pmkV}2cybhPl*x4T z<^B5)SMLSyBkiw>h(xG_CcdfX_*JWf7RWe>L#mOi&sJ3n(Hk5AQ*&&GK>I#gf`W&- zHbP{gF<c3$ip0jONM9DTWu=|QaHbAXjoL`;F$;h3HX_2+ZaX7%^U;?g-Pq<~GS!XE z3r&+=Y$PV=^1D<O<tA8UF1B7uJt&~1u~SYdwm#tSRLTt0Vs}I@5ngO8m5mmyS<AQ> zu}jEUE4Rqep|NSa9(Q|MuZ^g^vztZ@ws>F8KNy{yM&!BH?GI*%SQZ~xoJQVJ@URlG zf?R)kqob(Pc#X~a$SLlos%tgmIo%{xLY(zDWGYQ|tHIYjzNQ+C-A%o(`B~klHwo7r zMEE4rgf3r5h?2|!l8yo54^tP8jCz^|YlpGl+SBy78d<e;e~V6zcXgc9&V!JO23pJO zIOR@)XPs1)CbpcVsOXL%ru5YM1~#dcNBe(Sg8c{=k!6*18IC+ncI!|W)}gxua8h<; zs{Sb18B?<s*;*XAVWI(Wuq!8xr(>;s-s|qhFEba5ZK#qCTR5@|i{iv$k9gDL!Rf4X zuI|QW2N*#15Dn$x2&psy=H#NGOs=n~fkd~XwWf&X^$~SUocKlJ`fBj(WKX`Vayx%x zDv<z8(7*IXj)A6)Cx|vC>SO^<n$<jtC>>q<P39dx$E%6xc)EATPc>R`k~bz$htJme zh^dfj^x3CIZq?wexW*`z;BjB=b}_9wd8gbPuHD?YmhGoGOiq|6!Q)nMG8>|=ps;;; z8K|%FC94{$nw}b{MA#6WEh)&Yv;}`|rgf)-^GJ?sn%EU7e*Ad);?QWf{zl+=s4EI* zLubO3G)g2I{>bUsm3`}>nDtQ1(ig|%GMpIu;%qUM6PW~_LSui5+L%_>1IP+FNd#nY zw^{CyJXxuXx=r!QhAru^>o!d5#Ve~|#xOy0gOgH6K_QtjGW9H7b~V$+&engmU_bVi zc~359rJM}DuYV3X7YPKjdg`~o$qYH$s>iZur<m4``f>a$i}w@(A9wvI)#GUv=qP@! zM&%TFycvK(qhujxRCwTZil&ibrHTvzO0T<G0QS6$GA@uuLRuxzo(Y$T<3@m@QBM)s z2?KPKp@K*+f3bbFXn2#LS?Pa8#Y({(af)05-{f`uYD*(Jd{`#TU&X{SEkr@bz#8C3 z5dAg44@J+P+*8y5Ke!q(<YI7JVivas_@P=Pn^>L?VUUrBKk--`4MEQb?r9TkHc<et zKv2JTz`fAydhrd#=<!G7IQX1@%U*ywugqKj@}$*=Q77=XJHuXD_VV(i+v}fy{DkA| z2&j=al#AwxV;FHzaev{<y-&UV853Zhpo3yl>5)qyUjQo^uB1k0(5o<neh-WW+dONz zQYN}m78q5de-J&=P0l+)mQ0qVlfu+sRG6eHf<>)YhUZ_K_QG_{#jnQF9J!|Pl{$A{ z-@%Th)27NwVOFr)9$Qp$v|CnxDwFa>IMZS^q>m(w$_+NHA$@FsRph>bjcHNzo~A}k zNm(60OaSGsUgEUTv&{3&P4m{6`;H5Nd8=mGg*$U>-vh=P-rTZqbPq)VeHBwY4xFta zeXZXs#@Xtb)Bw^K#=sp9(`rZ`jd2jVkb0=2>sgCnf+M=v`>{E99nWijekFAn!1?`X ztT*p!a9pVsQQxeb#5p)P(=7=Xry3krez&04;J6DnxX+U~rUu8Avr9C&CKy7V1dObd z8I9f}0wP0nBTuo_;J6wbhij-|Lc~*jRXr+jT#IxnYBF$~_$JE$yH>kX0dO1|N29+{ zZnyT_w;WrsjkPIgrgVgVp~zC65@?OO=aU{f3827?o3Tg#^!|c~;hV7ngyw+ZF}=UW zq|_liTLEe_cxKvf#o|~ZJd&SJF=CN76^Zc3KvJ4SQj{N8{=2s^a26U80Rs%>J+&c7 zd~ARtHpc0O*IZei-&h;|{H{4SR;z~jurcgKbK&^jC2bKpJ^k%}x7P0ms+JTWo%)$_ z(l|X4S4w6vRw3B7XvS*KRJvL&cqYKn<>H-^2kaiJ6a;r;o&aD2h>J1Z+`C$N`B?By zAR4au=hgy@<&%8O@60*m_m_e_uaZ&7+mMEWm0~!b_ZKFdw{Bw&yR2V61}W87roHs< zVg!iF*q?Mpg)R7hc|A+wRNX>Rtr07x1w_%B_qjIc6xCT$2uWM}4{A>YV-gDv(Xr~} zOj$b%laxS%SUwU(0gZU{=~TJAR1O5nd%c*6S4CpXPX8&$R~Bc*9JV%up20yr*X;v# zBhoW0@|w-hr9cVJ;oB3=`{sJ%!0pUuw`f5OidDgU2uR3(>+&o0$$#7bZC^(IN1jcu zuYb8#K3t*68pORFn9#s<(liKMMJvL+3*~zHpI<&)PbV?<RKuCa0<Qw?#H*5uaj6qi z9mQIRSAF%ElS{A^voBZU&mVrdQa*fAe*W<3(}%0~#4ddP_o;HNOt1dy!}Tv$KToed zqth)t$@WEmDG78+@aT9XG7>jtiCtcmeLHlRlA{)&yl8vAvuW(Y6w&@<VKx(MenSdm z{Z$fhz{+6W!9Gd}_&>p7W#@Tk(3{rPU~+iDsFY%?dNGMrl5@{7xysA{?2PXX`uW^f z4`>GRKH-o^1Qt;^A53y$xXbO@w0$Le-kn261JXl(&Om%ai*X@*sceSQ0i~dJ29U5I zt7)OQ!i)Z-<?z|wA;j-em)%~^Z}I*X()wZ)Jnt_I2`c%m4RpRq)jcEzv0OnhH0EuJ zNfHjAPteyLWOI~-d2_QR6WN|E+02NK+P%)8eS}UfQQQMd&(5daYIQoZf>u-?Ob4j^ zn~NrY(FFp7^3rtSfCq3W1rd}ZRuSVmfX4>BNZ)HuhNwtr21rGK!MUdA0n)V*b!79W zCua&xdi=0)otu@pK2^?Ggey_`c_U^Fc0X;n#+urP(+sJT?x-{F)0v>O%l3H0OUxFB z0;P!I9IBI<T3XK`Qjr)vQMuyYBFTy(Kug4bsMR5YVrYq2fu)LUBqI$0K#|75X|LNJ zw(-a-UE36!q>7t)fDxX<Fh-AHT`I>bHd6ECEQv54a96@?rfS-FptWZcJenrISKCH& z4r8?p%LZxveEns5mPj;C&Jq{Vw3DQjIK9bKgE@?N7^#yEn9E)AfQ5Q6ugQdFp@wOH zW(fK?#etO#1%2Whnhk}s8MgcMc<OBE^Y$~pJ~I%HcmRbg+!6>5asTq2Cm!a%prrsR z<+e(pvvU&d6Vc__NS(HOh;*6bvgtheQyQTwS{7_3Cp1uDW}7G7URRaYy2OuX(d%k} z9;D|}Op2%gHP8X2*+>F5?m&%E--d>NyaX+;Iz}^)Nn)=?T5pCb_P9`}sZxg5@4pa` zobvORPoI_1R2eFh;pd?;yB_{LReqT%!_Ugc=@8y&%J`R$Uw*#&6qVE990c2iMtEaj zJED&#SyFDIE#_V9=fj>h>dGoO;+x8u?!*dCStUXI!lam&n$jhAs=PyTUc)ATCsc>z z-#;XOK3Xkw<El6wLA=1!Y4+<n&F)&Jt6Z7)#M#{qZ7<&bKljAx?kuz}Ai$PKpjAw> zKU6r!{>>y?5<(58^E;@4&V7?SV;5}5m$hj36wQ{sE_)^hWY-~EF213mTDR5f^tC#B zRt|k9J^atlo`rabK6@6ugq1aa$`<2>#KN}nFRAH3Y@E|$Wo$J3A^W`kX4!wEqujg( zOK3)=Ex7WNAP60A#9JJuM#xOv{-X2ZX^G^FviR{VzOK$FfB%4&W|Wh(k|pALQ+3cE z7Fj~cXAVFxL@%-9KZ#6Yd<Nt8^n8qf$lcfiN%Q|j5{0-JDZhlJ`t?qKzc=o(sJftt zEGHS=ckRNWYzaJyRRN+BSz!2*4~OK04SCH%x%&U?eQk5&xUueEK{O{RyRJtoQP!Kc ztXr~Pc3tI>=gM|+w>Dc-8kx3PD@!^gJ+_mR|9$`vl+h$8Q5HZG6!IanOEMDy-ROS$ z=|(rpW<=M;0~u|Ukz%rcq?PDpGh*2n((xt8z^q>&12hWtQsV7>l3akOlMtxnw=a1G zgi!1~2_+7TixLW2Avc(x;TY$<${hY+SqY_jy=nD@2}SrOK<>fERI|Ri<PS2f>iJ}5 z-}$&FwYl+1xa!PU>CS)bnP;O!u8P$`i3094r9)8uJbww_q|pq2tt<oNlsL-}8q>fB z4*J!mb*4dVK$*;_yHjZ8R3ffiTuza*z%`draxWZu9RsIFC{+CY2))Dy+v<5(#5jLb zv3s?C+^lK9g@{*2gc#<#v@;W(683LF<rpa^qY9aLn<g;ax=5=NyF8P7yC7Duw`)$Z z6zm*#XmOn>X04)sng{Jit!53XN-tl?G3w$C0JmqN3(dVyJHdS)dO>FAJ0%c1?uIH& zypeId0aRDWF|d23;o;?q9^e}qG;o(tMRY<j#2ao!;CpI?xbSH1i5EhQ1T0|?4^FjK z`RZ3wttP8ljb$f7YsDFE_$EyTzZiyFAuf~5{U<Vj(UTp2N>|6a8Zoj?xa+Bn?8K`w z)oM8@{O-J(YBg*$Cf?MEm*0PIQGTjwHR!xHR;$6!)A+g~W;V1-ev|vpNxn|Af`z1O z++pE@xX>$U@wA4m-s}#QHno&PosoVecvQ`PRjVlkDw3qKDaJCTY464=k|Y$XLZeBL zB$J?-JxrQ^RTCNR5^M9SoexV<zy;CC#sV(*dEvketcT*tG!)v@odS3GgJl(P)oPXY zv9OtsK>o*8?RXGif#Ndmd6hq`D<blT9RWBSMhTj?Vmn2}>pN+4d^M@6(L@2YsYaX3 zaQS4bM6a&TCU}U&^9k<KcUrRNpW!}pW-cW20*7vYs?mCjr&Y@Ut`mS9kR|5nOf?#} z=U5-NW`yJjCt8j6YO2vpHQJU9LnLWp3HvuwjaK4q@yFSP1f#ubx^1e_GEM$VI$|GI zjb?(UH-Pn?LoGSnfWecn8Z9|ChHof0V#J#(@#3Ne$1BgDX0r{c9Zqg~#K|vZ7l(Lu z*;~$k96w6a>O)@OHq?{H<<HRtgkdS6Fsx>?G6;IYYayBhzz|)cJ~9eV&}(!Fp_Bsh zK)WMUkQ0=K_&ToEn!~eI$KOC;$^CZV=YeAj{syA8BGT7XFysKtm<k3A;QS6TQ}kZB z8yYB`Dj3A>gOxR8S!OLK(h@Ic)v*0?L>st&CwUekxIv?N)>S%YL*+`Ze;vex7OExl zn{Sp?5x$YLzRpKMPB}kctca*P>L<#FY9CH^)^zCpv<aQ*qGcb1%9JWul6eaZfG)*P zov;H}bU6w`898F<Y?ue4iv$vESU46%Ke>!9M`(0&aS{FH&_n7X9@8ic18>i{rE>>= zAUQe)SSJ)Oe?bgHs5Ince?uWcPFS|Z6<{c|ojXzG@CU1}GqbGvS)&&+6oyOB-%Xhm zsgmAtvu;_T5c$3g@Qo2~{=|z@CAh(T$n~yw$l6i89~HXpWP)MQ9x=g(skq*tJXhpn z!5exA*|{u)kA?fi`PgtP0t{lhXW$us+#cSOd|t@J9fH11AMEL$8#1=V5Mx6345+ci zGPiJTx{0xKw5AbR)NAGy+(S!AJPT`~7F~emvQjdVi=D=BYxo#;PyMStYW}V!Cmcpn zl%SCd6BAg%%>(V5R_*L;6@xR%hCS3r#%r;Dcxp*%N4J$F$#v%cjAA{k^pV$pJ7Ssu z$gini+13zSR-;8|iw9g&=gjX<OZ7%GxJZ@%6Q3C9Xm@+r)URM!>R!LHmmN3+ZY6va z*ednDMpC9UmG=zRq)S>Z!Ec7y?6u_|+Q_Zf9gQxp(b)i9T>fJ)M%TY~M{!gDl~NZ0 zn!GBPSB-?9!BLD%W!fbs)e8!L!89cYh4PAj;SZLTSB)seF7mGyqm(<Z@{dz*Ca?OA zz7@KNcQ*0-u|2=FUHkUy<la7W?a80Cu|%|S3$a~fRbbj)t8P^*6;VPRzM;81_K5x^ zX0Y1!eI(?va2=RX-&CF(Fc!L~wcq)mGF{0sN|jKDM~$y)fp5|r!eTgoR~Sa<mckRq zgJv9s8Am}W;O>@9UnHBPeR33f+YwU=pmJ`h<YT3z6ae~vgACZU+aUOGhq<mZODqLo z(?B-ZVfDnY<O5I$z%GVvw1Xn5rb#46PVA;cGW<LRz}JgCg=7@Ro<hfL63HLemC}rI zSYMN<OAaf+azz)XkN}c@lpy|azbI)P>--@!f10aUVxBwyx@MBvR7Ox8we!Y@z{sV^ zb8Jd#7aW$s95DyW6rR|fq7C?iWhJ$tludN4Q*@mosV!5yW>_qtuBYB9XqwFpFxcsM z!!VH??-b%~59*b+Fm(;z(4d+<BKA$xU9cG9g>Kwr&2mi-nro<k+$14}$AS}`R}d1n zQZHrCx0mI+$<$xC0EEWYrrT*Wxu<>4J)K#NVWqw*4GWHF<RMoF3g1wt%O35M)8&?& z|BGE1Xo*?FO{uFSQ%5d6R)@7}?`_gw@hy8XM7~9e3!Zd#i#PIcC&N(08aCauq(kmX z>X;jn9EheG_pO_MaK%=C?L9SP)=%<XZ;~L>RdPn0>PQ}3oq|-4*nIg2(KrH3>1;i& zQnm$j@5{7b7MmkFJ(z?~ju07hmO@jKuMa{UGGW7s7GXmge%7j5R&}_FA2~z_-%y#e zNBa~i>c$9(9gMlvU~V;NaI1mK|L9?04YN$s0Q%$tOoPLJACuXEZKptk(Eo2Fkl^S0 z3KxpOF>K2$>vR5JlSpw*8SwNDs2G~L1py8Xk^=i>c#j<L9)<wN#ZrE{ZhHkW0Z|if zyw3tmThFfkZ|}U1N}k^Mt9$HEaCmZBvge;+85dXl4$CKXGijX_E58FzAJG)U*}9r5 zMT$D=e!p^m);JdN^zaQ0yxAk-7)>2@J_p<wo<1_1JqW;yk#0#C=c5l$wOzMprPAU9 zcN8n9(ML#2cd<mLG`W8ijftQ`EXJuqGkbpTKj0--j}X3?QJ&+nFZ^%#AE&;v2>$&L z{fz9?9QUwUZ8ZBLuL|E#ugV@3+pFrM{;;toF}YTMsy>d#jYh9gTgg1|JCTPRq=s*( zBCtnEicmyekXy1InOUqI;Skf8sBzRs$E`#3Kha+gO}lP_5xe2lz}Z-SMk84jOHe7N z%qljfRuLyM>2_w#EdyeOQYKk+6K;Y*jv6z4?C^_)x}!dN#ea-{x%n~}U0<QMvii}@ z#RWQlA0mnuS6`s>tLTCY>1IclBSdy!rwav4!-X3ZKHLRB8=FsplOkLwh-k`srPvT& zo2V)WN|7Q_0f`e<b`yEXDFS?xhG!|FB5=B|M|e#y6hvL7HW(oR^ZX5u(ES`EghQ7` zuFY54R_l16QO}9w{x#YNtHZJ>6tP8BE)-6Gz~bq4jKq3)gr<02l!uw^5?OQk&c!@8 zZd{+VcA}WQmQ@?}^-)am%IA~v6t{z#IP);Ck+^6*1>RATwg7t(o(SV(-Eb?w{^(=( z!Ycgexz}d}|AkYO-)HtCIz2_h?#0!B4OIvdc?Siw=$*r$LfuL;g#cn-`B1r#fwXRa zK7K8EN_d#Tc&zUUzZ|3U5yIdEB;k)x=_Fv-qASzeB#TkY8;khm=8DeV?xKG8x{HS6 z?w0|&9HQ<ux)^lvI}7zLFK)h!uA&4S`S;Rcid%WcX1t?HSUZ~`qe?iUDFzSfjt5ha zZ^?vfx7uu<Rl}+m%CoUY1Wt;ogp0v{v*`ntVLel<Xa#ysPIh__hUsdvpq4U39C^qY zGWaHiQWp{tYo`mo9fgJ3oKi6Yd|WQrb)M+L!c%L=;}5!`$jIXtD@if|Ii%eg;z;5j zHfd~*W3b1?EvbhtO&=yMZgy^yXYy;Nq0u!qx`gLz;QNWx4JY1H)K0&g=y}n9#zc4S z4rq2ViG2JEI>04De|6@6MdSj3mxhMaPJD-{O5v3s<yMWhrhk~s@16PmX{p|5lH<Zo z3;rX&!-0!)lvB3I(D%R#NXY17cpTQMH@m~3KDpAQ<{o;Sqr~wAsA!l>92<n}a8x6; zkzVH-z46)seT_zp*iMnb)6R8&MydHz{GZhHyz!{-py#zy5gGJ+t6d)qgbf|w8_H_2 zN5p0bsM><CTKZVT|JXCnMqzzMQlKG-GE$*(D1R{U6zEJE%_t%OAM~qD>r5qnlQdgA z>mpe>KRW@&<e@lL&H_mh-Zwfc;UGg$Ch4~`K9d5k-;Xec{v*1EFw_Zuh)rD%i&*QD zi(Z4(RqMyiS~vfuK)gC4#IT7)REi3np(IT#VgJU$0bJrj6|xjv1=K}dq}7SFQ^~zF z#0vISNFK`(utw->%F2TiR;yWqYF*b81`5if%9(qicF5cwS*>m&ktvr&hj?>;vgius zFL}6=?8+am9!?NWR!!x952=&Nu8nRA@phY)ZcR9*3BCzVZ}2hEZzJB1zex=XyIzY{ ziI9rZfLgk_XaJ~t3Z*Ux1qSi5cD$%5?4ng5xz1~oMm8TpfJnwfj0h>5IsL%GE?{(x zjW&f{Jvdn6qg&E!F6_chpG;vFZU>+oZWS@Fq#fKcg<U7BJ6)uIz}^&g+0U6W7YVF$ z(J)!UGFf}U3~6P_5ZV-WZBf{z8XOysiph_UMwq6s%cJG_5>mum{k%qrmQ;mZf+!;u z2?`T!rm*V`y=hgef}6AXV|#vUyY}tZ$-RB%+LJ%&vGF^m<V*669toD{!x&FVznw9i zw893Le7%~IFH`b=HTRs;QiPscldzVgi6!j$OvzVt-?s*>a-@+Em9Bb+nv$>6Soctc zNK}qc<(7QGm~}(RSMYH{(MUn^>k8#BnVU&b6Ey5r&$_*^r4t`cK>DASPneP~(12uX zoBaXeHM0r7y0o<hD`La{qC?{V5^kh9y;h|$Y>Q6saM<X7)mLwV(;Ix8V4SPf8ofxU zd7A}o#4AQ#L787P8xU4>k^I!~O^SNd3563BY3P}X;$lk-R~_&=$))G;^E9enjM`-3 z{%E8BnB|J9xi-IDe0EI(H>{BpZ|cNZg%3tbVtFx2EUJa@SZQZ&shKS=zn5<p{`#fq zR;nVFV*GZ0r#5D!vsjXm<K8}q3AYrCE>j;lO%F<*b3b?P@J+|keBqbh{_Sc0=X~*u z+pb4f2hE6XXRV{6=_3ScJl6o<1Xnex&3@0KcSc3`k4&_ZX^~c%U=-^(kyxns98(D2 z81d!~Aa#Pcb2aULy)k2)p+5HerR?J7k#^Zz&YT#3DAH#chj=c~<Z<~k!re#1s5&<5 zK0JOw)U2JTiXy2rqnn^v+<aFC*w-{x)bJemG<<OEX?TvHtF^h$=sLEGM!343mU(>- z{<|lwRx+_iYC4{yUGE(qt8CFCIr;VSTAsQK&ny4w%x~A@72Sd_Lv(17*$|6KccOzL zOu}=2{Ey)@AgM!&(Mhnd3?Vj2$3-xl33`i_U>{Vfmemz;8t_dTG+qqKDpY>f*{xgY z4=eh>2C>bi1^4?ke5r_H+yHcmxwh(7qnY0k_rIL+{US&a&~mmZjaSp`2;$U2a(QtS z$m>JS%@+60bTW%BK<{(bQ8N6iRjqdiO_5W7g>R@+Wqy_dFH*|)e1hXWysI<&&Oa>` zq-qUnNwZe%TdmwW)tHgm-l^vGSjU#OrpuL9GP}8oI+nm$M$J`T1rz)IVx2?J6L(%- zy3X8>wO`g-UJ2`6c~Wf!*-7O%b8Zr2>e-2PG1ul~DJlJEb&vb4RXI9e`T^e*&gDaY zkHYmcfaa)QZ`3Qz+`9a@e&d3HsL9ECMUpPdt()^1U82H6EN3+dZX&vlP*jBpi4_WF zr@R$B{)s6%bb5+NpZ+ve18u85v>Kx53BIAGlszKbBdVe+Vu65ee2DnS8cI?#T1za( z1WHmHbJcNipBmdu@*jF80Sp7F5zthB!a&009UqRg`?YR&HBmG0p}`~LLwyh9MvX3b z86RqVD8b3uR)EGJf9KwvEFa3wynN@(VwYaSP|Uc}uskwziN)ECRGg%4frgr7UhlX* z=m{%i;2Y{n8QHf_uGBDl+uL6`Tv*UYGhwjy`iMq1p^1af*p1uJ*U&y9L4z27Z6Z<e z5`k+CSu}P_DoMm-^$h0cb@g$N6yEnrv8YhW0iw`urMLEv^33u416X~F?~jBF(^7zm zs|m!Uo5ks*p{gMQ;KOYACIvPqNbkT<g*6rWx?wT@od0tkwNCoj*THyvIY#Frg!v{s z*=|Z2bI`Hs_$I^&imxmbqz1NsXs3WwH@hT;3FvEg-2F1R9*oywBJF(T)!-UkU((be zI=i_>qf6B7U7!DbfPNWwzy5mOL;b<u&wB&>$Mv9hJ?KXdXsE`T+9P6fPPzY(e=i+E zS1Y`>1N{%Xdd+k_+!O9D5Bz+8+*Mxfcig1O7`g(byc1lh79+EsSNX?(<0IHCRr6p$ z?8N9;nIr?w;gHaNX=>BgRF-|<BIQt0V!<X<psf>izjEAe_g6(gS&3TCE_CP};~Xw; zr&6z&O%e-xEdXU=&8yjsxn1!R#iZOidBdzbgkuUfBP(_OpyhqII%^kC{RJ7GwWvJn z2Z9H=2eAX=Tg|a<=ik78F$kk|q5ZVlR;xEyK_D(#ho7gY;mVv`mf(1}t0cMikYboX zVQ-n-*mLIhtoy=}l$%x#O2hHx7c{&XVKVD7fs+Ml6FCHpVe`1A^g4|M36ksml%~5v zU&rSo%+3-1`TExZ>fMaTgVA+J-W^>3_H{srX@BvwT-t8p%^PBW;@Hw*5U9<5%qNew zcR*5r(<k>J!sO{H<U^c8IE-Bggc4%bEcZt_;(XGZYiN{tat*#Q=9+a0#QL#y;i4p~ zB(%xS9U-7rjc3_6Shs;4KSIoev-eo_DJdWM>@ae))9BH955E_sWeUxMWQ+>=SfO~W zL9O3?<FGjK!Z#^@(k*(??T|*v2FUFsUigCvZVCE@Zwi(JTC!fL_Zq$2UO9;`ZaMKE za0$})D8kI^>5H!*)tD`K%6N|q-=sKynFmlisWW71bv%D-0xJF6*u~Wu7vy}KKG@Sg zW06l@k0eyF#CzWf*F#}wVC*MpnvM5l&1`as_JFuIu0`E{^kL#oruYtQP#8vQ!f=mY zP$PDTen$3>$?U+kAvdQQ_Y}nLLVee*<cxr!C{)OLMUn!)giQ3>d~H^_XSqjQ>_PEl zm8c}O@i3jqY<6(#xMlkVSI>I~NhmgJ)s!o@2>*mBL45=SeFMj4>Uo4xT>*fh#BM=G zqg{jv)taAwKXU~jv^jbUQtSZx=VM$aemVXPSIl4kit|zZ^In(BOhvsT+=IeIDsWl4 z0aCGOxjPX3%fS`CD{zel|Ns2z`s#$_7L8;BBr#mf^V{bH2c|Tg!d-bdO?~Gf;)((2 z2o-)865c9?f6gnOjMHK=?mR@4Vkh}qjTWJ49`LMxO<d7&TB<ji!K|}9j&p+B$&tX} zQ2^&7uSyZ)8Pg2v#jR$oVNX;!C1}QL@~Tg(!F@!zyK^r-zBfB&GDTh$3Xu=F;2WCP zsa7hLmKn26=Q8RcUM8{7OmP+)zA@sBpVN;%y#l5<ubu_^N0Jno%wG>ykmE3Hwi1mS z^17aXxTj3h!2%vBb}^-D9UoUJBL4|LPjdn@yeG;=%{p}Otb~LChne&dy5}#J$(>~a z%-3#N!$Dh7!HR4tB<7aUCp2I952Uu5-W>gIPbW{Fjp%d~oWUgh#?kjzbZg&Do@PFB z=7}5tsVlDFa{J>!ZZ{=vu9AxeLf5H<wBrkZgJ}d|iW%A=9s<HQX)IJR##ZWMp;91x zC`9I!8fVp3TNu^B&vPboU=OE@*}}!g6W3ClmYS7XrCSLYgm<|scyyGztISqHz}P3` zEuP$|eNgJ1{B+~luJ_X~6MObke=&V}v@wPG(=U$y?FW928yR`u{KYqH`+vH%zdzl7 z6LJPWSj@a{cMJEM`wd^W`23?<wtgc22tJ^X%i}1<g9el-o|+Su<)(^x^U|uiXE||k z0laU&_<|wda8G(oti7r(AZ58H9nW{aeV=&F^c%+hK@}cRn7vks!^0R<DysJX99t<= z^nxFLTGh9==l<=)KRf=zx1=+lZFr!65+e}Lx{4c;mK%f(#j)^vWX?O0YiD68M=)5} zm6!X?(nX75%YNJKPqF0})j{Lhbmzy!w-Kg#JT!CWHk#l8*@WrwAM90~IyxXG95X@) z8}%SUKxBkAns{h*b8&HqFP9^F$AbI7^C$k3NB=(Oj{J46=wb51M&E6F9(-(nlm90| zF(nzxg8GJ7!MFbE6{)OE!z%@z@VM0&;1ptr3w23I0TcZ$egUQwvgH>f{NR8_u(7cS zO+s*{@o@&HS*QuUcB4IfySy7{!l2u%3~C}xfS*$eiajC+M>Lu;L)uZHCWMCq>`w-^ zLXLWfk;RAjR+S6FSrXiH0qA^xtT>;kwl<>cxb}ZPIWG3k;Z3z&5BG4;sP@maJKQwe zxzin#L>d_$Zr!Sc*Iip9sLiTdjb>j_!cVqTh%Z~t7Jl>)t2wU<e!bY#hD8=>N)@1s z<#T@UO&aH$VO7HJdzmo|ll_B<>S|pVG_&XT{zEJxg4VIwKR)ZLN{H-#E)r<tDGlh% zZx0fib`b;F8`cMBswyIsED5(!SWc#YMvbKAlERl)9v8PZ&dHTRtW$zD63S>k6;h&= zb(N@$^6JQ-@g)c69lk1vj;t=eFhFk*;H35KP7W;dz6cV+6OKQC2a@fJLJg4c>xtxp zMsWCoXwZWuLlu^@fCLPG7WO2K4x1sDu*kF3=%@@AEHR)Vk_&p9fT33zE=HyFPSAMp z|8DTD)_!7uUnpO$&`L<wxp)<BUVnSc$0ZnwRlnl%EA-|3>gs&-OW4tOj0U5>pN}s` zUvOVv?T%I_$@E26lC|TKtdbGfn1=Y~vK?E8*_or1owf^}0uHTzXmf0FEgLTWU!fEj zBcu^_fKyp08|wNl8lYF-(gJ8eisEVu3#DBZ@!aqY<<Zz9as)(4EW@Lbea!B5tl`m4 zOFdi{?(EP*d?zQdH$2*6X~(7=haLgAiM)EpxTFk^_JIcn`qs2O8uUo)B2Y4q20u^X zz%oau5~u(UnZg5qsR@rZ!y|CUxGKlS$@{O9d;83_Cx23+*)VL;cvCCm8YU;gvGN%% zM#8beCP_?t6q#WYd3k+w&M<6Y;!mN><Qy%-u$|DPA1yqR7l3DuUv>(fAO_@cj6(I5 z_=5>(-IZbE$h57&sv*-do|2G)OsiLGm3l)&rolHf7GaNnh_)Lt?c-a`88R)WWE#1l znqly;lZ%McO!xP=2yJHjz8zfy4A-@*7&QEucKjK1LL2!r_<0JSl{x;D5RGuS6COxS z_%p+jMeS-{!-u$U*y}npP18n2K_iAOGi+JTa_4F4(I6(_tLEXGJffAIB8z=w%b-Yi z61HK>^2e5co#DpPgRY1zgKy|rW{(V877T|qt=+>;sXY(JZM1`GwG}*@;fXBaGkg9y zj=T5q3TFVf&yKBTUAIe|m_oB3m;URwdv~&Yh=zMGYBw}mmIGVjM{6Ihb3*U5kw$}` zr*LM5MvIR!SyNOkfdnME+|@-1bDfhiXog1P%F300tKYke%?j(+_0c~=r5P$sLn;m8 z5}sXwZ}Ny(43)O!)lMkVorG<uwER(NwQ9Xu7q%jWZ|GTOj|`P&s5CNoD5TB2e;F!` z4n@a95ok9wQK~m&n@HvM@vzx#s~ViAqSqEC(mdR+$hTcXqUC4o{eF^Y&@XKy(ctGP z+?XMM(F}>U(VxMjdg7fwWO}0EOA6FCy3%LIP)8?+!`+cY(=K<k37}MZR=?lUsHb%@ zKrw9KTeW!r4R;5KX|11W^cJH2fNWP^8NL&}6~~il3hN-i;t3-7CXdi-r|p8LfV&Qm zSCa#O@Vl;|LXmC|wrTqHW_qz9_~^>36xUFHncoks7I(`SzM*HC0}19D>c@-MTtm(2 zHPj@^OoM*PagRYFhv{tLnM<h)Lj)>|CsGYZfG%kx5ePp|;lT_MXox^V1g^4t8;j%j z`ci7KoOxa&*f>LBO6Wp<U7^h6knE;++gtB82u64w1-{86OfjU{mL+shq#J~7NHg7k zNHaLkgcmP-L(ejMM2xkFG|O<Bx9l{KmIQbTP814}g_*~##-L@1ZXm<Yb0%|z6WrCn z57|GMBt1SM+%+5p!_0S?{#~t9Dx3}kDZZ-JXo#<-!_TQ=utzyC2D0~AxiOIag9F7N zQ(ti_`7K7kN2a|8N)UO-rBUFUoGHP7?j8ZgXPgp*8Kq!<%n11I$6mJH^AYgS6a&N- z%&KPUO3x=dvPnkTjIPRdbQMWJtsBlwh`5M+1EW)`)vC2xZfn}&skX#P@rg^USL(e+ zFSkpC-hp^r48O|E=dR0=ayUs*8R<@(Mr>W;a#B2aUE@W@^i#aZ=|SoKp12o(t8{pj zX1x#@Xs5x;iT_ZZIo~ywtW@>gA92E!YUf>2Om&693J;Uuo5F=L(AIHbj2e<-_qYrG zVB%R*5L-f&WcUk;FqF$&4Szw1t?fCCX0viuYp%%504`frrC&W;J>)nHs5kWRvyYQv zqzqYY+54)gB0Nr<IhrnRVVNF(Sqzm?=(|WHaXhHuoYP9sf%K0ptKSp01%RJZ>9a>h z`rEe!kgcxR^ow!%Cp4d|h2t%&((Miv#g3URbAk=v`TQ=nQZ<fS!LmBHwr@{;XE8@) zEw25zz%5GA!R=yhqxs?)`3v;jM&6Taqs1NaA23<Ha9#XAK|ym;@)Tcx)wl0c0K7A+ zN%(@$8gMoqzM-d_J=$=}UFZJ6KP`Qxxv>Y_Pt}><pO)&4X3$|(QTQ&QKt;KsrzlUt z4<+dCcH&Q}WvU$ZZP{Hsm*?Mu?t^G_b8!KJQK8X?^5vmDd}AbkGV!KPybyNl%RH(i z?-{wLZs-idB<)VTWllVQE}M~Xko1=Pb|)U<b>7m$H(MZi<Kv%Cl=pS*;QM@&`Rjq> z;W_AusUQ%osR6mtam(*VXc}8k{(t*R^$5LI0kp!U*CBS+Ob~~EL>H2O0UW}JhTD8X zV>G(;W}~VoewBCz#Nj#m9~|z{!|u#+4>`xTV<#lkG;XosBfXS=PrL&(q`{^ks+Zv! z$+G*cMsuivj5{xhc0zmUbz+u-myj-}u(RHn=%Q%iqqL<lVT%pLXpBkDLjGjX!P!JT zrMKRg=yD1L#zX@&^>5&5g)AYA5c$}V*?FdQX<|oKCuw5GEMmuCB+YyRL>vLkT-GkX ztbAfVi?N<h^O@s+`3JMfayfeq|Ck;GU^2z(H8q>@_&Hn%aS6Ie7Q^IqAvL#@aCLfN zlg{BExCRn8LBy4xl*U>8+w+4neTYC%p#_F^c7p}xz_;jbp|QX&8U-nO_3T|>fpIXu zi=om?-Q!j%|1fC13DQge(B4GdU;c#=a$nJ3uB-VEjlUXybI-YXWA2$@&rMqXtsui& zxc<S@-1+Y(`(SzyBJ(4(@(>Xm5P|9KT76J!<e%5>Kz3e;W>}3`c$~R<BlyO|lR2ZH za4wRKz7|y;9iqS8`#+<~;ZBqSBpav-a5aen3m5k1Gn7IWltN7KVHrXYYsX$=19*gB zt{^L$V9E}EX`B;WE0LJGOmnG(xhsK*hi|qp@kX4A#JS0;pPr&Qt}RVM<202yIPM>- zsv4K6x&b8!F$zXn`HzXxIMqfVh49b?QEMcv$AK;QIX#K&5!sG4o;I_SDDgTraXM`D zkZ^w#YJkL5kfQG(V8FHgj8ZyC8ZPzE`9J6D4(+giS#PwCS7rY|T@-GIgu>0lbiiOd zz8s_T5fU_^JxQ!7$!g_t6+xWz?_Q&eLHFt!U5*AHzF;|`?u@!eXfzoeq0i(_4-qi_ zqd&MF^sWbeBJDx9_bVD-{sUbOQGh@R-QK%CzZ|VQ0KHz_8V(C}08p<x8eLwavjMuf z!kcq{i8trV*X!R<zkA(9!*Tb^AZbVRJO#0Cvc&3@B3z0v;($PO43;0d2;(gym96S) zG2|M_j^}ULr4^zgKGg;l#zZdmDv$P2bZd(429QzY#R=b}fWP6~dP6j2K{RcOO4D<V z$tN1Vp(<dw#++SpWKm8)FMc-sB4b0goJhidg}=EE?b7gzTNT8l%aCTqYDkERv=S$_ z<b*$D)EmNdVyYBT^~~ya`;q9(s#Y3SclD6N=e4R;ePc7IEoXm2vDqwz$5}EIUlCVH z5h!7j*GXNQrHZMUUHLjrofTE;$`!bH7kG+pog%b*)!sm9!Gqk@c5p{p+OP%R(|v@0 z{gxu79J<M|bA(DKsCU^<q>hSyaL-4*%hA>O)%9T1`)!@l>Lyz85smT2+8Ex>+6$M3 z@Gb8rJcY||G@JFRu)`bte18B{$o&R{Faw<WoB&FAuCq}LDC@JLjkr-$Nx>=vVUEIt zxna^?p}I<l$4Op31sM%%8(GT9YFn*;-ar)6cH6b%?kd=&7T8c3&t#`QCgCufc>Wmo z*0o*x_A8zbbmrQVKPexV&}}oYT+b7Cj@uuy@Gq>^7>+N$tg_VG)hp17E3NyS2s8TY zoEE3|ieg_$R)8-{=v`jie4(`{ROoA4xd=@IYrmU++ZVs`6{0AjtJ(-}{VgzmZYkmF z0_35Mm>}Ya&=T563HJ?K%<xrj&&C&OONa~@DXl7hP<PbFT*Y`ixcYiI>YtB(A%#I# zXgv6G`FC6pb8s~np#Ku3k?8+2{>D2jr7%oTA(%_g|G9+<A%vh2!^AP}@Qr~dA72k4 zL>kVWJ@ahZK=5fcJ7C}7Lj%x%$q^nH;Q4kXe2>o*t)z;4c9^EJ3MvL)a{=F^Q5iNf zz|>r1QFHMhqA4kEZ$)a#S^T|C9K+R-2@1`_N*j}sRdeM-O#1?RAU9g!#GP;WKDtE0 z*yO#iUU*Wp!Her*y*5JK4D0n46GU+lSg(zg*24NS!Y7kd_%j^87LyBqrCB6Q9$6rV z$>AFcus8)UuC~-$Jh{#rQdi#r$YAot-1l&NoSy+2T2;@bNGrfuEiA1NdC1ua_=egD z_J|M`A{&w6;5JI9?^K!d5z{>+{$P?y!WEO~FSJ)2iP#BQWgVuu01PF|2j1{a8kw6m zajWYs>YW4@cp-;8M48in{4=6f^e01RSDVmH*XbG-ZUtHt8R$7(V~e)&nx(&pBaI$! zW05jyg(~J81(QDVFOip`7%146OOHM{hsHkTCz2+?N<j`of$URZ0F;*YDdRxhw7<-f z%?)y-c!v7lX8zBg(VDpv*6&fMsc9q`PXg+I&<Yhst_DWDb9@AUWdC;J1&z7M-rS@b zA7Shbwyz&^FTn4-6pOav?M>8+<=^=4{rCuD?mI+lX{DJ~xn7#-E4%jN;)i`(#ywNE z8Xp16fP}@|wQl{mR}tMcgKttK2n`U(5(vO<XjVi=wwb)Jm2qHNL2SODF2HKl>QtAU z`v?ED^x2|U^Ct6udwkpNv{Y|2OEjCG--=JYjRQY<!TMcfJ5o(vfG3|14&a+DY=WuV zR#Uf~=8o}J=bL?;biS=d%N*%dxnNM5ME_gTWzkJmolRbNe+5vGpoK-D{0WE3lIDan zlb_iM->I_dmowsl1W*uCaa@J0B3~tO6(r>nu#h{B006pwk^87loSxyEiGluGv}IK^ zbk$qx;vF#k{)<@Dq23}%@?hn+78YjmK-$Rz(Ce~#ZR4b)e2w1bdi%)(5w+N*Vm~Bj zGJ|On%!yXPc#2yYFnZ=uH+(};H+!@p5Hq*nv$zGnDJn}pd0?v(y+H*G*OuXZ3`(Z4 z8V~x<zthQo15w^J6~9(()au7?W7ascF0cbkV>Z|UW7ZA7_CeWht-Lh0<g3X8)?t1o z4-|t$Q^*;q;>(g4p`tf152_X4Jt?#pZOwVIaGfHU$pb5-wRJs}<b!J_517dVK^+e+ z=NZavBq3Q<6R*J(#<%2n@<1^F6(l^(<bmzWc_p8J=~bRJ2`;eChrv)XeeiIKO2MtD zE5llRU|0H7lLsQ=WO}<z$4(>TkCd@E`LD2JCns)2H8B!WMx+)-YP(M1G0~>yOZ=u@ zh$sjK)kdQ0FVk>K30D_bGi}5Ky>Fylr#4br*RIn_--SP#QhDpb58iC(!Y@3xMe6t& zSs<5xM1pV9lyI7=UcL#a{HorZbo_*h!Pg(aHz`ym?8k2E53;B~NZW-UijkF(F{2l{ zM$S+Orirn?!DO4~o^zUcYhZ)vXQw55{uwrGrI=oF7k=SM(FQLXSl_Fa6q0L_0?|Ey z^;>n}7alr;$;CHm4JJ33yw~W3H}ef9&(XMl0D?$T)O*9(W_-K_-%#1IM+wNgYNnp8 zN>J1{U*BG~0pZvjH2dvZcw{#S+_EbD>KTPGf=&vdz_Tdq?Rk{)aAaL%R$dV*`v>Fm zEDpUsAw1j};pTox>0ZJ;x2#IHJ5+>6Gh6BeFZ6tV7h9<sn5|%0om<<tr@ph8BeE8M z+B0V|LkG8uxsB$FXXG!?cN=+6u8kIV$bYc$)L7TW{}VK`=lA{td5UjP+xHN+6K$qe zIb=|X%yHKotN&KQ9~}S4L!M~?pHq9k7so%`GO$1TXw)Z!J1${unlJnbRV=JbKAJy0 zez)BeN^)FlV7af{L9hwEvub-tn`pRyo^#9l2y0NOAGgEL_f<*QE@-19NseQk$B5`a zpcuL>yhE-*Ro5+3sQ<bxQ!HP06Kvh;jga+$M4jL9bgkQ`<;)=f;P$}CwNi+~+Yt^u z3Q-9Ga>Y2MFZ*hTk7Dsk@r3)jufje21GgRi1AR)Av7W$5j3{mwI7syqmr87ZRUu5W zc=bVtTN;$(5X-~=F!9mD<Ohz|Cy(~pT`7nKr=-Oz`Z1Y3*<KR<&{N?%N0@k-PM$oQ z2>2B}JF{6J+*{}F&UWp&kFeCEi`F~@WIO@-OuK`SvrQ-`s?N)W=TJTYb5-Qw<HUEJ zsqLWyZ-IRG$wqez7kRIbk2ZOKv3j3^bEtJ|t==kY#M2A#4W$=q6|2>5=YfI_YVH^- zC?Wl>oPw79gGow>2GlIFoPKxax3tY?^$7JZufL7X&?%~(thyIe57THvAm9)aaf~Dr zJ$qxcAztm3?M>%+$rEl>@vf22P_khWAmA2xvmjs{H<$%B2U_#YRCp$T^mM6W6qSsW z34C0q7@GT9+K~x#XM%hVeNVZ7;3^4=ETV`*Z=L9T!YGOc5gX9-3&5J`z*#QPOmJ2q zkl}3^e3QnhWoXM}BL;0DjunGAcvg}K;#daaOmIPTwG~XwnBh4Z*h1k5QBWkUp*GAW zo<GL*6*vIA{W`g~&s=+d@+Undsj90Y+4jITL>_X07rvpkfjuI=uecRB(5G=rmVb#? zK~YCqoTE8@Ayr1}!H8~x>+DoHfs4X>^?q0i!Mk|)h92YMSJDVekl;?3Jrb2^nLVOb zJ_H9wk2V7+;T{PyFa1`tH(1qc@dproz9&YCYg-UtF}6RNyXH@S=!@+?EN;=0hlkjq z7d+wH@sTt4Z5JbP=(UBq1A!;w<045bEph5}F~eC37LYVCz0|D)fr?!I9s*dlaTzF; z%H<KZ{}WE@ypoFKDUN%58~wnQ$ap_-5wbm*KH%Eq+0!FV4=u2+kuPxa%v;*_Er5wa zg=-&I&(7XPdIpDovC=(mG~XU_3fFAa`c^Qt5f`LVW5xc4Vh2WQR7f_<Lp0^3ys^}B zFs!xP!DSNpah-}am1jVaIp;yBYM}}<ud0pQ#Ib9N%F#xn(i=1tRZprA=IG|)Vqe9% z^}3lQR-?ulQZO&rMJ?Rh@Gi|OdRi{=0AzCaX0~|7|1@)d9vxiDb8Fu@a~ppb)H<Zt zFKxDFa|yiAkQGA%&~&zVf^Z~i#hcBu<BB3XmYJrLTAX!CtJL*ox5}A)=OfRzm-yVy zZLnY=%4Exi=sX!^!p|wn<TkFj^t&2croxFclvz$x_8^cbGz!y4TI(QJp#%ji5$9k) zSgS^EnHk@IPncGc0;aUthxN#*NV45$n52z5CWPv=yX7{ZNC@{~Hh|9)z|V6=y~)NH z1Vw&zsY*c5s2if_yq2R*NsXe*mcXjUJofuF7s&16d0wV;LsT%~!U(BYwJNRdv7&HP zg{+b}(n2A;U=-at$rX+eWeW<mvrytp5@eA;-6x)Z;tUzk=)%=F1qDHg0plmM7Y}g~ z&9kc2Zz*yT3S^gnT*>`G%IHOvGBi2L9ioD@cDA4=A+%;y7s>QwrHzMjudYqz42jF$ zN)Cyuu~90(&})zcFZ+w-UO_#R4maq}n>x9>pPJx!*7=)tHd&1!l5IJ01T9|oCzk!D zL1+?xAmn{7+Y4=$y&fYb8mWCrbsN}-D?OeiwCGlFVz+^fj3Ww9DhSNOhg|I>{G7r@ zj%E7bthQ_v#=*vLE5QD!v1PJXK}b+T;PSH-urNQm*F`dctB+Ed!U>k$87}6MoPmn7 zZwe<|g4T)w%nT2UD`MoGHwEBJ94>7xiYO3&pbn}CqJgm*$EHAnJHuxPlKJ`v_-23L zvl`i}@Rl*w)u0@Ma$E=B?ikt6q(8%&VNBndF_Lf{G?90M_iqbZ9vWP&SxYXeu_-G2 z$=b_|MXD0mE0iP5HtVC5Tcnm7jcT(d?EBC=Zdf&Vm70A_Hlnz6pc*l&z%#h1>SX?Z z8pYxvok;>?PGEZ6qz;+{<K~tx)j!Z*o%vtU^Z*ZXJ3^oFe;*zm{u``Tc$X`p(SZ%_ zwQ9$Mw-IL?>kU7ru$|jAk(y`SW>Es<;Mi`3>Mh}iCSoJseq1if&l7h}8kYoBmP_1o z&#oMlhU3dGXm~T~U7uf$Q0WNWJ<aKV?7Z?E_uD^0rIQWFifM<YTXX&EAhteDmqO7L z>W+W8`7#(?qu%A{x_dslqNg8Sj_FLtzjrTg23P2OgmhT=FK48U3_gF%{wAc{U#fVq z7dKx<@fk3=7iH)A*X}j?$N9wt8eLwavjLIY)p>s~9`r*oeZ9bM#@*2`gA%ZR;ISY_ zm!sH8(Xbx67FM>`uHos&D_F%7NbqyxiQeM!tuuOZJW)sJZk#)N=Gh01SDru3W(VvW zJlqGks3XL@6MK)n&_Cz@oMYz%KEsd(oQE`sW<7Wr9@pB#0j>EJffqJ<JBxnzvLSCa zAVx0HlV-9ylURt`K^a2$kdrxo{G6JJy^wjh6<~i9I!DQh@KSbh%WIoKSNhMf$&C7} zh61%9Oat~S=Fhde4|#+qq?g@CJfG%zd^1Q|oR+~g4vZY!@6l#!gPw<z9Je@l=&XM2 ztWnkeKFKGz55aVGJg{nlCwY+xR)lMyt)IxB_RG{>;vSiIxaZUC6~A|X5(k=b`=;h3 zt01t;IH<y_!V~JIxGm!mddB}~|G?Ob--(~_4IHu=OV{@BfU_gCc=DG|KHaIG$qQ=F z@LzRnKjMjKc>MgROZN+$A0fEuALAKcHBonL_=Y+<_K57R0XH9C>4phNAYjgh1YWw^ zZ&vF%-BR{&atiCX_m6;oX!2s~Q**FoLuFDIx`rCoR5&qVK<}g-)L@V>dW5u5v4nCc z0d1d#w}<AQu_acu(y+R6yo27nJ=Ar!FA7yf4uv9Ck$?ih)9E8bK4C~sBmW`K2IDay ze}&wBQK;|U<(IEF*O)Plngb|!W8^lL>ZsJ*x0D1yy+JA>Nnpx<!vTsKRIc_2lli^w z&DDUd6wypukfcemYN)xon5<5ieoC>z+}q#IRf<*UDJQXONi?52okpyJ0}?^AjOXR( z;<qF*22fs`vz6rGOOT98!xRK7AGT^|-Jt=9C$65S7#HL(mIo_9xV;*1nGqO4>`!Jy zp%;>z1o;mzW5QE^jsw17OPC)Q6eO~b$p#ocFc*B_8rF$;U`}9~6(qjCyC5;5(ShGe zE=Yu*Q!B>pnn=y{CN>mWFO{(oDC3Cm7^WaG2E#R#^4=CCzM6tWV5oDiziA2*p=;S# zkO)6Fp2!p=I=5pE#f1?k7lLiCGNvGrkQbTVJWW%O*sfWBjh?mQR02EL$3#nAn2Cd* z?@!nrsz2Btg?>VEEdDAeNDRyRaIj<Q;HasCMfqV?+SI|BIylL7aL{w|_d?*CG%(Eg z)NFmKse{XLkF+(6WZ=2AD^fIdaQW)^n2?EnXB`|g_aWlIPsMd`@bfg@L2tSkqHbLh z-(nS6r9C5m{Bcs2e6Q=^G>WW1mNQlquU!dW5GY0$rBEI!^ERRizW3C*1=v9s`;%DI zmU}5CSFq_N0kH?rFHdG_({QZ`IW@}=i3k|+KsA$V(+p_CU^f4zXY1NDC|5(`oVW^w zESV2aQJdCk;~UV;NMeM+xzHML$uRgi4b9jiYCnR1-mA|17XMF4!@<*1wHU-*xD|mF z)DG_Iel4$4Ud|SN6t3$nlmzq?^no+YG-M1bQgH{_BoR##kzACUU?)fZG|e>dPAF`q z0TBn|j*}}l;OF}aP}u(HgH&1NM%2UWvw#!;MK__O04S!o2D2t^h(o#inBgNv=$Yag zQ(Pl|xwr=QOk{o$dOx15fuB>qxQ8tkIj+LhVonS$!$E&RVPjTeZmm=u<C9st?XMhW zom`hlf@#@bb@L1aCS85dQDS)yahX=rs<vw?xpRpcMcR<jV;F_1p~vS^C)&tIjP!6X z)OCy0PHZpMy5(qhrrtYDB;pzZgevjwu4OfUS|p#4SwC(Gr4`xu2?;;c3=_ec^<y$S zE!p$WH&>|!QHW-0@YY(rA(JC`vENbXWaRv8v2)pJB8mpmiw#NX#NAKcL>K$b38FJ& zT?oi4(pVQECP*IZ0zXetplvWgiLdVu@{$sJ9p+`M3selAe}Zq)@K1(z$o9rpiee#u zNFplW9E&0I5S|2~m1dmd3{M~&+w)u7wQs*p?(H+zp8QEomETDyBMR3`yrO2S_0v=q z>9(c>*v3~Dg^4>nlk^BtK8sAgvCI|upc{y}B5$f&-iGEVtZrf4Luf&{N?Spmh9fHS z&@)dWtDX)2Ch-T8G{ELO4JR-?(v5U~R<%r>Q*>TY-|geZNn<v)ZQE93+vaZUq)8gv zw%yohY}+<Y-uFA_jPLTf*ke2wYwi7CbN<$x!MZ)=_j+DjdH>RnOrN--;aYT2OIl&b z=0oC*t_*&PkTYKrdvV#1>q!@7fc0diEO*fHk`+E%rE1OF{gaeC`iZ3-Cu`L^6-~ih zNu*^hS%Sq|`Xz!YrdlyU(+8{TF^ek*S@r70;!4RqJ%1oC8-|sUl^(mJ&|?LaGXrz` zlvu(K)0y6rRM1RUKTH?K)bM<N!R!*bO5u8i%#p=tObqZkGfnA?kJ*hj-k2DC=lOP& zBrQFwjhnZ%e&xtyQia6NZmTDkzIZmROL6@}5?L*!iyD^#R3;|&xY6`(vZ?BOAHneN zMkIJ}8v1+~fhiJg;@qv&F_RE&kOx34*ZRwtM@_&hsyq#E&X7HyotbImTYWc7<__PT zKp)k-xdx=#z89AAO?Fh4n|MOEOH!&*B$6AiRyBNER}!EUd+iPl$3(iXD=ZSLjNBNb zp;ntHSsr`;&O&D;MrTEoXHuHJhtYWD3@*67ZA8!VmgsEKOpuMZZv|Zv&<K>U?Gz5= z>zI^I>q<d2gy{dVG$4aBM;eqoc2?HQPeGfJSW(Ikh8{p*@w(AnU^ATrgyt7ax1w6u z2N?5%O~j+Q^uFXeM7F>2wGoEmQkN2aQ5QLJ@kin1_kwcv_824^=wKF7H%BqwEat?L zjaOnmom{T9nIPt*a8k9nApkhimIz50_{#_fa-o%e#{4t><1*uBv*UuwP<OF8gJL6i zm9*q`Ki&!H`jxWy?0v7NI^~>+k$R@BL)K5Fa?MJ&^oI@fwMP2AEBf_8#^3zlI!F!+ zfyHNZ<}ul2n4AerbMYHmjeG^ZKTA&>l0g0B8w>bqUf!kil1w~GD}h5L?p`H%>6&*X zaKNNGz$O1l)S6<{{bKK*I2`7qz0<+tus-2epzO+*An=dn$9S`cxckM<chA^_<*1I2 zi#3up#ru&5kg~tzV(E>M;n;V;(aZ>aP4MQ5`{den<^Ue88g$MUl|d1kCq3~SuX$+5 z4~+0@&Y`{1f8W1sR3HP%%NBk(Gkp!kLw=p}0iqM>#YZgJiuB%p5r?N+B@&MYSd^tK zkkGl0Ein@^$Xz8mnfA^vI3?m1Tii|W+5R3NBfCrB(xXsESDsV_0%qkE{KO~dg_&x; zF)-Q!$Yx`XIiWATW6CNIID8f`5ZZm$t`IR<6UZu5wv7{_2Bs)By1jmgJG*pAKiRMo zfx7gLqtmSe5m|z9f&$P;+V{KLR~`dj>CXgyS@lQy?92TlI`(@E57`W+;~0s2hx+WN z+$_%*_-owm?%$$3`9uW<>I$~Sr`d)5(~eMAI{!qP&I~xY*5cP=TW3)UI84t=Dn2;E zx9FS4WHB~|0~qc{`?q@o{w7t70m0(dBz<2SBsE$EYav9UT@o$#a8<@^ozvNTJZ<k) z5yjZfX*7Ip)IFiJ+rhsFBg-!3w?XkL>AMc|J=gc1qog}j?=}Ud$FCq8R0e2;{BSy$ zG}CnmiFze+jdrWTTJ0(fVN|ozmA)5;X=E|$E4j(vK$ML~ipA-d>|%_=o&9TeH@=zl z=w~t53aygOyXdbhZQoxqt_fzn%2JiER7)uak)JrR#x16px<@RB|9Uhe9C;<E-4{yz zx~=A^?GtspPWoPMqVnLpxwU!M^QM6IM?k!K*!kjcGLt29{GIPRuk0iAE_V66g?l@V z`wxp};Iq!1uFDqJ@<ZP+v$J=@wE^Y6PDc}Nq|OemK`L(O9BkP@Xv{@eHBTo#<{aaF z^D;e|Rb*1pMOZoGAD%;txU%>2f%kh?bKAVy-M7$_T~}+@MDO5zFW*JjYRg{YDYUHC zz->t)()pZUb*KuIllo6RC>aJna`XM%nX^Y50U-immUBfT#p3k47!}ii<Vp6{kO(MB zAYn+Ar9cBueg`?-psw+|a;uc`%RWvREsron0tp3kx`fe7_?2dsNL5IC<M%E#?O~aq zN&VUb?#O#gfe0o%z{P=W1SV&tjt<kQTTJqz_j_4L@s<6?(2+h2{*5cBGtp=&8kW>H z0DP4N!LQ<e{!J|7>D;zB<wE?1rA893*78}r@WSu!NZ%c-y`ar;3Nfvawfj2)MC|X% zG+nb0+8w0f4serid~c*^5?^pBsFs`NUNS-2>Cp95as@8lFJq7eY37bm(=ip;#xRQ1 z|AEr=FmLH}$D3dXc(4zt=(NCtb+vW?0UD4DOfd^cwWu4_RXrE{+8+~JJklWhaU17| zD=Zo$SqCxOSXKR^o}I()7nc_XagZgqPVc`M9z1fjY{bQ3Vu@jUX&@QrXqjxJkQ;FR zh6xDZfsk~?+HK%pT*AbIbQR;o>Od01ZINz7XMem}PyU7%z~UQ*RyYK~<VJ4=5~(#+ zA*fNu^3o4{Na!)fE!n6wK<^Sz-x~=vaqHlS^b$C!1DjtQXfVfc2FUST!5rjX1#LaZ zI4I>?)RQ&kj11yDL~!+DvcK!xk$=@PYg6u`<nC}FM3Rh#Na|o}vf0qTGDMx^D6oRI z-PnVL#a{o6YydUNNu(?%TB4T&3ixSBDx^Q(@6D7SEDHJGD1RxAPh(@r$;)K&>j)>G z%>v$?uHul*9qJ86*6Pggs8Z}CKz3!W21ycn|CX_iX<LYiD|~RFwxoLfg-)G30{KAT z9?Kl{^-gOHcwq_Q_kPW^3-tEOXJfe?4vaX{M>XFpLGqiOBW0b5uCM_h78;`*EYA0Q z2k*qV0CtjpFXy@58|`GRNTsRB5_aPG2V}EgY=A1n_}?E>CrZD&0;#&HG-HL$p*rDe zkQly_0Ae$DbM~9%@hzOg6-=H5%?Mj|YWVrlKpkq^Gf%@r(XeTep7-q}cc2Z3?&;gu z*eQ`25dTJ~_ZHSMrn-Ft?6|be;T;pk36D~5{Tnb!Dbh85tp|hOnS8-bBT4J)(c$EY z-`&s*DviHUH1YKtK$Wd}IjYjipvSBJ$bjZ^)m_Q?s+bWuPhedx3)}xydX(mpF91L< zl4emm$A%@Nd09=41*|8}9y?60R*e|QUbL^b+W3gRaZUdF7yCO2kdYrgLvW^Fkdf4y z8A!a{4pW9P92)Hw-PFbNj0`3q2XA_fe^0UPvUy@3=R*!FucKz643lSL*B`dL2=!}? zwO9}B4mk}))~LXSr_aDF+ujeVFirTX{3RrlueSL<s@u?|_d>$}gK^kO-X&n6Kly@w z-wbQ7I~ga^I`{nqP<si}!7fyBF%3aRdKL~f%Uw=GV@`x2Vc|S?ih!bp?T}|{8kO$p z^RzT?`@Jg!V|3dZK3bwzHj_r(VD>}!r}?>_YqbHhtg5dov(lTV|IX>gFI^an#PU|D zO$ppc5RFY@0;D42gu@-`(Lw4weyM+?urDO&>B~8Mt$64d0Pgi60xB*jy%i0+sfxc1 z71~Ybl~gMLDbd6AkdO0T5}*hlH@prDKV+y6z7U4gKB=je)?OMgBa9g(>ROo2JTEUa z6DITtCkbZq??bCO*5+HmIDZdpeq{cKfn@LL4aMY`pXemj5y|Fqt@Oe4Z^X#uG=z3X zr(!6aM^y6|z>=2!iM#SZE|^w04L+;e^F#+6kZ~y8irTBClgpxI=9k88BPE&Qy{xd? z5j!)1*C8nSxy~DqpyerkT(^EMXO6zVFzWWgS^LYY;e*-x{i3_Nh`<RX|K<kUsZl&- zr?#a-0f$ijTh;1C0a*VAGWT*7JAqSY$Ig`FFUha_pe}k~MD3mIlRxL6h{XPYMIx=7 zQ&S6%KO~q4_$I-g>m`~HReHufmAAW|_CyMg)G7PIsPufdcYOpWJ+w1maNZFa=?N7e z^@C`>fiR|=PvzbHyB9EveSOGY>a_8;b-j(J``ZsZS^90b`+4AXPl06f6}`ROL}zO! zCk0p!0<6k56s`|7MUNz4>wlWJHQ7*1h#kmkYmT6GD+CV~?V-xEUXuTUZ@9}eEnJHY zp5Y{Zbcc;3jjk8bw88minEC=$Zi939t_{&9I9pn&fJhmgP&~P^#Ex$FlU$&~#RjLi zL#{l)9bL(fPS+0ljX*wP-e8?Kg*7Iu#%Y#Q9H?0>ay(#<7ID&)q3j2X52hU$h$HA4 z&!bHrq{<o`VL_y2+@ImxnX--g$`K0JK7^!ImFKFHtP_`=K9A}q3t((>GOuT+kC$}X zawWGOy--<Ks4KFeb_iJ&3JsOHs76g*J43_2K7>^6$t0qhoKxqgViIX0__v&Z5Qq4h z4K%jrkJ--BAIkRI<B&s}T4yUGAJM2Lpi!m6))3tkNV-vBi6E84XHa0RAoCAO;07{U zkbR~8Pw?uk1z6Mjq0z={@((<v?<RnenIA{C%<6fQs-b_aX_dsf%4lV^qgPcDrmuy) zMrV^U#_E0T#pJwB?>-x)`l}(I`3QO+FtR(1&Vm@B!%H(#`WJ4yR=C>Lv33`EB=yo# zNvx#eHK}%Ikkr~I1(fiN{lO4dN&2@sJjfz%X!dd7BKnro$%mi)M#PBv?7r7`>7hYM zjE5td1RZuVF7O9|EDBWADNY~K@YD`pMU*ZKmg4o`Npk_a-dazFgOKu&ehqiyD@wA% z9Lz;o@l)eaaI03@-dd0d-Gs{kHg&BQq7RL<huh>8t3P;~IxntPdfj{O79UNyGH;cX z*uCGI#GMgq`~?0-8M1SSn&?*1^-;x{IV)6Vv_=47LCvBC^I7za2(y_W+GSi{HhlC4 z0(Z(bwI~gu-(zAp0pB@3C&yR+`wVyUzNgP2-CJaS`*5t`-GBfN?x0QUx8}*{ibgTP zbE}n9_nBAX`O<IKhb<T)0=-hv`d3d3vT8zZ#>boFm=dl<KPsG6T!Z;`m=5KwTe15# zeVk4d^ShtF;WS*ZeAi&7NG$wXHYC}~=cLx=`|r}^U`l877nBKLqDoY5K+$D?HfD+W zPkiCH!LC>`rs!~HZZ!WBWUR*LP?1@p2x6(WQ)`#u0yK~1g|Q66Q>I5r@pq~Gx=8er zOHgz4KQ0T%tZIUP@Fe<nMi<OeV(Aq-N(2m5duWgs%5EUY9o3!u600@RdM1VfE!Llp ze2{LHF>zB~`Sg5pQH;<~fV7@<8>i&4V=di*iKG`+)E`k*y&i0E<cP$WkG(KP4ZhzL zMYH6}2yl`Rb~vUL#mo@cOTp6ihLO)J-5k`pWEC$de^!%X#42o?QQ`@N+;i91!UCU1 z9<f4iNZXzT#~6+w2kG?ki>X>vxWAp0a{1jl<|1dUgpliD#FTB=0J~u-Z8$C=1H#ND zlo!|+Nr~LMU;KMpjfy<Xpl#QZc9+?4Fh@=6_5UQBUGq%#JGRo9w}Y@NeB4?ruyMGm z-$J4OQ0}#b*E>TR!=5OWGu4{D@|h}C8^|)9wyZyBm4(YSWB%om+86T*0C&lkA{t^Z z(%h8rSExV;C%2IW1t62bRyALz_nB9J2$EUFz5K?V#O$U*;co%Akvv(NQEb9i3qiU= zZ*YWKyQckP{}*QK474)9-9@602)@8R1Dpb{Z%n9|#dH&S`xkbMVKdCCJ~b<J+E9{< znmv1eg?QJPSwFdNNfd?Su^CO+_u~QUC#NF0Ef2@-4)5EKGGMyRL<!uoJ2B;EyFOrN zDpK<nCqc+`EPN*I6eBZcgbz$@I65>+JX7dVIbXFG)wWM|!M)P71{MX~)$8CAt>xXj zgZZi1n?W|9FgtZ=ar`4~pzivcGk%_wbpP9441Tx9`}1<DJQP!<+zVD9{)EU%>uPMV zVvVl;&}8teBcR9ahgO+e&2{(lA1r_GlB@v+7*3dWFEQMAD=m}3O+iM4R8xDMqx=pr zFPFyIt@L{lNdq$5;l|%IdJsJW|HzU#Z2uC52kRj0hVk0f{w_DP!NG-ZU14NYC*D&= zx@wY|3?g?%V#6+4J%MWBlOr6P9REHV*?Mth(@?4yb_<le7<|>fhb34y3$aR*AgnJ@ zyYr?$D-&((98rWLtcNu+!~b*YFS8gNX4FBNnwldBXh00@91(prZHr2na$-*qnmV_> zwCOj+9B|gQ$|2*Xglk}J#ppKy(q)xAw?zbhdaYdG*NoPsd?WU%^9bb58j@vscVW_Y zWsKowcmqtY(oYXjff#(Ycj)A1Qkn@_8>AV5G#gt?7N-1~k)(#4KT>&r#x*=I)@7Y* zJrj9nDjR<j<ku~L?dmyI$Yh%ktGrg0|4D)S7;ETU@=GpeGsB58Y9NRjNI_}~wB+9X zT2g(OUjwlW#2mY9o-RkQt-YoCY7lRUgxCw`6MzQQ44E|DdVaA*n@~tbu&_0Xak`JQ z|9O4=5YMneV{RCGyLh7G=6!nyP3udpqQBR^hIxFyYJO1=gRv4ZV3=XqU|!2G@q|VH z*rL~E9J@_+oXmb_IH*8f;)RSd{hU&MWScLyiG{GPgU9;m{-;n0i-ujKRvcReewPK8 z9*BaHFs}VO#%6>UM8|6(6Na(zqlrvaDOSbP?DX9*-vBOv4ti3>Z&rxWhJT8r`_%0v zpI>|52=Al*>C<j~RNe27;uXl6A^rKmUe_O!A5be496y$NsM&{;%wa<F<-eiy%<uV( z(KAyetUFBD*3116AwVAyg|{%3chB?hZU@{dy%$dzy1?f{tqJJ8cU@1PeDOMh$tUTJ z0qV9WU%%z7sr5f_g#-La8vBvCy;HdA@Qv*$s*fbLObuEC(@b^8hHVd)8qci1W%dMd z_}lI>jqgkR@rd8S!Bl@Ef`mu&(*AUL)xBWmJv`z5I^cC#qFSYt)8NKCj@g#^s{p32 zW(^9rrHx$*(+D`+I?>T5jfBuTxgcVp%HO9e8>Kd+@-w)b-gxaFP}H~tZaD@JLNhJ9 z%RH)KbqBUb_06g`-yi4i0<WoIi%LPFUo6NE^uEVy4oiZ$tkcqj?4xkT-4L%(Z4QC; zmT(>Z!4}CtBPUeA^-b^&S|bP1=m%<96@HSfn~Ep~9qDn#b^lV;2vX7cUeMP2I?wjz z=qqyp3LT&Wv40A7H1^PnF|F|jo*`Z7#DsIX-IoBWd;PS-^;IyxL3Jo?O&w<0B`J=u z-gBJ58A^71o`aS|sY%ZPDvA%%)#_z}9_mTij@~b8a`jwFf*?KkGRgJlGZlczhg~G7 z-;c)-ll?O(lTo{pD`irl`lvLTwzJMQbvsgalu%KDuJHqXipXtpI_4$x_UUm9>#g8w zc_wi7?2bji=lR1n*YyF%4y6`K3kZ}w#bjNpm2X;H2rmw<sI|Ea@B+<G`A3a%KIhRt zE6!7<o-YuLrc3SY2kEZE69}j_r@A2y=?{JofThkH@yBXn%sBn)d~&9}yd&A$ygd8C zQXRJ_h_$p~vu{PmQRp$^UOX)#T4qV}Nq*IPmp#B8l2{Hd-Y6>DG?q>pFaV?`72IW4 zns{#2+jRWFr%A3*Uj50k)L}uFbUO+VIzBXt`BCo;^#`#?FDGWbB?HmFEB+<&q>p ztAx~keGnAyZy{i@Qh975HQ&N4#Ft<ESHSvHgkdAZ^B*iyen6g!v@oUH_aY$LL<-nz zI%v6>2iN@(-z-j3^;=e@gxhCej%G?j-3#Twj@SGv8Gql#WH<iR2&;1{xX<Wj@yUMi z&>G#5*v(Ux1^?PtUkS*=UH1G4S8=&MRR2fAxvP|)cWXo%2D_KqpyZ{)?LG_mlD7v4 zT8kv)nSIPl`*GPQG^><$@WXAg%4UxZ@@MQ;iKC2uz>(Boto`8G?7?%V>CmT-jjMH6 zkcTahQK{#`o61I7knOn2(PDX@iA>=5W%9pAabOG=<2!>7chhavL|V}wT*tYc;7|hw zdgc;Ug7UkIiPv(U<nmNMvR%~BGZ-eJL>*IS(jJjECi7-$B7cZ(%CbMKjYN9H1-iXf z_EaAoAi^gPD_B;(A#S;ZZ!V5=1n^RIEW~0%C_@xuG3cB@q+k~75aP^CC9#eJgqH@a zOTY$=V0`MZTt=sc!~Yw?-j5;y)}}{TVml^%1o6t9K6u#HA$EtM&VZ49haDX6s@=aD zjcpHlLVmwYpLB7&tADY9*rZ9Q-u!+3Lh^7)h)ew}st}U;>j#mkA47~($CP3@?O$fB zysNi<-EVBrIM6|dP-7{BD#x?W0evF~pNPmdPrV<P+j>30qfhuDyO`At_U(KF7q@7{ zITpi;a!STRK_O=|AECGL6y6W<AbA6vbq$*XkxYv7teZH~)beanwRP5XqZ#&Iw%w6w zuMf>LdbGd(d0|(6V?yn7O%D57DV-H(Q25#mBI{eP7v>zbdS(aG-m@<#0Aq60PfL5! zP*NU?$mWm|-Sv8nmBnQo<=paeDE-8DO!0~OojOr4lD@UX2V$S^|6<r(#u8xCxn5Yq z7DDL96uMA}fkPbHhVG89TSL`&*t-Tii!;QdU<hbCxVd@pP;4+?FC{a6D2`Cu5?^gF z3T150^FIo$6VrH;;Z!P-z-N~qdKAC<$c{jjv$76M%0o?3DMGjPpEB=1hJQs#O`X3W zB4-WM`LwoNSB)UMnY$TsJPvoRQ=-~i<a|fIc_kFDQ*ghVT^l*<fPj<p=L1&e{afM# zh=sJevNy_=0L8WDIs7|soJ>$q5-Xt+dHAtP7;J$2uPo`yJQb)T06Cp*Z@KAYt%IoQ z2A9Qkt_|doy&#@NFdKSH4b`lFTcsyjdS=OfyL%YDNb|Q%Eaadb>h1$nIG69vSmZ~G zbo^`+To&OqKuM>wR+g-U$Li>E<1fzGHTm&yWxvgibmWl-!dl>Mik+Soc5@FM#yT3i zo<R`lrKI^hWQGy~LD-Q?tz8Nk4sv#+3G-zmE6;nOetTqoQNYJ)CnkB%Ol+`&T3Vtz z#ruW@>1sMJev4guUsn%|$AuIbT!Zx`A&pQmCxdo0vuc7d=2P0gi;;#)xAJ%&e?rGM zBTk&Vs{sP!#YCW0ugVZVtXcEPkeN`sNO}v)DzhC4Kv)Ej3}4Xiwh6o7RNx;Kiq`#C z%ZH<2#%V*jJZm$W;8l<li$Yro<ZjI)$3^S;aqb(yleN>A?l1z(mqgduKSm}bny8Co z+qRXbszNm7CUP#?BckyV;t-Zj^65u0)aBF)6brus;hMCbC=tsUGf4N`p0jr?oISz? zgmvtM8$1Cy;|~-AW=z+*;%QZ6+Ozo3ytH~Y@S=OB#sU~fcU#KP<2zM$t_U=q;!6IX zzB*r{Gr=}bl0isXEl7{3FRk*neBomF_IH+3pJ45`qHr#Erd^&;^w{$m<#uUJ(d<HD z3RN;KO5^tc+A*)IJmd@dg4>W6l%g9c3np^3YC9kR60Oidjv5+OGyZ}OawS_U9;LA~ z{6xvf!C>=X7)ieih#ZIOfaF)~r491MePu6oiy+Hr0Bs4>rp=<@Xegr#v3d9O=1#Ml z!PF@d{`v>vCDP`Dtc)ryMN>v;G-H=csZnj6BPJwd5F6MpC}07(N{9G5AGfPR61N=H z0N{3Tsju7hdVNoGcr@4AiG(RtgQ!iU^TOvEGwHk-bZD7l33h*xt<h@l=sKT1(G)Ud z5%&TTPrM~GS(eii_&nWd<u0dE?by(TWY65_b^su6o5A*Ypa)g9H!dZ*VbKb>wi!*3 ziZ!LeCrgBGA!ZQ#PN*r%Uct4mJMoTH2kw=yBCp3mm%OH(Oy_Y&o{0>*bY#qnjtM@W zPS)qsKhxj-nC~G;Lzz`qZ*W)Zbvx7RcYAR>U(bWW2IC>+MA!~JH-q=y{K&F+@w*kZ zKc?(IXb0YJhsFTz<OGc){9=ts^cQ#X%PO<V&mhX0fa1;$uiF!=q}P^nsc&s%Kr|eU z!~Ux0?Th|o`QukG^hU>o3Li^ljLzSTk@WK0Pm@7N4+@(iG8_W@Ea)f&{EWoW=;}ke zZjM&gNibd?M2zfPm`w%o;QL9n)Kqa(b*K2k*&PbvYsK;%lSpupY6~M~1v&V{L~vP& zUzQ-CI$rLKF@D>4?-abFz7Qh5K!9X@Lws6Z294i+2%r0gc}RWuKs5@@746T@V2JZu zSIq+x4;Vnn<i<iKT=O@K-M`7;T|&Fy$FY5;_lXfIJ{{RlSw7QrUnHVeKzKT0Zc1Jr zHf(%e%bc;rD4@1}U0dhIf8WAof6~mB_lVN+vC277Vp%0lXQH9k3gfmGARC#_4p8`$ z2II)HAfFW}z|iaL?hrzH!t&=K*ZO3qL;x$^jAacT>_n?hI_W70Z%Qj8*L?B1<rkrB z$ouv(Z{gd!r8)nq-!Rwr|0sz;bsRjDkp5i?Y#6yV)PHA(jZbZWpaY2K?Pz9C(a3Aj z8n$AV8_ZLNY4RBLNa!M<i+N7PUpBsv_PD#t!eL^XrS90&H@m+F!Lp<?I;T;bQ1_%j zg`zhMI{Qm0l5sb#;aa8jb1rF0?Fu-c&T5>HWl;pBS72-)@{wH}h4BKxh@x;gXtO|3 zBT3`-+{5bO;7SoZZdv*~Z*e}MT|8}9_wYTrTeXE2{6yC4$7utq1%CIjia0>59EIrE zA@)og2Db!5wUKH*v###uzD<tC1`J%U7GnX<K2Bg9ZP)e-%?>Hvomaa{po-S$7M_lC zT*iG?>i$p8(cf|eoyI_SEr%+?-*4`xx;p@l9=fwjzqjX6Pd;})ulJW^-O30I{r?;r z_ZMUFHNIozkpr{cB$KwkAjS#*67-nR^LxiN|FZ1g-G6sQ6I=}f{C<dV;%)SQ$}N0$ zf(N#Bagpn;<SqM3eK-qY85qO;g*Y6KjW8L$b-;BVWk+5mbdOX}45~t4q=_d_vJyNI zkq7U$hb<uH7OAUVSb(d0@c14{o;KGqTIG@(VB+u9;{vSUJ~SUw<ek*lUo>=Q7Vbg_ zy*=l`g861!(F&snfRv`9AHNK3N8Bz&<orGa90V|64#kRQcXsMcf<7>(14m#-T`@6b zO2(+IrRK-PVE}JagmBp;Ff`0`EC-feu@gWsuy;P4qk5B*3x6&^$g-^W?efp2%`aMt zzq5C16##Ohv*$z`Wkvk?A)?i?-|K8_J%Rpv^=&nQ{zQ)Jb2jP>>F0r!)3d_SuDHOn zr!ekcB~kIV0mD%&-`mUN1mN=t1N_yuTQ$5BToR*Xe~m*;?S>%O;`5vB$>rvO*pjQ1 z*T~x{HxG*@bZ3IJcZWS}cepDGi%!n^1gFc59AHnWKU4qBU5yxh7<y>r<-#NIYyXJZ zL%Yt~Vv=I^g>B-=!_TVTkwwrNx%sy=!ui^z`l6L0ab-nrvPK=6Qs^eu!uUe^LV)Tb z1)DH-NeGHd^`2s=Zgh}ED;$YQcTSm3s}uW6SK@nq4gLkk|D>R@rwGy*=0hYs#U`J# z0m3%|3C|u4+!F_DVip2RA(Q(bC~HT9E!RUnUM}@dPD0}sUzv*!Zk3>m@;k$PmkmqD zeaNR~y8|3<Fse#<HC{Iewzz7Hd)Qui=?Dql*ii0wY_@16MKIHNI~IPR17K5DAx$#! zj72Yl)VQ5xe^qJ5wYspsZf;ZZ<U>jc0bFs*cFR`3EFdAG9j#~(4Q!oLwo>byDTWWR z@mCi@M7gHy@D+BMhAiH<1dBf#3Gl(H@lte3xIk5d%eLhqJ0d989K*-q(VYXZpyc1M zw2}ztG*`2J*6o!$pY>QgB^zw>Fmm8~8*wqJoUsNL7t8<Vq}hZs#zG5)s>E%f1EAd5 zr>8wS;O(}ua|?ewe?P3pv>v~)-qg7GMk@7_<>|QpG%>cgPg4Bc<rOs1^Kkz$JDwn8 zSii>$#L=pP+2g1GePTYyA^XqjnmcBzWRPHpZ0bz9%=XNG4b7>^n4|%aZ93b{v$!z_ z>9~lYDo>SAB<jc=QTyb2$Pklx`GBKmDYWXQySCk5szun`mP|kJv03u!ROP`Ef{aV% zixe&DLeA49WqfnD%pVyICxgtbki=S74aeL2YG;LcyM&2F31yBvWea({D}_}O9D}h6 ze{{izf2fU)zFh6Yh56*VM=8|orx})No?=)<q4xxc0_C++_t%d!yP>@7^?=6C&X=;v z>9=(!!aS~ixM#f_JHZyCPJ%y=<&@a7&`>zWzSN%+ria?Dy7zk|C1-*fWlz=c`ytII zC|L@>0tjDN{mYf5@9yi=(O)K#*EmcnYpd}_#K=m%>G>Z=81bX{)_(K>nh=Q58~{2W zj-ARBD|V6H32mTaLn-+TCBVa~Z02q_kRM_1(P&@H;{TFxAj;2>FhjyxZ}C&X4s)bH zQJBsAq6tNYSfN;xNPRpi%+g@+<xN!jBQ=#9l}cDoxFd=k55Wr@4M8w}V6<C@Ve#KU zT(hR2^~5h*#$fwykHj<9%Bl8qf2%zNLl*QuLrbotJ{<Ma5y$q){J@1JnI&)YV5Vw7 z^$IvaO9O$*8cxl8SE;&}3nkv#jvn42{~Mc*K+xV+Am(#SbJU`ux?m_l&N6k!^DDQL z#Vf4N$;+7l*O7+%W6LR`tC><H^+&^g$H)C#>jUNnUq*Lec5n-lI3x*T0HzFs{Kj89 z8-W{pzia;I+2KdO0l*B~Mid&?$dJYcr9#A`X%CdUza`lePf#uv=FK`B5aB6it`YMv zvh<FVavSh!yyeqW*_$8E!?EI5grm{bxSli0CQ_h~G&aTeeN6(p`(c+hhx0CrdQ@C_ zNI?5JMS@3%PyV?aL=_Cr*`2)*Wfd?&PU+7Eb_#KE6xPWx2n7E2?R$HN;E<c<sI6UD z!DbROt;#GkAn7EUi0BhCMskzNfF%4SR7Y~j)?4TM3TgWC4VL@&=XJ(;4g+?8DUyc% z-oh`673;kPh?i6*^lw&=hBE0_IIlrhayi-3;6Db$Q2bFlN776QA)`!r>oz$C`E*Pe ziZBiTe!iOC^Z_!ObBf)uE6vDDXGY9T%VLa>BUoDc>AGt+)}=_rKXF0aE0<iJvZ&?f zpqBQCZ3j|UyD~@H5`Wh=njPfmB7kP3pTd3h;c4N_lnxL!qz=sA@OIr|@B=IBW*Fav zDOL?0S5aqjbd;^sHh<7sqW<V3$8fY4B(J4Rg_N*lPz5?Vj0bR7&A=9G+HTJqS!S5i z()za2t_QMrE1~X4-t@_-asI{(gx(ec={k7$7Ca5DVmrEr7%dl15kn^rXpF0>R2X(< zqE;5n_JV1W{ASY56t8-_H56hsNxx)0m+Z!Gp`o-9D`a3RGnR&8pvuoI;!!$~eq>Zo zXh+^8Edb{PIjiRA$}>QBvT?2VtUI?gVMCF_>mMZWM}Lqd&+<OUi&jQ}VMz3`=;K?} zBPn3k_=%kRK2ilKnt0HH^II)BU8qEOI}zN0%8bF>=)o9v-(KjEYd8t!?4JX>pv#~| zEaWno+yeN&7AX&OOEO|L7vw848Fr^c=r2PB1?aI=vzjqVdUD68bemk-$(Cs-Ro8s4 zzuO{5eINht`0qD5nswB3#3cKG*84iAXh-P}yYK-%HvhP<DU)ZEttLT)tB1l@C;Ct% zA)%<dKvh0qsqVNkSg2Zb{GCm@Ik;sP$<oV(8R|_q(CCfHQs}tITtpuu?=CDg3O5p< z`{ym|n`peZFX+Y~73~BapuW?v5muzbp#u6kIvvo$s`Rqt9CZ?*1%7IF%Ja?Oe$Q#W z!}o09PLu<e{E^uPNbD-ARAiIoFpFkER3*?i_NQpLQC~CELXjUsbhRKcgLO`7GA6#L zsOD8f4BQhnn?hCXV<WQEMHB)lQ27SnO=S{ho42i7|G9;)B#@phMOti%OqgK}dohKo z9(JPqX)cdifixTOYACWqPVX|4?0B=+;tWr7n90!7>)!SE!sU`wE+@P!thiXc3$ypf z)0E!MnqUL;JZD3wfF2ab)l^Lb0o|=TzqdD)Z}J{Swc+PG(G@Czp=1C$Prd`t_Wo<o z(PgT8=ctx_K_dpN$=wsHaRBi)jLdaqN}-Zn#ar8-0{pe<WBIpn@fXSUD5)+5rG1fq zE7xL|>dFOvF1ARHkM@DXHAja{oh-7;5MC55#kN!&QAC!XUNd83_!Qajeq5xzYa`*x z=A<sftYnC3u<Xt~k|Na^E;|d*edcnTl<^$e<=?{&JxoQ$6nxuICQ|Wp>7R!jKUb&{ z=PtV<XrdF|Y=UM9z%$NM?VFA`?-SXj((8Z@h|D*`hT+1gUk)%cg{$DJc@GKLCVZ*{ zL!)T^#%?{U`r5hJu82NNu!<~_lVRw_kly%@CqI`F1IN8>gsLvJ^wt9CLNt^U!lrEM z%Ge=i5d%Xm)?C(0OOf^+CM)W<zuI~`8qJ(ok)U)Xk&<-{IiLLAv1gv57^<G~Uw{8# ziN;P~qpvp<3V!9%--<Qmvv{k$02fF6_T$a!mni6^_nwLLTah8NTGI!$X;7Ci8}@Wv zDM;2>W~k%FbZCgU5YWPs-|?jpzCF!&2l1<}WE|xrO;FtYW7dS+dR%C3>Ge-@=9x5V z?ds0Ow^xwI^MMUqHP{ZGJ_;*p4sMR4?&7gf;2NM{8=eczU_<WiS@`R^T0g0JY{<R7 zp~ou=W6LdVEvTQ1W34Dgs`3|nd@>|iBR~2ZVZiT~->4AR=|BjK@G_Jd74#i?+4rEj z(i%I%_VXF|!S^$Y>_v`A->9D}1o)b#34*7>I}$a1(sz+gs{&38ul3QR&MW7zn+E50 zv1@kC-_5#gIt^BAH!U8Mm|w*oqLVNsHapJcsU_z6YY1I1A-)5CgyPhwTPfQkdYl0a zs5=;hTDZU1`~d0C`NEkB1il;I-uk$~lEqZ{Ront0)^@&QgpgGvt|unm)5$gdSFQz{ z7kxn_iZSB_EK_wz0czA+YOqm?4y3Yt6gM9~yA?-sb4~_DN9NWbMS?;pZ4S>pNiof4 zGuvS9gt1P~IV7m_vGQE;ai9B-;_Mq}=G4roqV%6e6F{djd;5eB1G7X1IMpUz;yLPX zE@fhv7##7OEk!o-{CdsmeB7i1dcv`lX&ygX!RR>J&hGYG5}h&4DuS(S3##40ZUkWh z5B!~YasS1Cp^Gj2D!+(Ho}<T<J^PW$AwtnLjUgS{f}LGCPD7`|Q9lt2xY0N|r0eni zxKM2_hXOvdqIwa2fyP7^*EX~e6EvtxmFbpd)z05&7Vg#aP&{@rqhrv^YRA+>t33Vv zm7+$I#Z`y^wg63k38mfFKG542Mw#%nXrqP29v9!1l*p0jodUF9)_o;-4Ve{}S>R2# zGd?Iad};9F=W<echQXnA|Bxf(kE-geNb}FS8G+FVzW81d>n|&tE<;>#8&4;&1!pp+ zRF2@r1_6u-yY|nVPihRY*$Pe&zsjo7Blcp0fyWJZH`KO#sQGPq#JCbV6Kq|b=Y!gb z-UKwARLsgSvnV}0yN=LEzi5`MJB3|4&$NV;^WPh1m08b|abBk6w4#G31vzIm_4Kq2 z0I*8S-KTuITkhS5US`jqy^@up(+NqQwit;E9;4kVCs(Zo!!=G%`$l@xQOa&YJq<b8 zq3M9PHmw31($727z;vmKh=qqFMIYB0qDW&#;IyUr#&x{9WJdA`AM@ok;>1fg(c%4E z<FBQ|<BVtOJ2YV_S~19X)bpAvadM(x17<_@Tf-IdvD_pDFH-41i5XF^+wC~3&RW#1 z@rKB_=ziA=#(a$f+AJ-^x_Q#5se8^YP)@C_ya_3P^yix-tB&xbmSZs6ve1h9h`Huq zLw>=;Px6FJJEVgx+m7)QdvV(!@tAv*+L|SlUOCUKrFP>t4_2a}o9z``szjG119Fg7 zQ1EuKnU@*=qiQ&=B%FwZI%R49*7iNJ6suwVs$6p)Bjn<G7BP@@bnVP=6Tf9?I@w1^ z7A#ILFTKN1TEt1#O1AxM{VSuY@xnhJCbq0f=<4gwG1X*8f@IgwN7zk}yB{=yW8ZLp zo$)AwENqU#W%{GKV;{xW7a#C(GO*q5B!G+WKj|$TVnLs-y4nI(X>SXIHgjqp31Jp; z1+5$lbNOgxm0gt5>N>%TS?7-=mI1>80!XLd;?0y=^61e_Wxu<SmWa(2(dtQ|)!Hu% zxGTy&8)4IG#C<tknL%U-lumunctJTBg#PB*VHo<H1nF5H4}?2!cK}}|_{rYfcPZMP zvkH9@5ye8|Z0ZI@_}Sm`ZThI_K5$b#PTP`s57z8tw1jgQV__WR4b3{R@C=*3OJW0i zUMx~#l?<?LQ;0Fy#;F8ZsLd>4{;`IbRfTCca5!M3CDwL#)itQ1PgnfCCtzBZPB)r- z>3qi1x0g;<wutg@Xa%%veImWu|I|4Y=|(LFxO^P}{T}fHCOb}_p2%A|CrmhK7r~ZV zUq%5z(<DB7nLmL)lx4UbKeGJ!%&z4LtbTevshrTc)Dt*K?M0?x8}7{(%y8uVsK;Sn zRIl{{mFOQ1M`~e9O#-+58r3mNa9;<X7)$=<5__r<6_1;|Xagwr-aI6_c0190!B_nA z!`_gL`gT)SMpm8=5pmYy;{Hm;D7Q_}9B@%son{USxOBKQ{&86W9O6)UuBUYIt_`bk zvh<;-?yHqzlIqP4;Q~W+I(H=f_RH`Mw%cHxe)3`JB$R0V`E?MQwh-rC_|;$8%w_mX zlV7aMHdr0N3b=KZ-paG;v66A8JsxU+Yqgg>-HJ52-uad}9yX>zWlE$n7qUa4h1atO z3UOYnH_Ur&M-N&?;1@&68e#FhLTVN6)yKZ}^Oz76-`>0`j36b2>n9dgPtbBZUQxl@ z1qNf1r+6D(#<Je;J-qhynC0`|=lw@(5s33tx;|V2B4=U|sf=>IHUlP|z<tmQ?<Ppb z1IgzB=4FCFw9lo++ow3wT#HWi<<D)l%2m2I5c*<YZt{V43UxTIV_w@Ef)eH+u=#|j zaO6(yLL`m!tj;aUZ}7O>02u`X#wmjzn(^xM-j?uJZWy&+<k@j>;8^aNn8NmEN9@0D z6z)CX6pVqMzeROGY_HupSG<@5Z=zWC8R;A4Y2L)q;NS~?cpz@}#!8D8MNZ}MRkr01 zX+deR9A#75%?K(RbT(z7l&9>sBTZZXhg(E8oI(bEX_SEP*C>ZXze+m?xMg`M(TN!! zZH^g@y|vC5w$-+RY(ZbjzY-Xr|8o8m=$H2Zy4#@KRemv=!AJ&KLK*+FTLmjP?Nj-K zdxn-XENNzxzAx4#LcivZPU2p&eLGFdPNE%UUJa?9?7u2XVDG5y7In+znhtvv`O?u* zR5&7A+K6MV4M_vWDdkJ@1AGy1BJ4vtph3RNoFsxjQgvZ3hQ%-pT^fzGy;H^Wq)^-j z1P4j69(zZkfBw1Z#F43IsIWtkF#W4TV7H&=kiXPV*!)Z6{u0Nr*EKH+OZE%)m6Rgr z^cL5g!+n@M&`rud;D`_3+=34C3;JO+b#7xSLW;&bGk`i@)B5#s`B~L}v0nL>4npj` z_L#vg2;YEW%4TduW*m2Ch;5jtC5vMX@CImt<fi1Z#N)%gSWFln?v`qC=R^NAj8<(h zk||&|lW*8JQ~lv$$KP+-V=Y-fq=?cU%<BE6mrQ>s)IBqYe5U(^>@c6d2do$pZeTLR zmmHAK<76h#<8E1m4|loIr3^3Mq)VTyp{u*CNXQ5wr%SKlhijO!1Y<AdJJ72G&xl1& zZAQn-lkjPB2CkOKUf~2hLqcQrncTnIWB&v6Lcz5xmP4&1RxaBJ)hua_sl{+cV8xM> zWlB27l_?@g;h`VwZ;0W_)BK0)?J5ls_@a8NT<jB$)Zpf>D%1OAoUPgkO!W}5ReL9B z@GpfK#S1Y<z{1!0YRI4S@PWczb72(Q4itXHoPGjwCJ#7vML7nwOJz`m8<4ralRnk8 zqp%2rDG|)suGLI?X~QVDZ4rK4lDCW;xSQ`@lv2Jn_D4pwdcsa8+jxkRI(QSI`9erj zE`8vYZ!&l5{}Cd-EGN!htqkf%c)2D8G`03)UnEr#L6Xqc*vi){VA0_nc?TQyKo)Lj zAb@fqCq&Mx&E8pd7^Fpe)*Z95I{9N%CSahIxicoO{3FMg>r`WIQ$q-k4wFZ?bF{_z ztIxWTs9&V3KQ~{O(l+1?6q_VSz+lJ$7PGwq&8AS-o(d};LJL%@y2meROE9qt!nXWQ zIk8AJm+BUIhFir7pw+!%l11TcA^E`T!?)Y}*NeZv-=8J#F@<AdC%})3NGQ&qHAhZ^ z;*jKJ>{?H*F|DvWpj;Au;V-0fTp?b&#xY+~0TQhFWnmA3K;z3e3mDZPoPsk#JWW4q z9_b`l+*#-*g)p9pap6*7KWrM3Ottx<IV||~jldeq`7@#bgF|aR4$>J`SGaPDia1Dc zAHT}q@P}!jk3r_Ob2#aykk!EHaR^Coa+1vCFjA{j%zh(@x>cxoeq!v?fbLDpeu)O^ zkk7c*YJbtTzV0=3jYEg8mF;Ec;L1bQFS`Y=`fFlEWqtmCFgK^+#%!&}tLi#@Yuq;H ztAELIOwJT@`FACQ!#O<?5A%3GWbMurZqm^z2X!Mhx~ifvHhRNAlBudrx>Bv!1NToj z8}WTfC~Mm@a9s}e2ccQ>sc2stamd1Hn=Ew{TJ3V9%F*YUSDbPq7V6YF)MNG}GgVPa z+yDHinkZR<+8A9;>ZZ%jOB1nn5idM51LiW|Vf?bK$`ZdIQHbr}z?g%?wGGlqQaf&G z)jX1qj=#|PaYNxW_=4Y+BlcbFFh)irG71A67A|7w*C(K1lM~T_4MrhK?bko-L0z%( z>=62&Fugg65H#81D_@AJH~9ZXR6!)rz^GaB+_yQN!UgP8#{X0TZqli_UoZdhKXQ;a zJT+2BoWp#2(?48Z`?d#Ve>*kUxs0A(m2`H}p((KF8n%7s=GXWac(Tjq&iT~@kj7dj z%<F!qYdM7Pl{G>7gG%+(US7h5`K5eegaB;wH>zOBN6dU<T*$tb%mWXi<=59yFTpS9 zbIino?bq<uw$Je<@E?M6@;<3@deB3zb+|g9#<e+y>ddI{WKzO~1{aaGx3niGKLezq zr!om4LuyI7>K$ZV=u0YNf2E|S5cR`A67nnj_%C)Ft%_4AU@Fj}3>>{41#)X_kQ7tP zI(`h|uc46!JL3-zw)GjlN|T_GaA5Mt3KjCwX)}jY0fgTC(kzgfr83D9q7K)gP&rmA zgdceA$}dXbI+n{wb}>{Qy$E}m3ll|52Dc-nB6NKR1SK@<ptP<k_`$v&J;UZ8#9BNw zml^~Nn1W%#c!J5jN=j5+;-MCLLnp|z9v+;JJ7Uuvr!KO_@ll9mIo$n=b|2f*E@8q5 zu)W>FKxqHC*>m_bw+Q!Xr~yr4MZS_<V5(8Bid(iXr;~Kk{kA65J(-Au#AGK6^lN8x z+pB*+_t`7i9UV(Yxo{)t3rnAUr$Yc%E2RhBo4kcgpflz()7hJ_KjF$OVMu84(Ha}~ z30AJ}!?V4r<zThVxnK=e-0R+d@lb!}(sn>T6^CAl)K4X+L%CS3lu@ZbL00>O`{Q4S zKzA=bCFjF4xloDYxyUkXe=yezbZ<h=q0U8srsw*?Su6`2*_|O|7RkihyVegq1;61q zY1rHXF-4Z7xYTOa@8maf5d^bA+7~?wc`$<gk@;iyzGzQzx1-hW-W@up4!nxU>ncF9 z9s<LdTgNY*eYE1~&Q~3m*ewUX9o?RUDEAgO7EPN#bO%<Ce2K%Tvy#b7sedT>7%6+0 zB=TtwCki~b%Wk&M90Oz*TNPEVE~cwsF^9yIxtICTafj+w#A6*&OE$^a`LXsS_GBC1 zsN*}4x7fVNbxDhQ|3G=eZu^$SrPKkXf-rP#=XF0Q^dLcbGFqaiPI*Rx&Z7;lxqc$Z zM?hj?PPTJgR>RT(iC)^&5#t6v3Fj3|aGFgs)SZ=XWochvexve+qy4Ol2YdHSiO6f* zgS}`^@syM`c7?KeXyX(xx@+(g=Iwj~F2Uf~{AKR`Yv_V1?&M<ON;CR{WC?iP8HS2c zr0;EHsrY&L3rkp5-m4<CvKjv-YZn(G81Ph;uRR_qy&h7rNZ0%yWc0tpXub-?{}7|Y z%8bsh;Ujca5c;k5GL5(zG30?t?Uh7TqQ(js>R=IrNty)CHim_YC2P&WH8nH6qu-P# z+UR)%@@X-&HJ5?EhM<V*O@<gb7@EiN6&MrLXvcbN;OZy4RoQWaea07=ljyR0CnEZ% z;$ev`6{N%z46juP(Kpk6EGU19^l{s^3b0F2(IuI*mu-&1R!T`?m7)`S^@cLttCg)2 z8fY|2mj+M3B{wMx2c4Xlk6PbL#k(#<8ShOCAT1w;cQ^nKf3p}67J^nDT{B%17A*^2 zpZdI!q!cW0@VndRfuQLC4iUV}@TE#QCkFTcxOv+LqD5-TkBkbeH8cAQQW_}R3xr_X zd)FT3v%!6ipW(l@TU`?W+S#5}UvCW>Y(%R`f!G#YwqlE(e&AkyaQUieNoOo^FuId) zyKtuz|3C+j0lRm=EzD=L6MOvA-Wc`tV~PY!HvgI1=IVg&R?GbN<K~G*)>zGC_w{5q z7KvQcdto%}t&lrork!-O&Kbi;hoLVAI^w=HT55@GT$W?k#aJ(*`5FZxe{c`oIifNQ z5p3?7o4Z3&*QcmJh0xR&UCIp>8-!Ume&}FWC<m-)j<se{D9C;pJZL?eAofQ6^Rr`i z_A&0sSCPjfEU7QVoBLgo)tmgz6s`@Ds<eo^<Ae;xytP9`V|-tQd*|M<HOrh+lnv49 z{!Bk_eRA_Y2}y<iRSh+O@<8R5rXS=+Dg8b?h?;OqFs?18Rf%N|Id|f9m~KL@Y!I-~ zE&=j3d^~)%JcfITTI^G!uA|`+Q8YPSZlSQjY9&@QIU9H$tx^O_a;HF30J1ZYhIG_> znh{pnB=n;s9Xe?Oo>7jchRU2YpJYXx63+d6j|86+%aKB;lX6*Sr?ItYV)x^L5nO?w zK;@4Kh7Ae;=Xs;r<J8}%oUhk2Sbf=h5%>>#3Uh2tfJm^bt&T;)?Qv~Lt5-MUz4)H5 zM4W5zrg70mVJEciJb%<?y?iRra$hmO)K~Y}OIff?w7w#DWU_#E(g$lJ$N~UKmKdsX zxOsayVCQ`>+kmrm^~!Y1DNe+E?u)o2qD<&8mAa1=n|AVo1W<ug$FoemHWC6LeMi<H z5q#c(BhqQ!#CJ7`4$j<gVBKuMTN&&nM?|l<M0HV3rB~=(+Wm<PQ56w6<7qTaJeg== zth)bqER0MuDf=kQ<LlN!Kxz=LP?wFn_pBEFy2U=};c(t__qbm7>t(s+feR>H5GVS) zIPSb5y95G>;*=!A>h<{1w&WZTYWVCAA%T*wtWrhfPT3<)m0XfZ_MBpl8SQZOyss&p z$Np0Ei)QM8SnOnenof0B+R2mQ%YGE3BkN`R18qgM{eFV;(b7exK^aUziBjiatPmX| zKRRi4n(Ak-#o8`Z&&u736u5ce+C}={ks>SSSwP$*4I&3G<p?EvH-`YoRBM8p8ND+? zJJv}$v{SM21|PReNi?^#C1yXPsMg}VsW$aeUfQPoK2V0q$@0NzuF$(@Z9^rB9YUm9 zFNuaxJ;ZQjL${nQMxwc?4@tWbIa`oo3C(r;gTh83S3*_Z|M9-_9ZResDw!QjB%Qsb z5MzbtW5|4qZbFKTy;%})$j8OpCzKtJ*Ah2&$!UehtX)l*G)d8GVzGV{&rhvjvLt@X zFqs^dIO;T6om>a~s0JQ-6@;FS|BHq|icD+@jud`~3FTboBmH`t{V&Km81L=q-`OBh zDr?DT{MdOg^S7zYNhV91BYiLFPFqt;6n9<yLvAbhSbziQnbBMZYqi;`+pn;&4PDdb zu#}SiT$WC1?%+JhsIBx#W^%x`KQ+##>uIc;db`?xZ9XbC*r*L;8wzCt@7Jy*U9=*z z)cSg4G%1m;!#{Wg!#t%f@BebJ>4aJso*aJ(KD0nw^bsj8ScDn355>|jt<Zw%yq6z# zyGDT`Fgej~2Lt1P>BLYLSwxc*qfj^NZL`kRVeRMtL)1Hk2hw%H!f__H?MyteCbsQl zV%zT6&cwED+qP{_l8JTZ{r>+s=d$~1^+oThRaI-RU*FmO3%6uQgS*kPDM<cn(q(t` z{1-=+T@0N{h-v&@8%YpnOj^%+_*ShMgl(Y)#+B~uXmS@%A;+&r_c{gG=5-%`VdK2- zKCZq@!|bcM_vjFk8Qo-OqL1~#B)?8^+-?Gczr$R;kOYuB|9o$F(IJxb9dDUi|3TgW zFG{4Ax(Y)I%~g6Afu*RUV_dBGu($Fb7{V`P|4XB?G_upf>gS#(efjNI`J8OAwOH65 z-!Kk?w!frqu_I_g^#<nK2n%50wD5>^Ig+*x78q~oZ48m>2#0rHVrx!}_A*dfMgePs z25AP(q1rMc<3=wah4ZolLi$_(RzQq4;`*u=&1N;>_Wsqw&e7E!;Zb!;t}sJ|i;|hQ zwr%xH9K_`=JI3TLEADB;YRfj|T<Cf9O#d-+m$b3~kL+7l2WBY>ZE`he9$!G{kK@TY z4?=kWktkX<hTR4F{gn9!2W-<dHvpJMb*U8wD#-q+&7CO83jKv};sJU}+U0CI*<hVJ z(VTTBK<8r_uQ=|7ml!chwUF8R)*DX^EKUwd`zbWB|4N$Tyg0IV>$3mEZgS&tGvCok z<rEC-;5;y~2fvS*7DnE#B$6ZWT00MkLBl15*fv7`5=MU7AL7xPGEV)})&e@u>9%3U z-cd1=*7pe{{A}<AU?QKN%%+?25T(%~-6ACB^qOG}WcK$qBe4YUWBiR_N7)W{rD}UZ zON1Zmla`3q1B@S_k>bsuhU*mLe%Voj@A7%Mbwakb_B3{Dhwi64pst5L)?<9*{}nqo zGNA2CxVI_eKcO}-rq7;X-VFF}G^JFLs$eWtiEj2zsGT$T4iev<gH1tMj<B(&G``g* zxh5a(GH7cuy-h}CWUp!MnZ`gijD0mcv31&zt*isV>SxDVeg(8+$;Mo@Aezk^ARThM z<Si|un8BnA>?mo@lHB1PH=j>#rV`^$qa>mmnIvZJ5s@~+j!tY&-9XO$!(+6`Drw;| zGFy^HjgY@!qK;uQve-d+fkT|(p`{or0mWAk=>BWasv>EGXUK~{c=lh^k^**RtcA%k zq_L=rK2{f$dG>qT1RV@Up?QX4W6K{%SwgCNTle7Pi=gkRRUsU|+#nI}@w7r{&dQo{ z2>exBzm3Ixqbu`?!UhCeFt`iD^E!KqUKA&wIocKLm|DXXnaNq57FkaWRx1<<xiaM5 z7RE}`J;q_p9HcVqA#emcE(x@QjQ2#QMH_VVr-Ty(kDsg<C|SuRL+rArfDiWwVWPTg zUi}Y#4UP<L4%$a54^31=pGk5T!x~{kA+;tufeF$*AuvoPV?ccS&A7AB#zVdGXM!(F zt(w)%C+Z<`Q1#lrGw&*(6W8A~(Z@jt;PB_CP-%#l@p@JZ=&;gvf;dn8d46|i-Q-bL zw1f$rku5&>_~CLofcLhn=WZ2?j>Mo&JKxSDr&bx?qTjdPkiKxeWmo+)AiEQQpI6<^ zk_gMT@ub1<1~Bt);~_n%A~%3JkeZ><THe;m*nCTNDrE(?yiTiTK0s_DK?X&L4EN{0 zo#nsB-8$7IgkM6yMX89j7SkefFlv;VpJ^R{Fthy%!|$wN?kpl7m$q{E8Kh_d@7>h7 zGOp|4IJ4XJv7a53-_MtQ=89xL5dS?c8^+$Fwz64i1}vsw_5?-vHNK9Lb4T?Pud|k) z55(Er0|!!OAKIo0KgMC`GJ+ZM4TC&vTtu6WX@;3aV?S7!R~{U0+z)LKP6|HGoDX!J zVp!iZx#kPbPIv!VYZ<!|!gYLP0}pRWCeWxeTB#QS>S!Ee2eJ`P)$WO^MTc;9%*nFm zI+)O2z+1^1=@}-u2_EGZhH-oX99g(*_;!a3+wTl$FV$8PW4^78oEZ*h=yJWCjMU&q zo9xI*(-e`CWcOZJcjlCQH@%yYdABp(^A#&@uw7f6pnn?$om_7}IW8{mU-lO|o=()v zR@&R$)bkG7e!6*B-DqVE2<cHP!KdpjmGopK16+;=@*HnMrDtAG*GJP;2angC`YY=f zs1aIr-?I)lCUQ120Ii#8{w%%soA(t`Nv61CQ{?x<k2CR$_YW$o+t2rf_pLTj;ROE& zq)6nyEFLcJ9{1;DUL4-uPftBv+V4|ZlQU;MfVbt*HC;)2Ek99Q08-i#;nHb8&d=v} zVBt*i#w{g+tu1BfZ0O}o()%^?322$-|8n*Ay!|%<%AvPE1fyf+>)`p^AuW=9_MSz= zF?~*{EF9nJ`nxl;<`@Xe%rK=oa#HTtv`7F?Pln!&p^g`%m7$#*XD&`<rxmU&Ad6f| z)xMRAN9_+gbhehgd%+L2lxrd%lE+B~Fdb8NmBX1e<D<zLNMM*(COUeXV=58r&}-FW zXg8;djNu{8?KK3LNj{Su?YL$gfqH)4jlW>*D2<hV6pOvM81D*};z2*EoJ?xKy+&X> zuRlDy&;a4pOp)hU2m4FJhr}mxrq?YKTh!;ujo^7=V;oKqglRTe6~YnmKTgAd_$?WY z0N5X|(psm+^Lc8vca=Ke?!=W1G@RQ1c;JVXdmD)?3q&*5dDL(sHRzmoPG*5e|7Uvp z){IHe-0kk=;SYjG(mnOjZ>lXJN6bRr{Eqk`<?`{7<)#jfQ%J@gDQyZG<b9^d(=F=T zZm9h6n6;B0O(X`5AMhG9)9M^RxXzl|JZ+9KRqxyck16y=*O_7K*sna>$GrHM8*w5o z;th=&*W_zqsKv#TZ_^-5PGT`G1(Jy9vi6C+pHI{JD_UOL1ZhbfR?)9Ms74>4F|qaU z?_=-l6U+xuv<Y?aS=v0)YK#_ifYsZy<;j6?@Ajp0hcN=nTZjyL>wOoHL;!*5pdXjG zES}XTs8qSECWmU3tG;ZBb4@;k6#3NS^ZafxEk(rF^>(%B37CGoettlw6G2;(R}G5` zl`^wTB~O}9^?xa(TSq~aNs$2LS_Uo+e^V-EAKjLpe))tRCS48;__;q_oBXMneOn=z z!`VKPQ@I3To5(n=anb=o&(I8mupw4G*mpyHDTIq1jeNJfv6&Z-+y2OJzGkiNrvzaK zN&*5#7=xe<+Br)YPbvCAbKAyDTGsvJ)SrA@t2~51m!%w|K=@-5B<FSn3NQsxdnLre zZp7ts)m&%-O*175J@A$$f2=Hep4OGA{R;V_LmLptACU}%^)LoXk!h>j|L~&SkDo+K z)yG*WNqPzHBW|=X^3&B^8SUu#8l@z%m{5;1qVlt<Mo2HjikE%Onw4N--7rd+m=06O zPQod$$zl}s5H5rTaY8%1(qy6_G3Z)ny0)w4)S`xrlDy@KN+a`szFr@0z5J@`>EYog zSqcR*#4$3kO74N79SL31kHeOiFHwvPR{U@&PDu-PpZi#j`!BDj_?K>%9hD)N6^)W* zADXnkC5n?@2~rC)M522|mU1<zzOkmW@Tl{tEb>GvKK)qna=9VW=&jf%EuE)`{J^2C zrfnzf4p8<7eX#{W=*HIUAdA(Hp6Spa{%aEfm+<Wx2@1GxI8eFl;J}f6^~wm<xrF04 ztFwDA1+BANilZwbN<YsK4i;1GOFjzwVe!C)q`552WWYY_+WU&QS@Sc&NUQn)n~v}% z|H)eMh7Ued8ZT4H%8X(n<=6blTqq<EAbJRcRXhWJ0Ky^`rq#oF&4}|?h-^Gfv`};V znAwN=ZWZ7+U2i{H<Bv>}<(QzA8>o<~nHUAJ&e*HUn9dgUf?u#MiDec5sLb~*Nq;96 zS81@USVmOAzh>EE8g5xtvou6K)ctTU&tgyT6t`lDhB2&WV4(*~ErO*fTAG)#e{{N( zs>6-L%~y?<%UIozAjJiHghEWSKMARHyPS25umIRKqo4zgB+;sV&s~md(FClK<69hi z@zc#8-7Y<D2++1ev-rqyea69S*^D8bQOZS-DB_@hzd=3|%fu(Ugebh2KrD@L)5#K* zOvS2~5WXmS*wS3Xv`|4xuEix&rnQ2Sb)%<hw7n|Ai<|aVBJ%RMSqN`xl;+pqNjU@( zivc3b*{Tea+#h2->&+R<A56bl1GCk3x7I5~S^87mh=>M3n;woIT%MQjuC$qBL7Q!* zBGJgrcknS>j=Wl;yb>3x!{uSW$wvy8F7-%{%8OU_-KDll6CZ~i@>CYbbGdZw_qU%E ze!5f;qDO*I*Mnv<%63xpf*9M?yfm>Hf&spDpR`8iXawjFS>`D>Dy)=+-@Qxmd<MNs zeHf?$n}ok7z~YYU4|N8NHztIREJov)ZOQzMVJDW2A&$3@v~YKh3|XPaPBY+)mmmm1 z3$<bvNYW9%{bZWzR2=wCr<M!(ZvnY1-2o~dicvo|IyqP!yIFitUs0x^VE><X$x9%V zqC%q{7vJSsI!wq62DDLwh<LK^7oS7Kd9|hu{bamI9Li_~9z-0O?l8ioIQ7YFjV*@( zLfRhn-zL2{?3nli5j_`4c<@Bn79IKjI8YXzAS}P_RdCDWd%?706KN6OfpO&zj|t?g zb7+DJ;e9JkwyY}wG3<mwy?VmPWgr?s8bKc`nL=gMhb9yYOtQuwaZ@2q#GXu;HtFr0 zkL`%Bz0yAkRP*VYW94m6Y~p8fw+;P@zjy+ga|mSFy(8n-$bA*(ja+ie)+!R_$N6<O z#`|1;t%gUxyw~!ZUB|MzS5qey9>SOz18tv!4l_l%Oh|FZ)Y!%!=(4{3Paxp%3nd<o zmK+UV_>H+*c05(X4=0IncTPn~L7r$im&kF0IsaCt?sT^Nx4R#Lz7*S9lxKDD;(p;w zxkBJFJ%UOg<zPuNj}L}p!h$U41C!5Uvf|HdE!7baa&%|h0CJR(w1htpkXi0(is5!0 z5V}!1L-W7zc%x`?2{C$82!Ij<;&sn_5<U^`d~Wz!m~J_`tJ=S_&k_x`&H)3)lNeRY z;_{`6I8H4SW$6^33l}cWj|hT<S-{Q)Pm|1>s66b??=B?d`ILI2%kXCQ3zsUS!8CQY z>Qq>Il(he{@1_<%rwz+2<RtNyjKN#;q3qjWN~)D**>~TEQkAa))c^&o#vv0+Ke|b+ zYPbZ2@TvX0{F!ljA;#}<Ak>AosVZCM#G#Vko#ik1T&lfbyWE){X(LWR<tZ)5$l~{w z2i!E?XAPebBZ)F6-0@Qvx#yrxzi`3kC^OsTP8vW@7!gG-w8)l+pBq3Ykr^osf9_q~ z{?V!iP56UmMYIn^#RjyIGE5JyLo>%NO}6Kk{({0d&y)9zTHlv2IuqW&6H~Y>6SKqe zO@CG_beQk%y7z>!J#N)_w(sDBzfPuoD;>a;c;301hKD1XCrK9aun<~jL_v1Zb&=(C z$(l0-pZ*oaVX!BhAZ?Y#pm5E^CV*ah?SF}3Sd?!Jjq>XW`3C@A8*?;4sKlbI$DCPG zbfAbF!;BfDbmPcIQlVHfvE+A;)vn_*lQb;z>t|ANDa^Xgl5p|dQe7fUFhQ`ctZNdY zlSSK_{GU_v0LkWic0ugZ{`4_><}5~XdLuhOxWBD($RbHPF##RHhlc1;q1OFN-x3$b z2<%r3Z8cIWs9S*rDy(_jV*Oc}?8e3e%t8MJ+v{ug7~M&X<agh1*U$8c|3bywZ7|o4 zlSc?Dg+ynK&R}XIOaFG?1vP2MPq(iXWryoiGf^OnK7`4_eD~L1sFx%pr*5Vx7~5Ve zBme5GTS1ej!kU7wQOw4**Ja^O`l;1ssr#~R!@NqcDfI&UPAhhr2PFykLJn41^M!?^ zY!4uk5sdM6lkqo%+_Mse_SE@;Xyq!4jN35MnZt4XAeOa2#bOQAQOrWyq9I+7=bp;B z?$$>hW#ThQzsfCebgXsbO_#18WIim5LEOeYE7)j%!yl=w9-bJdR;LqfSNv`fC6gmX z#P3g^MN<UqH5MRP>l`xq{H&_dATw4J_i?w&h%F}=fq_MDx|5&Vfl-SAUqM9UsJWhM zp{7F67JY}{nv)F;uadFZkfXWhIS6C8D(xed<1n0J{%Cx~2Ap}1)DzXof3ESV+N{!v zXJJ%;mZ5c(i<LN0v08Q-WCbnJ##-kf2-TaX+Y|vm8#4{lWib!>b~R8xi=#}PcfDRS z9gSuC<4t1=&KJ!5Oqb!cmRMtYNVB@>i)W+7EaN$G=9RZe=A+rU#9AMVug66se>2p( zjxsx6bTrgg-577Z)Nep#jfy4htV^d<+V*IoF8JK=T(fPw5>{qO-}Q`fd;AY{n(IZ0 z0O_Zs%1S%%pH;mbO~NP3F;+IN|3HV=uFJ!RpgTHJj$y$qA3@Yf1)VmZq)20I)W=HJ zTgiU(Zi%&SSx$$99&eU*HuZ1+z99nFCJCA5c1Q$B-8a8=#NHPz6ZUoKUdF-_7TFdN zXwh(mD}@<uEfv~XZ$-`QQFYcxK10!b0D#R)l~NKE#$iW*qsd4)gM>^PdN0meo^JLW zz5OEBXW_z)wmy|PSk#uOvK^hGv!v{8y}k=zKQA&38@gW5XX59%Cg;N#cIn1%OEv&+ z$=hB3u30Gn7e>sGp)pLsPC7ie65>HiEs+j`x{u#&^tRmg5!g<uQUA&o15N`5*lHCb zIXig{hG5(lhhWH(Z3nq8#15!}Y|!SH%86O03}qxB|BTph88CEQ%p5k!-bW)Tc0JAU zU`Tsc5+$xcMA%xC5~-e-mZG4+=Vea)3q47q*S=Etep<?cD}PEynb4KY!<-+I)~sUz zsp4|(sLYm`Uaa~BaT-`lY1W+zOol>}reb!#2>5S5qnISNY7CJKdGjN#JgT}cDvl|u zPS`QT%FKwFl^AWoow7BDuw>M(g6kj3%(UZ(cs9ICS^@_F3X#cU#q#vx{Oa`5mAPae z3wg(E;rdo5%OrZ?ZbRoD7HzM+T2)<d6Rl9JK4=mmvA_BG4ITGq#le(;h!0Cz`)b{j zaZP#)d5k>5Ofl7Ab20w~`%QkzWKsiXhP@YOY3|jHnjxMF5RA#D!rPBg0{|!fZlS9r z3`Gu+GIF8JHA<mr@c(Omu=CE9Q&+`l)Pfdgq&CV$(m;ooGwplU_M+V^wxAm!seJTp zrr9_4Q8P%4jg@G10oT)zX8DjLAxjwgdwXu3C^?aKtZsw7OLL~}46(W_>P%JhpkLKZ zpPrMk^K#CN+jDG+2G-M6SKWO)uQLJtCHmJl>BN3x4JBK1|C2*DMzxH|l#o0avAwrZ zK_>+;Za-L;rUg*);@@fK2V3tXYHa80JdYS94-Urfz2||}cK9ohRfW9awGF&!q#$CW z$^aw&0t1=byIe3mv-~8yO;RX;spv~q<c4hGOR86I)#$II;Yg<7kf3qE#kdkLEn<jU z2}Rxa&p9Iqb!qdYih^GZOF4b(s0iN>0Hy)6Dzb^Tb%%g#uO2;NLnrpgs=a?L3r-BV zi9k6e6c2!xA<PM4`rW1YQ{SGOz|y&Ro7)GUi!cb@)42mE1iY<pG@rhifsvnN=M*h9 z)H{8?to&Mlo)5(Z)-QS)$VVX{yFaB2q9OI*89&o-$LKfQL{b7&J0lycP!~H>&yfaa zBrc??lK8o0UsKyF5tq^*!iYq5V-3Lx^X%InXn;vVR-!dtVlr4?>olKY0!7ct#v%zH zJmh~yB&vS6P@uz*3_67?)~vWrwIs=vph`rR)Ko9eB8n?2+6NvzsThZ%?Us+|>d1_m zzLnNSkPwF=(MgvuK{+*+!Efk<z9KeKNfeUCK!>~=a=aL&HT-)=XYn_cV^5qQtit@c zN8oA#X~ODlwIyX|wJXSws!)6QA!;CNkk@{Q{trTh(XJtxj7<g9A_@3H<!++VMqDNq zBMIyNtZZ){(C_VbIsE9oOJ|dvJg!O{TkBjE<8T^POu<PG2)p+pdTb*KRo=2vn6yz8 zcWOh_S)!qa`IKeH!Zwx;YXQV|m`1MJfD1L&5E2gsX*Fy#jhK!SK}}RB{W4_HemT`r zsFMKruxk2{Dh4X<0ZrLHf(<%M?$EyMK{+pf8YYrcf4R5=mDyaxw25K#;j^<l_m!0{ zdKR(Mf2+%P7ZxMDjrr<Vai;yqCo38HL%Ka^X(dT@pml$<R;Ey^+ViIiqidu9bY8Os z?Ez@41P|#kO1_cV<AIA54gR)WvmG0H2v(G2=T)D|EDCLW3O~7&@Iz9*>j{idUagv6 z5ByWf*&#BMN;B9NJWqx5g*e1=jGRj=`o-MQ_fpn>;3ZG78wX=RMATZlzWr&03baTg zzpkvPTOQ3kewlWxBuZQjr3DEF>@<oPOJshKRcVUhCM4GU4Yrd)#$}n89g}d9)N!yl zIkqShVjG3Q0^uwb62|W598>jsn;Uk(+<;Zg7RVr*Y91HNu3JeA+L+VwkyyE(%8%CQ z%r5Z#wI7L-Z}DJoFz?cjx0tVzW<O4f)c~O$7;^3Lam^LQ6bu5E2|L9D9Q{FX8gGeH z-$Ms3J1BgTDMmXuu`{DrUnTkN89eU#Iifmm$;$6U<|7Y_z@JT)!cCBq)}BgYz(dJ> zaOxcJTeS@N%gow^gbFf>F(uQA)(h^1kmw_04^Xr7SsuiFrf7B;7e?l&$U!`oA;Jpq zf?BXNNU{nwUlTs~iojffMu>Ga+#)Kn!X=r2+k6Uh3GQyQ2nqqY`x)L8x`a=MR(LhJ zW~@_FJ-f7);mk*{KR7mN-OY4xd<6-D6vAXhHH@K_EQtRu17|0|oU^VPSY*hbYeQ@h zIWr7CCp?*vfUIMlZCo8qN#{qCHbC99KNEQlp&;js$DklbF0f?+#1O{DsK|CRP=myx zw94JhCMz^Lm3tqGb<tM$=|)%Kq(L>~zQ^ez`q=23{^%$?_KjFGxkvXXbWw)qXoQ9h zayphyqEap8n2r2xX<Gi5^oQ##B+a<OhsDAkEjg=aywVWQfv8~-xEeQv{iGHIq!ctn zBJrSGwO#FEU&j*xu+fqpFM=@wTh#gW`#Xpa3m7MiuU>xl67pM|4rD74xZ#*HpJWEv zZI!{9F!^9VZmel(N!oClTPnJ++ycW#IyHDA>yr~5PYRl41<J}utHGXl)W5-BW+Q7I zD%d}@cLiLxTa}Z?B&AFL+$C>iQgh)+J(|)KQ9FZ~?;Hn7KnN3pdhpu9B^Zb1DsePS zadIIp4S6GpLIOKOG`6a@QXgz627iqqq==0q^++&tT-Unt!|(qpo8p>CRaD)_jha%{ zC*abyL#3A{L0541h{fo(h}Ezn>kIfO!}|<L64znX^f^<+Uz@cWP%@>bB<s`oo#OFa zEb}{}z-bXsD<7a%#a@|;6(8tgd2LuVE*vc^B6PgQ^ByoK<R3?~2xk2SQCZw?@a4VC zPK}Mb0QZKBK@4{z9&=aoir$u?^2_A0)Y6xDqiYgh(yo8X+v~`u#b>0exgT#MLd>9w zcc#aA)5ILQmkk5<`SU-zA_wzqKbtfCmJzBA;SDfxX~M51tHn==fl~24{#Nq{2Fo@i z>ZPAghLGUgxtxbv;OC3Cj%XczuWb9Q&n92Jm!M0u3Zr`x1bDG!g8~rvV(HwBAn+E2 zsymxb{+ax0aSdb6o&3enq^~#2db4igSx1&89eb_!-qJ`H&QA0`-Z_rg71zoqo=|g8 z{XlP<YgPpz%Fl}jZtpkBm1ZRvUe1l2n^^WJ=+?Q_jf^bd^Fci~C5ZC*Z!5sGjkY68 z+MNj#lEWeyO*9u-xdyQ^)likBvdr`^+>yO8@y(Qr9o;kF1q$4EdX>pH$Xdcg4<9$( zmdTJELP|cJO0%V&1j_Nam3Bs!h+}S@9{AyuiKHO66h)bM5QuL_+{QD#-#3$19!`{3 zZc$T?QqoXn$32<e%L^mA!<sqQLBd4&T8u3!6_!;N9~E>5*?s2CM^0Jb90tK3+Z%Oi zClENN7l_iZ*Y!5_;M*$is-@rS1nSM>zW~NR@_b4rdQe)F_nn1-FCTR*JN_$y6|ifD z8niEXI924JOveAQhu+I~ye-J+<LeX~5w9<SE6ibT-zLG7RJ0qw_e@#8Hzgy%Tk)Hi zqc2xLfabXm{<U>oQrazl%Upwv^J3<tgpQF;vq#;D(1Ewj=tG^dE)OOAf6#w2|Gi$w z?7r{TI}fSIl;7)fzN^`*Z)+VGBlm5}i%H#U*S&bSd%U&@xlm}vWh*c_9;|<eD}i9c zU?4M&jPf}B1pP)9)S?tDhccvu#FYclZNLYku0<-<MT6fBe{N~{&7(DyK~Z&=@96ZX zU0xQSq>d0Usq-VY4~SdL*BJbPSlPOL4tnl-z}0ZgtNSxk^Qp`T%f|-jSlOGJ?z(t? z+uqi^dLN9-tT8$H+j2-<1eGMCnTw@rh4QiB)bm&^q5H>k#Z!RNoCggVdd%}*bI|lU z<N6yj^3&L}eQdmQP*G_OPOoKRR?i8&jC3~{O+qKeX!YBDM;B))<f9ol49gv0@bx}1 z_9p+u&EM?nu=$JbuPiF?T>+buO^|PvLlBb0QK7?Fa+!a@lr$b8U0cF~5M>&f|F@Cc zxht-t15_jkg8Fg-7(9f7UoQB|y?i9=1h0l&YDJ3{V_<Ka<E69}POrQh7~|Z4?gd{h zqckftmLf?W<_UWLjC8KqDLP+$d!5ctFH!wE?O10g&25YeL)ins^mmnoTZQ=No;D0p zP4YjNhJss%WWyf@lGxV*TX@+f$Eg6l%(D4fS$VKf_nYRf&bmjjn!m0MSRbUV`R06B zW!&oRW4(|T=b^?v)Tlpa?1QKR$O3b*0R1d;035u~M3Vr-Vi6-~eekUUW&cVVnCpRs z9Bul7wOu7N)0;GaAnv2~z>qm8R?tkHr!a6+^SuV?R?z@qE-?;?p%M$dzAR|}+%=f% za6m_LN2zJtAu!M6$JHEqOeA(JXEVn03s*y>0t)g9BcZFMT8e1}&7J~E*!<Mh4@mS$ z;R$(s-foHwovoPUUpgRLxc*ojKffKLGz%~x_3?6h4(eP1vHII!uJAPh1&CkNVCm-} z8Ko=%`q_7LTf<~JHse}ePb4AD`LoTzE;6HVi}~Mjr;^2gYK$(HkE^MGmqOXDg!XMY znh?2Md-K$O+_;*B>_P_+DbDWHpR-jOCuH>vN)_+&NBV_fXiu?mhCSL<jg@vErd@UW z2Qs3(D>SwMlRBwr_i0sQX8H2+e~UOvsKTD=e#3aW50iD%)0ha!&OV;{hBV1Q9N8cg z^9cWwum&Ruhz9SGXM}kftBsgB#zzb(yB)(J*fk~_n``<D<fM7fv@zG4%TmAVDWtky zX^Y)@3&44hG>Oi7>(kOKpO~$d6b)$1h~q!#|4^;~BGP8biJ$$4WW)&!K0sU@4XChO z9SIl$lMZ^Js8E?VC&&KAPA;JCf?~3;<)?<@)rJ_Q?c*^un<Yk_ATe4$%|HG>2CD%W zat<(;EdS=pYl$_HQ$(nm-4T`bOZVH+3;UBZri@=ZS*B_tXa0tACR~UV&j)5646roA z&}N+lc<3V%F*);5A?l~dXo$R`llbU|Dv=Ji64xo0EB_w!hIvoXA!wE7f&_`yeR~;~ z+6Ye81@V_;QJ-ZPP959I!12Ny%X0LD?fzcJ;ly-?#C^!vPExfS<K?r66HTS))M~t- zHeib=CqEWHN;ygUjz&%7Y3#Y&0R*X^MwpJ0zptx4L#>^VVL&>D%3x~s@l7uw;)q;B z{Cx85+Rl5x8?b$frMg!!{vzS&3Y)7<epj@gQq>E3TW<Cu*uLECnC`i`%36}kkcvQ2 z2`eE3^D+8MeroVq8lDG*yQmXhQc&Z0y|SHjz_8M>EF8IBthlbYzCm}j1=z0q|7VFk z(=XI}M5ISC`X~?WVJlWwNj!C@EAxwwu*W#u52$kvcLQD#griL=I7|jDR7P(>$CmI- zAlx-nJTV9vO)57oxy{jfSHKJ2`@)B7Fi0X8=jbU}Zl-^<N|ca5z^`LV_u>riNuWv5 z5RWT}+V<bg8nun=D?l2F<+e%~@{;bzU{O<I1^Cl<XqK|K#m11QB#IUp=z4;j&k#G@ z;W!udy2XJwmz;EF;||BIR?K=?;e5^SirgW}=Jx5tJH1O5d!O>5@Vsq}8`BVH_Y)4a z>Ag49_lm`a%DeNp^9SaGnS7GYx9g_&+GO`EDo>@?4R7Ak_JHUnm3}o@kZRSt3jY0A zbo6aP2Xx&JJw>BV2F>5?1G<R+ij3NG=MggHW3gi>Ln$W<vW?$R>z6)JI!>taLTCUD z(~0~+i(<Ny9Y@H<XX#zNz3PnNhnusA&$pbNCU4t4-}qCD0D7f)yhZpIq0h_X6~*DP zRHIl!q;P7f7f>z|WX8v|gDckyI;3)9L@36r6zG9HIk4L8^3T!_3Gua2AS^Zs7PBd* zyT2B$Bp0hKAJSKa>ws1`wYbA^N(fV+3IvU!=SM!kMsJpb{&RXb_pwftFNk86jR$oo zMzhVKE6?p4@=EydL9)NRNt~K|<~3MF*0oJjf>feS3fR)`6bWwPI$RX*FAr<I;HV`w z7pJ2Ka=>q|V|Ios(pnP}m$C(4i44e0)iB9{Cm(CMsl1flZ4}>WhHJhJ^GwwS=Bno6 zm%FN5m9BemENgJc;ScK5Kq>#of1Y}eL9r%@)6oqm!<HFhWy1(uGPzT(V^dAp>e$h_ z3C##O0kp&%Dk*L4*c{-rzbTxej0oTt3~@p=BR5)(p`Uv#K9$~RSKgqsi2YY$>)-L! z%%w|43vBT|#sA*5m$f#5J=VZ94`Bu@HzMo*3F*_`2;gvdKxjtRhXY*^GN^VDPl~1K zv7sT-{>Hf!a)ebZ=OnZgQ%<1DQ*4;L=Ln>VS>-Kr^c3^{qZ|aDna4p3nTILJMl@oI zG{=F!;@Q(d9zyssgC5G1#eD}g)>UiD;V<0{^*u#1_gaqgIQ}iVEvu0(zW?lL^F)CM zU8+bwdMf)>ek+Mz$h&;qph?2?7kq5Do<q6E6_a$oxJ+y7u=LTmB)q`FWk3a4fJZ&k zZl4REU)A(C<FIztksfgVXhF?*T7|bUy!tag@8(<7E=-U))u%0SxU=#6DhldFYt9(j z1j<VcmlApR|Dt=}`@f}rP=Nhp!zU`8S4PmvBMrSj=OacK{Mwx6gHG(aJqu9EsuJ;m zd4s3?5QJN!YHOFsaL5*T7}iDmw~i>{1WZT9QM;W<Yb%6pB`0Cr+$E>IHzyxabUg?v z*{-JZruhrR2O+Od#-h_^6NcYRjn((Jk*I2UU;A0mrp5n*o@G)yK#gW;PL4vf>oui< zywsh6GZ1EnDXEbYZxU-k4qQcPix0LWVbbL?tAe1Oa`eBj0N~j*kWA>-0a!mh8nL5r z8vK!kVc}3ApyPx4dVh}xvk9U~WvLF~pn1+?bthvr4Z7O$DJpVUo{L|C$+TK&JLe5t zjL&G`z(Il%R&0E7ex-$AOOpfDH|+s7`7gwYEg_$#eu$Cc?e?o!B}BxgT*!T04hbW9 zp;VyoZA`vI0aR4~_wbx+>6pEt+)vga6V1x)ia6*?#dzq^oVUV%6AF-qph@e%9B8## zz6wZG@-XcFHUstj2)vs3CFb67_hgdPfmhinonmLAOv8C<MMlIIKZSuCGi=7xQ~Daq zd0BAo*PqCPPa(e1lvx05cq*)PaqWuOyQUY2Iy!%e@=PvpP0FIeGpB+jpQkZZh^C0S zgugoHrm^pxrd+uFO!Z74w{fvz>}(RBKb}~MFm4)7dNFB(*Cn4@PP*A*KVB|Jxge#0 zK~J5%gC(d901N#l6ZTRmLs!a;`HX9o4$Hu?(krz@(hHRCqPGRy{eeL0Io&XGe?A8o zY6+)Uy{PSJ{S?X{XvqIyzCN+$Qi$TSW+nymj^2)eaDWJwJ(G(-+HClY4B62n9xM^5 z=v+3j#YoaZ7CtMQ?QOlu@frq<u1;kR2Bei#fbd16YEfA6C++9scuUwyhz5=lMDGf{ zP-ai3og`eI#15F$I@Tv_s=Q=lJUas4P*la0gTf?0Z=7&(2BD~-NfV4LK(72~%is~# zj}4@vx$x|Le_)}XGW@_U_Tw)HWlI;niI`3#A_F-Q{C0pr?D`)APCtCeh+19BW#<f% zN8C9XAvyoMKQoyCw;xcK@JT+yo&NVp!#{O=R(lKb4-Ox()FJL9#alANzx+k`o(i<^ zfR?ap9Tqax#0>w}D{X5yb2GUTY8fwzdK9Rvd?JDjq-#3{)Bz|0)JF7Bxtw2TZXeUC ztU%!HYV{p?;19x^C#no&GKT#iQ~w)9zZ{l86#o2ajl}Y&ayIPQ3%=7>=z{RRee@&* zJ8wHi>uAcVerRwP_Rhb&UAO>I$B$<b(iEaffldq4H+e6DxHW`;Z1|MLN&Y-WvYn9- zyYy2db^8=cp9@%DCW`LbUe2ns++!kH$`NQXjP#y-md9#*w>CK<DNskHsT)R>5gnw+ z+&EqzQ}V-m8YW{@W^Lb6KNhRraxxp`$@t+wPdvATs5zNm!EMIk)G2@!U#0)$QfZA+ zQax4To;R=Tyh|+!a~&W4Gc3PZjKO=UMIGyGDn^Q~W44i_xTIwy8(YOPJO+_`<qHC* z%BDePvbnN_#^O+FH+W&St7^a+-%BYth9q9}>TD|rtMqzlc}wXEvb1m=>t735xZJQ> z+#Ka7pTplFLLD2^o?`%MI3||NvWwLc(>GA2rBy1J$)B`G{N)D+5!9siXrSSPqC9Od z1;;0dhmF>>e{yL_p94$pu;MaX<rJp$5%-{nB&1lsRE5dv2xMpagoNgGsg~M&ay_*u zNj829_nz}%RlG4n4LwgPZY}vNl`>9}D2RV6v59k09Q(O?jmHU$Cl|vJMr?^2728ar zi`Mj_#ixzu57J^R;|dGaS<!zBFtX#BT7%u^U4sy}NW$hAr6iQH3azv+v9j@x3|6+y zr?;%{H(0Zd4oMo6&`PZBG%!hwi*Bee)-`k&bQN0b_IWYzupxSTyu))kTt6hb$4FEV zHVSCxE>se7m8Ju_s|fArN0y))!A(`S!XoHV{MzwNf1Y67b5Aqm8z>&}ecOGC(3ce5 z&X3B`qw!Uy@>4}2$BPGrme&yhF%|W%R{j&Rl;)&9UzmM`i;k`C%P=BzR1kYkr_wC< zO^qBoM_`}8f>=sKJVV;m`e%8|Ln)Mtm=dxfa49J)Xm}6AQNvW5!E{>~vUn-QsSO;p z^e5}Xz$WL;&QdBON;VM6kw@`{pWBx~xyN9vqH_K?=K?R@CpAAWVf(I8M!b3e4~0&J z&ty`muIDe&_d|(z5jqRPWRnG-Np;1qjFXbS>A}mJmouBee2F*XW0LFek1S5aO4H(u zduS(Epa3l}I?7bvbfp){!DCTKN&*}@B0ztfb=DZ7t0Md^!0L;3qv?h@s4}UfiLmQ) z_tg)UI^$tlmQS@2ywMV{MeN#WYTiREg*Zi>z_f>yLxRhk;Eb^aZR4Vty;{!wpuIb9 zU%t5bQ?+#S2|E2}P^CJTsFO3Pqh*I^zIHE!HH#Cteo!=H%@(oRq*$R`++}ITltmGS zRYd8dygv)(`iV^+Npso+f@19iyXyXS3pqAr1ILoR32=FQo&7o)ne$^DM9RMtjwr0H zera5{N;?*R_uIiY?_>ZWun8l|MJ0YYU^;h|p%sEa2}jfMsPY6q$NJU=>RW4d#4e}! z7hVl$>C=Mb;suM?w+c(UzkvJ|U&XmRPx@rWRh^WaI_R=%JGBb8Ud+|TBT-E;KI<?m z^Dw`pGfi@Nw{Yiu(dRk9RD)r044+9m(%qO0>X`5}Ku;n&Dw&nmgyyb>Kjc#N*4rHf zQj5$Rtc_tvK!~Ix$&gf$<CoL$8oo~fPlEz1dBbVlCI{%8E~ZMdjhi0P6yQ9VN<Z|Z z2@Cg?CSWg4yK;^>h{v@%QnuO%v2Y%Pq%gsUjMH|~G}E_{gh-?ZFUX)a$P!$=thsY% zS<{e^iSziH`;D3<xc<n`I{87lg;iWBHI6W&Dz36r_%W2WCIe3%>L3_Iea~B!ZIu8} zQ!T--lh=O3vXeL`O(E_-GK6xORb`8iWF10Yl^KN9I92Mi$%w@Wt7^8_c5l@4LJNXj zRuKOs;xBW3QK}EhM7LrX>C3p+CNUsnWrbMp?`!Acvw#{^tU;E$)A3zI{e&@h$7^v< zTP<7+-A*Zi7z#pUhRvYYJ+FnLZzBN+M5PvOY>66Y9m%FmFDw1+ekH{oF5CUB!M6)> zr&}@T>^lXg6fJ?XN|w>T1PFCi>$>4Vc7Xwf?cLNSLT17=OGJ4iFW@l{F{a<18hWui zXw0<JmyhUF3c@y16`*j)DJ1|t7_e!nAR`xsXs(X**<|y*h+DJr<lRsYSeydVFf9Lr z@N?RYsXRBfcJ-xdMdEUdkH1RsncSe2rz&9NM`_4+t^8@zNbD5;8k;%m-zO<9k5;LQ z`joT<%J3r-Gk~$Q>j3l_k$2f4&}=D(&H3_L6HQG;?`}Ub`~drJXD|7B38mOl97qb4 z*MAYx22TVz3mqvC3@bf%{ea`3k%!D*lNaAYXT9rmd~0Z4r(IZ@q4(^MKze+^x-IsZ z17NFbhV8YshDZ5Z8bEDH!dp-z&p!-Gr6Av>v@5<ESNwGi@BTFM^QB$e<u;a<M9W0r zA)RD|;&(T5U?U>3=dgIhenG+VnD<nk)r>f+FuSyr$*I#m&5-iG_W{5E<oS4=Jg7|| zkFszn&Pxb-Nk^1cgYcIhml~#!iw(J6CkvWCxpDV&^mK@C0;f6BI?=~1_MQ&6pZ%V0 zwl1zLw;1|CL;4Qf*XB;^YfD`numm$#Z4=rX<lNJ)RnvJ*?tr7#z6uPCfBSMs7+1jC zwfDc!?m<Uvj@%5^7eMU*)1JfOBVsenvLXHTH;5>@j-Dlc?X+-NQQ^xE^~(0*b|i7k zyq3zbG?&6QRyau~EgRPwGiY1)x|y8@vaX;qR>tlDkF7`r>y##M)KI5FQKus-)80gm z7m4{H4$fi^uh{=2aBPeecYxxX1$5%4U%4X&o@;pk#9~nW3=na_2OJvNhUoGp4&VB{ z4K|`La8mL#?4bBv{NGkXoFe*S+Sa}^US~^eWnzOv>#59XqM_l1hfAyz6pN_=W@4p> zrVx}P9xWk3^VI)ngZ8H5ieG?O^i;BtRe@aW?PKmx<Me%i1A*nI9}R~2qYfL|P5{{V zid}SIk*}*B>}0(uS;SpuCi+vL<d`a|e#={S=5^p@jFK?w+1Qg8TSlG(iR&Jc-wr8f z)Br}IQwv2p4rANz9Dkb-<;j{`>+*&J(|n5CfS<_o-{p=0+Z_8?MKi?+29AGU{}J^U zAZyW7F2<BDfS*AA^&pxP3@6Fyvz*PgI?@Q}s<*Y?`A@8GzwfHCdRuk`qy1Yc?bX)o z%ejZJU}+pYV0jkeOd%nlw}s;7Uy0rnHvKl%xFbCC>g+_MaZ^dG^J?&yF@$5no?|X} zuE+DJb>iXGpnyKHC*?9aOq*c!mzx{We2$23r1WR(WhXtvbL<oJ0E)KD_*F-wODS;u zckRW&sAKu!=xS@@nxO-4r<+1fV$leF3!#9pVDf+sj0?k)diM8V-;ck-&##Ej9uV?k z&5?R_#GHhPBb7gdHSOQolGAa=^UrV1{a(uV78k)uk8N%Kr|X&?k?ME-rXjeLFE$(b zu1d3XWz|pdaXB;|&BlkYKcwRE1V9)<a=li7rjRy|%neTN%ee4(oPv5#U!;p&&R_AF z47_HKW=OXo>kLBj$6jt5J91yMAn6%DAwG(!^p(|m^~ytF=I&=F>40PX%Cuxty}d1^ zh@968$HGN;Twi6agOYDd(qKnBo?N(RZIrmxEqoO>^MZyRNgx$5p;Jb80^+=i>?JJ+ zuv)3}W?+MVJZdVtY0!1x_bk(Oys)<#9<%>)9qJY#pLGcP9dB0sjn82e)d9*o)lpx0 z5)+1QM5R*a_d8FzT#VOlXlK9ISO>;JHApf{W90jvOCby$auCV+IOV=S_aSZar2#O` z$|%?Lv(4{h>$THgT<f05KY?%`22SW6_<IL$Of1Vm{4nohs`}F2A{9!pHU<jaEcVkm zolGauxui^g?6IuceHF!h+47UByL8h_vF^h)>*OU)!q_)Dr6UEW0fyYuce8@NF{UgJ zwv+eUPKjc($ZCTbb9Q8Ls9N6wT?Rs?Hqj_hG(Lw)n;7p)EsFQ(Tfn`C--B)tq?z>x zWhNTx4k9<nk4D3CG*rzM!tXC*ulO4XjPT(yXmoYMCN2FL<SKol?JM{KWv!mz)GFYP z--@E7%7;nY0~dv-OM5x!>W@&5Ns;m37+-y^BUFUyU1ZNBUTPh(MVds)cznjvFcn-4 zl{2JB9rB@eexo$09RZ$J`{fY}2COT1d!mq^cqz~H66hGl((Q#>NKn|BVPZ7D&Ry6^ zr!I8jg=S<8sHzk;DKPRK96Ci|1vQThGxLlfqZ$*klcPV~^ttS9!;z6N$KB3JsCNGG ztQRq5%g*n*iMLExh1qGp1%LT!=xvO2cfAkSYBBS`aGnWa$^d=j_$_@LQ5(3+a_K6Q zYH?usZfNp7%DXNqe*(*J^b6|fE>}5qplGQ&2rt$K>MKZMu_bHGN1!S~<=t$;hFHp% zq<gvbJrYAZCj(~ECgmb4KG3zoyfdnYZ;y?6+qjWCX^_1Y4oZ&~RTPmiP&Rjt*<I(H zwRkELhFs!%EdkT_?NvCIWbHvuS{jDPal*Unk}hxZ>RkHvl7_B6!*ttmmaHaI6s)5y zY3W7>xhDP+a}6J1m6IK2Hsw@x|7Xmgfx}JZEe1HY?HcTSfekGJj>eB(QzJ5eco<!A zgKUO}I46QVykl-h3w#v08f0D-HLu?nWR7lmsBtxfya0NJn}S-rvM;6h;P3e4aiyq8 zu)V#%w#I%@Bo8u|+hStR(sL7|GiY9Hb3NIhp${jBb;iz4vPy&WO41Q`SFtoh3SY=& z=knZM@gz$-rsbf7oXVEvwjgQ^ShCHnlXcn1j?5#&_GMyozx_tFF119P$=RY)v5l2+ z#2TNFaexE9LNdo*`|vQE^#Sam-gFD!@3R>eW;(!Hj^GJ)ffMF|YMknU4y<yMDLJl# z?3i+UH(aELUsTeb_(#@e#6XD7aw6_m8HD)Yo}G$ivW0BaI>dO&P|J9L;Fd9bVB8Sj z44ZXrLs-rP7PQc963L~t<&0vy>vw8nn~o6B5MU#$H`UKh6kHL*ubd|O9L|}t^3f-4 zT1De13FsI%5H}BvW~}yG>Sm*cV}mI6=uG%vnQilf1cz}tMLnaIhCCAER>I@ETM`@c z$2ZBLF8yxL!>NGxX0|NNO!G0a_jL4HYSdxJY$P*OO@K4S&;^K5@0fFZ55RplLm?Nz z1Mp{uRE)_~P)MAHx=mb_!(#gMu(z=S?P{fq9c-|tG>LzupncNq5?mXd{0<EGD+9@& zs`c_sY6SAGRe%s{R6e7l4#pCfruBbML{ioD)uY3gC7|mNYPt0I_7tA*{Bcte2YWj6 z&fdtP>du453~?L-c~YE|LfuV9NIC$qeB83TvtMD^3kHm1_}M8_`VgnOB*l5dXole4 zIQ*N0&BIad&6z$k*Y+i`G1KtbSt*d&K`C*hcblTk=B|w^((ngbxg_=PpG2I$a<fi1 zD;ES2`bZsRT{%LhmX7WJ2GwVy<u)@f-x0e0&AWWNCBuD=TnE9>GKd2&6R-xHO@eq! zSR6_0g==p9r}^gU^uWe&!`=AaQ!7!bR-lvSaaqLK;CYgz<J4cPrnqz_cXl-@_z(a4 zo#kMC^~84A^RKjI%X1cHW_@vT5>YRUd@fg}l)uoOI0<7)yy90VxoFBPl2Pux?`(;c ziie%VJN-E}v{T#|M{#Tpfv6Jt<ltm#cAYX<I0nO@oD?P<uQwk|{e8nV%MuK*pLBT| zu&ftDQ&T!VD)WCg1eVD5n58swG>p*?$4r#<s8|9UugOjH<QYEl|Dfi&G~eL1?<i@f zgN%};4LKP;s$(kJ&#eD}ugc#RL)Rx~hKa{JPAia-ZhFXv2?jID2VkNn#^M)E6S++U zC(KM)5n5-}%$p;)k4o+ReWHkm34aZMy>UNJg0QGyH!ImQ4I!dvQ7%oXi;ZnA>bSm` ztkaMk6|Jz3MbVn;WUP_Iur6g4@8@>?bydqNXQ7{uQe0~klGew+SM_b{gZnr5g{_80 zp+3i^)JiMe>@Tol4)|bi(yKozo=mrZZ+zLhneK1xTG#{>tGFpgT*o`%fGdVT^PCbY z+9a_;mawJuGBOLaVaTrw5&gL%eL}3&PrUm|WEpGwxAsx`&i)zG1_|YK?obipd$F4P z85j?3h2$>8C<yr9&eic$E+fNSSR-2IFP5D<T;Y#3tZFG{D&Q)Xx!MN;0ruoH8;`tc z_7Jc4+;4Hq))SxG;OOwM%^_Ijs(4a*Ot!2X`;~g|@`v7ld-ODwtYt2oxULfZw_z)j z^M+Op$a?*7)U>>QN)H8%xn;^1{<9!+W<OUdq_fC=MeC%Uze8vXOF?Qc|JY+kOO_c@ z^XLdxHbVm}9#C~p&%v&>(el`@?e(c>)~2;)%NY}bqn^7~N<d6Q+S;?#cWjwV@EyW> zeN`w!FDT1Qu5=)_>gl8VmXkjUv}$E#PrD+AS)CkNh2X0E2il9nuWTKV#b47!i#9xE z7#=3U920ReC-vFQTKL=)wG@<nsCuYwrI&5c4xy9f^Z<i+!lvS&=`gxO1R8X{*n8vV z7|IWm!lHWgg5$G99I127f}ir2<vYYu^3}n)o$#H(j1rcJq#QCP!b(=i?78OZ)a&+) zwg{iV!y@_{v2MjGgLGB?)YD&8f-lwMXGeU7Bq|CxP2mlsOH~Q6Y>@Nu=?GRbZbdY1 zC&5VkWI*w(AkqaqOy2W96~2Y>z~8{H2L2JOHGv2}s`+~;)A~vQ8^6Sb>nu0h@{qpx z4V)&spHzm%)wgl^*%I7)-lexzYoxncdKD-Qcp97IU`lJ7Mt|Gb`566@=5MTF9P^>e z{G;iD3S}}(h=ZK*Hj_lfYRgV}?vCQS`|$b%06xdLIPFV+@*5}D6gA9F0gu<IwAMOx z0~l$dmP{L`i8Z7dru{ydDrTnU>^4|silDneM@qBZ|HE?ReR|j*Ee?{Fh9$n2xMqUs z@*eoEK?5<Zi^>cGc*<g&v{7*$L<$<AmQmv)nsJ1(Gu|Z#2^a;Vlw7i>xWGr}kY-#^ zfiNb#F&ck}l_Y*rbOW(;R4vogPbo7*2;cZecaSqDm$5~PjzP`D1MxV{SHFzx;X^~t zU3lCeW+!6w$KNM`G~={{i4~FV<IjYOoZ95yNy1T4rFKpKAw~=;LBlQdER9L+Nf^?d z85=8ZoSIrjbe(Dsql=zeHxN?EDMgt;%8)j!8OI67T!#e3nHGE??0BnYWQ_j^@-KrG zcvc9m%P%bXuP(?|lIehV2X_`KgQx$LXMTri+)_ftgK4L0O7!*QA*+56Q|`3Pm^VC| zVFQpq2m>I+fn$g6t9ejA^?o1y>!;-Ym+S4*jN?E3NrT7EX$1WHSctNP&u8QIo;(Ni zLPY3~Tl;R0Q50W0CVYHrzSwU>9|#^nHE{19%cY(FhRnFUM6fj|C`$0rpUW`b^<m{i z&Tf{NAwWdSA#%gc*YQ>Hb%(oJc-#tcC$Dduecb@J*w(LE{*+eSDZ9PD`}-fk57(RL zm&dM+bF0Sf*Z`f}h>X?9&_I1{d&KJ7`L@Z=w|{f0+F_R?bkzt1l3ijavs#_}T=ace zv+ChXP3+=RD4T94kxwT?J3jBup54#l;nK4ooo8g0PT6bJ9}8%{#xzB}1+yn%qz!Z5 zl^qyZs}9DDSy$1xRQ}vQa;m_LfP^X&{U55{Dk`of+8Pb+?(XjH-nhHFyE|cH!QFyG za3@G`hv4q+8X&j^xqRoGhx@<O7(GUB>#o{s%{kYa^#Ch=$?QGBp9X}is4g9Y^xvcu z=@y~d;rBP}$$hJ7=e%z9A+yJt^F?m1@sPYt)}9X!a#5&hVhnK2Kh^DW>>l0r<^L16 zXDuG6{id&)IU}uhQJ7`7Lc88QIJZ`oWE4N^xL~0J1`wUxZII{Ar=v4=u-rH!ptb2c zb?@oiI7WXdlmb;jjBPOFoAzzHeuFFRXinI?%eB8KkKKfp&4AWB@$nXI3ze*opPRf1 z(EDAdMLzDygfWg2D+<ZV;RB)bw#2YPxaVvq=)ZVmra)L^1<b|x#L9Tbn9zLxQw|jO zEw6yQq?vZLwn?HC#3wf0Wn70K5%d(Ka-BB`Gkp6EkScp$y^U%#e+=pPr5;IVFFoz_ zNhp2i9t>NPnW)WDpEof}m+?X?@Zbj&Y@EpT-pQ;@KJ}j7!33KC$`Q9pM3kVE#o`G* zZ^=a%NzZ)#Wp{tc^nz+ZwWq6()qmJqQcjGUJ!(Z0$PU#-RrEre!B8>{skR%j9i{^Q z_1TC3ezalpH?8kY$s3N=tRHX5)rHv>LZI>LVbfeNYT56cc=c2N1danJ4a-c96A7*V zB_E8?8Jfk>SFKUmOs29&t=U+umX+ecw=FxK!aR0F6djkQ>Za&ueVS{BRIgT4>~fvr zmNLu|RXU3zZ??5p(9=SUIwk)-rT_hw%KfemgvgbeF)!I0*o0KB>i+dv*k76$S4kj< z+hD!^7<zwMzC~HiXC8W$!o4TbtwqO;Szw-wD(X9{IOtV@uWvB#LUlg>#Sq6$Qi+1~ zQRVDV_3b6GU*?OWZRAaS+CO_X7V6CLzhpfz!%&h{y73zO4F;31cGSM<aFv(6TeKHs zz&pBAyoyex+LOGlK5t|XXSA+GF~0O|7Cs-reYs~0)1T*yIELz9rNk{xd+EX4_l_$J zuR`9Qx(SsWAgtd^kAoMQkA4!zm3hlkqst862K=u5yL3Dfic5uj{V9ge{3&-cRz21n z<9d`OtsXa}Hk}>=a`;V+cLFt5i-PWd1C5rF7)Qk=^}hoUYaA*ta;P%9cVHrzFFS2v zHP}F>jyE8gpGwbX4uX7sAY-9;8fj;f0pr{|Vf(UNJ1fTv1YBY0{LsY~jpTg(s=lh@ zIZG0Z#huW=4xZdjhYfL8S>AF9LDM{<z_n0bk2!JGrj`?p-EVQhj<RH#6T@sAz#-3- z1O;9rTGr7E3irFO*AeH5)#YC84-So@NdCKF=&#Y*T8;C)XG~Hk?~x5Q5F#0W2Hf56 zTZ?#Ve!9X4Ll#gIy5TQTIs6D^E)ZHd+9c0lS(G@mskZu-YS08qSx@NO14!PA2pYJ< zk}2;Ulv>QQ*;*`Qhir)vR3_0&0ReHKDC@_${@R;U&mwbwOX?kXA$*zByd~FnKdZ*# zFZMk9-QoO{(Q?s|i(fG6c7IyP<i*-<ka-$cQ^RU?9PN7cWrrDgz?tkAf-Ala2w=0_ zZYL93ba&|vI(PFv2_r(tNzRoV1hC~j7m>1EFLxCe7I*SY*#$?5z!8wO0McN1CbDMR z9AI`|+ajVw$QIJ&!Q-5Gn!)CDh$j!QcCjR)qJS`E!a1ZbY4`4t&5%8?4SG-Au-Qn5 zIwJEuEJ=7xeoigUA|bl&T;&8o_VVPn@K#)Wj%@+*KK9;vMs(j%QVF&W(5JnoGh&y* zX8y>pAAfVJI(o;z$>X`B2cE&H@yGLWiyVy&!UD8uTrYLQs<m~>dsW=A48BlL>|P8a zo~1GMzGUgzi_Dp{8$RJyfa%ogXq1Pw2OWXkyx<A3b476R!1(<ul;yhe3l*<oX0<cf ziC}k~^Y`RrzD#tMd&|4qQ@m%SzH)2<UkiePdq1w1gYSGCQnh!&0F;>jT$jGo1)4|l zEbc4bYi8y~KbK<;{LcO}Ix{-#az1#aLhoFGAI;Xq8MctM!akV&r>E<m1UL=iNxX{8 zb^9KaWeFTj4kLndWyD?;r&Hx{dvg%`G3g^(5A(x4>$hvg6Y|R<&R-_XK3jyj4zBE4 zwN!AH0iOj6f`-sY#lQwRf8U&<7>}81=GJajLcd0ao7|*R%~vo9x!PY5D-or4Nv690 zh}GcLD3&Kn1xmy^Jl8H<`$@R{4OPo5dh5#gGnJ~=NsfPMG4tU;logD;pdfE{dmIgV zglM9^2RB4Izh*CL0~E&IN(qXSQh$m-YU#NbzE$piepA212m#xa9wWBTwHifx>{H=~ z-jyE^ka()DBD5-!u4q`bewsfu#A23!o~eSflcQ<HyNd%|<;tnLyGzJ^Q0Y4f#re0I z3tuti+qiK!YsZV71WN$ku_A9_O}NrA)us(qKAZQOW81$|=?I~Brb+1Xi<aRoqpIv` zVwZ`KT#mDhMxfUJ@7DweQNtWw-tV4z3}IQxsMfgz5O}h;l`Gvzo6M66{i3B@&sdhn zf;zIz<0SBC4s#dC&@8Kn@|s1`3;AgZc@F%ejWn8zUo?#?U~iT)$zi_{(~EP-Du!hp zw$ZVEzY2T5$NO0gGwY-4SHS=nN;tAYl%AT88t@LVLIBh@GJ4n(-K173O5uTrXc<N| zI^TGFe>T0a<yF`~Qn%S`otYlg+56yXgwgwCNWjflx{?$U&GwK{0l%Nr(Jpje`riKT zmOEip5;O7gp1<Bl9Wfx~{?zxJHg-BTGc`&0fiw9v>RD7=SoBtgg>Uq3h1{LK0`Ir} z83ag<7YV?n#Z#4L>esFu)BTGa+i45|8XG|O$7s`rNXi(|Buknve>D2<v2+U(h)tz> zs>Z@qI<G#21<Al91vkHb4WvEmGx{I{45b}eMHq=94W?Q;<k{y=oL|=yZvBDI>*IXg zW$R&5xw=evRjE~Teh{5~9yW;XOa+-<`wm$MNT-COijo@Pzh7$<8~Xwh$IzU*;IvZ@ zqa{0Lj?PAHKfR&BQiq%``c<*%@x!^3t((aH1=FIFye;~zPxZ%Wz*tj1GDsU{fx^`q zyB}o+k|*HIpoRS}ole6mT;sussvOo{`vtPQ-R({w+D1NCdzY}~OAxCWr4D;6iGp<@ zVDwjC&mp^S-z{@Z7S_|B+ikc=R;fz06ejKDIWLQ#P%hBD!-(0da<d-|BeOdX(ET_d z<O5t=ix1)u%*YxDz-j2^DLt#*?OpeX%WhPzif(8o5~LF5UTt~~u@9w7X7s^hvUj{K z5m1d(r|>l3%BDtIvHK?JSD2dxL{|6!sq|-yH;nI12g>xNnQEeRVp50y6VXi{1>$wZ zCz!<M7#CF%^a^+?LngBSJR``|$)R)I{;am8OMtC%F0jJC$|4fua{<xT-&`@_so2I% zqH8pCyHe-$YE4dkJ`8b-kr6eXbu3fCko4u^vQ=HWV1;ze_i#iu4BaII2%rgn5xOyM zPA}=uir}GLCGLUyzexTt4M$Y=!f%|%wIQ}rrHek2D{>2A=_4wmb)lIr@#uw_3!lwA zCQ%)2RAa+64xoOG@f;v0XjtA~U^=ex4H@s1z9(9#+PuN7^!uCD_9)j^Z8-^i*MC}2 z*r&}X#n1gcB_(7xSsYgZfNE-oGz;7{pJ%7sNraim(r1IAI>9@Xyz(}9Qn-8mn7^!$ zQLvsn$v_bsbz0SZw{GOGv|45=s?r5lR?o7!l5S--bYI2Ugs(Z>N$WzsyRT8%cdQ~` zKf5=uF7N+RUv2Zd*<~!9e{?7r<Bo)|-Swq34f!x{`0ElKkXz#cfD+0R7%~Ui9r)np z5ulC|E%W&$1QyTf^LcfGaacFpO>-=?mb$-L(A@uF;#eI9&42tC+!wos8~B+k&S&Ua zivt#F&mq)`_hy3WC1=A{>7Fs-Shamj&3E>?%{&HrQQ|BVT;c25-b3#xr>1hC4@-46 zxIDZnErYWj>5Kr~8YhUl7F;1#nN-R9-HJB94M&`oZfqeNT%hCa-Dd_0q>>b?inTL> zWTR=PcM_)ECj=ey@%1j@Gi^#%C}`AFG5kAvF!7gC%1a~2E`0&zYc!JZ2o*7z@@30S zdqWGntd_>^f@8A^lc_!R{e+b)*pd@9DpEoM72jNJ#5>?~3T;OvIcWFUzV#W|Stcy% zvq(uNy9Ulec;LED(0hA3AhTW&mandNokzRPFTf^VdsK(&vM+Sa8~ipHU*p_&0R)_z z_rwMS2)X;{2@<Ghr_iXLJS(%k9=%%H1PcAK+<RsJTw<<2o1q`S^Jk`~@NcsT`p=dS zkk(`AZh<9e>i0d-^7}(#>h}XFvNp<IZqZb3)Uw+@>z+t_MR$WD{WQp@&_QD_eDOx& zypXy~3vSzAQFQoh?l+uzBBf;D^yE4u4in5}BsFE7e>l-)Gx5dTw*1>vRyqsne$Xe^ z?U=ubE`(xP=MR&SO3p+&rMOM{GA?B9M!^D7H3s+vs|**4CZQLr%M>eC%@ig};t1*r zDVjE0Q;19rd5r3fo(QYEp|~D{bXX88pu^;+-HdEH1PJXML&ki{eHLS0qmb32H*bV; zSCT~`d}rga<#_2Rwtq8WCh#eVW<pMUP(d|=GV_}Kj?2#dB!A#j8`T}h(bD!3!=H$+ z-vb+c<I9;{(jU;JOuM<o2n{(;7n^fE>$zMeNFyJDrA!+52q&`9XuL2FDCnK9p>&Y# zw>{O`li9xKW)jSk9CJHk$$s(ejt}Ld6#<Z@gf*j3CxK_>*Zx=jF4V6P@4D;=<mX}9 z5U)%MEG!}h{Ff{_QUN;p{1=0{3jUHFkN{%E<EFVwqkeUW73;^|I;C`S6xSAC3d*s1 zoVqJo_xX1<ZzKcDsAeT$1B0%f_B<nncl~`TQIR@75bH7C!(#r_{p@F2q5w~Tl<Rsk zIJ0*4*x@8V_anK-C_gOP9#H{>d*iRx*@At21r{iZoiKYVn+H4%(<vzN+jn?_Zop0D zod##8snb_T0qqZy1u+~%U2TTiQZLG4s%zNznCd~m0-kTX0a=k#i@&gyEXN#<r1MS* zYT)&KS&^2KrzF&he==AY3H+K<Z7%|@8h*VHhdXCx6ym3)Pbv5%nJ$`<q6w!>i&BRJ zk3_FpS_F7HJ<zZAaf0@BR?|%m8hC9-4YDZPwDtVA--&%fwaM-RkDnXpa*|iUK~suR z9dd;drnj{E#8XxGexzF&cUqsx`TV1TZ!{!<dS*&LcYgl17+v+<?{hz-tP_r_aP@mi zKauAr()qFizniaL46XQ+oFjnAE};hUjOFb9(dw-Qltg<7|GRJ{lJ;3<0idW8-q(G_ zoV)5sZeC7ztYmRxTE8m#;FQa8_`xPkYBM&vz*CGV;lMNwlAjUI{s}itX38-Ky^r_< zO^Pb{s+*d<<PQ!s^|RY~i$Mm`28pQ&y0dIuJvrgnQMUJ5h$b2ol~LD|^Uvn-%2GZQ z4Vg^63cL0bS?f^ejoQxN^1zg?pq8RP-eOa=L7I%-41s1JfhMV~m}Gefc_e9_%Ed@L zL=k#LO+62)Bi4*VxYoQ8$FEPhPod)FTQFSJDUxHXZJhL>Aq&}-@wZ-$V8jv`N!HC1 zma;GGU*Z3t^>=`8^Ed2F=@reU(l@iNB?~u@0=aRFuo@GxMNCfFjsTYMMCd<B7hvh+ z;e{-lZhesAqh+yVoJm?+p@pBTD1zr~LQq>D?VyfBGLpDtk{7ES)|rRL_pO0YlJ#r! zr4mJ!4f(?fYJ(|1^6^HsR`$9i>-O{do4eAy?Z?8KZ~_CDLK_X*(QbRnJL4Vr!m!4K zZARcY_bGg)pZ-Rd9zawe^L`P}y(q8YnW6aJw?KxPBZ2<2fpasviT^lpDe}0_{U~^- z#><;?#P)8pNlF#0{=G9ivUM9NmyNegQYLUoO!-Gm(>z&EIb4z_vrU5>UgbxE<P}Lh z5<+d72S2`|^CuQ!JRr~?L7;DjAV2|A%uaQesn?E!aQzMWS${b|P~R{WwUulXsR4GI z{Fo{m2t~uUKvtdZi(I$~6)LDM84_1|%ku*}jN+~<0E{!;T9#-+RUJLkg$cs9^!y+* z>&=g?E%0Nv(3kBc0+|8>*HJ2u?jVzVRdQrOr=nJ_^8nYvsuph|&851&K~O!NQo{`l zhbqTq;q&kU;EBF1u!v4*k^QvPwXKh8&SpGcqx$~aVf>cKqR&QNQ+JENxA*i{I1J~z z$Wxgdu2rU=2=RMVcQ)&rRJ;AxJnt97&s`#0Pq)+OT|cL^yRsxje@x+KA<&Fio6d@s zsIu(f#a5Px>T;cpg8iz<y6^78UA)pM10z2Uir^G|0E%PZunES)*u)sjg&w#?8;X&o z`qT@D2na|+_y<HOehY9FKLjmJB5~V?a2Fyg9?@mh_0O3w`ubG9dwhCrjWXc%!p>8= zB%by~`W1dF-QFMt3}F`PDa765z$%F&%k{&`$GK_A|J=~<FGVFX5QTQEj)j(y@jKvC zEE#ae08+ti!)R#tF2W)&l$e)~NnfuJ!m(4OEzHCAjxzn>U<Vy?qGR)|7|DW0ozxpV z!=3ahBJ9{vq|^o^T^h%_!{-Z`h<VLsCD=<={85uLi7GG3Q+8ww?Njwff179lbZC1u zGDqH?(7_heJy2*{8W0H6y{if$oYU1`Em>P90STcUz5&C~Yt>QuD!`JJbG9@``<FcH z4M988eM^k+@8})3r`*1%;c3x4s+c7(k@J!A)}h`Bp{pqqb`&IX5q!G|HwNmM8OnmM zmPk$@OqNEC#85tNifKD^C>k)(U|n=IGo5F6S0W#BsdkDXY|^o|dxriDrPP7%f4B%Z zHbGCKRfI}`qKqH_<^32{O#p%D3QhXCN9kimIB;2qJr@h3_9Ma9DFH}zX*6HzHJhEA zt%X?lR==GI4)W<s7ux0kWJ6HicWWeX)UERdO7AYz;g_^6;2cJzl;4<j5y^72#p_5{ zv2aJ`@E@1|A3Pr&7`~-2jCCfP)F(iqmy&Cxr^4(*D#c$MAGbfsF$+js;@-gK**l8N z<_V9?rf}+};&Y%9XphVWJ{w_H6s29psF%m-zgM4JkUGV;`r?0)q=QH0k=`J5bx$@; z{rX7w-=WU5axsy{u8=~JPnu}g@)cF*xhq;#sJvL1+<EjdN~BK2i$a}vK+l`I__yC# z*RPphk^BZH(f&Kl4$;|&ha20oi|hUSA3r~~XJ;-d^kbcZUm&#`-TO$F2H}>P_Xo)9 zD`{S5rI?q%p0j4Uf9F;mt!X*|C4Ep9{9yh0!L5A%-30~!{e|ay9r5OV!2hIkjx#2) zXOM?6-zTyKfX^;&!0M{ifW6Z3GEwM-Ckba&j0u{i3)2fx4TiJ78r`T4a+HrW&aJD7 zuzFtNS5W9a(G~q_VuVvOyw{?m@XF72^*H3{<9ldK-d=qcf|SL5tKA5k=mT$i6fc#Z zp&>+==LH(PouwX_cPw;BV%Ds(#$&#_)b&o%Zx@|hL9s$Lz~FC$P$JAvv9^{?l)zy{ ztPfd^d@$anYOy7?&?g3~ZqlYb3luDC6A@`f9<7U*m!>ALy1v$ntxu)z5LwF50n?h$ zYeiNACa6ZpwACpmBc3=6vo^zjvrUnO3{~LPVMjJnuWBD6@97(Ws%SlrS7g$`n?lcD z82XzHk2DJz_^pc-a7*7`^Si$W>h`JNe=o@oZk+}>rRD<V4`#rX88N@;izp0J<s9ty zr5>Lzw>8B!;o^H=D;+USoBviMG@hq>$A#bDf&r1)m5t_NwGi`o-qE;}jYy$=N**OQ zX?YIH=(Ntd{N#yBJd7ON{fC9^DRrp9JlACXOW;MMmW_Ax>n>0P=Q*lm*UIAxNl!PJ zS3`{_eZFdUy%sA}C5xE@iOMFT(&D~~kZu02H2H!c$A75p*w6=$0l}_wr4gD~CfLK} zFWzw;+%4Obkal`8!*3VYzj$M`Ki0L!sn0?XriAw2N>txZU_{;pu`hoO|C5&vI*LT~ zZwBylK>v3g3KuQe9mW#DdYoR(6klE;)K2M^=*JWCo7j=hbr!cBx*f`~D{?noS*6&k z*z2=>z#A1y5GhD;bFN`tz`6<|T0{tT<&*F(_?((3V<cci>7Rvoar?^yI=k0NJy|sZ z@A=>D@40&yA@Fz#nnsPB8+;5+fRU*eG;mo4^65xH=Mzq>&UMm7N_Zvk$Vg)>w4PM{ z0izK@eV#OjP166pjYz>^RA!^wc@HE)jJf|`;#gIY?ZXbrL-Un7c-|!0CF)9H`uFca z*^J!ySiI)t4+82*Z<&9ksqY3Zns2G4YtOdldQRE-4HK}EPK9Xoc~42!puFoNklCQ+ z{2=KKBk1<fAmJPqb;#G76D2Rf>A0iqd%6c`a#Oa-9XWbIQwW8yVkR2{?V*bDTwCA? zuNI5UUXe@J9+eMZkResT?Sr%Phl5FCg0yZnt{n#*1gN9=U^&Zzno(&@QkT`{HRD6| zFbooz0LWGG!dJ9a@qPsRpypl|t93gYtR(lU-}W5(ky)TVFg(=TD(a(%pM0ZwrUv1W zlVxK{4`gofBYaai`xBqT0Bi}3(ta+-vx~4MhTWOUXzD9+k~^(#{;^(NQDhFqe_tJN z^LZ6JFxXe}Z`pQRjmx!o@%}$9;t;Tj*jW=(g8!dWHhl6nA<oU#aif1+8zY@~P?nKy zb@)Lmbqzm_<y<XU4x{v<dn12&c;fJdR*v9>wfZ8t-W~>YblipN1N+;7IotpC<3v6t z$d8>O8&AeJl|}fa?Qh~=m(a-nM3z$&G9RrTIvbTyevK@b2r{&xKPh1bH1-+!d)T#y z$dZ0TJrD3SYW}Qppz0QJ1%Zgr?!U#Zrsc~cqNz&%_bCL;a}c~L5~_4T6Sh>F#m-c| zvOVhR`nso>8HtFqz%h%9<@5oo?bRP#+j{+eLoA}v$L=60-Nm!t)|u?T7qxlhqZ9c* zUrP#gxxk24KHQB?CV&e2!1`9h)L0ITCVsCgdwW9t7@@J&z&xn1ek2h2w=P*k%wjM7 z-jP-e4xfP&_G0K;;s6w%!Akcc?aI)v#@4vVQoV@Y3YMSu8o!q?;(si=AQDAP=Jt@; z#25I+Ob7Hw70PV?zwdH_J>2Y|u@E#zxfD@Ah&<yKu`B*%9b<5S1WZyAjZ=C?u+tDH zYC7pD#{;%GMn8^>tk{{(=P#C+JLIJ6N~cMY#Aj5EG?vQ^9yoF}=sAz6tv}P4ti=d9 zg3Y2h=3{Rnl|cA!kk5obqZ_S;7lZ(x?D*q+4BIv{zmtH<>D;6@G82NxG&0ja3iw3X z(>mcJ(M;AzX>y6){w)@<@2QqH4hOU4zsPUL=;ruJ=b$bv5Uu)Z7MJYQBSP#!z$soQ z;&if&-N*FY|36UCfakSEgmk(q!{$i3t%l59vh&9TmL#eLGoZ$nsoZ?7$-H9R0-$&O z<HvFE`*$41oF+G&4#IkF)R_l(JhvJA5S}RuOO?gS!Ba5KNX)QUt{~8uw^ouOU2F+> z+^jxHwbwt+*xqVrNh6`Vll&YBn`GpKTE4V8^{=vqH9nkw{Vwnjw2qQcn#|De8*>;e zSq)jVJKn~=Ze4H8p2|a`htnSZDA>56QE1x?v}SkIBxCaJ(0lchtb+!~jYvCGVz<OK zh1vt)D-lF^2|lbO--x0{I$*XlMV|GKy}GmI@x`Ym4f%hoKpVE4dC}Vs)SFXFn;owY z1RSR{3M`Q4EDphWAX2E=zY9YWB#KmIAcZ|US-`=R*xuM<%{2uqY~G=i{!!wVz*+w< z+!Cu2JvN=xTGU7X$^c%Y;(Nt5`K*F_D+J_kElg!%EMTP~)B|)|W8EKd1KN8&nz}MC zz23u5ThDU%#(#U^yzf2@`tG6RnR$nX_`*rJ#ajo)AFuGWI)~Gl`tg#Be&mr{?JXMz zs;1#4mM`QZ>+_F3NK-cJB_onI{2D=CzAaHkydDvFpZrIY^atqbdFk(&`^>|ejF>_U zLjyRCYe|k?8?_qciG`SO?$(tjkw#D6s1?;Bmm*N|OCkvTwh`V$P(F4ke-W3BuG_Y( z=lSwcIrBkY9N<i;HFH>VzZ}|S1sW9~o9tf_^MEBC-yhbgw@DOO?9GJnz1lO9(}**; zS=~41AYi^biUCvi&OqBemyLzu81AiI^uobnb81>Lwi+7)_A9zVSvH|nA=P7-?>*dr zf*}4cUsS+tl;i}1OqB{KP&QlLj0)x38n<i(CB@|8CscShFxwpX&?pJsx;L_mG{ofP z!sPL0AiAxj@#a~Kny~x8u{BOp;WgRfihC)LqG`vO0+Hp}qyyk?BC?EMJ~7^m=81Hw z;Fr)`YW5c~DSnGdMb8bFa57GmCIA=QAV#G{ECYqycCA27^Sal`#Cqe@cS}Co-~?Lf zv$N59P{cG4-hAHtTSLGalEOf#E&rism(d3yvI;)QIjN+tu$C_F#959cX*qNrXSRm` zho_k&;7hww_Q@1ak64@v$d6ILLuM*;2$6ZG-d3M59TZW2u8JI<Or6Z_E&f|ri8cx$ z9IZE|H-B`0Dt9Hwbju29i0B%ns_nO0zL4ZZy7PHkW4FCURrGnSj7rMcf1}c}3i%=Q zvOYf+FAO;{fNKiG%cF8JYvB#(K7$nz&XyS9pNZ>or{Tp3hpaawZ%R10q?mXZ#)dwe z@+7U~$&Yzt#5)gz+O2UBT5u~2k;zEZLL;@utR*=^r-Z`k?G8sW?S|&(*X+XpdFog8 z4PkE-mf)R^fgKV!WzGfpDKt>I+<UPZUFm5ngAIBPDEJ^j8ev)&GG2b^Fy!B+gq<va z8~$6S*hPu9MBHv9!X2?j){sgO<HqM1!zxPrC0*sbuRWA|v1|a170f)Rhc|%#-`4gI zGOeH&B`rohy|-r4qFB8pTIn7kSJwnC<TXRRuz?lRbYuLHR+(g4HNqk|ttH5T;G(0= zaEo^76Q&-`kV6&jR~%>Gy@1j%L~A9$WBNrts<70YFbj*6h8HXc8v0(;CGf3Y>IV%? zl9_0VNZ(z91Mx~Lncc*XPI}`CNt`e7&vubK^|wWWnDkQ5Dbc1pr3Cik@nhyHu-+hN zGLlbT03O{X<ygX=*9ub6Wq`-iQ{ZB%N#Mv)kB$8k-A=@!g-`{7g9U;Pq!j@&EP(Tq zCWkA?B<${LGi1T3kGB_gT5Qsq<v)5_d0u}Vf1#1aTx_&#i1xDUi}|Btu2U(|S|zo8 zj6GmeCy3cV_Ka~PRV1wuQ5BXS;lF~myHWjV4R&W^K)S(g{0g@@D{MdE?DT4~Tofz3 zy_H!ap463g6+Pi@C~IZZUjbC;lXm|L<S-UVybd|qG&`Ml6>3h-4TV>-+C23cGw+Ot zPlv+)PKrnt%tBh8>LOa{=+WZz>mju1r-UiTs;cDe*QNE{*{q57P3C5MaQ5&Anl6e; zq6ua9$EHig>q}Eeo7PZPCE6xG_I}C?62Map^lO=#D+s3z5+kNDZy6B2KfsDQ8CTHX zHyBz;o4$YN)2)aaR}5G0=Y~dj{d811a7<m*m3&Py4ExN+y-Z1aV$2eT$aZsRvZ>Dp zeNA#D<0u&3k+TexbL!5E>D?vvqmUtlRqd#wdVX9h<crK7qsK@rWusdWxG_T@()ouz zFmS-^LGd8%$&AJ`<^sIYR5I-4unVr=8YubYEwf5Wj?1=M=OZ9$sA5v_ty&Q<k-_pU z-F|qMb+O5c?zB1%9jx$@7$($~E@xuHE9MNOFdjCMN69R$C_v@5L-yH0sLc#*ix_l& zkXU>1y$o}zi#Vp+co_uK%ztDV87=D<b8g1K3O8<G@|KP7$pTAJ8?N39!cYf6dyod# z^_)hHGmI!%BgvsM&BK|wevQn<v<=tG6^+9hHv1LJB2cMS$Ry3i3B<6x{_YEQ=tiP9 zIAd4;xcufW^LT67gUbtOcR)USJ~uKYZUy`+hE<Dyk#E}1r2c&1(ZAL-3z%8dSSho1 z%y((QC<Qg^ZUU_H5jv_8i1WU?aCQSLVvXpWHh~_kd6&cu$QBVQbaJr`6a(DFR4COn zi8-d~CT#MK{`(K7#oDXlr^od^!Mb+#%3a|hvncM!d)52vroTFV$0M^@rhq9L)NzHT zE~>Wj-p3R6iTmmz{+drJ$^Toxa|$m0l9D?^i~}mo9|7_>bDYBeBJt>kINtwz3r0Ae ziGY3RT;vn_HVCRPkV&QLnO!;aSLeN<IBoY3QeIj;hmCfFOXrp6J$(?IE8PPF;S!{Z zz?FIV*Q65+P17UA69lP*vGo$>{tPCOqsg-9Pvhi5b`Ks6I=J#Re6q7c%qONNR8&V% z|7!Zvv>oUP%ytHML%Y<9F_LU%bgfo<2Mr&MWu@{IjD<|PK4SbiZ<S^?fWg#B#t4<6 zD&!mI>N=_OY-%micIYy&B=|~GBr3^3-JawskPaqPyd~XiwusQDrJVc-TEnRz0Ba3I zft{dIfIvV#zn2ZQ`1NXNN?kw7=JST;xI>@@!~uputG)M9v19g)h8xjh^6z0#Okit6 zp!#$9Sy<cIzsV}q{|G)F_FuP1oL`@<)7!h4)55}`Q8a5^7HbCTm1~;V?Sq;77{-l< zYbHKjAe1K+Ym8;8@622}=FPG%zctFH|Kwr#>{E-c41<{KB)|z(cQPc<a${>{Z2AFt zfeB0`z)b&~s{iyN!Gur^oHmYCIg?ybyn`F3FMJ8&uP-($V9aG#;fLc_3yR^s3jJJ~ z&{dGMqULNmXn+MyZ@8q*xheyA?F{Phc!aYtVzWeT0NV=nF15bngGw;boJNdKNSa6z zA4&834G8+?xxGbkjym!}{b(hDsF12q0oa&nQAnM>N43nA#Ul5I%!6Da%UOuiAk#0! zzR6xOji%%z$ARu8+IC<@WSDC{P@{Ao04H`1Va5rcM4v<^y0WMo{bnltrC!lT`x5B( z5pkaqF)+4Fp4V|mq@)q0PD#}D;LwNaU=p)GPU}2E%2eoI<v~+|X-QQ6+}LqM1UNYo zHe^cb$?MlO*~}6VGx^Y&au((}Xq&Z|Lajv=6_9GZ?Ab-f<hOW5Q~9yvzP%kSXj`5F zPfjZz;97E9VgVwf+|{YW?yLQah|JH4?1kHu#)&-oGTBPRZpz_3la=G=f?b_5{hUAb zo)SWF1iKsgm@@mDYk-ndZ)s+}7^tQommV(k!=a&&j_A4PF@A%_D;rfaIyljJA~^21 z##s=I4RJI`<G^-7awhK%DH@26l@3=t0kILJ9?ga<t+F!&wffNk{iQWU(&xs>E=U+k z`s%eQh+nxmEaM1?c&Nz>$xKJq-}J^)8!Wp<kL2|AIIbSTkYN5MiD#hj0sLECCO>uw z#7c9AEbd!(+dwjIj>%*)&3jF;$fbT-NktGGQI~59ImWA*^+S4j6N6;XOwSkxCz0QI z7t!nHggpg>yyrqfA(83E(}oNmoa*L9NP2#vND+aaL;OwKG~W5=_fAw7$A}DcoF+!z ztaFLeF8=m?>?xm6DOkrn1Cwzi=YG4B6VT`ya^zRkWAM6V2lm6hW1n-j-|%6TUPtf2 zxE3CJ#*=9`s67=+SI+V>n=h<^{7jK5BmdPi_KS=jNQcTxB5s3M?nkl*y+UoFvUu)G zp7W}_ZlAHF2Ag+hU`u;(RlPnduIJ3#8_mbK-{WhPDTHm}m)|pGfKxW-JVUnFaDsQ! zZNAr?cuWk+)UdIz!3S|{S;}mk_WU-)4W&cHyzSFAhb&{*Msf6~yIaEB?($jH<FWej z%jNvl)*ORoCDh<_=*`@UZt^f0?&Y8P+BU;i*-Hjh<>5H=;wj_?rF|to3K?W--GJ4a zgOgZ;NL3+(I9zFa0Jdsx?^Saw)+QdcT|qeRE(?rUpcp?p4QgK|tqKyu|DaCpvTzja z1w469ppK{Dr{peW3d}bm-Pvz}hMK<_K1?>xh2UsYW5m$@ri;wdVT>oYL7F9=CFyUb zvpFcJK=YAfeaAZT6|CgH(WE8QPR$C#G=Xg+;b_$@IeIot2TT(bvRkThmtw;m4$(ZS z1ThQrpD~EaRF-~f<o(e=DeJuoIwH5(VmkSiXg%d{H@<lHG?SiM&2Lr=wuUmoGN-fS z=qXcy758%zh9LAN?J?}{lQiE)O|ZZc*zv8>C0p`w|Mw*8Lh<>3yiA^;ntCdS6am0} zkUdZdX8he{4-njNJTeZL0uR_T(NqDgQ#fmyXo|r<vXqP~QlwB3Hr_SDH>4cB4T)FE z|H5y^g!{DEr|MRo^OyA}YT8yKB%qGo+A;BIIEk9nP7>pA9_28)gTC-IP^>dg1SVre z##dtYStj%kkcb-O#^Dz%vb`JLIwZ-LcN(g{4cb#&0gpH-C^*`eb+u(^`yj)Be~HwW z9$q=xzOo0=t}jAv95Pj>UZWpR49_H6guk-B_KzGBr@+)%oC&z5ehhbaHYjRwG4=`q zXKx%#dQ1IDs9mj(+QzNPQ3vW_yNQ8!wnE!Nor%9kffZ>rsDD^?O3jns&m#DM;2LU* zUd(rKV9TY3>)f(Zju@o29R<}5iq-scZKoL==CKHwtH)e!?Q7?B)Yr9bz@jYxF8>WB z|67DDOH44vTOhE59ejX?D?z^E=oX&$7vcmjDJsHw8iRw*pG-3)3dYMOCEK;>kd(%| zNl04gChH$lWvQI9x*x==|H?_VQW1yq7b#+K0K-oUc;nuNjM)j)k8&-wb0|FG@$FYs zZjgRD)o>$?<78;B_7>Xy`?@r{7yoyYgsFLQ$F)r`x?4SXP{0{Mp`oqGVvPNsb(%1A z_hP-{A|J!AYh?NPrg|5-KkA%HcI%l#q+H2oA2HUKKo{%C$3=nUfN;8JyC0_LiDIG} zI6L;6;OH!7z*6#1U(+#V#tMX=Yz5b{7xDaNWvuDk$Iu()1ip`%L=Ts4ZYx<S*%E@W zsRMe&JtL(4*<22yvGo+VpXF%T6p8?;rA$qM6NE=1aGRBhor2NM?9J_`igTfn+*8fp z8hNiV75>QLU`;_pjZyTGhhZ_Z%Xy^+R&r-)kPqkQObzKjowOEXR@QM#=h$?y{gZ#^ z3EO@7_f((md2?;g;glNiir?CkL5`SNCXcZD^Ox}7O=O~l6K{T|gljeDPo5@eT<kpz zEesY1Lo14I%;6vrOSYGVF{q0(ODidsPlw_T=Rmo#8Wq~=Av&!in1t|Jq~uuu$l6b! z-n=eX2gN%d369oJJj*i%v-Gl0=GcrxsGeYVmvO-?CS3xs`{_3-tZJXIsCbs*B{{j% zi)w^4x{X+j)$Z?h@uO}Kv21;1hPrg#t_wP?ZW(eLCb>RT6<f4+EGr~dllHm?ZBaw& z*cOkw%r@JZqAO20+D=@kZAb(#mWkh840~0&Akx0gKF6KA&{JK#S0Jd!To&Uw3-e~u zCZ)K^f({*AG<#BgBU*b|$hw{TOQ6x!(jHpZjdMPUuAXyBU-T!R%+Pfak!?;mOc-n3 zz1~IeIs~PV9*%7edi;bzH#p&JeSQBW<P{p1p>nm<akOkOESU5J-wHm^(3uEIK&=e0 zbnvr?IEWg*k8)uU^tE7kk8&Ci;To}?er>eAS><>;&kTG}5UC=)&HCY;s`wLH^?dY6 z-H#?Nuby{_6O&+7iY%L^p4T^WWdp1YWgG&NRvpgyoULg(W+(kc@xgnKze>i$dIa{~ z=g&EsV>1d<eC9;r(*rwz2%eZ@Wdx(=R?mU_YXuxkMwtUvD;#|$b=Q{lLoAi}hwlJ- zJy-T@%<zhV9ISOL&D&~0yNlFB7o~L}*_WKJtCqiSXIEq+7(++rbiFr-epUG&I=q75 zr+;|AW`CE1m-&jwnMB24?G?}>8u_^|#fsgpj!<1od&5Qa?_raNz#NLxTO9DuHSjWl z=lzv~LSY+;=l$ix^xyqSFsW1O;sW8cZ7D+)w@yK~Xxi_XFb!g@ZyS*!A$YbC87#h> z#v${#tK%%=Iu>Brrqz@XHAVIFlw~NN<<XEm<H?rJ8^XC7JdMkOZ@W1?Ar#@}{Veia zy2;<tvE_M+{B>y{faTv4=XkB5Tg3vE4qu|ExJKWt6TaJeT3v{z8=&;Jm{}8&Yc~9E zVzPTb&MsLj7cQNK$bMj3y{gzQRJR-`#{6y6;2Gnrl-BZ5a{{x3OoYK5yUaK1Cubhw zTCQ!azD77QmJ(1IG5T3Tde^a9ICeHtc=&AL8l(9hwh9<jE#K%drJqusOQbc&n(bV` zahLV-2{|uSFsmn?^QjGIPW}{}Z{;90*K>UQEv;|5VzAf$T(H{yr|Kz*Tmd};J^Q#Y z9V604-1xzz@G_+*{&{GxnoU>8i9VIyp7C%3x|ZipcPl+vZmNjbwU%<Ho8G9@N28%Z zL~;7&A17daaPKZrMP?HwM!=7#&98wl6orPFE0KLRjjTrK74N#yB2WxjcFeBSCTDIr z(^cvN`o*X+)jR!XLPl1ZUeC8@>OX(AD^0*XABnL9KV26AQf+}mf4?dGO(T)cbFyQm zTsO_1U!*nr!Je59gbObjOBx<02^%8vpGs3B{K)~)jB!)Qf;MqX2%adkMWe}indhQ( zI)E)iY4n#-hNgyk8Dg<jNIYf%GIXE|y~};OP=Mqs*%MeT`%`yB9X7N<9i0l46TeBz zEswOr_iUDDI~Ff}vgL#3jsZLUAGm_9oLZ$dYOz8BJNVXzUSRV(>X-v__m8~j4Zz!` z**{=9Z>s!BNpNgV#J-xxFNK?S-23)ovd~S(z2V>C`t9o_x8v;aq!tj<-CWzcS9R~2 zX;-rpT1C#@qRFT=H9@B2)9!o!{@D=1L33LO_G9c9Ti^85>rT|&B?<HPM*>F&;hTB8 zwLu;l^eU~|3MCpG87PIa->gSI>R4-hF&r?_(iH`5yLUZ6P9eiKAU736G1e%Js>z?} z!Z@Ir?I#?*9&zkCj3-mGz63YOKo^`2su;zo%0O2~)>ss1JKN{>GTp`GFF8cK9V*{$ zLL71+iWCAP0hTjbg`?}MjUNGfO<9{09P5SDTr06&@AG`0*j<o@F=Sg=3TL?*9hka# z^BVD1HjVUONXu><7P9O5i~Ltr+lKF8aP_HUSWz_k;cVQv?BSm#A6LP?v4dK&xdW!` z#ofrnjJKYQDW}qVSlp0gLM6A8t;t+<#w;&{NU9RqxIU|`ox^Wrt9bY5@G#e2w_gsr zdm%qwqrxXW4Zb^WVt1RG{5REy0U`8>t_2I&sR=hOJ+|4n?3$b}91UY4E5=ACWS$ib zSk@g2Hdcbt%N9OFmxH<(W6C|Am=%=43ZJ;rg<L@u;T*M28K1K1urxMv5IR2G=3E7_ zz2@E5tdJJy57D}#rBb~U-L#~A6!}&FCDZxtcJ?8EV;A*1sKFm=jjQ$mP!n_h$Z?3W z|Hn_`P1zRe66G$t#Q)6U=B!p(=<=PmYZ|<%te8sHU=(SQLP5ockwpym_e&)@awJ1r zl615$$%~bo-YAkUzM42-YhglVQ)Uv#74zkHX-dgyYVaC|rt}a|-F6LgpFwO-wlT&9 zpnI7oQtzfW#xwdP4u&@kh@nU2AKDy?T*!PcaJ}w(ej1Okzo*>Dp$igrU*B|>33(Ax zNq~@M-9NRsJJYl}hCWP!`hM-OkoW`jAFMU@$zXS-R=RGK4`IvlX}<P%EylmI!moZ` z@81Ld7<_!ipV}KPh8lvSEV@9P3Rp{udlq>Ul33jl93&lY*pPLG1n5*{u#F$W>^-EM zg3;o^<JOd&!)w;|QrVdGEY&_PyC-UiI0vwa@mf91IUGy~E7@&wA`!=NdsZ6KMa1rU z++xlp;_L!8E|mo+zQu6JxwRU?BMCj9DICpGRNlcE<dk>@P_C3M;<vQdpymkCf~9vE z+g%tLcx4=4m%C5r0i5)`1BYKlk>E}Ji&r&nWe^}+VV$(tL_<5OSyh{4g2J%$V)S*r zX3*-o!~i4wgRC-<@(2;@83%VX&P!~0HM)Gh##t8adGol_AZ>b0aD6wg<e6GXeYZf_ z5U8zmH<iEpB2#J@2u6KmhKtqO{pO4MbM_v?RVLEI?uZ;wz#*QajbDvwW?RivZ+54K zRY>|s{!em7KTr+h4_F38`H3Yxs3+9VwvR|2yi?3@r`#SUZ;`i*_H`7@BZXr+Xo|Mo z;Nn46s`TnIGzeEXsv^8I0y~ZH8Q$I$D#=TD{zzi{cp>5uD91D*^6T5r8ilx@hysi} z9cQ+996uF@fXEOEsv)a%<wZ;CcbZ|jhL;Clv<<Z-(g*JY=h_tMZ^L<VWelHWn@Kpr z0W#fhUbW0j$7q-eF2P*X@G{R!7HSga+AU*4WeWJpjCa?CIchR17*8Ly1yiGD*+9=? z-Omv(XUrrq`k*>xvj}as@a%bx=4vnLGde#`W6%Ka3slOQ3yNMXZ%So{_t7S4>G-5? zS{+>MJi?MG5Qlef``ZgCIHb>=D68tz7FC=d6~s+nb~EX);THc48IuS(^biXrUIb?s zY0Z}$R62d<EvcJL349!MO&Enpc-4O6f399UhuaqZ`rM#UPJZ>&@3Hlq@}Q;ZxM$Dh zY;giWReh<bLe#`EtY%h3UKkxmq-y1&qsAkam2*^-w={-};64~{^g;{PGpK%tHn*nK zBh_YggGv}O+OGPW9>6I0GfX9v0k>QvNqufGjwMHzQ}!k816h0uFSG%kQlTDhA?YY$ z#FA-Yg|qQ%q`?sKjW&Z4Zc?KkRoOl@oyRQzX!7+GnkG+H=(d;q5$mrvh1XxL-w9t> z=ViL(sSSBeoRSILstg^Ud!E2LyvYBk8EwdJc~5OVPC7<t4&-x}rCnor+gaLvY9Tp( zeD~R(7U78YZw^ne&$ifO4OLxcm7*`#2UF3{3m;goZf*Ac6dN3ti!*VY1m!C@#7Tit zr+HMy;UzPWxg&<TAmbfl{tfvSYdo|OWco&y>*U%l#$HGb3`b4LoV*kXTw6^l1#F6d zL-oJT<y<d>{C<D;LV{&OsoiW(4VTyo*LeHdwnQqNGd1cn$0J-A0L644o!$v&e)oV! zj7E%J7SW-3C#EaTl-}HhX|UTl5Fe;q8a@Xy_#=iVH|V{GTf@7WM4|M5nKvjt*o4{e zUA)r%+2Br|Y_~U5tqKW80a2fMAl;;8j6^VUsZvdJaXV;ZD@)U}I)y807AR_tN}-#+ z*bpgk6CeKQ&87kRrN+X(wL@-o+Lg!eUUX<=82R92C+y}L@?8hWs4iYz+W^b*)GXEt z+a(+($1W4YJMKSUnj;|Ai7P&(G$v$+)u|#lmcw2B4RNj^Mnnb;p^g6C0nF(4u&AsX z6_rXz<nxnp&P?S<u0>qqDdmdjT2sV)kavdoEUc^|qYqSsi-~m?dR{wRIt5@zAur)= zAR3Y%%4dtHKBBO^cc^|t1B?V4wvCr1qmh`Vfbso|Yg{7GE0RJ!C-Xses9BpqW;V3w zOHX7s)uEaYzDR5cWn38v$;BYHrF9A)?Du3Hy5mDwi;;S9^Ru5G_!Pt&Z~ouP>^jP{ z7X1kubGP@&)w<_xILFnw9-49KNt1WW?fcVBTW8=rE;_@X^A<il_G^98Q1L`POm?9~ zvuXe5KagSwrjkWQ1j2Uk(R)1m{n7Q=(#T90r-~$yY`?w%jc(%X<6%A!?DS~?1&!HC z@WIv9>1Fl32v9JG^m#Sm{^pn*{*438x}Hp#HHn#T7X*IZ7*6tvO9D|11?I)mfs4(* z*9*|ZCw?J-`+51c_+9yIk$h!VzBKurb6Y6jBl2C0IDu-!QM2o7Km!ik&(XmJCmA9G z+FzB?%-DX(5T0CcKizQ!BBML9K&2L@1C#8lFQDf0g0zDHohXQ*G}2*j^DeP?=YyyB ztr@zWTaMI5IsO$zqOmLp8cek02u4@XyCy(c{v_pIhB!`wN9zS6o8ccoWbgMk+;2_5 za`TU`OAqYd>HjiG2RR5Si}GM80*8%LUGB*IoTY3F#R%tMS?=$Kd<Vc0sJV?W+F-x> zwCx|6TRqha*<Q`jdbVVM!^w_mVdp^35W4i|BGz9MeFQjl=WmxtHb_D%L@dThfMwst zwpk==Y;hyQFQ82ClR~1WuNx=2-NPZ;L1&!{fz<lp)&~{NA%{A8Nq;u-Q!Eu<f9+7W zvNKxb{u#7}OC-oeM03DtVMj(`?jD5Fmv*`v8Pz2f5)U<k32|{rj#j)wbS*7mi=Aw` ziUsGsBXO@B{d6GRZ96Ne^Xv_z0oWj90%=$XS0`f7zz?r3?NGj4kl>!=FgoTsGWnY| z4#i6EDQd{Ur5idTedaaKu@^{GtV^r$9r`;sob4P*v4<uVf|yO9_pocHi&^wK9@>(6 zYZE}5whKW8`ZH=N72A&pW+fi7;|wwY{euFTcQCmwXCi%Yt#9cudtbEy+?s*JO|J9A zt>L6w9P4^V=!EgZq^voY(Qw->hl6-&4AHavPYoPT`X+n*-mPAJ8hRK#AtASCvZosG zLz{2(!`^XgkW~0cJ`nE`)?~Le@#6mL>&Q(<^Tjh)*P7eRoZ<Y(j`U$2hX}rq*~gI! zuOr$9I+V_fcSmEmwpIp^+D^>TK(lqK3UvEl^*p64y8Yt&Kfw-R7#s;iM^-%sjry5} zF?NQj&#%0ervIu|N7Krw4S_>k@Yise`J0YDCXX6k5b|J`trRLCUvd7GBjT>BaSPMi z92X3~Zml@dT{HZDphfvqr&!D7R5^`SBYbk`1i$(_9Pr8Wv&`e9tK_DoYi3NM!>ho2 z{%Vj<pPMt`g0?066tx>MuOp}kTXVJ0{fmqBetPUCnm`J?dH^4`{v66BLxHX9sNkO( zoO>fQy|(!6^+66_?9%Zll^~8X(#=Vxh+k<!-YLaR?W_Mg?^&155H`GON6My_-=hjI zg^TADP<oCv1vjKlHJ*%Xap7x3Cg+|ZM<S;@pL<t!%uHy)qsyZX!*hbRn-uZKMH#*l zc0HI{J~bSGCrZA`$9n#@Ms;jy&awJ+geKRM{1bkorQ$05#Fa{E`7g{@T>NjCuZ9rE z&}|5`vgY1YYWa#B#pJnPr!Ek*Fdth67=1LM$T0kmq!xMG%4f$VD<<|nN5y<-e^<OM z<ho(*`$dY5r7!Ag@R}V3a`G=GGQOmsmnh*UY2<T2<%GUlq?qT?N*$Jl4-=9*jkuqh z^D4TK@-TEUFI(4;$H~p0@U(g~em{`IU|S^{K=T|EU$=V<4X=^Q%d+2tuLmH|n41gc z;?saLcjMBKi=c2xc+X^efEj|^Ww6)mJ*|pKP^8)N(-H6ypU;>4+SbracmtjY72#(i zblcbeJpO~Y3X<~jb=~@tla~j9es0yhnY3Oxm2*YXaA3`VR?OuSm;9Y3zTMMraDe(D z|4>=y<Fk=?6Z0V-rS)zSl^u|T9&Z{BrU~`3UK^bU!{gUj;n99mj7OWDxwNY0tSj<O zWs>haG58-<41fPW>7ZUP@ABKBH0N`2(K#PNWUzWMa!AI3HHbl}LwY_IGNJ*i$_TdE z58c2-v9WzgwK&<rZvQc8Ly<g|9u8R{9Kj<QderW@1HF{O_;L{#%SzxWPz=$A*zfgN z8u>I3MXh^<L#D^4yyGlLn57Q!>W6iDy80}_>6pCO6aH*na^6pbAY>2}uI+bH)5WuF ziy;$qko?kmk#d^0rC13qZNGcw3dLKA?hrdfvZ1I~YJjLWx=9)Pg=sFqbiMmw&7!YE z*76gZAmW=ze%}DXFyR9?6x+Kn@r9sP+Q1Zx>+dc)WM`m98;AFPAdOS$mrk8DsTC%6 zD|zQwn-4R}2wQmi;Wx-BqU9LD7eHj{X!0C3#KSAvo-XD)Ed>{hGOxl%VU`>YRbz~o z)6kp*S*2QhRo_o^DWpI%Da~6W<7#&cC1^2eVqaagK#2#$+{*{r8JDeMkRI1jaAVlB zZK(ALTr*oS6q6l%GOe`&!6)UZ&#bJjtuK{0Id>O{BZA7J|5xf7r;fo<5nX|mZ*c$d z>;L2H9KSQ|zAYWwwr$%sD^A5p#j03OSaDLZZRd$Awr$(ClRA0dU!OkRqsQn!;J!cY zvG<(oT5~P1>LUkjAj{a%rM&nsQ}t1(+OFm>i>Uq-G345_gpL!&eoMA;(|4|XrC#~G ztU=<jmx-fu*CT*V&BBEuC?^J+=54(-6g^4zzV=mcI|N<{bWqkpNO(6@+E?+4%h4i4 z14+^V#WPkcob>3Z1C>;{x*XT~r~EtMu`}e49fAB)jU%V}cjxE=tg@6WrnBVijcVC7 zowc-$){|-s^0_9ux<YwYrFHeYEoKljBvF4BiW^sw@ks!co!Z4rk7t(<jz8>lUVyeb z?5TuHP_|tN@BNFVqZ2vfH&FOUEKADMQN2yCPWQLXj;CLpM}DMQLD0TFUHO5c#iFDt z(->AqOS$&rFO_F``}*U#_8$0CfLm)zBFW+$C|A=M76GPqhv!HCx{$}^+m7vuE{Rk! zZY^RewobqaDnwmC&M26jZJP7jcO7<}=pubJl(A9)8x`)l>o8o_pp7Lh-Apr18|L}w zS*&?Bo{nWMaQrU3`DkMEO_qG_QhX@aAhY0%E-Cy%24yDQJ@wXGIA-f^@eP)^e)>3x zrXXv&Qv4v%9~?xxHA(G6QNH3T-1*WirIy<(qsjoE;e!dN8Pd9pkeWI5EY>h2g;B<F z>E`xJ=d(2ndH7U$5P>krWyl71Ig)7-J_)J`z0McMXy#EVhS<vn*jK0-&=6t{6*^Hq z(^GdNA`#G;07Se!PL#)JIi51<rtZ<<+KYR>g{*+xwcDBT(x(=rY~i?koW1k7?{wYJ z7vBI$yH;h;n@=FFu-4cqi*N2J+_G{s71v+$SnXX0f8#tryNfds3?fh$^n}`29SvTK zf1UA57II0^SJW8GcCM0KP_11#2lq9>ZwLVeJSoKX)l)<0XNS$<oE>=YLOaEB-P2^* z7-S^9Ti_7EHz}bE&6-$m6takp21T(7AXxxIxsKbi@~GW}fqPm0G%M&)X8X;`a-Uss z^^iCuu7FkMMz-stB%A&Q@2tn%m)S5_4Hh^V%P2JBJ!2svgMCz?UNOU>O9b_N(WN0S zentJ+*GIP!qa;qJvc}Y1vOfYNeIY7tbTs{B%%qOPS>p$`1Ln2gE^*Cix=W7~8KeMl zTKKdk4FbI&W3x1g8m41+!N`3yzjgIZJ8jn|uxU8?>WhQim(Vf&|1t_j=VD`j{K8OH zk2cWv%a#HMFAPj!LPtl8F-qY|KbI-3S*4d^KlH%e7UgkgA2Y#9O_sd7=i-r4w~V5c zfG$il!>`3Q5@&nv4eQt)E##Z$owf$R-J(+N<9gO9Ag<`Qu@$3W<F`EKbz>hyQpD~C z09lh8=w{he4luguf_7-|^p%HHphjcCArzp<9Zdd4U($TA8E)o7na+;Q$PmQ_Sb{af zXKIB;Rl#SvIzI$LKfkOUEWG?h{K44WfWMM0Yb{lPUopunm4dx=w8V`L!4L#k+aTyG zEegeT3HwNgh{0^3)fwj&{T^%_0ZOvyN=YzcIwlI8cz7euJ6+<Q%2P?iZ>}<aZok>s z9J?W$a1KF!<Vz9xw0VlE*o3+hQ_x08T{b(TU9>IRYrMURNOW)VE$1%YsD;!mtR~Id z@o8qLN&*+lw*-w*_}0z#Pviq2NZ!t{euh*#*120cH4d-bqbG+F(*~R0D4in&GBqZ1 z51w^F!CDn;hQEv?1xn7CCcqj`|0*OZIKYtOIx;A4?q_+M$1pys<g;Y%7uK%5wj_PD zvPqBHArdud2%;sMo(jl(8lG!R<|$00)_L!DvsK!^+R_K`8g4q!vAzK+-cqSF1f_^w z5oO3n>il#ey4rz@Fkb66i%0I8CVLA<8H2ZHCaSSQ>H)7mHt}d?|Cl9KmwD{_!&$na zOqb6lKSxovHlHGOuqCISZW+X>>Uc+a;?;_y5T2)C_`@rjMK@DKpU8^k=4Hv$e+H{g z4-?s;LJ3<WZii0$)_(#T&?9nLhXx5EQD~bD0i!}_92q}BxQ?Ew969nZg0R=23a=U# zY@)sWuUkES3#CJ`;(<;M+(v2m-?Oi;y&P8B-YI8$V}P(!S^ioh!mCBj%y!ynCLBcP zXyn;VATiyte1!t-DmQ|`qMq}#VS#4yP_YHr9V%y_IsoUp5HbL1CzU~I4_exe0dx;O zK58Ll2y@;bznz>x6W}!EcaxX3LnFQ}ENs)}cr930)*#p!6Pr$4A7j5~C~-p`xj8O9 z1C@TiOc=3ym?I1_(Nc+k(e=0kL9c=ZlY^Xv^_6iwsEzSj8S<004%UIuZxD~m*-a(j zN03-t7LgDwKF$Et%E4}}9Wrf~cteB$?bUCq+H85VPiAhQPYGEVirJ>8Lw@TXAcxs? z+Q%ZXObm|FhYE%x>c=5KQ8R*J!B$d!KDMOmy2?_M63gg`Jrg!Hf1dOEkU!_7MeBj9 zS`|=E?=v9PmG;?2fKu!%s|vvompg^|mbLM9l4~DGuL{7ZsU{6juZmu!PnWY~g%8-~ z|N5JUSuGb0Y09=$N}(GmmNEXhNQ`FtQG>xDwtDftq(Yw#&oe!H{+5c$$!k@d2=ceK z(E7_|K}nKPzFp+iH?FR=V`ym5Dc_pBp{e^DcCYs+V&T1^;asn$`=oOkIwZxRwFMLh zWhu1**LVQAECEs>cTTMuUX!nP+ueGfQt`JmyF7m~LVb^?&D$oR#2}1SzJdvV!sRqB z2pf=e66F%!K-s><+!JpR#PRp2eiE=|_c@3l`Xe1GQ+>RA-=bkRbI<a8$!s|8_XAQu z>d3dsU7;+~#N`tCEPs{);ux>Fgww;|2$xV(IcESdOmv^`F1R_H4KjbwqLq0E-w^*S zY|B^Mu^ToK-OzkiK`c^e1kCWDBSb`!+9fH6QNHiB!g&LKl@t7LDiaFbG%H-C%uOp- zEi9giGy0y>Q5vWru_#mqa+u66^}JtRp|ymdj2<T$C=GM<B}t75K4cki-UOmxHClJ( z{!D<Qux=&PaeGC&!96E;qZ|-E|Ez6g(nWK#?UMOZkle_psGA)x=-R&RBz0Zv2IbZQ zC0F@uf*iLI!q$n$hJ~_9&K=8h{C$-mf^vFi8jz#z3>7Zzo_ZyZ)W8A63$6?rivl4Q zF1=-o&ELGW$EYuqSHADqt?dXO74TO~JQV=m+{13|JB@LIWu+|f$H?0=NGl~_g?uUM zs>i~t67-R<QWPduS%sKBVO(DaHm7FFQn~`2o0YLD*XjnRR|F;I;-B;H65)WQv?kCz z<;b8mh8dM;tR<<hyzcs475tT63nTh&j5$f@a$%irW`kJm06R2?=Au8VuKd)f1R8)s z1dMf2=U%8B7Q?Aqa4oY)hclu$HO^IBC20|$gAte!MLDKO&~jFaQa$?N>=$}vqO6u| z3X{f~K?fw)*OeIYpTVf_O2rGX?jmi%_F!ytP3?=hwtB+AABJ}KjI}T4sc>!WU^yIH z$w;OTgv2RFgW=%s-P#oT6Iq{5Ee2qmu$AV?O8_2c_!iWX+X{fJ{+`|h$7mzhPggKU z5gp1822*f>GQ>&Kcao)ZqnxPb@7-n#BIfTM>G#*918H!3CIT_=s7?@6Z!K=Vn5Cr@ zuG|#atI+Q5OIp)r^RNv$%gjfVNfY?yW0RBsedDw(s2p9YpNl_GJ*|{^<PB)P+VFNb z_P)e+ev_D%KC5Jt+liLHZTkavZ&fz;T1ENubWO`Zelf1knOx)MyLq4dRb|uT0#yzI z^Hyudiq9n0XPgptTh!!8C6A9t(3Ih{KQdJCv;}S!xuAaknnlsewE|1K;15FX`J_jA z7YrpUByeS}nkhgBPmZoy<vl=KQA|2!lw8PzVFOK5R65yYo+irb9ZnOmMPmK@MBG$I zmxaC}Csokb0s|JewA_Ls2mA6Iesv_#34Oh(S!Y?gjY7yZlIIz8NUXkgD|k^{ENBJ} zf16Dlyh?FCwx<4W?1D|LfX4rnX1v-sXCq90nV@R%DYnX@fSgk6OaJG4V;=Q@iJP4+ zfS6&uRROf0e+<FdKpz$K3?R~y9M=HVs_}6APan__5d2NpZP#scvSaS_Cnh|Ed!+BM zEy1tG;r@zRcq4&8iB!nIO!4gQ47S&PO-VRv*3#^(OM5%7uQ0Hp!;`wQs7R&tij%D) zXpTr)Y}1DD@2CY`Z35V()JY`-&<t5r>+s`mC_(z5tQmomK!v`|@H(@B^KvYMoQ2}F z!0IWhz~ZqDL49djn>dL<)vn(BX`^Y}=+Nb*=ZqJ-bt|C5@U6~$m_!DYMESXp-e2Lb z$MYit79+%Kq8hcc^?uB6-Ig#tLsr!dcl*Au*IhlM<1W*l7{K9uB)d*`S}4zlTkjq- zt{N^NGvP3?=~+Jl74038kZuOgQ5REJ)--qa4VyS_C@<Qrb_Q{w=Z<>!Z<@!~a{6A| zTs7|P+lG1YD{ud{iT_i>qRdTSDkzg|_`VIX$tuMh;9C2+)6HE+;VMZ5AulCRfc_#D z1~{_M=<GxC4c&pCNb}VDV-s>5$>|TD+qZ>AkUC-<-S$m9ym**wymJAIwSu;&37Wt3 zEYXM5T<@|axpr8WL7N<Q=75l_HP)A)MRo(v;!(&_s-P=)MqK%jn(@Dl&fu@0>++bY zm@XP&8DLuy`c^|acj>wsbSN)Q^{s~nz>)`)Lm>P8;o-3${fu8bT|+-#WISq4(_`(H zPRe$yBnx44s%FDBAnD>6kDat-Dl$zOjO2-4>Tg$t%#Dx7=Gd88)j|frsS`y=-%WhP zScOxqZ%4=Q!`nbNjbjR32*JD4n?LE{RaIJ8PzFblKVc_$5CcwBtOD&~{yh)^fQW#? zG+wi4P~I~jX`7a6=?Ky0B4#cv=DQ%Y)5tnhVO}droyMxIo4pAYx&&9?yy3KVf>eqb z{lvAx-QOt{s}^57TS&2{Ujc$2--9i6j)|SJz}gsq)jJE?(BoL$MXt-G5EFjD5je<1 zYCbOY_6nCq$^in$TH>hLf@seRAmHrx*oP^_7Yz|CfQ1XJe6TGb&fF{1o~4naN8}J$ z<O8yIsE5~6P5h2Q+^d_CV!MrWKKAIq`Egz9>JsHF4~LA1H6^dFY~QVbQfsH8Kg<*5 z!N7Rj|B0VHpJf=u#9Td9<3NSVg+UD%bjy{!%jC+eb3UY#ndN(NfwkoTq_%5j4kp}l z(PdX{goIkFxE>uB+#LZ2gd1n(IDTT(wJq6mXW65g4k#qGFWGX=P@wimjmQk5&p$0Y zHJT)g-WK1OKB=_4{D@a!v5wp}WWBuYJ1qP3A62dQst<@zJ&r|UlT)5aFgRMSi=75P z3QJI5{&eBK*W+2=Ks?0)6gwO^*;R~E`{}+cJ7b?gr(gx6S~CVzf82!nc|ilHMF?)g zup#9fQKG!3Jiurg(Z?x_C{eOhJ*f1Sz^w`YD72J+Z3+knb}}Ev4)gdqJYU{!+Eik< z@IMm>`NRk+$Pq*<$#CZ{on<XcQXsFu<Sn-smdK<^ftT=0Z?|Iuh*qR%Ummg0bfFDD zDACq4Dv-<MS41vg@#A22>c+#io14F!tw-3^$oH?!X9=~xYDJ`?gzl0Zw1c#E``so{ z#lcdzxj3-IwZ4fMkA1J?$XO{?V&xE6tpp4IFi)nbe<9ZRS2Z`J%Cg^xTzW(U-!dL# zD5h~1iRHl}uK_IvoWpRk<4CwqSiDtH>_cc9_yemWdLtNA+jnlpMHdA}o=u@7d=VlI zo@2^ZHkeX=mhrW&yZ%2k9|My&)Jn&hC<cSWaErj;tUb%2lZn@px!QiaN3XqDM2~XK z^|YOZheIe*w1^WzSExghiSCV%R?gfK?pTV@Kw-Bb9s^G2f&AT~S`VdaH(#RKl5>6S zk86URf4`HmzNrLF&DYw57VY2UjmrKu2`;Kt{S#7%{TKup%LX&{rZ|bAweank-4U+n z%Fea{zIvGoN490J1T>eTKtW#xu%`K+uUpJNW0>@C53LefNhWY;xeSkI-wNS>UDfaB z4H#c*2m`7kAhr2W%0uPRmKh0LD0nNOf%?lyIBi1@j<$Kr^7B7`U2<F~!ALS0C}W%! z%#0FO2!w~Sriwlyg8q(VMAXFk+V70mr>!pM;V2o3f}4Qt%4bTm331!%LUT+o{NDOr zr|&C2K!s>plp6f@vPnD$@y`3Z0s(5`)H8T3!voL~t5YhqMzQyGQ`Fb;<G6_V;T+_< zaZr5=1Px22g7Z=2?9RPIr$bzi7zGJdP~hMR{N9~wE=@K~@VE!3n$9`|3Gs}J4>bS^ zgLS*&FWMz3ZVvO8e2a%^3UOdLCg5R??D+sutEUi))TMSB#Af98`o~Af#JFOzN4Mjo zzbIhob-O1w$ywZTm9m-)pXaz)$hLy^kp5Rkll2r1qW2-xrXZw<ES{zu|H_^Nw|AC0 zkN5kBI9Lg1R0U6KzBcmQ5M|V$280q>v=bCkIv;fEi3FaZc`^nOOHDvfb+o48$7$|d z*Z>o!#*jTo_PlS)^U=V;Uwv&e7!Jj}s1<++6vv+YVO<&XgAEic-otrsAW7<K{Bj)* z#c@4e=tHplK6C)YMjZZ@_8P}gulpuA0u(G?`hdTtJBQ3PC@4Ej7UFp#9c#Rtpe3Z9 z^*hH!9;s+#LCC!q#;~Ptfd5c+`$5%__y4GzED4p<PbDtn*3^)N{+>yI@gS)j8!|;N zDtkr+zW<2kE7WP5m<BCI2yUr^!`_Rs0b-V9x?;})5BS6PEE77Dq$@&>d2aq0tHT@G zh%I}St(PV7+v*?^lHO%6C0hy>C}0K1Lspx%2G}Y8UhcQQoXAcn>6G)_K8P46`nm$B zR0}V23=&3@+OJNEf<H?ESL+ujtxI*kBJ7cmEy7-IKPwkc9(&u!K$iL*n#JirVm%|3 zINi3`HFv)(tz_v{`@vA9W{-Z=D*UOpd>&gyHKn-k4_kwi^&T6QEjCu#+};fLcx$fj zGsVWJtS_W3KdG8~Axt5SReqbTO5k6zdVoIeS;+DMK`;rCdD!~_&F_fw-09QH;|?q3 zK&U7|iBbpOd9*w)`5S2`^lF}#?JTLUDd%_4(3Fr$Qyw_H>;VByD{0T*xZm(pyQ?pp z(HNLM`b1tf`6Ks~_BazA>?(n&7boawwME(NPA0d8xn1EoVk$E`Te9*-3_gozioDoV z{p*@5CUa6-=;Z5wULRc#Lt_`P`L~g~lb&35JY?9!V32C%r^yH?H&IX#9$kq%FjT%@ zCsq#2l!RLG9)pGbyeIePw3h?B+=ZuTzBt4wGIE)hvb0re2yB7c->X54hqvMBO-3m_ zh)kK^e$~2joMtsZTS;|aa@z5nn}b7xoSS#C7&Bi+>Xx<vIJY>G4Y4D=*fM1;Z@Y<* zq=LP9W97~%It6^U@P+VhukkV-Oo%9~D$22L%?Naa|HPgdRz9b0ea)fWuAB{4mzIW0 zNLJrR)+?F6k}O(&Y!D=b*`Rp4nO6MOm1k`qAHGo1F=yWvS%yH=F8!7Kt$eRf=g;sQ z%f(01H_tr;u(pj^i@0P%T6)5MGu`W0QURk^uZhStq9J`nv?BAEJx$yll{b=7fOtsa z!mPDVQ#tWwYg6DFR*FamYEw*nnR9=ebD`g>aWovoe)q?{{p#MxxxeE|sJCbWQ=6zc zU}l(JEDDZOqcDuZ*kEja2VrYbnN~p6koYBJ)9QHx!te7JvR!)R2%<QUUa}i(sii1z z1|Nk(!VX2ZUtE1M;uZ5eMv#Z#8mJHmS$;)Ou6ecIZAc^cpaV*d@*L3|TRu0WuE(}m z-*4HAu2zJ!Er_{LIA!WxTk2lTJKGmVu)+~pxD?^9h>VXol7~^q$ter|u%94h)g~g7 zN05{P!Z_EPy0X^`H*st@>f^5qO~RAlXarz30E*T2l_v|^PvH?Br#RrdZM2SA&zNiI zXK3Jcf^0U{$o$~*X#VIERJq^&wa7!Vlo<JnnE09Zq&y0yUjv<@_54$hz0c;8nW-#! zoV-c|MIZ!ivrmzSJ;qNbq>h%Yxmt(w1pt!BO0kS@$1=qs+c+M!ylR2nxN`l~-VP68 zJXpVMo<qN&v=8n)688s5C`p2zqpd+(PY{^sd;mz5-eO@ZFOfSmOlx^LQ%(**IbbXa zE$vts#C#w4!1h^1(x`Djvxe3~4#9)lgh>-v9m<BL8pTeiNLTTTV9pIzp>5(312AFQ zjj8~yVC^ppEnad2qNbo>G^@>puwGr4P5iVB3^8`ZS>3R>8wvxw4>~;}rU{1;#TlX* zkocco9!Ftqes|RTDT4U7-mNY5CCK&=>DtH`L78L1{a4=lF~mdmnx|KCR2bY5Reb;c zF)I7(=2K^z-!js0(n95jOLZmdB;a2MU6~b4mE*iGIPfy!A2BbQ%YdpKjm6F_6~87X zlptKcW0bS7TZkFRn7u;YO@*L+Y_;q;@KKo_PI0|{WcxFj>Tv~+1@m}OB9BJseSDlH zU3B3qr`10k+T+|O%ox+L1`)M=Sx(NL7CrIq$J=GIUQJSis%gSqRT&1TTOS}<9I)y7 zI@lWx*10U$okTh!o$7%xJ6yk36!i-AJ@iL5IQBr(ONqssIvy5A0^R3E<I50E!GU}l zpu4|&u$35P(>6GIMexoB@C1!;@GpvsG)jk6w&#glNTSPIEoLV9E2?}~)nc$N%mjXM zsWgqLNaXKAxNw9gQkwxP3B=Tww5uQ$gF4RxrOp!Q)N_q0tF&#au4dC191$e-qa50G zEg$YsTAmpW@`)Cqfo}i2iCIg@xcL@sE8v*i^Vh2-qf}Uq-sFbXpg-&p)*KV<8>;R* zQ<vMw6ReUeZ(NCt^{}HZ&MW#EI37aN6v7}Mb5kmN!b(!zodHWo4&tA$?@N()WdvEm znr?Hdgiga%wPeUlw&ZWwb?>5Yn4XRd>NjECh^6x{0eaZnZ=b@Kr@i)I1mKNpPtw0V z{xQUnJ{ox0<{UIomr-_n3kVUQfnCzBxJE`<A3-(#r>f=156r=8#@O7Z*xDwb3y>*b zeScjF6Hj}z0aZP;`H@(5^yBYS(m|2<@t<Ek#)8jujcrhkCX){Bi5<|UD)h%;aqX8p z_D#ylL!M00Kiazv+wg-IV$#=lgokZoMXNl{l(oi;f~;$jB;qw%FI@2FBP^OvI5H&C zCABouNA|Vc6zkJuxJohW83atE#*Lmfl9&eM8GMJZ0RAi7a5Ah#j2`BWUO+pLCU0{U zdcS#l#7Bg9#1TJtDCe-JQ*B12NG}`@D3*(Cx_r%4ncWIuX{X1Kr|5M;9k$AVQMina z>{U~*a9x5#v(a`~Rr+3OZApoMd{9bHN|kY*vNz<;_g1*(hvX#E#M-JXyba4PWE&LJ zUiutyfHq_K=s|=LXpbB$1fE2&gF}vfP#DPwa(SMgtzSh4G!0KC1AX~0$&*4f+Aq73 zr7|W84uH9si+uclSdI%{nk4piklQYdvb^ARCv+*aT3buQW>;IgteV&Y?i7j(p*LIA z<$$Pw6Tp!hq0e~SkqytMB^$>t@yj=x17J^}|7h<m@IoRsP*mT$HE-Z+JsCJ<tNstk zk@dLPbyW-P#sR%~RYshEA}xqU!Tj{P;L~!f^T@}onU$t8VnTmZuTdy3R|9HsZFBH( z?EMWJ|8ok1r{d>yXQ6R`?l8PUtDGsceKn~s(Yv^(SoB$CsPTAfT?+WktE_vGknku^ z{*N6d$zzqXE%g83IhmA*4cq>9e2ZJ`A7*c6=az0v>RM76Be*s%(AFZuq<mWo`6F*c zoZ$)$EOdQDe^OH)O8y{Q^%q!!kb?;;T-&S+YQ=%pIPY}d%Gm!0>;S&V&O2j>HOGa* zFZ9z?3;{)}J{w5bBq%5uNC$l?Dm;Q7rtaN3a@Iqhq92|hhaPX&M1^ycTt>{@zs#;f zRAHE^70Sg!z^jT$h*ib1;}FNlP_C<->W%B<7;<SzR=O9I+Q{lrKJgF|UTMHZ!}(<` zAyt-OV044CY>UX@`vCLZpP;=kL2;@;Pl*;m2twYC+-+7AMG?z@yVKvOKYD7J2o11` z6|plAX)}ogcxL~3mwHD~Stit*z!TGRMlSd`l)^)RZhow-?JYuGooOU0X=Y7Q^lHno zpat#$+jRer0OiHAYH9y-7@Ra)o=^se+ujd!f;0I;Df1P1yjlJ3aqLym`tyF~<!-qb zBnLU8<P|)9E^7hx6BDZEG{3+jf+&+n?-BKNMf5Lo!m}l25+;K0YH#@584#QTR-|EB zx0+Z9YCps={s%mid!Mk|Uj;V8D5h-+RB;(HQ7Sl;p?Y~pvc-{H9TNye9t3?rTaUQf zyEZsDF+Ms1cYihI25t9zq2Ickqf}@4_%1X-ETcQn&#~+xl7Ro_@&qMCM2D)UzLKsF zBZ1B>lgA1Uo`mV>S<F_wP)8F~;>SFCU$}a_`Ji_dPCr&i(q2?cKr3Y=ZwzD?w~xE$ z73X54hW}+60<q8#QSnXGe2F)pV>28PI!vw7=tK#B&a#_}9)dQQ{r(?B9O(V?fz;I; zz4XWeoM8v=R~qQsqubpQOhEx!6x<s{=Aj`8xm1ql7`Ls6>MnxzmlZY<66V6Ze{!hq z%4ELcPD;IB^rcBbG;1ik`|`pRI*ZDY+bP_Oc&7Z^XLtMv(3&|8c!05*NJ+uhs6sis z)#LYAI){H{`uI1D2{E7asFWN>!TVHaVH56j>t|Eh<YMBb3MhDhr;FLT-hKnyp+xv) z6^-bcUw@h^r*-yIx;GQNA)7L|8%%xyjJg$>jdq-?YVi-|?GeV1QHHjiPsec@OqI>? zx%OS05r(#hi8_3M*c?r-!2n0-F98LD!T>%EQZx>mvp?&~iB*(`8Qn9}Y6uFq-6XgV zwXg!F$l%?oT9>LVLk;=3_Pqh(OZ1S)oO<A+k1A@^8%2At>7$h`OiEIH6=67ORr=SD zDM9f9G)*P3$d*{%kwu@7#j^@OitHgQsbJ{jSzfpwZ)HmXo@bgNO-Uz$Aj3R={L5-o zDrMFiiOy7j4!!u(O5VqKWAhcxWAX6_7HFnP6<`tHzSxug>Ol`HVUbk^t%=E5qRFac zOT^3vBZo@_JlNfh3QDi^bE$;Zjz+!+=S7y=+II!>>+Sy=NWHUaH+CWas2QA329VKM zDoA#bN<vhyUTd_#U>UWgnpNX~X?zv0|K(68_9IH89{y3q-i=Qn-XSUfsM@cnFwL$4 z>xq(%>VVP=UdE6p0<-!kW2rA@w5AkzOI<5(hPXtW#gA2MWzr3H49-g~_Q29o5eLvo zD)791`^IV!L{}JN%n_?5CBV78xqG#CM<0brm?&;iLD@w^MVrJRy4f7330Ss=?M@c~ z1gi5<TP#t!$6uu_K=TZ;5?u?Jz3qU4{p2#v3QXlPjZWhgr^GWm<vT9wCj&JB-qIWl zU@(}xZ+}C5*SyZaNkrISQ9Mx$SJsP#ts^|BalZCqZS6}Nu?ts310q(m4=Ha*#%X#W zB%#cAHpt(BgJ`@MW}0TFOKC2llOQTQD1pd37CR67RG6}g#9K7Y44Be`dkeM2y?-L! zAUail!VF4UNN$JcLGUFW%A?r9h*>4vl<l5?m1xtd)`Nv7h8xfF6Fd}CFDQCpo*>CT zIRlXXVNO%#2#ukDEYMRo%|@!en;6^k^(}x&uBbVL*qxh6QQ{CS9?Q(9IyF`CUKY5c zcjjccq+0g#f54MY&vGvtEWtnE2^mEcPGp45i+>s?Of|<GBH-r+-F$aUAJV3rrasln zs~DYxE5ug2!9)sZU~0I(6)J`Ee_)fpNN+hF!1orq7X2F|NDg!Uy}7#xeLbFGup@~2 z;7<kJYRQ{17ml*ZV%ovXTaMB-TV*{$9*#%E(Te7qcj}s7wWDU`mMR82dF_ENUbeM? zN3+8%goyR5iWm0vR?3Ep;3gR$=lFH7D1u~N6z%$7c0{tvZf67X2d6f>cV#$}g@r>2 z0EqJ#xl2mzhDk9o8$576BU>S8b#x-ZMn)Ihq=1%SN|QD7qy(n?nL$eGkVS9zKpHd` zc|y=AqY6%yi8UGb<dVe>PWM|Z0zN{AYzdFi!XjY!!6RoRXT`C0%9^#H7YILS6!GJ6 z_>Zk6ilSFN`==IF{B;jbZN7V`D5HBV;6`iQs>hfapCumE`A;~wd$XP?dzazl6<%`% zi7YMwmxf7BTSHh~@b|e?wtCdk$2FgY%_E@;wC+G?mnpbbjs1V?1%#iOOPZsYJzxkL zun@a}A#e;pTX~(Wgb~{uekY%Q;gbKcu>eSQq|(})XqaC?&P)%V&bg2~z=|zN)RzQ{ z@*jKn+*?Ljw)`O4cKI`C48iaGCp9`a-Yux*MJ+Fl<`&8IJKqXyaYgQUU~S?ea8IGU z4SZsTj;ZEX#x$^9**qnnPJm%wG~pmINM-{vg)6V5yD%5o`_Ffc@@7N((7|C0T0ip; z;dI7%wE!El8bj)YjU`Axp}+dt=NSp47fqp0aM>;i<S)DB^k769Yc{7;n`KRoCJ5$m zX#A32$?DYIu-Sj~z?D=k=4r{}+F~MV{@w{_h~<?&U&1RVts{WSBdI&X>Bt}|Bm6JE zw10?=YmQeU*Q%3z;V<cOkBKvl6x7%iC;&Oxj#mih$iVLch%FU7hid3Wz+12KHE5}4 z=KN#%*-}b*r0JU7A!}6+M&J|Fv*mF%=Lm_N-OW0^?ZA=OC>{5w&>v~`9!A@KEyp3y zD_EpwS2b8z)(Y`E_<}@MgaRr}Xq1=tIspPn9v5mmDz2n%;o}Fk1SW3Tb!zCgu^EI_ zFTY!fKodbIV540Vgl9;zekLxy0$P5CarVwA0N7RZn|}M&6AEwWH8cd^R#_Y2C4{HH z{#)%7w6rox0=$s@h#8OO@fEa_+tl9$;rFD`@jZbEj26w?f4Zyu_76|{BrII+uQO~d z{hJ}Ky}Hw>^mvHm7)FPhoR_)bj`=KtcJZZX(*btNHpX?Kfkr7sbNxIDMTkt&c`XET z@UxW`7a`&^O?LS3-*+NQaWPg+_2lQtLfG(kTtE!X*^c>`!L$D*RQ+ReP~V3hQY;gE zf4VgIPIp@}YM7(TTK=jwZ7zA#hUnul-wZxm+aX7@!^0U2WQO0bfB5SW8C?SMHpH|G zkS^7k$^Ii!vl5%p@nM4i8kj|d^)i1f_157Vw2mg$6MPN87zRQZC8WX};shkgki@Jb zIFIdC9x`rSf1SzZTobMESzLADQ-OjTsG#*(v!Fo_#9-e76eVjlcQbRdWjC*^Q>>+z zF%~im^eZPq0RY*FOC5`jKk{lBUiTb84Y~aa^peX^U-xS3`z8f#US%)j{bma{uGSNi zQg(}QvaItqiv<rZqL98kKld-<IwT0!P+VHL*;q#l&>A1g0XcTY@B~x$wT_!wC}}4q z;dT9-Sn9<I2Xq@R&S&3VCwK(LT}3$#U}!X#nBFV=6s#3xB(<!y{~evLG+P89b|!=* z>(m-M$ErxFL?cO60QN09AM^m9TTxrX??yFKEajJC;iDXId_cA)+U*=u`{uON-*@$# zE6d`ph!nlt2qSe`n{qMOR9I>D^cWTE)itD*L!qc)g@B8HqBgfxeR?$8&RVg!CG1PH zJBof2BK+nbGL|6{vPOEpV^IJIUS@WHnoOz3)C$g}iUgYC$<TLRi(An}aZan=af<(o zv6P)=H?x`76&(*49R#=9e6KdW#kYQT{f<*JIg!n4WHscvJoFGg98X8u{H`2>;q{>x zv1YlNhCt1+sscl-o76%^-gPYsK36!)mlPfjC0#2Y`^}AFKJo(H1As5yp$moY5`Srt zd~m9s?FR$BxprhrQbe)FQ2F0TD<x~;sscopOuj1<4B^P2Eu5^iB*2W4M^`z7EpS8( zxUGBY&em<r(dyrWW~gi=+x^yPQh`%Oj0BI2m`sfDqu+v}BPsNUDF^6JZh_mQY=`e2 zg|KQ|_x{gb0C*OGQ(`F(<J@~IT9J}#G5gCM(B!?c(6bT5R9=v#w6yf3)4}4q$eDwI zhnI&5ia?279E(K6sw~C3vJ7)|;gcnd+<n)&B(!x8mYxWnW9s1>Rb$HwCIOeZ9~-={ z$M2rDH_CSR94mbmjT$)?zJae_^Ccu}+Tf(^Zf6(U0Tt`SZ2+njSgA}{u=&={TF-Lf zT+$sK!X9c9gaM}6g_7f*6QDV9UQQMSiWq`4T5(dmKXRY(c8p9P3olhuCv9!7qX*3Z z%CC_!mu@2w+qhhC@dG(rB##ouG~#QaruBi>9!Z1nV7<5!vP-)6pn~Y=auAcfKEnbO zJ=+_5fF!Kyw@F}Lsuz_fbHH)deH?wmy*Yl2$^^N-J%Junz%mKSS%e6}e0D7=EYZZ^ z3^O>ltp#;g$HqHn?_9Jp6WAqCxp$#Bq^-SViiaf!Ep+{73=Z0u9MGz@OZvJD<~Q4$ zv708`1WVggG14lA*#M|ja(DZGQz<imercIUZp1NO)sn}A7X_N7*L5tVXuOAh4ITqk zEgB1xjrKT_*1`t<#_FWrNRuHVjCeP~(qB2fovAxp`KTy3bVA8<15+;}$wkSLDFe%P zJ-8$tG({3&?CFn@FP&Y*B`{a3>s|KtYBs3{CYj%Zno2ptL9+3_SmCP3ONRo0P5;>S zIi#p>?Dvu8NoR^AJ+}{1=O^MS!R)k7r%o9vTj-;@PNd6S#k;&{cT23-jj)M=!Qs}C z0LO;836!h#`xi?E<U*Oi#VD?q25OTP{R5^H7GT$99l_{@V84b6K<Ya>v1Qd4o&MzM zg&uh9(-Ein50$dj0~nqL8f7rYXaisBK0$>Wwq-bdE^LN1fFQ&o6lA|02wVz7CTlOS zu-zW$Szs(yvrr=R+p}rrrM)lQ=1$aTW-W)wZdiU*4t0|D8O)GpZhymi{)dx7LxSWC zO$M&(rEd}OqT^X85M6!)b{|1dw!7S)|8FjJF$4(dlpwCA+xt=PmEG|#i82k4Bg~zV z_J73lUsfxH07n4^VLYc>=b9Z+f0JB7VK0_&1rhs?F$YJfBhPak^3CTkje&=`{;5&| z2k|WBVicidtI_jnh5CN`s~6D@#oG3(l1y;7=3<)t?nn^GFAYd@0Wo)n>_t8>0tmr~ zG()uOB7xe4Tn}SH;7;=MVigptNmuI3(p2-8aDzk+&~a5#Jz<*%jTveCzRBs4Cj0j` zeOOgibIdz#jw*ErSX=Ql4R*d|yj);5T@3`FA5A#-U3}?7H}|>LvUI1nz5!uoroTtM zWTrM&92p==)R0<Ia*Kn_Po|b50KGnV_S!Zpyuhkn%Xuq4H^rccO06qG-}Azm@-)t4 zau};E^`Q&Frpt~6@+$C!Yvdf5W193=jc3>$qs3)dETlK=^39t9zPDZlF+o`STMEWD z58UD^st8jg$|jm^9+W+@LvI{A+{B(n2NkFXDct!%{|bdHseZUIvim$MfLxbxmT5S< zm}iRGa@<!v&WZoIXMNzb!8_vUJ28sfzK<tB^UTGY)ShBH!am%DvVU_#C>|{oOQ#q4 z(4qZqQ6z4XP-Z_(@ZIRr4F+)&pFbD@*p@bN^rLa+)P{<?;IPUJGxbmTppeoamjM8K z@oy~IdoHWsKc8PM!NUOpuGNrwX6(jOqT612>nA5GPqsH6Bp?_6flG5wlzqq+wgwaT zg1RaQuNJRDh<+@lp8OE*llz*fMs*PKHij*-twl5D!qv3~HpN$@3R`zsy&v1q)NU2L ze2n=IopbuM%9l3RK`P=L*=mr_qJ15<+t5#L+5%4~v$+`Puz-yFvW?Ry>f9vdpftic zt(qGWX^vZe!MgskqL%wE%3C8R>kK>4c>d_6-_VUWMJ8W%maZ?^t4T3RO@sAi93m-b z`z)+$cd$7+1bR^u<)_{euj^(l@MnInkJqeqPG$qTqee-Luh*)#Cr$>h@z!r2FY7N| zk{av)27|i651_|eh79@CbNSAXkEE#V-N$s&63<zjnpo=~Mhh#faLT(A^W@_h>9^I} z20v*XGbcz}<eDMMM^rI}NrLc?8E(|rewjYun*$ERM6FgWZXX~TUs=xcTOrRz`ES^) zIxdevA%QH9`58+-@)Z;dVy-@irNq^tKe~B!?8s6Bk~-WXJ%0B>ce|-UJvO+QJCvBm zPU8^S0JE&TBe<fD`%(uigo$ni-VtfB)|h@D6(H)2<Xm;8PW_T%&7S)zGi3GD?llzi zYUI}ylW`Wj=!uTVBSAa}VqjEaS8P8>O_$omN~6ay)H{ehVfeLx)hU>z#&8pqe~6i4 zdrUR}fR9IGAXED5`o5{!|AAY7>kj|zxfQJu)ND1$I(X3-uLC-KE9`-w*RHU@cMD{} zSg#zwhNhnxzJc$GzRX!@>PT-bPlLv{rTtY5-o{M?i!T3Tw?UbI{y1ZrqmOnA!3WjC zfrm9VWuF{HppJQ})Wy~?O~FOMYi|yqsU*5|NlH%rXE%_n=f>uFbMJJd&F;CvA^PA) z!y2O(LGSy@4YGp-@rH_k$Yry&V-&nQx_%zb)LqBg(`5(uz2Fo4j+&e=QBEPcFuO~4 zAb39Yhz~|q;rZ~nK@C6Q0j(!4l$Z7&qD!AARKzmf9bp1#nV{nybWd{fCP7<(dls=2 zr-Da*s8M^UHguVZ-Qm;N3*n%Vk7@;R?0!DW<)hTzeih=hQVFpxVH$>nOQ5j_;E%3z zODTud(55)@;0MYa_6VmwM2VkpODX!@tZjATpj$I~^1G}JjSE-IhJd8|Acm25YCxRT zRl^!pv7pB_QOArm@OH}j()JL*7-Zj4lBs%LVdN)y#D+wC>dka_VB5H!n+THC5{Jj& zTna{bF$nETP(za$(X>n2#5{~lM*tTM5fu>bD1qFUj5ER_72KF_LQXdI(l8t*J9)(6 z7o4pMh6<oi$1bsPzYq(ovkk2Lj)TZ_LdnUDyL3P7rGfSa)|+h$k?;*b=fTOL-|xz) ztv{dhLwNsNfF{fM+5k6#QsxXT1*q==w*&^T47Ei!eV*IjRM&;x{;T107-Ooo)+_o# zi-~Kn14eQAQBDvp^OkVzn;o0$V3mFevL$j$W`4sm^{*!+x=i>p$%dM3`3|LTdZw}a zEO7R418*{M%X2e^Mh2{aWN2%HUQimVsGqsF`9?qChnq)lBz<RLzVU#XO89s|@Kg&Z zkdrZQa+h4l);y2J!{Jk*4B1_}JCI*QA`ML#M^?@bLNTXbSlFO2{lE$z-n2!^$g(I# z$NGUK1eyjJj+ASOpDtKs0{WXCvcUrB`$u<Q+YDA%RP%O(Hrz8jAV}3=`(0&uc{ko@ zDbIH|%G<bJ38YbFUydqmxj4-Z3Ndk6&H}VNqX&C%Z@ClO=ON{Rm>${thTp_~|9Qk- zzHQ;6fpAt3^%~!>K0wH>sT#NNO@*yKS$SZBvTemS`yHn)){6b@m*bNCS12uSaD6~7 zy3vym*&+i*z~mMj;7H{rah?G#ly5(0kC@>yc0osApTVU^J=ZhVxBLf4OnrnUNES+* zUsYKX^ds2e^Wq|*ji+K`9DGaMlz0b4(M(UMM$?e!``<Cw?N`v({dcVI2jbIU$(CpP zm5(PDoIlSsv2n{aaTYqvXveks|5nhB2>|5ZLnF;cy4HjN0R5WxeHDriFZ4isbl*Q= zAWEalUjygB>mAgT=wlQM0@5()$h=Vw!yuaIoFwuR*F2y#EW4LuOTv;xPzf<5DGWl? z``rq|;P{44bl2&mQ_!~!(Tl?1T{5sau{UoKBXa{bNTu`*+Ul7{!h9pQNGF|6rLnls zXRr7PU3D!>0Xe@na>6^sA|So4EetDPzMnE9dlERYy+3GSQK4VZ*)uFXF*u)42oEa> z(NhgO$Bm>%+O9@|4wz@VtzAa-9t$0e>A^4=o9A&tovn@j4ZPH?Z$Fq@H)JG!8Sx7E z<5Jo&w3XyETDgy>mun5*$`x^@%g=ux?#LeZP2CiI1u!jI!;X=S|K?;OZtA6)#}G!F zclG_#c*2GOA1fPw(NHBxAX(sC@Y5nXjJET=WY`0o`m%~s&!gIb)YP}D4(e>d1ZXmh z0cBQsJQQ8KeVS`cH=q=PsmWtfXXu~$<2u9~h_bL5>^-H^UQbF#nf&sPEE*K+*<who zNsjskp!OF;yCu;1oSVGoVDR$i3Gwr_LF1p8EY<t24Xe3Pd;hxm*G7W08VqREpvKUB zi!{3IrZml%-)*H|xvn>_M#{Z1a)NnE!vp$7ro~NJrMvlG$7)<}b~gAS*~-p9t=(2M zBbMv^XJ$XUaDUn1emtoB^?O%yRFeshu!Xn;AcK8nuMUVl%|Al=%q$!~-xe8=IDa~> z+7|2}lve{=g={i3o()Kx%@>DY60g{GmHQ?COsr;1Tpey!Q8MA?-xAVpPH4uS)dU<3 zod!O?6nJ?$$ivrlPy~p%FZKoMf4uHIjSNgYEV}ilMy0UvnX28vBG+;G3<JW@lkTAa zGBO7qvv$#|yhU`pDrNB&r~O^c`mwN4B9A|itFI<&BfV}ddPbWy-5X#nc8K<&Qn(-q z8S@MyoUKKJ`#MQcl^8&=G2SBEWhiVg!z6j`X<X3UO{<-)M$H&Q$}XYm{^(X-9<jU6 z)NbzdVj~R{I3LD_@mVL5gNV57iF}*^ptz@02Zr50j$UVG{<4ZLJ*M6bMxcfYO`P}M z6S#CJ%NIoX4~<&!{UI5qvTYo^;BYr~%G1);@EC-G*W-G+vuG4q05{tW40X7?gBr4U z9=KSi2CfoF{(x~{cRZ4Rzp~YYVHJ3V8Qhg#faRO)9}Z@5F@=Y|N#=NyD&jE*$icM? zQ+H}oB2WCyaOHftLO#+;06zG!ydG^YjXV~GO!K+?nxJjX&06(VcaWLK&%Xmr*eqMb z??wp*F17ns>Xbw?y>Kxm8wI(nZ;T(l^<3@SP81U}NpT;2rHmHuPjB6AzKs6u$;QjX zMB7M7h4THu;;fOv_ZE54VrMmg4Q6XP-|5<QuIAl5uaz<grsfTWkd=f}y__Qh&)OAt zkEPF(Smfv8!v103!a$6Lr$DW;-5iB7=hzGiD30qAD;Oe?N^3`>&sCB_T4L*QqStL# z(AHMh8fn62<dj8qiHcB#Zi&bAFtf_*0uw?>m4n)sG%H=XXe{yUF+BvtQ9F~e$WK`{ z^Aa3#X5>H%#;^EnZyGrFA*-xZux<)3n)T=u2{vR<@1>Ag%b47wAW*C3T_j1OmR8d9 z{N*6p@NnT^W~1hj<i9urN`eZ6*b8{UxT@cDk9oN8TvodQx(q78N-WmF#iHw!#TwEe zI1p^YO*rXTe7InVTZI5<mircHou{rg1Fwa~z0w=vY&YQcFSG800eImJv@+X1VtB3~ zoS{?j-0#fVjAtdzu%$wn1W0EyM<(<$S>YSb#g4@a{X$t=ub`%CZ+j!xeKlR#hVP@x zN$b+e_cR~C-paFgQ28P&qP&pluQ&pvTr*V)NW#NM?}cc+E+n9Oz{h_?0;d>hCea67 zWq6jj<KyLP&)U<5v<;u3M@CMKU#HicwF}<k)XXLI-mB^mmePH1F-C7`(HY0g-;Rb% zQ*xQFB6kO-U@x>0)>XwHh&;T&`o{$cMk?zbT}20*(T1aOT~ZY&m%SGo2q+e1+n9kt zH-D@j+qV+7+YA77(QH;NebTp27H#`y%8uUTNOhc$(U}4>i2=R>?Zi02_n$;}DGq?o z2!w&dBkv`>_w(wdX8Y~W^P2S`-cVmeYPa^ko*x7PmB}-PRhLs4p4%O$yI_uwC<O32 z-ZW8(-s-_=a`toNOT~j^=8uTsi3QSDadkuk);zuM&Da1IFEGWyWnxT=P=ie(H>IKP zs@31DU`g(RIO@iXVo->+IV6YhE{}a~Q6nqMWFY_KFJW=8gk@nGn0Lb{*rVDaQIOdZ zLmbWen1ev!?Y&+?iT-g2d@aBqC&GhSv{8NPteL^ojb78J<t5L3l$ItIUIl!@rnnAi zR{0gOX$%8&b9lgz-v&LXgb0{;Wu)8*Jdby|t$$*4sE=7Gs>CHVc3vc0O8C?;yg89U z&XA+$1ZS1s7J(@G03^5dSyf3a5#`Q$8322)Q=MfvNA+&*z!nGvnAw~yr_Mj+hS^;h zmOG4BLC`TEi%dK4l|vnwzqB7yNVCiNT@FmL6k!0Su=bb7%zu7M%oxVcpg3wS#8eF} zRE7Q^D1%poP{2f5^c>-@`?6&g@zNTN(C13fn@s#_Eq%XSWoM)U*hRQ4bJ`&|fU9tC zPMFA=+vgan3j*w?$NJ8R{s^6dhd$eR6_KiBSi!JA1IRKFL1_n0X}qgHfbXWB$<N4s z$%TM~boFxzKJvBfWzW|RTbV26>T0H%$~$;?9d&C-*&A@mT!#b<O#=*do|nL%=@c}R zb^59s&JSn$2+8C*k93r9nFjIX8Xu>bUGk`$aLiU&hI(B&hK2<v#+Bc>yA-FhloKKW zS%%*Yw)K4A3i-+9fmOH&V}~#Nz$i*KR51V?K7_4)o#Etnm;SmXC!j6}+tDUOh3f~U ziR!YtEDJxz8BI;mr)f=UW4GV-r@ag~>@%{dw+4p5{+}`+RUY8ZY0*=`DmdxU_q6id z7fSWiS~>GF+>zm{he7sxf%NmV1b72vdO)Qz&ml~yWK{a$&WlJq`cl_lxl0f=<{m(O zdrT<!c}9e6&*!9n^pUCBZ{)uE&)zb15E&@Eoq?(y2#`+I3_Z1x(7{R#^rauuAPB8_ zu@+B@RZlN>OWs9?X!KoiGx7pa143Va34i;f&Y-)joUvJPYs*@~QZVKd+5Z~TZ}c6; z!6ornEC9Mz7=HzYOHwoyhjkG&LJZK;w1La{lkVz3l(goGHQlji)`^drizK4|Af*`# zZ?L0LNciVsx}0T{<|~aEZ3Fo6Th4FNzh1G3FC|8ey0$oRn8loxzFYxv24_CJI47Ob zL#Q*A8CP~($80TLY)WY#9?rILctcxDpQm@d-U4+oGXqYW=aJp{Q>W`0DF6We#_gNT z_}@6OqJ5)*$OoF&{vL^7wPK^PhhRZ8&|=r#2yN@bz-DEG5TWDTM>B5bs5=2$!=13w zH}t$=X0s&hOAB&i+{K#ZtfNARP?P5KOQh$&=f08ZYvT(~U3IRjKgJPQlWV%!JqEFP zk>?=POuf=5`e5|@H<y#?M^FH(HGkjSC#%gGT5)jY#pvnpI_=2u^EZCJWqDiwU<7L1 zFq`ue7>zhq#l$9O&3eI}4XOd98V!i48fh3nTU{*?LC$=6^q>(^KSHVGA5;U>yg9+p zYH=5VsMRQ-e_;_(TUy?-_VS$!tpXs}ip!p1kXk=cFy&o24b~Z&7|{SSRMvmq%H9*x zPDa1!!{3-J`&!g+%w2I>>Vb(5TbK5{$~#$Yc0BZWK%uGLnec<WpwEntnm`KL8Em>o z(ZXxNhVIM}MkED`@r9}F5R|-Q7Kv(O5DC<ifr3GYCPw1OD9CrYm!wW1!xw7{nUdt6 zC=&y_|G1bChP>IjPPYU4I7A`n!bVbJJcm4#jV0QXEG92luGuY{(ihI%Fkf|qb7$Bu z&<DOjPMRmxnnuUyk#y1C9b9FgR#-~Fb1{KTcMOe}%U}EuCrDylh>CcHKm3t;z>*Np zWizN9A45tgBt-j7f92^kKY>h4*)nRd8fu~Cm`#8No*|NlUepvoyC#$T(GX5=Ldr2i znq?ksR2dF;$IwalWId&ll!Ni6M`(!(StR}g?WL7&tE+&`f-^B`a?~Rh(*(1x&3Hh< zwr7YSGj{*;+4-LNwvqo6{Ph*;=;KnGh=<V6z^ohI*<Q@;9q1f**6Aj_!F;Pt6xUPa zBgw=xB=LFlvhWNz#n3B&9}TQY2byIQZ;4H{Hp^rFHHc7a*R<ipi%!vb&RliI*-RR` zY|e#r{CI#Vy5#Ml(s6ZrzDI5a{V%r8vAObi`|`1EyJM$gyJOo<$98gJ+qP}ncG9tJ z8<TtgQ&Tfl^WeOL-}%;FpS9NBxDliy1(s=$>!L(Q1S@#dJkyeAd!&FY_r79P3ZZMW z$S<f#IGclB!m;wncX$E8tx2n0S)xtSr%oP|+YiNTxe$PN9`YTCl)dpK{Hh&9d7);3 zLKVc+`<{v|nEbDzRFaqux(O5IA!4qq>^@M68yGyV$rDcpZQOB+z276??{5d78Yj!3 zfyiN8EGiBavS{Y?KWm<})aC1f`Xi!Dl^$g^rfBo>7()wa8q|WC*UU=_Ap?*S-R7 zH!?Ub7>EEw7H@^&ZhOAI(w0pg^S2WGqtwppRjS^f5@;2PBvYJoIVUXU4=r7-E={_Z zsv2+mGGltWPAKeZWm#ZN>yQjr4vFa%A0*fnnMX{*v>9bJkztzjeNPjX?HwnmSM)e1 zs9Z0DJa2^>>@l?qP@2**=5*b_4X!^2M!WsOP}l)0ejhKl3gwH@UQ?qF_9ke%=~)@a zgN!w<dR%sI=E>m(<&2>hnEqi^HD%inx3c9R<T4nSsmb<^6{%|n5Fjp<=%A|>=eTu` zuDaOAJ47%E2agZCuwUA59yMstmqRp8P|Tg8&Z7}eZu6BP88UCAa}qse)HBY{YsLF_ z3g`gOP$eI@Q6H^{Xo{B8@ZnZvBi&0Ow2W3Y(_P_2+%Xz<N>nLNW!fZxm1!~-^$lr# znvG%Hzifp*{ACJQW$7T1GMb2I?Up%-a|l9k3BD%A(fExSTN)xv(9<jj1NxrDY_wT2 z!Va5Jf2o$o3*ibjcV+kzAP<rEyU+Tuv%mlgLyQESV=G5UT7fS4N8`P2<HH4mK^lWX zHcfJC0lB@zh@JI#99~LZu`yl6xP+0rL4UDg>Ghq^$WR?)?PPlcICl%_S#?9FISdAV zn_rzrqOOoO4qfv+2C^tIX;<cEGO7^;vCoxQfSonm=J3=vPIzX8RBQH0pZjf||5gM{ zqYi%dmqO<9&k%I<B5wzUrv}2R^><y}dQ9AayiW?3Z6@s1*$O3D2HrK1?it>R*eQ;l zf;X1%_6J|C*MvXnClBmT<9QbDD0Pqhz7;WM`#!XTeT1%Om|jK9Jp#Qe*@~e!Ord}b zVc0(6E!9tz$AUphri%y<QmX$R0LcSfa^qXSo(j^u^QjKp#-D;j8CLw8j;PmP8`9oP z2DCN8EfFPK(C%oQp3Hn-bAP<DG-6?&ITTAPw|j!|-Lh4^)Ik~H8KBwLZUQHrch!RC zOP455p@c4QJUW*acI`;tG^nwO#YaOryQ@!FVgF+2Hdpt&<8LoWgh_XO*6;>g6Hexo z<o(`TY+=kiQIvx;F0UY0Z9{Qv(mo3ojfSGV9in9ZZHM|9O?fkRsog-UUM`@3g3T`w zn|L|gx6)qK2<75EAP4I4_JuEH;61O|ThM(fKzy32ayX?g?RQV>F_YwW6RNZhPI^H{ zDlnz5QIYQvE4zBIP;XiPj(`k+VVl|Ni{cjDQjC-z#2+0;3^Wap*Xg{KsrVuS%wYhC zgTF*t6q1_2jW0}DR?O;^$@vXtLp6d^MNNw3MzKrmw0p5pRar|j6BEiaBQpwtD*O$` zEK5Zi;Stfafj$wK^S}qsmX71Bd>Vl+Sz&Q8oge^UgxG@%@Vuo}Vh{k%BYHUn^VEuk zZ_DR|NK!TJv+atRgxh8m`7Qk4+KfqoUTxht3E6M~{?)^qGdZWDMAv15<mSg{5LNnC zus=b&23f{Cm7J->UyI~|e_$!<z#`4<MOJZdJqYFUfP8yH5I2L$vXb6rDGSRW+T?Q> zzf+V^bM%nKqDt@AjW+<W@UL<ti(3bSM-c@$zz6%`h?&GvCAU^N0`{C9U8YqGa~d?W z&1^*nTb-(<F50#vauH0_@hP$Lp%f}w1E_v%h^~xRp%b*<d04Qe9n1xZI50NkS)>3H z-Sea(tYwQ=aQePm1Nb2~7f3OzV0G>mS|nHiFWI;5-*Q$@h;=|X3fS-y@RPGFQH$~% z=K07M1hBo6NFW+_&B^6e@{K0#*Ljf6jn=Dc%O@T^y}-^^a72WG?(RS*35Y-MD0-W~ z&a!he2Z6R19Az|T4AERwx$-r5vhZz=`~;nf0hDD-@*l9pSy<7{9n)}ub2ZDQgIx)E zLHh480zHKSsz<=uV$aXUCy1cg>^TmN_s}bS;BRLLm{nVW)p`v}cN5+jWqHiTO#4cW zV9kPkXWflDEuC*pwa6T_#R2vvs!F0#(jrDPXVrG>^MrI|Th?ex8BYe_FHmC6Y{aLW zS#8APhPQ#@jeS)(+e+$QN*1;#hMX!${4dx{Bm^75`bj{MtnRx?UmF!A_AvYQ%i4fX z!<M<iSWpv?V2!>r!Qz-4NSE7%PS>`dl=IxODgv$z>IQi-d0;kw=3a67S^wRKVu%m3 za&u)Fq`|HL(?Oc4rOW(Dj~{-Tl??btfZ-rX^Q>|<jbU1NGMP$+G9~5b##2VZ8WPjS zx+iX9dH^6nHFoW|hI8O~c#5Jz)pN;|<bKR;Nq;*-stQ}!J8n>MfGj2?{2laEDa-Bk zpOSh}2{pv>$kusbM<7|m^l3dEYqGWIMZ^Rn<j^eWoniH6F+Ejw=xz|{idD$|U-2hc zhq1k7(k(}LaDEp;6n%88vs?y_qbKEuo3j~UPYS@)F0><jU~ACy(JZ?e_9ZFI@rLc_ z$#IO|fa`E;;38*pDk~m-iG`)(P!?Sd71oYhqIIpBa7eM0qHusm)3T*viWpp!;~z13 z?!UbH-|&U8c9fIF_lLq$ci2VxQY3ICF8K$O?hCsPEo)0+&b84YB0%1Mt65gN`Y2Z9 z4nYBUO!?idda1x)SFf0|<OMq(rqb;cOJXg!5gqDQ8Y}W&iEx`5A?UawqLW2jb63AF z`tl7rdgU>iRrHUSMRFL_<Us_+8Q-KbjI=Oo?(=J7rKD~wdS+2NeoZFqCSRQ_JYv2Y zdNnmwuY}D~B})!_+g1|+#q?P>rNM!PzM}#1wjAAVvamz^;Bet_pbeJ5WLLv>xExI7 z?A~5GqJuc)&2$3A2$sUY@%v`Qt&Vk}tT+2hf3ZjhwR6z~{RR!m|0krQpb*Lsm=oCU zuwfD1r!#GuSD`N6$JP`qF)N{GXs40Zr990g8DVf`hW8v^s@cZ+h}~<U>GfX7lTiv- zx(O&Vm8UD|BMX8qOwtb}`id-@Q8}hzf!8#&^8uOQ54i;k1`pY^NSQe@TNj3hPFk%F zoiML~ymTl*bP~PbNG~|nhD!PlY$vJC)e-=g-)$|vYK^AG3)102eEn(fE<rRNO{;Vm z@S{QOg0XZJ+{wA?>{9y4w2-7Pg5m&L8pkXk3YOXNX+{QhY3_w-<@=$zn#VKN)`_kk zR?*nZ?f;>cUcTIn%c_Woy0Lj%Q+!{(d4X+qx@_M)0b>P&Wptg{5n=YNIoB2KrUI^f zz}S($N+TH|VU%9A&KgY%HqFtfN>amT;%`FvV&e)Hg8yND-o73Vp<_qW_rwCe9@V>F zz4!<K$+lwb(;=sttvq6x)|(8G)KI}aKAT78c7va%)}ro8&`^X{j%SzV2-9jmCrh(P z=zi};fN~g}&(0kB-s`hU(lZi*(7;V?lVp4$#9NJIs(+6k4JSqB<Z2rq3}|V&n_NgP z!jJ~Zm-5Gt{40p4>O)rQ4X6e<k)RiG)6a7^hi=O0IzH?%a)@*i<X?{M0T0Wn3zaL) zFh$X~wer$n(nJU!Ac}mMJx~0baR@9`m5G0w>f`bqI#|4)74`Z;z4beQK|`~K9sZ1E zVYTaYE!Eji%J61QGf23M8KzcS(i``J{+y4cP=N;>7dWySoLgp_8)5?lecPx1HIC2% z607ABU|l>_!!lc9Q9h)=ufSg3>#mc~mYyN&Y{<rZu&CI?S_UugyAKk2xzB7Y@6x5N zNHhw+Z5>DDC?Zpg5U3qM+~nCpy=_E^ewH*i?mNl%+K8>ty)odQjKqJOoZp!PN}mj} zQG*J?Px7O_{ewxo(zg!~?C4p#pA7<ik)!l->Lb5}@oOGYrw{Q@vHHh5xE=HY(PI8y zU`=V^%2=c(#7uf%%Vm8m5n#YW6EQLdChl9E+a8;Yy|zw|Myuu|8Gd0(q{N!cI4-88 zZ%;zU^q?CvKwL@_^WH@NGH1B09=g=Q^59;&>xjSAhFC1`X#b-XASX1_OT@*Wd!;JY zVVwN%KNqLIEA`*rF6Uq)>?-{v!LSWZwV}3<uZ=EMW0j2oj3g*LY@hJ$53Eqgv=|vI z4M8zOQLTV$|A+pOdFFrm*tDviJ4PlDWSzw?T*MI5D&F+v_k-A0|J-Ml5sk6P+%xfM zpK;Rs!T;Xp;=KbR5rmKvBV`>0zRKDJ>DtwkDN4+}HmGD|W0He?Y$@-{45`G&h5WW^ z$`twi6}ZHUP0I+gY-$Q-N0V|ZwM87!)Gotc3BTRGE(3sGqmKkQBmKca850JfchDpR zlSvQ^bD~rihp75<8}u9WT8s98T5fg|CqvQ8dj2IJ6kz}^SABcH!14HiensxBleQ>h zrGw!X*byqr=RrGifR~_}v*&Qxc}X}i+$%ua!E)lh{aj4(V_ZBBRFsf+58rtlPUDym zFKZx8i#(FiDE}9)DVvVdeb+&^2X!cLr2}|#^0^ILpb^D*A;3yfwXKMV@zP12*gQ(( ztf8a)pn?VTRNtJ-cWsjA>V6^#;)%BNpNbinqg?!p+ZI0W0|U>0b-v(`N69=rs#@?V zhS$+ho(pnB9ST|Ukg5(xB|%)~-#vpIGtY@TwwOcMTJ01epY6E8+fZ4Z0g(6@nJ*d> z%zy^D8pzhGLAL&d>N+WR>%ke;bf}n%A7rA>(lP<yn9_m|)pY~aouHuEoPig~`|!eV zI6aq}wIXs<@&=~$G3>YMa72Cw?lHb2kN=eqG2v6h=r<>(EO&I-pRc0MbcX`l<dL`} z&?@`KgAGQHe%zDIgpkYfE3?!XZXZZ!|KsVCYyiVPhosSQc{dT}YP*h|#t|-IWi$XR z8cGXbW{@NHm?TRz2lY=udS$>u^RUfOhJYH?gpH=6CwbgZGwm$do$bP>J020C+dIMM z11ZHRq)?fUQuI&p{o2T8&^RETsSC|Dd$1@aUO~{lr<V8qFVp5S*P~Wd-Uo;%mZ=S1 z%fbGdM|mo2&W&D)wmv`gjRc!2jW^NL2M8vBW;Sd*?g--U!FhuJTVj}!u%%5(`)l9F zAQ5mmZI+Rspxe>&Q9|%!&`Y=8pjbIAt+Szp*bRDfyZV$n7r-jEmw6_uB|Xs{8{tSf zDN4qb#|te4T-=rSHW(3{sl<dzf>$OPVq7h!Qt9NZ-vP;Jf>rr`c<P&(6<3}jrjZ1| z>wbexTI~b0xrzr#BL@$dP;z%lI25ZnXH-4e^Q`<D;-pqqPIxG_ywF8C@Wt99pt3Ei z<-x~eir}2Y!zH8fzr`csAcbeiFMZa2>wf9xxc}%g+j4Bj?pjSD<1Fix(9R5LOb{=a zK<4Zr%9X*VlMEo-@y+&-OLbR;%R2ygD8xJq{M2+U|9NB43UXbdNy0ID=!P3VE_pxE z2QFn=%N=}#dvW%(`{OtyR^JjbV<W%rT^|=rL@?Y9aSS<*6p(SRmkS0{C$JkbITk_+ ziTN>ci)zh_(Q@lxGJp%cZ4?(VOjr)05clGQYFL|%)e&;r3xvP+Zf;KC+4TaxIW{v| zeK8N<2`{nO`7s2WvL=9CDZ&U3y9kt}oLWsu#Qk$|WUKd_pgB6CMJWv}C?D71pk@3e zMWrtn8JkXRH1ZmeE#SVwVbktF(mJ_O2G%i|SaWj(Nr4d_8Qru87cq(f2evnpR^`(B z21Bs|;)SW2Hj^Hz1ByPChpT|pGpKnrayemd<ORvc%_-JvN&k7+-A0naBlA9zLbfQy z;dnNEDj^HeKU0wtd+oWFs!`E$_O8u{WlSoniFET0<%55-wQtYpiz2c)^&@|gwJme` zP}w?*F2B|&3G4F<369y8z}tRazDtO)lMPUW+xMgo?9rigl_!-nar*%Jem-CN6@0XN zUq1UGq-WTWe77Axm|s1c%EH{RU42S%sc#4vtlZ!%#^qaE)mNlTmiHf)DZQ*XiVb@3 z)PDOv|2CIx9i6~>?wW_Q_(gLvR%9kt?A(tUSsF^%6+Kg%_#iX}eOKl;Wa8gC9^ivC zmmkp9$VlSgFNeH!>QVp@Fqr73%=n}-*|E!ent@)6rlUHt*~z?Udr)c*=NRg@;rYk3 zF(%S<jc{W8<Uu=@8h2PIL-7L^tUm`)P^NOqC9aq_!thJK4KS@%BLv79<Pf0gpx#)l zsN1v3?m-<!b1i(UvlG2Fy*?LUtT^+-KZ%4i=C<lFZE5ZT?5F^+L5-0ekCF;zR<W?l z?rp@b=tk14ixhoP#x*v;e}%T{mM}{L;7OR1Vjq{sd@D9@S!z(^{Q^L;sfxq8bP^zE zD^R6a*<21;%OBt5r)kstWudl6aart}UC7cNeZ#n^rB~@IEDXf8aSwP<LEI}C^6~q= z^zJC~(~`ig2%iDY_8ejXL!v<o!l$xBYdX-kAAyo5M3PcQnH<%Bw8=H7FG%fb5w&+X z=BP#P!uCZLas-h|fb35LTD`E42|nP`t4vutj6^;v2^m*^{eViP&$0CPtWm7!(%k!{ zQQL8^S8hy^M^^q&u||CkAfQc8Y5NWH%qaH%vPy^}K-&L?mAD(HH@Xgn8mXH)a6Q>K zUF|1@p^RX|`%FyF%c>aDx2{z0WrD!S)<3Ur>NO`#pBr|w$VRq~iE#_e8v3wZwSNbp zy)t5C0I)YIkKo~FNy%WPUp=$vuPvh>tihWxcEfs$8z#tO(l-8Xyw3=)%jj=kY=VG$ zfR8IJV&-20UHRS!OPhS>A5;l)`u|6jXJ{it=!xjLYEaA~-F@2Ts*(y0*CSKQwRBYz zmmE!pjGeH4KMyRc+Y_ng?|y0$eH*fm6X~voX-Q5&A`NidZUGxJBkK`2C%StM?jL!c zXUO>B3^;=H6El~*Z6%>kJLVr#-?ZMyE{!<SNOJEv$Mfs_uf(Z-?2PFAph)a|DnLp? zIM>73<4DRQ$x^wyV~8A6<74M5zksGj4H1Z|-|x(9i!gtc%m0%rFP8LA4TMrX2MnTP zNYsU=WA!#V3yLA}P@}A-22MstExq_>bvh>CD?i&l!$WL~9t~rFTT!+VNqaUPm14Lb zTo*-zPn7!O6b&YPMsl7>D$rf>ulF1E%F{6w`d58~cY_geX6tQSH3{}r07w~YmdIM@ z9+PXPnA73`y?sPxV18D`&J~4V1hOqjlM>lL-8S!G63Oj6;~*Kvn4PxuZd2agpQA0n z%ebNCEYj&ZeVm?M5e0QT8rt0uiUDfVBal{xZCALERW)rmQYyE5M+me8f6RzN;Ep|{ zi{Mwh{42^Am(D9nAFD`QQ8bQ=!<;srFuq@>*RL?{+$n(KV(LrCdXMWGd2SR<Mduie z{3It;#BmC;xDzUjYQH<Oy6Vh+goHQ%rsS5yL{2TyB1(+4_%xgfXQ{QM8@f#Yw4F~+ zIs+1%Vx%e0D}MGOrL_zw9(!-nhX{7l!#Da@{<L(`MmZ{Y@oijDUf;<Ei+_Ja!fWwa zR(-mLh}KI#{d5yqcd^g2)NKU~R>;8eVh=Oaul>a*!pLLYM4`ntDfT)ZiwSVR`>PyG zWGruFEiag{M5L-57vCu)dWmWJQRa!<1Gcn#Q^LfhMb}zYeQ0k6^Ht{wnN77KH?)5p z;$UES;ScJ4l#8jBSz?UgqdL1V&y_o|a(byS-Q?+aOjY^YA32XZ`zfBCSH#Y!^b8@M z#^>XeNZmxbt*rFc%6w<YBfbQ%i%fyLk-Aq5xHLcQP0MLkhEodC>FJsEvguCn!EI$P z14jM3B{9+%nV~hbNY0KFV+etcZF+xet&^yh%)xOJ$6q7<x#>FJh2q1-Zf|?|CAydM z`+S#N`e?x!F@6xrT;rdQ@QQuf(nL(~HmNfLDOQ*ARK?zwZP#a?>qjSG9$O6CGA6tT z1?n-?xR_2kU*NnoWeUGS26OwrkQaHe%wH+eOat-EV~dHZAkV)Q6L?|hgUFxm;fL|s zK&=s;wm3CA^g1IK7pc=EIE1)_{CkonNEC;ID~C1X2fjG(_1z`El5pDcD&J^me&~kE zdl~O%8Kjj=jNQd)11$0VMI1yR?V{2gqzIjl!Wg>gr==|PKXX;y#yGzXZc0~9`6ptQ zNwlO%*Vf^40z-1IS0ZTqjtnE~!%k70i($AA=4mppp4KaB>v`E8Ma(RA&0C4SuadOi zNHWBZZKG>(sqNCGn{xIT=#XWf03mnQuw-L=PUULkA>F$A7l6xF4Ti^tUDU{Z`f>pq zOV82SO`I6r9X?TQ3|J$-GaHkqv#w9~lWMl_i<~OgD9V-_0#jn}YR5-m*f)EyKWVST zOTBvxmc{hsG8{vTw&O~2jR5ryQf=C_=<yYFneBs)9Ig@-33b6}7YMadTV*Q>%~ZpK z6$&&_UxvyA2Q0~#=p}hJnU#*qmESWpMd}Vdz0}z&rr<DS7hH-2*61B~Pg5(b6!?qQ z_mYf4If9q>lfNk++L`3~$Cg*^{upzxRwu0H&+Ctm!YNXHfGovrpG4rZ5qKXIMDicB z4P~6Gy1Gghys3%@`QpOz8#}Kd-1H-vAY+6?25%o5u=JFEvCm}+py-yZ1L3e?LyoU; z9G`qDUctQHe{g#BG7><hRlX6B?wRx?z0MyP!XfCRfyb=jHk?`IuvgAu)BC~1lV%Aw zxUMkSCm90kG6_+4<EW)*w!LKj`><ZX?>@W`{9KlJglZX6sYH6=#rCe4G&Pk9dj+6; zCuXPs9_&v{c8&glSi;e}RgYQBz%(g@E3xA*5UhF1stI-S0Ze;R4JSAG(>yJGQmPz; z2m9_=*_j-Cl^)iR>w`nI{b?qc_$}W=C>;@knP#FIVvgDno9uekAu(BKj1k(as*qXZ zvdebmj89d?AYX~n6R0!=!L0h0!F-qa6|_2l^F}5SS$l546;1N3)j))}v!P#SvT3aZ zdU7C>JNWYi#ztm7B7&2#TPp4KBr(^669O82-@4JSy;iWrd`aD6bX;;UOb06w_&p@r z5(^e<r`QRBE}EXqAw}k#F=&iM*65cfnIG9uJ13GF-j7q1zIbDHB-#-f-KI(ZGqnKz z!)^bVrPZ{u^=Bc*8l1$%hHqMQt#fOnC_<ebwJszW@JvLL;{j`EULH-)9<!SVk56jA za~DZ54>8pw<jB)J{g85wz&A$oM(%>|AVDQ%u^KX%z=9KECRV$VOaqO)5!Cp^kG~+B z*lnv8Ez!KxBlolD0XzI*^7BdL<A6}^xPx%Pn=4;CZ2~w-uOpWPZ|cao_p6Y5!4X*z zBV~1hp-l5@UeIZ|?tio~98UXFkqki=>ygIOs4dgm$~-$k?*2LE<pX%o*J*CTDTwnL za%*6we|mdE#dR{~4N%GrdXf4$U($hGpcQN$lSHpfX%eOtA9cfb0>yH0hynCj`FYsn z9}LzAEW|sbjJ(NwY)fGX@Wd~jLei|ZUUTlXl|}9zPGI*;<owQ9X>RNbIn=1$J`dMP z7MdLVx23Dq?CVSAP7iy%K8bvik1>fFd=?Qg@@!_BO8V&IRD|fT_DPR(^Ze8khZnE= zLV8|-eyEI9qIz~bXi#0&Xn--P%;P**kNX@E->o+7BO<(qt?oYo5m6i)yM}>p5*=&i zob>Boj6%$s99M&^N62|qVrf%s!EfawRX#G)R&w2l)ew;7GUd<u+SG{|MqBT(a5W4> zhEBGn6WCFN8s&AqkeO@`#Dn_=4KCW~$IM(sw)JnI#9-TYyIfeq5de{bI<xFp{j&FO z2Of;gy}Pr;F3TWW@913f1vr<XsurODoqm<x`A0-4b05`;!};f-=b^M?M85shA<~wq zZnCj>fwMmZQS{;mAN~SyaRK}^2J1@rBE+Tw3@Zq6HJe|09XZCGzEO$1z_C5SvMvQB zcCpMo=<&3d$|QQ#HGttl3Q#G%sE!=|2~cAjZJc+}Zmb+VUG3h4zSlojF%070T%X-Q z^-6x*P;KdLM0`gFy4&GYne%*s$Y2d=^??RCW?+pjr$B7{Ayn6ji9%fh4(pEjc=)ZW z74-nnH+;eStMD_;2f^)%%|6S9fIzL*GX2&;Dv)S+<4e^hRRHf5rvWf~^dWy9hYO2k zNtn?-!cK=>B_nWvzWjcU?PV#Q8k7HhC@c=N<IM@Wp4)+7&l1OzEF-$?a8~8JTBwNd z-R`&|oMqETzasJx`GZA{9^RQvpb>?`{YxuNY)VmTu}e>=19{(1RSn>`XO0@nUuoBi zsuL|EM1hw<01)GVmt&cW#<HRxlUloaNL(65tGBRNnA;jFU)i{f>E}Kc6mmINd>1KP zF*dhH$|j$ULq?dh=E=9qrF-~2IaHf9W-MU7F}+i4K~L)qT-Y$L&vWKs&#c-@fMfzu zpja{k#y(J`Kgtp_4yq)T!Lb^rr`8zu?E#j;lQM+Y50H3!8p5Mbx7F)af>U;%filX? zy!TArRA?5sYle&>aJB~p8J%_a8}XFKc%Hp*QSI+psI+<F#?%pH6K@Mklf4j$HP=<^ zkeCJ-VnQ8c9{4Ht=>=w~RS_CNOUnzSe|v0QMd?-Sgi7voNvMp|b;7|{JnrvKVEIh@ zxAqV?0Bk2{&fSaqYYJKDN77A7Q8sI@I>#1HtE#^<X@=!+JOgbllxF$h3(+v(Gm~tF z-@uYZ1sj`|>s1tYXh@&}k@vFsMZSUt#O+7$&<JWwlO<M!F1Hh3?_3S3T3D7I@}-ZH zj7x=ddyvcrDE~EI!vB5P?#=R(KJDkH3`W`V2Q(a*c7RWe;n%lShkla<hCSVcU%-WH zTV~2DFfzK-ziwSrh%nV&{_Ou=%7@Zpk$=JC5jdpfI6EBO8m><fYgo2*$a})}Mc9Ea zCs`a4*K4ELjD-`;BpT@^N}qW2y!;2&a}V6tvh_0jW9=ZYPD}UEb|Fu}KLZ=pR?Tit z0{&d&r!O&8_3CZ)*{_MPcM@{l9em65iT_d>QVjKZ2QWgz4A%%C!Z;z)*8Kx(kLK;+ z5dddXc!ww#&<)qy{fXJ^G=)VAZ&!n0k7>p$S3yM6AK5y^JQ@;F#<gFXGTdyv)R?_& zwHDniS^V6hNq;?kkXd(eOM3OMg3}dU0X!egrwz;N0g-udMYYkfj_oU?ioYSA9Z<A= zREXPRb8>7@rA;ai^^*5_W;vzEM-)4bz$y1rFlsg2D#q@Bz<y9DQ(lN)*95vE)<e+j z!ac*@Fhp)ddggJ0c%F^v7cJ$cY$l_9`(dfy6HtNAc_lnObOE5e-mFbOzwC7u0J>to z4|($oY?*Sv@YyMdV)Jv}BI)a&36xWnoDuL7Js~of|AOTje)dC`J_+P0em|V7DZ}5N zB;-#=cS1T-jw5OHte%Xo;_F}RA506d0yI5x7vhITtFM9j@}U;BPSCBge3*a3Ry6(u zMP6gE-cTW;CdcKR!;}((H)qst0I5;kRnlnx8W_0>4kR6_csVe195CN{)Y{J-Iw>&3 z17)0{2P^SKO2v-qqSw)b_zutX@ukCj{R`1pbo={qf2<?Fw;$^$TB-m@r#LmEUb&{r zDqsWrvp8)t`W;7DhyUFtKJK+u4tNr&@|k_)^sMU%2<Hrpe_y(%1h|bAFw658gcQVS zU?w4)3zNn}8O-eW<tf|AYa{zJo?JWnyU{6pAgcwX0?Bu_5Wxus49yF!baOc1y>+ab zv*QG9MpH?q_?8DZO_9FZ{+k8n?hV8Bz6k3g8JIi7obMr+V9%Ku*`K+aIvIYA-T&fH z4}|nq$khqIjJMx@(areD-$-0?)TK&pBsvIrqQa@zj%yEN1<CEfdASe1Ls{{8G4Z96 z;gCa$ZsU8m57$Ae*)HxX77$DMB@w-s4+Q!72zW=j<#2(6#bz0v5G?oXGK#B8_1*@- zZnH3KlJ_v0A^3IhWoD>1Q$aiH5~G^<!9%u`^EVRebYSL7gP!C8?4*C|LcW@kcu6t_ z%RX?YsJ}}E!ic#$6JqB~j-nRmpIszQI*pe0I<5MvNUu@n&3#7_gJ)5w+8>{G?g(Jv z&2m0=bHyBpE<6&q7Q@w<S?5n83`TK4=16zkXZ^7PaVaf(VlHC5LzDic8u~GR^9IYd zl)lS?c7LEKy~J$|$V(^lRS>11ZVg_P8^m#$B4aGn(2>rYXoE9T%_R;=w!zbHC)>I4 zmpWZzz))4>ZkF#CgMj_V1_Z7m%=9;fi?+gfu30+5dJBh!wsUO5Jwcl(xfP_=c6NqI zR1T54lmXQ8%v_+C3~`)vQybKtR5(lcaTBfSClf&gW<G5InDE_{lNg^>{wwq%ps{j( zNOPkl{h^YrJ3$g&JE8!lrg5}(UmAPQ9S(J|Q*VfAYZwWvYP2<gFuQ$KwH+p+N=^b3 zD$pB=W(^FwjIKYz?N-~U8mwthS9vEGq)md$|Ce#n6`nJ-%<#7AP?0?^I8jO7&+4yQ z&|NH9=T+o4fXh<Uql^aL+<U@gQ-hCZ|E8T~9on7P>O*Bo;sEGkO+Wh7F};ct+|oFN zRW~u>d8eO4BP&Q&U86;)k6o)6;!h@ZgL9frAhCj1zq4}UT>aJ2MxPyJc1Yy3g%7Mc z!UgFEx+K%7KqNLiC#9==@>nGu5SR3A{GAuL=PS?=Kro@zqXx&;`K&*RbjC}8x;Y#K z35eh)v~a3NfXnm92i@S8<g<T12VTMl+J_>yBh<0dfXZfxIS1qKKhWw^OBV0kWOr%- z@zOEtdR={OTH9<H*k^$?{)%3_|E!O6ESJ6?#HsXud^1UoQxS_rP_vlZ97e)8Z)||5 zsh-zhXE`s0qAy+1SD83A!`o0A7%@vqrXy2Ip1t;^q_cf{H4kZ3L2gQZ#w^R9;#l=5 z#DQ(x%wsjf0CH=n0IC2%=7$EU5@!Unw>{hbzp7@7!O!Y@3*or<d%W2zPmHPj1H%O? z_agJyy?uIC`AVGep~;;n#;!6ryNCel^bJVIS&t9N)YjH%hIW4_?)+S+)wGs=d>Z>) zZ4n*;_)eBkI1H0GQV-BJ*U!_1*P)WCw6@VuaI--$wPhbujP*AchjaY6ZO%0GEq)l) zYT~E{e<|!-{%Nx{R85GPM5j!02JQ&i{m)oAS4iAiR@rn~DD3Tx8!(=0BvHTwdLj4K zUqMM^iBoF)=8{efC$zX|-EvO(4Rl-w0w!155kY~uIbXWagJ(4lYf)HRmkYbp6gAP3 ze~|tr1F@``v&0BWk1ozJ6NGJ!5MrNe!l_Ys97AE>ff$V|F*nWrFq(JBkEp?zxpseL z?D6jFS?jD>H!QQ^GzD=tnWq52jc(`5VwqtGXZp_xa9V@j;j{J=2qnrV0z}PU{zj>T zN4mf42B%TRUl+@55egvnpu}3E4OLAUDe`#KD#t)8IZ~&_&uWV5Q&o%GO|t7`TLNsi z3kmrLe{B*|B_T>8uOYcz4n%z)Td5kP)vNV9_z6^9HZN1v&g9x}#K!<E1((CV-@YEQ z$c#c!pf-W{m=*ywzbV^%48XYr*io1dPtTJ9UkQ;4d^V0DrJogoVcBqpKlTV-Qsw5W zm7}U&_I67s!;Hs*H{?zqIQ=9+BPw;$Ru<WpQlEVO-?oDx_~|^xKM5xSS0d41&X>wR z`SEa0j{Z0p>bs*iG&O)h65h%curxNrxz98=k(pWHS&@S3BQXCd>SG_Siwe_l#g7x> zqTew4gh4w*2l-zw<kC|j7Szzqv#_&hI)!VKRUH2aO@kvFG>~k@>bmX0`_|k3=xd)h zcb%)zb1A_hpN4Ut(-9IO5OUoq*;Fsym`Y+Fe?jA5?!-X^FwFp!3O0f^3x(h|*KMGh zmQsTBlk&-26=AmT3q$-v{--2sFAq3*T`I1!yM4wyq&B^wIW$u*j^S8MO<pQ|p7l$Z zoRmcG<I~H@-H)3|k;hd!y}x8aPayzLXpCCp6YsRI&yR|ZK>HGd;}5ROC0TDL8Wc7M zqd}j&JA4NTKqQQJ@Q8;GvioB3KEqJa(Up)B67Pmz_E`+sPVAmU{sR9`!VeZBmybO4 z*YO|v6jO4!gfpcD1{bT^?_GoVI{)o&#osSAVQU>wfZX<u943dh@54H>yJR~}YA5b` zHDE#vqCU{f^gf6)@@QJ)6CWFr=?eor{9f}2xe6l$zyn^H{0b8dQX<82pRa_(ddAgs zNp;I6@hfm4au~QnqY46v=NNdB-zZXYkJTl!a-~@bU6-jvZBEzFsLVZp@<c)m&kV@| z53?-xjJuc5sST%a`{`y;QRpA)lL>@pipSlD^4PMwyBzrAh3z(z(TaM|osB8=Y52*! zZAL@@CYVmgoFZ(HrP!sdxr8dGNLxsfea5M8FZ?@S)*j+x7j=wI!F@49SCIRUyo@KZ z_iZ3O^1=I`7{${638XSI)#&rYyn-+UJGiAr+`u?a%ObB!wL@@*wXS3jKEbTpBc2^9 zq-7;74vozI=C1L-v*3PF!jMQ*)YHSpvC?e^tf1{n3cQ1@i=~S|H${s=9D184JynC` zoh82r@dH!;d%;A2=LRjVn3V+Y=elC3<_A1U6muXg@tcAjMRpdYB?vxfcF?s{^glj1 z)TM{<1&q<K{We!SU$Q}e4&cq|E~`#4qe;QLA#b7YqhB`oS&6uDYsev5YA4?(UxJPX zK*^LeutAAOV<2J`#@EgE7t`$LUkVJ(?8WBZLKcx`&+K<GGY9JNCLf;ipr4B>I&Zkd z%(#*hVOB;aGonR_eT^<(yMtqqhFc-7IgP0QM<A=4jfbN7^m$yAw>`c13e0KD>H`d8 zsQ6SC{U|pew8**iGtCUaa8%4QHHfhQz%eSt?ev2TYV`kw)W=S_80_{9;^&eDQe84G zT$$|{k*OO6rWu|54Y}(+90xfK&Wa>|YOP_{5l$e@=mL@}k~y$cK7TaG?<!?_+TEG^ z`%I48<vh&pK+qd0ioPdlq7s!`%VWTi!h7&T_eDK7HV#0BHB{7no-p0X$04i%=U7&F zcLEfNaX+GEo}WV*PlyRT=$I-ge@RfX%7$SyYEzeT;fmcW0WfmkEQRGxQAO##fre1b z#T0yw=v*@(MWFW=Ud&fn`j0x=l0WVCVJp%Rpt&+gY-hl!40Ga_IV?(2sdHEEvq1D- zL3hx`m7ucHEQ?Fc==1!uqNE_;Y%pnON3okkeXT9baOBgYBHNsUm7x0KfkB+~_3Zp` z$TyNfBITp&{nbk#_&6uers@4xkqSA}e5I1|T06D%fc$~P(ob0VpR5&Hn)}ph8s)O8 zFm-fBm4TL~Clu{F>wl8$y;l!F{_8!!HRPq-yw?6BSOoTMh^rJI!!H0<n*?e@4o(=Z zdmsA#RVbBZdlzXam4Uu(RW8G>1cE(Bt2`g4IHg+Y8(TETe3Kg6)oH4o>S2<CTK%vY zk^-P1cCBG*FnP63A5qK3V{CAW6T@fEKaXej`7AoF%xpeqGOPvpU;f?<UigvnQ@tk2 zolf2CTC(?g^ppNVqPzf%5JfD4{VZJ9pH>o`pTX|xv)}Rpwni4X_^ojodp4z}9eu-S z@_}i#Q#c-WgM@%}`rbMPwcNS(7#G-#c+DXoTQAD~>u$%3?0Mwp_N}|zRWr_`OO?kw zx&XJ2o&Y*3KHEO-Q__{YqW+W<A{t_g5EVw^#Y|$6#B&8u8v+2qTg$%QHZWpPB94Po z#%#wn^R=7A-jH2)Fn4kuT4V4gAFG@ag~Ifw(SxvQ6pSdkM<(uGM`9m;#iLiwxraWw zLll}N1MN7dp4+rq4iDKyrc>t@v!-!^{;9y44L7COB`$?@I^qSR=3!a9ZCQ)oX`Uiz z?1#pB0)QAw&j5S|cUE`UH%;7Vycv=_dYZYwCXjSW*uTBQeTKQ*tND~mxn}6)HIcBr z-nNfr5%2R;HLB({HD4&MLMOa9Ih{q&p#b$qFMB9cB-`v%Z-bcUy=_%9w6P@?3bH_% z|HLqpO!)JYfURPgD~m(4`+xi}eM3QohtTI%13972pZE6y8bdT@mBB;%<XiVNS@Wdg z@(~@e5GFKfv+jv+R^fyuLwzr>`l2?!jJ|7^-4z^o(UuJ&45RnbnBx;XlYVGo)+pT> ztS)EBL$~}5e|mooBl%~b)ONd#m3~B@JS?X)9s26bpEP|#jdbBAU3qN`YxLx<DXC?l zTBaPN1)z|q{c}wmx}PxT)y%~wE7(horF3-rPY=Kwo5HdM{032n3h3*6k)??+$i0}# zWp$W0M`<)4xV<;@x->{TCIB1DTQ1sCSmQ->=zq!pk&5JJaMY-_OJN{JN@MdtMwYnh zczIkZ*NID$Bx{EI0ueu&3+qmIEcE%R5^y^3fC~~Pq_7TP%=T1(DRZ!w9l|jTCo9V8 zZTeUKYoJ8}EQU0Z^;Sn_XqhfkJc7!zuxWyt6Q!@wLzlgTY+$v+(m2Nv7te&M*@n&# z2DU`3-Vl3o+7T8dcL_JSk8x<_Ok#xMGgoB2R;`9jYnlSP0)D5Ou_y_f>ST>f4uHZH zV|>31#l1)NwaZOTyOdsf`2UD(h&N+aH9>gWaQ1AtA_KZIc?XNm$fYRpACm_nT+QCo zA6kpWrk93i&CLmGGd=n|h4J2%XF|wEziSk}8p-|Rg;K>ryxW@Ozuf`{x5~d2%D2DB zu^N(=lklX57y&A&TF<bgFj{&_J@D&MYkvpP;!S8*xb&ldM$3b_KFc>Mc!gDb6t`#3 z{!i)PEy?C29@)6H>YDnP*4Yjz$or03{%h_jnh!ek$gY&GhF$1c4Q&m4Y{KdP>K$~+ zTi07Gd4%oSa8*+fj}MYE6c3$U09u+(++1wh;#ujJQq}0NhRC^+4H+i;vpLH9YPHhT z*9r{F!0J87)BeIHQOX~7O0cuxD)ww+5*ldXOY8hp4?GsosS5A|(I|i?MmJnn9-PgP zhsat{QfA^W)7EO8nonk(+5hWIF-N+Du)qGtnUaRBfHk8bsazU#x&@F2j}teqa41vp z*D>f4<rhX-M<@mm+3CBbLh5QDAol#-gUWG7oT6!7`78tyG~^fxhGL{vt2uymER`L2 zKO<02ge8dshgh4v$=Hjh23yCXRwm+vGLy7X!{{^Jc3zDKNzPJV!}Cy@9@Fjs)TVwa z=H`akJez1pXkzNJJpxuqm64SK1#&W(q~(eCA<=zBNDokkOmR{}3**1F(lCJEza8`V z;~-xEFWX8>{;DFaJ#7%&34Q(Cv1LNj$5NZMXr)k|z9)xo&A=qHo}ih~qQ-7RF>A_M z{a8Ypyus~;`En{COPen}r>+J$v_Q(<eG-NSX1ZB81QurTbAaxSf3&v@oqdINnLGYF zc(q6$iA0j<H!_jqaKkq1mic*kz~8FbG|LCTZveB|qHjy+ZcUSNtt0FVOYfV@f`@^U zVeo$fgrRw|cFYKV!b(d!r8tgNBDE)INx=mSz30By1Mo7Y6;u`!AG5DaS|JTMDha)+ z`{-EwEwT<i_<&y^C(lXle|}S%vF@tu{95S|4Fjd?W85DG8PM+m{u<3Nuy10r3S);1 zp7=ciM5$A&ZYPL<NXO*7lu)75mMl;C3%Cew%tmuXM-cu{Q8xBIn}($UZV!@E>wdM8 z!(V;4hZb0b_D7AoZ7eNsMSdp`du(XqSQO;`$<~G6!2<O3*Y`y^@=BxoIm|~o&vjPC zjF-mBTdx9I0P)n#{P;lQ^`T|uj;P(B92oT9Km*FI>A>Ux!?&H^iSVr_*M$kTc!h^2 zqNr#`UVnLo2Z%a3NLZHAl@Y>havf+B)A!P&unZhw5&yyzK`@fRPNccj2TC$oa6CNf zv)B#Ic>t7Ata(iTV@|YPcpXrR^g^2sd1Y^(HGp~!bbe0F5&{{syUWAfC;@Z!&d3R> z?QL`lZ=8SOq@qe2xd^b=m-*Td&LcD{nLs^XE(GR+_w|X%Ena=m)#1|5&EA7ann)`O zB@GkE|AM$Rdza;m$-BXa-9~l;O6LlE#<#D*0KB3aMl!P=^XWL<&?$#~{!i!P;`l~u zaY1kegeYn|I`N9PC~Te<eLyobdt-~37P&FOHv;`7gY8Y|a9^ZyqgodtQ7Zhhd$GtZ zA!Nk$st`2T&}~lM?IztU#T<fyp1JpwE1Okg_q~Wi)|CpJHtp}TzMiIHRHuFR(*@uH zPA%SwOR9lE!XY2_ZEtrXng>TGdh`|C51KNXUxM8d#O{G^Op*x#i?qxCp6lRxbLJm2 z_86ceI7=FoInWa8n^<pbP~*r+^vj;_D?nR2-jC-(7eJs_m(#{IG_ltC^k-7Q!ORot z2EG^cy^PTwX^+}%!k>ETJOSF9CkN2676x;^^}fPX#)**C{ha2KzKJR@PAEh;%HV;- z<z!7q+AU#Zn4X6aXd-E=Ws=N;5SjK%$~O9bSbZU>S*l?H|4uPB+7fjiwqWSvC;2Nv z!QAznW>^ofguLvUL1mdS5uAZy9mohl1UbR}3Sz;NTn%gRF1Zj%Z5~YFTn8*92T!f# zDmaQ6L9txAKgU{+WBk6tEXGLOnI*naF<*zW^zm&cl{G6EHQX{d&DDp?VwF8pG^!=% za%}tcll8KxAw*DL3i>{8<lFj!e_-#q&h~F*V6(@^e1>I_O{HOcMv~IdE9n+TY=xQv z#Mg;I;q0wTSQgXX+4nG_-~i@rQ#}h#kC|0z2x|-13bp-7WQ5<r^M+CQYBsP_GlF|G zU?z*{UlpzV!u`yE)<qsdoKtO)3$b2m#CKEBvMO5-Y3+w%fqKA3>ixo6MU4+GB4;&q zJKP2*3~uT&N-}X0z(3-@XSSA}$Zf!OdxXlI@)Z+s42d4V6dj;H7XeC(=PgS7SQox3 zz4RPWZ%^CTX`8HWk*9(;I2culh`_k<kCW3AEHjhT_#ef3j*B5I*WDSvuHRXoI{@86 zlnO8|)o466Y=v#$ukx(0vux`)t;Umz;pieN1;pD)`UHZZN$p7(B*^vbO14ab0t+=Q z+&bw|VKBKk0bG&e=>RtMr)ritX}IMhAn8)91D0Ku!i$<-sD}QLRjn39P_tQyQgTY1 zPmkKxz2Uw;yEFbnWNErJuJ0<=Mgvs`3>tSghEcH)#q9RI8=BC~ZR#GhwyVH6JogB$ zVw*g-leiOOuw`{pWhe37SIdJC0^;xsuXv}0k0*^f0b*x}{eU5?OW}MChg)XCJV9u* zPnAeB;G@q_vk3JHrg(x;VW8zfllW|7jL>50z}meJ{FCO3Q#1n{E-as-IMRC{JWE1+ zNZ2!1EO6FF(uEc79H{<#s7CHQSaWNl_-u3Zp{6NJ1*K&R96lvj)kY+CI#CK+4>sUz zdvCP8UJwiGTmS=VW=QxaB}C9Vk>t8T+{UevYHavxJ7p-2ts=dP22(&LehPm`kGCGh zm%QfQRX`5F4SgRgas*<(rZLJ1pR2t}JVf|awKE-0ZFMY<8P%VuO>qS}k4(*yurF%F z3?tQkZ<-Hiiz$4r5~+gbof9`L<dY(roeM1!l@}fE3&0C<!z-poKPXq|%&dX703(xJ z^|(q@xO=>S#hcd^&6?{K_k9eX0z>5Z_b{MULHsubaPkL9Rp1$+U9Dg!*`txX{cI9! z`Tbvh82y-bh)&BDA#S@^3p82K>Hv(bd};oK!-z8qKb+qZ%KiVWn%Fek85ccbXixJl z+Xp)G`vI&y4yHlp^_PBeeT@A(q7NfdfmD5z{0qQcoa%2c@KuSvoi?3Q2JNwS%bBT$ z7eiwc%<|AT-v|v;f37}Y`_YnURJJq|Ip>LQGB_8t1C2BPaD<juJt#CYQCJI|TXVp^ z<rgjf9n@t8pE`#uL`TsO+ebPYL}G1>(Hv!!sRMZG1WWX)X`A!6=}p%Ay`rBp4fyb> zrESrvu3xJ{;i7sCj+o;y>`yi~^PvP5qE2uela5hp8P!6-6;{!$@8MwcUB}_u-`OlL z-_yLWcocY~yA4fA-xe2v!1=tRlGgR@6KlmXJKlro&N`m|HiItM+;YEv@vb61<vSDp zQwvCM0$AQfFdku=5tS!e=43{QLul~ssRa^f0QzsHl-?6sOjfn4M<h1lmCJu&>bsWo zhHrdQ`}{Fu%%aVxP2R1f4WJZL%al>qlJBA$Ekxpy215MRvq!x+g%O)HG@}Fw8FGwd z;quS={^+Z?^rF9McM>I{ej=Hi9An7Y=oA3k>~`zXdtN^T)Z6H$vb{`F+hMOC(xUB= z%HIRKX)0;`l1>FJ(i>8@eWEuQBmHXJq382COzT`Lp?z<;)0h|iTY8wbQr*_?Y$CvQ z#n4%}D;ZvsiWqwTFhQ^MmkIWZ+!k4@IO@zb$SN8O(3U(71Iyo@$fuv>n#`{y*sOp< zZ8~2K(1P)_j`029iIP&o>XFApo!eX-76uHn@K0tuW}B8wi8R{#4VbgC<uTPW<Agpc zdHQo6gB7_b>w`=)2ykxJieb&r`~E%+ZIx6Ldu5sk`#T!5VAmvk*3?kfE(5D0COQY1 ziG<ST{yLbwb2GdVKBZ5!@z$SRub_a2rM}cb_*|*tsYhScSzW+QbPDlp?RxjAS8eTc zx{R&7T=UKd+wxlfZvk6+o$1~y!$LdU1vZLrG`Qm~>iB$iG6tq-{L-p2v&STKTD#$z zW1}qwY`SLMO$BI~?Sj-z+5L&;lJS?a3(D}?6keDbnUeRNElf^aAJM_gGdh6cH^}TR zNTF6IFhSOC0TyYSc2IY^$vS>JudDjQhR21=?S^L6Q!Q_$S#}1waVr=_tl0Kxfw~|1 zTch+8k<9H8EUgzo&JA&U(~_eHqN~Ghf*fF9OP2|vX4P>JZHLO|dZRr$GXzV{=jr5{ zOd;}lvzQUx5NG-5kWw<<yj$6w7dHFWbv~oSFN90HXUjRTF`M-Fr?sxEF3PRqCug7q z2kpH$Q=hbt$b|qu&UYi6w|1V<XimRz<o8`MDPN#CNzSlu<q_rGH%iYAsiDo=4lGd0 zZ4V4u%BmO~QVM!6406akGW5?6rez)(w#WzuYKd<iG#dyg!MVlH85SE8KooBa;c#Sr zfk}4FId52x&KoBd|A-svbPOtplpiQSHMW*xcElpJ6zYsC=aju`JlZpmJ%NH)#^-6Q z@4xpH+wyoJcYs}H0b740jT7rQJ}=eFvi{RgPRgu+0*RxEX_q`AmAN0>hZ9<D|6nV3 zInH9$EF!)Vbs66&tey)7c&|Mj{)B+02;h(`o(~lqvrVCQM`Q6P{o+U~8sE-W9f0Df zxrs_fas6YBJ}x-M@O)ymf8DMYt?GftqzUs*PlFydATzihdE5jZ;QLSV)=-5`tv4Fy zfZ8U|>IaJ{M11fn>rHT{qCHu;-#5!#Adzsc`e)ibo7xbJ(rHEl;Og)oz2d(__MqLu z5r}uF-r!fKd|-Ucu9>+nCw*YD+YYte(A<|HZ<HJoAr00YD{&6S@#zGvWQ-FVx=lHK zNvPsSdDV}ATx)oRjc8u+Z-0~AL`Xns%j5cOY@NDrL^w<JfW6{R^UobLeofNGh8TGt zG8|5#!AoUlR|=&8EUNt=J;lqZcyy{9646AcCw;9rQ$qah$?8UuK;yi_*$+n7;(wFA z6DXG7WrY#^QhTW8*_68SVn#L@$J5-CD;|R-p(gdk!@5paI<2_4oVQJg^)UmGNV+$> zXT(gRWKoi*Xmk>#oQQDM9KIk%6|iyQLcfh$C|Oed6V9^(Tqcu(5V>&|C@)FkvIv$> z2`0TI<MD@>t2>MgV&0I|m|O~#bm2v1g>IY5F^-b_F94K4YrnQXR8X;9Dz)IFr-ZJG z;yDGOn?jy9n7>)Bt9e(*Iwa92zO4;X1A=GH?Aaz$5!X+C8_LBH>QBovXRfor@0_QM znl$Y!RZkJ+Jl7zy+HHSYvp;^q_my*2LCze@!E`C&DZ$*CWYpY@vgJVa1F_$za3l8U zlO<R4Tyrs!*`c1DtQ>tW?U_qFbB)`Sd{3iLeIDDB@+Jt4h6K69c7ggOXK?FeapboV zU&vm=MtngeaXxcobs`fj=kk0(@|TjpC%ynW`sG+CZ`-dtHu8VkGJ}=E2vjqOa{!X7 z{qao8e7*+}-xD4E#3l#HkvrbTMOem0lQ%)u+$ov2(bpqCGhK2n^yv~igl1fs?=sPh zOLk)?jb27gO1!KB_pB_V9Ro7&ABrf8M~1+++~=Tr<X8@APHSdWg6ugK3UcO5Xv%HS znjx=3U*$aQUD$s>=>93!3wV&siv~dw@(5-MQwu@{kRXeAekgpISuM|rC0=UeUCw$E zgXE?MA6KMmrv6U;()n?j#qVK4<&N=WqGe4Evgb9WNpQ>h8bmBeiWiFCe=Zcf$fGWl zu@r=q13_pHn-R(a$n4Zj?wW+nWY<#}Rjfg}4a%7Xk}H2FJ$V}Tr7-lf^gbDHA_ruh zXKQ_Kmz>+2z(wX76`ywr8%u61c*VraMnkg9nZuKI%h^c&oZQj5fJwCPA?b+pk_0SY zN=;0WDk?nZw>>#``7~Q7Qkd6=4uxW=E_C9}wip?FBE8htl)E$jGC3E>;FEnyHlFy1 z>31laVwry=2X|VmBN@mndtu?E&DImSeR86Mh=q?H&(##@$wn23s42+$6A$fD7t!%c z-Q`}gkmZvt6#6P=runoqB29U0lv9w|X|s6q78(%Q2&AVVBRIsaBD+wuCE10U!8+0J zP^{Yp|ETONl8W<gTqvP0vqSe$*+0~`w6{sV4E%q5O4`L$;5L_QweU=noA?S5ChLP0 zHc-~r<Pc`IBZ_y*{b@m@S{cZeGkQVpTz`k6h8Puj4zMX?c1U5*tFTTM!6ol7v$dub z2CMu|IfR2j7sAXFLRqg@-t}vhiu^otiLFfULR+8KGJlj5?L{mHkX`1jt+sOfOx6c0 z-5h^p-Y7#Mzr)>GR=dNd&T>GqzPyc&zj@Em)llNwD<`_F4`*=xosBZe`3&9$sU?d4 z91m&yo{iI45b9gzxu#c*BIIi1-yuwz=bAprva_~Hy2Ek;pJJ_(-y)|bSvlgFgXJyK zyIDRh4xuY|W|*i1B6bysXugdLa@Lk~Ld<_TL;Q~L6G3*d<F|T=jkL8%m{)X9%(*Yz zi%6HutBqSKpTQgFwn#5D{CqBubD<-+bKb|aJ%xVq*eK~IlGvsG8*ei&!Pe;wB)_9` z%|$qC7dQqIf!ZjZA#**W`|=2=@+M=W%5~oLyZZU|LAqp3JGmlx1Rz`1A>><240(Si z1eWDshcl4p07N`l`*i18Ak$8Fq^zr`%wW${orAWDj1rR<yLV?zW!`3~F!NOW-SRmH zBBv%j1%>emB2tAOm+v|7)#ROZz=X;21|oXrKz8z}2_l;BP@C_7KbqH+tUs|J4|x4~ z6%L|CS$gSEIMul44(d2(={=@>m$849CN~!H^dw#aA`yXuuwuSr&>v9Zrw75QtPhU1 z=jwQmZJSx+AeZoW4z8Lq*Q9ugT;m3n?}3LRtAOx|B;u&gI^-anWr#7N4(?|1J@nf( zWUpEKAEf^rS*oCiWZ5|(Ea&}mV)NyFdSdhC6OeqsTpfZ$Y^e)MS@}t1luUm?iNc-Z zEKwdbh{SSE>Y(S<rk|epch0iQ9sMka#14sjiw^~Uq<Hh_jVCus5Yg9kz!T3lzPy}c zLoiEv(LabVa!;5eB0JRHR7CU}-R#6xKIbA?3MUmzvRt3oAz53V#251Zq4te<7A_L} z@3?>HGADccA{!!Wii?V1d6$1YNZ!F0^_A^yyLgYuP?OjP{pWH`B|6F3P4DSU*YX@t z6H~@Ud1aYvy!-iFxKN2Q2i)GX9;J_(`0U7q6BfutvzmM^T-?O7>|BH%<V)vEn7<d7 zk1RXv5%Cg`i6+tIo2nLB_k!fw8I%vcCH8*fmC9?1<cPgPCYo5CcOidWBudDQ9g^pb zk%<*>b2+qUwp^EuR_oHYV!F|M`82yLvyeyq6#W%M`Ug)p73{N3K~)0L6gTmoyi3T{ z7Y{8+&XS`8Y%w{QtDMf{s7aKE&S&C5e>$H<9go>Si-9z6Ai~8d^eW5p1~O*b5~O54 zAIO|-qzB0!CXh38K|z1eFZp}miN^gyutb;%AWP;fJV^F>fUMb41v&Fs4?=H888sP> z87Wh)u2P^|X0H^;m2;CwIwT1<|4yB36)Mdx<e5F!N8)$R%(Q@ovStn~$YrZQ!j8-i z*(&lq{mh-y3q8a#0~}&Dtdjhtbj*$?2G2;28kFrJ#{og4as_|LAreAXS@weR4E<E& zsA=w%xuAr2YWA&zv|KkFgm$X(I}lz3ky?AaO`^VZV;Qs85QNKS{v9MvMnJ2UEIV*B z@;L`<LwW{LaGu<tJOVCYS;Nw1Ay<auZL8=}+8@}OHetfhd}kiVJT@{yWZocWM4OM8 zRm-<S5b?4-NalZJJxK~V1_rXo-sV`am4o_~R{?iow$>jzDBHatxM<_NvDTT}$}^j2 z<q1MZ-X)~tWox}m^bpIkgR9d<K+SoX11g4QT?G+8`>ROd7;_96WbRqJkR4@nQ13hM z#)o1Y?NREN=$BG;SZ0SpkunEu%`pjn2S0UQZK`QUJHCIA9hEIrnpa8R3XnPH*wBb- z%AN%foOW?+99r3r#51cR)K1E8qZ?!XQgYk#Z3<@ikSkk(kouT^2Th)3hi7s`;9;QK z_aMGmt`XAAv*T?w#{oe$(f%O$=E^hIm~Bgt?A0xWR&rVQ(gG<nK6&QI{!x%C*P38k z;VQ|iz)^oMBOs?ZpN)m&ioAmhCDuenas0^oH1X6kIW#cIqlVfVJqtWTQkOilW=|u} zY`Fp|?b;~SmESfmyX+GB>B(HrYxWZGI}$B_knG8Nke=td4pq)M!dW7{WMSpld%>s? z+l5YHHP6A*3^HpMdWeZFh7U(9NG>0uuPe!3d9{B*vUig2IkSJ~K{8htM7qb5+Gn<9 zC52Dspe&;KNEDRw2e)#r6j>_8mP8IJ^{1os(#0(Mm3iBheX504^kSvecH~S!92*48 z^9V>rkd-4DA@4aNlyYyZSe+t?P?@t1c?@rvomqDYjWe>2fAY<;<?txW66b)PXd<JH zPAz{~c8EjfTK%MwN>w!EkTzL)1S~?<{*A0zLnO0~I{8EPQiD)tI**`Iyh)Hb^GBb0 z{JFju$RRftkQ^Z_<aFhD35fK80-5bg;hbi<Ze)?1`AcabmL;)u>9|O<&Mv#Y(T-AN zl$;cis=nVMy|B{-Ayp&qIl7q1jM8B=dxC$TP6{~!RiNSL9#tR^oZ^g<YbCZ=hZm6N z0C%sPw4I7mc}+WYX|nF62$EPR1io|a3<^jdVs+BREHfZ5cOc&8Il#}CZKPiA%(TE7 z#W$DVRtK@GdL2by_ew#0dD|}jD%|ARf6dsWc2nt`O!7PQhRA10Z%zDf<blbF(c6C| zH_FawmiGc>^Kym@EzIaRm1oB?uBkvIeO5ubjNqY|<y}Jgoy^GPZCj2RfgG}b$Ue;s z{Q{Ef>VnV!D9*vmjnWX>Xv#Bn%=>hngtI{X;62BT=+xXqMj_~D4hGL0nX|w}f;QKA z)EqNeddZH;YzE#&@Lk?Ei%*EFjNE_CKtxx8h|hs6tjzggY-i4=Eo4c^>5OY#{0H<s z%Mmr+Mn*=S0|=5LAu~;#<QeHvMX`$|=Z=BUFCe}RkC0et3xTt&mC0I?2*<*-Weaj) z&*d*&I03UwvCwtPMzG0=zD%^G&R;rlKNO^iZ-ZPbS%rl(ar>Q1tS2(6#B+bTlvQFm zi?MW`3i{%YUr1D!FSSgkvfy=>m1~QfjjWEXDa|sowXsmQHCyZCCdoZ(p$2Q-3s2Tk zwgNzQnS*|d9kO62%G)00n`MU`oOL2KTn2j^-F)P2cg~iiI)&Y7$!C)I0?3i)Z5^fd zCPlxbXE(?pcGXIq#w~siH93DJ4!F`mCGTxAkTL_0ETcVV+7_$>iSe%l%kx}=h;M^z zBDsC6<P^({HmML;==vqrI=#KbE47mQpRF_y@i?z-%UlmeaLSnllG!t5<szQ-^$NFD z#@6Wol;wZ~dwCm`dGbD8VU}hMOAj%z6Uj4@NIuy_V!v&}DV&mx>q39FM>j50S>iVw zjfP0|4%kRk){XPF;gpgQOuO(l$TP}WOZ?6)e%P%@SAqf}w}P!oO{KC`laP(Hsl3`C z5~tnh+b1(hMsN0*kr|ZhloaxRaz!wZCfpUen28UP%pjA*c8QmbEFU>b$d@rmoOg+5 zZCG~sJcW;&GeXKfoO6GcH}Yk~BHrNu<{QgS$%MS7J2~um<#sAp$TL`6GB#@4%LrKP ztatV&_7Hd0UdWgc<PiH{hZJ__XX=`{$B?gwobv$78#h6I8*Tzw({7UZbk@q}9LSw_ z$qsSkk`ZiTrR_9S%I7vY7h(}pUsHTFAj0g~$wjc=*~A05Qwe`6%g({MkmukSwr<EJ z@%jUjb+!f%x&maWItZ3$NjxSxLB&-d&o+0REC-fQJ{Jxc5Lv3oq?u#{^~^bHG(5Q{ znb9_huM@9}ST)ou5DB5PvFM$n?GoEP+95lbEFU>B4&t=(J-8aPRRc#y&ftTL>nx+h zJ9B=0IXaBkyxM={%jET;f0l4@=xdU*mJ0bY!rNfXxeg%DNY4|HLt-o^JfSST=U98z zVjv<rWZ#Iqoz&6Ha!ofbv3E{lyZQVf`zGhh6gqf`g^z9#=I>d~MZT0~(OIg<u@U<X zL_8Su_A)u33X*&&4X;G1>Y4Kw%1J0E-&{{3P_o+4Ewg_{qCTx~bx$;fjGEX~KF!W{ z3QGqhXRDNxU0>p!BQwZml&U8pZ+#d4HNDEjf;_qZ$Oz^`Jf{~GOtMsg2%8(^%JW7S zGqF_R0_D0zgaewa0vS7UqJv1xh@RBB_A`}hEglSVW~sW$BDV5HRnB~((~V15)*v~H zv0U6sWEFp^RO;fHTO<UAv)Bh$H@_v_xP(W1Ve-jpccLs&;>kA<Pvb>JFnil=GdkB? z(+@G+B<@Vsl1SA(3~~aZttIY!4><ATmy!dOtAvn3Vm8J7P?_`FMgq@*NTn1QGH1z> zcvIj%OV!PdKWkVJu^h;o5<V<;s(3WXXA<@dh{S&}ZawE<1&C+vW@pKa)>-^wcilyH zZh|k_z9u`$B%~RSnCvLgAx{oeKDTf6MT1Db%x(FAPjp-O@i!^?`TV&lwkLCdvo*>N z*};+@3^L~GULbRhg@Q=6G7#z60AqW|{6vtFa|l6t&XWK+^DcRi%-f&_tei|BE&EVF zmh6A^c#wS3g3vEIX$p`tb6X$8Mh#^;Y6{BKm#nKEB-c;@kqY(?lD!e|ETnEL$ee9| z5Yey?Ya>TR9uNK@(%WdIlV_Cn7;&HSwl&{rAH-&~k9h}ECAb~&Jbmg1XZspN>eWzd zY0N$$kdp6nAQ&%s4(6IUKRhG-z(9`d8-#x$BfXkI#Cu#Rn3K=o2g!aUkV97P=@b_2 zkV*(S$7Mi>3B=hMC#j#vGsl%@6z6`ngm~u8y_)H@G41i31DS0O@W@9U4}(^^1%RNe z@|V&aB5R7V3WtebVF>wct=pQifAU@+u`b6K@JUe`JO2)dtQ^HvqU}%F3TTM=ZS#MX z88<v5>_A8XDD3z)!ZO)&3Z0xX2l<(C%2}p7bLaRRW$wmoTY}V**OV4S`6j_Lo1B_- zJIpsqo;h>QH}rU^vhxt<FPQ^ar-l$>&+~>o8tr&~=M)*G2w%4O*dyWv1%YdkN6?NO zli(S;DCcLmwRJ(}eAlcKIUIQhQ-*&j$I%I4_k4Q?S+cDRLUbyRjovr1K6uch=ZEBh zk~5G%*31qBIb~-(t^oO+QKG(;+IX_sWje(cBZodS<DM?x`iyk!A%A=jNhIxJ%6b$e z`|x>N&oOb3C1=)wTw<w$<eL%69dbtpF)N@@y)f@noS-?9@^l%>b++l|I^=)YJBZ{_ zf(Y9YK2#H_dXAYa@r0^H4l0#w<e5n##dvOy%ujrf?Bk*d(;znNgUATT*~#Y|r$T1> zRY)y4GYCX#E`ppkYFvX^E7JrcGgL^LlCHWSNA6ZbOG9kpsH-Yv{IjN@Ka=P;knFR2 zx{@wgUsqB%@?29uI7ie-GopWFbsRPMGE<&6kX%`Ww{6*{3L;hOYNOCXzW=mwlsjM> z#k0-Zr1~c<PKnUvFD216TTiV}9!Q=cPAZ7qkkL9hwo8q8VJ?DD***Ubdm-y<>U7!q zFxm1p9+I~aiIitL4*5K`KIBMbZLl4)R&Lxi4LLH)nztRIN1N3TsT6<0&3uXn$^0FV zHM6KdHnBsv@aLEj&m1|{26E=iI*=<@kE&$(h$PZGDpwZ48#3ew;e+HlOdvRT;%d{m zN$!C3XUbI{dE1<0hagnMm*3fB-pDh`S->drLHvpM737vf31hjjbds@UY^CLDjJQ1d znKeZ((tVU?cF|RY_-%iExSnQB4s#_(I5-q2CY|S+7Ex7@o}-tQ_Dtg6p^ci{OSm9s zZXONZCR=S%HI6(s{L1;3(`Vr;b8Jg>eGvQ}@pt$YSyS}5+zRjn<h*Kh|17gJ(~CZ@ zDftHCp(U5+$nr*B&X{#PMbYG(BWo&i!zsPC$xVU+fjN?bAtZl2-auyYuE4|*PYDIv za)gkm4Bd_M$~98>1c9U}$R>UY@^Uga{HfF;Ck8~a%uL{!F6R#=ujH(sNrcY(6jtYz z&+VCnro4a1myx+%$hgju`1Bddb4{P2oR2}vl}#jM!3im2WB+97CHp3G31I4O;-y|j z^VN`jBd6wq`zwFXHBsjrZ-lS5ioa@shLW`lh}aac-)s)3&5)&cu|9-&o+j~IE>t(k zdXx%L;yqr7%jBH}lB4C=w!*3eIdb;RV-IJZD#$Hf-G$t885^DjkzTsG%N!6$5gDZ? zbhZ!3cN1UQV%)sC;J%izk$x(BVV2G_b)j+X7WLaQQv-iBA}d=V&)Yh5i8HN)d9ozZ zn<z7tD&2%6cF69LT>>Kdnk*mjd9PHt&O4aiMB=YnxwOgmP<AUz2)%^l)&`Opcy*;t zRmrP>(=J=yYmwYO-ga$SyO3uj9wxGh#8w88_|ICqoZECd$~-&ntu%tlU&<w2*2lOJ zyzLe*&We9$Tjq_LvU&dy7ZRId?ZPRkt5qHY;hK}b6uVc(HVapZw?Q$Mx6wIPkX<Yk za+Absh;LtP*p1ZxtPjX<x$<5h1F7cKCIe~A7Rp9Gtv$1eJ-S(T2SR<ynY9s|%9@<I zzGC}>h&PW+r_7nFn$J|J!X)dnl{@D<^NiH=tK@$(iO&us=Se)z+*!ZT9ZB@gR;4Q_ zZ@VNSO>UAzV>j9rTv2*An6g<Xf{15fqfv3zAsg(#yh}EUrrI--uL+M?x+8HbAz&WA z2SiQ`I&O*GOQw^o92Ev~Jru~-*O+INtfiXu&OX_$e>(Q$y}iRrmM?vngLw`riJ5}n zb{BtSmI%~dSCIp(9f{=cbr=4@PNl9aAv@ggtoioFcFdzDu_2$q<k94M8+Gp_0_V5E zGLX53Gbg_@FR~l)sE+x2K*R@m(6&6w0f@vgs4Sd$oz#vZTpqvlp!tD}jgWYjURVJo zYcUXsd>?p9jy!^io4p{XoMs0^%q-U+BJqC*wU=c^De0Fb@t`(O-dWttgr9iSCTGb} zuguJ@<V}gSPHv%`S>!W`Wk;To=p7LI9b9Jer7&T#C3I4bKFh&52rnA%=qRj~lQP$N zXPp$7$udfh9g+BRDmhDm8!cI@QQko04tP#<SCMC~%vUClMruTXP)IYstw{HHo>_n7 zCJvJ8@9@mt^P19^M^4RCbv)Tb!eJu+NA9O5^$%pOshE>B(n+`?@5ZxB|LuBOol_8U zdh=YvKgjyv?03%pVL?an^PRKZC{G+_G6HxtB31Jxa(xX{Wsctil4~<?&SI*{Gm>-n zoXz6(U?+%&=^DFOb{8JNyxJhbKfr&gvJp_aJj?YpQPD1cDNgD<*W|8=ml{NFEFj{C zy(saVwHO&lVnJSY5Vr6IgD1=A1w-V@UyA9H<?SMYTvh?emKmk=r94BWu6%DKH%V@k z^gxoc@#=f7f>bYZV`b&w3CU{Xb(cAySB&hR`IaatbxCukV7-;g1|mMyo5X*u{5`i- z79n6{5rKO=&b$inl;m{2r$r)a_jE{%k}gc5L&zo)J$h3KFzX$9Es3tWpNc|Ju5UQt z`P8JwPS5tijknW~dy}!z=Q~?9H#NZXULem%Y|EP@VELWC$_?x$|3^kZE@|HNcbA-e z{PdDl_8{VQC(lUk3v^+!)rNnz9`_uD9furq1(Ap+2wkC*9DvY!Gb40viuwQ|0X%ql zMj|O~K#@n?3$kRXqLl+FNcnf3n*4&$GFuQLXM%{Qkr7<k+JKfe=DX&D<f>>OQY8dL zYD_;!KAAwMl$E~+f2+(jcP5#G1`|KOjS5=3A=&b7&!t+%28Af@MxKA!bL9#UZksX! zi8E2@b;*8Z5a|#2AhxsMPRa<n)bN6yxMeOI$erU^aNHm{$1erR*{nPx9c4k*?8O1O zb37R0BE=B%2uPF2Yf9D0%t3Et24&tL2)U{Gcc3{KBDucQOchTf$d%)B4IP&Gd?3=X z2V~D)P!P_h{5}7Nt}}nhmK278;FW$cvt+#gkviyg#J2QI8RJ2gGE?*5XBO3&X3tGw zsXY;k`^vOA{JxEa7;W?|^1(1TBG!o|&<t4C*p&g(d31#~mwSUVRlc8?2SitV_s6mG zxIa%@YuwhuBN(&^mNu5#?~UxDKhGg!S=<+!2YgFkSyZog-(`O$Ambh+7M8GnZ8$^D z&!Wu|GjZUa<z4_JdcU8}s6Bb63(M>g3@odo;IZIG`}<6<Yo7t?MEB9#%x~<<Tz13b z8bClq4;Bt#|DWZERZnCic33R2D-YoC{nQ-R*YTF1#ULSR-zYceH*wlT#EdczbBy%} zQpwLO>Oi?F8sL9)lCIu27DGIZ&)^;k&Y-JmP$vvHxBt(l${ZFjUSZkYTjzhu5BVx8 z{rqXu?75GbT7!<_#S{DUTh3>3b_W*RC+`8kU!PT!^^J3mngrE@<??$lsw;Pm_3}8P z1F7?<I*A1$zrW8qd2Wg}lx2%HaeJptjt=Z7AJLDH?zevrNZ+x?b6>eNh628ez@he< zl(-`?X|sCX49j`?E`}Pu$AoB8eiataW6*|}jQ5%&&`)&exv?ul*mOPyl$66OE@C-7 zu1wWSWU9PxRMqgEf~2pjxbU<iJQS#CaW?~~<k;{T9++zjBZ)>uO7As0w(l-5#60TG z(<n?DPlJC$5tgW=!_%G`(FGj}e;U*V-^qc_I|FtmvhKN12uPuoj0JL?_h7wWU%>=7 zF7GuK=d4m#a*vxU@}sVUL7T`?lJ5NT7$lY<?pgEisQ+Q=_>RP+I(#+aKE=KRINcc( z6i1>Kh>rD4>FF5jF}PM=K_$;fV~N^cSOOI`vrvD-_lKkAc?{YF-jX_^Lp^OqIM2u6 zE6`LHM@*xKywzAQM|kVVMtIbncnqRF-h(_(VWN$`C&Kpf+5>1cFR?3Axhc-=<?nF> zD^Clq$V|dByeF7j9#^K#cK95{;`oEFjqAJ2)Mtv@?lQ2+>sW&hxqU~1)8#BI{^zW| z4ex*Ldlfve8d1t#`b?w%QJg>2XNq$HJV)&0%y(ymkX)eZy^jvjr?MQL)8lEORz~5o z$d_ON{pCFXDH|h-r|Rnm9++qQW)P?0IV>xcIJ^gd8R~z|xCbLD7?B@}ddz;JlY4pG zbNFgH`RJe?68<#_4(GX&<B9s3Uj^9kYH)x39e>Rx#x|zo2682Q@^v^OQvY4IV+_XE z86lr$YRrR=n&i6+u;`c}z@qbMm+KPDTxDV(rEXHhDb@vippV<S#JT;++4)-F=Iopl z^!QK5i($FqWWo~B{q2vk0NU$~e6Wx8_IF04Wc#~f9&ALzeZQunQe+V}0+)W9qHcdu z_%2u?QnDe)?=z8{Roq;+-yPn@hMVZ8%r*cf@DUw0=N--<j~$PMrDC^WGa{M?KP&E8 z<ZB#%fM(D+#XLZ(#ZQclP=L>PSXeRRH;}SE<G1-(V!pwA^c`ti5GePtUe+`I2S!!A z4?Ieb=51^uF%#FQc*TD7h95$uqws$=c2?t{?*rE=yp8=24pOwKU3sSrl&{A97xf!I zyg;mAxK<Hy#^P8*o_2=svj6VGzYpkxh<ad&c<(+?9l}S4+S5LF;9AAqY|oXokFPWM zW-K*sfZTjm?WhC!tpG+<>^t0#YaUEToSHk8c%ujN8d=31MM~fKsLxd6Hs61dZ`|i6 zR{g#}+4L{BOtFXT%O3Fq6fq;-i>2l$A{6lzpildnJE{s35S=-4AID#?V&)^y#;-n; z@7H(~j&kE^SDduR5IooUK(Z~~bl4)caZumP_v?e~nD5F5h{AXu5QTm&93L}OX9yLQ z98HHWc*GqYExE|{9iS$BS3ZB{%X#mdWuzj#Z^&xIh%WHGqRkT?7mC^8abbC5MA5j3 z|5>U3<~=|Ns-E^P{!LG`XMA_T5>ed~IFOI^`4{RPWZv({1Af(>e5|qDkG|=NG^u+5 zaE%>D%vI`*yv#|mI-Z93rk`^s+<!l_&LJwfv9%20Igm%G?*raHz8rs?E<YQo5EXj} zYb5f3aIL%!2kYu`RkV*?Klu7Nm%?D2>v_3XbNwNVreB-tNO2FQ29o1$=j#`$G*~DF z@Bj1L<F-qU?f44pEfK5Xo;UdS;hyJ}XGl;2-uJ$ZTjYbUF_f*SOjOvsi$uP!dg?PR z@qKV^eI{P>Sl?$ZJjH*-YKX4@dM4(<Cz<1;11`XKzKcTAK1Z>{D!EV*i!nf(!S@5= zWf57ps5DVMcq6h+G%@zX8#Q1*PvIK`e)O~Wm%|cw3>4!cuZa>>oZDEO5f4~7czRgy z{`H$u9Vrk4H`)w-Vt`4GoE|J>*NlUoTxhKuu9JVc`@@oXuTg(S@VRr(PywP15uUJ| z5e2>3E20f@a=x~yK;#ND^G(fE_cpN9Ok65n1=GpdpA_=Jsqi;Nj4FCfMZb7cN<+l= zA<E`o;rYrrXb+x00xV&P8Wf}l&+s;$zbAZ`2Yn>>->?K;>>;%q?}Oy8`ytOzxexeE zfqsUK9y=1h$4P(tz^(AL@Srs0-v^89Q_Np=B%g`YKyqz++C=pOEa*`9H=W+NRX@1? zG1jGjfHL>?i&+Iu)lZCP4z?G!ZLmt-Yp9C8O1>&gF%Kv}bokRyJ&89(xi8)a$XxUd zz0P_XwS}VxXcm+uP?gVmhwnlarieIWi8JdZm*cY+-c*0w(O+&XJ~}T-xW2aGT18Cg zCFbp;gQintR<T4R7)F&duIG0s1o+Fn#J>XmNyGx+S_OXR9nZK)ywecauNT2+UnO7V zCiiz<RLG;(<Xq$Xz#R7V^X965=ec^FXoio|<vSmixP^jWja&7Les7EpFs>Mb`3e7; zs#3w>0J(o3*$OOAe1+UYV0#5q1515v<T7L2ID*}Kde{B+bNgMd*p<N?g-`L~QpAW- z?_E!(PrmoiJp>EEXxrbgkopeG=A0qgpcfNuPRG>K=JLn_mdBN?u)OY%ehgfnAy_Er z?S1=2j-NJ%=i0D5zKeYpzhf+a12UH0gCX>UXhVO*D%wPjfB73{$8BJ_+)D$9vwE}$ z3%N+|0d?i|ETPTi``c&nj2f1A)Or0`+#{yQ_n$|YumsM5i0bGu)z9LY2P~oU!+j;Z zPAupF`?#%fV$f!HJQ5b7`0=#McYh$Fqh}(qP-H-#M&izK0l>J}E4)pv5@3+-5hL^s zM$&(u2IJb_lxvAcFg`Se>+>y?P<HhJEK%p-vp9bnORx*EJdUqIxco0>Jn%PXDSW^< z_iC`5u}XkBxCe=@2!*MAtcm-pw?Ui3`7&5;_v1gTaEt-JdnS@Lqo4Jk<?_>PfbOhk zJ#C^k9+uTLVX&MYL0^U+<tcRB20p5<pMihuShcz0JOxtk-a0*aUf=zP0m8HQ4dkM) zQ|gU476(bRyG93&r_T_0ZQ%vLYx7$hK+HfUVA;Y8z~Vd!+U$OB{4B9k5GHrr22jvn zoPaRiZa<l*tmO=Ho_0CH3k#KF{ma1&@)Lv2(qmk}R71fY%jC!rEaBl}IpX{oh}D1l z9`XTYV~$d|Dc)y^82&OWD3JQ-0BUsa3C>-O8@_V%dPQF){^#)+<T7#q`i?Xrn&A5Z zizIf-5m3LcU@RUrTt?{NJ_fM<9I-~5`r4GN^BX^)WEizNIvl~VCyrFw^L>Yqw?{De zAEF!nKScA~3m{DH`TB+WxSr$3vO9lr1d_z;%8FQ`KJ91mj2ag7Z~T2w9oE<rku;K_ z(FRg{SfKEQ<%|;pf~BMF@rOYd`O`qc`1*l{9CwWA?{Ti;g2iLe3#fHRE@DBLP5VZE z-E(@h*+=j7$CC3moqmsVU!bx^T`MegbN!0_`OY_ul(+Qvp`4w6)2}pLi~)be#eAK9 z=~LfFC!9gwui?Ul7mesv><93+JnjM&VfG9Zmc#QHSk5=bZ3;FxHDor=T46aoR>QeO z{Sf~O>o4{<_9JIyqOyP>aXf8v{2Oid>f3t8t~?RnalaSK<rZXvJX-XTJ3PODWp{KF zmdmsMSfV24LLxG5EJ#YsK5l=XK!xxApV)-2A6z7lQqzOmRiVL9k(kjh2Y)W^KR8^j zuFun=Zp8xaJob1f<lzlM#?CgoGX?pd+ci3Xd)}@(jOC3}25Q~x`zRze&zmiXh&kF3 z#q6j?j0HG@e}(0CZUt>#XSXjO<ka^>2pKhd!Tk7cNdPWZBSE3r=MI0t8jozF`%irr zeN#dKp39-l8SzATdafT&o68Zb%NGprv0lJZ``L)LWcUYMP-C5P&8c4FuE)3`C{dO@ zqBwBw;=a8AwD40CchGaYIIyAFgQa58xHWMPW|NON5@IBA&XM|vwZInZIk1H#9Nz6h z6x7dprbz6)SmIpZk34@{L1s6wY*>&y^cfE#DrRCvrHH83tYQVb=K$yK^;refBRohF zLvfpejTg7JPXx)=&r0Of#{g#|?v0e(a<)F$GsxIFqG)A0BZM}WqYU^wW1K%!Web0Y z3TqKpCKw*^cq**LSwe+1&o|<uRm6<qe6fqc?Td&eY`oKbK5BoWIU)+c!X7)tx&$AP zHlPjt`;dure`keA>HZsa)Z%m|-RKOLWnEwAg)X4DX1{Nvq!W7xmdnTOvn=|isBAk+ z0qNY=QB<E=jpLE9)Jcma);3yL;dO3=WZbJkPdx6Y@cSbQx}i?wJ1i_Y&j*wI0o3T@ zhW>%i5UQB{{4{?f<`H)p>YF*1VA<whoQ)f+#AoluymB82OPppK=YsF?8!l4JMA!qq z7Qh$RSg&AZbwpvjIb(-1h@02g!E!j_^Rpb@H#j7YgjrysIVKnj`nlfg0mnBiyKAR| zbPt85&l0O1j#^~<c62@5Q{7RMi(Zdt<$JFIr-x+<)&+lx*+irLX-Jkv-(bwd_W{lA zd(}Rl&Uv5*SA7NWbn$)WXZPK5#~Hi)eb55&HMcLfSHC7n8x;nKpTlDJ|AAy0y<T}< zw5i(%x9#w_utY?L+FtP$jz21FY7fYJhX)CJEizrlZ;PAW@jGI#qJmfWVpt+-cyKd{ zUJtnI{yu*L3gvDg*XAeFK@h*%jE{d)SaOlIItWij-;l2LxpScH>n9V8x4=^z^L9k9 z=RMm{SIS3cj(XJ#b-Lolk0r9p$NWY-{#c@-1sD*B^xiiFOyW%`OYOVmu>kgnr|qZj zVh2QZ-zg4ghcOSJUdA`&r1ewtq;{^q>G|8jzdnD7ANc-;?th%YSYmX}fx_iFI_I!P ztOgWuWaVMJRSz;Z1<oQ)XYc~y_nzRZ{A+(z%;J4eF!3*UQi7r^Q)J6e!qmQpz^;$` z+zAxN*W5Y3aW0%(HT}dmAxHV?d{P43XX3d|aoeT3S?vDj8Z|i=czO}PriNH#tu6!) zea(Mec`{vpr>oM?gFCQ>@Bx25I@gb^gwFU2{I#zvs*6SJ=^}m*|ATI;f4PfLXZ;T{ zz1}x!0>rotQD<nmhUfBm{Z%oGr;(EO9SOWmL=CTTj_erq&Aj#vj3Fvg`kRhNJ}qi; z^0e#l)kw88SCsgo2hPdIGC3v~3o&%>HPwIPeMbT<HkD<LNXfMV3ikhDZO8W^yiyiw z3&+!f+sFC0IDY}l7Fk7@f|0MMwo9yFd_iZbFVtQO)E*qd*c0yoy0N|~N{BJzIkD=0 z#;AZt#gkB|#qvZ>{6<;CzrsC1Z}(m!_8RX)c+}SqD4~d@acc~(hB{Oc<AOsHXgYtG zk8#f3r2BkN#FA|aZF1ub#^}t)>*wh`-x0+@y*GAPs=o#12d_77Q?M8#$8r;h_1*u5 z#prw0y%NOtd4Tko`=hi8L<g2PzQTIN4ttaN_C4hJn*uxeAf4gg2TOP;RDTQ1_Cv)h zAA<)uZ(lzT$Wk92YRN^G=b;wXsbhZ)Uo#@XVB7-jNQ>~V;cEsu5LRa7cAsI6$O4v# zl%T2``Cyowkt=vIc8jI{hsyRos~!Mj?z>=#nFuo}a_`Uh#wkP1y4aDZSr<Oi14Jcy zJ(242c>w48D9hw)8?H*AO&+TJ#Jrv#S1ec_ZUr&pK~u;3V2Ra8YSsM^Sf+oGg?m8o z)c*u;cR?jMZfy_gBtNqrvWoscFX$N`>-Ue`w|*Zik!OOh8MhBCk&WdZ5w~|Nu8gp} z$P)M-|AJ`uRRWVUzRwG5DaIgk{9koGpF8hxxPC84k1OtgFZTuCVPDp^uafsG^x)rz z(hNQm$tA_D4NL6gSgsiBu_Ax<sGJ5`7?x>77G8iti@y(AU1bT~h=q9=tNtaIA0rA% z)K6!k2eFTWWDDQ_MTEk4BrKjYB9XuNZiyv!a_FxF<ZaxrT&@&J{x&MKV+mb0EW1Z1 zKg*?S;p3%xCK3z6$KLC4^Q=5=cF)UTxg6Pp{}}$kCr9k3%=!nEOm~026<5sBTA#%| zNGzdpfQ8N6$6z`AJf%(GmATOdukEuqZV(H=4e!AkHwoH|i|$nf>?Y6GV+mdN_4lKS znDzjR=d)--5GC3yo-d(Iuy3$j9&siTJ$URE3%CjI!3f4UEP)>-t{uBSS2m<U{b|$U z=K^ikN%w0khx6J#i^qTYz;l2l^B$1Bj4>$o4Np5fVg_lq_MP7nxewaB9&JUm`_CgK zSO{(V`#^9}&yF@+9HY(d_c_`eeh<ci%33@vxJlF-i5w-C(RDqrMBQa9uXDZuYYmQ~ z!ZLfV8Vg11^nHfk>zU$p7=Dfc!~!hLpEfS8&;*bSdGKg+#+iQwq1PiNNK{3|9xS0{ zfaURM(F#W`zBX4)$9dBRMHGJ@Ad-5k1~RvMtOm>D2%@jzeU0@x#*C+pM|F8xXg_1w z9V><9cHG8i@q5WSa-gc;iv_B>jvE%QCHJ-Q%qkX?!{ceUqxJxk0|xar=tW;)x!q4( zIprKhg(Z;lpT&P8jaUwkhGV%s0*Hm1z4sc<s;{{bE>E<XmYBVe<UEE?G(K2=Uk)x- zFbcVjECmV*CB)z71LB7T{pqkA9>L&$9!EFfJ5BXXL1o44t%{{Q4TTr)8~TaS>-F$l z4sHVq*!r~T@APOZZ31nN<#LP}mZ)XA!k>$C8%y|nAKiaBdQAZR@%KUX#J@JOt#QtQ zi;Ek}#8zHUTjKjrOU{vt5V{^mj&RfbJAL<`;Mn-Qo)8drZ)2MNTn`0U^l|&F0zK-g zb+kcc&BuCvYVNF?vtm|M3F7>jk)HA01)Nf>Q`layvS53~{ggUtabkQtFdtFCsLrbf z`@F?{ZvKDm;k#h*>_1O?;w%9b;ISGMSfLy1_rc=vD%zaRx%(`Sd(rb4%wgKRao5DB z@z^>-Zdcq(zG`WH(o*QoImKUeG*%-PkH67o3(pQzO?c68#~ek)(~j_-kUsO6DntOH zLjL6ziZ+C0b|lPKGRWgqSRRl2f2yG2TOz;^^X-3=sq(!S#DeFUs0)NdlD-c-FwYFp zCaRPG<^#ClPy11KB`l}sjCk7Vm_{sby(y^z_mKz*d7K=g6??h&t(1mnvp6aYOGQ1F z;fnYHlPdhTkBJr|Iv&n_p`IU@4u78!wLQ0hDe<)p75ed$iSihp;aK6QdBhpZ<tlGj zZjXN+V|g9FgC=L~J0Gby#to{ipXd-!<1~X98uy=tIC;!B(sS-x5_XCGji|C?b-}?z z)x6IVJ~`MKM^(}$@{L&VE`5gZQOmN`_aP?`Z3yPYnxpP=>`3eF*w&R0ZFtd$F-D}3 z7=a_RdD<EKH9^(buOaw*ej9pLaJsONnbCi-CcNU=<(05UL}U=PjrGH|Euw~CGr}Y0 z_;I~K!g7(*`)~2xh3ki-xv64vq~(m;;RpEiwT%-So*fQcL>h5;!b{_zbH!?+mbLG! zOQ={9&m<V2UmGr5MBTTlbGO2hTLym`CDr{F3SZO}r`C<syMMV2$tm|Ks2Jy%ES`V1 z$KH$O^)Ck=DsCTGV%5Xb3!egJoujo@s?0?Mkb6Yz@f%gLVyr1z6z@aXa6dIS<P+oj z5O?ttW5e@~r=jdymdbE!=nBTyrj%&(0G*#|b2!ou3E0<_JgNQ@>}f1NM>}G<ZXY+Q z**VJ;Lh%rDbVqXDBN$Ys^ISDgtJ8lOiz^MS`!6acV2KKASO{(F+TOVbySG7Yy!dkH z*T<K`68CK^F%x%GPbTjhOhKQCJ7GiLL$HJwup@01|HGx)PfZZPj$2=MG7m9sR7!Tg z7hS8#*8&_<$CP}W7_T?=S>lwz5+^#5!PpbI1xGZTnstl&{`*oHn|(PQHwb^TuWlc3 z{$fYk$v8$2aH4%5-HH6ij9)8uOI|hR0f^vO^&f}O_mG1P$!7>P79xTUw=XS^YhID~ z2vo~@kks?Y!Z8q@)HQd&VfQ(Di~!2L%{0X=^dJc7d*U$#c5*!sJMwjUz}JtlUbcu* z!%>Uq3L46hXF_E=ZXd^ryuN>r!MZ%YBjFvyxSh;5KLO9biezDNje+(2gO#s+JCUWX zzE!mKL_6K*0qmc}cjfZ~h<Fc(;`q1`n~Yc*_2ME*aQ;G-6A8W}e3z3m%XbPY`8?IP zCw9woh+54nwbs3U$#(}06bN_28lACX#3$U?)5n^X72gMrKw2V`!X1A!a)&2kRKAB$ zRWUpVD&RSCkxGme^?<<_cTK#i!B1M)c!BvrMKfZMD743J3Fj`nComxK<>1^oyB*xf zz4&UR24CEeFT6D06H(F$f9LwaJk%L-{qBeWUPDEtE^c5x))%^yzOt?%_`y`0y2DSr z00#Jp0kbar9V&YTjthUzU1Zd#8XM;}wf@2nxhUQnUv8?%+%-pyL}<h1MYF$#M|=^p z^HmRjE~0D~^pY6SCHuDAwSKU~7;ppg-Twl;;-15`PT}vs6O8D}&CSS9rmqH{_w5Ex z?tQ}&YXM8dHn2p#<g4iCd*TfU#82lNnV;zOu*5gLL8nI><hXy_@1@qCb4k}5d}55~ zv^&F+Hm5Uo{#)v4SK!6&VvMeL&iI?;htH~eIpS=*7pk-Bo(La4A{a!GB8GnxL5Lnu z!_vPtRr4Yy1Pjagn#jv+k->d_S48F>2-m**gG&gn6HDa8pWho^%~u=GcO<x05uJR7 zGqV2=pVZeWmMeeWXZ)Sf1JLPyW<4YER-Fe_0*<xtz<_l>@#9+gs;4?%#5$?LSG@+d z9&=|7o#6GMX1CAlhw3UmM;}B&Vhqq4@;!u@;S(bY)-T53!vpzP0~f2O-I2+snqBx} zAPH{YcV41-v-aSnK$G_x{6oY;Ky}8NgXt7mp7&RN?+br~*1e~f8;j3_7cs_oQ`V`k z67*>!F9W|Nd{{V8;i<xb3Umfl^8ztV)x5wbzT@tkq4h;UIL4qV;H|8li2Ps)gx5<5 z(r4leq1R7ZED@!CDgGAU2RTz;3-5A-$MsT4$M-k*Oc5V_!7l0w-e8wFk_<~!#KaO6 zh(3#}$zgvv{R~FPZSdG2mc>tWECBIs1!LKMy1!uwB{eK@W7)XTdL#?WQ11hWP}dx7 z0xyPT_goH=n88-T0yNvl06Bb}Z?xI`1jItNAfC2+?t?au-=;SBS&q2DGWcr5ayc_~ z`-5Vm`!yD558i7sP%#EbXXyGNgtNN-&S&wgJeGf`KlfSON5T>;5-j(mKE(#7%W-K~ zCf~`iT#moSa=UN2AqE_)5fJZB_e9!Ic}%|o@Loqq(uVMHv^iXFaHGbX-@vd0k{QeG z(PJ!+d+R_=X6J8X*?o`4g7@$5gQA}ANNjwLF(a(KpV0<ZnVvrg9Z@XPdoVp7>*N~2 z?(2VT0Bh+<OB<$Qv<ajvZ4QqBVu5q*Pg|l+F;a}dL&gGb&!4si#+f#+SI8we3hY&% zMkP0A9MER>$O4ul)*Keci_s?3S+P8hT|vShSwZhLdUih6)P;+A4W}#iodLNT-<1cD z^Zpe+aj$B#d)y!4<;(r}Pm<YV(Hn>b&(D8h0fgbBGlIbj%jT-7JdOOax0wSMunlum z4#X0;4J=?`;(xZ)PqSf04>;QFj&tBBgR$vtP}ld}1^Mgn#fH+5{DiTcpS5vo^!pr^ zvBnx<ci*dq6)2{^4@{b$T1H$Up9iqY+$Tr0J1ThnxA>PMJ{x0=#W9*ZE$XCTd18Ou z2mr<jIR1W~u|aD5@@U>CLhkqA4PKk`7YMA^?Sq<V9^I$S=Fwv;#LWE5!HV%Y3g66e z_(-Rpan@5u%`q4oavR|hBezlGMs(l3b?W^(N|fSEfnC9}y5=I5^41~RR<B7_`<_Tx z%;T28-@rHdS6KJ(M<*_UJ_Zw_31xrTo%M%IedMaK+#ZzzW_NhL<g<7#XM+dkNLefZ z5p@hEss!I|;dA@0Oq$6v92;z}SS8a)G{FC-kn^N(XU`R2S)93r<#0SKmM7LJk}$Wg zQ^GDDUD+mBDKTzHx%sX<t!I6?s#V7SoZ&?SkaVpU+7Q>(u|}K7v0oGw2|Rx+mSDhQ z0fQI+b9y|UHn%HVQA#0{tv<`)vllL0c=(^izYi9V(DFaQ_JXd%ZPVZMD=i!rs*Hvu zs&Vl@=wW#q#EHs++N-w#Y2lv3JWU=2-KdZl_XR9*Lxv?6UJXJvj``t#-q-z65^532 zVmt8KYa15F5^S*7BKpPOc-(&<`Jd2G!4m9GEQjj_Y|AGOq~8Z7nq#SH6P1#&pk5nK zyPdZS#JOUf%kPZu^I3fTaBq#fCem~<6Df=xGZ7|QjSfhq=)n-xAh(6Wn|?Zza&-n0 zZQi(_ekFh7%Ta>WS0fCuh}BTVtp0}+FnZ0(imyErvGRE^|Ke<<u%dtS^fu}Og(vhe zs{B^45S?`Y0GBWJUgGqQH2;d?c)kP+-SanH&-x08F?z2Nsd7y}VEAL)-eFXEK8rSo zv&yi%5hq8yDIyC9F-7hJi)VeI2t+;$OT`mOc)CK<24F2b$aQ!fXGZ~|#kD4|gudkl zUElT6u<(WSYa=@uJ_Uc&;h1k!a0zd4ozKWgP~0-kM(C{J*+IUHn=4h!91*oqUM3=^ zP^z4<LmMOleRS5tGk3JPoSBN{jeFLY7IDvkL`LKnw!h64P`8h{<$Ki^#P=PRz;f(w zSmL(3QLQGPHtde|*kEC~Dh-yyvBy|~p^R`kc^>^fTtg#vyAglH@fpu`DrVI-?XmA{ z(;1O^s+b*qo^BMl@f$Lh?7`!hl5L|LrJoDmg(2RQkX_6-gao43RI7<L(D-A%Ex~Tz zHq^nRZ-~vttb(-atC4LiX75hg*U$R>Z;sp{j4D@3+4kQM_j+=qj#Q!zh3<5YVsWk_ zZP<9C4I58b4%dICBSakvT39$Z{b|D<xv8C+G`{Aj*XGE@ZRcus`u~j70d&h0HBS)e zxFh1cPfzSfL}48}xq)D+H=TpOK$|Br`7oX8%PsI?{7tC@<tq!d!SF|S0AB8;!A**r z9t@<&CQ-#K^0Wt7L*J{=+=@se7UwT)2OM^PQ);5cDRY1P_^LW?Si<K!e$*+6Ht*rP z%Q5^#wDmyL&sQTHsJO8l!x7Oh5T}uWIzU8uWC2UeH+T(!SvZJb_)bB*EN<fHo5d~k z7^!~aBT5XiEU)uvp<odp^`}j9_+l``9CyppX6IUA3I4+N)rIrbNIlu=0YWyu^BwFV zF$ScA<13d8%L~JQhvH(s?_9$X`E9sXfh8c~9e1+}&o2IlV7Si^_*ro`qb^W=pOJ6p zZ%P@C%Pn}2@wGW+;%OAy@O>0TvKs5D;x1@mc@3BCB8IYfuc;mq??c`!dX3lVeievd z=T&dl@&=v{7FMkVf<n<Z1b1WHh<f;pzmd4{Uf)RR_-;vmeY2Q}SX_Z&gKHI759*u6 z&c{k{hS&z9Dzbey{Kj~n@h|Qr_gH90YNEv|p(a|ycW%hwKC7rzR_}w#weRsai6-|@ zZqg#YvS6%67Vbuy!RO8ml{9+&X}0Mq`D%Ol&IcbcqOH{2ntZRKdR5%ssb1yEW81^M z#63tXvBScD!U{hGrd9Z(FsdT*gVJlv_|M{_^N_Lel?87q?wVAu3bgPuQkp@(4>hV> z(+`2dP`ki##qIF3_#Azx-R`@~Lrt1^Q);)*-fN-+KHnZna)yPy*LUTI4axUJERnsW z+Ed_EAJ7c$Bf)11ABpUCoPaNJWgi3hOpC8Zd;sTv|7@sW#2CE4E8^F1lU#d-r#-Q| zyg*o^*8_oA{id*%BIZpMrr4`sAT2(xU*c6h58m-|Hr|G%-e*F1(tAzNFy6FO>o%%9 zL>viAU_oE9m+tqz$c)B3Smy9<UzAdO-=S_&>{ag?c?_hrM#rIG36);Ly^C{6u>?l* z3lWchI(I&cbGopEhmYm(s4kY%Z!A~>$&82?vZ*#huy8nr<#o&g0Cezy-lp&_w1NB* zZFY}6(dO|C`%a?EZ#h_^sxB64&U+7VP;~Zw!F@lou!OcSmfNE%02)IP8B5ea!h)cX z_nPE;%(o?!9(Y>zjaq+tE>K<o9SZLO5VI$LEU#xTcS5(055cl~CLhb?yhBK?>*YP* z9_}hTv>{Hdy~g66-PgvoQL$V{J?-}Ml=KgbChq~oM}0L?s@e0-Jnf7*ipB4mUz<}; z3@n$&h)GT1Zg{U@{rMdIjYNE-&2`3?LwC}5ieDjaNP)eMss!pt;TP`#P_pPXa3DQ@ zvv!UJ&og16g0TM&L?>UT)SL3?B#ApH*Z#B>$tShICUWM<4rj>kOrItC_Hl-MCW80$ ztnW@8DEHq!i>th0p`4w+&u@301Z}uwcpI>6>c{UO*`Bf>U=>dzydRdRBE$b2&N|0} z_u@|*H;+Z{1K_6U8|ubknf_wG9wu~udc6lzRC3$l4E<uh0ju==V3@C(iIfA2FE>Af zpU%S^x_R{N@r)Xl*K_Zm#Uq+udfSl}SP)|JaRW{lUjYF3KnTAMZoKJorsehf+>Vpx z{xz1vBMUoRp4nFxmgUs<!Q#k-?`e)GBq=}o9Rmxz3;!Rsaz8cU|2WQjC&K0NDlDVp ze|NBu;_w~}5L&}>#Oxhe!M=x#U`}JKVIcXM8%gE(xiF5Gt7`1YO~Ueqhd)k3ob^~7 zvkmDG!C4<2qSP^N<TYcgQH$|?6uC5yG!lSBv%q^m=(a3yAEV9SF>n57@rp25HqU`! z!I6&ti3+T=3H&wJ6(9rtG~k;tqHq;`f48IpUwF|lsyx=YbD8o86P8f5#WKYXOFgjY zHMPCs494QzzJ2=b;rma>F!^dE_T`F{gj#>Gzp)g;r=Wh8^PMU1ws<uBvv{lq%Nnb3 z;=}o@f`#Sz;Qx}$KI11Cy=A$=kN-+o`mPKMD{ckT90=om0w&~pBAbgd)pso6f89># zSo*4mH|4odCeGygZ&)INzEeLde2N+Rsed1MM$@Y+80|GjXYA0oU1fBiA;<c>p2>y! zS%O+;>{U<%Jd4f$gd!N0!*hCAt~fQ}897sMr?OV;<Z~%6(`Jl4WQMNdz6+MPNl=W~ zqq@NP%8!Stm^}zYJ5PH&^Zi*Ie`EGp;tWQ5#`8ZrOs9xB%-jw=vM{58>Z_50%yIhw zkn1_h9gF9gu$-}r!Ap%9Pm!O9U{F;mBBu+-neSC3zGEIN(-ik@B<CINh!{P1Ze80{ zdkRm8a=RX--XR<~cMQuK`x{)I@DJb?#+e1l$MM%BWulHWkkeoI@t<r_e~iI8M3jKw zWb8;Qo`bJoz(9^r0csy=&7Z|{ZCI|jXVEjq0Mh1-FZY#?k6!;svFi*$YQj;x0CGp? ziDL-_#Ak{4H3ft{XGBqg@{w>8BNjlZ<~TLK60Cj(lWvT80Khog?4Hv@Y@I8&kLY|k z{%wcl<17U%lXGma)QQgIf35#vip1Auij<}HYuH5L-BN5Rd`k=wLC4}OlAUA0^V?X; zdtx3&yo!6#?fU`snH=k}Z+K6BZ^TcHwXjib(AOMwlj07DfQaL-cd~Pyy~Kitpz{q& z#9cli4EM!g2E`3*8&S=U|GC2N-KgQ>Cpz*Fkq1OHA>tGto5=5)e{hBzExbdLj$F<* z@8O4Rl;MccnXibYL6VMj3cIAn4ccFf=(;&#ZQsy0_P&uKj2Prj{a|0)JLoeXQPh#b z-=R82%y`l-;XRRHm^{)*5I<s&U)bH(&lil2_Zg@KuXA)SMgDys&d8U5XLo$a{)G+Q zAN|64ew!kG;cR1`e|ATHVIQBkZ&L#)BHLW6>wT!s=kx8mI9@((c!Tj3*mitRBqJWT zf*t9zX!ALw-UGB=hp=3cqeKlq+8odUeTKli3_lTGPV5KAuVN@vEs8tSXYuG4USh<1 z;qpX2_`pl^5v9^m?3S>6A{z^rr~1bA)aUibNh!-3S@~l+e`9SQ(-rqdY9PhV2Xide z!pBL8(ILy@GyWjU<MRzm?D14GePdQFY%e-{4=#Z*4;Bh!M4LH~JqJ-;kGmYyiiz(- ztxVq!P_hnG3+$U317rbw1ycvgxp4ad2`hTNvMu@;kV5to@L12dA#=-$+Xp(*`96WE z-_O5LiO0gkf7V{Z8H(E!7U$RRRC@{p#8<h=$KWJ|>+=oE>$3_rQTYB;Zu<EgJ%`7U zi~Bi3z4tMo_Gk1O-Bw?x=NPz7{^yO%_lXL*pINY$oY}CS^B(8iIb-wp;XZe}g*czj z-V=-aE+?U%7z5-;e3igWiiiwxtneVwpoqH+Y$E4gf9~gchUWky#VeoDCMxaiRF#T* z$%UA;&k!u}eJ)5?KGwwC<4rH92)<Wcq)XhhBX%77==Ec%>O7#T)D!=MQl!tF3yDu( zKNpkA=gw#GIf^Cnv~Zwe=Y#1KIV0*#IZtAT0~HZxs!9d2ly4AGP-4{K4PImDg3^O4 zd~$w|f9Nrl!DBUIsj;4)@Y1e1w32r?^no_P5?MufG|mj-X_V6O`IcGVYoVf1v<XF) z9S&6WV4VZkc~N2W(*L=u7Vv)mAvox5fJpjkgjEocg}c<w_j^E`&i`i!UNvn(=Lbuu zM`77rF92a-!ff7yF{;SW<~aOZz~U@9+MKb1e{WLKK6hY8)reAiAie^c%zo0|ga+eH z=Q%RpH~O&Aw>hfS>^Fj7G2ciq_-;wXtH^8KWPSZCq2g8SNZd37!vv;s@SPkr{J4F9 zm~%~-{rP+24#<7Q6}X{bL2K6eMhqu*e`-_(a-RHPc#trvBKrc?G0>Y265#IDJR@8H zfA95FnL8>(x$4&bOrbZ3<#rw=V(XzAgoRQ%-Zyxze%8aAa^@CK3st9`dQ*WZd6p&a z80g@Jhw@Mpz-Qt^GN&wa#1kLlmcC9Okbb^?;AaKOfO=E0PGN3^fBpVZL`=WJOBT-O z&ijWaA8qO;0jDc&)$flYtp2p$7W4YWe?^L36OoC&4QI^JcQ_-v{Gv|eUNmg4z}dar z+Wg-5BIxbs&-=l(d<>|UQ*DU&Mw>HmgK)<pd-+01iLX8VCO_+mU&O5dhUemE7S*eM zF*?)X+9vxuT{T0H+lZ&l^Wm%UMO85R#?94N<2%1``vB8l>!&LA?C-*r+rJ#Oe@LPS zOVnZC-<3(~PlF{FV}KN4TEa*An04;EylYhJq;Gf#(Kk5PW;rNZ?olZ$Q5ynFtP(7j z<Ae@EPmj(WEKx@q%jPj+EVpA$5zwN{oWJRSLmHMiF?d?kL_4^*dj1Cs(RKfy@$mZs zZBC!pSZ+rd9Dmc|7&9z~N5hXle<YrDf5UQnG!Nl1(Bb|*#BSqh9QC^DdD`iy<j>-9 zSS**{T(R7a9KjOtozLPC+T(BKqUCQ&r9EB2w1Ea3ZP*mUvN=|Yrx7oTHdMk5OWf-b zY=exgZP0y*|G^To>PJAvd+-Uv>0U(-YK9P2b`Ssf{iqV}y{6i&uPo|;f5liMdF6U2 z{10BA{|{=W>eYM+HIES=NU*w3fo1jk50<lf4NgeCjpGOKHY`Z;mu2xN8_vP*Cli)C z_A0jP%V#_o5YL~oA)?>zW4&yS=%CH*2uTu=fv){5j(frqu}&=K8LNbXi@v`>fc0B7 zPrGBU8lau~7<}PTAJKu;f9Put_JT(MNs=PTqGLU9I{W*4Ou@2Hk;R|J2hv-?F+j2O z5k;HG<B7C+Jm-20=rsE7La|%Vq|gREAMf=Dkv}XEccF0M>h}^XMC9XXk7rho0n}@Z z=yZ6Di#BJR!N`kw?vOU2Q-bAnOcr99fVTa8=1_hi^&T;NEI^g~e`&xEV(u`hq7Ct? zXoIM^d$&|sbu`0)CHzqey*eL|Hm|E{9G{f6@4a7jF`vCe@Eym+)1q?v0pv7x3aD^? z&!P>5!}TkW`iR;4ar=C%N2ZmJ^+?qS->WDT<}uX+Nekz6VToHCmQVn~^7?%aIlZW4 zfMtsLHcnft`jK08e|%FkBz-5RT0uQ+K0PjWz|)I$ip6tn2*>^n?$vxHs^a@l@WZ`Z zG}S#{!vBN{9~J=JKHnD59$_g@2&{=?%n-sQ5b96k9_(+*S>|}LgCZr)RV2B<eM<j_ zltg%3(=Tu+i06jt{b%tQ7naBse3tOV;0byZlr|LI^7o-ue~j<`z{#hycnu`}=Zzck zH2$0?fjHk-Uv8YjhlShcoCjn@LOTP?8uz)0czk?qu)1Y=Vn6t#Dx=N3)R!Yj?LNgs zwT+n9^X+j<KyFc$?VysI#}lzoZq{cA@ayOSEUf4??vAh1Y5h4Wj0FELP8mL2oMsT- zVi%(-o3rE)f0CwDq`v8A@jZV2dpvUooUeR7Sd5NlIAA1t-V95qs~qqSoxgwuYJtDc z7>c{Jxgz#7BP8Ja_55uJ{y)exMh_+~XVC`qeps$IzQS}ng6NnDTl)S+%?QWh(1t{< z_ki*X(Sv38Y~O(|==mQkp>pt9YF>i@^wB}c)A3@*fAaf9BnwN7DA7d6e(^NUbR8XZ zaKr0d&}EA@RFs|lX~PwF+GYF;51-&<#9fw=K&b!E_{1tfD$J4d2fFfaybp)4pN+5> zJzv7p_Lw2KRjx96VDT(A7DSc&P3OAtFHkt*E3m=3?~im~ta_@Lxh6Bx_MwaOiQYS= z1WUc?e@dj$&mWeY=Yx6L>-o6@QCr6eeU|vzD=-xQ+UpNQtbPUJF%g5r68BTmOx3sH ziQ5#6#PICaks^}bH&l@P+$KlrnMh#KwTp2PkF%Z<uo3xL=hM+9$GZGQ><Pte&%)7W zaqTlKl$Q4~SYVum<#rSZ0Pvx{_6p3+pSEtUf04`60{M&Oam*Z+H|~Jj-{0eB@P@#p zkHLntqxYIBW|#Z0a1~t-<=FnB?hBS9?pg2~UC;a2pm;{Fe|O~cU_Qn?*uX6KTEOcK z50aS^{sC;s$Tz}?jGcm_>hVptaf{nKj6}yD9N-BfTLB|6qAMHDzxzm3ON*EgC4bMD ze^m%>lqEEo5BQC7*WA!hsi$obBi`oF(d2)qjG(I#OL#)mH;df`F1Tmqk8L^Qrbn*N zS+lfx!w<o7xwnBOd|3FJj#N5e6niDn&l27S)pFvbMesIa(d7CZiFqJr>WX@wC3>*` z-OfWkkS2{R55kkqpQFtYa|bUzZsKsTf5Nv!sw?&#qI{86gcIpCc8(pd(|rmApBxo- zz@r>J%7(>Ra<r+;14<y_ZNRXMJrP-&$p4^j8Rs^_9?s}Jutc^Gi44a8(x&q0`*K7a z7I6k=4wHJBBN~Ava@B|#c!ffqRyQMV=;4b2!U$x-K}`+!(qMl^R-Q_3anh1Re~!E6 z@jJqI0Uhtm#{-t0v%NlxBMJ{vDK!QIstLMZ)5eu6cv@&P9Hdg>&O|-Gm>~p~!`q<Z zR>bhJL}rLvNxdo6YTT=VOB#7+xTG}?rq_9{$AOlp-wv@1?g>#xEh0=<BA-PF!x>fd z;EFTrnD5KIPBI1IQ^2Z@vxJLDf2_u1jaugbr5@K=K$?{hhR#ITlHrS;f0Rm&HaP5I zc_P1X{()WeHn@EL<xVR8db|ot;19m)Z=N$ce^d$a9so^nzY2U;WZ|e77xx92oX*rZ zU~)$6_9Wj}J-8fUOj*a_iE$g}*sD%b64fS@1o)rR`KMS4A$g+a<9j@Hf9|fBiPI6d zjgK)Jqcc$x#=q$ldV|L~2ipF#xRwEy#VcB1*&Q{G<%rYyWT%MtAu1KCWT`mpxtxI; zgqiA`;)B|Fu3v?PW5!2xU2Dy)cX(+RN0!gG>vsm~2)1OLW*6B$U%}UKg?9@lGR~3< zk=*DT0;Il^UnByf2S6u%e_mhH>P$4`(f2@SP#GfP$`@>}==BT$PQTnm!TD&jK%4b8 z1c^P4bRjf%N1M>YKVVCS7mX!ObSx1kr!wB--o^z|Hr{mo3uMBzj*$z+bBVp`LUqee zKrGHUI4)eVYJ=D3BZ|~(d{a<+G2hm=zTEmoeDnr{?s2gj$h6<hf9~H9$ZU9_fqupk z@dIk(g&z->G<Kw$7?=A8_dpm&M-;|rWGkqr7jbg%cY$EV68i!5^y0RAkHObGZkROj z6;SH(bKyp&*JlV^(umYk;jO;*j0Crj+dN0i;pU<jW6dQr<_=nW@jj$0d<DbG3=fhV zLc~XjQbb(r`5Ob7f4~kB9@oPb;``1+`o~w}gAeN?`dNGoo*!~$`W3)tgopnO!*qF@ zVT!yAjM2!xJjmhu%A#(qYXcqBxeFZ11NzLr=`)@6O{eRP5v9;kJPlrG^g0orus`F( zK-Dnzss~ko*T)(?)#%$2y6y*+%3=kR*^PK2RV!i_gX<N(e+xC7BPWg}?lLe&1Lpwy zGuFaOVPW47-oGOvW?(m6-{qh(Ua+HHa{RY`1$<6t#PhVMwt)rJ1b-R;Z1?%75aK-K z;~ff{_YSaq<A0v;h+&Kdx|aHYao?s!i7Ry-Fh+xQ@zoUc^#jK<q69A_;25`QtX`M$ z7#F}Nm>O@Qe_CF$v3|;6iPIVN-X*>%;ZgU9Umz+m-<GH|biANM-Lu0IH$9Msac)yP zB>a$<Q!~b3g~4s}?c`aGz{3(+23U5_pJE|m760=%LXyMh_m8e~UDo49uI#HQ^xGZ& z>R!dM98o|4Gj_OV9M%&YiIl`>Qe+$+wcKy-Rg`GCTx0h7C!I~yheF|!$lN<Ke>o89 zO68|f`b?3mXX0tHAKXZ`qCq5kE=b8<-EtSfh_mWOGS3c##CiEmM+$xjLMnDa_BHOk z{7zZp+P;yzPRnB=RGfcjTC~k&@0af33n?2j6$C|kd>@Xv%zrBb!qB+Gf^2!e1|d_h z{0^5g;tMH%J0nJyAY|7Pgj&{u*bYnW!t7naeO+X?B*9sZzLWtrYCKComdrmOc_FHY z-0OwxT7n4Mgs1f!O~UCe)iyv#mYjcw#AAZMn3nIe!KlbjBPtT_SvaqS`*kDvc34KZ zMS1RwYzT_Xxz}h2b0h^}`H>?6AfoK%3M%|j5R}M&adbwYd}53wy_Yr!wDR{EC#fG? z&=BTW0mzlD^&63SJyIenpIIX{)$=?UxdP^Ode<(LFE{t>ry%@;t3Hn?B~+vbWIN9m z%7~}L+K})<en-4GcW5em!wF42G6MocxL+WIY;q4)$rVPMMb5@?rQDx9jf(FX*+d0Q zKus!t?SWKVKiegi1I%zaOKxIzk9`Bl`A|r-y34);lKn_!B9%a%At2e~Oq;pnwJ;&Y z&NH6Shn#be_GG?I9JG0kg4noC1TyltO)M=zxHJiJ$hnR3F>84WNRH)z9N9+<LcXQk z10sZZ=bLc*=T(BkOzbMulG%SyFru^95TuDJjYI%f&U#Mz9OEbGyJTGs2(+U-1}o)9 z1ra_hPrGCvos6?ka7M^ZPUV*53n+i7O!=MZlodQrL__nNPE}4B((`2xI-z%XmHBC8 zmy}+^?6Edoth75BeO^CQ0Tk;NBzsp#YS?G#0U2GV{5~*P^C<&uFnhL1#mM=bp9ae< z?{CP!vOk`u?P6O}p)h;qXd_w#kSgnx6e?K-OdF|ST+k5a%*!{D^VNWeVibRboQHAT zKxAcs$oE0;ma|wEkj(SGkt=^~vgQ>-sE?F;P42)v56G;QBc2dPB#R43ksAwSlgy1M zBt*^;8xX`Vx!2Poo`nStVBU97Sjq{AS~9aY3y4@X$b)5NA@;JdUWTm6FUY`T?*)-N zEr;_Wqq9(*D32SYiF}qor^s162l{qqojAxPrzQlV90S9_CAozQBt-G^!3?)KO7>4# zjYN5}op>ib$)_e6*0PeOtVI8%4RM)lL9Vzk@|pvYvvD1k%w3@eqR+Y!v3qYNXN&V- z<$^5lmwn|6E&|0&m#yUs8v)6e$>j@2f0QlHQEcdmgPhx>O3t|*X#+i7en%>>(#F2e zHj=b0KaKKc`CdX|MezWlKh1fva05e<$-hJCY55(p+UB*rA<i`fyEFd|XJcO5OdW|p z-9_`PjVJ*MHnhzUiuC6Fjmn!@sX=KKoVWRXRuqAPa6k)kiC5|_LYvQ1RI{^ue>tK_ z@;=7eD`;bLB)_0C&Dsi(E|xdSa@nh>B_#1+RHm5|T=vm!IXn5Q^3KOM5X)ibYLw?F zh{V9)B}hCNL?XCoJTt$l5JQmr5A`TB8;CZfu!?hMXD81yapyqIa|f-WSi~SQuTe3I zXJOwixz`^L%C5v-<MkIyh}x1_f0t9JEji~sgd45+DGpK;=GAzR=QN*lWG5HjI`t^U zLIKI@fr9c;PR#=sdY-+<NTQHDZqsOEjYCn!n*48h9vqWYQ!U4x+A8;8KJ1&$qVVTw zl9>mjizoP4gv(Z_k|Oaea<@x_5PhS>0gv^_OuvHiQC10ew#?Eg<ZF`%e-z3`vFuPW z$_hR<^L3JXS)yYkJ{Efi<zv?66qJv0{-Asu^O~blrQE<seJSI1V((;M+DQ_mJl{@k z5`s)iW;;>>aFaPo%{=iRoa7D9=K{Jzi7(tK!SXsi=OVXIbcb2*Tu4(T>?W#Cp81YJ z1xZDAIp?SbImtI&FY)G~e-xBR3MwNTYm6lM+S?%~;JHCwjQbAt8z&h94yJsgyh&#H zn?mi$>NU#E<M53=pmJf>R?wzO<gPrVW)N+f*hn{dC4V2N7IJgFsTSD^piX4Ys0SgK z`fvG7IRT{ygjTa{S;ivPdYOt?4!43YpG;JHw>GmV1t}duv8DVzf80y*OvIrmQ3UjJ z;=w3{o#l7Pp)cdc6)f9tTugG_ufiomZW4H1gxLckcW0_J%Ds^)jk&5vA%nhni^wh} z_c;(*Kb5$1o}<(|%sl*3xryhsT}P=CSt=gqJk}LUC|g`q8<aZ}H3hROli!ib+@%sC z%=4haSI#F!o$brje_8ZD{7#kVa;5fK-o-%VzFn6hp1F!+PI?WKIj>-<4GPB$#AXOQ zVtLv|Mc25t*?A?tK(#^X!9@}DJP)o%6%YC~aG8lc0Ff1Z4aA0|&7Re{h-te-%P+Fp z=C6RNOl(*xjLMh0$e~hl-<Z95&0X_DPCz(ra>t<NimdvJf3RZSM{h*F4{O2thLT0z z$9SDozR5bhLhZseuOBKDW?d+4F7XnOLs>lN7rLChC$g?&_rKOA5oszD2`}J6{h3$R z#fg!}tzkUnQ?orzvH9Ag*8Dq-97K6nZdB3CHU%|Xg^z^p-hKxpuTyFY${x}tQX<E> zgEC1h6cDkZ2SMca4$|y*mksI*L4R+G%UOEB9bM-2)~~#ap<a`_4D}9$I|-LtJPRP= z$wJqb70LzmnnVbxT_|tb2V;)(;S`2Shv1vnT&F5%o(Fe@!o2Fyj@g?|oA@01bcmLx zQ>sjQK(@d9wYz0IFCE2b-YrpkiC3y~lgN8K9&fpUfyj-elSNs^?GAayU4M*P8^R+d zD~@nVIzBFWQ!?u1{eX&o;yEQ}w|MINwu(Lr)`slYtlz9M#ZZ<?l{b>DP7t}vfJm*F zde`8KvkGL&J8XqLnk`6>Ir|1d@cgH53PM^7L2ABh)(4c_xL1KtcO^fKvoX#p+RWK< z0D+1rPZQ4%$(1=6avM_r$A9@o8xmAV8)_wIWSKHEo6GK$W1%-v278)~DA}iF+?GA> z6#UMf?Ou>0@7EQ%bG9i!Bx4SU_%=YO{hZ$vIbgJ1>SGg?92fpG+Z6RyZpAYggn^4a z0Fn7d@IN!ADWmhqUMUdBU-@@N@srm9vU?r_(g4bQLm8VrOm)ED8-GttkX7a=8mN2% zR_I7MDi0#je~_LP6v${EnOO=Vks%Ngd*l(tcN?uI+K^{Q+O!<Yxf3*HCMF11*Z8#Y zvF8ljIG9is=QhKf_0F`pa@4n?XOcG^CmT`N{<7xA3G!F&8#Pn&ZaGd;Iiucsro4|5 zqRf6i+R*RZ11crwb$?1ufE<(HY2+5kPlI%tXUKRHJEaXpM+{l>E;g<bqpTyOy?kbk zq@$PL*>E7_9&9+qA~JDs=ci3<<@wBFY_gY)ZEq;~n^Md{`ZiH%BJX0;K>R=VdSJ5< zq~(ZOW%6df7zl~7^3xb>=>cM^yiO@}l<&a=jKmjRNrGf!J%3AuLfVw96#<d_Aryvq z$bLZZQf$77P>#$4Y6?cb7{60jX|oow944y;T&J~Vl@G3Ux#`_VX54@fb<JOUlgjqA zsj|DUCySkkVn=o{f=Su4T@iBTJ0Qp<r!!PgIkO;5i0yK_NAs7Xf|s0GRPf6DM1lyE z)`}xactKV$_J3C9y7M&AA%nE6%B(X*(efUG{wH%mX(N^3E6Me<M+Rh)n*^5vv7*uP z<h&6)t>p+iu2!ji1404EJl0g=&3ocq^(&uQGugEBDTB*FY(6%moI8Wmj*w(x-yjR; zDp_?I2eE_}Zj^bBE@R2DcSQVzIC2j_vUSU4O6)}HXMg1!pZpG9V)>mewm({ttVtn> z<&;_dH<EQ=AeaHU2k-{-{<h3;$)wFGw-0VVaxUCOi)0MYq~z5|7$e762m|if(^wZ+ zRPs$%TlI86_G^$F6X$nGw2((<JuaC$tP=SOtdeXwAj=UC25Q<}W;{{FJl3rF%!EOx zh_gPv4}S^UG6$oQ09CA-6{EA}ry-!otDeszUyg)_aytac{<lhoY1#QeGCzbiM`j(} zi0m#@84}wCj$8JeR*2cTiVO&Z@;q)cRa^uqnMuaeTK0K^NG3uO)UxdJ@1XX|=l04e zlkGQ3OUmtIUAx>|LFCS~ZW3SM8ZJ4&Z$#`JNPqBhmXOIHGp{P8RdW0XWRVjC-G|s> z+vCVQRi1Wazkj6~OV;gz%sKnOjfhRYQPd-UIZS0m?B0m5ZpnKHNX~gh0%1s+alWx7 ziVu>~9XSHU)6N`|0I9OOup5Zybel`oDw3#J*cl+CWXbPCB7wYukql*BK}A84<4hn@ z>3^tF^-Fx~`-8(V_KiASIo`<APPx6KlgLam1{!L1{v8~BdA{v~u&jAn7b^`!Y)cTa zk#@GKd~WZk3-h@RBB%2{+6vwgnaZ1vX5o|RHS;<v^}y_#PN!IQ)NqzHhmKSBc>IiV z%IvdL?5R632^rC46-$V!Uzf}f^uaQ2<bOZND{Eh&XXN=tPT9P>kn1mV!$}s<?P(N! zlsAPmk$1iw!H)ELtC=5C(WJ<|aVH^Io}*Ob%AEQNa^`&pB*#K&L;1HjqQ_&G8#49c zvhJ`R1Wd9$dZ0GWUk-(f*rO;<<SU>&5zo&t){^HNS*7ImaaZulyX7%i%m_r*DSsLL zGCQyyGlBU$*5nPB9xS_!+d};Vd79l%kLAiLZ5mv%UsI>c<^hzsyh`x7%U*R5<*_zR z_5(C2Svg!mB>F-%F0mYrt=gL!!?>P=*z=dW6)t(-!Gj|A9}tPk!;q0Z<fH;#{@N&T z<@QbmuhZHzu@COrUU?>-cx2>h+<(oMI1{naG6TF)jcd&N=s8hpJU<NwcHTqq+~y3z z{0`wzd0LnF!bx~e#$cAriU`ymnUM>E_cr%{i*Oa>5PvVK7@5~tZ<)JN+1;!M+aZ1= zbSzol$kQ%~ilAeWv%au=@)+Pfkeft7Bv<0-l;My_BuLL+`$qCNy_F}1P=Adi_h7WM z9-rYQZ#p*X!L()$Q!P^wKLwhUmc3uF<0t7gRnYS;MkOk-@JTEs@i`E&Izi+N2C4E* z;b`XFg>*i`Y5@@j5qcSY8hI%4H(d^i&y}SK|DY^z$@0@!jq-g!R%>J5lmrOUW?RMQ zP*AT)->5L1{X39ka%O~zUVld7Suowj%SK%*@wS5G+?%zMnjy~vNDFfQ5U>{;mT<Xv z<|=Cae9GKPnmpE2&&vGXijqc7GxRc<vrQXgH&wh5dG6Fjayuga8M=(yV*VX=UhyO0 zb{CIKMKqh&PbKfM^qRy)`P_ytAeI9)s;tenOZ1W|OmaWH@XY02Uw@CDl^QJHN6xnn zg2@$EFjb4>%(_T$nRmVmI&8jy!L^sQeGybVa}S_s=JV&GU{C%EXm5l)Lk*<G+8~O| zJy;HzRTl?FKAnk{^lS;igOM3>>saz>cHs(^(V=*+^Z-VowP_M#xd^pMn+-R09vwJl zdED9qr*~{aRu6d}w3oi}3l@KyHp0$%-yss3wLBFh=ez=;wtXH0l=p&=CEgIJ!(JP) zQ0et7dA6B`v)CaGK5U+e<foO$9o3OC2fgC^5-xS4reHpq(3Ht7v@u6zR^h-l1c6EZ z3Y#&_+eTvB*rr1@&pQ%`-0MMPhM+GIPJP!qMkgano*`66lGq{o65)U5p)ZkGXdgI% z@)(SY;0exS-6s;n=BG_W3j~o|RFny0SClrFcn!%YD?49@K9f%~G$|6vCqIUL)8!#M zIq?ATUsGc{XWXrwyhV9!gNR249ZS}u^EB#<<#FRyAio36A=}q|m0BdVue+QJAi{vS z>lsN8(4^$GjV48`G!QYlO?Bi<@;)g1;~c%Hj+E_dkUh_x8_8Za5HfqDuK;poMK4It zng_~wN<CK)sEhe`mjm<*A%8wFmEvASo0hqtm|K#!2xQ7?a1acu+ylsg(l-P<am|r_ z4h~*^+QMQG<jjmho`&xyw;^YCobhbqqM`>G=C~(<Y`OXy*AiHbxd&_%G7~qh{L-dn zPd&dQkyS1^W8M=%a9qaUp>C4&jT%VVg5=61b;~J`E17UXAg|;ej3j%GqhF-I&ZqN5 zd9xhxB>jO@^|+Dje*=;Hd>}PvGX>!mnBSMj^b3wo_W_Y_I#IsY+GGYRzti(=_u?Lr zecm8Y6Y}rO68oV1HtwR_1`@42ZIN6@JZ;H7ArN5{UQ{~DS!qD#mQO%b1%r$zw9dT0 zjVnon^P88W^$RF}n=-94-~U2^l%tm*$S(5JP-^6Ho2a&)ZF0oZ*>g%6_MzqVgRDAh z@@d0_%YCC_f+1&)Gx4;N<BcE^E4ZDl`Id7RkGJoGStV~u1UKH9IJ7Z*^P95d<ZHvH z$SZh)nl0ayL~41)PoyZ6Z@TVc5hHGwQwCbJ?4uJ*3+VxW)K=*M)jIRqo*$GTisMGO zL}nuDD6vE4hvZzuF~}t_{|*Lew(#cx9k8^KYAF0p&;H&Uk=yP}P1`)8Aac&}b#fd7 zC*Lmn=nMxVf1i0mLXqDTu3^4opu)--HZSfglZ+^<Q4t%1S+WmYcYP*%8f3%#J{aqR zAT`Gq_??!26-XC1P1%vCwUpUfv@y#8eOBhW6Xanv<X+#!6a*m~uOMU`6r?p-joXl! z*(5j<?HCA!2=nj2SI+NqyZP4G1|&x~uDhH>zU?lLBWtZ_BdR43(FYR(lbqQg%!J(Q zVYOb9$TNS11)@cs*UQjkM*@*s!9tP&=^HWed@?P6w}d>u5Bd4>K8m55V;{%>mdxJ) z*{ggxD*k5M1ub088*$xNbZbMZ;`~1ImX&opjeO_Qrpld`%27GuN#ZjE>G^3G>#`Qe z;*xhU5?|W9h9xTBXR%d(*ILTw!a}*6d@`YU%Q07^pNH&X2>5Kqqw<llrs#<xnGtp2 z<`dt46Z$!OpA922ejh3~<*3Mo128l2ZX`#sK_oH+Lg|X!12Qy8-=JIO^@FxU+fbBQ ze#bmN5a;FAhUPA3IUrHwA(qfeO@M4|P^nCAMie$#^Bko<Q;vOHE7t;PL!>Lus@3Yt z&;ZX^9yf0MGNMT0r3bJx<javwLE4Z>ZOuJ@SP7tJ1Rt@yDcPFkD{Lr$<Y`4tGw2j@ z{%oYb&hLW~P3)>|*u_JO=tACf8_3@tdrf#-_NrU)mfsY`oAr&Pb=F2Qu|ueriU}Zm zy4-6-W%+AUQAzHAAaZV_tP{T_NM?Xv6yM1lGY~fH+-oYZUK!z%kyi=tne#@Fc6pP3 zwLozf@lJxsO#*9FB9R;ma!1Fwl@*N0XUqG+#&(&ljg34DGCHWi1z|DB(@+NGm9>*D zAop!20bE}7`=iNzy$_Nr`P%VC=h+LJT%r~Gu;-lS*Ny{QdX3aKj{&)W<zBy!T}~zt z*++L+6Y@S2Dvmg>QP#;V6eQ=?x?nJW$$cATU5?k&2GMu!0pSuEH~4%qZdBTnr!AMP zxqTr6Y3{)anaz;Qn7+`$$xgn*7?81s87JQd-&5X|QOU`<fO<{#-h+E%exKt}#4m>8 zO=3AH-o$d?EX#S!u7gllKG6?dKh%zrST(hyGJA&KkqoF8`95UlJ78H$-^MY2bI^Gj ziDcpoL8mw5Z+eh%H(SI9>9F!HcEF*{bChhI;@d#=r%yXdo{7hd>^#2@S%ak4%P!~X zv7A>vPme`30+@o5{~83cVeT8Oqr6ibq*KUe3H7FOUTS`a3TN^=%u++ddOFscnST7v zC485IEWOfek__bY6m6f3!TCUch#Y%;4x=JcgZx6>C{YnSPjc4;k@JVjHxd=OHFw#r zI!SPrzrs1LVk4cLw9;lG7j7P%Nospt=hVc{hki~@XS5K)r#R<RcI9&xJrlG=B3ilE zWMh=CP0rGMHl8>T^3De$XE64#*w-idgk-GO&F1L3$&SRGI%nCrPAa*7Nw2L+32mgF zILMND(I71|+Ch3&-&_UNc|NzPI+kns&<5R7{H7=c<vc9}dGZ**@5;K5tKe<TyCsNN zHHE6Wc~+Hi6F)^^&E@^NjE8st3!W0`8>QC_f$*5eZESLzDsV8y+=f)1@)gLJChs$i z_I;qC<lB3hu*ReZhj<o$%G8C&Rb~=y<fl>n+7N6=X>*D{q|Bs@&TYt*oOc%#iLz5r zz+O06s0;1OQHWi7K-n=FYou`bJiW_o%dA?9+*}K^PMHUr<e0ulR4;c7bcb1KOB?F< z#<8yK2Z9WPSSY0JmXj7Fv!AcZ6+MqAio~o7y-*~|eSunbS=~;5o1SxPU3VhdyzhX> z9gyUx!ZidDo+|prlC4`(Qi{in<c@NqL@6lu1#CgF*2zyRG4Z;XU#u>6M<<z^SOKI( z6FY<)ViM`9Ymu`A6{GMRKqP8~zA<a^FS5*KmCudHj#Me@o>wDv$0Q2Jc_E&9i0fCr z|6GLU3@PGur&gJN*svG0jcg;`bm2VXA%o`3q!$&*B*p?c&z^>dHt!)9k%zn%AdHEx z2D+B`kuEZv<vj#MnDf*`lW%&H7G!khHRl+(E>h{pmqSN6#U1v7dz?>a5c?gfImqvj zkVU>WxdY{Ws8lI!Hq4FOYn;R~);N6SO>uF_n{K<r#IKEi1t~p1sb`4TiS04U?@;qt zPTHn=8S0w}HxFH?tT_;gqoWuVhF2r{l2-}3Q1Ser{*+mT`cteyYz^zdh)^MpHC5Tf z>I4xV3i;Z^8f?5y{-$lBSXu7DgrrK4Q)2vWDso={$r)-%pH*#!fVA9$8TX_hkf{Zs zV4EN$))i!bAM*-s)Si~PvpgiO*+}{;UxDl$^0al3J*2Ia%+9?gM@QbpV2jzfZM#^v z4YBbMe+QkbeC>`5E6?kW49lK2=lm2TT*R*{J&^o~S0C^~<~BoF^XPOq&e;w@8=IBt z{EnU5ecUCc*CF-inMl1hQAhQ$iKo7E*30`4CC&4Hx>F!G&+9%N;zuIFBC{7ntTYf| z5Orv;c?I{GYeD{Uq~y<g)m=+2udF^F!U^sqR+KiRWs~1ocDWUF@<!wpj5=3#a_Yi~ z-;&HTqWkDnnvgF?>R4G>cMv&`D7hVF#uK%QbBBVZ!me$PL88kb@=ZZVH=FtfvSzOb z#>S(6$GLNxA(_S7C|i-|+l^#@Jjjy0`yirW2RX8R-KYzc{W~B?9P=1Z%P0CaXwx!_ z3bTQfM)_&5_Ts#z&77H6AV_KCX;MXoHb>?JgNW*{p(@C1M-Zf`xd$BEhQK$GHWG;> zfr&7tL3SCp;W1>TZDY1&1_TIB{Ma`tx#cr|s|~}H{cj)?LCQ}Xj(q;mMtlKn7^QY0 zh*XFIxw03hk(VdmOF;H~W`P{}Yy>IU-wPr+F&nDcMaFu@@t?<SmffFpHKd=;ZJ=4p zSAf(KZ*4qH^1p$Q^Id-DT=EJY@G#{WkH<TEarm7pdjLUNR%*0?e5(0e7>Lu#n-YzG z&Fd7B&M64B@#4vZ<7v&OCWtUTZzN|%0Fm1vNS)+sQ(!vUqm2sWax#sNGpoI5Ly67! zwMRDcJO<;VWrlG>x0~&2kRwO`L8LnQjmX(Jk~boc4oKz}wUKjM-UkkbjKL_XOrEx9 zzZi({<3W0kn{nZnoE9J$r1|^6+sM0r%Pn2bRt@}=%q3_bIVKLW+KAp|i*ny)@dWd< zJ;xgxie8&L>{VC(9h_|P<%rlw-&V=PL{g6`_6{+GocoM6gk5vri1K9XX(UCI%w8yx zc^@6OV;u7DnD)O-7!`TkK$bkKKr&y9r%Bz*8!7o*m>%WKqeF#4vG7p=Ti=F%E_(<n zU^(mY$7FROo9Jb|o+wcm$C`3&ij*8PYLM--w-x7?RAB<yWk;ecoa`YWIr`G31p-`t zpM~n5g6!F2)+YG9d5#h`6N{L?=O`RcLqCvv0Po3=rftMe(e83a(rYeL`TjFe^;l-_ zMqa1b>zRVpc|<{EA4Ry8c_<BkB<rRafVs-=V4~!6j=Un-GuP&^WKZyo$PH{p;-5!{ z6H8|A%mSM7xJ^sWZPMlmUW>FT*=KjR5&IequGoC@%xLG|p`>4)iSt~tKfcWf>*Q&y zxx6b=HR+OXN*Ochfz>!@&@E;6zma_YfMlKnPm}7F4UvM_{#0DdUPIb{Q2s5C^}5S_ zj*pPlxg?}KvVRohlp8VzN>)oY(gf!S2Z)_nATn;0z06)+o_5&pkQXO<+1kR@D6fTu zyf}H)qkt6)5;bdP+%%+CIquvr(qv_k5IM7FXk*?8uBUQ8T~N{IwXjUZMrW#7BS895 zJo0hAQI9NpXd4+MWrtmVR&3(@G)_SIopsBM0m3pxX79pu%XZa5;5)A$xF$JD+Q@&J zGmC&o&g@3aS1j+9N^W_7L$j3mmOQPC4Z9A=2jYklv&zvilE4c8x>3_3vk*b3$((-& z5=dS@6q*qG?Jkv>S0jk*<fuP$9G$)$nXv{^Gb<T{_)C5ttKC6=;Ev4HxeX?Td{Z*N z<nw2xs(ZGcK;*1naY5$wv%+Dr->Er9**Hq%9!$Mbv1&l%=1O)k>l>29IgcA>iM$VP zzPyuDJyHDR6tl}w(uRvzc5-+<S<6ETV-j}8UW4R{FtkDBDQz}c!KA^+b)<3Skt#Aj z%_<DgX3M#?K$>`evLLmHRYQ$a@eOW-D6=I5k~t-m0imEoejk$G<oy7#vCL}<*XFn; z;;c3ELqMp3mwN!UD9=O`mXpkbwaeXXTf5wuHk_^UP5IpNJ2aB9-ZqJFY#T`_<C~)7 z6kjJi7>Q%-aOU#P2a-8i4JD_{5R{ym3)=P(hkWk!geX#fk$j@>lX>QL7%KT|?=x|$ z{5vy@WkF!K8j_W%ZJ(RiAv-<?83PO}c~c_a`9`@@?@+$niti`)8iq<f(RU<wG6t*# z=>Z9Z^GxJCmoYf>R&WdyVvoHB5x)y86uHYBREy51%z-ajdJU5ID*m3C2_$5uU|a4r z0d_->I!POU*aR6NZC)3o+0$mpE7cAzba`GM<b=sP(y^@Kw>;Q;^W1^yArYH{l1|p9 z+WU}QGM~Z3lEgx}^^JLz92?2{^N6B!It3xQupm>FFSkkE*mfY)koQsl8+p2Nt}vb^ z$`g<xd;E$2Ew7UEvF8l6jcOlrp4YIE<XkwZ9+JO*Hi-B(s2nIaN)Y=U%V*b617<ci z2ubMTH$CC5<b4!G*6GQ9kk|H!dtb(FlDbw6<)he%r{zwk&0^nlM!=BYln8sCiPV&m z^M{CpFa}PTS9#5yn7vo-0m&|;Z+B`QX>$nU=3FH=T{}@jNDnqqkhgOya@M0elqhz2 zoZ@$X0qJ=UL6ImHB%WwFX^YjtZDqh-kK=Z$81whx>*S0dJgrGAv~bJGXGtLfmA_oM z6CdZkjdNCRA!#OyinQ6~j$XzhC&sOb%sXEp&4TorpplH*w2Osb;9uueU#N?a_Z<*f zS>)Uj4{agwn9M3FCghU|-Jy61%G@PdUT{7U$yXpuD?Om3t+l~K$={SJ+m|&33?pP3 zo3%V#f=T5W$DqP-&MUaG8U=xDBE2SqV_tKW;Cr5lXb6S9SxNDnzYpt5e76-Qne>3< zQSv_2B{hVAQXaRdON_FD$mmdKD4z?Jv(egAv3o0%H=n1KWV12`R6>;Bp(vY|yafyx ze?pY+vvslTDB_YUe74JK#Df@v^?G2E#=cQ%Lb!Ri>MxH0NX=gkBs1C@#T3NjOzMC8 z9lY*&L@)BPNe@UlpLdE2-bVfkAQCM{DOlup@BrprnOx2G<&g3$`74muP{w*TE)MB{ zC0b6UO7YZ_HdW3!>O_i_Mm0#;kuFp|fBDoTxufu1P%+xqMiDQgLkukMJJ(A6>pY_C zm2(-8*0+n#`{G6^-<0Bsc}Ke7Xy!K1#$~MWeMuC%QT-tANFZ|40}-DcIRQ!@9q8N= z!G&g>b*{*%X8GFCYqQphHuim>?Fk<V_FKs(Es8`%uB>Kls0-zkA-XO65QtB*e}dc8 za^4kW4R+rqA}+faWE_d)L!YtlgMu&biBt@doe#vm+>G8UuAiG`kk2^~n^lW3W$*BR zUfV>`#jo5D(&W9jkrhB@$XX=Y*PtxOo32$N>{R#^hDzh^oUIK4O}nf)#2qpQR-dUg zxZ$$9Y^Nh~no*NeB3)#5l+l6ze;{5d*om^{I=tw7nxP@gRpweBxfjHlh`LbjfK)S* z6R;Ee$TQ?t3g){ENY0kosN*TBm_C_(O}?D0GHo69bGAb|R&>i_K&r}o0-_WYUI5jz z#KH%W`$ET$lvhb7fk~dd9i@|uHC2o9sY&EePFfJLl|h6n)d_IR?`%}1f5{`dZMh0y z>tr8@`wrKA=#J@WAk$?C<wvE>mUkDPhMQX2)Exas)I8+7<}G)A#BWMj-!<=}Ai|LW zk<229r^n360+CFSAbXEr4n#6&-BRqli-Az8GLIXD8R8tJP0M^siYhV+`DvVH@_q2# z8bVf>{4_L#@x<s<x6J1@e~3iBLG~QE0}*`*h^QezgoAz~S>=PdRZkfMY68TauMZD& zvvG9L9p-2fZI<lw?&uCPCksS$p&%{a^zK75E1m8V*ZC#^B6k^(nt660;ytEdHVI<$ z=uC6XGk%yzJ1lL;T$B;=Q{*{1P#!7X^e`OO9Ipo<tE~J^$rcxFf5=&o+pJUOM&MYN zdJ-T^UwK-Ysvs>hVLG9LQ|2i5#=KJuq*%-60?B~$t-6!XC^Kb2u6$zw5kAF@wERtR zf@W42WJ{94$I$`Felgle3>oCe-hGfWGazmxTXr{+<1(F+8aZ+YB3vmD$&dkp#3YXa zb$RmF9;vaD=Nr{6e{=MugJgU3Mza5aEg6k}?i))X@4X|r5c7-&$&9EzE>b-N1W#Y? z!P2rno=bsv06|F7o}ae1Dl-wcn6yC~n{5h8EoGKYr({F+PTokiM{gwGvp}kx!60I7 z5Glxf3NATQ_IZQg%8KJg-OH?ZrcKSaP!Nfvkgyc-fBv26e=PZwnK**;iNVz@^SC;? zHrZj(waJb&k;6F85SD3<<@7s2MqZ~Ag`eepnDKel<D;&EpghUDKdLg>$w6d?rB0;1 zk1=67Io0LVoZ!3UllD#|ozHEM>=WuU>G|@SLmQQI3)4pOID@q88@!RMy@Z6aS{pi@ zXX1<+Jlj>&f0mRTiE5Df9!x>blGV8&RnED2>^Z7Po1T>bBpRAz##2GE=h-`xbSuxq zdEVqao#&c$1)Y>IvQANMWhNOkrIzE)xI@P5T>;s%w+Q60S+!kaSIvZ`@*E{1k^L@& zNRbA`oo^xWOSY>}Zi(f9<8;aUH8m1*oR%Koh0Hw|MAq!9>B~SwE4RTMl=ry>>C%Q0 zs2M?Wooxy<U9wl*$$au0MW1!$d+;(<u_?F#%1r`#eD-nmW!_}x!|N|MBaA0|Q<o15 z3_${l7nf2C3@U$t&2KubIr|N5q+Sllm9uw%G`VlD9M5^xuT%*(L@FJ1G+nZXpxhEm z2xOM8&AE{GD%@gXrGbc5b0ad=<eAG~dn2WiA!lZ5QBYm-BY}|bJbrBoZ;B^)8<DHz zHYBXcql3go_7Eg$)t+Yd!8RVUvNj^P_B2w>Nw1NL8<KyyQk@Dra&x5yU#_Lyw`t3{ zT0SHBG(#GjV{NoScaeL|jX$5k=)kfnvu|YYka;i{n~8JH(SM#M6*{0lOqsKABROsc zGK<Ye`TCsGf;LOee*hwxlRz$;qf5^mCQ`SXKV*YdDQf|@W!_yj^8CnGKv$hD6oN^s zJPqbZw!9l}*PtPXM266{WtLl~4x#v!(Y0m1W#6g7l;4+^3=Byg-zi!7*irC_Z-W|% zSxZVAs!-%NWe>?#=e~?$D}$H+3=EWi)Y6t-<9Nw-2sU&xq>De~SZseotGLKKfIr&v zye2`D%<ILx9>;Pm`P@EM<2iuHNqZx*=2o+nVRg!0g^xg36KDwKrguIziI$%a^DKaf zZ~c6f%tpmPy5t0;CTQjjc92|M48+#<ITZ1Sz)H(11)g^0{L1|#aF%y}>MCY`o)B${ z+|f}niXZl*21TBur{xpk_#@G2oYyCbzw)dC5sR3crr1??EyjGxoC_hF+ynFrc{NfA zF*8^@`F4lAhp>KatVwhyzr!_Do<_}kYa^M|I`s~P>j9Fvc@UgO@kW$~MQ{rNj{Hs0 z_Q|S8+b6#0GTQBf+JzFqMcXHTCm@=;CVe9!ovoTOS$qyeJaYxXLEe=?<jzDUYdPo8 z1Bz$6%;dX>vlm2W6)`xmEy=4W+%IbViG5Hg%q?$<8bbQUIhW^kA#-e=*JUw=7xnza zt9w@)l&?+7sT|iN4~NafRa7y(AY;i^K%r!6wl)e*lzd|Wky{(_H1RBdP+?T!!DTz; z#!s&1CGW76f(3akRE?L^M;A6w9jbVO$&(`EM$QxA^Hp-a<`Ko(5ieVv&4R2Dyz+dj z_*C=vsW3Y7+^M*3t<53xnks-2@dOdCR9%YrDbU<y?O2C}FBW87Pr2p5WRnPP<@}Ku zf<rT}1?pJ{Tk9fER<_oEFGzrStjRzmK5sO4CGSWV6t8UeUeKHJUIij{FE#kGPMpv( zQLwlxbN&e{>_+mQ2qG~(;*eRP-0!-5d2L@LB+hg6Mr3pd2<NYTAzG3*om<wi^oy{s zd~HIwh738=H%~(boX2_*PCacb#&Qw5li9mi4D5otBJ*u&z309utx|EZUj&+Dtk>PX z!n#XD;94(XcwN*KlrOg(;>Dqqj+~l}YFuZ0)0a393`T!V5tT{but)Pwq1wJqVo=$8 zsVph+pGFuXuPoGSvcI8T%ekBAfn>Y55%FJ>+)=zMAmRybB<Ra`&9<G=w_7NYtr~<9 zV!u%VPx$ejyIHn-A-l`n`KFrZy|+U{v8R#qBd&U~PKq}Iim|LYh_^Yz8HVK{aoRqX zDbHRMZxVl(xfO4D1yh+$_`Q9q;-N*oCVVjvS@p2rWcI>#5w8>kku%S#4nsx8V6Ae; z=w$KFb`?5X@z4@Tx6#?m>Lk<AZ(h)U{PorIr?;;^{qsM)fA#+9<)?pt{_<b_!_O~Y zy?^!Br+43cU7y~6_x$$ht3UHE?s@h8)pyT-DQ|y&{(^t^=7$f@Z~iCp?JwVb0sr); z-+)i=pWeOe&rjcf0X|RO_pe^R{q*sA^TX%IzWejj^N)W#_xFGC9RK?I%@6<j-_QE~ z&Cf4yp8xmrhhIMa_G`aBKYjd{pI`ImFF%La^Y`by{rTnJ-oF3x_fNlk_wAQfKR-SH z?SFqjzx@3A|NZs(e&9d;F+9J%dim+i`#1Oa{M*ydKYsP=Z)5bs^Pl>E-2e2~SKq&T z{`UL(-~9RM<Hxt3|H*eh4&QwJ?(L61y$oN|;)VZv{q+2o&;Rq?kK^yy_!;B>ZtU~_ zJbiz^8UOnC|G59bZ~w`^`u#ut_}ld5Z_}505)8CHe)^BT{QBzkoA2K;S-<_;`|m!y z<E1~Zfq(ezwcfq`^z!YSk5A7}FCU)2VE^m$lX=pcmlwYGr+@x00RWfrzX}w$fD;Vq z69v=5s22IRZYK;S0e``6+b|5h57<8#zBfu7C(Qyz#gJm?VOs;lZO@uaC&FY&kkp{r z*N=)D$Jut8Pvj&0^z=x<-CL`(1Nxw>S>=<_IM2{XTPw3$<xka@n?;_5C`>K1HMq); z81g&*@dIqUb?BqQkP(Fmt9&1$TQU~p9$OJcR5ny;tZzl6)PL`oZ5k!<-pbb&O=QJ* zJZJb8(bQPqxSlZY7?+3mzofO5Nnd!bj*bL#sIXmKSx}Q#6b=bnk{=QX2EtOnf*@i7 z4W@%-Q6MoSfN23mFzhbTAc}&vAi=VPqJlQSr3DovHK1&U%>fZo*%cH8M5AaUs2H$V zb`8>>whvD4%b7FheBYdh^PRa5cg~Fu_8NOGGIhNg!#_1=8$iQw%ZcARa(&o#a|nLB zE{c-nTtiMXR4Uut`%X&{!`3yUSW2{&%~HkgyF_X@O55!lNuI%Z{;TJ?v$T<Qdvk0& z1yV0H{s=Pq0df4=&iCD2Z5iv60yEU}YUSt}^18F3lQ$24Y_sW5(AH0>jj&3N_$E&? z-lVjV5iZ5d+EH!#?|<NdR_?$D`?4^nskQf#GgEpx0+aEfXhKil;IOqMs2T5C9WdMO zTTgaRzugc~!SYj-gCCWh>IueWhbyxMe)o;OFlh==2}gQ3lir>-@fQ2=^ZQh?riMzw zs}m&szV~LV&J}2Tm2`oZH`;eoQ!8=$vLacTCf?O|XQD#v7)p!eq;0I!9d=Ss$2C&4 zq@&7X<mH12L6;Igk;P_-??S)2lw0a}Qu5p8s5*mX!pl}Q1Y%_ch2XGJ>IOj7ia~<{ zHl*7qwu2Vc)Z<Qyhe5GDv_sI6I`FJsbj90Wk()uguN*1f`RItgCtpiWGKu=rO?aW{ zrJq7{?v{CA7tXch_{2?V##U)bide6~e{cBo{1b(%h53z%#ptuq;r6D=*OIF<!fdT~ zsqudqiy7BTB3mw!lBV|8QhJ?aOYq~V{K>edyR!&~<QYWZzvEEhtcgD-pzuT|)yT5| zmv+LD)wkT)|DZi0_QEU6%O;sqiPmF}v*>IBlg0CE*Pr`v#is0$ORJnBUC6n?2r2qd zJzn)rBu#xevxpW~b(;_M;;PF8|B2w~Mu@RSqfXnFlhkPA2~pJq;=-d?uErWV2VZ16 znm)$IHt@XrZ+&XvH6~;!xWCSfO(gpL%$@38`#1&H5Jz3BS!DI%*q(}z{%)lz+mETw zaW2j3m7STiJa<i{vVT}Vm?zv9HuPe^gL%0}qg+YaWjPG5mfFd=>X4asx`RH>PJjQ9 zva51d5{zU!o7W2TIi&QgO&-AujJN>fXB(9Dl;BeX5XM#(5gutV@)Lb}&*IFMkR?Vw zaUp(k!f2sc{stb~$7S;`5}M8U!k9A!VKobqF3=EofJ@z=V|DLL{{HJJE>V&_yLmXw zhD+{Vg9>9&VSVF$4{rG{F(pX1j)Or#4v#*nLbsm3{+#zw=WRq(q4Exe!YC!aJ-+#2 zZKJMiY`r0&mr~Ar9ceF&>RH-WJymSfa$(TYuE1)Zj1#@Ji@jYaUozt*MfFOY#*bQ# z?f+pqK0v-*b&z78qq7`a^qq`nOvtusUF1!wA1P}c4f~`4+UU>|jA5i&y%2{+SY-k+ z1KN(7BcVZ?9@-G-Y=i8OY#wml248ry4}+vtTbc@5VT%gPzyOP63=xo+aMs-xKxe{H z?{1LEggj8~dRUNy#u|dL)o8N;z<a|O)MhN`cf=CG0dL3-HROf`#WdKfT=nYcSRio4 zl7Ti0MlfT66AMOYCSbup44jkAg7Bu=L-2~{iwJ}$9)-|De14iwf+iN^ikvb5ODxC@ zNwWmbY{>H8*$Tqg&>G}01thQ`7o-Li)UhE4(^Y9HV2(gofJUElA+VeBeIPF+n+6y@ zkUP@hYasN2IjfvOmk+cB73Kng6)I!`tbO5{{%Ks80$$Mbznado!MDE9mzwaufH3{v D8C`eC delta 629383 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	s_dR)?#?VM@AEI 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ℑjNH0}m9|xA!(K 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"bDNNBB@pr0O|l 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 -- GitLab