From 02b073f51711cc1a0302788546586862ebf59e4b Mon Sep 17 00:00:00 2001 From: Blair Cooper Date: Fri, 21 Jul 2023 12:14:41 -0700 Subject: [PATCH 01/17] Remove repeat_instrument param from redcap_file_download_oneshot fixes: 506 The REDCap does not have a repeat_instrument parameter on the file/export API. The test that was present in the code would prevent the repeat_instance parameter for having any effect unless the repeat_instrument parameter was also set. --- R/redcap-file-download-oneshot.R | 12 +----------- man/redcap_file_download_oneshot.Rd | 5 ----- 2 files changed, 1 insertion(+), 16 deletions(-) diff --git a/R/redcap-file-download-oneshot.R b/R/redcap-file-download-oneshot.R index 77b58d42..253dc3c9 100644 --- a/R/redcap-file-download-oneshot.R +++ b/R/redcap-file-download-oneshot.R @@ -26,9 +26,6 @@ #' Required #' @param event The name of the event where the file is saved in REDCap. #' Optional -#' @param repeat_instrument The name of the instrument that is repeating -#' for a given event. -#' Optional #' @param repeat_instance (only for projects with repeating instruments/events) #' The repeat instance number of the repeating event (if longitudinal) or the #' repeating instrument (if classic or longitudinal). Default value is '1'. @@ -127,7 +124,6 @@ redcap_file_download_oneshot <- function( record, field, event = "", - repeat_instrument = NULL, repeat_instance = NULL, verbose = TRUE, config_options = NULL, @@ -161,13 +157,7 @@ redcap_file_download_oneshot <- function( if (0L < nchar(event)) post_body$event <- event - if (!is.null(repeat_instrument)) { - if (is.null(repeat_instance)) { - stop("You must specify repeat_instance when specified repeat_instrument") - } - post_body$repeat_instrument <- repeat_instrument - post_body$repeat_instance <- repeat_instance - } + if (!is.null(repeat_instance)) post_body$repeat_instance <- repeat_instance # This is the first of two important lines in the function. # It retrieves the information from the server and stores it in RAM. diff --git a/man/redcap_file_download_oneshot.Rd b/man/redcap_file_download_oneshot.Rd index 9b82aae0..ffa80e8d 100644 --- a/man/redcap_file_download_oneshot.Rd +++ b/man/redcap_file_download_oneshot.Rd @@ -14,7 +14,6 @@ redcap_file_download_oneshot( record, field, event = "", - repeat_instrument = NULL, repeat_instance = NULL, verbose = TRUE, config_options = NULL, @@ -49,10 +48,6 @@ Required} \item{event}{The name of the event where the file is saved in REDCap. Optional} -\item{repeat_instrument}{The name of the instrument that is repeating -for a given event. -Optional} - \item{repeat_instance}{(only for projects with repeating instruments/events) The repeat instance number of the repeating event (if longitudinal) or the repeating instrument (if classic or longitudinal). Default value is '1'. From 5606071287167b4861f63a2eabe5ed710f977588 Mon Sep 17 00:00:00 2001 From: Will Beasley Date: Thu, 5 Sep 2024 12:35:27 -0500 Subject: [PATCH 02/17] bump version --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 7f1986cc..3ac60478 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -6,7 +6,7 @@ Description: Encapsulates functions to streamline calls from R to the REDCap University. The Application Programming Interface (API) offers an avenue to access and modify data programmatically, improving the capacity for literate and reproducible programming. -Version: 1.1.9005 +Version: 1.1.9006 Authors@R: c(person("Will", "Beasley", role = c("aut", "cre"), email = "wibeasley@hotmail.com", comment = c(ORCID = "0000-0002-5613-5006")), person("David", "Bard", role = "ctb", comment = c(ORCID = "0000-0002-3922-8489")), From 361ea2ff64e85ecbbbe06bf17bea90467ecf4e2e Mon Sep 17 00:00:00 2001 From: Will Beasley Date: Thu, 5 Sep 2024 16:16:36 -0500 Subject: [PATCH 03/17] prep for image downloads ref #530 --- inst/test-data/vignette-repeating/data.csv | 4 +- inst/test-data/vignette-repeating/project.xml | 284 ++++++++++++++++++ 2 files changed, 286 insertions(+), 2 deletions(-) create mode 100644 inst/test-data/vignette-repeating/project.xml diff --git a/inst/test-data/vignette-repeating/data.csv b/inst/test-data/vignette-repeating/data.csv index 8e478eb8..7dd4750f 100644 --- a/inst/test-data/vignette-repeating/data.csv +++ b/inst/test-data/vignette-repeating/data.csv @@ -1,10 +1,10 @@ -record_id,redcap_repeat_instrument,redcap_repeat_instance,height,weight,bmi,demographics_complete,sbp,dbp,blood_pressure_complete,lab,conc,laboratory_complete +record_id,redcap_repeat_instrument,redcap_repeat_instance,height,weight,bmi,intake_complete,sbp,dbp,blood_pressure_complete,lab,conc,laboratory_complete 1,,,1.0,11.0,111.0,2,,,,,, 1,blood_pressure,1,,,,,1.1,11.1,2,,, 1,blood_pressure,2,,,,,1.2,11.2,2,,, 1,blood_pressure,3,,,,,1.3,11.3,2,,, 1,laboratory,1,,,,,,,,aa1,"1.1 ppm",2 -1,laboratory,2,,,,,,,,aa2,"11.2 ppm",2 +1,laboratory,2,,,,,,,,aa2,"1.2 ppm",2 2,,,2.0,22.0,222.0,2,,,,,, 2,blood_pressure,1,,,,,2.1,22.1,2,,, 2,blood_pressure,2,,,,,2.2,22.2,2,,, diff --git a/inst/test-data/vignette-repeating/project.xml b/inst/test-data/vignette-repeating/project.xml new file mode 100644 index 00000000..3fb17d78 --- /dev/null +++ b/inst/test-data/vignette-repeating/project.xml @@ -0,0 +1,284 @@ + + + + + REDCapR Vignette: Reading Repeating Measures + This file contains the metadata, events, and data for REDCap project "REDCapR Vignette: Reading Repeating Measures". + REDCapR Vignette: Reading Repeating Measures + 1 + [height]; [weight]; [bmi] + + 0 + 0 + 0 + 0 + + 1 + 0 + 0 + 1 + + 0 + 3 + + https://github.com/OuhscBbmc/REDCapR/blob/main/vignettes/longitudinal-and-repeating.Rmd + + 0 + REDCap Secure Messaging + ALL + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Record ID + + + patient height + + 1 + The value you provided is outside the suggested range (1 - 100). This value is admissible, but you may wish to double check it. + + + 100 + The value you provided is outside the suggested range (1 - 100). This value is admissible, but you may wish to double check it. + + + + patient weight + + 1 + The value you provided is outside the suggested range (1 - 300). This value is admissible, but you may wish to double check it. + + + 300 + The value you provided is outside the suggested range (1 - 300). This value is admissible, but you may wish to double check it. + + + + patient bmi + + 0 + The value you provided is outside the suggested range (0 - 300). This value is admissible, but you may wish to double check it. + + + 300 + The value you provided is outside the suggested range (0 - 300). This value is admissible, but you may wish to double check it. + + + + Complete? + + + + systolic blood pressure + + 1 + The value you provided is outside the suggested range (1 - 300). This value is admissible, but you may wish to double check it. + + + 300 + The value you provided is outside the suggested range (1 - 300). This value is admissible, but you may wish to double check it. + + + + diastolic blood pressure + + 1 + The value you provided is outside the suggested range (1 - 300). This value is admissible, but you may wish to double check it. + + + 300 + The value you provided is outside the suggested range (1 - 300). This value is admissible, but you may wish to double check it. + + + + Complete? + + + + lab value + + + concentration + + + Complete? + + + + Incomplete + Unverified + Complete + + + Incomplete + Unverified + Complete + + + Incomplete + Unverified + Complete + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 1e8a47e559d44ce73bf5612a2a36ef5de6057cc5 Mon Sep 17 00:00:00 2001 From: Will Beasley Date: Thu, 5 Sep 2024 16:25:26 -0500 Subject: [PATCH 04/17] add empty image ref #530 --- .../read-batch-plumbing/repeated.R | 19 +++++++++++-------- tests/testthat/test-read-batch-plumbing.R | 2 +- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/inst/test-data/specific-redcapr/read-batch-plumbing/repeated.R b/inst/test-data/specific-redcapr/read-batch-plumbing/repeated.R index 0293332e..5b2baefa 100644 --- a/inst/test-data/specific-redcapr/read-batch-plumbing/repeated.R +++ b/inst/test-data/specific-redcapr/read-batch-plumbing/repeated.R @@ -6,13 +6,16 @@ structure(list(record_id = c(1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 1, 2), height = c(1, NA, NA, NA, NA, NA, 2, NA, NA, NA, NA, NA ), weight = c(11, NA, NA, NA, NA, NA, 22, NA, NA, NA, NA, NA), bmi = c(111, NA, NA, NA, NA, NA, 222, NA, NA, NA, NA, NA), - demographics_complete = c(2, NA, NA, NA, NA, NA, 2, NA, NA, - NA, NA, NA), sbp = c(NA, 1.1, 1.2, 1.3, NA, NA, NA, 2.1, - 2.2, 2.3, NA, NA), dbp = c(NA, 11.1, 11.2, 11.3, NA, NA, - NA, 22.1, 22.2, 22.3, NA, NA), blood_pressure_complete = c(NA, - 2, 2, 2, NA, NA, NA, 2, 2, 2, NA, NA), lab = c(NA, NA, NA, - NA, "aa1", "aa2", NA, NA, NA, NA, "bb1", "bb2"), conc = c(NA, + intake_complete = c(2, NA, NA, NA, NA, NA, 2, NA, NA, NA, + NA, NA), sbp = c(NA, 1.1, 1.2, 1.3, NA, NA, NA, 2.1, 2.2, + 2.3, NA, NA), dbp = c(NA, 11.1, 11.2, 11.3, NA, NA, NA, 22.1, + 22.2, 22.3, NA, NA), blood_pressure_complete = c(NA, 2, 2, + 2, NA, NA, NA, 2, 2, 2, NA, NA), lab = c(NA, NA, NA, NA, + "aa1", "aa2", NA, NA, NA, NA, "bb1", "bb2"), conc = c(NA, NA, NA, NA, "1.1 ppm", "1.2 ppm", NA, NA, NA, NA, "2.1 ppm", "2.2 ppm"), laboratory_complete = c(NA, NA, NA, NA, 2, 2, - NA, NA, NA, NA, 2, 2)), row.names = c(NA, -12L), class = c("spec_tbl_df", -"tbl_df", "tbl", "data.frame")) + NA, NA, NA, NA, 2, 2), image_profile = c(NA, NA, NA, NA, + NA, NA, NA, NA, NA, NA, NA, NA), image_complete = c(NA, NA, + NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)), row.names = c(NA, +-12L), class = c("spec_tbl_df", "tbl_df", "tbl", "data.frame" +)) diff --git a/tests/testthat/test-read-batch-plumbing.R b/tests/testthat/test-read-batch-plumbing.R index b29496b5..0007b1ef 100644 --- a/tests/testthat/test-read-batch-plumbing.R +++ b/tests/testthat/test-read-batch-plumbing.R @@ -65,7 +65,7 @@ test_that("repeated", { path_expected <- "test-data/specific-redcapr/read-batch-plumbing/repeated.R" # desired_forms <- c("visit_observed_behavior") # Doesn't include the initial "demographics" form. desired_forms <- c("blood_pressure", "laboratory") # Doesn't include the initial "demographics" form. - expected_outcome_message <- "\\d+ records and 13 columns were read from REDCap in \\d+(\\.\\d+\\W|\\W)seconds\\." + expected_outcome_message <- "\\d+ records and 15 columns were read from REDCap in \\d+(\\.\\d+\\W|\\W)seconds\\." returned_object <- redcap_read( From 51881048d0ab03cdb82d9b6e60e41e975e3ae28c Mon Sep 17 00:00:00 2001 From: Will Beasley Date: Thu, 5 Sep 2024 16:29:00 -0500 Subject: [PATCH 05/17] add images ref #530 --- .../read-batch-plumbing/repeated.R | 46 ++++++++++--------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/inst/test-data/specific-redcapr/read-batch-plumbing/repeated.R b/inst/test-data/specific-redcapr/read-batch-plumbing/repeated.R index 5b2baefa..15c5d315 100644 --- a/inst/test-data/specific-redcapr/read-batch-plumbing/repeated.R +++ b/inst/test-data/specific-redcapr/read-batch-plumbing/repeated.R @@ -1,21 +1,25 @@ -structure(list(record_id = c(1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, -2), redcap_repeat_instrument = c(NA, "blood_pressure", "blood_pressure", -"blood_pressure", "laboratory", "laboratory", NA, "blood_pressure", -"blood_pressure", "blood_pressure", "laboratory", "laboratory" -), redcap_repeat_instance = c(NA, 1, 2, 3, 1, 2, NA, 1, 2, 3, -1, 2), height = c(1, NA, NA, NA, NA, NA, 2, NA, NA, NA, NA, NA -), weight = c(11, NA, NA, NA, NA, NA, 22, NA, NA, NA, NA, NA), - bmi = c(111, NA, NA, NA, NA, NA, 222, NA, NA, NA, NA, NA), - intake_complete = c(2, NA, NA, NA, NA, NA, 2, NA, NA, NA, - NA, NA), sbp = c(NA, 1.1, 1.2, 1.3, NA, NA, NA, 2.1, 2.2, - 2.3, NA, NA), dbp = c(NA, 11.1, 11.2, 11.3, NA, NA, NA, 22.1, - 22.2, 22.3, NA, NA), blood_pressure_complete = c(NA, 2, 2, - 2, NA, NA, NA, 2, 2, 2, NA, NA), lab = c(NA, NA, NA, NA, - "aa1", "aa2", NA, NA, NA, NA, "bb1", "bb2"), conc = c(NA, - NA, NA, NA, "1.1 ppm", "1.2 ppm", NA, NA, NA, NA, "2.1 ppm", - "2.2 ppm"), laboratory_complete = c(NA, NA, NA, NA, 2, 2, - NA, NA, NA, NA, 2, 2), image_profile = c(NA, NA, NA, NA, - NA, NA, NA, NA, NA, NA, NA, NA), image_complete = c(NA, NA, - NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)), row.names = c(NA, --12L), class = c("spec_tbl_df", "tbl_df", "tbl", "data.frame" -)) +structure(list(record_id = c(1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, +2, 2, 2, 2, 2, 2), redcap_repeat_instrument = c(NA, "blood_pressure", +"blood_pressure", "blood_pressure", "laboratory", "laboratory", +"image", "image", NA, "blood_pressure", "blood_pressure", "blood_pressure", +"laboratory", "laboratory", "image", "image", "image"), redcap_repeat_instance = c(NA, +1, 2, 3, 1, 2, 1, 2, NA, 1, 2, 3, 1, 2, 1, 2, 3), height = c(1, +NA, NA, NA, NA, NA, NA, NA, 2, NA, NA, NA, NA, NA, NA, NA, NA +), weight = c(11, NA, NA, NA, NA, NA, NA, NA, 22, NA, NA, NA, +NA, NA, NA, NA, NA), bmi = c(111, NA, NA, NA, NA, NA, NA, NA, +222, NA, NA, NA, NA, NA, NA, NA, NA), intake_complete = c(2, +NA, NA, NA, NA, NA, NA, NA, 2, NA, NA, NA, NA, NA, NA, NA, NA +), sbp = c(NA, 1.1, 1.2, 1.3, NA, NA, NA, NA, NA, 2.1, 2.2, 2.3, +NA, NA, NA, NA, NA), dbp = c(NA, 11.1, 11.2, 11.3, NA, NA, NA, +NA, NA, 22.1, 22.2, 22.3, NA, NA, NA, NA, NA), blood_pressure_complete = c(NA, +2, 2, 2, NA, NA, NA, NA, NA, 2, 2, 2, NA, NA, NA, NA, NA), lab = c(NA, +NA, NA, NA, "aa1", "aa2", NA, NA, NA, NA, NA, NA, "bb1", "bb2", +NA, NA, NA), conc = c(NA, NA, NA, NA, "1.1 ppm", "1.2 ppm", NA, +NA, NA, NA, NA, NA, "2.1 ppm", "2.2 ppm", NA, NA, NA), laboratory_complete = c(NA, +NA, NA, NA, 2, 2, NA, NA, NA, NA, NA, NA, 2, 2, NA, NA, NA), + image_profile = c(NA, NA, NA, NA, NA, NA, "levon-and-barry.jpg", + "mugshot-1.jpg", NA, NA, NA, NA, NA, NA, "mugshot-2.jpg", + "mugshot-3.jpg", "mugshot-4.jpg"), image_complete = c(NA, + NA, NA, NA, NA, NA, 2, 0, NA, NA, NA, NA, NA, NA, 2, 1, 0 + )), row.names = c(NA, -17L), class = c("spec_tbl_df", "tbl_df", +"tbl", "data.frame")) From 311897d7a643973c26a0c5c9f986de4ec633f906 Mon Sep 17 00:00:00 2001 From: Will Beasley Date: Thu, 5 Sep 2024 16:48:44 -0500 Subject: [PATCH 06/17] test image of first record ref #530 --- R/redcap-file-download-oneshot.R | 7 ++-- levon-and-barry.jpg | Bin 0 -> 59265 bytes tests/testthat/test-file-oneshot.R | 52 +++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 levon-and-barry.jpg diff --git a/R/redcap-file-download-oneshot.R b/R/redcap-file-download-oneshot.R index 77b58d42..5a5e08af 100644 --- a/R/redcap-file-download-oneshot.R +++ b/R/redcap-file-download-oneshot.R @@ -61,9 +61,10 @@ #' the name stored in REDCap is used (which is the default). #' #' @details -#' Currently, the function doesn't modify any variable types to conform to -#' REDCap's supported variables. See [validate_for_write()] for a helper -#' function that checks for some common important conflicts. +#' As of REDCap 14.6.4, for files in a repeating instrument, +#' you can't specify which repeating instance to download. +#' It always returns the file of the first instance +#' (within the record/patient). #' #' The function `redcap_download_file_oneshot()` is soft-deprecated #' as of REDCapR 1.2.0. diff --git a/levon-and-barry.jpg b/levon-and-barry.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c4daa24462b27c29248277810a8a9774d1a00bea GIT binary patch literal 59265 zcma%?Wl$W^v-THvcXxs(xVuAech|*Tf&_xIz(Vlg?(P=c-92cqT_i~GH~(92-COtD z?Ww7n>aLm7b*5@g&-3f^zV`kLfUP8_C0FI2e70@351Aqto#|e0c z0x%`5T`g?@)<6GwVBR+Y-vBWGcZ2;OgZpp$|F^@!!2FB;JO4ZIf4zAB3BW-HT){}d z!QcR3abVzZVBUuSP5<(Phx^aN|7H4Lh6s;NaEA@-OA{pXyl()|;r=Ct1BU|;2OKaO$$fUXs82$cZoSn;Skkt~Am*Z~aTH=> zZ>e~+iYe@u_$}e(P~td@2VsoGk9{SOWbA`3c@y!z6}DZMpdn6#3|Sp@bvI|Se~q80 zRCD27R(c00ao!pNON$D5L=H@Gm`;nxZ;f22TR)B56n}Un3(HE{iELi!lbmm()A3u% zq%^HtR559n6WV8NYn9hd^^IP2s+Puv>+#6~*~{hl5htY^2ri*<3z9ez4Ape|wiXZK zB(@g|(-JRN!eMBK1yxn7mIr_vC06zSX5GtWYnQRzyRE-Y4(J`?E5hasmhkXZ0#Nvg6RjdL;Mn?ni7e_~32{fUW54T!L5!~K#igSNWaBK3xc41;9 zoDyhOp7>f`(0=l4lgtQJ5I-BS1mvlm6!1E}h389ddn>MpQ7PGnkT15~`sY1r{?Hk) zI`-oz20BMpY)A5%EZ2}$S4tuo-XcAqSa%+YAsxxv*(^4D%N4!KziF?68}O_R3SHa% z$K58bB9xYD3*{hy)WT4tmjIfjDPnRH7wJ=DUz-@NC&#{H8u4u<=&vqi-dMeF6Y+wH*1H)x?MFk8>9 zt5s{fy@7DMl&>Uq2|4*&W6so6mm>^g9^NXKY&Pdhlo0dh0;#wabWS1?rgDAMdemwO zP1%rTy5-=~)VkG*BVZ)UStw9>c^8Cl@wVCL#$g*nK4HkhlzF%k8di*0!z`^ehci@w zHhB44))Nz>hwp~330@wrl2@h?j*Kl?8&GQuE4S?+g>`f0Pl;`5FViOQS98m;AM;~( zy>FTGaJD1H&pFhb(9p^t-n#4aX-|ERUl;@+cr#RM+_Wxge5qXqX@DUCOteXM=o@8O zEuZ?)I{^D}DVv*#Ti z$^;)-kV{I-G$Ep^R;v)*o~me1Ee!ll4n=c*T85^};}6%`pKk|l23*%Bib(&JKEOMG zpM8W&`~9n{=Xz9lcF-ZTd0^T#@sPMHaQNpi*r1WyWYY1E1W79GO4z8NIU?qxRs>XA++3@&>E#0PdC65OtMjI2>?mBif-> z;POm*!+rbC!O3yL_{#O{olfD)+l&7@faD9-i~F0_aeH5~OH=o7w=+d6dBXp)g&$HM7^jj}_3w+Z>^>*Z?H_SGtLYcfc6W05%1_ zMSb`ituG_*&+Uu0!nJ{mi7`ZP4fsRwM) zNv6M*pzJk}C_yEFUNd)_<8myWK%_#)VI)U=-PeknePFZ8SDNh|a7*ujxsF z3#?O-cm;eo)b=wZtFPH`URKeqbp6LJ<`5{#_;2942ce%CJ#@!D9&S% zixvp|(=XU8d~l4n1g-6MYg5rDr6d$xjKaJcQ7lCy+{+uto;2(o-NB%=9Y#yG!Hg9y z-;w!5O^u!$!*{BD3Vu9k)Ml1Nj4z2K@&|iT9l)x|7@sL=Hi;%S^GaO9yaILR66W*s zr9&TW`=Pn5pOqL^P00ls`+8gy@Ua)aK9xx7&}()AAqzErn!iNOoTM`A>jdqRdP;hi zblS9@d7KTcKX?y)r`DhgjrSCkceJBR5(Eu+I=VJ~{eMu3XK?T3X<%mP~EM!bubo(s3M zj;d(2RONed=MY;eOIc48QpPg~eHfg^>qxlLVs&Z7#q5f}#ce=>)@cm2p4*pO9sfu5T5@meu+7 zw`@$Jyk#;%o}u;k2hwb~=zl+gur|jTQZm^OC6!h;Yui2_wjK4Y zt(s72NepSlKN54W({;5sTYGMA=okO&gzuesplCFPckcmLkkUT{V36;@8*T=wS`Jotqdn zK!ai7wDe6(oUSsFgPfmVV5!SkewD_wAINprl1rYV6pq@85L3Yg-7QE|N^=p4-R3`> z(bReOD`mg(r6RuZY`b$_=8Iz-Emg^?-_~HLgS(`amfmtyD8j2*<0(rrmUaV}4(_4* z5+yi%4XaPHcOkQSB_T>$n`KthX@50t!XMw{l6LUmm!S$IGt2hr{_35c3@FA{-9*8n{Ry|Sk|{pOapx6fkyplYXHs#T82FtE)hm%{ zGVy{1K0^}Qqe@#nm`xw2MGu0!~7QK{~o52xgF`*JH-eD(_^SQJp zlYC7;$^nOEXt?)h9zxtN7!2QqU7#KDOQG=~S){qz&XwMl)e_|piBsR+4jMNKZRzlD zytZ7-pz?@f;X@R&bSEfko^-*P1Yz<@ob#jh?bIFlw}N#&ylbLN+rM@Khocy&StD#| zf|g+T#&F@H^4JE}`~dA#78HWJyHoaHaA(G(bv@-Kat&jGugovH_0YGL7G)}q8j=hqTiwp-}`UQC(9d%Fbr(F!8uM@5b_T5QdnimrbQpQ ziMf$?!1~oYz=Ht)+#B6W65JaiDczSU=6E0`@xuKlSTE{xn_qW=s9Uo2QNpXs%Kpy% zig31Y^wB0xYED=TUnoD7)k@LdI{V;6({Y8qa|lVO9it*B zX=4`BSk)dM20`W)-Sv?7p*8$Vm160?1f%Sqy%>7TUZ~uBqt-GVaR)E9hqYJ`J(%2_614S zO7qudDwO~`2JNOjA7p4%iwKvPk$ zX~deDli8*54w&3>j6y6^0-nwdX>?B49^sF&@Iuxft7HE-v>fsx#v<=P)vh02h441? zFURHC#HzFa6cuW^et%s&K5Yyrm2{VvC@Zi`^~0f1dFrgIwO}bFZ-sLXQl%Q4@FXi! zf55^d_gl{BcYj7xptFuKl$L;w8CM~o>!4wXNx$Z3Jc#X`@H9kuT;J5y_^8g~Sz&oY zM$gUaES}NAte|YFKVM)HS_9nF?2=DdM;p9rVV)6Q&bqy0}0fgUFKv z1Z2HDLeP&4%q9-2QEpibzaDrcpE@~ol|Q+1dO+9*VWLh=lw=`mq_I=%?#O$%=^@+V_zcHhtW zXcs{<=)q0A_D3iZ2$+@4Iy^#IS(w#Upjtq)QOHIkqWtlZqI;tvL(h=rXQ@vWpmaZX z=@TGj>Oy3W|AnMgu+H2H&O|n-6Jurwf$g)bl{GIqKRZG6-&aMkoR8_;h;}Sj1#MN= z1L^CVBUb2)i0<4pvhhypjuV?PkIAZ8l$|RAI4w(`Yl>Ihrky>=n+ujx!TU0$*DA<7 z_*7HDIoQ7u0Bu6Y+Aq#B?aCcxoi<#WrkmXn-)WdC;gAR9+uZBgY68S7$o$+oieyuD z)=*zV+NVn55YYLch=M-qi78>#vZB6P`HH+ryqKE@n#rGT;w%O-UBH42P9JT~Yg20qUfU&{kKaf~1X8I1?tr;v$~ z@H6ZRd>hKp3g=D?{3WldtW|zaqV0!r1pu623E}SRb56I`7xna1 zwQwc!wz;5AM6Mha=fKPd$pE$6yjYvd6;YOFQ$rJTTP`aJOSxCtHtYxIpTfwN%GT1f z9TFOU0Gq+(Y#5XD(a}-(Oy0YWA*P_~grGdrp1U>I?psUZ$LO~`XS)fzXJ*Fw9z$e42#p>7 zTVA>u1JrDir+((|cDNQ(&l18bp{l^jp!AEU7OQ9Bv~%HFNG8kR8)`^=BA@^4jL17+ zsMl}!k##hf?dOeg9f_%4)~|MB>c0L#AkDz^NC$_lKy5*aKt;0}Ma=?(G{GrJNLoWl z-JDFx?lIrs%jfGV#lA#7L?IPL-DVErz#Q*#x|fzWL8}n-cDrnGL=mHy!%TF&xEGVC zo1^NT!OJHjUgf`v*l$VCvstpYaTVQeQ z8kVp%9*UOKOGCe$0^EMT8Q49%7#3ho_9h&|_jK%ZiW2yI9(r|Xxpj%!TtKMMQ(CV-sD60cS^UUpT zlr$& z1SP<7+4B>RvpF!-BP^T6U;o_3j8ytt8}7s<&&oWT5S+Zz}Y&d%o?udhNZeDUG*=9x56wb+p`-7;N$4DAq;Vb}%bHg-|&sGfAh^1ib~avRA!1 zuqrjQiO6H!Xe9C+1(OWA8!4+&j5d&n>?mf~)HbgAlQjBJgrOQp+!UvsG;y8MhLlM! zN8RsDP2E>@yq@}m@GOnm;XhElvV5qYvTAgXaji4|DV6dK=uh93gQKj0Vbun?&j428 zsU~MDVK7~J74_z5{_&w zYRV(uX0}VINz+sYH+pll#Z@Zdu_ymf8P3bUq)1lVJ63fFztI-i({b4l*tSB(`nozk zho-BClyX(w*3B)J6i0r}>&E{>#Zn(@&qy7wx;Y;{mX2`Y^6y8JWAH7UD=$eMLpLiZ zBwdlu0%r;p<5X3VoWtHM=#1{zk0~B6j>)DyjpE`GwJ{X&*MT=oWq8GtcLRj<g9vloc;f-`w$VYX8a6|H_#;+Co=#I*T(k}lew8CsWd zMhrKpc>uz)RA}q6RDe4~FiHJN8}7j3Wr!i#aTg+LBx zvPgZVACtH?{WT;#DZU%W^J&KOxJ@(3qp<@O=`^J}!?GY8kV(E^-I=XKEg&dhaCv58MY(q)tQnW*nz0@CDy1p_)3SmkyF6yY1>H_ft2 zYt_niEwo|0o*ZsZV0!blJfY=;g!n`R;WV2>2){rE*zAscy>t0+ouUd>W$ysf=nvC;5nxfj0-qNB}02|#W%n#*t zAT(xAxp{d$UpaeAy=_;@TjT;{UFo7Px{99@iUR_}SL4V@L5?}+H)XWoh6Yodms3;m z)Ei2oXZsg_Yn(lrdu1L@Li|3%L8p*M7;nWfP^=g~I(zGTkS@ispq;xF)L-2U&0bgte`o3wLPnB`t(qeh4YwZ@+s-vJjsI+1mz zugWIbRa|cU0vO8%?*Mj@2rB-o%O4%HV7r;)F9W?F_sMa^G%}7J3^p%HX#=Z}8+G+G zXIXiN2v@OVV4D-r90{`$3*G?~ix^@B)fT$puRdAhzKYV#Pz&T|XOqGfoiuAcB3z@b zX*7Co5G8|Mhp;0IHM~;bYF%mblU?D^ilf3;)KBXg@hQ&K-A1L!U&ol1Xj?X7dGL9J z?ubMm=nI#F^{@d%h3EvJrBZ`}Fu7=%5r0rUOLSp=ljiqDm4F`@TA6Hot43tG0kRd| z-<&?A9FWJ-+oEfbtsWHCZ%T>Yo<<^Xf%xH^Pj)v$KSF*Rc-)XM=(KSrGwbMpj87!D zh9WkV>|s_b$T1DM3o%V1d#|5KtaG9Fq0;D%;;t>k4#aw`{UsYeu^r0VBrp-y-IJ^! z5wg`uymDkU*QGDTnmkhrY-Q~mUjVccJoJr8g;9^U7C9q(2yT+BGgPPo4gF&L6zGX; zpI3GFZ4$l_S4o|7;TuLS#Rl=5XVS}xCq`gP{o34ahRMm&O_QjNbb2=3_(qZolb@6}}OLwR8p)v07qBk;Li5>_njS<63|7Lcv!>k~)k zRRy{6fSnwiU)qQ|XvjbRVe%w*c$SFVR#`U0#p($X-(1alDC`~A45X*#;L&C;X$sru zFKF}qPMF3b-Dg+TU^$ZbHZ62sEO!W3vCGm7nZu!;(yp7*&T&cO+}HG$OVCePp|LQq zimzPuw(KH75Je_9YjnrUPF6#AhSqcoB|`RE=8V=csHa_|5KtaI+#=9to0v0|tFG0S0cc_RsS7SjU-u8eX#Q>MPs@l6F? zoQG4hoF?gZXuLCj0;v8a^5l^7i#|tQ*);_UorfKATyM^z>dDqzdlui|4J$AWnEA1^ z{fFXu+KvNiw?cMiNn5gmlG1m|(2(=xFRy)SbV9YhTP_D?G8aAb)qsD9a(yxa-%JtX zLOIAz$T%a7QwOz)rsD65FY{*kQuvCmMxpsXW$JXK7hIgnZ0S_veZRJoRdYjl>FSMf z{&~6f&cQn9aP>*i#8Lh>ysl0ba;-u(qVWv;!v3eS7J~2bsb@ta;vO~JHf>{++tYQ; zzo4C~Zaj7Z{wayh5lG@H`3}Hr-B3j3=AF8zpKHW+KVN*_alQer9}%< zM;=}Ybmw|?B<_3U4Dnk&rp&{KkyAsuf>(HEYDsAXCJShLo)6Z-vA7GBxWV7ym@6+y zqjS=*`Ok!t1%vo+-V!KnxUDhX# zw6`CQ1$OPA2hubV?+X>tZpP9;-$-5aTB&hSf2BOZi7z^FZomiw-%71g(7!+ zp-a#?JvGzx@7T(!6StX$hlEuoe^=4(*FGO@JHU4^Evqie$i|BL08a2}DqxGho-b3j z$&*87$X2Ib?dxaBbh>0s!l$k^q`*_HETwBk%{N9?PMc2?viMt!RY-; zj0+oI(CSES{)&x*Mg3avxDM-$8vD2OelaCwN3;sp25h;3h1Cu=V35nt>R+zfnoE|f zrQw@3A6z29v~P;qJ+qpomD+j9Zk3`b_Q3 z$epPr6YQS!wLxLGGuJrFJHUXmN4#8}_0mQx_h9bXi%8f?s>=puxS)e@lW7tsw|&IG zWDuix*Up`C`?Hs(Bmoqs>nW(^9T1}85Ivr`{~IJ5Q9Vd{9Tfw$-IBu3l1uosFcJy} zX-@8Mq0RsL2F+w>ME_|ee`l&P5j#HNcAl69R!Vk>QPFvhRitig@>zq{HHhWFgSd(i zW`zz8-I%{VEV|%=FL&uS_6f11WL}C}w&{Ksyo_ zj)j-B226A`Oo4%7tnE($cx81e@?1Yo;%*9q4{}n)@TI*o63EPUBe!E^2pRCkqMrC# z&{&E-@yt;OIV=)!m#n;VdT^T=!+bSW_Bu26n^0_NjONueSQFPa2J*c}i`0lVUJ zCYU$K>{(!|@>2EdVKT4^#G21%Jq?dwbh9How#NiD=xL3rezzO42|v4+(<@S=7EDZc zIml7&UZ1MSeESt3H|uS7e-io~TW2(?b%JRsvuJ2$J}z-xw$3Hoeq*VM(0l@eHNQ?r ztCLS*rR%2mwFS6EhaM$>tRlz1XkE}Yy8VwzR}j5+Cpd7?)mJV$1)N_5(2+;CCb~|7 zELv!;$Fu{fOGNa-JU=r1E*x-2Cx3V(OP;EvFmIF9=;%u4$E{YV#4OIb8|O9j;b}M` z8+&DXawgwMkK|!=`t%gLX?EcHcRyi;=P=l*xph+YjC2#m)eDh>Yjlr&YOXuPW85%S zZ1-Rpv8uZv@wF*xGZ1J{`o=a+m8`iTOrv7l+SxVDn|q+TB#nG*AWQk_R@oC`lYo<2Ku`dHIEF1ZsyVH#wQt4>+guM1&DjPLqD_U)V6`c@ir0YBINezz%xu3$ zr>bdHaH6YX!@u_&l43CSyq+N2+__cwbv@%|+#hM>8HlCGv!EcPSB>{S;#5 za#?L|4l6fY7~Fm;V;Ap+s z;Yq8w5VAK!MAeq#VWK<>0~z>QD;ViZB?7kc`;#Ewgw#rMk|BAH*-erD4EW1hm&TdgWMKKKt4%oYTVBr(KN_bQoL*{ylR=G9hk#Y zrZk}}XYr^~YVo*lO71nS?$?h&64QL+GktuizxYMG8 zpPib-IRFVUNFfU>xgNW_M!vY^t_qL2K>h6)hSrWiC3hKX6I|{@kqi3HxD2w9+)~7- zZ#|qvQOuaWhq~XFmAG&Nx>K+~x;tuY8tc)N?8<~#Bxte-+L7>%{8+zNqFFJu{?0Ly zNVOJu7GZ!#TAX2Q3xvM3q0U#`!fko|0L4H#lwEqLmAAA_;|n{uthzi{2qh^G(49AY zS-jH^bvw28c^}F?|9nL5r6ge5Ab0O$@$4Uc;H%xl`R0L(K3~t;`tAPY8#aQ&-Dz4V zK7?oI2WO@1OBF}Jb=+`ADK*pfHJgzNNuW|}G|aDO75`@Z@p>{kSUK3{ ziWM3-=|5t{8Z_)TqW2M;n6Ty!1pXeeEN$<%T0rVaXLpM?9=pH|3$Jc-hi+uN16);w zA{kc(Er<+PeWodM_Byf}$d!`HyR~U`*E>Rz`$h;|N8bT&?Z@Jwy<%Pay1E5!_iNR* zAE^9E|IxCn-6TshigC#1A&a4pW1i0Wc+(`YU13S#DEA0& zUncd# zITy;pOZgqfFCA1XeAyV;jVmE~Yqzfc>?CrtWB;0^41->JuRg|#@FOL(Uq-+5W!_NH zIT-_|_ovON2M;t|ra~UpP@K!Uty|Jg+9A`eD$Nh&=gNi4iu95*FG{6kkDk>tb*;lF zKz+{xFFIe+N*^BsG@##wZ5oe%;w_XKpa{i=#Ta#6$l?2`EIlp{`f);P!sa0&bFkol z`CId!mQb-Nt1>1*IU#q(aaCGVaaXYVM(`9BtuyoDY^HFrUCTH?uj6P$RU>*6FJ!O> zr9|1+1UIMf+@!)Vo5ceflD|>#<(XFGlw$_#-H!GVT*=~NUKVr7&bfB2EoZ*yys!wFSA7P z0h4*p@jnX9Xm$nl)Oo6Uc740sUWAdF@Egoc-RR5qjPii`j*8u`Rz#qfMq1O%!2^tL zGF?o-jlTL3FF*tXzwtr2FubVSz?W2yLWh`42$?CWQ?3Bt}G?Z zjCYk`WMtCHIeE0X$*giz|G`Aw8D7izUng5?aPw+q$9kD(sz)B49yYh;9JZH>hT+AZ zysR(dhh#s>@PG4VpgZf2qJO%sDo)n7MsIlV@cFYP+Z%e~lUjm&cHXK|VykYPNQRxW zOIiq>4V=svs6)o6G9)>Ni5%P7nB6t7%vp8pLY`SEFNEmnPvj;1@_H3o;-(9A8(N*c z19y^uUzI%@lMQwiF^*anW?X)-xq~}X3zH>y;5N!syRYu=uqHC*e*6hVQm;}Qy-qQ; zqVvSlT|scu2!tP#AlTt2T;nOvKkM}&vH}Hp*4yu_AW$%{UpP2Kxg&xY2){d+`7?l| z8*WP+N~0>vw@YA1gLxaVMIrL~@rb;k=7kfoZX6a_6vgG*HXrQa=~#Q`MDLdF>=2vO z$R>m~oq|*Ips$_WlzImK7plBi#s@VQmoC?GKNRe`y7F_%g0@qWBi&R~^gW>7vB9u!A>d}@&kZYiY z_E(n;bv!7oafm%Woy&Mv-i0QJpg$n@B0CkV6kaZt!*sQ^{zrcwZ(Hl@r31RBHo8ly z$j$khc&~wq%e}_99gyM&q0_<^y_qeni>HV?|4&qVl!rQswZ zgCj*^lHPodPb#Yz-acozOx0Gjim*@e%hrMTM&Vp z7D~UW>&YB{WzN^$9il;*`iGLSW0fI==;F66GO2WM--ClHh_MkvSW_!eJW2Spyf5+m zjzV?tKVQ9etvb#Z69igw}hlAwV8ZnQ+0-jUJ?dFJS zTk4vpFh7PfJRb@#c3d3S7uUD5x^*WXGmIdHTHA#KDiN7XS};9&nc5iw6W=R<3VJqz zgAb14IjgU~_)4+PYX~=Y6BA%x*vZ{3CLsns+4zHT!JH?VM>`5QXp_FQp zDr2agys2@fGt>D`5J{M-dQQ9FGfh$b<&ozq!Tx7SJ3KeBSY9A z%mT@Zn?^n~3j!oHnkCZ7zA4Q{C!ju1sOKYS#}KpuRfb!uBI(o&z2u@5kj_6#H73j9 zs~a*E7+7cyxx_~l5#+zMv2I$ah>G8x7k6Zk2WwBcSiu4sa^n7sWO)dpeG3DBE+8j` zbwtyelM9NFYpD^^pPIYEqe!JvmrGQRl^*fLSvLvUlJ)hbPi*Gxz8_Qc$k{zeVsT8DRdSCDGy_LW>+ihW=`8X~jU;?)La*WN?VSp^d7J zWk^|6YAI+K;2ZS9M0%0885x(_hqk$^9R)6SZ}`gLQi9eJlgz?X`!m(N>nk9KwM4B> zkF#9VrFHV(vcO?-B#rHy#3kg!;(O^Fdx)i_V@;deTa^Fg-gPbLtDoyt6${UEP0)P3 zfnwFcK&gQfQ>v~TS9KwrXMbB>6A&G3MANZn>ez*DKZr%Pv6<$h#o$|S!=S*b5{;~- zR~xSq5J1?=k={0wY41+qHJm&_QcEA-=kf_vZh-|VsUEU`H3mK{5u$oP7cUVBUY;7t zElQusD8}9G<|9n=#hZ1ririu4$qMYsRQ}qCOb0qjv%TGbd844d0r2a&JTGP`6o+Wr zVLA5_Y^d_bUAyT0{j={%X~#)K_%{#>@5YlS{uV!;LRljTWyFXtdnpTji`P zqzz|UpSA7OFkyW8Prz4+Xm^$!Y3(HL3SDek@@NiAb9p0>UwsMj$VS_I{Ofzz8$7XK z6jSGPz14(+X)DYQH5Jyc%lkwh=+}d?#;O9S5t4HLEL1%)bp7_PX^&Md8@r8;x?a|iXvz;#-H$4tFVYy_65%Z6ln-4~rC$3NvB)}kRkJ?r0 zl3ZYpS7@aksrk-haH4s1yhG==_@RNAVrG_p>$tME`bqspjG6X+%4o_5VZ_(kDN7k)NcPNZ(~F8(-Xfq@mam=RI5VIHMUZ>g|W29re&kXDwiuh|Ke1*U2op< z>xMIj!Y7!ZRC{@Fc3iygmaz))r>c>f=E5nEVb+&8u88~+mf##ta*iYvqH^bIyDwR8 zbH9U;(k9kM|C&$R*t|sC{L{9_oIaUycXu{5fns780^_G6s>UM1#a%SGk+kz4fso}8 zuM{>LOxuzfl&Ic{K(AS^!cV&Y)Vf_W@mbH8Rs%M_8JIdbF7fV3vz7~i45@-$idZwV z+(AXbxjb-LYmQ~U;tzc!lORHD`mZ(9UfT!Sf5s>sj<>SGwRFjUt5Wthn7hK>)e z*Mhf&kkP~7fo`mexIqX~QKqqYRu(hVF?Mc%B%)bRJ}*m$ag);e`?q26OZF89?v$im*?lbJ^$KoNCq*i7;i@(#wz^$o6 zi(JWV*}{>QEy=m{v%o|N*Ml<_=YAr)g`V{;pA1L1-+~hBp2rw2(ll>0-GMgWa(9PA zvR|ZgZpf4cZCVZl#fgqCX!_b^8K|A6LBkW9nZ-2xJT_WOxeZS+xxgXgFR&cX5P`;TCFy3g;*fe}(PP5flmQT4yiBl>gAP!%;VxdO#DYa^_u&o;T~l zS7zKMEHFl_{Z5)vr^aQbG96IW=JHft>^*-*?}(N%8G-ocv({!t?OtFsW7zomsb<N*=SH6 zknqAUY4k8LUp}2s(R`5+V6E{3jgd$F$gfu zgyV4n)eVI)-!7IM>gYLD3}rTU-u@Z;-PPHXd6>H+>^CS>QYHVqrz`0#zz??SMhlqNgAvwU3Gs>^+-`%v z4flr(jYT}RkW1oWyNcTB0lR@Vq)cju;~y`LjiJkxdqCX~sF+~KaO+x8WXAGy0{ zB;_GPuwbPZ6$Iq~uxU0jWpAFEYQ&v!D;(BjMa`ym{aSDr4suUSz>2*Ece@S62Mnn<;pf z&b102PUeR*qt$fq?dU-Cxf>Q<^X(A$%BJScY43X|KHaL^c|ydLNy{piZiIKvFNXu1 z*oayyFbCb`;B$f%YPJsIDcXFtxjM@IYRQhY)c(eydJpua(_i=S9e~$I)jfD@M(1ZX z8Z3NWCp7hM-WlE31{)zd zOjIDB{{S74pkr-)2kd`ItMlsQ<|eiJS@UmS;_uIW$Ks;`RIr{2Hort#YOP2PYsE*~ z?|pg0vhg?riJ?$-8-qGmP7kwR1+fagoSa)iOBg``dA3lORV8JYEv$4HMPDX5+Z@A- z!DMHG3iOLc5;zmZ?H@lu?EuUXq@!lqRM?h+vNFR0y#BM1%42$ctKKN~5(D}*lP-H- zu2ikw@6_635yXM3tF=9S<@~9q{G2C+Q@d)K#`Os^#J{w+hKdm4JS(W3p>$%Y_dG%Y zPwG=KwXjm^SfoE(FoYkproN_kS}DvrTQSPJjrx<)f+ixqifi)R)ycCrf2DOv(Qll_`>yP91B|ge zTNY^~_`|GY$Y`zK;Y=GefhLu(%s&czg8((zIb<}>%SfaviHH10NLk&A-$r+~x6F?^ z$0q4m&EqQ?e=waUU5Umm{uVr#45_bq2*}+i}6k96J z40#@ksdLm6wP%q@Vd5u|niDE8j4gK$=Nu=Ih1yohV#>E7tdbRuLjYtS=koOLzE-X2 zZSX2iXZvla3E;7xOfY?JHNc8h)!ODKPhz6e`vWtsH)-^Uq3|{|ot}39Zm#Np-|S6U z(gF8s`#Iw8H}NrZw*_NkdJVOVmfq&^Q5*6FYAyC5zS{C?xr2OOxcqakUvj^Wj|n$o zqDV_1ad@u`LodTFzyDw!A0+=hU;x#3AG;E27zV}#!(?>~9nzJ+YZb4sl5MMzov%CS za^H&DAb#&o&djbi&t(nRk?Ch5I{h02Gz?}<9Bcn_RCVC5miduWHwK|+g=##~&;5AO zXBDViJ&D#)3X(5YVS0L|Y~SYl_GWwVYG&AkBbV7^43XBe`Z)IKZ?9-zhPQWTUD%T(v5sC2j>Fy^pGfp=KpV#2Rw{3z(b7AFStz#k76H!4ZXH zH$Wxm%@FUCG>dRAwLxM)ll*kH58Y>mgVZjAV30Ic4kS1A&5<`jRf#!Ozc+I4_^WaT zueAr?ctiSz&9FQE*d%`Z^`!`W{E718bsyuX$MbVjPH*eMG^H(L?0G^l?F|EwpnuJB zbc_C>Mtd@oP;QmXYJ1ouM%6==>9j~d;bYdarFpHjkA>mxF-Ut`L=&EUS{@`>Z2>PSeJL6LGq!T4duA2yGnm-Z;W&yVcR3M zuJ6WfKO6Wt5#c5$Quo>nOyc*O`sZv?V3m>b7#*%sNA z5P8G{xoEpiYYM#!FfJ+H8RQTyv{IMkmmjKdqOIzv3W>%4^1bOT^~u}6cz%>SW;*CA z)=KrxgFvF%_4v-QE$A+l%ko{~vP2hJY<;!A?Gofh~koyzGItj?K!Zhfb? zYMi7$A2Kn{2Bhy#NQd9p7&?$$R%51jgpLfVR5X@CFmrlig0 zHqQyZ+MgperjN84MP!w+}Dbd3tRGwBpT8jSwD>6JAIpLhHCU5M| z#j%*#udd9`4ZXX)wYxQpP$atyviH~!6x6W&I=SsKI(=7N7G&+r^4r5~@mx56kP3rw zY6Cz*s~XqT{{Rk(K{jFPp_v@esDqskX07fmCAPM`i?>otdrC?5*W&BA3i>gp^Xk5M z+Sh`K#<&9Y5~jXdn7}eR$k8I5s#QWR)(85SfL6K+k_CDiHwB|HPe{EjSY?o_i7jFb zcNdpwb)nFWh*U8L(w>K-vEhd(smUauuj=rm5<@l3)4EN$fZ0SvqisH_p+TpcTH`MBXm(!)S8fQ7DHHWtv zv(v_7aB}$7_VBmmPnWS7e+hX8$H?A505X~b);Cl9VkzZ&*yLoG*;n4>9tm0qdyE}Xt&lD^@~Fr27xH_^pO6_p zD0w%Z^Db?a=bXnEjlgmot?qg$BII}+eDN)fhGi_RY(Dx6P(hA46@rmorP@D?Y5QZu zttvs>Zom1OrtZf^_=Zu{{{WW?sXT>t-O4*|D3PKTc;ysOJ~Z4&+E+j;sn@OWf#txk zTB_%3S`eF1tVq&IqD5(xul+FSgzhW@2G~Z?^`Pn!7BG*}c5S5H6l7*?z4Y}Boa;Th z7|SYrSU2u=)YR#*Tet`&lu<*}Lvvj^YJQnSCk_-{CGD%j_O@0n5d}+3;8CeS-N;Jl z6}7E;DUq#e;y3QEI0oWZ=k!W$y0~jTHz=0QdS))9CP?mkP{^@<+;dV-+HI{-N`F48 zWG^lNW4@ytjcbk3p%icNt-^jX{(62Q_yh3^1L7N82Q$ifD&pfmnC12oW3LW6{{WF> zCP?kCpvehjv58`_g#zp#DH{EHpw{U1I)dDvh+W%Lh^y@{c4R$I7C3t)LA;;*lVYwT zn$wGTw)W=oISW}w$nx<^V{ahUC)kotG=*vj6^^6SgI<9bU`Mu0$Ogp!0Od!UyT>GH z5JSJmi)xU0Bg!17$~o)4Wy~4|&1D9H0LISF1x=}IkGGObh^?VTBC5Wmf3rgbam3uM zD5$ucDxB&J*_*JZmxVCkF#tp^rc{;Zp@FwRp97xz@`czLexBD0KJN4|jz2$nT=D?-d8lTX&C)2h8rt;|B~f2RuAXf*M$%y6?uKd%as z@A1%a+e9;RTWk5$D%{ywo9u{k~ z&B0uM)AyzI9s9Lw+3Ayq`u_mpD{+70i|{KG#{50XzcoK2_)HcU&PRL4ao!YM#7|>! zjmF*N9@8PsKeb(Uj1c6co;Yn~Wvft>9*3p1y~9&0j3ucQX_%jw#n&ORlG&bhu-JVNZ7X|IU<*kG7Lmetlw!K!* zsv7sC!z1=xcWwf&*)*|$N8ovEwN;!aB$cKw|gx(%|xdGlz1PNOfYzF%b$`w1IQeEi#+^t-~Rv@xw(9T!p}64I{yIM zVx!B~~PdUPQR$qs5 zoIU0@H^y(J$7Qj1W+l0`x{R{zc4bv!!&*~bx2>Kt6LRer$HKmP{V{aI)IYes{{V5T z#rVa|Z+PA_j`7T{KFIKnLF8;K`SnSz@i*7&E5(nc#zM|uraM)Zu?>T1HK8=>v$^VX z49{YYXuegs>^dUW=8SCi#Me{&4~=BFUJn_8%UO&i;5pqRyFJUL6) zmPy*~)U2Cz+q#3VmuuUqd);e;Y%2J&Mvw?VIaa(s${4!0@gE1iaVh(La~dQfWQsWr z-HpO`T16YnTaluutqBCv(TxtRg{CPXSEY`BkQB@lg6~Zi1>;(0<2Nu$fu!t3dA+_< zN<_v&NdUM|`*zn*IE=HEgOvDqwj z!b@#3rNYe|hBr!-b)g27rFsAZAA6cw4N5u}KIoSnlGM*)19^)mpG5{+(2bjBPB6 z#QSZg->YdkOKf=IF82pdQ{ z5}Ut`>9gx^I(x)ww!inu8tnkFKfOeaR-Qg0sjYVD9QXw9LL0@0t(IPQ0 zWdj~{8w;D$7Gm0K{Dr>HiiBwpPaf4(EwnO7`mX)D8jAf7K#~=^3L2cbBiY72`pfz$mcHwu^mNZG1M(xg_Wu1Tjbp>=`w-$`p4@Y9*fHd~VW8h_<7Qzdk}Or@w+ zP>Ddm0ahDA`k!)rH0s8EQ=QVcKHI1g$_ZB#e)<=-KfR!6%nRHgTZc4I8mzSn?^aQ6H z>6H|vwd8KM5^ZgXl=l57fiQoeO{2V)nCfs|WVV{PDm z+eX`@VZK)bWNR9;Yq!*WPfBG3W!foMJ1EL7DjbS5Hw;k~V|# zwG1I+r*w@7ZPZ=OO-7{CqcE|p>KTtTr{QjQ05EpilkkScr`vaR6f;A*NTOwo0_8>8;FjGhST5ZiVF~O%zBL zg%s=P03BC82TDJ4Z??*Yx4L>v^w{er@3zVh$n(66mgd|`EY+(dlUiHG`;LK(iy?Lj zrnDhPLyicd8Co&tSt+&JnN`Z9V_|X7FE)GceD2W010w?EH_&Z3&(}J!s@d6u4|` zkq5|2y+A?~defz!BON1{(1IjW{-JMc)wYL5>2#(>{$$(0q1#*R{NnRJkGYqFe3#?i zC(Q;=k#LO11jJ>n_@+JAiSY+H8&iVg%RCCWg4XG56<~*Zq77(u>m#kwx+p@qU$m!) zvivJ)q0=%3vM5@uVZHZ~cAj-oah$g=%(!K?KPC40dHWFwf4N(%kVqqmQL9i^jKI{b zO7)V}N`SgI-#8459{%)>=JSXQ_{FUOb8Qo>`*vYw;F9vX#xJ=!- zKIa>B)=*14ZCMPrHju|78i7`>y7fq9iNwg`&^F&~s*6{o$o#LmAEz3EKgq-1+;~TT z++9H(&6Iq;8E$UiD>a?8-HB2oAa9wHcVGk4YWjQh?t&O)aeG~v%)-QDjW4B)!!M`~ z9(AP5JkeO)O(oHUB*+(Ngi28jK4Dcs0RD|mnrjfNk50>b>szCeCo~g?=SuUJR@aRL zR+0YNs~yW4$GwOZRwjo}eZbSH$IwnkW$;y^Pa3qNZO)rv!~M{fAu5J+0pVv-Lb0aR z5+GMJHKjcVuUGmVRBUP!)K44vTC=*Y-dzzc31i3SQ0FATPl3oAr9-+o%OF_PMq*v2 zg#4&9HTwRYXrY@kLz4_^=AG-dWgf0hu6TLVJ*N)O`3sX^@Eik=-{<*XFTc0JV7T5I z#qaWYY~|#u3@K@6Ya2}Q{^eYS+N)AXr%V@m$16&&g=7RyE)lxfzE!+GD}E&LpTiCn z;olxXi|%=0_0>}^Zx+J@@$N$F~ZqeOEFk1c+4^_y;T!?hC2J9-n8QGrw!>aP!CpJqA|Xu(j!0HzmHrf^ zKm%W1zImyI?2xuxPT%QUeG}Or$kKyh@ZD1sIlufj9X-xtomz4`i`7`|tnFY`xRzN8 zfTB2 z>Ds54!-Zv<&Z6D6sCywD<}UuiOtcpmiKdWuV#rxsSj!ndB?dc)qLeWPq)?jlSC&1% zGESrZS~sNi4|Rk77vMy)~x4uTu^R zg6Ui&u;j(G?~cVNm|f2V;y8$PY270$B`T(kBy6EYDn{*T)Qd>R3M)gi0_&wB&R*P0 zA-0XtZRMgAj&0rAfLO}aV8pkmB9-WBp)ezEG{}4I7RQA(`2!hujq$EoXSOQR#b(hl zg;bKAd{Q?qGZboCm3okm8ztWa%8YI>OR%YuvHLIq`(dFc^-j5pQHfNQH7g)|lV z`~7;abHN#06!S`0u?bs)ST7zMXbLOG1gz9GjG-y1_{d*z8hiVWq^R%!LqaTJZ%b4j zHSW>pk~AAF&?!%osVY>^SL97geGNT&E1!^@p%%N=+nuzo-Ybi{@TnQNhSgf(qgc#L z5+S&f>R7JQf1g2`NgNb}X~PQkblScYC6bx1E~E-%fokRCou!dBv8_h!fKYuaQBT*P z0{1${r#;tiXKgCGo_B1$gEw zV;*?_03^Jt%GP{q@elBa5&r=E+4#|ofp}e}e$r8o=6t`6TLrhj&E@h|%Ou!aY^tkV zP1tX^ouv7=)p|{VkZH`1{Kh8x?N_k(CNoaWG)E|E>{U{`M*7)Lhkp{M#C{&~dkl9i z#b&(XO%$VpWSFbAl<^i75pdrAKOYpf1+J~5l*twHZ~Jxxi92gP)s9`D*KWV>>o2Qpr}F9p zZH6hbwR(MgWuP?WPG{v)K1<7aug8xM`3v&l_|@IdDd6@{VthdcLjxv98*R$+LEw*@ z+*;0^hp@nplyXW8CQ1YAQDva*k1b+_l2uLsTSL8y8OfsJQGyyO!FwU*enm z?%}^C@9aDW`BjnQ{3p)$GQ3TJOf|?zia`u%9>nGvWM~;hsZ} z=eT}O-ag{EZ1*&~gAEP+u3a)5a^B{9c9ljp=Gt3Sxj;o-N!MC+9^VUNlhiKgHX%NB z$TjhLjcY$r@7dv8u3S79miD(+R@2(r$kGdRoNk>W6G*Wuoz>skA0;5`^y<;lh+K?4 z0}9u6sb3>Odl9<|(z~cFV*dcQw}Zbts-a|PByx-Z^ib46@}V^~>MGefi;$ibaV)H3 zK~EL=Q9lgvkCM5*PSYFX{uRji&QMPp8xAdsxV`KbAsTDzh~xVkD@d#JmT46bYRBKF zTEQf%9`WsZs?=&4FaH46HhTrewoAr;#tsHc3mn(wKbI_cg|*}jJRUyr9nK$=@{5BS zv6j;-%Vw2u7-_>0yRBot+wVd;)adlGF^w*>lN)>&!m-`kSEVk+unr z9^M@B-#zA@eBxd^x5nCW%zXHK7cb@+G03u(1VqnqHNHzFZDo$f+(m1-?(S{jgeW^f zr8;%4i3VpYw%GVqE@2B~4`UEFYMs0)m;V5hJdK|*^LGg6-a5=#bFLM3c~1uCZJdopDWZ7k7UpYP+>^q*i|yMn zWn*y;HgeLX#iKl3g?*)xu*QKqdiv-(!O5$0U)DM|u0B?)*jmuQhh-w;o;>IItc`~r z;FwH~Q#U-z9i{AoTZ3-wL6YOUbnIh_+-dSzv(s2*I7Ux^%YC{lJckI+Aeq-YjfT;vkjWU)8aukj|%@&PTRvT6%$eaa4_UYd_n5NVKLIsGcWO(V4Sa8t9{ zPWq26ZF`M#adOu(ZC48M+tfU*@mBrFhSgg7g55ULJnhV#J{1uVHp+zTT3d<7OJ@t* zy~K0F9E{4UvB!5KAC&<>OKs5Ur|_ptGA@wOcW$9J5-|Meh)H)emh&yV@#CIAJGUn3 z$k9v42H;cm8rQC{$kY3lBbUmbVraiQH_N4IEISoKsjQ|5rPOCL8 zXlgLuZ@k!|#5KEx`Ibs6yqF}5q3y30nlEB&@uductw$qUXvMMkzNRf*Ds z`VN+NQ2|iboUa$M)J2%Ow7D|HZ4*YQ?omx;aaQ=2W-Tp!wI-h36}QI8jVM52wdtxD zU8IZPHj+1Ol!hAoh-L~!Pf=2e(6tZ(qlzsrGTI8Pkvj$_*JDuYN&vu+KTtZ6Kor+e zs4re+`&)pDz3LA7|;@c_gt$EfWzs-aq*g(_+d zbS!%9*M)erw4<#`?RTrh%>@<729yi6sz3xaN2jUkEDuAR-(_{ow@r;>xe_FVszSgw z$oB)viVaGYBrrPH{{T*;p}{s(TrxW@+R1AKY)i}@u0&BrjFVb z-pt?ve_bhcG6+BGV%o(~JPllE)u4uSN$=g^T_0e1W*d*TTa3@k1X&JmhP~tYUmwYb zx46e)?k=E|L6ftd)@h;pNn=3~Nw*RS6!bk~HIs+CJeV9$yLD;d)OvCHE(i~wl~-4? z#du$VFFNHMZ!gL4SbN*+ymyZl>T5h4(Z(J-%-%_3$L4RXG2s%RTS7jh4SEE9q-uzI z_k6Z|0z~-d62*;G#+U!MiCGMiD z5J+y6lRG78I4$^pTCt8c$sR{xvyT2rS~xdv{l4DXQ7zT%cGk%}(NFskv}!j;tTD9I z)B06KbO%cGLdb|LELNT-fXJ+^8N92d5AY+%v34FP{ECm7OJ|Mad|#aL-ce_Jm&=@1 zHpOqS*Kl6kPb$j{tsnh}aZ^Sh`-9ehxWlKAk%ZnQQ_E#&bS-dM7jlm}=$DfDQ^b6G z!W^T?{KK2^*t}6U4$ZaSA+ow#%w|f$^B-{nS>tGXISFnZ_JmEviPuef&Yd$gQwU#z z;o;0x<{E_5LHxTiysL$Q=j$3n!;W+Ddp4DZx$YgFNu(`kP zEUja0Z)V%1HDZXqn}=8W9?9x3Fx)U3@BaXH%Gq|l_#37UdyoaXcwv^dM}7Fk;cvz~ zZX++}zEO4N?qiT^z&KBj1iXKNVzQP$(`B8`-^**rIR&z_ZIiH;fU=ryQ`7MF7P+~d zVtjx0u4_M%!yxFn@wOl3+d>wfnEay|Z<)YxOl~`fVsd6n3_ly=IO|+i3k7Jg_JUd2 z*t}-u?%@=7ZY~~KWc4l8?w3Uj3LqBSkIdFnRo$nNLk?K?AU`FkTk$&AH|HKqbDYaO z*vtth*=n)>0OW`BYngJqF9iG){AlF4Ule#U{yb(6mtEnNZTyMkn~d&CJ8Rqi zLvdjwcNnZ*OcwtDvq=M(=#Nlo(vdJ2$a_)SLi?-Qfa2D*r5M#fo9kg;jQ;?F_B5LMTqXDXh}REDk}4zCT)5 zO8A)EgsI(ewy5SqF&_>7>%=dx!7nh`TdXbSK3Y4?ePugZ8JadtjFW8+G@}Okb@PpO zfudp+8n@cF=U3u*n$YA+ajk>?FnBXFk-*(@wP9o_|W$ z$K?0tzm2~>zaKc1K5F7w9|8VRc#`hw_m9V6j=$ub2guepfLr9T*gi=F33tcE%g5Xh zID0+HmDgMJA=-28G{+zO|>`X@$$#+C|SWaobpDc&a414&B2w z&SM(HG?2+8k}_P$8fi$XK=mCl>9QgTc2l_)uGu5tVlFs@#L>!2*kiaDEkP|ufnCFdpJb7E|k7{!}I zez6)z*7MiocU_}I82V^UYoO^zw)DEH9V#yc7!%M8mw zuVO+yMHIv-kf?9JM2YDiNG^JN^@(#Y@JkGK6_Gav$> zR0?e>N%zyPU5?Cb4HX>liH6E7lH3R_;8VM36Em;|s0}EE&>&I|`%h4K%;4u()P`t> z_)orv^3l?ESa)q8I=Enrj0Hp0N*O*rpRYvA)zd(Gi8scwV<2U=yUJfVSnVKjZ0tjC zxRR=(k^otV{{WV|dV$2nTN1x7rEMbvoVA-hXLXyz z-rZ!Z?5*dwOdL3ift0pLQbn|m?kU5=G+|^)PMjL z=)Q?-)s5*JSA9v+0MJ|cZR1bUWhS^~{4Yx|>tbx$SU5zEwGKA2fL@#GG#_ zkMZX)$#IJgQDq&cDX@k-ebv5V6-iPxlw>R}riWt8^eD<#cc|B@ZBJ{DRP0`b;J_QI}b;09x{=RX}vZsN7P;56U94FrZ*p+MQUz98t6=MA?2-uhB~8K-Q`nn>^3SGZ1BRDa+@)&fiIw z%Qb_~GeZrs-_IkYi3eqn4YFxNs2;REG7At|{OCH}Nn$u2pXtJ>Mq|hviqkKX#^Si- zSKnu7&X-oP-!Qa><$FSVp=_>>q1#3z0BK&LKqki;p`W_Fa)Hyd{gSQ6<1gn&k^E!F zu^uHH9~GR&+QpCydu_KBlf;{u8dkoVBw66fkvz3`bcu$P2hcGdrdF^=nOU$P`c$CR zNZ{9tfq=H$Zk00H!*k9&>*6c?hB-~fQUn@NM;WKY15LUE z>C}lY3X3N1z8F=gXqF^(m@Bf5J#{_?3_bIpNG#%wE+kTWZ)(wqrjZCmRTTLe014@5 zxDZy(-S?{5qm6)N7_R!%ujP-9?sA`)TvHv0z)ydT@~yp<<-EA!BDB1^$C$sk$c`0? z-pOcpZ3*%t->mG~d1P~1$7Kap!1CKovR;72QaD!Od~?DrxMz>o4Pz!^3r7s!Yc%%U zZ!a6HVM{FX%CNkst3yx=4{G%GkVqMlK#mv{2jNxI>a18Aq1;pDLHhIpD_8Ksh7Xb36=eut|DgNDOMMILiwg>k8zuvqiCWm{BRR=mAb zwvkd~gMHMWu!^dy8lgIX0R4Ju0@)f`ig)4VSN*-DGa>14@v3R%oJTsJlflQWB)sKI zaK>zXhB+Px@yjz*Tin~mA%ZnU{{Zg4s2;xELCqoMq+#=@YmDez*K{4II8eCZyu-$M z+ztKSR?;lB>@r+h*sM)-_{J(Dl_>iy`;3xp-m1!IXnp$ga|r<Iceaxy1_vd>VT{=U98L&SZ(1Dh=W$A_4fAa!HsZWc2p;gX|$~@ zj7Bd>Ile0XE+fe9;JS{(6>!LtLwXd=EGOb5w^oFxP<=@i*Glvm8s?t1^o~2|nvRB- z?H_8S(|4KUwsf>MgKPJjZOh6*(jv?pq-LhN1FyHU+Ga%PgNR21Y-*}@uoCimsXk9P z9juVs!5y41sw%v8_Nwv#;FGj=zAW17O%MAzXF33`>e>>xCo7esFP$a0zp%{DXJr(5 zNNkX>l*$Zq)}X7z><-<;dk{6DuAOnriy#1@8*f2*l0c3(9IMQ@oOUvCdu#=83{Kh9}0*(nJwMsCjR2&Td@(w6_6v*45-Vt zL}%T!X!AhRb>e|?gaz}i0oG^K_kbHc?j1i-05R+3yBYxrt8tc+9_lTvFAhV9k{{Y5^uKpUvvoN<0 zXVhbu;+dt5YYJo4+@KgD(0vOV@a?$$+;$TjPb;sB^hkCKN}y!v5q^d$f9Q<7?vyQ zO)JpklmXD?@T2M4<0trd?9F9_=yNIcv(w$Lv8HgE8*}r{h^zLvUipX}VFNPHLmGWN^;Wiw{mva77lkrCx z;ap)aer7EF}r9)|7ezMHddXs05q!Kvo9BNWZ*Mxai zoxf`31I)ft&v~oLJj=;EiuU^>eaSOZy`-5t*)Ojx@Rsag#9Fn@fkO>G2wd5O*2fV(;v2WE-B7|Z7rs|Vmpbk2o>25!R}6*b=yk&o}13l z?aSv&66YJ^PO@Iv!o7! zSGQRKZNwHk)Tw5v1Q0!cUWEA?;tRH8Of`k}X-5jGF?d;w34J?hwLj+ ziC3Zk7KiwC;PBQfdc3Ll+FF5>r;ys*SlU>|XKvH3(2_cDfz?W=alD3$O$e{1y$9CJ za=dh!46k-<=NcQss=VUWq(zpD$su*1Z~+^bFey+fDt&q|a9{;_)EL&h7p55es^@+S zW1BzuDa1JE-QKEZaoOu{yS0itqYcfzBJT1Qyk;pJRtqEnS@(QvUZs%80~`9jSF7DF zqE<9Dwqj#r@~hMNDZy^B7Z^@|e~%YDdoyb$F6QPanUdP(&O(;5$fE6lGPP7Q01vmf zL~wCwB%|ztiL8}EyYU}tqrN|DDZeE#3npg!k6Us+J$YeeHZ~z5T;wdGYl~ZZ>jAn8 zi)r2^58Vu&iK+Tu(#{00VMaq0}XU2IV`5okItgYR`i`I?|ej^-G zO@Kr8nCR_bJ;J-Tr~tO7uE!a0Lfqi-MEcdHow=IVl8U#fAH^A~o1Zv%!t(wYjf9>@ z;t*T++7+7G-b|&kJWD)^d6BJSrDn)v<4uDj+(6x>91A5v2uadHvOu*RWJuL!Z`h^y4`S`CSRZMN$zp@%)@bb zviCU0&E+mFE^NN=EOMM=@JOzb!oUq(G}BN>=tM3el#&J!>SgNZR)>(>M-C1PP=Yv; z1!syh|uth}CEnrW<8u z4d^#h>(r)eo-(zl?sV+>XyiGDK0jK4xwu|Q_9R7BKvPi#{@#n=_i?~>&Cd}hAvrkXc?{X*oeQn7}yzww3CF7wvuShWYtUbhr;JIBv zsUF=0W_yrbz7!X?)E#A8THfVmJ}%C!eje!rv7ooIl1Lyb#TeYfDttXP(Ek7)tYME+ zkumpGe9r-;t^BGt861Ir^W7#&F-xULpb<#LKwyr92iiYDL)6;%Cw=-?H*wln%ygB7kq26y}8R7Y>i>!sD z*FR|#(Zy=txg&Su_{tOnU7oB3Jvyq^8S-^GSAgM4>VRWS)E%6XvX{%uq5%YVaex>% z+6N^)56USako^d$8dIwCt0u~WlKiW!j#srAW#vf@FDR@~TE_%LokHI)_13fnB<i2_Swr?>MgFE{YOQ^}O?^H3&CT3o zm4(f1`HT5i(e%BN2qOWlxf{>?sV%fpLrE=W>@tHzP*t@xsiM@DIuL8sbD}z?29sfp zzoj)BV1?-6(s}Hq_ZbVD#Ev4RP^~1|t~W6>8+TTlhp(cZxXn9rW-mu?PmSmI#`Bl=4kHtofYbs&M$`WV-PeqcU*^Oi$U1_a!>q5pc$1uXaDXVCLavEvQ)fHGp$j?dz zx71dvR>5KsPkgN!2B}bMB%0`(d)xIN^ApvyV1ytej>@Yy2yn00IT>7-VO4@4MFJ@e zRrL)2Nm;-;k-7k~!m9@yP>9lU)~hmb&a|K3?C{LT#-pspv!q+(W+*h%1d~ zOwBhnp8oK&owHGBRZuD)So*vu}EuE}9;NBvQv1cnU`%7mi-0JgZAN`@o~Dc=~QiZB%mQUzs-wR_y0fpM$waBH~=*jAl5r^TU{%FZNJdS}cM~+k4P0<+G73cg-YDtZD$) zPp4d9A~k98@vCh%NaHs}JnMDb!^&BlPloO7Jd?z6e5-|D&Gwdjj~O4_-Eo|lbrIR+ zp_WT~i)4!7v~9JaH8edj8OR7F1wE{eNn>k4P55xFTX|0rFO7L0jXbdp;@v88`%8(% zo;by4V~Tm`%$Juk7~Vq}+7SaE)SjXq(Xks;jcc3xZ*FVvM6H?U*NAdVMV;*V2ygB0 ztrB}%b2$jt7k1)HaU^UHcSZ)3sHaDVA#X|P-&fFp@&*73uU;^UMDlkT&ZxJxmyUBh z4B!arl0BAM+DOjVE8eEfR*O-ly%JcO;#~5n!+kL;SkPYcln)y2vlnq4#~o>8FtEC? zOOEEd2%6S628xidt$hF_9V^mVS1^C$Yu0;IW5K7x-Bs_48%*CXxR!RuL2qh=C8ke` zLzIucW;J*+7ZXO-61Ko;wCXw=oZR5c`Fn1qaz8F-1P#KB`9@A(?&99t`z6Xo_K}FC zzrL}Q1o=6S9|T6xz@~&T{b(uC0DFzEO%^rxH#9%zK1?kGu{hMMagB(Ox1X zbe4gRfc#VBYoQ%YL&9PzF+^D6NwsmU&EvAfbB;wE1;^dzGB+(7Mq`OYw+_XFBQr=q zBv*49`i`B_x#D9d=_0N4dSM96!(sx2`K<+vnhDIaNTvllP@}SML8)*)PRypFgb)2X zKBrN9tL<(TW?Wp{%_u6pU1Y57c|K=9e|c|hZTAz;8c%oI{gtXl0hA&;zo|v^{{VMY zVeXCH7;LJiOva#b>KrP?{x@Z1^8K$rem8Y%fyZGZh-9)C*9&e8F&_B2rA;jWN`th3 zdUgroAm=FW8k{<&W+C5z+xAM8Z*X|7KLj~j4X)2xO^$IwyRsf?@sQSYpLi;kte!(GFduv|E02GS|o;3;sbjj^jVHFHwMSORI( zhMn;qzsP%UqKFzwFsg8<_sKTan7<$8;*vab-%AvIxsu(5$%1*}0!NW03JFtH1wbJ6 zPpxxAONiO!RhsyN8cO50-A`OsEjY->YbBE^BJW8+O%)3N09!Hy4mI~b!>sP5vX+pD z{{RjZwd|09_OUut-mER~wm7(5Qr*ndBe~l$C?EnQ2-O<;fz~5aB#hKJ7i9qM2ELi5 z(7_~4k>d`3T4#>XcGluG8(|^HUf*gx0jq60wlc1tPN2zWb>3INUag|hGDl>LDfZrJ z@?8AVT1t^a9DlH}mqM=775@N83^zuj_!^JXt~Msh@#`FR{{Tv`mKU-h(`#YwpxGsN zZRO!oTmEJ;>HTz2H%1VxeS!LQXAE%Z+D2?PA-|34o=7vhGGBE(E;qLn83-nZ?v!E* z=?z;^v~JW8EB!xSs;7GsDJo7rRP0c<(hVa201vGww93sS#?JaHY0}`3s?n0dfKh6) zRH+9+O$V<@A5nn@6hOe|g%@=mV6AK-K=8q9Mswd*PURF+Z4udz#-F8nMtwt~u{lS* zaN$;ZZ7WN2{wD*s=S}?62DvK+j@l^Et{}LC#*m-f{i0G$fY23MXesOK(R*g8+MPpk zxpQ#)3desZfchpjo}xEazWEKL)~_5=#LDAxNX@!8XGdgF9V;OYs0}Noy?rlAq9LDX zy?%J^`gcdEB#ddI!um@a*e6mW?XWFYVj7x-3Pl-6I`q+Zsdr#LbzInpD0bDK{7~{I z9`U#29~#c`m|d{>R=dLe%1K4Ay38uYX>~HP)Y~NP0|0A7>(cVXT+lyN?@YCUqTc%3 z2jnN1Ec{5>u5&ft7849u#_?Nh&6Yy%GyUPBXyd!VNfeg&_|_uZk8n-4mC~IkSoqFU zcWv0asrSz5BMfo!!nyh6JcIkTTP2o|%aF?CuV={LWG*{}t}kvTX>M)6b!Dcx zngOq+dW&A?Z1b)l4N`AS=Wg#t+|@+|6Gy11+qZGuS_7w3B`$ET09KU1THMuDchoD_ ze&rRei?YAVpu7IdH=Xgdxg{Dlh01X>dkxQVW0p0HTtjOdk+F@GyNU)3DHLPj^(Xjs z0OYYMM$A0v)&)4Fea%{0m~8Iix{ai}foGC3v}ojGM~ao9qkpUAT69DX0KD3`zzo2f zG*OR_X2|1tmju4U#~itPZb6Nn(iJSM^Fw(XZW6|<(W=G?XCKll*9@_u0b$Op*{W+W zH#|Pou&!g|k1ZkOd{Y^o;~bBQ@}qM34n3ZDvX=It!3%R^lDU%JQF^UitSTx!I_z=; zL3P5Me8Of0@T%wJX)>I%$F}$xMJ3Od6Lm(OnyqjJ+Mq1Ta}(BhyW0< zb=03uh|--S4Ye&9EhxcpM7TV^AjszqMj6)M?ryBF?|Tu5U_WUxIg_;{N@J7aN&cFW zdOP16nU@UQ_EoE&`(rauZMxTIelGJb_pS}c#k}^N`))OYmAg^gH1k6y9@L|;m1T&O zV@3)9zCc00#B`Q)8Cra*we4e1r~)+q07@nBmF50hm-5_&iOtDoZmp7b#^$jW)_up{ zE8E^!UU%;t(3Vz&XnlH-BF;5z3%kNPbj#l?;G_2{fVf z==x^|Bb|!XzL~E*PWMzJ%J~{$IKD#uMz)q;wsM=OW?jh18pXJZO5;Fi)#_8oUnWIX zP_?cAWmE^`l~V2eE6#b?UPY3&y})t1r&hDMzm1;m{s{qG7`^g&TEMQQ(ZsSsm+KkYZ z*vssFI`Cs~*-vP@d*hI2DtUPCsi%ey5k0K;T;r5vxYhl-G-AOx^totfJ4jO+W84Ly z9;^|EOv**xxK-?N#@nL1og_TET;>lsg~nsDS&lu7w!Dtj%y)81w(=MId)2ftzuP(W z05K_Ab>QfoCTTGo?e4~vl^th=Zt9`wZ)CA>{dj^E#Ww#^N=N$+VopYu#&8+_Tt<{B|k&$ z)9v+z^JF6sfcezf5G0MXs^V;&yrUm)laBFYZs+#->`AGNRljmqUF#pN&_}1IQhTH^ z`fG8w?MIJJ=C#UEQ^U@pFEZTUT=BfIxQY=wLvFI97BRsRLX*P5nxUGj=&UJ9*1c3} z;d6jEXJaFnPmpMY2YlR%eU8RQH?%M15XLXf-71(lW}~7+R=GCx$hl z?6XKG0ig=sep$ajldTbYHl@v zLY6i`trR`n@)(qr4i2Mh4bhNTkEhn1Ij7YJ5a$aYFDg5n&Do)BisXR{uDt^50Ttkvyr$e2s|Uww#{h zDUzFtSV?DbHb*geb@$SMkXy{6RaCVfY@tX%#L~6buQmq~rqu?_(%iCLJpI)ZPc@jB zN-R4d5IbLYRRV;KwTV<$^{MHWw6)wQCCv(#G}2Y_7i|@_tI0LP6pjdk5X@+*qzLK_ zJ@nLibXz4uW)%Mbk;S$EM`$LsmhGVrcq3ru-N*!6mSa*>lemFEdgavsUmEcMA$5-W z8#2ztf{4jK5@QMj5H^!gbpc1#hMM)zGTAIDPFVsxak%7aY|TeM0RM94==%^vvI1(nNZUnz*l!DSa2g|BA0 zbV+24I}25}g4y++;^IkY0jZ}`^xD>))YL~X4Ih}m)V+O+%it}SFOR#HL2-1ib8l}1 z*3jKNZQXTidE*8-Raly>P!pl*Xs0I6g*)rHOI$8+@Tpsc=PWZgiEbydW|G~mtR#-} zXzf9Luw6Nl5>bCZS5xoTk)gT4N+X1CIh^jH!0o6@fL>3-`L`qS%(6vqjJ?m>@*G3T zWimk*&$ukta-}D>deN4IsMo1w%rdW0q?#QZpu~E8x7Dk_<#1TG%S0A=7W&%YT9pB1 zxNX|QBxJfW?KRp4+InRqdZM- zG)(I(QZB@(wQR;P%YzAWT7rImng9j1W{hUay*(`Lm~DbWYQK^ zQ}x@a{vB|BYC^Z%w8(oH;0RRXht{Z{e|_3`&_ap!Q!KY~UR-aUcA2j3u4azuLw-1rK!sD)U_m;NW#$s%w zcZvT1bU&m;4)b4LjRU36Yaa`JX;1Fl^^t{GFtT&mR+j?P?EtKQ= z50USzZ0s&M3^OejDd)+^SN(cE3!W@55U^{pe**G`*O+_T64~ zkRpd7@cYn?OYz^5;$)a$Y~|0`LlYBZu-MsUt;eiP4W!dsN-EW^;zc@rnue(WTGGGBjbGr+LcsVq{*ZVZKmK{X%|>(Lj~YJNMm z*9&Hixm{!7Rlmx-Ynz@G%W`eSxkF)W;)!xudz>ZARyIW3Ay&A&+98NaMJQ-%{Q9KT zBV1SwxpJyKW1Q&7#BJHSnYfIRwn956-7j>Xp60hG#yw3GSkgy|}xA6b~ZC5{SE=RRjPUrCF&^qeD~GEP4k>^6_ACJ{H?rn6)l( z%EGp{vQq0w_1QE|OpZUcczxFzw9?M^xNfN?!zeEo zb*nHDjji5Lr*%eyWQ34(HT0hYjXN7|n&ZkD$!?$d6NxIK|V z2>_5;K&Get{W+nEL;FnpmkU*7@_$6wqx2eUy6r zI(|qT)O@2Wb{u)wQn5MDld8zA}w|x`dl-H`sH6f(6 z!CUe2r1ocpQx`y(rOy{TIXGT zw^lp(B$Ijtv5O}UZIw;=0eg$tZyI?dGdr^ak*hlwYL*pqQBm$sTMZa%q6NWt?%iJr z?#_RzNgZI}_o(r0cg=C$XOt@dl~N4}6cMw>+xY2Pnpe}`rt&acU}}|ySA`)5g&AAN zW&N&fCR9ahGnTuoPwzzd+A8uXL1o{)N>EGLGhP$TQ4RzzFSyq9K#L&ke znJ1Lby;KS;f3|3TN_NPCl@tR`yx&j|K(^Xh_0bmqYn&m0_sdc`_llLcP4WjDXL$9q3XlOlj{{U}L4`2k31NN&f-p4v( z0o~zxz8*Kk-A}}LqTCv6 zR(hQQ>fcG;1ldG|9(H}hcGe@f{{RGjnEH`9K)@zGCPRfxI8Os}k0<6iRp*8HZQuU@ zt$19v_?z6f7?&Y#*sNS?6|-Eo>}<0auuFR=cLwHFEGa;vts_5ix$xietiS&NktUJg zo|07!ivIw(qEL?~@Q*RTSmZCGzyAQpaG0BUrk5jSkiMQckSS|`ra57Ck{bNW#s@?$ z1ZH*GX=!1bF?q6bIM5f1xdnuH{#}cnc_)tM25V_=XLgd_W>O>CrDoj=IQKuVxav1x zxJ0P{Ss7BVp|3SWWV_)!^2E~W!yRv7m1re0NYYzL7>LLtRVt=2@(L8|=~2-Oob%O< zFClA5%-ne6^h%Yo`CECcZ0_tkFwHzxlKsuJ(j!1_;Z|l>kyt9e?X@2*Jv#7j>S;$B zWJp|$8!)b*KN5VkcXi=E71?DT%%#5w!eh6|V{nqM*rb+qYqECAtt5XY*Y%+t2(iH& zz_h!WD<164wYG}c-{a11^y0GZ1bms`IlGe>j|p*chC7u@No#)%ylU@KDz$G=e~$)c zt3c|dy=Mnz48J-jT=OR(xEB&s6L}wLa6j8!37Vt7c4l*O$jhLj>VHGmoc858u%n5y zUG}P1`GJa{gL!1T0$mn!q5XCQ-^ zEmu3EK1Y&TTTgRqnw}X%INW?H1>K%3d_16wS)_f)vD;N$-Of649d?uR6+v(p z6Rts_it<45%D|Ui*#IzZ*5zSAPeN;6p_RZH9yfSY^is%W21C=~@~bDsuj9-*+uo33 zh;0g_x}C%NrD6akzV-IkPP3ikQZ($b%6;qPYwN$p;f8oxOO$du?^5l*8^N+9Wg?Hb z0Tj4M>*y9pgE^#t`j3z!tWW;{xLEQW+b%2r0LHhG_T4aOc4TQAkJgy8*tNzs%W~Hd zQZi&E8ZA!RNmEu}eLepG;nkE{=gtCtCk`v&@unnnY;H#N4Y-a}G_y?@Zp4op9m++# zQbbs3_5QC-55G+fGn~*_`4R25tBDTB-Ain3B$C=&=7F9?leX_7$ww6%m18V+=xbei z0y;ShTVuCvLD0tHq@dn}({1E1?V4n^Ht~j5GD#lvB^vyZo;*TAT7|ip|n-+#ep&&P)3dh#Iy%$A3nX(2S#9@xw$M@$rMCUrmR9`kGO}Z*D zPuo4EKm!oO?B5|u6Rj&#{A<>iNf>h)=*qU}aQN56`={?XoLljxsH`NrgSMe$m5o+P zEM&E7`+$vWxAf`930l_&eg!vGPo!IP!{=FM$z-T3F0GVo3ku2rR*e83(!;sDY#!d9 zUZ)dUS(t>Oz3y#}6wNdyBw)37E43C_!zzF^H6gZ^KA!aHf>h&4J;2;yOmo6j3lZ5Q z=nw!%1w!wk-4HB2zv0l!%bKy=`){rSm!{UAE(P$LY*Vj(E98Syg zuMDYSYD%%oBL-z>s2?2-1$}n|yKp|nopsM^ajz0NSCvMSL=0GxRYt~bKBsWnXe(3K zTofgG$;O>A)=MO>E7TY^oy;R6ds2v@2rX0eCbZ~NO%r22p+suJ& z_}i;q1%!=H~m*%3jG26UL35< zZU@e!D;!0Y&4NWNF>iRl?zh2=j4DlgexId%I>{dIq>Y)F>8*!&b7#sb)}rwkeF?vL?1VieNRrot?inHi`4zo zhfDl+0q?Ajb)5-dZNgc8b!Ygd7tQ|wjydcH8{t?u@ce%}c$TXV0EZWyzR0L!B;Vb$ zxI3`~pCZML(-5JE&}c1m^1J}ZUHf3*pEG*PPaGPar!^Ca`&D!NljS&^4>RX@E4&U% zhi5W!_wqt1BC<=#GLZ=~JC@Erx4pKwB<>;D7do1bw%T&R7-6#-E_d#=WwrWrYn;q2 zOF>-*XzQzY*0Jud-0=h9OC_$pv)E=Z2&R3Ka7-e(am2k(6bW`{} zjJC`8M}@~V_H+A;QD0lRl`ST=hAD1ZOLz>9g7Fmr(6bUN^aHOKx!?wy51kfiNGM7g z-M`}{mm|mV%j|i@o5tV?Q=Op*Tp?PjlCdxL-M2z|FvU~xSU z2;Ox^e<-r@WH_`JQ3UTCtfG26z?hoSVA0BlWJ-*`O4N#J(JTTmdg5g~8 z`M)Z**<8i_)MnkFur zCk@PU8OwXH+}FKj74%lHT-?J2q@iu#Xy>_6Z3t?%_1*FUi|^NqA0P>4P`xRAMF#t= ze;TnDoOh4gVyrJ!vh#^?7eeCh;_BLVmQ{m%7c#1SqD2&M@f$&ESJ$pMcO%( z(bytkROiVP3tR*y8;jdh7DhQu)E{zP+C?k3x!ku5s(rV9n)MQLkT7jl>X_-663?jf z#kVrW%KreoJDT>c*Eq^-=nZz&omifMO?mV#V#pK^}ilBSL8(bcdKn5g)DX~qOOb0hg-M)@9D zgyd6Q-`jadC&(J&vn7s4isynUXuvRkb4(IiM7k($+ zwBx`zjJS#Jps>hV+rc%wqUHqqXJ~PMr<%!0Eqipd9aRI8@)5 zjOD5Z#Y!3Eyx#iaEAGxt`|U2Rek5T-*w~uSsW3(pZ2h{?b=Y#qTQ1@t}4Khd&oH0AMSJnF#t@#D6Q{p&L+Fj3b?$gOMra1S; z^m$OY3K^o&ia20BH2(m1Sl4JGoyF$I$Lm|oJjPTK8z;6N)}k9b$GM&bx{;O?qdd=T zB#hB*Cu;-%?yi;huTXY|O*d088*OhhR~jhV=k=SM0#Rg`>=owM1PJuqBr(j2$oiF+ zSEHy;`sVeEpz5*rg*I61 z&Yt#h@!3rn=7$f+EZG_FVv1yENQFe`5AJOnj9P$nVM_Y-B#^juB4QKgQjS(IqwG(e zKV&U2x7j&wEaaZv3yG#NMUadMkh5-hO2%CfD+53@BhY<0)eEm(k~rJ}Q~^^T8jNyK z-X!-DhLx5%3ZsZ*juY~sr==7D>#zJeZ#KdBj5t+m;gN?g>Kv)2`g+0{ky;mMV{0)clF~`sw_7Fa(9DAynI0qKV9GN{}l> z+O>Z{ynqb|(wd+5^~}T`o0{+dgIACf;*FkVL z;YA!`>eAZg-b>^YKqj}6Sc)Fp-I+l#$jhn&N*_*_)Mqi}V9J|u$AxIS6QlK-UM-t> zt&LdcvH83-SB;LEIPH=bf#A3TKz=(_1y1d%JuB!s`R{k_`mIu+QoKH*ze;}|mqRX< zsN``2W48(`OujT*Lo|0LIS3o!WmR_C)H}>&g9G{ydd)%GH6ldFt87QsuC+ZeoQ_a2 zvLzJpu7AcbH#Rmi!N_v$$)`BEjvqBQ95GCwyd|!rxP}x~*ZSCN>UHYtOWEX%=8>v4 z+yuk?)qw7j7@Sea-RQM2*zoDG8E9^8@;N>aX_0DLV(0Qhb4=E9OR9d(Hx-G!p4tgz zuk~&$r_g;Z;?Tt#gONS<^Sx)=I|`||+rQ|Q6Zz)vA$y+0@szW@&Sdy)o!N@0HoxvTL{}w-dp2kRjb9m7&m3fluSq++$9hM>>z6X!1)_E zq0K7Z@OGd3#ESjtatX;|1_c5HjqD!HZB>u7qNcvObP_s=MKu_VO;YjIu&MY_pCp;5 zySbHR#z>QQmPWSAzpAjt6 zPJ+zcuK1?d%A1sgXj^J_-$AVypZE3Vxy>M(3)G`|YrN$Ym zi}Xsb)xRL+_N`arFJ{DEr1n>`qol%Uri92{DMB02bGRm3Z&5~x?{Kj|Y159{a$I}; z<PQTI1)Dh>I1Mk{6MYiqP9l6G1B$2STKu;n4jFSf$tZQ&GAmJ1}=wBUVSpea>W) zaV|m2FL+)=w7t15cyAoZjHGTWKi^-;4V3ZE8|Xeu>+4>)_PK+q!1&XDn@&@X)cIGg zS>dsRH&?6AF!{(V5VKp`VD3M;v_JrNEw#VelpfVED{588(4i3_%?ACxRH zmi!-)$&0wTCTn2xY>G>0l~P1flEqrd+$&Fz6bGR=Aj$|?x(Dp6V zM+v1^Tst$?q)7h&(m(>bYt=@zqyEQx{nhnu#^A;>%HTKhqiaa6uP2FMfu)t!h1HlU zmeQa`#;ZLg>` z^&KguW88B#;9@YMzf-5$RPsMcj_)QC$=!{n8(EBXVH+p)5Er+$i(gNtSHIgpOH8c4 zGvk4(sUE~o5|mlrE$seQArv!*>L+%_K;JWKv3u@;UTk?5qdN+LY_s7~_zZHTL9jtp5OX)(td$ zKa+lb2BLmZ$nsfkL1}M!8m>Oh))tB-?yy^ph1j=rNLhtOwIKU-X{XW%$dh6A-(Mi_ zUBUW-SmLR-?1G}sQ=5)*%P~R>>{?FYN^P!`+aBUT_1o3NagqR#s%*o|Rt|X^n(jh) zP^JzRznbmsUM4= zQ1U8w9)?z8NDJy2>UH-02T}-I!k{cE<*Y3hG7Z$KhtLp`3i^%0B3KRH4GonDB8chW`K>yM7Ji_SqgSb&JR-f?Ioo0^I=NhpCKHVWet6 zG}N7adZF%8dQJ4)5dQ#)SIWNW{6kdNv8`pm7x4gY*;4iP4({9whIp=R0)rIM?parH z)n!H%Bp+&x55B!+qV5s7`ByXBz>It==#GW1VvCCT8gN;7zIzGG;N&tr{#OxqiMX}8 zw6){7yI39n0J>genWh<|auly+ZIRWOQM4fSpwjCgWCuS}zr%5l6s#|N&}VUJJx2a~ z=);3~>xJ>m8bjj08sgyO7MBuZ*P8M?hC?x&DGNM5cW(I^7S6&q6l5?)k^$>pg)XZ| z$u2sE7kARLT74)FDC>)1hn+T&eV@x-WY;G%w41~;hp@cN#U&#y>2axgj?s19+cMQ_s zgAJQn+}=Pa?NaEnO6x&JW-IMV^}^;l!jqKE7gG;Mg;<}#f6KfFjcjvv9zn|8*xd31 zgiA}(WRfoSDk&`mypSu$6fM~xlFC2>*Ii&x3t}lJIb4JzYoQ;ott5Aytt-@(X;H$t8`(kt|ELx|63~3}|tUp-7@KB~birPW-FRc92Jo zy==Z1%YS!~Gui(DV7SF+ErR^xGu&LXv0OsKMP-n&_XAF%?Co}M)Zd*PLd?aB)_7Gl z{EhsJwY=h43}!PfZSSYZV4bBUgI8Z)Zl*!WnC-6!8yFcK zK;WsM;WWf7{~OBrI`n|)7GX+xSosqM0?A~~O$ zD-FATH9PXWy78Q!BgDQY8zUX8kU*<%5FlJe9wKB{kxL4bKs|lBX~o%W5FRSEai)$y zKXJ>tzMBayQfb7isDc9)afJ@wWeXr@*n(kFd|SZIV)3hB_?_>cyE zd#_S?a4KvMm(^P4dQ{YM#OMJalg8pVP zSIZJz+i)&MKJ6s1n${%@g2_mc=T6*3pg`=BPyiHxuA-eGtI)>;exxNy;C^PRHLi?7 zp8|Q*Z*|(2DJ><5qjb8u2q*;+B$AJ=#xPSsr~H1z6|Un|6J46~CDb$v6iL>$KEE4tMsVdpqo z<&xzltdREBhB+H(rnIGK6X*>-onf_al%A&ZxZz(+(t1%aI9w6LZu(J;-Syq$MUclq z_Tm*Wv&j;>IV1qV0s*BxhLq_B!X_o8D)HS`Pt`HZ4U8f7;Y?p;k;`5*)5R^(48Js0 z01>4DLMf-9Adh~Xj$;c;zeuE?0hQe}w=s^#+C~I7GKr4VlG<
oaIDip`4*PxEz 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 literal 0 HcmV?d00001 diff --git a/tests/testthat/test-file-oneshot.R b/tests/testthat/test-file-oneshot.R index c86c81d4..e792162f 100644 --- a/tests/testthat/test-file-oneshot.R +++ b/tests/testthat/test-file-oneshot.R @@ -195,6 +195,58 @@ test_that("Full Directory Specific", { expect_true(start_time <= info_actual$atime, label="The downloaded file's last access time should not precede this function's start time.") }) +test_that("file in repeating instrument", { + testthat::skip_on_cran() + credential_repeating <- retrieve_credential_testing(3181L) + on.exit(base::unlink(returned_object_1$file_name)) + + # start_time <- Sys.time() - lubridate::seconds(1) #Knock off a second in case there's small time imprecisions + start_time <- Sys.time() - 10 #Knock off ten seconds in case there are small time imprecisions. + path_of_expected_1_1 <- system.file("test-data/levon-and-barry.jpg", package="REDCapR") + # path_of_expected_1_2 <- system.file("test-data/mugshot-1.jpg", package="REDCapR") + path_of_expected_2_1 <- system.file("test-data/mugshot-2.jpg", package="REDCapR") + info_expected_1_1 <- file.info(path_of_expected_1_1) + info_expected_2_1 <- file.info(path_of_expected_2_1) + # record <- 1 + field <- "image_profile" + + expected_outcome_message <- '^(Preparing to download the file `.+\\.jpg`\\.|.+; name=".+\\.jpg" successfully downloaded in \\d+(\\.\\d+\\W|\\W)seconds\\, and saved as .+\\.jpg)' + + # expected_outcome_message <- ".+" + suppressMessages({ + returned_object_1 <- + redcap_file_download_oneshot( + record = 1L, + field = field, + redcap_uri = credential_repeating$redcap_uri, + token = credential_repeating$token, + verbose = TRUE + ) + }) + + Sys.sleep(delay_after_download_file) + info_actual_1 <- file.info(returned_object_1$file_name) + expect_true(file.exists(returned_object_1$file_name), "The downloaded file should exist.") + + #Test the values of the returned object. + expect_true(returned_object_1$success) + expect_equal(returned_object_1$status_code, expected=200L) + expect_match(returned_object_1$outcome_message, regexp=expected_outcome_message, perl=TRUE) + expect_equal(returned_object_1$records_affected_count, 1L) + expect_equal(returned_object_1$affected_ids, "1") + expect_true(returned_object_1$elapsed_seconds>0, "The `elapsed_seconds` should be a positive number.") + expect_equal(returned_object_1$raw_text, expected="", ignore_attr = TRUE) # dput(returned_object_1$raw_text) + expect_equal(returned_object_1$file_name, "levon-and-barry.jpg", label="The name of the downloaded file should be correct.") + + #Test the values of the file. + expect_equal(info_actual_1$size, expected=info_expected_1_1$size, label="The size of the downloaded file should match.") + expect_false(info_actual_1$isdir, "The downloaded file should not be a directory.") + # expect_equal(as.character(info_actual$mode), expected=as.character(info_expected$mode), label="The mode/permissions of the downloaded file should match.") + expect_true(start_time <= info_actual_1$mtime, label="The downloaded file's modification time should not precede this function's start time.") + expect_true(start_time <= info_actual_1$ctime, label="The downloaded file's last change time should not precede this function's start time.") + expect_true(start_time <= info_actual_1$atime, label="The downloaded file's last access time should not precede this function's start time.") +}) + test_that("download file conflict -Error", { testthat::skip_on_cran() on.exit(base::unlink(returned_object_1$file_name)) From b280c56356a736249435f6263e13e2b75e4eaf37 Mon Sep 17 00:00:00 2001 From: Will Beasley Date: Thu, 5 Sep 2024 16:53:57 -0500 Subject: [PATCH 07/17] Delete levon-and-barry.jpg should have been committed ref #530 --- levon-and-barry.jpg | Bin 59265 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 levon-and-barry.jpg diff --git a/levon-and-barry.jpg b/levon-and-barry.jpg deleted file mode 100644 index c4daa24462b27c29248277810a8a9774d1a00bea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59265 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
oaIDip`4*PxEz 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 From 770165ee98da8fdb322a42863d15b3d08d61529f Mon Sep 17 00:00:00 2001 From: Will Beasley Date: Thu, 5 Sep 2024 17:04:28 -0500 Subject: [PATCH 08/17] test files in repeating instruments ref #530 --- man/redcap_file_download_oneshot.Rd | 7 +++-- tests/testthat/test-file-oneshot.R | 44 +++++++++++++++++++++++++++-- 2 files changed, 45 insertions(+), 6 deletions(-) diff --git a/man/redcap_file_download_oneshot.Rd b/man/redcap_file_download_oneshot.Rd index 9b82aae0..02ac2d46 100644 --- a/man/redcap_file_download_oneshot.Rd +++ b/man/redcap_file_download_oneshot.Rd @@ -93,9 +93,10 @@ the name stored in REDCap is used (which is the default). This function uses REDCap's API to download a file. } \details{ -Currently, the function doesn't modify any variable types to conform to -REDCap's supported variables. See \code{\link[=validate_for_write]{validate_for_write()}} for a helper -function that checks for some common important conflicts. +As of REDCap 14.6.4, for files in a repeating instrument, +you can't specify which repeating instance to download. +It always returns the file of the first instance +(within the record/patient). The function \code{redcap_download_file_oneshot()} is soft-deprecated as of REDCapR 1.2.0. diff --git a/tests/testthat/test-file-oneshot.R b/tests/testthat/test-file-oneshot.R index e792162f..7b70cb92 100644 --- a/tests/testthat/test-file-oneshot.R +++ b/tests/testthat/test-file-oneshot.R @@ -198,7 +198,10 @@ test_that("Full Directory Specific", { test_that("file in repeating instrument", { testthat::skip_on_cran() credential_repeating <- retrieve_credential_testing(3181L) - on.exit(base::unlink(returned_object_1$file_name)) + on.exit({ + base::unlink(returned_object_1$file_name) + base::unlink(returned_object_2$file_name) + }) # start_time <- Sys.time() - lubridate::seconds(1) #Knock off a second in case there's small time imprecisions start_time <- Sys.time() - 10 #Knock off ten seconds in case there are small time imprecisions. @@ -211,8 +214,9 @@ test_that("file in repeating instrument", { field <- "image_profile" expected_outcome_message <- '^(Preparing to download the file `.+\\.jpg`\\.|.+; name=".+\\.jpg" successfully downloaded in \\d+(\\.\\d+\\W|\\W)seconds\\, and saved as .+\\.jpg)' - # expected_outcome_message <- ".+" + + # ---- first record -------------------------- suppressMessages({ returned_object_1 <- redcap_file_download_oneshot( @@ -243,8 +247,42 @@ test_that("file in repeating instrument", { expect_false(info_actual_1$isdir, "The downloaded file should not be a directory.") # expect_equal(as.character(info_actual$mode), expected=as.character(info_expected$mode), label="The mode/permissions of the downloaded file should match.") expect_true(start_time <= info_actual_1$mtime, label="The downloaded file's modification time should not precede this function's start time.") - expect_true(start_time <= info_actual_1$ctime, label="The downloaded file's last change time should not precede this function's start time.") + # expect_true(start_time <= info_actual_1$ctime, label="The downloaded file's last change time should not precede this function's start time.") expect_true(start_time <= info_actual_1$atime, label="The downloaded file's last access time should not precede this function's start time.") + + # ---- second record -------------------------- + suppressMessages({ + returned_object_2 <- + redcap_file_download_oneshot( + record = 2L, + field = field, + redcap_uri = credential_repeating$redcap_uri, + token = credential_repeating$token, + verbose = TRUE + ) + }) + + Sys.sleep(delay_after_download_file) + info_actual_2 <- file.info(returned_object_2$file_name) + expect_true(file.exists(returned_object_2$file_name), "The downloaded file should exist.") + + #Test the values of the returned object. + expect_true(returned_object_2$success) + expect_equal(returned_object_2$status_code, expected=200L) + expect_match(returned_object_2$outcome_message, regexp=expected_outcome_message, perl=TRUE) + expect_equal(returned_object_2$records_affected_count, 1L) + expect_equal(returned_object_2$affected_ids, "2") + expect_true(returned_object_2$elapsed_seconds>0, "The `elapsed_seconds` should be a positive number.") + expect_equal(returned_object_2$raw_text, expected="", ignore_attr = TRUE) # dput(returned_object_1$raw_text) + expect_equal(returned_object_2$file_name, "mugshot-2.jpg", label="The name of the downloaded file should be correct.") + + #Test the values of the file. + expect_equal(info_actual_2$size, expected=info_expected_2_1$size, label="The size of the downloaded file should match.") + expect_false(info_actual_2$isdir, "The downloaded file should not be a directory.") + # expect_equal(as.character(info_actual$mode), expected=as.character(info_expected$mode), label="The mode/permissions of the downloaded file should match.") + expect_true(start_time <= info_actual_2$mtime, label="The downloaded file's modification time should not precede this function's start time.") + # expect_true(start_time <= info_actual_2$ctime, label="The downloaded file's last change time should not precede this function's start time.") + expect_true(start_time <= info_actual_2$atime, label="The downloaded file's last access time should not precede this function's start time.") }) test_that("download file conflict -Error", { From 43a855da5f600db165c85fe60055d511d215da62 Mon Sep 17 00:00:00 2001 From: Will Beasley Date: Fri, 6 Sep 2024 14:28:29 -0500 Subject: [PATCH 09/17] backup metadata before adding image field prep for #530 --- .../longitudinal-single-arm/project.xml | 27 +++++++++---------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/inst/test-data/longitudinal-single-arm/project.xml b/inst/test-data/longitudinal-single-arm/project.xml index 6049d746..528d6999 100644 --- a/inst/test-data/longitudinal-single-arm/project.xml +++ b/inst/test-data/longitudinal-single-arm/project.xml @@ -1,5 +1,5 @@ - + REDCapR Longitudinal Single Arm @@ -8,33 +8,30 @@ 1 + 1 + 1 0 0 + 1 + 0 + 0 + 1 + + 0 4 Longitudinal project with only one arm - - 0 - 0 - 0 - 0 - 0 - 1 - 0 0 ALL - + - - - - + @@ -81,7 +78,7 @@ - + From fb9129c8f36b13c78cac1d41cd7cc0f53cb2c0b4 Mon Sep 17 00:00:00 2001 From: Will Beasley Date: Fri, 6 Sep 2024 14:41:14 -0500 Subject: [PATCH 10/17] remove file download's parameter for repeating instruments ref #507 --- R/redcap-file-download-oneshot.R | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/R/redcap-file-download-oneshot.R b/R/redcap-file-download-oneshot.R index b8f89fb0..de8cd8c2 100644 --- a/R/redcap-file-download-oneshot.R +++ b/R/redcap-file-download-oneshot.R @@ -26,10 +26,10 @@ #' Required #' @param event The name of the event where the file is saved in REDCap. #' Optional -#' @param repeat_instance (only for projects with repeating instruments/events) -#' The repeat instance number of the repeating event (if longitudinal) or the -#' repeating instrument (if classic or longitudinal). Default value is '1'. -#' Optional +# @param repeat_instance (only for projects with repeating instruments/events) +# The repeat instance number of the repeating event (if longitudinal) or the +# repeating instrument (if classic or longitudinal). Default value is '1'. +# Optional #' @param verbose A boolean value indicating if `message`s should be printed #' to the R console during the operation. Optional. #' @param config_options A list of options passed to [httr::POST()]. @@ -125,7 +125,7 @@ redcap_file_download_oneshot <- function( record, field, event = "", - repeat_instance = NULL, + # repeat_instance = NULL, verbose = TRUE, config_options = NULL, handle_httr = NULL @@ -158,7 +158,7 @@ redcap_file_download_oneshot <- function( if (0L < nchar(event)) post_body$event <- event - if (!is.null(repeat_instance)) post_body$repeat_instance <- repeat_instance + # if (!is.null(repeat_instance)) post_body$repeat_instance <- repeat_instance # This is the first of two important lines in the function. # It retrieves the information from the server and stores it in RAM. From dcdda02db252cf06a1704089a0ef3532f628c40f Mon Sep 17 00:00:00 2001 From: Will Beasley Date: Fri, 6 Sep 2024 14:43:51 -0500 Subject: [PATCH 11/17] test first record's first event ref #530 --- tests/testthat/test-file-oneshot.R | 58 ++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/tests/testthat/test-file-oneshot.R b/tests/testthat/test-file-oneshot.R index 7b70cb92..3e57d452 100644 --- a/tests/testthat/test-file-oneshot.R +++ b/tests/testthat/test-file-oneshot.R @@ -195,6 +195,64 @@ test_that("Full Directory Specific", { expect_true(start_time <= info_actual$atime, label="The downloaded file's last access time should not precede this function's start time.") }) +test_that("file in longitudinal event", { + testthat::skip_on_cran() + credential_longitudinal <- retrieve_credential_testing(2629L) + on.exit({ + base::unlink(returned_object_1$file_name) + # base::unlink(returned_object_2$file_name) + }) + + # start_time <- Sys.time() - lubridate::seconds(1) #Knock off a second in case there's small time imprecisions + start_time <- Sys.time() - 10 #Knock off ten seconds in case there are small time imprecisions. + path_of_expected_1_1 <- system.file("test-data/mugshot-1.jpg", package="REDCapR") + # path_of_expected_1_2 <- system.file("test-data/mugshot-1.jpg", package="REDCapR") + # path_of_expected_2_1 <- system.file("test-data/mugshot-2.jpg", package="REDCapR") + info_expected_1_1 <- file.info(path_of_expected_1_1) + # info_expected_2_1 <- file.info(path_of_expected_2_1) + # record <- 1 + field <- "image_profile" + + expected_outcome_message <- '^(Preparing to download the file `.+\\.jpg`\\.|.+; name=".+\\.jpg" successfully downloaded in \\d+(\\.\\d+\\W|\\W)seconds\\, and saved as .+\\.jpg)' + # expected_outcome_message <- ".+" + + # ---- first record, first event -------------------------- + suppressMessages({ + returned_object_1_1 <- + redcap_file_download_oneshot( + record = 1L, + event = "intake_arm_1", + field = field, + redcap_uri = credential_longitudinal$redcap_uri, + token = credential_longitudinal$token, + verbose = TRUE + ) + }) + + Sys.sleep(delay_after_download_file) + info_actual_1_1 <- file.info(returned_object_1_1$file_name) + expect_true(file.exists(returned_object_1_1$file_name), "The downloaded file should exist.") + + #Test the values of the returned object. + expect_true(returned_object_1_1$success) + expect_equal(returned_object_1_1$status_code, expected=200L) + expect_match(returned_object_1_1$outcome_message, regexp=expected_outcome_message, perl=TRUE) + expect_equal(returned_object_1_1$records_affected_count, 1L) + expect_equal(returned_object_1_1$affected_ids, "1") + expect_true(returned_object_1_1$elapsed_seconds>0, "The `elapsed_seconds` should be a positive number.") + expect_equal(returned_object_1_1$raw_text, expected="", ignore_attr = TRUE) # dput(returned_object_1$raw_text) + expect_equal(returned_object_1_1$file_name, "mugshot-1.jpg", label="The name of the downloaded file should be correct.") + + #Test the values of the file. + expect_equal(info_actual_1_1$size, expected=info_expected_1_1$size, label="The size of the downloaded file should match.") + expect_false(info_actual_1_1$isdir, "The downloaded file should not be a directory.") + # expect_equal(as.character(info_actual_1_1$mode), expected=as.character(info_expected$mode), label="The mode/permissions of the downloaded file should match.") + expect_true(start_time <= info_actual_1_1$mtime, label="The downloaded file's modification time should not precede this function's start time.") + # expect_true(start_time <= info_actual_1_1$ctime, label="The downloaded file's last change time should not precede this function's start time.") + expect_true(start_time <= info_actual_1_1$atime, label="The downloaded file's last access time should not precede this function's start time.") + +}) + test_that("file in repeating instrument", { testthat::skip_on_cran() credential_repeating <- retrieve_credential_testing(3181L) From c062e3300d8a3af4cc3420d8469688557283b306 Mon Sep 17 00:00:00 2001 From: Will Beasley Date: Fri, 6 Sep 2024 14:48:09 -0500 Subject: [PATCH 12/17] test first record, second event ref #530 --- tests/testthat/test-file-oneshot.R | 43 +++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/tests/testthat/test-file-oneshot.R b/tests/testthat/test-file-oneshot.R index 3e57d452..72976ec9 100644 --- a/tests/testthat/test-file-oneshot.R +++ b/tests/testthat/test-file-oneshot.R @@ -199,17 +199,17 @@ test_that("file in longitudinal event", { testthat::skip_on_cran() credential_longitudinal <- retrieve_credential_testing(2629L) on.exit({ - base::unlink(returned_object_1$file_name) - # base::unlink(returned_object_2$file_name) + base::unlink(returned_object_1_1$file_name) + base::unlink(returned_object_1_2$file_name) }) # start_time <- Sys.time() - lubridate::seconds(1) #Knock off a second in case there's small time imprecisions start_time <- Sys.time() - 10 #Knock off ten seconds in case there are small time imprecisions. path_of_expected_1_1 <- system.file("test-data/mugshot-1.jpg", package="REDCapR") - # path_of_expected_1_2 <- system.file("test-data/mugshot-1.jpg", package="REDCapR") + path_of_expected_1_2 <- system.file("test-data/mugshot-2.jpg", package="REDCapR") # path_of_expected_2_1 <- system.file("test-data/mugshot-2.jpg", package="REDCapR") info_expected_1_1 <- file.info(path_of_expected_1_1) - # info_expected_2_1 <- file.info(path_of_expected_2_1) + info_expected_1_2 <- file.info(path_of_expected_1_2) # record <- 1 field <- "image_profile" @@ -251,6 +251,41 @@ test_that("file in longitudinal event", { # expect_true(start_time <= info_actual_1_1$ctime, label="The downloaded file's last change time should not precede this function's start time.") expect_true(start_time <= info_actual_1_1$atime, label="The downloaded file's last access time should not precede this function's start time.") + # ---- first record, second event -------------------------- + suppressMessages({ + returned_object_1_2 <- + redcap_file_download_oneshot( + record = 1L, + event = "dischage_arm_1", + field = field, + redcap_uri = credential_longitudinal$redcap_uri, + token = credential_longitudinal$token, + verbose = TRUE + ) + }) + + Sys.sleep(delay_after_download_file) + info_actual_1_2 <- file.info(returned_object_1_2$file_name) + expect_true(file.exists(returned_object_1_2$file_name), "The downloaded file should exist.") + + #Test the values of the returned object. + expect_true(returned_object_1_2$success) + expect_equal(returned_object_1_2$status_code, expected=200L) + expect_match(returned_object_1_2$outcome_message, regexp=expected_outcome_message, perl=TRUE) + expect_equal(returned_object_1_2$records_affected_count, 1L) + expect_equal(returned_object_1_2$affected_ids, "1") + expect_true(returned_object_1_2$elapsed_seconds>0, "The `elapsed_seconds` should be a positive number.") + expect_equal(returned_object_1_2$raw_text, expected="", ignore_attr = TRUE) # dput(returned_object_1$raw_text) + expect_equal(returned_object_1_2$file_name, "mugshot-2.jpg", label="The name of the downloaded file should be correct.") + + #Test the values of the file. + expect_equal(info_actual_1_2$size, expected=info_expected_1_2$size, label="The size of the downloaded file should match.") + expect_false(info_actual_1_2$isdir, "The downloaded file should not be a directory.") + # expect_equal(as.character(info_actual_1_2$mode), expected=as.character(info_expected$mode), label="The mode/permissions of the downloaded file should match.") + expect_true(start_time <= info_actual_1_2$mtime, label="The downloaded file's modification time should not precede this function's start time.") + # expect_true(start_time <= info_actual_1_2$ctime, label="The downloaded file's last change time should not precede this function's start time.") + expect_true(start_time <= info_actual_1_2$atime, label="The downloaded file's last access time should not precede this function's start time.") + }) test_that("file in repeating instrument", { From 0b6bbf5135ea0792f224c4cf63c8c2d929ab62c6 Mon Sep 17 00:00:00 2001 From: Will Beasley Date: Fri, 6 Sep 2024 14:52:07 -0500 Subject: [PATCH 13/17] test second record's second event close #530 --- tests/testthat/test-file-oneshot.R | 41 ++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/tests/testthat/test-file-oneshot.R b/tests/testthat/test-file-oneshot.R index 72976ec9..37f8b603 100644 --- a/tests/testthat/test-file-oneshot.R +++ b/tests/testthat/test-file-oneshot.R @@ -47,7 +47,7 @@ test_that("NameComesFromREDCap", { expect_false(info_actual$isdir, "The downloaded file should not be a directory.") # expect_equal(as.character(info_actual$mode), expected=as.character(info_expected$mode), label="The mode/permissions of the downloaded file should match.") expect_true(start_time <= info_actual$mtime, label="The downloaded file's modification time should not precede this function's start time.") - expect_true(start_time <= info_actual$ctime, label="The downloaded file's last change time should not precede this function's start time.") + # expect_true(start_time <= info_actual$ctime, label="The downloaded file's last change time should not precede this function's start time.") expect_true(start_time <= info_actual$atime, label="The downloaded file's last access time should not precede this function's start time.") }) @@ -201,15 +201,17 @@ test_that("file in longitudinal event", { on.exit({ base::unlink(returned_object_1_1$file_name) base::unlink(returned_object_1_2$file_name) + base::unlink(returned_object_2_2$file_name) }) # start_time <- Sys.time() - lubridate::seconds(1) #Knock off a second in case there's small time imprecisions start_time <- Sys.time() - 10 #Knock off ten seconds in case there are small time imprecisions. path_of_expected_1_1 <- system.file("test-data/mugshot-1.jpg", package="REDCapR") path_of_expected_1_2 <- system.file("test-data/mugshot-2.jpg", package="REDCapR") - # path_of_expected_2_1 <- system.file("test-data/mugshot-2.jpg", package="REDCapR") + path_of_expected_2_2 <- system.file("test-data/mugshot-5.jpg", package="REDCapR") info_expected_1_1 <- file.info(path_of_expected_1_1) info_expected_1_2 <- file.info(path_of_expected_1_2) + info_expected_2_2 <- file.info(path_of_expected_2_2) # record <- 1 field <- "image_profile" @@ -286,6 +288,41 @@ test_that("file in longitudinal event", { # expect_true(start_time <= info_actual_1_2$ctime, label="The downloaded file's last change time should not precede this function's start time.") expect_true(start_time <= info_actual_1_2$atime, label="The downloaded file's last access time should not precede this function's start time.") + # ---- second record, second event -------------------------- + suppressMessages({ + returned_object_2_2 <- + redcap_file_download_oneshot( + record = 2L, + event = "dischage_arm_1", + field = field, + redcap_uri = credential_longitudinal$redcap_uri, + token = credential_longitudinal$token, + verbose = TRUE + ) + }) + + Sys.sleep(delay_after_download_file) + info_actual_2_2 <- file.info(returned_object_2_2$file_name) + expect_true(file.exists(returned_object_2_2$file_name), "The downloaded file should exist.") + + #Test the values of the returned object. + expect_true(returned_object_2_2$success) + expect_equal(returned_object_2_2$status_code, expected=200L) + expect_match(returned_object_2_2$outcome_message, regexp=expected_outcome_message, perl=TRUE) + expect_equal(returned_object_2_2$records_affected_count, 1L) + expect_equal(returned_object_2_2$affected_ids, "2") + expect_true(returned_object_2_2$elapsed_seconds>0, "The `elapsed_seconds` should be a positive number.") + expect_equal(returned_object_2_2$raw_text, expected="", ignore_attr = TRUE) # dput(returned_object_1$raw_text) + expect_equal(returned_object_2_2$file_name, "mugshot-5.jpg", label="The name of the downloaded file should be correct.") + + #Test the values of the file. + expect_equal(info_actual_2_2$size, expected=info_expected_2_2$size, label="The size of the downloaded file should match.") + expect_false(info_actual_2_2$isdir, "The downloaded file should not be a directory.") + # expect_equal(as.character(info_actual_2_2$mode), expected=as.character(info_expected$mode), label="The mode/permissions of the downloaded file should match.") + expect_true(start_time <= info_actual_2_2$mtime, label="The downloaded file's modification time should not precede this function's start time.") + # expect_true(start_time <= info_actual_2_2$ctime, label="The downloaded file's last change time should not precede this function's start time.") + expect_true(start_time <= info_actual_2_2$atime, label="The downloaded file's last access time should not precede this function's start time.") + }) test_that("file in repeating instrument", { From 32e8aa5d79600868758e2ed51c4a4666baa7d33c Mon Sep 17 00:00:00 2001 From: Will Beasley Date: Fri, 6 Sep 2024 14:52:56 -0500 Subject: [PATCH 14/17] decrease waiting time between tests ref #530 --- tests/testthat/test-file-oneshot.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/testthat/test-file-oneshot.R b/tests/testthat/test-file-oneshot.R index 37f8b603..afa38b06 100644 --- a/tests/testthat/test-file-oneshot.R +++ b/tests/testthat/test-file-oneshot.R @@ -1,7 +1,7 @@ library(testthat) credential <- retrieve_credential_testing() -delay_after_download_file <- 1.0 # In seconds +delay_after_download_file <- 0.5 # In seconds test_that("NameComesFromREDCap", { testthat::skip_on_cran() From e9f19d40d29b01a4f1b3f20ad1044dc8d19a4b4b Mon Sep 17 00:00:00 2001 From: Will Beasley Date: Fri, 6 Sep 2024 15:16:18 -0500 Subject: [PATCH 15/17] reintroduce repeat_instance ref #530 --- R/redcap-file-download-oneshot.R | 12 ++--- tests/testthat/test-file-oneshot.R | 76 ++++++++++++++++-------------- 2 files changed, 46 insertions(+), 42 deletions(-) diff --git a/R/redcap-file-download-oneshot.R b/R/redcap-file-download-oneshot.R index de8cd8c2..b8f89fb0 100644 --- a/R/redcap-file-download-oneshot.R +++ b/R/redcap-file-download-oneshot.R @@ -26,10 +26,10 @@ #' Required #' @param event The name of the event where the file is saved in REDCap. #' Optional -# @param repeat_instance (only for projects with repeating instruments/events) -# The repeat instance number of the repeating event (if longitudinal) or the -# repeating instrument (if classic or longitudinal). Default value is '1'. -# Optional +#' @param repeat_instance (only for projects with repeating instruments/events) +#' The repeat instance number of the repeating event (if longitudinal) or the +#' repeating instrument (if classic or longitudinal). Default value is '1'. +#' Optional #' @param verbose A boolean value indicating if `message`s should be printed #' to the R console during the operation. Optional. #' @param config_options A list of options passed to [httr::POST()]. @@ -125,7 +125,7 @@ redcap_file_download_oneshot <- function( record, field, event = "", - # repeat_instance = NULL, + repeat_instance = NULL, verbose = TRUE, config_options = NULL, handle_httr = NULL @@ -158,7 +158,7 @@ redcap_file_download_oneshot <- function( if (0L < nchar(event)) post_body$event <- event - # if (!is.null(repeat_instance)) post_body$repeat_instance <- repeat_instance + if (!is.null(repeat_instance)) post_body$repeat_instance <- repeat_instance # This is the first of two important lines in the function. # It retrieves the information from the server and stores it in RAM. diff --git a/tests/testthat/test-file-oneshot.R b/tests/testthat/test-file-oneshot.R index afa38b06..a9ed81c1 100644 --- a/tests/testthat/test-file-oneshot.R +++ b/tests/testthat/test-file-oneshot.R @@ -329,8 +329,8 @@ test_that("file in repeating instrument", { testthat::skip_on_cran() credential_repeating <- retrieve_credential_testing(3181L) on.exit({ - base::unlink(returned_object_1$file_name) - base::unlink(returned_object_2$file_name) + base::unlink(returned_object_1_1$file_name) + base::unlink(returned_object_2_1$file_name) }) # start_time <- Sys.time() - lubridate::seconds(1) #Knock off a second in case there's small time imprecisions @@ -346,12 +346,13 @@ test_that("file in repeating instrument", { expected_outcome_message <- '^(Preparing to download the file `.+\\.jpg`\\.|.+; name=".+\\.jpg" successfully downloaded in \\d+(\\.\\d+\\W|\\W)seconds\\, and saved as .+\\.jpg)' # expected_outcome_message <- ".+" - # ---- first record -------------------------- + # ---- first record, first instance -------------------------- suppressMessages({ - returned_object_1 <- + returned_object_1_1 <- redcap_file_download_oneshot( record = 1L, field = field, + repeat_instance = "1", redcap_uri = credential_repeating$redcap_uri, token = credential_repeating$token, verbose = TRUE @@ -359,33 +360,36 @@ test_that("file in repeating instrument", { }) Sys.sleep(delay_after_download_file) - info_actual_1 <- file.info(returned_object_1$file_name) - expect_true(file.exists(returned_object_1$file_name), "The downloaded file should exist.") + info_actual_1_1 <- file.info(returned_object_1_1$file_name) + expect_true(file.exists(returned_object_1_1$file_name), "The downloaded file should exist.") #Test the values of the returned object. - expect_true(returned_object_1$success) - expect_equal(returned_object_1$status_code, expected=200L) - expect_match(returned_object_1$outcome_message, regexp=expected_outcome_message, perl=TRUE) - expect_equal(returned_object_1$records_affected_count, 1L) - expect_equal(returned_object_1$affected_ids, "1") - expect_true(returned_object_1$elapsed_seconds>0, "The `elapsed_seconds` should be a positive number.") - expect_equal(returned_object_1$raw_text, expected="", ignore_attr = TRUE) # dput(returned_object_1$raw_text) - expect_equal(returned_object_1$file_name, "levon-and-barry.jpg", label="The name of the downloaded file should be correct.") + expect_true(returned_object_1_1$success) + expect_equal(returned_object_1_1$status_code, expected=200L) + expect_match(returned_object_1_1$outcome_message, regexp=expected_outcome_message, perl=TRUE) + expect_equal(returned_object_1_1$records_affected_count, 1L) + expect_equal(returned_object_1_1$affected_ids, "1") + expect_true(returned_object_1_1$elapsed_seconds>0, "The `elapsed_seconds` should be a positive number.") + expect_equal(returned_object_1_1$raw_text, expected="", ignore_attr = TRUE) # dput(returned_object_1$raw_text) + expect_equal(returned_object_1_1$file_name, "levon-and-barry.jpg", label="The name of the downloaded file should be correct.") #Test the values of the file. - expect_equal(info_actual_1$size, expected=info_expected_1_1$size, label="The size of the downloaded file should match.") - expect_false(info_actual_1$isdir, "The downloaded file should not be a directory.") + expect_equal(info_actual_1_1$size, expected=info_expected_1_1$size, label="The size of the downloaded file should match.") + expect_false(info_actual_1_1$isdir, "The downloaded file should not be a directory.") # expect_equal(as.character(info_actual$mode), expected=as.character(info_expected$mode), label="The mode/permissions of the downloaded file should match.") - expect_true(start_time <= info_actual_1$mtime, label="The downloaded file's modification time should not precede this function's start time.") - # expect_true(start_time <= info_actual_1$ctime, label="The downloaded file's last change time should not precede this function's start time.") - expect_true(start_time <= info_actual_1$atime, label="The downloaded file's last access time should not precede this function's start time.") + expect_true(start_time <= info_actual_1_1$mtime, label="The downloaded file's modification time should not precede this function's start time.") + # expect_true(start_time <= info_actual_1_1$ctime, label="The downloaded file's last change time should not precede this function's start time.") + expect_true(start_time <= info_actual_1_1$atime, label="The downloaded file's last access time should not precede this function's start time.") - # ---- second record -------------------------- + # ---- first record, second instance -------------------------- + + # ---- second record, first instance -------------------------- suppressMessages({ - returned_object_2 <- + returned_object_2_1 <- redcap_file_download_oneshot( record = 2L, field = field, + repeat_instance = "1", redcap_uri = credential_repeating$redcap_uri, token = credential_repeating$token, verbose = TRUE @@ -393,26 +397,26 @@ test_that("file in repeating instrument", { }) Sys.sleep(delay_after_download_file) - info_actual_2 <- file.info(returned_object_2$file_name) - expect_true(file.exists(returned_object_2$file_name), "The downloaded file should exist.") + info_actual_2_1 <- file.info(returned_object_2_1$file_name) + expect_true(file.exists(returned_object_2_1$file_name), "The downloaded file should exist.") #Test the values of the returned object. - expect_true(returned_object_2$success) - expect_equal(returned_object_2$status_code, expected=200L) - expect_match(returned_object_2$outcome_message, regexp=expected_outcome_message, perl=TRUE) - expect_equal(returned_object_2$records_affected_count, 1L) - expect_equal(returned_object_2$affected_ids, "2") - expect_true(returned_object_2$elapsed_seconds>0, "The `elapsed_seconds` should be a positive number.") - expect_equal(returned_object_2$raw_text, expected="", ignore_attr = TRUE) # dput(returned_object_1$raw_text) - expect_equal(returned_object_2$file_name, "mugshot-2.jpg", label="The name of the downloaded file should be correct.") + expect_true(returned_object_2_1$success) + expect_equal(returned_object_2_1$status_code, expected=200L) + expect_match(returned_object_2_1$outcome_message, regexp=expected_outcome_message, perl=TRUE) + expect_equal(returned_object_2_1$records_affected_count, 1L) + expect_equal(returned_object_2_1$affected_ids, "2") + expect_true(returned_object_2_1$elapsed_seconds>0, "The `elapsed_seconds` should be a positive number.") + expect_equal(returned_object_2_1$raw_text, expected="", ignore_attr = TRUE) # dput(returned_object_1$raw_text) + expect_equal(returned_object_2_1$file_name, "mugshot-2.jpg", label="The name of the downloaded file should be correct.") #Test the values of the file. - expect_equal(info_actual_2$size, expected=info_expected_2_1$size, label="The size of the downloaded file should match.") - expect_false(info_actual_2$isdir, "The downloaded file should not be a directory.") + expect_equal(info_actual_2_1$size, expected=info_expected_2_1$size, label="The size of the downloaded file should match.") + expect_false(info_actual_2_1$isdir, "The downloaded file should not be a directory.") # expect_equal(as.character(info_actual$mode), expected=as.character(info_expected$mode), label="The mode/permissions of the downloaded file should match.") - expect_true(start_time <= info_actual_2$mtime, label="The downloaded file's modification time should not precede this function's start time.") - # expect_true(start_time <= info_actual_2$ctime, label="The downloaded file's last change time should not precede this function's start time.") - expect_true(start_time <= info_actual_2$atime, label="The downloaded file's last access time should not precede this function's start time.") + expect_true(start_time <= info_actual_2_1$mtime, label="The downloaded file's modification time should not precede this function's start time.") + # expect_true(start_time <= info_actual_2_1$ctime, label="The downloaded file's last change time should not precede this function's start time.") + expect_true(start_time <= info_actual_2_1$atime, label="The downloaded file's last access time should not precede this function's start time.") }) test_that("download file conflict -Error", { From df0e219a6983709b169f5a18bdc058cd5bc0f197 Mon Sep 17 00:00:00 2001 From: Will Beasley Date: Fri, 6 Sep 2024 15:20:17 -0500 Subject: [PATCH 16/17] test 2nd instance ref #530 --- tests/testthat/test-file-oneshot.R | 39 ++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/tests/testthat/test-file-oneshot.R b/tests/testthat/test-file-oneshot.R index a9ed81c1..a88e1cc1 100644 --- a/tests/testthat/test-file-oneshot.R +++ b/tests/testthat/test-file-oneshot.R @@ -330,17 +330,18 @@ test_that("file in repeating instrument", { credential_repeating <- retrieve_credential_testing(3181L) on.exit({ base::unlink(returned_object_1_1$file_name) + base::unlink(returned_object_1_2$file_name) base::unlink(returned_object_2_1$file_name) }) # start_time <- Sys.time() - lubridate::seconds(1) #Knock off a second in case there's small time imprecisions start_time <- Sys.time() - 10 #Knock off ten seconds in case there are small time imprecisions. path_of_expected_1_1 <- system.file("test-data/levon-and-barry.jpg", package="REDCapR") - # path_of_expected_1_2 <- system.file("test-data/mugshot-1.jpg", package="REDCapR") + path_of_expected_1_2 <- system.file("test-data/mugshot-1.jpg", package="REDCapR") path_of_expected_2_1 <- system.file("test-data/mugshot-2.jpg", package="REDCapR") info_expected_1_1 <- file.info(path_of_expected_1_1) + info_expected_1_2 <- file.info(path_of_expected_1_2) info_expected_2_1 <- file.info(path_of_expected_2_1) - # record <- 1 field <- "image_profile" expected_outcome_message <- '^(Preparing to download the file `.+\\.jpg`\\.|.+; name=".+\\.jpg" successfully downloaded in \\d+(\\.\\d+\\W|\\W)seconds\\, and saved as .+\\.jpg)' @@ -382,6 +383,40 @@ test_that("file in repeating instrument", { expect_true(start_time <= info_actual_1_1$atime, label="The downloaded file's last access time should not precede this function's start time.") # ---- first record, second instance -------------------------- + suppressMessages({ + returned_object_1_2 <- + redcap_file_download_oneshot( + record = 1L, + field = field, + repeat_instance = "2", + redcap_uri = credential_repeating$redcap_uri, + token = credential_repeating$token, + verbose = TRUE + ) + }) + + Sys.sleep(delay_after_download_file) + info_actual_1_2 <- file.info(returned_object_1_2$file_name) + expect_true(file.exists(returned_object_1_2$file_name), "The downloaded file should exist.") + + #Test the values of the returned object. + expect_true(returned_object_1_2$success) + expect_equal(returned_object_1_2$status_code, expected=200L) + expect_match(returned_object_1_2$outcome_message, regexp=expected_outcome_message, perl=TRUE) + expect_equal(returned_object_1_2$records_affected_count, 1L) + expect_equal(returned_object_1_2$affected_ids, "1") + expect_true(returned_object_1_2$elapsed_seconds>0, "The `elapsed_seconds` should be a positive number.") + expect_equal(returned_object_1_2$raw_text, expected="", ignore_attr = TRUE) # dput(returned_object_1$raw_text) + expect_equal(returned_object_1_2$file_name, "mugshot-1.jpg", label="The name of the downloaded file should be correct.") + + #Test the values of the file. + expect_equal(info_actual_1_2$size, expected=info_expected_1_2$size, label="The size of the downloaded file should match.") + expect_false(info_actual_1_2$isdir, "The downloaded file should not be a directory.") + # expect_equal(as.character(info_actual_1_2$mode), expected=as.character(info_expected$mode), label="The mode/permissions of the downloaded file should match.") + expect_true(start_time <= info_actual_1_2$mtime, label="The downloaded file's modification time should not precede this function's start time.") + # expect_true(start_time <= info_actual_1_2$ctime, label="The downloaded file's last change time should not precede this function's start time.") + expect_true(start_time <= info_actual_1_2$atime, label="The downloaded file's last access time should not precede this function's start time.") + # ---- second record, first instance -------------------------- suppressMessages({ From c95eeca3542b282d0cef7b61830f1f7b8d1f8122 Mon Sep 17 00:00:00 2001 From: Will Beasley Date: Fri, 6 Sep 2024 15:35:50 -0500 Subject: [PATCH 17/17] bump version and attribute improvement to @BlairCooper close #506 --- DESCRIPTION | 2 +- NEWS.md | 5 +++-- R/redcap-file-download-oneshot.R | 6 ++---- man/redcap_file_download_oneshot.Rd | 6 ++---- tests/testthat/test-file-oneshot.R | 1 - 5 files changed, 8 insertions(+), 12 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 3ac60478..f73d0309 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -6,7 +6,7 @@ Description: Encapsulates functions to streamline calls from R to the REDCap University. The Application Programming Interface (API) offers an avenue to access and modify data programmatically, improving the capacity for literate and reproducible programming. -Version: 1.1.9006 +Version: 1.1.9007 Authors@R: c(person("Will", "Beasley", role = c("aut", "cre"), email = "wibeasley@hotmail.com", comment = c(ORCID = "0000-0002-5613-5006")), person("David", "Bard", role = "ctb", comment = c(ORCID = "0000-0002-3922-8489")), diff --git a/NEWS.md b/NEWS.md index cf3b6bc6..f9ed1f7d 100644 --- a/NEWS.md +++ b/NEWS.md @@ -72,8 +72,8 @@ This will help extract forms from longitudinal & repeating projects. * `read_read_oneshot()`'s parameter `guess_max` now allows floating point values to support `readr::read_csv()` ability to accept a Inf value. (Suggested by @eveyp, #392) * pkgdown pages run & display the examples, but CRAN still doesn't run them. It's illegal to call external resources/APIs from CRAN computers --mostly because they are occasionally unavailable, so the code breaks. (#419) * Renamed some functions to follow a consistent pattern. Old names will be soft-deprecated for a while before being removed. (#416) - * `redcap_download_file_oneshot()` to `redcap_file_download_opneshot()` - * `redcap_file_upload_oneshot()` to `redcap_file_upload_opneshot()` + * `redcap_download_file_oneshot()` to `redcap_file_download_oneshot()` + * `redcap_file_upload_oneshot()` to `redcap_file_upload_oneshot()` * `redcap_download_instrument()` to `redcap_instrument_download()` * `redcap_dag_read()` has new `data_access_group_id` field (introduced maybe in [13.1.0](https://redcap.vanderbilt.edu/community/post.php?id=13)) (#459) @@ -93,6 +93,7 @@ This will help extract forms from longitudinal & repeating projects. * `redcap_read()` checks the `event` parameter and throws an error if a value is not recognized, or the project is not longitudinal (#493) * The regex in `regex_named_captures()` is forgiving if there's an unnecessary leading space (@BlairCooper, #495, #501) * `redcap_log_read()` assumes all columns are character, except for `timestamp` (#525) +* `redcap_file_download_oneshot()` no longer asks for the unnecessary parameter for `repeating_instrument` (that the REDCap server ignores). (@BlairCooper, #506, #530) Version 1.1.0 (released 2022-08-10) ========================================================== diff --git a/R/redcap-file-download-oneshot.R b/R/redcap-file-download-oneshot.R index b8f89fb0..81bf4966 100644 --- a/R/redcap-file-download-oneshot.R +++ b/R/redcap-file-download-oneshot.R @@ -58,10 +58,8 @@ #' the name stored in REDCap is used (which is the default). #' #' @details -#' As of REDCap 14.6.4, for files in a repeating instrument, -#' you can't specify which repeating instance to download. -#' It always returns the file of the first instance -#' (within the record/patient). +#' For files in a repeating instrument, don't specify `repeating_instrument`. +#' The server only needs `field` (name) and `repeating_instance`. #' #' The function `redcap_download_file_oneshot()` is soft-deprecated #' as of REDCapR 1.2.0. diff --git a/man/redcap_file_download_oneshot.Rd b/man/redcap_file_download_oneshot.Rd index 9bfd6ea3..a40d2676 100644 --- a/man/redcap_file_download_oneshot.Rd +++ b/man/redcap_file_download_oneshot.Rd @@ -88,10 +88,8 @@ the name stored in REDCap is used (which is the default). This function uses REDCap's API to download a file. } \details{ -As of REDCap 14.6.4, for files in a repeating instrument, -you can't specify which repeating instance to download. -It always returns the file of the first instance -(within the record/patient). +For files in a repeating instrument, don't specify \code{repeating_instrument}. +The server only needs \code{field} (name) and \code{repeating_instance}. The function \code{redcap_download_file_oneshot()} is soft-deprecated as of REDCapR 1.2.0. diff --git a/tests/testthat/test-file-oneshot.R b/tests/testthat/test-file-oneshot.R index a88e1cc1..331995d3 100644 --- a/tests/testthat/test-file-oneshot.R +++ b/tests/testthat/test-file-oneshot.R @@ -417,7 +417,6 @@ test_that("file in repeating instrument", { # expect_true(start_time <= info_actual_1_2$ctime, label="The downloaded file's last change time should not precede this function's start time.") expect_true(start_time <= info_actual_1_2$atime, label="The downloaded file's last access time should not precede this function's start time.") - # ---- second record, first instance -------------------------- suppressMessages({ returned_object_2_1 <-