From 27f8a8ed0878dbbf72552d6be202ee7aa64563ba Mon Sep 17 00:00:00 2001 From: devfzn Date: Thu, 10 Aug 2023 15:25:26 -0400 Subject: [PATCH] Intro SQL --- 010_spring_boot/README.md | 7 + 010_spring_boot/base_de_datos.md | 448 +++++++++++++++++++++++ 010_spring_boot/jugos/tabla_producto.png | Bin 0 -> 26581 bytes README.md | 2 + 4 files changed, 457 insertions(+) create mode 100644 010_spring_boot/README.md create mode 100644 010_spring_boot/base_de_datos.md create mode 100644 010_spring_boot/jugos/tabla_producto.png diff --git a/010_spring_boot/README.md b/010_spring_boot/README.md new file mode 100644 index 0000000..b63123a --- /dev/null +++ b/010_spring_boot/README.md @@ -0,0 +1,7 @@ +# Java y Spring Boot + +Tablero en [trello](https://trello.com/b/gWJsG18e/g5-formaci%C3%B3n-spring-boot) + +- [Curso](https://app.aluracursos.com/course/introduccion-sql-mysql-manipule-consulte-datos) +Java y [bases de datos](./base_de_datos.md) + diff --git a/010_spring_boot/base_de_datos.md b/010_spring_boot/base_de_datos.md new file mode 100644 index 0000000..33a9073 --- /dev/null +++ b/010_spring_boot/base_de_datos.md @@ -0,0 +1,448 @@ +# Java y Bases de Datos + +Para desarrollar una aplicación más completa y robusta, es probable que se +necesite manejar información de clientes y/o productos, que deben estar +almacenadas de forma segura. Por lo tanto, es importante aprender a trabajar +con una base de datos. + +Este módulo desarrolla un mayor conocimiento acerca de bases de datos relacionales +**MySQL**, la API de Java para el acceso a la base de datos llamada **JDBC**, y +también acerca de la **JPA**, que facilita el desarrollo de la conexión a la base +de datos. + +El lenguaje **SQL**,funciona siguiendo **CRUD**, que es **C**reate **R**ead +**U**pdate **D**elete. + +La ***ANSI*** divide estos comandos en 3 grupos mayores: + +- **DDL** Data Definition Language: se encarga de manipular todas las estructuras +de las bases de datos en sí. Por ejemplo, el comando create para crear una base +de datos o una tabla, etc. +- **DML** Data Manipulation Lenguaje: lenguaje de manipulación de los datos. Select, +para seleccionar unos datos, insert para insertar datos a las tablas, etc. +- **DCL** Data Control Language: se encarga de la administración en sí de toda la +estructura de la base de datos. Ejemplo, la administración de la base de datos, la +administración de los accesos a usuarios de los logs, es toda la parte de políticas +de crecimiento de la base de datos, etc. + +#### Principles Ventajas + +- Bajo costo de aprendizaje +- Portabilidad +- Longevidad +- Comunicación +- Libertad de elección + +#### Principales Desventajas + +- Falta de creatividad +- NoSQL +- Falta de mayor estructuración del lenguage + +## MySQL + +### Historía + +Creada por *David Axmark*, *Allan Larsson*, *Michael Widenius* como **software libre**, +desarrollaron su propia API de consultas y base de datos utilzando C++. +El 2008 Sun Microsystems compró MySQL. El 2009 Oracle compró Sun Microsystems +(JAVA y MySQL). + +### Características + +- Servidor robusto. Multi-access, data integrity, transaction control +- Portabilidad. Linux, Windows. Acceso a datos usando DotNET, Python, Java, JS, PHP, etc +- Multi-thread. Facilita la integración con Hardware. Mas escalabilidad +- Almacenamiento. Prioriza Velocidad/Volumen +- Velocidad. Más rápida, ideal para e-commerce, AWS/BiqQuery/Azure tienen +instancias de MySQL +- Seguridad +- Capacidad. Hasta 65000TB +- Aplicabilidad. Internet/Desktop/Corporativo +- Logs. Registra todo. Recuperación, Réplica de servidores + + +### Como está organizada una base de datos + + +```mermaid +%%{init: {'theme':'dark', 'flowchart': {'curve': 'stepBefore'}}}%% +graph LR + A[(DB)]--entidades-->B(Tabla) + B--def. al crear tabla-->C(Campos: cantidad y tipos) + C--Texto-->D[char varchar text etc] + C--Números-->E[int bigint smallint float bool etc] + C--Fecha-->F[date datetime timestamp etc] + B-->G(Registros) + G--ilimitados*-->H[Datos contenidos en los campos] + D--unica/comb. única-->J{Clave Primaria y Foránea} + E--unica/comb. única-->J + F--unica/comb. única-->J +``` + +#### Schemes + +```mermaid +%%{init: {'theme': 'dark','themeVariables': {'clusterBkg': '#2b2f38'}, 'flowchart': {'curve': 'monotoneY'}}}%% +flowchart +subgraph Esquemas +DB[(Base de Datos)] +subgraph esqA[Esquema A] + f(tabla) + style f fill:#3f3f3f,stroke:#000,stroke-width:2px + g(tabla) + style g fill:#3f3f3f,stroke:#000,stroke-width:2px +end +subgraph esqB[Esquema B] + c(tabla) + style c fill:#3f3f3f,stroke:#000,stroke-width:2px + d(tabla) + style d fill:#3f3f3f,stroke:#000,stroke-width:2px + e(tabla) + style e fill:#3f3f3f,stroke:#000,stroke-width:2px +end +subgraph esqC[Esquema C] + a(tabla) + style a fill:#3f3f3f,stroke:#000,stroke-width:2px + b(tabla) + style b fill:#3f3f3f,stroke:#000,stroke-width:2px +end +DB-->esqA +DB-->esqB +DB-->esqC +end +``` + +#### Views + +- Las vistas consulta de `n` tablas al mismo tiempo +- Alto costo de procesamiento +- Unen tablas a travez de un ***join*** +- Creación de filtros + +```mermaid +%%{init: {'theme': 'dark','themeVariables': {'clusterBkg': '#2b2f38'}, 'flowchart': {'curve': 'monotoneY'}}}%% +flowchart +subgraph Vistas +DB[(Base de Datos)] +subgraph esqA[Tablas] + c[tabla a]-->d + style c fill:#3f3f3f,stroke:#000,stroke-width:2px + d[tabla b]-->e + style d fill:#3f3f3f,stroke:#000,stroke-width:2px + e[tabla c] + style e fill:#3f3f3f,stroke:#000,stroke-width:2px +end +subgraph vista[Vista] +end +DB-->esqA +vista--query-->esqA +end +``` + +#### Procedures + +Procedimientos + +- Lógica estructurada con lenguage nativo SQL `if, while, for...` + +```sql +IF a > 0 THEN +X= y + z +z = ISNTR (z + 1) +SELECT * FROM alpha +PUT ... +... +``` + +#### Trigger + +Disparador + +- Avisos automáticos cuando hay algún tipo de cambio en la base de datos o +en la tabla +- Ejecuta una función o procedimiento cuando se cumple la condición del ***trigger*** + +### Esquema global de una DB + +```mermaid +%%{init: {'theme': 'dark','themeVariables': {'clusterBkg': '#2b2f38'}, 'flowchart': {'curve': 'monotoneY'}}}%% +flowchart TB +subgraph Esquema general +DB[(Base de Datos)] +subgraph Scheme +direction LR +T(Tables)-->V{{Views}} +G(Triggers)-->P{{Procedures}} +end +DB-->Scheme +end +``` + +## Manipulando la base de datos + +### Crear base de datos + +```sql +CREATE DATABASE jugos; +``` + +```sql +CREATE SCHEMA `jugos2` DEFAULT CHARACTER SET utf8; +``` + +### Eliminar base de datos + +```sql +DROP SCHEMA jugos; +``` + +### Crear tabla + +#### Números enteros + +| Tipo | Valor en Bytes | Menor Valor | Menor Valor (unsigned) | Mayor valor | Mayor valor (unsigned) | +| - | - | - | - | - | - | +| **TINYINT** | 1 | -128 | 0 | 127 | 255 | +| **SMALLINT** | 2 | -32768 | 0 | 32767 | 65535 | +| **MEDIUMINT** | 3 | -8388608 | 0 | 83888607 | 16777215 | +| **INT** | 4 | -2147483648 | 0 | 2147483647 | 4294967295 | +| **BIGINT** | 8 | -2⁶³ | 0 | 2⁶³-1 | 2⁶⁴-1 | + +#### Números decimales + + +| Tipo | Precisión Bytes | Tipo | +| - | - | - | +| **FLOAT¹** | 4 | Simple | +| **DOUBLE¹** | 8 | Doble | + +> [¹] coma flotante: ej. si se declara un `FLOAT (6,4)` y se incluye el número +`76.00009` el valor almacenado será `76.0001` + +| Tipo | Cantidad de dígitos | +| - | - | +| **DECIMAL** o
**NUMERIC** | 65 | + +> Es un nro. fijo, si se declara un `DECIMAL(5,3)` solo se podrá almacenar desde +`-99.999` hasta `99.999` + +| Tipo | Cantidad de Bits | +| - | - | +| **BIT** | 64 | + +> ej. `BIT(1)` puede ser `0` o `1`, +`BIT(3)` puede ser `000`, `001`, `010`, `011`, `100`,`101`,`110`,`111`. + +#### Atributos de los campos numéricos + +- **SIGNED** o **UNSIGNED**: con o sin signo +- **ZEROFILL**: llena los espacios con ceros, ej. `INT(5)` al almacenar `54`, el +campo queda `00054` +- **AUTO_INCREMENT**: incremento secuencial, ej, `1`, `2`, `3`, `4`,...; `2`, +`4`,`8`,... +- **OUT OF RANGE**: Error cuando los valores salen de los límites + +#### Fecha y hora + +- **DATE**: `1000-01-01` hasta `9999-12-31` +- **DATETIME**: `1000-01-01 00:00:00` hasta `9999-12-31 23:59:59` +- **TIMESTAMP**: `1970-01-01 00:00:01 UTC` hasta `2038-01-19 UTC` +- **TIME**: `-838:59:59` hasta `839:59:59` +- **YEAR**: `1901` hasta `2155` (se puede expresar en formad ode 2 o 4 dígitos) + +#### String + +- **CHAR**: cadena de caracteres con valor fijo de **0 a 255**. Ej. +`CHAR(4) = "aa"` -> `"··aa"` +- **VARCHAR**: cadena de caracteres con valor variable de **0 a 255**. +Ej. `VARCHAR(4) = "aa"` -> `"aa"` +- **BINARY**: cadena de caracteres con valor fijo de **0 a 255** (Con números +binarios - bits) +- **VARBINARY**: cadena de caracteres con valor variable de **0 a 255** (Con +números binarios - bits) +- **BLOB**: Binarios largos -> `TINYBLOB`, `MEDIUMBLOB`, `LONGBLOG` +- **ENUM**: Para definir una lista predefinida -> `Talla ENUM(´pequeño´, +´medio´,´grande´)` + +#### Atributos de los campos string + +**SET** y **COLLATE**: Tipo de conjunto de caracteres que van a ser aceptados -> +`utf-8`,`utf-16`, ... + +#### Campos espaciales (GPS) + +- **GEOMETRY** -> Area +- **LINESTRING** -> Línea +- **POINT** -> Punto +- **POLYGON** -> Area + +---- + +## Prácticas + +### Empresa de jugos + +Desde el área de registro de clientes, comentan que la información más +relevante de un cliente es el DNI, nombre completo, dirección, edad, sexo, +límite de crédito, volumen mínimo de jugo que puede comprar, y si ya ha +realizado su primera compra. + +#### Creación de tabla **`cliente`**, query manual + +```sql +-- show databases; +use jugos; +CREATE TABLE cliente( + dni VARCHAR(20), + nombre VARCHAR(150), + direccion1 VARCHAR(150), + direccion2 VARCHAR(150), + barrio VARCHAR(50), + cuidad VARCHAR(50), + estado VARCHAR(50), + codpost VARCHAR(10), + edad SMALLINT, + sexo VARCHAR(1), + limite_credito FLOAT, + volumen_compra FLOAT, + primera_compra BIT(1) +); +``` + +#### Creación de tabla **`producto`**, interfáz workbench + +![img](./jugos/tabla_producto.png) + +#### Creación de tabla **`vendedor`** + +```sql +use jugos; +CREATE TABLE vendedor( + matricula VARCHAR(4), + nombre VARCHAR(100), + comision FLOAT +); +``` + +#### Elimnar tabla + +```sql +use jugos; +-- CREATE TABLE vendedor2( +-- matricula VARCHAR(4), +-- nombre VARCHAR(100), +-- comision FLOAT +-- ); + +DROP TABLE vendedor2; +``` + +#### Insertar registros + +```sql +USE jugos; + +INSERT INTO producto(id_producto, nombre, envase, volumen, sabor, precio) +VALUES ('695594', 'Festival de Sabores', 'Botella PET', '1.5 Litros', 'Asaí', + 18.51); + +INSERT INTO producto(id_producto, nombre, envase, volumen, sabor, precio) +VALUES ('1041119', 'Línea Citrus', 'Botella de Vidrio', '700 ml', 'Lima', + 4.90); +``` + +```sql +USE jugos; +INSET INTO vendedor(matricula, nombre, comision) VALUES( + '0233', 'Joan Geraldo de la Fonseca', 0.1); + +INSET INTO vendedor(matricula, nombre, comision) VALUES( + '0235', 'Máricio Almeida Silva', 0.08); + +INSET INTO vendedor(matricula, nombre, comision) VALUES( + '0236', 'Cláudia Morais', 0.08); +``` + +#### Modificar registros + +```sql +UPDATE vendedor SET comision = 0.11 WHERE matricula = '0236'; + +UPDATE vendedor SET nombre = 'Joan Geraldo de la Fonseca' +WHERE matricula = '0233'; +``` + +#### Eliminar registros + +```sql +DELETE FROM producto WHERE id_producto = '1041119'; +``` +Precaución de **Siempre** usar clausula `WHERE`, de lo contrario se eliminan +todos los registros de la tabla + + +#### Modificar tabla + +Modificar tabla `producto` para que el campo `id_producto` sea una llave primaria + +```sql +ALTER TABLE producto ADD PRIMARY KEY(id_producto); +``` + +Modificar tabla `cliente` para agregar el campo `fecha_nacimiento` como `DATE` + +```sql +ALTER TABLE cliente ADD COLUMN(fecha_nacimiento DATE); +``` + +#### Seleccionar registros + +```sql +SELECT nombre, matricula FROM vendedor; + +-- Filtrando resultados +SELECT nombre, matricula FROM vendedor WHERE matricula='00236'; +``` + +Filtro por edad + +```sql +-- Mayor que +SELECT * FROM cliente WHERE edad < 27; + +-- Menor que +SELECT * FROM cliente WHERE edad > 27; + +-- Menor o igual que +SELECT * FROM cliente WHERE edad <= 27; + +-- Distinto de +SELECT * FROM cliente WHERE edad <> 27; +``` + +> este tipo de filtro también funciona con strings + +Filtro por rango `BETWEEN` + +```sql +SELECT * FROM producto WHERE precio BETWEEN 28.49 AND 28.52; +``` + +Por año + +```sql +SELECT * FROM cliente WHERE fecha_nacimiento = '1995-01-13'; + +SELECT * FROM cliente WHERE YEAR(fecha_nacimiento) = 1995; + +SELECT * FROM cliente WHERE DAY(fecha_nacimiento) = 20; +``` + +#### Filtros compuestos + +```sql +SELECT * FROM producto +WHERE (precio >= 15 AND precio <= 25) or (envase = 'Botella PET'); +``` + diff --git a/010_spring_boot/jugos/tabla_producto.png b/010_spring_boot/jugos/tabla_producto.png new file mode 100644 index 0000000000000000000000000000000000000000..bd334d25298745eb98394e14b675de8effb45b4e GIT binary patch literal 26581 zcmd43Wk6ibwk=8w5(p3=KnRwg!2<-hkTmY@5L_CE#wCGZK^k{S(BKx_f_oFRafikm z*KYbY-?#TY`|NY?d-wdg@6``jEUKz&Rn1j3=9pu4n6jc2F7``o3=9lh8EJqj2F4>V z^!3E!`{T!@gmq) zibO>npse!#`8#f&;ZoLN61CBHrM8v6S7+*?BKxA&n%CM5NxGYvat9391I*0#nZv94 zd7lnFt)BPx_y7Ej69&BH}t`Xm%%VDt$7Dy$(*3%LKd{_KrA z@XzZ{#&7ukc{}LG{68)+NP?Xo{Nq~t#lKXpO7jFKL?)CL&?S?_OibS+Bp|T-LlVY7 zsiG#ekV0ptkudr_sjKPd@Lgkf_NcXWO-L3Wr$ z_M2m2|0cbA=w2O_jD_7tSVf*ms4yfg9cW@;%s;Z<+*&kXVz;1XWdm#>5{$8DUW^L-*y#qK90yXSya{-`znYH2`(Q~E1q zo+H9A%)s{H?(HB_OZU^0+e;${y~e**8r{-Sswt(EW;omIC-2KgV`OwK;%}eCF230= z9u`!6GfC>hQgi-j=_7EJ^{O3XocYP>bZ_!aeY?2*xte|@J;CCq-6D*6#0ODI_&J9uY*DuSY9208d#wP z(>>~WS2M!4-CA-6^Bg)lbMF`#;HbWMEK{*Lov)GfX;LIy`_*48Q6~$pc`^}q=HSk= zdAlrEjz5IDN^@U5`6a)x3GM!oy>mdhBHef*b&DAHX?JZRzmMUVwxI5*{j5gUw?@38 zMumTxnHj)x@onA^>$=a?@=-PZlLD5~`%Pc*RBBve2ZphV*4g4{!3RtBjp9rVOnqiS@9jN| ziiot7g->j2>>6W@NKY=pf#H%QPLSD5($Ik3AgGo*exEIavzKB~&EWg56&a;$!0?;b z(mgKZNtCx2gK;!*q!fiePd0{ZA4n_ee*)8p$N)_1SLh--d!s*i1O~BFb zIlMnkeKGPA+vavg_xrggT&N{m8|aj6mB z-j$~1QU!`Ho=rn$l^u`EHCSr%t?6iJ78{^BBcdWd)0(omnxb94BLM)jNmLDeV64%t zt5FbOXuBPM6STm2(zM2~`AnGMx?j9~ajLQTSH@uNn}VTG&Hh>jq?IICUviU5w8a)M2o|az+2{( zjqL;@k7@n%7JuBrwPOr^`so>9xEY_1^uqV5=|CK$_E>lOpJW@GErsEyuE3hvZLGNQc9aUji|=LRkD9ZFIS4M%yh zP39rP*|aP)G?K%J>@tXUoAA*IEOXD-M8;$?L5sdc@Mao*qGh?M(F9QRhc_^e8{NFF zObvbRw|~mg>bFZ?y7n0cYZWY5_~vQUT=^dEvlLD(asikHhR5MH!?*Y{Pv$OW=1z_` z?kP1RWnCAWPQdC$1Hw)L9Df#u3hes^+GvrtlR`_@wjVRSb~m(opZiq2)_O(b>1g(8 z6>QWJQ#z#;bMaGvyNRCT5*i@i4*LRI^x2g_>Se*%6EDwA7kys8xov~{#xd20h#q+* zL7*~S!c;zw!f*3T$t_V9(B%oXdKYdk%7|Xe_bgm_ zh}!jKJr2ap%@@YCD2hk{pLaFN96S`L(1{p+#*m^Gqqgdb4&HayfiOmiJmdu&yKq#+ zNP{~#JTi)#O-SE1)IrP(a{BozToiF$GE)j&D{tM>JQ0MQ{gE5N%)DHQgO8-PV2KJ@ zLP~Z}H(m};cKK~~0#~W2+enPsZS^S{oF`slESEWPhcnStkLo8L7|een}3J~WoQL;s5vpZ4B`fe zik&MnU;T0~v#yFxdlC18S2ka+(!W46!91Pc$T&7aLJB`4_UclQYjy4d?%<9XdEkjD zQ#3H`S@G&kZd}AuOLum|Qy5vPd0A)Be7$cW{bWET-O&XuQ<-mvFmNuBy4p$0CbLl$ zxQxJj>MC68H%Jz#^Tz^iP{||oig_rEU`dpD;Cu_tQx0RK6w7H)q=H!f{_ZA2&YP*4 z1_-?V;1<(rcyq;2b+=*7KgvDMC5E>g&-&L{s4nL?_#pS&dN8&5L~jY4!PNW)HqVCh zWI_mwn-TN;HYO8Nd{pebqL5#Ej+OVye3x2zdwCHlWt=#T0r8iovW4eoKX0Rs$bp6< z0*8ZH4F=a|ZYF^2SGrB^dt1hxDK+%;2_JUf;b43xo}bvmL>oR&6PM$!9c?$&olFxQ zXr%T1UMC9Ej>$*Q*{-t_iwOO6T$U`=sDuzl+bo{82x-G1K8+p%{&NNyh8$xj4`f{7|&5|CMfE*AhC<` zBnJG*C6B-(@TirEbJS0PoYtO@Z~z~Lr7jh0+14mV&))v9F(>?^#KGi>zF+Iq)M8>z zRk~PGiHgW=7s{7g&ilMCkq3xs{bYsIypN&Xp^!vQ7n_^PaXjrK!TN}RpqGFkEY|g8 zX(Cq8ZKLrXDn(FNOL?w!xnMKm9rAEg%36bP2|05`lt!*M@sou)Zpyd*RoP^I2Z36l zdd+@JQ~hl5NJ97-EId@>Wkyx@03|f8VzNNA` zprhmHae7lE6r^QjDQjtI?pdo#7keszrRC@Am@r0bwudt!CWM%uXS;f_aqqXmN|d)_ zrMj0@H|GBG5z>~7fIv-~X&w8KY1f?l&ge`gk9*_SXksF@mx8w`kKF|bIDw2(KuNO= zG25O9f_uz^t_!vI(^EFtZcriB9dXBq^z>(Oe#r#!g(L7L~#37a$`t{@qlgUzLPSf<;)e?gi z{ZcZSS>~2-aME$3&fP2=_&B4!>$!`-%eWJga|Fqkn_WhQ0YE_L}f}&dwqOH0X6kHxn`7Sd zZ`vjT!x9KNg|gW9Dc9wT*hT%ze(Ex`ZKnlcVA$>BAvy>-_6=%5zhO$x2x7Lo@{PDH z#4h%g^v%U}iyD7j6+ig8r(ndfp3~b>=g4gN)(Yo>1L<|5W8U<;;%#?>f)F<=CrrGg zq=M{t>SDa4I9w6MgKBDtv>Ub>&_{LC_+7^Eyo`EKNXTqrM8Z{;9VA?Mz8a-r0&~+#_9xOQcthCwnc)f%<)Zd z!{um!KTrClZdTP2%L!I)vj7|;Kkxo;k*z2_`8!~V;RrQxdmZzon~8BSmGxDh!R$># zA-@ST${62uC{(WSL+L$?0~z;alRGyR<8xD7^KQkB0y!z%%1cPf0{Z$mX4LrBUNd-g z+`CoJxt?MY6QiEbn6sPbAjR76u8DiRw?#Z?t@}CpYy@ck{h8?7Bq9IFMTCB$hhOYP7`|GR68VSUj zvb*RTgUZYr#2fSsaYt@^4>6V%Lm1WcJ7;?&%O^E8<+iAv^A5H_y~0?5O4U)gwP$Awf8^ga+4!4Q@H)j^ve0rx8=T%ft{zChK~4V3}xEd zu|g#Ekorp867|w+(1!n1ChwA}xBXZ6Y2O_8^(;`SETfH~L6wGPRTy(5QzU+0ufowk zX1b^!-T#3T53=L|Z7f}TE;L?$NLsiV-ltRJ*rbPvQCbe+`)u{6D4Zj=dv88Y-D+7- zln(SCDXI-s)X9S3qN zic-quOm!dJ!Q$?FgS<7d_)?s(>zn9t5#k`wTGBgCE&ntI+7$6FYXNbkQ(d&k4raG+z;FF|ez{W0?W%Z~-bJY~GPfsUpl zyY~)tSeit^UU-lv;fc2sK=8ZjDaY=!-osM<4og`S!FU1Q>2r4T^lw6Jg4dv3-cKJ${p<3?_6K->(M4;= zBB1Rqk_ncM>TMOAL_u;!cA|6BGFJP=33}lihJv1sMo;_&5)+i*eg>4dI*cRMd8x`K z8x3o{)gT_NWYx2v<3t0XbJ;@R+!26o_Zh_}Z`Rgh3l5DikGjwT%Lv?GrR)R3aUQxO zg%k_EEtDxM3^cVRKw60RA2rj?1eoc0m!{@s{KB48z2QY~2@)Y9un^|*=-^b%Ztu24+B{h+wrki5a`4lw6VdidLqh4v4 zb?u32Gmo_rfm;!_OZF{7dKqQSh>t<==mII%7*Y!D$}6*QxVxeM)1_~;K8xPV)Aur0 z8_@RO`#dEyw0c+2t0%toLX0Bec;U8#L|J95IAD@)2lM zI&b1rxz*L$rZ|D%Qv>;$oxjrbw3)k}CX5MXq={wb0`J++P<$2ShaN15ENt;NgJiP)(LpHCCGoY5%q_V`QYEmduH z{wr>KXl?R5&|gBo3CprgI9cox8IVCrKNq^?P7TazJQf2g;S?SA!^LcgsnvE!D38*{+TgjCagsVQ<(Zbi;5U!^;!w08w&y1Y4*MAukS{b1(Vn zW?rwIQVDzS1%F}?7&wndQtKnaTYY{GGN073gzS>rS?&6g;PhI$El`t@9;nCsvN5fi z{jk42AK>kwx)_z~;SwTlAovhVn~{!JrL5 zLOE1>L&PCQM$^M#R3Y$j=iT|nmgw`g)uv(600zD(2QH1v^$Y3^e0#Rzu)S>-CFDk1 z6LY|>dyd(h^&i?!TExPBLToFm%f+{v-XftXZ~B_f+>2g!;hO6>Bc;@|pARa?4chps zG;-$`##6$&A4x<`IIa7A%*pb6^Y|cjl*RRQ9ZhiPDl1eU70WKKuM z&aJxg?98@v9R9wLYvTZu$Cesxqb?6ed58by1mksM0@aPnV2sbrqA4TpNfIAQ4Sn3r zR}Wp0;sEk1+?6YPu60}>F$)DO077RlqSfBgropw-RMD(}0rr@y?X%)kM6&ODK59*8 znyY~KfFXwO4*134Oh=Z?lmWqtK2=%VAE|L2y&aurYR2fi_Q<(z6!tH-x7>U^E?&}-DB5# zkQQ%ud}et$4lT>{ej?)Ac7qa!sxU6FTbX>bE9a6lfD62Q?*Z0R3jR;azwZ%b=sG`| zO>Q*Mqiuo=0sL{o;5y;FUC|XKgyt57#3<#qZ z*KLj^dk=>Z+X`#^l7I+P06>15d~uGM?Y#L-XpNC0+pEN^%iZ$vmogT+q`Valmun+G zgtWNu;u2@MTMw%olM7Aa6J~X0_V;0nElol!qRECdvhgvR z{LQ`v-ys7;jP@Q_ZLfO<&GwF^OtF^^33AYzODF&&Z`jfBO;2~tu?86DZZkbtZ#xH~ z(Gy`%PsvJ*cU63qy&9a9LdIwR`DfXZgdx&Zwk^uAgzHG3HV(LRu<(kEBTy#6GyGWcA zf~!A)o&_&dhS`~FDYJv|_9kZrCn2)~-)L)^-Fhc?Vdhg&QJV5o8Y8sS8`V@VQtJ!N<5ml-*{=kpVq zSCLUGX;vZAK0zAyq*Sw_Y=@lU;58He*~Z3a<-{$@-?kG?E(IKpn}k!fJ< z(&-{@x|E~4Qsx?F+wsiuV7s6@+!jPr)7V`}XR4E;xjsL4quu?p7<9z42xhcca=#Wb z)z@3B@G5h&nhz*O4iZWiM#{2W^Nfht3o;rk~jc!?Uab_4P7jW<2HFEg2-!65Tywq-e_ z#Ul|NmHJKGtOm#G(9c^%%8)+H-}W(zpju2-`F9q!fzCx zhu4s2a01DRrRd(~-3`NqSe2OnGC-Oxw0}5)-mBGiCf% z-%In$Y_8*Rw7IQ5wUHC=wyQbV@IuK)Hb&iwa+>eGX3Vp+{5ZOX_E*vKEI-{t0=f_Z za+B+mz@dkxsgNdjMzWNb{l)~bqQ20wxCMsOU*`7-2nv+@LhCM$;bWcUE=FRlGjZ$@ zDZOd~-hg?rBPT)E#$*cNl5i7z%f${_J+ympU^rCivUIb7*-%>T4zo89xtfP_Nu%k_ zzqJ4&F;sWCYv%fhNDZDt?T#OdPGJ__Wkm#Y^|o4d=y@ z9C-Ba`80(DZHH<#x`yvD@LA-g7e=T0u>)9q5`ncU^$nNuGoD?SUoxB7_3V~zzWmS% zuy%>+&77>w%{X(ST4-wGRzPeTxtUF=lcKBYjng~`KoA#j>r#!x*Eo!iD#m5g6bv89 ziNzV@ZloicZd}xDY}TD#@r?nXk{@zfH2$+Aa6gJQ*u6wzUdnX!sGjS3^VSHLRBk+ zZqCA%Kw9W1a_<`l3D7gslrAMAz;Y>sw#+ln{!8C9fbzRxS@6q+i;rWL_Ig!T$dz$= zXZZ4AU+e3Pj0i#65p-jZeEk$-TxYrB7uuAa~gl(LD*-u*M$=_Q>~AeWXk9o>M0 z8R2IT2|o34?f9yq(w-qqp<6|Zrt5x-e09NV^zZuk5$o)U<5V78=c-f5+ZlJlRSYP< zRK0yE(K;B24-VaXlQ)0)f?U$9PhQl3NoKQTeWI~RMJ7Sl6MFCB%=L}jd@}+ZFZ;yz z-ET_CBH5`3vOFO)J><(T;jCMPPf>9<^-_X7L)bkrZ2hMYMuDNQ%; zL8q&Bm71y$mJMf@>3YyIh_ERyC2g=M|9bnNfAD$RB<>4=k>!H}`6N#U*g#N`<7>8$ zaz&q))8^K+#_}8ts~ouUz7cs2Qyl48$(+50YfUODPO;-MytaraYd; z7@4(`CEw=TwO)U4>CgzW3xl zb=q$pRi7X1={lW%&_Dw7YY|?y`}*#K9J8vU_AbyVeV+oUrIcA(mov+@jE0~f40nmP znd!f1+Ir~1;ytozT)h3FcjkHdd@r^hyeGG6arn%8X5?2@d#$L9wy{NW>y!}-xNutK@<@GR3D$*79_a2O)I0a(4z7qc{ z=;+tl)1B;+uL^@`7DpCc-EU@NWE;nX1B{o_8GS(-OzC$!_+WNW!CHl8H+oC!fhi2B zxr|!=Dg}p+_7BDkaD(l&Yp)L_J`RU$33?q91%C9=NZq^KFV@;0DNHO0V1R`2*L?D< zYPEx~{a%oa&E3^sn-n=v#96dpI*4Q~C72K3oZEc*5m+qN)IKu@>D6;80KjPTW0(Se_GaNMC^)>noe=x`?g5)l3RSoUfx1O3oh%H{yW!7#{>zWpZyu?EfYr zaG?~wnZ%NBYV|Nb7aAP%&Gh7Mtiz=>b<_2nzWlM6y!-?M<44g^aKkjA{a?6ijG$6wHOBI7H6pFT;cM__MT^98rLAAw{FWzd5h#I)8 zt^$j3i!xQjN%2Y+y=QZj>ZJmAUHi2&TYVSW#}wN$h`T7T0Al+UH-ir7vy+|gakh+J zYDTJ;IJDXMBMu<}Tx`p4V|0P>Otm|PIGm4hy$H9bXg;|{2-4ubZ!!`J=XZ@q_45?3 zVxI*ctC1%i{E>{@+Wk#uFtEsv&q>B`G7J;3dTEJE-%f6Q+kUCf;v9`cAE+gi1RPit>h`) zw2)qFD7kK{HB&ww%sMEJ4iyl&Y;P_TvOtquT@(Sm05O3#({s8>NwqFBBpdN$1k7`x zp5Z+fb~ht!b(6oEEAIlgDD7Cm*X*Wa%Z^|+&qp*dAaH0|gA)s|2zMyoQvFX*J@F%^ z%~R{nj`=!!7Tam3Z`q&zY)foD6Mc2Kw@7_F#5Wq6NJrD^YvqvG%r9m2Lh8@%Q$m-W zm&>UQDE0l+Co3khHdlwAqpEym@=MnG5vR&oHJ0Sw+~|+i?wKUVT9Cxc5OB@~Wn>AQ zAWp>t=dmQ7d)z zHFeL|+he|5>9u;T)s$b5#9V};6({E92Vq}lzzJ- zC09#Fyl#8F-fP-8&SK>6H`P1G9@@ndgAPJ1XUVHFQYko)Qf&@|_6hRSyuH{uI-a%p z2=B9R=#6FWDvJLqpC!6-aCWT#87Mr7c6wmO8KRh0@79``8gSoNEu)5JH7{>atF#DN zeSEWZpau8&^@czVw6*2KxogrAa1S=hF~+ig$s~eS9YlH6To2q=u5AAGVP*NJ8K5KR zgw#N&R%`LJAMI3rCU4TUm)5U4Di-5a$JT1vSIf&g(JT>evk#=3G7@R81AnU$xxPu{ zep&r}SV_=N(j`#%gZ+H#M66A_cI@R%@N=lBaSaPs5F$CUN%dqRLH7ZS@6-3S$}=9$ z>Wi}JRLW<>n_aqz;U{Eoe;SMhM;1&ljDBy8HcHWZ4aLx&Ha;DgL_pW@*+ zJF9P&UqTJ#>2n+bGs5(>*?Vyk9ipC&T@0%~O#9 z=#>$0G~Ho68pkksn}S$9j?=QY{`EGdG|;X_(q$i)0Alwims8W*FI+_q5K##{CnI_k zLnlK=!)5ahQ_ow^6@@mJ(ybk~N4`N8(7JFI`lGm`wG7W&b?a?!F%AX8W_5NgM<1l| z1K9fNcL-C{d~cl2Miw#vZQ-WD$>DE}W)c$2)!y_!AEV&WF&`^&AS)Ed#b2rxA%m14v zO_aOmE3@5dot$WT+gtN~=Z5UssXvD?1s^o$k9PWc8Nc!mrgR9r&8$<&zK(y^vX52o_8yVspssYpITi2QKq)X%e*5Ph~pt*B&F zuM!S$T*Rw7seZ`x@2c5-*4^O?JRb}e6X}bL(XOzZ!30gDyJw-H>zY}&izeQp!Go4k z2W4L?Cz?Wm=sarx=?hs{L;Pm!#MsN<@{IaeRY0qL90 zIWUlpW_8|IxaQF#jjh{zFULQv`^$yYm>=@WIXReFM=p~@%ASUo@)+&AFrNYBYwa5h%=;_nHt*>7?o8W7JYh4O4ViTf=DO=eon$S z)|tiy^{))g65WXF#*1a(Gd{5t>(P{k_S3K1qMQQZL--_7qokG@OzfNl1R4dm*OTRO z`K^ev$1J1TPJVM2C+=ohGp+1vlcbx-?{fO*?Ml6AedsOf5X`8-(38RI4qIc_B2Vwk z5wz@OXKtHS`xf-%CI9wwFJEW+nk@NG`5bWw& zRt{RX@qtreB#3Ycklnp)4b#VRbD2&r(3DWf;OWydPQAUV+6DmV(v2<-80WB$Z`0fU z2znu!aB{AWPmX}CxAYoHfG&zAkc(g&J~$7vy=!W z={73IxPJ(y$Nr#^*JH~YGtni+)?>!iP@3V}iCnOE`1iHa8&9M7MFF*6Z=wdn9qpuD zHfQl$8?D;^l1c$`mF7>Oo#m0(i%omEKd#_aJE9hk=dKh8ZE!In*E|*%N4M>t{yQA( z+`Gf<^?LmVa{^Y_vJq^a;EtLMUkUNym-6U;Sn=4Y{?i@!>`!>m6N0|^SNZkuU$O%J zTMCJ)xrM*Gs8#&vAYltE16l)(I1&qS=veK4^+fkFMUfcMLmyRGB0dGGyF$gVTv8hT6Edzmfmz zO$7Z4sQ#ULg!UvEFvOpA$D#+;)3l3%__w!tJd=|31*yxfR*KUB86 z)vxpv??}VCYOSu^utuyvw+cIzpK)~}V59$$^J)4bw4hgGG1 zNe6-ZmJ#dk;D@4_ddJ5cOVn?B*pgdcO?5q2yw_>ja=o+njc@Z7B(pjX_rD5sstPP7 zZMiuM!dBT{--pv%r3$>VRiS|!uYDN2y;PVoK3w1G?KHDI0n8+bhbJU_Xn~(3`7823 z!yx)tBYtOJ#x{(aV{H$qPj+@4B#W1Bjk4K=N)cB_AKkO2Q$zj|R*|?2n_ycyl!sVI zwDDR*u#EWg+v`urjU3hTDmXyUZZXCMrcB1Ov=u6n*)q3Jztu%)3_PQ zpc@_PffB!90UwAK5}AEioN6fdJ?#9!a`waonG_nwIX*;9@jrIcZ7hI)cLA z=#!A%!i)%upLUumI{^VF^iYQS6h1vFUhnEPvSUuJ6psTyzYct0GB=WI{9Wh|pH3{) zqT${jm%VBt`0grQv7o!-M(kOQ1A068tVdr+w93VRi+3>{tM!Ud=OT0~mAtMhfA+WS z-E@ZPsYIJ7X7REP`R>+s1dCL>!N$xmG{akYaDU_g`Fdo2Ig}hIL$f*;a&FNd?(&cj zLNzZAFf-tbPf)dg_o5sZKEd;w#|2f04q0||$4?xu+@mzViIvysjl0_ZAqpJXeEjfk z;+)QU#Oq={T1HXm)D^gGUTp_rHsF6F{3>XQDS_qCS>~{qDX=@daV26Y|IPW+od!Ia zyISvjz+XfRi3a`s!EI-&%5}5b5!h{R*ZU}6;N}S&p-FbOla5t0*Xpr$l>)aL!}U1` zdsaNF`LnCK7{zlklY}}ca9Rd(h`C-ZeiP>Bdh0)^<6=O(79DzYYiA#T;NpNkNe8ed@8Va4&5!X2BUuuMw)j^dv>pw_{-! z^gBI44fc8sv(E%CgV$-_M}+6mqwD;G$8Ts1bsK#qi)O`G+Q0{XXAr4yLQaj4Cc)03SOqS)`_Ls?GY@=lHg zyAdZu)1H4^l&iT`^YwbK?R-LNLD|I1`g7#X93|@HeWrM95tkbk>tpQgi9XRJ^zaDx;#0aWYJ=~ z^7!gDY1x)b7J4Mi7{}AX-0oq!@@q>b&ITp#=XBN2Quj_bxo@hyRyW7mhA_zSypFFx zKJ9k?l&Mw zeJXO5>cT65HpRH-KVn4oyiZfxoUsWA80$=`l%bSDa-n@5h$b=|li^x|>bCTra19F@ z!f!Zols9h9#@k7{_3M>EVWDgMGPw+KFKQCdsL1LBjB0dNy43S+tT@||1yVE8=P-wb zhPpUb6|-~jNdo|c1ida1sZn=|OEy(YOj^@?+5HuVq@mZTqE>&JiCKU)xXwWVYxWiH zv3FjCr#JJ@zW3-j^G=C+77OX_KERVws~8X4Qj7d7B^XZ3v-52r7evh-I?lt*fbR3x z*IXIl)LV5_D}i~tXC;u?rU)0$IL3fGsr9h`VAhvHSaKLyq?CM8W}vmCNsPLgQppnI z>_K(Sy5z5ZHPumi>Ydx$o~3A|=e)5v2H3R8Se(`BCg3rxd(@NsiC2z3#gc_;fAS+} z>!&7-iG6!J1a@vVxhI~d%2W(eD7%L~89tLVZKh^&GN@Y7K2{a zi=zpW=j!Mr(D$x6G5&*iz`=j#Q>(7$(5HD9v)%1f1~vw7QB zV1%EV7;-ccN|HX$3BN(+MWSb6@$~G2sMowVPJuIKV67u+tenp>H8txl7tsFwozG-< z0O>U-B@EfkVla+hQBKHCCAw&*73@fsLW+g$tR){CCtv;Sk2 zXGP3B7S&<747b*t3~~Kvf;??@Y2WR?K-j-Ca@`phFIK>YE;<*Gs<>diC#I98*9Ao1 z+ODiz;*=)Qhu!DIzp45IO=qYZUTOg0TB(FeeQkC5n>X!*3h0@YD{6DUo8jLJ9qOve z&bulRBw=Xd!+=^H#4+Cipu3X#_S${(IDBEWCQ4ET-FPU)#5R;UI(KV8-K+bGvaqnid}_|2IJ1` zoNewM2*%R!>=J(OXF8~3`}e3wsb9k#vwvB#l|n1!cd*%L*^ZLe(ESUrA2_Lcc8o@Z zb#^xU3uWoKbVJZc?BROPt-dCAboBuNS$bCbCgozUi=1Jr_6@J;d;mH)p&-BV{H@Pa zaXF;S!}P!?i4KCiO%i*-C{*t?+GJ$(^I3x8;;msoe#(Om68d8*UiM#mV2~sYBTJCi z5{v_tZc|1S-hh{h+u_|4o_JD8c3}Kt-v$d)ezIB#nqGf7 zYZF*>M=3ujzQ{b^B03oT^g7>+RcWd9;1hc1gJ7FPJ;=^-n?`Q%?Sjpd$RCd8vJERL zw0s9HT4g^93%#IrZ9CpNi1VV!uTV{n=mEMMQienwi#1qi=>J$$_On?Vqn!Oo;7ggD zD>p-K>4JLYzsH6KxoDyuV*kG<>Oq_Qhl(P-qC!Wl?21)IE?8RZI$5gh=sZ=FuVjL2 zf3;S0QVZwB;ZFBw1q<#~O<(YBbu$Q!%imQH!cIzC2wG)bJ+j`h8X&G%#a8l?cx`T7Jj zL_+&&%v&GkzXd#Zx&CEre4tlH%)6H;q4IX?l*Z*T^)nAQIKJm5rqsN)93eV!?-!q( zVLI(If@;-)NX)gG_Vh-~dW!=wjV6l^^~tfiqQc*EY>i@>c0IVnL?$fvXDEJ%d!SdV zBD$CluQ8HB&}ChES5VC5Kk)aUDdwX4Df!41z3svze$nlS$c&y$ z*9|!3D7t>XbEY~oLlhQgUKwN(cgIS8Pmtc}%GuuU=+q}8(7}>=xJe~qXsBnmMLENE zp{*LEoe&$nJht~c&Vk=Yz#{Ro zqWc*FG%C+EsBUjFdDC_D^!1tEW!$}Qy5Z_*@yiMk)y{x483mQcigrL_{_H36mt@IA zNk0>%$LM;qP9h(>6tg{e^WR|L^Tq$kz^k3uuk1NED5mft8@AOfd=YZBOS$g(=ar^B zW%(rk89xu92V^Co#j$oqoNBPdUKZb_)B|?kyh6_k9NGNN^GLNpzx}AD6BE+k-JLTM zp5+dmM6{_#Ya95d(dUeIty2)htfnK|4V*X;Bch~4_t@}3;_XcXf=e@Bah{&?-gT$#{8k9>azSRlP`qd|m$nx0(+ ze&n9Plk=IvprSoSy?Lz zTWOV`oGn1M0F?Tpi`_ykQAt{SI=IW@w z=Pup$eR1r&FsbpZoh80(R(=jQ1qp?k_SdXcz|ApI(HVm#aA5Dx2BWhlE{iq0J9Brm zz2MFXW6x!lwl_pQ-H~-S3{BkgUyeVqlPlZMOYPGy9oM@l;?Kss;dtBguv&+?Us&(R zs+_9mqf`wcfeQ|vn`j-Q+$)+@4QBJ2vVP*b#J5lPptjdTFNlhMg)OmPIo@`}(+_TZ zo7L@1C=C6eDKBrmb!ka6zX9kf$)G4L7s4O)IX`sTy%#5Soe?Eq{&R*;w@mr1BwA-m zm9d`!01QF+mQiy}C-pyzZt<6wT;M~$E4Ztkl&yEf>e^zb#HNx+>ewUYpGWr6mrB{y zzzTQh!CD>N;^1z00b9%QNkB`*!Qe&jO&S_VaU{6x`}g}Bn4jm2BgsAas#4ej=U62M`%Laa0M=<#m@G}6N)LOIwSNpM z&E{29!_d*7(*M!icLz1Kwd;G12T&9cP!It@dXX+5(gdS)P(VNkpoAuoULp`cK&lAR zLvPZn6zL$nNRgIEhtNw1J(K`<2fy#m@AI5Hb7y}4+&vj4Av?3yde>(2ywCf*PrQL! z&1mV%%S^Jn81}jQzH+(;-@Azn%CIFr{Vk~DJr5{bG56k}eRJ{ ztrm0sprsMoP#e9?y)I=ImPMMI%bu@fja2@yGZ2oeQ!cKA*;PGC;Hfv_h!n4!5mOlu zF4ZHj`eRuEO@LGd5Dp#@V914dRl3t{eAALeV`IkaagZPufwQQX7K5w|NZxpO;q(hg zE{6*h-^&qk>tF~_o<~Yb)Pkp{3*-I*U6ifJ{eZNr%<@=Aq-u+(L>_(AD5We!c9K~Xl$vENx>k1{Y#1x zaOWI-l`$gtN^pW($QFMnA#>%JJFNlK5$DH4t<;HsJ^dfOef|d)pY|0YQMmAs?Adi^ z{ld{VQEa*19I70#z_RS5rVD)j^J;=Znxx$(*Bs9WduN^o&Iso=-B(s<|7lIH2qLbZ zvbuDgjh|nr0GgABWYkRu{;XNz^5h zm2v8Xq$PPIO873Www3ec>oD;|0jKw`)k)tGs&;Ye1RtMSC@nX2?RbuiBr8W!al5x_ zTv0SSF!Vl~V@<}4WBxD}*R)`ospn(^ z+x8Faou6b{AJNQsvMOn2*!*!T5$)Okdw^?QU3|Oyab4U3p7&pyq;$>AtA~;aL=$#A zMqV?UvCrzptyP!@_!~p5f>U)A{ByY*bLu(`0P*dStam4}r+zdcBJPXX4Ce?5H0+Pw zacz99b?h$0g04Gi*gkEwS(R3?P-kGmp?6`j$19!e)~qDg)s*MO?JN~nQmQ#(XOd4* zo~P(ZZffKB`s(uI#w>~zK&Z2`Ebcr8$(m$3b6+*c7akAsls@T5JlZ1u;hi+I5% zAVd6CV^f99!^2Y$*JWA7kiJXP^bhW>E?k!4AqTdMFXgk6O5Zjq*=s`)!I$KdEwzhT z423`q*(r>)2ETUXVNnOay%i?ijp4`AqeIb3M{~!T498E7A+|!m)bjHTRA)DqBrP@ZyFc~VDJcP2N#blv zmWZ-(9k}3!P9B{;%(R)|{xu|9 zQvKm&|4CMn7zK;E?b%b|AjI(;_U?L(BRYE}Y3_`63Gr-xlJy&^&29@-+$cN3Vg57Y zkHVzgrTwBq{P>(zP~cnK#v>#6>_Fc}Y48pSl7HF>%(o@Cbw-b|TaWL5B-g;-u0nzm zFo=Y!F#~h2f<|!gvGW!gBXD1VL_l$rFMTaDs$yh>c=4w+&$2^zywBWX&(_69^%0&t zbro-!gMH+TxrI?BQ-3V&dn8*le2BDE2H1E%sUG2&g(>q(%-XADRF2rOHrC_VAyFvD zd)^L>JQC*>u5qs(r!7U|lxu^F89ZcU4TU*4527>z)+B`-QwP zJoaNy4EZpfcyFt4p?Z?DU7-em zK95OcTQ)SN67R39 z40La~_w?fQ?4|f>)!rgdYO#iWef3&rY4v6So{|u>e&yZ(z?6yIi<6_=+U_1%Lyq7L zj$hz?oi$|QqXH$ImUC(xwz}1bF80;xe#VZnX7dI)+Aiqi4%~!#vE-?AUoW!R4^gaw z&ju@Wxa`9w35m)kYPFkeh2AUitYy(5ZKKqq=CkQ+db^rDE2TH@7giU0V-3_l0cm)~<)-sw2k2DMa=ec*M^wm5uIHlxyt$V z_Ebbmbd0pnN?h%uTS0+BE-f;Ubmj=QAQ0$DA#!FO{XQG$!@QuQjZ;i3Rjqa3Ds@mw z6nTRPUebt-s;f6KYcGvtI29Ws=1q>!8Q|zeoSThZ5^~=VrRXwE8RkL~B+h#Oq z)P>rEIWOjvzs|lB7m~I1=+7?GdjyY`jY56b0FAig)P_Y8qLt_3jZ4jz_k<+!2)(^t zv7gmcx^A6xw&Y!GoAuU>5Fgg22g|e6Ry(;{4vc*P;Lb#7m%NnA1`h|zT)4(rG~$g* zFyeu&lzqI&?jyHp6AMBe0s5(YB|zj18=g#=+2q&qAYDhJ4D` zqMw4|IcCZbrq?!rjU?`8q+9bskMCrqmk)nnC6O7zeADH0Qmc-&wPJCMZqOV>db8%a z;<7ZRbBEH43J{S|1}E`qx%ZF3qh%D%jt7_$brzH4rl!0dcL7qs{R`l-qZ^w3l@Ew( z6WxT!`|*2hZR2S8BpToq;AdLU9N8NK@QoQtGpvvhrk~+~H8T}INA@afK-h9xgh;i* za_3LLb0s@k1;mCRl5}@}0y6DugjX1XurA8&lI54Zay%ech@0CU1t`n=e+=D>pr+KS zspS^JPy!da{^#x8C`ZF5oV(pBYQ?!?Req11YY-7xMfD=F!J(N8hYAx_cA9r58fR%o zQ=bhahqU_C=Zitpv-;s*jP2-QlF4O`duz95aJssi9Gnr|01q$YX~aNDiOO4Q6;HX* zXk3EMS#%?l>zt~TEI!`Zde)#^4e99UXs=?Jum|x1>EKAag6`9&-VPVPVM^M`s^~|1 zVw$XD(#=f25VX(bY81ZFlXX|Ug*bGUw#9HtUII#(YQpFS%DT1R}q)u~0c^dZP9{MYa|icsS-a4jddGr@&(1)yqjjNq#0; zkbZRnz}1l&P6&>OxsXWa*RfR6535mH#g`tk(PT05 ztq+T|V*F>l?>K&^$R4AhyS>`kY4_^;1S}@SX+!qaenc^{Kovie*>tBN6s8WR4Ql;h z(eM5jagDG^=(9PF$H%Vz>^+9h>n|^?!cwey!#`De3`9KI*XRRpAL3)>KZxDc^D2!9 z46G(1t}(v<0i}6iA_frQ46b1(vXqNsyXOCf5XERFGEnt01U=Y04lVyiDX-1LQ7qPS zOpLNea`EH^rm|Pht$a}5g4j-$nkX$D3>8aIw3^ZQAQY#%F~6=^*=VqH$)@Z&AL|EE z9|OTGYqy&PWarFyl`Qa2CRsFNq`gunN%-C=bFIx~rckaUQzSBBI*ov}Y5dMjQ6`G# zZx|M6qfcQJb1{`&-%$;N`=}$-3u+KogE{ z)9?SoS>@MnFZ^$OKaAf00{o(&XTz^6%*&odd?t<;i~|G9YTkmEk^Z)-k3_g-=i>ff z{C~Wk!^bCCpGJ8Z=^&NXfUsuQEn{E?y*TwZh~M(dO6Ee&D=~VkU6=wWq;smN>5Z7^ z-?Ao~GDLH4ha{KF%l0fb!`vhC#u>?3Uo>@xrL3p>j@cGAnHgA}9=#UX0XChp)S~_n zLzK49yChRA0AFwI8Ld@jV=1MG+g@1KJx)~9Xnk( zmT08uale?<6TbYZLtgUuz9Vt($cNVkI)yUYT)^qcC|7rR69>%lr|SK){)ivGkxM6e z`O?uG?3(+5DKwwz>>yb!@6J4B_#X;B50h*~OEcB)@1^`Hv{a<=k#4kD!GOfNZ-8+P zbrNB~K1x(CD2;YPuZAcmIPrb+P>A^aWb)5@_uEdAiGIuQTpX+A7S2&)D*{oSeA}J6 zQSkZlMk$)GrMN3fNiO%-{N&O+rwyyLJv#b+0rt9d0I+BO3$P2^ov<)4^2D_K1yMGU zHz^I`o~XSVf6sbsxD;i623I==?R`&2z4ufs_^ZGiW3|VJ$E0IV$S);Cb=uDS_%z5Q zb}MKCb3OjV(fEb^AXtFr7f@%L>DULeQu0P*Nb4F}$J_Yj1 zZ^1Tts%hIh9wwUjke_-K$zHb0KXPI@H-U8HmuQC1_kRW0Uj%Z~jl@Zc-R5#-u8Qc6}c~ZlyZwISYHE07O^eOcYQx<|Hu(f5X~$%><8cy^Vm#CB?&qiA(CnPZ!gcZ z=#iP%b#4u3dx5L9X!lGtbU9YSuqyWJ^q8>vHXxh@c{VP-wJF$CrL7?d1Snt6_v|?O zQzZ0pd2Bgs9WjtBPB`1)uUz!4ON;^o(v2m)p9V;F^NF)PEYir#mPe-6>x6dNTsuq^ zp`bS*8RoRU%mbDzgPr6tY2*;Guo&(AD4Tn-OKw?s?|R~q>ty`rGJS%m{%l^NrAYqF zyZ%9rc;ik}sJs-x^|$1XQe;fT4U|BSyMd9n;^%dmfj!Ocv3O_=1ecTgof}FTnjq3a zadl7mD0dTy_68&{9+{os7B`Z_ahz-NVGNB|A$L%qE$z18cfA;1fPF8Er6+5r_XTBB%qB2_mw-u+|2M=R)DV-XJ;y%PhGA9JMg$coU`5(dijk2=C+T~muFnfusHc)Q;fo>t zL-_z8xz=Ck1+xjAN4ewIM2vD151aP?4Bv5gIBNYC(h8$4^AihGdwcScJKDBqQj3i; z91y)QpL{3Uv*u-LiKC_DrmPCd7_T3?VEA*f_ijS%)rNswlZ zv^#9R5tie!AC=Eam|H}R!=s~irX_bbJZ#yqufmpJ+EBC9u6OJTy*Tf67txQPXHJ{@ zIGjXMcs4H&3rl+Q5Vs!)6qSM>?|Q~Mo?EpGXQATHWNOHveq4heAL|WIxq4}5B3yf- z0mf80{Cxa$I6lZ>zfj4|^p$qb@swdEh;5$f$R5`vC1nOopo;TzY59CXmCT*nwr=AOL6;U{ z?f*d8t%?CRGJpvoHFa%r?hb7j)fIrLmaftRm(CD7yKOOGIr1hGP_bBDxhCI->_%6%2$)6+Czflp@$&9|0URJ6majN@V~|A)^YYwF`r| z+X`7KGGP(EeYk5J)McI>n7h-yW8xPV_&&Xvsxq0P+$0Va|MrEg2@CqZI#n)5&@)|i z5XguBtWz9{^RK6zinAV!;vKIV7s&$%_xrlAC7y~gW*`RyG4urH3k(oe>!?U3s@ z*#pbHS0A0~$DZoCJk60}5N)#xZzV098tPYgHuP=kky$afCS(P;vp#fWemz8C@%0Lp zZb0O|fJ9+I&DhMXTce`x3o03Nb7(a1P&jixISidm%X8D9{T!Sz&1p!+M7Jiu84*0F zDd2MRKvlehqXDqj3d-A!R^|*a_!`N^a;|A<8(r#tAUoWf_TbN*tK>RK{dIcv(NX^i zuECjfe+So9GB?5{DlvmiYJHyp!>lDz-UU*+>=Lcc8>H=lFxONAPFfxJg~f6Iy%lt` zNcC#ktA1jm1B_xWsJU%k+hcx{Qd--A19yp$ZhW@&wA=x_2H=W#qFgEI1#s-Z<@#;S zA)x=q=GC(#{;bcr&|;+Kz?X8Vv%sggqmjS9*q!+soBBR^>@Ez*TZ+aCg5qU%+B}=A zCopgO`bLVO?^3n}@+i~*L%;>vTX1~ceHN1qiv1PF<+*~Hx0$-Qw0>N)Cb?Oh-?~RF z(8R;Uw2&Vq=>mtp3Hjc{s8CKtX>Vi=cOoLXant9*1UVG^r6j!f4c&w}xBe3vLPMhJ z_^zN{+a3TJdpnD>5#9H@_?Gmi_0YZ?Z95mu@WRmyLonFM8>RbeTGETEwm$ z*NR5|PW_%YoW47zp59-1A);>$hmLSRnxiOPi`kqFOxG~CuJ;)wq~ge5sQB;D`stga zHA4I9ruanNFOkbhvo`qY#4scTW`7lUe8J3OuTT3xevQMYi0z7xUv1;Ot+OqVek!-Q`{hJ2N4!Ay7RzRLs7Ni zwPHsU=C+5;{7mPJSP|T80JzzD{;Zla4SI_DCS%&2T`a3#x-}AKunj^>O3T_JXOIk( z_QG`3Jw6~%mKLv3TxD@VT3qRcm+pX6WtAqiiF*Tg_jd|E;X4_R?6h1YnzOyNXAj^> z5BzfFE$V}PwOwa_e6@~(mTSU+t+FJAD5Lqz{D`0Y5ggiIC$Te-pP=JWg-?v%S)YJ* zB2ZJdJBMDenU+@mp4~R#O^0+AC(X?sUl$fWG*{aiGoJ8K+807(4@ypAE~ngXV&x`K z)z*MY$~IokRIKkm&O;{3@!y1D*|o&UMH$l#Um)Cs;+G{>G^fhJVxMFopJAtru& zJBesQ zx~#OA4$zO)CnalfP_hy-NGm{F+;2bQi>3`NmDL$Ontf@^dD1p52CulY5dTkLk_Gj5 zsuxga&-^@C%J4mjI;tzH)q#KQxWjKBvOiZTZcO7k@~A(Qen2v{V(_Wm>XI`wqR&c5 z0MM(XzA(xAv`HS<$X}x-O z>|hle`CXygQI*I=>HDtwZ))Rd!#aIgFK$=%dRe#oc<8B$Kib@MrGZEIhnbcCNn$}i`T(j{S2Pymc1?8)o@ms_<7 z%LX9L6;wfeiG3Lx(%tP2Sb5Z|v`Sf!Cflp=uu9==j)wEqJ7+(_YBd&LcRLdoO|pjF zXBs_)0y1QtQWr+9ORHP&LZCyEHG5xrWs{Kzknf^H-$;!d>GV13QzM{0BE!B0Q6&k( zboogkz+nGE2{&XlVr$FZ{`>(kFOcTFH~b00&@o*q4>ZgxT?4T!UZlK&g)Z+!$nAsc9CS& z+e4>xAkFZDB6U!=06*o95ngdY5|V)UKYi<>13oO)>DRsPP@<}cFWrXFPpha7pgg)r zR>(Gt3QeP6-xIk01(xJ=$v~~^(%SnYuYjuQo|$k0+vtT0e)yz zot}lXYpE5K=->1XFT~u$G92uRG*ve;aW|N)GlQj^a@b6NE?*J=OrJAr6C%Rx?qI5Z zI(BL$G1A#9Qy5dQ=R;Ex^THTp(gT$H=5MF5LL?J^rs#y;0eF{(J8X+sqe=yuJi8 z$h4$;Q9$U_w;pPFX;w<;WNalh^c>{(1Nx%u#Zk8c74Hf-uAjAA%tb%f?Z?+G4|!B3 z&~eYdc~SB{jOl1U!alJnl^1We;8QsIoU<|ROl_h{mqzL}=dJJj_}$U;6zF(Dskld7 zl*Ua-i@5yH^-*8<2;|^XYam>fx3AY{6@SR77QC|5=xUAp>eDTDvTI(wkDm;Kbt(S+<3I%z zxH$s{9%3(rMK5~F68}!Td{-$rKLhx2n#{qU_3sx4yokwvKd0G0``A|eii*CFP+z#9 N^jIBKB>&RqzW|+(_vrut literal 0 HcmV?d00001 diff --git a/README.md b/README.md index b095dae..3b7f19c 100644 --- a/README.md +++ b/README.md @@ -45,3 +45,5 @@ primoridiales en programación con Javascript - Desafío Conversor [Gitea](https://gitea.kickto.net/devfzn/desafio_conversor) - [Github](https://github.com/DevFzn/Desafio_Conversor) - [Emprendimiento](./009_emprendimiento/) +- [Spring Boot](./010_spring_boot/README.md) + - [Base de datos](./010_spring_boot/base_de_datos.md)