From 9f2e89f649e8307948fc0a2c647d5dae5c1e5a00 Mon Sep 17 00:00:00 2001 From: AntonioFrische Date: Sat, 26 Nov 2022 12:58:58 +0100 Subject: [PATCH] add de inicio mas la ayuda --- pom.xml | 4 +- .../perifericosAdvisor/MovieAdvisorApp.java | 22 ++++ .../perifericosAdvisor/MovieAdvisorHelp.java | 36 +++++++ .../MovieAdvisorRunApp.java | 97 ++++++++++++++++++ .../service/PerifericoQueryServiceImpl.java | 4 +- src/main/resources/ayuda.txt | 51 +++++---- .../19-MovieAdvisor/pom.properties | 7 ++ .../19-MovieAdvisor/pom.xml | 22 ++++ .../PerifericoAdvisor/pom.properties | 7 ++ .../PerifericoAdvisor/pom.xml | 22 ++++ target/classes/ayuda.txt | 51 +++++---- .../perifericosAdvisor/MovieAdvisorApp.class | Bin 0 -> 1077 bytes .../perifericosAdvisor/MovieAdvisorHelp.class | Bin 0 -> 1599 bytes .../MovieAdvisorRunApp.class | Bin 0 -> 1102 bytes .../service/PerifericoQueryServiceImpl.class | Bin 5167 -> 5158 bytes 15 files changed, 263 insertions(+), 60 deletions(-) create mode 100644 src/main/java/com/antoniofrische/perifericosAdvisor/MovieAdvisorApp.java create mode 100644 src/main/java/com/antoniofrische/perifericosAdvisor/MovieAdvisorHelp.java create mode 100644 src/main/java/com/antoniofrische/perifericosAdvisor/MovieAdvisorRunApp.java create mode 100644 target/classes/META-INF/maven/com.antoniofrische/19-MovieAdvisor/pom.properties create mode 100644 target/classes/META-INF/maven/com.antoniofrische/19-MovieAdvisor/pom.xml create mode 100644 target/classes/META-INF/maven/com.antoniofrische/PerifericoAdvisor/pom.properties create mode 100644 target/classes/META-INF/maven/com.antoniofrische/PerifericoAdvisor/pom.xml create mode 100644 target/classes/com/antoniofrische/perifericosAdvisor/MovieAdvisorApp.class create mode 100644 target/classes/com/antoniofrische/perifericosAdvisor/MovieAdvisorHelp.class create mode 100644 target/classes/com/antoniofrische/perifericosAdvisor/MovieAdvisorRunApp.class diff --git a/pom.xml b/pom.xml index 7b51679..7ed8a41 100644 --- a/pom.xml +++ b/pom.xml @@ -2,8 +2,8 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.openwebinars - 19-MovieAdvisor + com.antoniofrische + PerifericoAdvisor 0.0.1-SNAPSHOT 19-MovieAdvisor Ejemplo que integra todos los conocimientos del curso de Spring. diff --git a/src/main/java/com/antoniofrische/perifericosAdvisor/MovieAdvisorApp.java b/src/main/java/com/antoniofrische/perifericosAdvisor/MovieAdvisorApp.java new file mode 100644 index 0000000..c2728ba --- /dev/null +++ b/src/main/java/com/antoniofrische/perifericosAdvisor/MovieAdvisorApp.java @@ -0,0 +1,22 @@ +package com.antoniofrische.perifericosAdvisor; + +import com.antoniofrische.perifericosAdvisor.config.AppConfig; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; + + +public class MovieAdvisorApp { + + public static void main(String[] args) { + + ApplicationContext appContext = new AnnotationConfigApplicationContext(AppConfig.class); + + MovieAdvisorRunApp runApp = appContext.getBean(MovieAdvisorRunApp.class); + + runApp.run(args); + + ((AnnotationConfigApplicationContext) appContext).close(); + + } + +} diff --git a/src/main/java/com/antoniofrische/perifericosAdvisor/MovieAdvisorHelp.java b/src/main/java/com/antoniofrische/perifericosAdvisor/MovieAdvisorHelp.java new file mode 100644 index 0000000..36182b3 --- /dev/null +++ b/src/main/java/com/antoniofrische/perifericosAdvisor/MovieAdvisorHelp.java @@ -0,0 +1,36 @@ +package com.antoniofrische.perifericosAdvisor; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.stream.Collectors; + +import org.springframework.stereotype.Component; +import org.springframework.util.ResourceUtils; + + +@Component +public class MovieAdvisorHelp { + + private String help; + + + public void init() { + try { + // @formatter:off + help = Files + .lines(Paths.get(ResourceUtils.getFile("classpath:ayuda.txt").toURI())) + .collect(Collectors.joining("\n")); + // @formatter:on + + } catch (IOException e) { + System.err.println("Error cargando el texto de ayuda"); + System.exit(-1); + } + } + + public String getHelp() { + return help; + } + +} diff --git a/src/main/java/com/antoniofrische/perifericosAdvisor/MovieAdvisorRunApp.java b/src/main/java/com/antoniofrische/perifericosAdvisor/MovieAdvisorRunApp.java new file mode 100644 index 0000000..e11f7f2 --- /dev/null +++ b/src/main/java/com/antoniofrische/perifericosAdvisor/MovieAdvisorRunApp.java @@ -0,0 +1,97 @@ +package com.antoniofrische.perifericosAdvisor; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.antoniofrische.perifericosAdvisor.model.Periferico; +import com.antoniofrische.perifericosAdvisor.service.PerifericoQueryService; +import com.antoniofrische.perifericosAdvisor.service.PerifericoService; + +@Component +public class MovieAdvisorRunApp { + + @Autowired + PerifericoService perifericoService; + + @Autowired + PerifericoQueryService perifericoQueryService; + + @Autowired + MovieAdvisorHelp help; + + public void run(String[] args) { + + if (args.length < 1) { + System.out.println("Error de sintaxis"); + System.out.println(help.getHelp()); + } else if (args.length == 1) { + switch (args[0].toLowerCase()) { + case "-lg": + perifericoService.findAllTipo().forEach(System.out::println); + break; + case "-h": + System.out.println(help.getHelp()); + break; + default: + System.out.println("Error de sintaxis"); + System.out.println(help.getHelp()); + + } + } else if (args.length % 2 != 0) { + System.out.println("Error de sintaxis"); + System.out.println(help.getHelp()); + } else if (args.length > 8) { + System.out.println("Error de sintaxis"); + System.out.println(help.getHelp()); + } else { + + List argumentos = new ArrayList<>(); + + for (int i = 0; i < args.length; i += 2) { + argumentos.add(new String[] { args[i], args[i + 1] }); + } + + boolean error = false; + + for (String[] argumento : argumentos) { + switch (argumento[0].toLowerCase()) { + case "-at": + perifericoQueryService.anyTipo(argumento[1].split(",")); + break; + case "-tt": + perifericoQueryService.allTipo(argumento[1].split(",")); + break; + case "-c": + perifericoQueryService.color(null); + break; + case "-t": + perifericoQueryService.titleContains(argumento[1]); + break; + default: error = true; + System.out.println("Error de sintaxis"); + System.out.println(help.getHelp()); + } + + } + + if (!error) { + Collection result = perifericoQueryService.exec(); + System.out.printf("%s\t%-50s\t%s\t%s\n","ID","Título", "Año", "Géneros"); + if (result != null) { + result.forEach(f -> System.out.printf("%s\t%-50s\t%s\t%s\n", + f.getId(), f.getNombre(), f.getColor(), + f.getTipo().strip().collect(Collectors.joining(", ")))); + } else { + System.out.println("No hay películas que cumplan esos criterios. Lo sentimos"); + } + } + } + + } + +} diff --git a/src/main/java/com/antoniofrische/perifericosAdvisor/service/PerifericoQueryServiceImpl.java b/src/main/java/com/antoniofrische/perifericosAdvisor/service/PerifericoQueryServiceImpl.java index 92a6ef0..51bbd5a 100644 --- a/src/main/java/com/antoniofrische/perifericosAdvisor/service/PerifericoQueryServiceImpl.java +++ b/src/main/java/com/antoniofrische/perifericosAdvisor/service/PerifericoQueryServiceImpl.java @@ -40,8 +40,8 @@ public class PerifericoQueryServiceImpl implements PerifericoQueryService{ return this; } - public PerifericoQueryServiceImpl allTipo(String... genres) { - Predicate pAllGenres = (periferico -> Arrays.stream(genres).allMatch(periferico.getTipo()::contains)); + public PerifericoQueryServiceImpl allTipo(String... tipo) { + Predicate pAllGenres = (periferico -> Arrays.stream(tipo).allMatch(periferico.getTipo()::contains)); predicate = (predicate == null) ? pAllGenres : predicate.and(pAllGenres); return this; } diff --git a/src/main/resources/ayuda.txt b/src/main/resources/ayuda.txt index 9dbef7f..390b952 100644 --- a/src/main/resources/ayuda.txt +++ b/src/main/resources/ayuda.txt @@ -1,27 +1,23 @@ Sintaxis: java -jar movieadvisor.jar [OPCIONES] - -lg - Lista los diferentes géneros de películas de la colección. + -lt + Lista los diferentes tipos de perifericos de la colección. No se pueden utilizar más parámetros. - -ag genero1,genero2,genero... - Lista aquellas películas que pertenecen a al menos uno de los géneros - que se indican. El listado de géneros no puede incluir espacios. + -at genero1,genero2,genero... + Lista aquellos perifericos que pertenecen a al menos uno de los tipos + que se indican. El listado de tipos no puede incluir espacios. - -tg genero1,genero2,genero... - Lista aquellas películas que pertenecen a todos y cada uno de los - géneros que se indican. El listado de géneros no puede incluir espacios. + -tt genero1,genero2,genero... + Lista aquellos perifericos que pertenecen a todos y cada uno de los + tipos que se indican. El listado de géneros no puede incluir espacios. - -y año - Lista aquellas películas que se estrenaron en el año indicado. - El año debe expresarse con 4 cifras. - - -b desde,hasta - Lista aquellas películas que se estrenaron entre los años DESDE y HASTA. - Los años indicados están incluidos. Deben expresarse con 4 cifras. + -c color + Lista aquellos perifericos que estan en el color indicado. + El color debe expresarse con con letras y NO RGB o HEX. -t titulo - Lista aquellas películas cuyo título contiene la cadena proporcionada. + Lista aquellos perifericos cuyo nombre contiene la cadena proporcionada. Se ignorará el uso de mayúsculas/minúsculas en la comparación. -h @@ -29,24 +25,23 @@ Sintaxis: java -jar movieadvisor.jar [OPCIONES] EJEMPLOS DE USO -java -jar movieadvisor.jar -y 2018 -ag Action,Comedy -Muestra las películas estrenadas de 2018 de acción y/o de comedia. +java -jar movieadvisor.jar -c rojo -at Raton,Teclado +Muestra los perifericos de color rojo con el tipo Raton y Teclado. -java -jar movieadvisor.jar -t heart -Muestra las películas cuyo título contiene la palabra heart. +java -jar movieadvisor.jar -t pro +Muestra los perifericos con el nombre pro. -java -jar movieadvisor.jar -td Action,Sci-Fi -b 1990,2010 -t star -Muestra las películas cuyo título contiene la palabra star, pertenecen al -género de acción y ciencia ficción y fueron estrenadas entre 1990 y 2010. +java -jar movieadvisor.jar -tt Volante,Cascos -t gaming +Muestra los perifericos cuyo nombre contiene la palabra gaming, pertenecen al +tipo de volante y casco. -java -jar movieadvisor.jar -lg -Muestra un listado con todos los géneros. +java -jar movieadvisor.jar -lt +Muestra un listado con todos los perifericos. LICENCIAS -Los datos utilizados sobre películas utilizados en este ejemplo son -reales y están sacados del sitio web www.imdb.com. Ten en cuenta -que solo puede ser usada con fines personales y no comerciales. +Los datos utilizados sobre perifericos utilizados en este ejemplo son +reales y están sacados del internet. \ No newline at end of file diff --git a/target/classes/META-INF/maven/com.antoniofrische/19-MovieAdvisor/pom.properties b/target/classes/META-INF/maven/com.antoniofrische/19-MovieAdvisor/pom.properties new file mode 100644 index 0000000..36ee227 --- /dev/null +++ b/target/classes/META-INF/maven/com.antoniofrische/19-MovieAdvisor/pom.properties @@ -0,0 +1,7 @@ +#Generated by Maven Integration for Eclipse +#Sat Nov 26 12:43:06 CET 2022 +m2e.projectLocation=C\:\\Users\\AntonioFrische\\OneDrive - ABACCO Solutions\\Documents\\Schule_22_23_CFGS\\Acceso_Datos\\SpringTool_4\\SpringWorkspace\\perifericosAdvisor +m2e.projectName=perifericosAdvisor +groupId=com.antoniofrische +artifactId=19-MovieAdvisor +version=0.0.1-SNAPSHOT diff --git a/target/classes/META-INF/maven/com.antoniofrische/19-MovieAdvisor/pom.xml b/target/classes/META-INF/maven/com.antoniofrische/19-MovieAdvisor/pom.xml new file mode 100644 index 0000000..1c7acb9 --- /dev/null +++ b/target/classes/META-INF/maven/com.antoniofrische/19-MovieAdvisor/pom.xml @@ -0,0 +1,22 @@ + + 4.0.0 + com.antoniofrische + 19-MovieAdvisor + 0.0.1-SNAPSHOT + 19-MovieAdvisor + Ejemplo que integra todos los conocimientos del curso de Spring. + + + org.springframework + spring-context + 5.0.8.RELEASE + + + + 1.8 + 1.8 + + + \ No newline at end of file diff --git a/target/classes/META-INF/maven/com.antoniofrische/PerifericoAdvisor/pom.properties b/target/classes/META-INF/maven/com.antoniofrische/PerifericoAdvisor/pom.properties new file mode 100644 index 0000000..506c177 --- /dev/null +++ b/target/classes/META-INF/maven/com.antoniofrische/PerifericoAdvisor/pom.properties @@ -0,0 +1,7 @@ +#Generated by Maven Integration for Eclipse +#Sat Nov 26 12:43:18 CET 2022 +m2e.projectLocation=C\:\\Users\\AntonioFrische\\OneDrive - ABACCO Solutions\\Documents\\Schule_22_23_CFGS\\Acceso_Datos\\SpringTool_4\\SpringWorkspace\\perifericosAdvisor +m2e.projectName=perifericosAdvisor +groupId=com.antoniofrische +artifactId=PerifericoAdvisor +version=0.0.1-SNAPSHOT diff --git a/target/classes/META-INF/maven/com.antoniofrische/PerifericoAdvisor/pom.xml b/target/classes/META-INF/maven/com.antoniofrische/PerifericoAdvisor/pom.xml new file mode 100644 index 0000000..7ed8a41 --- /dev/null +++ b/target/classes/META-INF/maven/com.antoniofrische/PerifericoAdvisor/pom.xml @@ -0,0 +1,22 @@ + + 4.0.0 + com.antoniofrische + PerifericoAdvisor + 0.0.1-SNAPSHOT + 19-MovieAdvisor + Ejemplo que integra todos los conocimientos del curso de Spring. + + + org.springframework + spring-context + 5.0.8.RELEASE + + + + 1.8 + 1.8 + + + \ No newline at end of file diff --git a/target/classes/ayuda.txt b/target/classes/ayuda.txt index 9dbef7f..390b952 100644 --- a/target/classes/ayuda.txt +++ b/target/classes/ayuda.txt @@ -1,27 +1,23 @@ Sintaxis: java -jar movieadvisor.jar [OPCIONES] - -lg - Lista los diferentes géneros de películas de la colección. + -lt + Lista los diferentes tipos de perifericos de la colección. No se pueden utilizar más parámetros. - -ag genero1,genero2,genero... - Lista aquellas películas que pertenecen a al menos uno de los géneros - que se indican. El listado de géneros no puede incluir espacios. + -at genero1,genero2,genero... + Lista aquellos perifericos que pertenecen a al menos uno de los tipos + que se indican. El listado de tipos no puede incluir espacios. - -tg genero1,genero2,genero... - Lista aquellas películas que pertenecen a todos y cada uno de los - géneros que se indican. El listado de géneros no puede incluir espacios. + -tt genero1,genero2,genero... + Lista aquellos perifericos que pertenecen a todos y cada uno de los + tipos que se indican. El listado de géneros no puede incluir espacios. - -y año - Lista aquellas películas que se estrenaron en el año indicado. - El año debe expresarse con 4 cifras. - - -b desde,hasta - Lista aquellas películas que se estrenaron entre los años DESDE y HASTA. - Los años indicados están incluidos. Deben expresarse con 4 cifras. + -c color + Lista aquellos perifericos que estan en el color indicado. + El color debe expresarse con con letras y NO RGB o HEX. -t titulo - Lista aquellas películas cuyo título contiene la cadena proporcionada. + Lista aquellos perifericos cuyo nombre contiene la cadena proporcionada. Se ignorará el uso de mayúsculas/minúsculas en la comparación. -h @@ -29,24 +25,23 @@ Sintaxis: java -jar movieadvisor.jar [OPCIONES] EJEMPLOS DE USO -java -jar movieadvisor.jar -y 2018 -ag Action,Comedy -Muestra las películas estrenadas de 2018 de acción y/o de comedia. +java -jar movieadvisor.jar -c rojo -at Raton,Teclado +Muestra los perifericos de color rojo con el tipo Raton y Teclado. -java -jar movieadvisor.jar -t heart -Muestra las películas cuyo título contiene la palabra heart. +java -jar movieadvisor.jar -t pro +Muestra los perifericos con el nombre pro. -java -jar movieadvisor.jar -td Action,Sci-Fi -b 1990,2010 -t star -Muestra las películas cuyo título contiene la palabra star, pertenecen al -género de acción y ciencia ficción y fueron estrenadas entre 1990 y 2010. +java -jar movieadvisor.jar -tt Volante,Cascos -t gaming +Muestra los perifericos cuyo nombre contiene la palabra gaming, pertenecen al +tipo de volante y casco. -java -jar movieadvisor.jar -lg -Muestra un listado con todos los géneros. +java -jar movieadvisor.jar -lt +Muestra un listado con todos los perifericos. LICENCIAS -Los datos utilizados sobre películas utilizados en este ejemplo son -reales y están sacados del sitio web www.imdb.com. Ten en cuenta -que solo puede ser usada con fines personales y no comerciales. +Los datos utilizados sobre perifericos utilizados en este ejemplo son +reales y están sacados del internet. \ No newline at end of file diff --git a/target/classes/com/antoniofrische/perifericosAdvisor/MovieAdvisorApp.class b/target/classes/com/antoniofrische/perifericosAdvisor/MovieAdvisorApp.class new file mode 100644 index 0000000000000000000000000000000000000000..eb73dc59d41aaf26f2f5cc5d8aac6b9cf6e30d57 GIT binary patch literal 1077 zcmbVLU2hUW6g|U7x1}f_r6?-eR;zqe))%c2V}c|mCR7tKB#lqQcGyl`X2|Y>{ae1Y zQKRXzKgxJ#A%fAE+J~LlxpViNd(OT4{m18T0Cr(ph%r2L^w8!i)Jp1sF9YXL*dyV~ z0X>cmS_cyuXy4w`6Dekg)@WoQ!H_-T6K;E4x%TV+k#ItWrKeKK@EJqAQtdG$+WJ7G z5XVXyNh~pBI#P*O<6&R;Z+YJn4Ec_BxYy&pH0N0`5gy8bVYhRk;+jM})wnN zv8>_-ZdxcaH2!76pGwoXg$)MF72$Ki$>8nEg1@uk79!KJXr@rYRvNdFp~3LS%IMop zz+6E*dWP*Pnz_8sv; znz=13+Dh0B(|>G&6w==X#ORGio>q%aHtme|WbG8oAEWCOt>zk7#wxApX#(w+=(K{% z$WX+5d`x);wDtwr{lr(~_v86O_Y}oWJzx5S>oJ_6w6{|`!Djso*%REEGZd)^gPkM1 nGTFX`JgO)}j2lx_+(U(Oa@3?MYQ$Nl3hLO2B;2Q)7#cqT&(bDS literal 0 HcmV?d00001 diff --git a/target/classes/com/antoniofrische/perifericosAdvisor/MovieAdvisorHelp.class b/target/classes/com/antoniofrische/perifericosAdvisor/MovieAdvisorHelp.class new file mode 100644 index 0000000000000000000000000000000000000000..ad3e4aec0255fb26aebaa5eab177bc09a62c1803 GIT binary patch literal 1599 zcmbVMU0WMP6n-asENmBB(*jm%2~cZ7mBp`GyR{V~wP+|vO8mGRHbXLWvlC}02tUN% z;H~x18oluG+8^cPnazeS!j%_0A7{^b&pYSq?|=UI6Tk=f)ccBnc&kBy3@+Sf7( z+rsY(E%)gQRkGGRl!?;*raF`&yF3z6*TE>mr2~G*{fNgce{1hRgoa_XO+OimwHLqY zM$5PrFpS@mu{8G?M#_~2sa91}xER3&4-O_6F4kl$9``zXLOZQM)@E6yS1Z77OE(gv?4nLfd_pM_ zS~E+|`vvdZ zFY2qQy5Zr|P2SBq)pmp(77SO0g`9>l^UvVc(=M{bMyUUtF)KEK3|Du0v5_6okcp%z zuolP4a7%_ta=CV1i&CJqQ0BNR{Hp47RV-o?V1e>8LX(f7V3S0r5jxZ4p>>jOKJAS5 zvE|?3KBGec9OZN$OX+8bEUl9C6TKV@aob$c{8mZP-_?mVb Ihi`y?0sY{T*8l(j literal 0 HcmV?d00001 diff --git a/target/classes/com/antoniofrische/perifericosAdvisor/MovieAdvisorRunApp.class b/target/classes/com/antoniofrische/perifericosAdvisor/MovieAdvisorRunApp.class new file mode 100644 index 0000000000000000000000000000000000000000..e0a4401c0c812885d5caeff7c04ffe13f247303f GIT binary patch literal 1102 zcmbVL-%k@k5S}fC!ifS^1pImEOCjjR#6&|0rfDQT)L#@EjZfR_T)TL;d(Q2Z^bhb4 z@`*$fefN(t&eBR7<$>_9Gdp`b-+c4U-ml-^egMD|xL1OLfTy8J0;#Rh%0#5Hu!lj4 zq#|CS$!eXx$_xcBO<&O-oP|uy`o@GKi(_2Cv(P7+L{K2gZBMaS+ZP}*963{& zqFl3Rm5+__5xNrd+k2;K;x0C!Jr K`KR>P0sa7LIW|rJ literal 0 HcmV?d00001 diff --git a/target/classes/com/antoniofrische/perifericosAdvisor/service/PerifericoQueryServiceImpl.class b/target/classes/com/antoniofrische/perifericosAdvisor/service/PerifericoQueryServiceImpl.class index b1a816a3db9cef02cd5e77983e3762bf7b48a1ce..26e0418aef3e2445a017b2e2968ccd579c2bcbc1 100644 GIT binary patch delta 1118 zcma)5Sx*yD6#k~b4AWlHVG|c1#span29za`$PynUARq{Wh!iZFrPa1x{N4$R$UvqM0xbNCRIlt~C_=HS*E3Y0nCJLc zM>fMIVZQ*S+0tf7Y;`x;60@C7OQ(w=7A<_*KUsF*po9YgQutRn#gD-W7vC&LiLDH6 zXy-L@l&Qpo1RP>Gj4s|U_lUaTAhv5ud0{k1S?p%k>;WVNg=NQhTmk$}! zQXJ@GxTIRhWU<}RQtPy;CYKqmsHn;9$al0`ow*j5hF@j4hU?sH8W3;eu7o>$%oOc& z5BK>u(_Gx3fY6wHts0xf-jG;W+ib0KXT(-2c%at)n4tlUW)YA0ca~N4M2ANhx;6N@ zg5TInhLbo&rsIFGHw+gv?Dafm_5)YYD}ZgY+bKtz#pSZPBzzPQ#j{u#p9zroV1Vp9 zBOp=*CT9Xl4ZPB93@!wN0eLi2MtMnCgF?PhNeiPPkse6+2z=-P*2R0VgLf+h5k=Uk z+mE#k~AV?5?LWU2W5;Vx5iFBooei{Bs;@`lnfomgnFT|)?5~E6u5%rH4 z$}BD39v&DJB2@Ffpw)h}DA4s9P0yx9tkv%8biG2?t)z!{(}460bEtj;bzo)O6q@2a zuvd8CF887Xc!y2{M(NIg5c-Pb0jx(Tebs)F502m{1jVRM_J8<}>3rRb2oshiq_xlq zlPSEKpiIe~j`QH`-x(z>B9Ip{q8-u+(scqe5nS}3pE!K`J>YyaIMS*W0AJjo2nGz$ zMCS{=N#`wkH^C1>)S`zN##2ptMlBiBq!*aLD@~e&2X8fLin`{-d-7C&g%6mvTT8c~bY0s;zJKt&2|6-5-U-~}&u zQ1OB{5HFyJNQEk3^+_N627L5E6MsP5GZcBiL^GLl_FiZ0wa?BveaVB#^5@&G zL4rm=KL4p-#;3y)hKj!FB(d66=W%&?j@TqR7;>-HE?g!2p+(9XMz z8LR7Ync<4UFc4#-dw-?JrBJRia0NB_+#B4DE>B*CSH-U}T*nPAn!3bp+>>yZ_nMNl z_wj&#F--|~_#lh5^eFT6G1Op>S;Qj&S;-y2B>vqHQMSB9#uFJTV}Rkf%IKfNh8Rxc z3{}0H!~6^vRcvGiGwaYPqg?=7S64?jtF7>QU0w+jydm5c_Fh07|7waG9uF_jST`Y` z?jm6^HiJQf^<*BKMfjAwkgt^!qR9fnBIv9iTKa&5lmNEy6%lE?M~=7Ju`N{NoTuVc zR5FVs(nERI=+o?x^we*jE**yI+ML+Q$`f`w-RXMMZj1qQm zdt|IGh=NdFLHQD`9lO-i-D*}6%BmEu&8Qd^x?3(yuc7%D*+#K9#SeF}9|xQP90tbF z#6LyGuRMkp2(nS}?th9-@EA+{(%B+1H&m2PeUwfH>e6cS;~X!w#I?-w$nX#^GsH6! z?~)%KMD6gSbAU=Uh@w>_B9MUvv?|sDW~ed