From 1646901adb4d12b4c58392152f21603622d288ce Mon Sep 17 00:00:00 2001 From: Ladebeze66 Date: Sat, 16 Mar 2024 17:25:56 +0100 Subject: [PATCH] cpp09 --- cpp09/.vscode/c_cpp_properties.json | 18 +++++++++ cpp09/.vscode/launch.json | 24 +++++++++++ cpp09/.vscode/settings.json | 59 ++++++++++++++++++++++++++++ cpp09/ex00/BitcoinExchange.cpp | 12 +++--- cpp09/ex00/main.cpp | 18 ++++++--- cpp09/ex01/Makefile | 6 +-- cpp09/ex01/RPN.cpp | 43 +++++++++++++------- cpp09/ex01/RPN.hpp | 12 +++--- cpp09/ex01/main.cpp | 10 ++--- cpp09/ex01/rpn | Bin 0 -> 70536 bytes cpp09/ex02/PmergeMe.cpp | 4 +- cpp09/ex02/PmergeMe.hpp | 4 +- cpp09/ex02/main.cpp | 18 ++++----- 13 files changed, 176 insertions(+), 52 deletions(-) create mode 100644 cpp09/.vscode/c_cpp_properties.json create mode 100644 cpp09/.vscode/launch.json create mode 100644 cpp09/.vscode/settings.json create mode 100755 cpp09/ex01/rpn diff --git a/cpp09/.vscode/c_cpp_properties.json b/cpp09/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..c2098a2 --- /dev/null +++ b/cpp09/.vscode/c_cpp_properties.json @@ -0,0 +1,18 @@ +{ + "configurations": [ + { + "name": "linux-gcc-x64", + "includePath": [ + "${workspaceFolder}/**" + ], + "compilerPath": "/usr/bin/gcc", + "cStandard": "${default}", + "cppStandard": "${default}", + "intelliSenseMode": "linux-gcc-x64", + "compilerArgs": [ + "" + ] + } + ], + "version": 4 +} \ No newline at end of file diff --git a/cpp09/.vscode/launch.json b/cpp09/.vscode/launch.json new file mode 100644 index 0000000..554eb5c --- /dev/null +++ b/cpp09/.vscode/launch.json @@ -0,0 +1,24 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "C/C++ Runner: Debug Session", + "type": "cppdbg", + "request": "launch", + "args": [], + "stopAtEntry": false, + "externalConsole": false, + "cwd": "/home/fgras-ca/Bureau/CPP/cpp2/cpp09/ex00", + "program": "/home/fgras-ca/Bureau/CPP/cpp2/cpp09/ex00/build/Debug/outDebug", + "MIMode": "gdb", + "miDebuggerPath": "gdb", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ] + } + ] +} \ No newline at end of file diff --git a/cpp09/.vscode/settings.json b/cpp09/.vscode/settings.json new file mode 100644 index 0000000..bb879da --- /dev/null +++ b/cpp09/.vscode/settings.json @@ -0,0 +1,59 @@ +{ + "C_Cpp_Runner.cCompilerPath": "gcc", + "C_Cpp_Runner.cppCompilerPath": "g++", + "C_Cpp_Runner.debuggerPath": "gdb", + "C_Cpp_Runner.cStandard": "", + "C_Cpp_Runner.cppStandard": "", + "C_Cpp_Runner.msvcBatchPath": "C:/Program Files/Microsoft Visual Studio/VR_NR/Community/VC/Auxiliary/Build/vcvarsall.bat", + "C_Cpp_Runner.useMsvc": false, + "C_Cpp_Runner.warnings": [ + "-Wall", + "-Wextra", + "-Wpedantic", + "-Wshadow", + "-Wformat=2", + "-Wcast-align", + "-Wconversion", + "-Wsign-conversion", + "-Wnull-dereference" + ], + "C_Cpp_Runner.msvcWarnings": [ + "/W4", + "/permissive-", + "/w14242", + "/w14287", + "/w14296", + "/w14311", + "/w14826", + "/w44062", + "/w44242", + "/w14905", + "/w14906", + "/w14263", + "/w44265", + "/w14928" + ], + "C_Cpp_Runner.enableWarnings": true, + "C_Cpp_Runner.warningsAsError": false, + "C_Cpp_Runner.compilerArgs": [], + "C_Cpp_Runner.linkerArgs": [], + "C_Cpp_Runner.includePaths": [], + "C_Cpp_Runner.includeSearch": [ + "*", + "**/*" + ], + "C_Cpp_Runner.excludeSearch": [ + "**/build", + "**/build/**", + "**/.*", + "**/.*/**", + "**/.vscode", + "**/.vscode/**" + ], + "C_Cpp_Runner.useAddressSanitizer": false, + "C_Cpp_Runner.useUndefinedSanitizer": false, + "C_Cpp_Runner.useLeakSanitizer": false, + "C_Cpp_Runner.showCompilationTime": false, + "C_Cpp_Runner.useLinkTimeOptimization": false, + "C_Cpp_Runner.msvcSecureNoWarnings": false +} \ No newline at end of file diff --git a/cpp09/ex00/BitcoinExchange.cpp b/cpp09/ex00/BitcoinExchange.cpp index e7b1dc8..b5dd972 100644 --- a/cpp09/ex00/BitcoinExchange.cpp +++ b/cpp09/ex00/BitcoinExchange.cpp @@ -6,7 +6,7 @@ /* By: fgras-ca +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/03/04 14:56:17 by fgras-ca #+# #+# */ -/* Updated: 2024/03/04 16:52:42 by fgras-ca ### ########.fr */ +/* Updated: 2024/03/16 13:28:08 by fgras-ca ### ########.fr */ /* */ /* ************************************************************************** */ @@ -45,7 +45,7 @@ bool BitcoinExchange::loadPriceData(const std::string& filename) std::cerr << "Error: could not open price data file." << std::endl; return false; } - + std::string line; // Ignorer la première ligne (en-têtes) std::getline(file, line); @@ -64,10 +64,10 @@ bool BitcoinExchange::loadPriceData(const std::string& filename) std::cerr << "Warning: Malformed line skipped -> " << line << std::endl; } } - + file.close(); // Optionnel: afficher les données chargées pour vérification - + /*for (std::map::const_iterator it = dataBase.begin(); it != dataBase.end(); ++it) { std::cout << "Date: " << it->first << ", Exchange Rate: " << it->second << std::endl; @@ -80,7 +80,7 @@ bool BitcoinExchange::parseLine(const std::string& line, std::string& date, floa std::istringstream iss(line); std::string valueStr; std::getline(iss, date, '|'); // Extrait la date jusqu'au délimiteur '|'. - + // Supprime les espaces en début et en fin de 'date'. date.erase(0, date.find_first_not_of(" \t")); date.erase(date.find_last_not_of(" \t") + 1); @@ -93,7 +93,7 @@ bool BitcoinExchange::parseLine(const std::string& line, std::string& date, floa { // Vérifie la conversion et s'assure qu'il n'y a pas de caractères supplémentaires. return (false); } - + return (true); } //Calcule la valeur d'échange du Bitcoin pour un montant donné à une date spécifique diff --git a/cpp09/ex00/main.cpp b/cpp09/ex00/main.cpp index f3c6e7f..e62f9a6 100644 --- a/cpp09/ex00/main.cpp +++ b/cpp09/ex00/main.cpp @@ -6,7 +6,7 @@ /* By: fgras-ca +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/03/04 14:09:27 by fgras-ca #+# #+# */ -/* Updated: 2024/03/04 17:31:07 by fgras-ca ### ########.fr */ +/* Updated: 2024/03/16 13:37:43 by fgras-ca ### ########.fr */ /* */ /* ************************************************************************** */ @@ -27,6 +27,11 @@ int main(int argc, char **argv) std::cerr << RED << "Error: could not open " << RESET << inputFile << std::endl; exit(1); } + + // Ignorer la première ligne + std::string header; + getline(input, header); + BitcoinExchange exchange; std::string priceDataFile = "data.csv"; if (!exchange.loadPriceData(priceDataFile)) @@ -43,9 +48,14 @@ int main(int argc, char **argv) if (exchange.parseLine(line, date, amount)) { // Vérifie que la valeur est dans la plage [0, 1000] - if (amount < 0 || amount > 1000) + if (amount < 0) { - std::cout << RED << "Error: Value out of range [0, 1000]." << RESET << std::endl; + std::cout << RED << "Error: not a positive number." << RESET << std::endl; + continue; // Passe à la ligne suivante si la valeur est hors plage + } + else if (amount > 1000) + { + std::cout << RED << "Error: too large a number." << RESET << std::endl; continue; // Passe à la ligne suivante si la valeur est hors plage } // Calcule la valeur d'échange du Bitcoin pour la date et le montant donnés @@ -66,5 +76,3 @@ int main(int argc, char **argv) } return (0); } - - diff --git a/cpp09/ex01/Makefile b/cpp09/ex01/Makefile index 1357b18..d9faa96 100644 --- a/cpp09/ex01/Makefile +++ b/cpp09/ex01/Makefile @@ -6,7 +6,7 @@ # By: fgras-ca +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2023/12/27 20:57:42 by fgras-ca #+# #+# # -# Updated: 2024/03/06 14:40:11 by fgras-ca ### ########.fr # +# Updated: 2024/03/16 15:36:22 by fgras-ca ### ########.fr # # # # **************************************************************************** # @@ -23,7 +23,7 @@ CYAN = \033[0;96m WHITE = \033[0;97m ORANGE = \033[38;5;214m -NAME = rpn +NAME = RPN SRC = main.cpp \ RPN.cpp \ @@ -41,7 +41,7 @@ all : $(NAME) $(NAME) : $(OBJS) @echo "$(RED)Compilation fixed... $(DEF_COLOR)" $(CC) $(CFLAGS) $(OBJS) -g -o $(NAME) - @echo "$(GREEN)Compilation complete. $(ORANGE)Type "./rpn" to execute the program!!$(DEF_COLOR)" + @echo "$(GREEN)Compilation complete. $(ORANGE)Type "./RPN" to execute the program!!$(DEF_COLOR)" $(LOGO) clean : diff --git a/cpp09/ex01/RPN.cpp b/cpp09/ex01/RPN.cpp index 361e55b..3637626 100644 --- a/cpp09/ex01/RPN.cpp +++ b/cpp09/ex01/RPN.cpp @@ -6,13 +6,12 @@ /* By: fgras-ca +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/03/06 15:04:53 by fgras-ca #+# #+# */ -/* Updated: 2024/03/06 17:18:53 by fgras-ca ### ########.fr */ +/* Updated: 2024/03/16 15:46:23 by fgras-ca ### ########.fr */ /* */ /* ************************************************************************** */ #include "RPN.hpp" - RPNCalculator::RPNCalculator() { std::cout << GREEN << "RPNCalculator default constructor called!" << RESET << std::endl; @@ -38,11 +37,11 @@ RPNCalculator& RPNCalculator::operator=(const RPNCalculator& other) return (*this); } -float RPNCalculator::evaluateExpression(const std::string& expression) +int RPNCalculator::evaluateExpression(const std::string& expression) { std::istringstream iss(expression); std::string token; - stack = std::stack(); // Réinitialisez la pile avant de traiter une nouvelle expression + stack = std::stack(); // Réinitialisez la pile avant de traiter une nouvelle expression while (iss >> token) { @@ -53,7 +52,7 @@ float RPNCalculator::evaluateExpression(const std::string& expression) { throw std::runtime_error("Error: Invalid RPN expression."); } - float result = stack.top(); // Stockez le résultat final avant de vider la pile + int result = stack.top(); // Stockez le résultat final avant de vider la pile stack.pop(); // Assurez-vous que la pile est vide après avoir récupéré le résultat return (result); @@ -61,35 +60,51 @@ float RPNCalculator::evaluateExpression(const std::string& expression) void RPNCalculator::processToken(const std::string& token) { + // Vérifier la présence de parenthèses dans le token + if (token.find('(') != std::string::npos || token.find(')') != std::string::npos) + { + throw std::runtime_error("Error: Parentheses are not handled."); + } + if (isdigit(token[0]) || (token.size() > 1 && token[0] == '-')) { std::istringstream iss(token); - float number; + float number; // Utilisez float pour lire le nombre, cela permet de capturer les décimaux iss >> number; - - // Vérifie si le nombre est strictement inférieur à 10 - if (std::abs(number) >= 10) + // Vérifiez si le nombre est décimal en comparant à sa version arrondie + if (number != std::floor(number)) + { + throw std::runtime_error("Error: Decimal numbers are not handled."); + } + // Convertissez le nombre en int pour les opérations ultérieures + int intNumber = static_cast(number); + // Vérifiez si le nombre est strictement inférieur à 10 + if (std::abs(intNumber) >= 10) { throw std::runtime_error("Error: Numbers used must always be less than 10."); } - - stack.push(number); + stack.push(intNumber); } else { if (stack.size() < 2) + { throw std::runtime_error("Error: Not enough operands."); + } - float operand2 = stack.top(); stack.pop(); - float operand1 = stack.top(); stack.pop(); + int operand2 = stack.top(); stack.pop(); + int operand1 = stack.top(); stack.pop(); - switch (token[0]) { + switch (token[0]) + { case '+': stack.push(operand1 + operand2); break; case '-': stack.push(operand1 - operand2); break; case '*': stack.push(operand1 * operand2); break; case '/': if (operand2 == 0) + { throw std::runtime_error("Error: Division by zero."); + } stack.push(operand1 / operand2); break; default: throw std::runtime_error("Error: Invalid operator."); diff --git a/cpp09/ex01/RPN.hpp b/cpp09/ex01/RPN.hpp index 5bc27c6..7c6fbac 100644 --- a/cpp09/ex01/RPN.hpp +++ b/cpp09/ex01/RPN.hpp @@ -6,7 +6,7 @@ /* By: fgras-ca +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/03/06 14:49:08 by fgras-ca #+# #+# */ -/* Updated: 2024/03/06 17:18:55 by fgras-ca ### ########.fr */ +/* Updated: 2024/03/16 15:52:43 by fgras-ca ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,10 +15,10 @@ #include #include -#include +#include // Pour std::istringstream #include -#include -#include +#include // Pour std::runtime_error +#include // Pour std::floor et std::abs #define RESET "\033[0m" #define BLACK "\033[30m" @@ -39,10 +39,10 @@ public: RPNCalculator(const RPNCalculator& other); RPNCalculator& operator=(const RPNCalculator& other); - float evaluateExpression(const std::string& expression); + int evaluateExpression(const std::string& expression); private: - std::stack stack; + std::stack stack; void processToken(const std::string& token); }; diff --git a/cpp09/ex01/main.cpp b/cpp09/ex01/main.cpp index dec4d34..28174fa 100644 --- a/cpp09/ex01/main.cpp +++ b/cpp09/ex01/main.cpp @@ -6,7 +6,7 @@ /* By: fgras-ca +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/03/06 15:13:10 by fgras-ca #+# #+# */ -/* Updated: 2024/03/06 17:18:59 by fgras-ca ### ########.fr */ +/* Updated: 2024/03/16 15:02:24 by fgras-ca ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,13 +17,13 @@ int main() RPNCalculator calculator; std::cout << ORANGE << "Enter RPN expressions (or 'exit' to quit):" << RESET << std::endl; - + std::string expression; while (true) { std::cout << "> "; std::getline(std::cin, expression); - + if (expression == "exit") { break; // Sortir de la boucle si l'utilisateur entre 'exit' @@ -31,12 +31,12 @@ int main() try { - float result = calculator.evaluateExpression(expression); + int result = calculator.evaluateExpression(expression); std::cout << GREEN << "Result: " << RESET << result << std::endl; } catch (const std::exception& e) { - std::cout << RED << "Error: " << e.what() << RESET << std::endl; + std::cout << RED << e.what() << RESET << std::endl; } } return (0); diff --git a/cpp09/ex01/rpn b/cpp09/ex01/rpn new file mode 100755 index 0000000000000000000000000000000000000000..c04fb6895b2af94177a10310a480c76b657f63da GIT binary patch literal 70536 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 z

*K+9vyEDK(i*_AF|U%Vd|E7}yK3>}b{eo}*-YM%G&5KqhrOnf8}UP3Iw?hEhV~073ys1bdzy3`GOH%BhLCkK3+Pf<#{v0Hld6=& z%5GS&dreGt;xb~{!J4Ix|D2NT8E5d=qbB{~7Q0F7xw*EKzk@f@qi`Z=*lEC4@>@>w z79;0mch1{XPBI7EdR9UPF~0s&GgoxOa$4|m{cSLvmi|-Xh4_h^*G*_)%|*c=pIL`MCwi)%x&tW zA@UpKc6jRyM|*hd0eT-7d_6(*S#5p9pvjlPoA0}Y(+n;Z21FMI6MPxm9>CxPVL)_Y z@G+sx`3_O;QG~l{Gffpdg-{c9ycVJFyIh?|j=`kI-X9C;_PIcDEcq(9L^{H24b)AHqCJ2{psDbmseFXWbFw?}7G|7I zw+S3;2J&3t6ErQURnzA85M?BHlGy}D^KM|9{WRA~*vRRv zlqYk=+ptyCqzZH=*0Vm8GTK#6sPHF*oy1rPpfK~>#gx+4iqanDjWDH%_ElV$GQq=0 z^Q2rC_C=**SmE5Y$qh}ADY>DJ|I)@yasw$e*|<8{*qLlxnQUy9TD~jV<4r6rK6lR| zRI@#kTcvD7b(JB=e6CV=RhQExj}cR0=C*`4Xq+lbFc{Hqzkns#n}cO{3_)c7DJcRy z&qZCz=qKIT0^}frZtr{+U@nx$U1ge7P|Z?XzSflRHTTfq(9hcrV+a_n;(^wnZf7-Y zdo!VSA#4ezrXm#DL$67(mf;D!_59t#$=O|@9Sj)hQe+@sWk-m;K$zZ&bKMGalA-iX zyXkrsbMwUJA9kmw5YI?^ek9USgabEvkBnxhVybg!$ArBB@yZZ8Bt-`YE23Eq7XwDMrz zrzO32t8EtT9jNK=cMv&fEIIul8e?bm8dvgFdhkBGgkdBu<$4s0Cc#04dqfN0;+0i+ zD|{BFq)4(cKiN1j*_e}T9Gz?oB^yU38?z+q52-5hQ=XnV{B3Gxc&pPpc1!|YcAE9m z8HvOa*Rh_kHxyoL1R>K2+dj7wXjlg8q>)gV4G@<|VUA1Ib54XQ6x6iOi9}kS!ays8 z-4u+Bv^+UPrqxH#M?fP>BS`y1+Rq1N3T)uKiIMgh(Ea%%kQ0gR2|7*a2(LGFN?z$X@=7h6L!d$5rjEN4ztS|?VeXjQ zsX_!DIwX>feag>E6~9s0^S%A?gTIm3;gwE*z_dg5C~lhzvo7q1LU!2-NkRLeJzF2> z^7BTbMaXIU3ff;F6&X9B`WTG%LD_Hd^lT~y9d2sCY;ocM@`YqiZLKuVN7^MwK&QxQ zOMX^l(o>nOYspKgNI_-nP_^+I_H!Np`ZOjnj!rdb zxP=`>H0SF^R1uNGi#=(?d(>p#Mu_p-jX(#S7uo(kiP^r28{rJTe%^{-#cJ;;gpqUG zf>p>}@^f(%+kXO{G<3-D`(G#Rh-y}G^V;W(=Ao&k#sd*OB@TK+Et8>y#QAs^Px?PL zx;ycp$p~Yg$Gvn^0o;H+^t%u}C7$ea7-l#OPo!7Ra6cbemAiI^`%Wll`Bu}SX{eL? zY@fSTjH|OB<=CTkCr0Adh<>l9_x8Coi>V_@xRl)x-Wivk_yWDnb58z57*2egBwzwX zpYwa0&M;49gjQ!z-EDs*1yj{KaGs4>3#oBP!Ai~ZCr|VM55W8Y^YbGuiFB$o7v+J7 zPz8Xrgyk+>$Za81KFO2LWXQ9_dt7ok)f?18$Q8vk8ZBc3-UrN|C~rxxw{lPWuN>Jg zbtkR>3p1W1jYiOA2q_v}Aq5-}EljP%>%6gn)l_)BYzF)TXS#5J)Tj8br7IQhTO-|J zie%B5=x1j<9KzyfAt!3!pl725K}hp-bsXoQm?o8TalnL3`9mTnf&KG|$di4zw9tb} zdbz@mgMWv5NGZJv-3Ptnzd|B|4eNgqb460cF}=KceL3-(MpIZrrCRTIgI8D`Gl+%e9=aeH}zT;v&sE>Y? zh780~fgm7e5nJeX)vS$?ZfYR45U=^9RV#7AYtFc=#=CU+4R}rbk-2*N9d64Nob^G2 z{W}f=*M9c8WcS@rx9 zu!8o&9$3P=(j#F)bFw>esM58eBV$`c@_bAqNX3P}K>HGjzmV#J#%JPWVu>vZZXHL_ zyD%(AM%sEJC!m9H?}d8~P0t^x4&^c*Mq{={PUwkbKDaB=_MxK~WU7N%pd@b1^rLIX zrho{3I!aeWVw)OC+2uES`DB=^($?}?*BJ_EUcW>MAPM+dgm*sxQ**B|*> zYYM|v7x|5Qxa%$9=g{7{>y=;TK0T5TC18$U9`(M7dx2^mb+1Q8zoJav(H5$QrYW)t zXQ4jym4sE{5R#*f@WEVMUA41|#zx>C4TqL$-=sr!x3~$Hs3REK8;Nw7J5O(uz&?@Z zYSoYsslklHr~{Wdv`%p24Hw>@3JgB)x7DKdiV&{ifG(e;Q66ikvJcl9?xSAP85i(b zd11g|Jdzt^p9v5#4YTbj(0a6sY+2rCH64_AiNu%`?py9TGK?SYFzR7{mO{l*Mb>t9 zOH}@Q-$<;Y@;s9IA~#1q`E&=mD%=s`RycNL|o+qQ@BaI`0a~yL`Y^dh-apwefoLW%RDv`#@N^+ z>GHvsq(ei*&7~qRp}F}>C49pzVU8i;zkMXU^iN(1X)QC40{OPbHqx57ZNqv7tJVRS z%H%a{E9c?KxK-uju2;8>TDS6|TIIp$x{O1P)*gjrfG~g*ta4(FbIo;Xo3xMfaGe-V zN)T4_2!kb6+tF(ASmSEv&`jPgGNE@UUTI&&Qm9V)jJ4CjlC~3(f>-UGdXR)6PRUY> zzE)~5c6X_G=5_zWYa0>BsG&9F4D~h4-EQtLvFp!EuvOd|CwRJ#2)J&-E-SoN=GRq( z)xuND>`l)9;rwdXnHC>v6QH?3O)8hEHnEP{TSajRlHF;_F4o$reuWLuY7GLg<{YsO zW&u{Qa-7xH7j$f43)?KhCK&7N6^lsZLx0HfC{1w(D0Qn2_&08&bIWkaGH6sw6`f=) z7~9+bm-dD2xkNVKS4BvB?RrX)8DZ5t#;UG6Nm&)_3%3%um)J;NcK6aSY6&fry}gt{ zgm$eC-S7|Sh{5b7r32+2Uf}Zw^r-5k=17Oyr{6$gCHcT6xq$>vZXkio*+)8)U9DQJ ze*F&B7Bx+Y!v^D0c7Qyh_;1lDBE?Ts2Lgd(@pxKV+q%eckHsy2XCjYs-4m_7Y=?UI zpac(4#wz=GjjkHDf3*Qh#WR1<makU8043l>7!o zt92*sj}I6Te`0LVAl*V&!^Dw!2PwQfZNjy>2WdX-MhqOJwXVvwNEh&yz1LQ!DUs&G z(!?TRnRHatowynI(j4RNk~Sa21>kqSe01(6+ae?RhB~UnR7jEDo{Y{_+~2M-IgQ+c zSQ4abN(|C5)kHL{&i0eVOc5=ZgY?doWRaxuwFs2;%Jb)cbhOdFimjEmlREm@*YlkD1TJ+Xx}J3wn(5D> zkeWSCz^mqUv5OZoP@77Mt!q>1GU8cf@LZ2~;rSB1x|Yfri4?|p*Rq&u)hUZ!`_T5l zq^BBBL~*Piu%zoK0>ry=u>a(PKqB#y4QSXMB`sv6%^{63A}+fI$THX@SKSv&To}C32c@i&|(rc-t4W1vo*OrKVRfSxHE9`s*Mf~)aKQ9 zF;+VVEQdp^CORtNO>5q`-lba09XvZwW_^4u{GJ;%+n^PU*rSlyME=+h})0^l}a`+C zE!!B#eC#b6ys9l4NY{@>z*M^v@2W;o8Y8|t@iNjd7LtQ+`@q(4zGo(}mQy{&YdO3^ z=}$G_{3X0=2k#y_*=f&iGBA6(DA2-x7Po4$62~hlUu20*miqVIkw%S5OpSwMy$L?8rjNW!$R?%YX6>?|~inAJI8fT45YhtO4OM{pDEX|&Ng6|SXlmss@q zXr$>GY`f8Cn9$+kH=UBIU*@oC%+n&f9J{OTM2X_7n+S49ixV*3^V}tr(8D3LV@wM7 z*`Em)a0>2nd;7XsLWq0_u@yS$GEGq(@L}d63t+qZYaey%9vz%MP6u*4iMqFt-tJZ` z+ym*WZz1V(Ztf3P>n157jU&4~Z{WXQ-{S_pq)+nDv*ww7`oISIb}~(0tkgDDry;NE z&l9n6Wc24(9t{srDEK9#!Q;a^!U&@2?7KVBfbiK<`$TOdYy!yhFKlabObv@bvWXhf z_7sh0Z1_wHcV*tB=bP`~V``M;Tfc(?$mLUPoXF!qpkrP#aU`YbW}36*1c#&C2XSUC zHBva=9qy%xYR5?|0WIj;&l%0G^2s;TBA>hx=@@k&Rr5XzmIn9KOS`_ka8HTFf7nr} z-P8QdsIfcT$IMRgFzbs5vy`WuY3NZ}{ zm~(pIrZkC}OP;& zfL*$OCh=D^L+k!1>P&33y8SA=6(ZncRhiF$f3_1!iPG~E?v9q8JUIQ0B z`2^kVcdjF)x^F;SwX=t%Hm^cL_KD;e+B$Lo1`17BL+G8n-*LM3?ElJ*kezhhM85Y(O?=O%i9dgmnkZZ8)cbPlng&+_vloH_ z3{ISo0V0jN=w#P8jaF&)BM;HYawZ?z0o|&U#M?>grY)2dQA)}OKnIh`OkMGQs2osW zTSJZGE=<5s0hjCuuNCaQ3R|S~+AP=`35#F#5Vrj>?h)5+A9wR|a*Q3`>j@VyL%E(R zJySTy1{+6SFH$e4>DV~2Yur(z$7JCXes#UqOY-T4>L$Icu#VK!SgxiSy_T5T<&4d1 z@GfKXKD;L0p=#t(uX~*S7mW2RQ?9VK%o7OfHr6tlA9StkObbVK6J#~k}Qjs}=^b=PM9mO&YMM%}(qu_`6r z|rJFu8WWC{BgG39*$sr zpSdE*DskPt+wdaU-P{l^9A?3=v4$#yi^LDr*-;cWqih%Gh~)wfq{5@I?Jxv$+3Fot z$k=R*jtiJKT>>4Mc$&`iImVw%do#f0sOoTal&-b#Ewq>E&Sd+SSK1O@Jw!Dsyt?sP zskKWctiQd$Ey_WQCL+^H-d;tEt^jk2$5}+3`C%t>mYKPbC2#N@vpu@HQxcZLPES7>p=w6x%J6hFBVUL^?vQ8#LED$4nws{>e9t=uYHL5j3< zTV#0jaAj^q{&oY{wQ~X2v=OAswOGr!hgco7z78X1E%w${56~K2ueZ0h(x_4GbJwxj z)LglXW>1ooG^tSUI&B?k82PpL#;|HafV!~FX%i^X&I-)Fxfkq7o)4*4-}Z)}8p(Q~EkJ76+5QI&KN zrUN^C9kixn1H6qT!N7ChGrkt}IsHH$a~^8ii2h&S*0VBvKl*JWJW@nK{D8@E+xBHx zEVJzkS8z^L0H;*68K3e(WKvJ&HTUvlPk5Ty6!|20I$Un)7{-@co0s2j#fO5p9y4>A ze9$41vQ^#U+A5_+!y|8P7%eHBv*6yB;s+cB2E3m78)l8|`;j{!shnH0U`A0LRqrmU ziv5dPt)L|{3M;VkO@541-)kJk~ zH=v0mQo`L#w{%X!hC)KA4~>`u0Sf{5lV;C&iDaYZVP~dI6itG0sH`spLrL6{XSgNE ztxlhC*9@D19q07391*^w(nIheotbA3@Z`8HvjESOIT)klVJ4jDt$w2&7}RK6UJ(T(gl2zRivY zNDd=bMX`JuRU94Qb}xQhHgGE++iWMnis-^CdRtuyhK@!sIWa; zPB%ngFzR9&vQxicSPpAtmGQ875~v>0p88Y=a!`Dl0<@a>x`f?PpRgXtw9rDfzCP03 z^^4#IkQWue=2X=cTRE?5nq8yx*lXxchXju`5sNn2OH#kPXzQ2{q{r)Q315#jm|m1Z zaBgUSH`S(!Ij;Xrg{>pj&P@9ZW7ThYjD0%lvfJhS+Kdg}eSlbVc9-0pY;=CRiyny~ zmq?(cJx9sKO?IRm%UD+ob0nh%#xS?}$axma>G?U;d|22znoS4D!G5{}kWozmU=F>0V*#C}~ycRU1y(0;L< zID-Q)HyK?k+YBhPOAQ!!r7u4fhSS4lrusc5V0YpraxuKm4^nqx3nyu?VT9no1;2%P zF0qM_F8`(%4FlL+<7T(SkKLOC*!lP-_J7CGbUc{E+v=><`gCJcAMkUCt1Lk0e*!vbY zeoFH3aR;bfJhKLFU7#@P(%TpHj?2=O-K35xR?`l~MEX(Mm+fGT*z@YuCWg`E@aoLg zr97qRHg`#zvsettidM^89Ysqk_5Q|B`mu{S!D)jo{GvLG;4bHxkX2?BEJZ;uGIrZD z5{Y$;Tj?IA+P01P{J+xEr}*~tp&r4VRvZ0IpF7yo{uTz*<+uz&J61kjepeT_oVz^y z`W|%op?fYtOEvFXDYKh|y(_$V`}!DFKPZlU8=ZAOROQ#p?>#|cOAGCRVH9jovAL_4 zQ-9{$%X&vkCW>7c$cF!soma=>(N|zpz-hW~`1|ezeKCi>^Fpy%cOs8e-L5iw?$#J#=Se@`BiR%bkH0o=d1 z;Ybu%v;!e99Vp^se#a*|>7ZDJsUV86GY1@4Q-F(jj6>!=qw#05-y%-Cz)4McdZQ1k zm|>}Kq*Mpw#!BY7#9UIAkue1n6*aFHpY`Ytwyj=?ntPGEm!swrp-JS0Y;+ZXzZgN9+WYL)z+MgP)xcg2?A5?t z4eZsxUJdNkz+MgP)xcg2{J%{DDYVyw=dkaNnRxoR)AMr2R&zRB6OYx0<`m5i#hU8s zV+{?JwKWZ)(Y5uV<6}*g@#91B+R){VmGKi!L(!aS>&%cvc;b^+ZOw@_G*-n=3sEw+ z+6vd#*VZGY>H*!dz!96s)Wk6 zbdw5d7ME64mU|TC&}TPRFNoDQgc=)S<)P}vhIpv7YDwwRhR}jos0vyQ#TS*F)H=@?k`i1COuD80hDcVqZMQrp5786f9Em|0@i7ko7s$!&thG=O#T2WtH z6CZ@WptS5V>RI(*|LjWru3%_N%3*1zH)UAX13*05kxbr?_np@#liL742iyrb>V{Ez+nei)`hsWH5PCuApI(H#=|HFcoX0nz(aA3?@_>W z0bd22gZ=8y0n2`qOooP|J%IUu<8hOCK433kGvL%skP~nnU;^+lz#;e*asqHPVC81$ z7jO+=72v)2x!8?>PXj&#crcEmw*ejv_z~b7z=Lt^`tN{~0T<&KzZ~#sz?FchTcIDo z(*U;uUI3T?YzG{I&!7Aha5UgUfDypI0xkl)`1dFecmv=%z$XB=0-pIa$^+H{4#8K1 zRsfC$>;;?!_%2`-VCo-W7l3Cy1GxcL0B!?(27QPQV1% zO8|EPUIUngf0y)Lz#PEe0u}+j30MdCPry#V`j;U$V0tg)2Al)<5#ZH;2jkx{{n4Lc zSAb`|l1$D6tO9HTq#tap2HXI+5%6Rj4DvsgmtRM_0r%-cy8$l+ zTn2ap;2OZ&0Urgt2M3_90$%ba^ahyrH|Pyl>lXt~20ZL7ln0yyxD0R+;2OYR19k!K z^EUhk;H7}+__p=cfX4v-FW_{*Hv!85zyA)#6W}EY=pFEKz^#DO|Bi71xBzh2p_UZ~ zJQ?s!z#_n+9q=E3ivVu~yczHzz*l!dZ-DOuegt^Ld(hiqmNgD=EMNs-3E=Mm){J z$>S);^nGFN@E7=REdCp^68%o0!SJjZ!$+Qzx&M+O&DL3mo_6AxV~zrr%U=YTbuH|K z5b_Y;IQ|;~d`N{BOrg5yNx7nE7E7}4Ew@fUw`h5&Ui$CPkY_E*rI*17!o#z!Nu74U zK9QERwChtLxsrJs@^xX}$Og3Y#F)%&`UvP;(9bvNsfBj=gVFwlprgB-@eK_Rn$9wvZFqpI+!Yyg3 ze^-1cAIb4oT3@L4=a zyQ@II7JRNV>q%{41|%=Z@iFN1PavfK8 z`ckLNhcZp;K-1JJcT&!`?Z-T^#RU6x-0_yEzsw= z=;t#1WZ)8zVH9HNKG=Ucec(~I6=NXv+3ftZ#VOfVYP-#EE%-fi7h*pbKc$oqa9yAe zyE~bzG3g}pd`ITDkmr2liJN&+FXIfP|7D<4oPI9e)Bk{=Ov^-krZ{|PUGW0)`Hd^$ zvl)Dd{xbQ2>)m|PexG8uDGokYV?8j_CC^k_9$IHS06P2aS~s6m!*4%|e21?~CU0=@ zX|wsz`ll203#nc7wNSHNvz&I(dgv+SJI}?(86U@h{twXo?1uV$I_T&BJeeG4malU7 zmxF#8=&8_)Eko+3oFN3%3eacYn@k>P(xLmbG)HIakmvOK5VM$ds4nC=cPr>cpxD*@BLg@{G#ihOf(DqQ$H*yXJ-&`V&TX){xR znGMYCfR6$G0G!zVu~w^p2>&XitDcLw9-`NQz7cfH5>6dPUvz^03()<1a|lJ&OZltJ z@?@tCTm|cb){P@JB$Ih&o=Qb0JEisJXwVNJJ6(vyk8UgR!73LjU_PU;ZXAwvnxDN> zTP6$r9J3x7Fhsuy^ob~s8k{<0ejxfX(2ocGRFhue$ayg6<3Ya(^z_%U$TQ_sX3jAo z$#D1NuahUhB|{ zK))39Af45LUJ1Hi-;ho^LH{4nFdJpL3pr2@#mspPY?*hFB^eatz z>SC^d=vl)o>yMxZjpZEB-vr%nE~D~Apnot3|2oiTV~w9{)^E)9ouEfS_iKL$W!8gU z0{UQmxD9z$AWx9peFS;~=vYoUIzCV7n8wF-px1zY291yFkudBo?NrAnO~yV&3-%|% zCZA;vAChAo=o5IHdH9^*@L2&qzsA0XA0N``U7)`T`om^DslTxMY%}Qfk0g`txahCh z^tV8t_-HbDrb%y9a*hUW8R+MO-bQl14g=Bcr8$|R*M-?uJ+hN5IT&8Q!i_h-x=43h z!E5Q`!t2*=UTIBEo14Jrl_!!(Y(+Troug!;dRBw}Ea*YwY$NFJfPS1=Ub$KJUA>_1 z1U<+P_k*6-6}(0q3FFBJJ;;V8f{+8cpH4~sd7#f8gntw07l9t+2Ude#1NzZs`!00! zvk~-q&;cC%8Gfu6gax1Ls524IROo11Jz8p4T+XKzXwN4+>KH0-h z`o|xngNr~P{ZukJ8}Bxc)G!M{^ktx*5BjMlUHpFtxHX_xfIe7U(1kq3o3LkU@<_eY zuA>k1*FitUq#J8-3t`bt(CHs&wPj5ECO48~41vC5bFe?n2mPO*FERP2stJS2&j)?h z?}GU^gFX{`j+L(RDtHY6w-)ppL8t4+wtUnNBb@c(X5{(N)?izH3-micFL%}PU0X-# z2VpFM9%L)Wfc`${LAEv>^w&VoFm;&vxy`>E^rx`zxzSbsgEoBy=odbnOy2FHud(TO zf&Mz^4KDhnHhnYbd4C8l{}$-K20ds!osL1U0rVg{JO=d5pr32jPqESz7QqSuA3>fE z2FXLVP=!2)J`>yz*MWWs=p)T~)Y6H4+WnxP54xY6#Qz!4W1#1n<&C*@C+Leo_tSF- zWrktW{TJx8ez9$h;@>UKn9o6;2c8Y~8%3bs4mw?Dcky`2;SookqMqRXxDoW(prhLy z9^J9YX`|g`uZGswjocDzDFTQe+Kj*eNG1bHPEM- zZB0AP_8k{dkdJ+Lzjjdl%Rt|a{rMpNYd}v!`JjEqM?wE|kn*pBJ{0B4P?y~oscI78 z_JdvsdQknNQ1K;$&?kdlI|%(E(3=OLF9ZFDpa;pf2J~&9FLudaZIAm$K|c}a7(w(` zL4Ue6c%S!k(5-9y_j#$x^&&`1g~q%)l-eX!oaEKTDzahf@{;{WlimpQ#zIrdtoD zoeE5U8kPAz?P>jighFMNXD+v_=Tb5rA8I|6nsLieYfEZI%TTL1?Qme$rD2;J+3~Tv zo6|F1A8Ngr{y65E5BAO2xW9GPkc_qaTaOGGk45Qz8K3TNJ+WWL8~axaCt1^hO5Sp8%3*C(!|N#-AEc&yoD#ysns(%dG^?AsQHoHR{R%T` zt(79okW(|pTjwGJ9+D+{!S|8%snlmO9?VSn<&b%n^|$>tW&A5M<(15#Z)I8^XCmtZ zSwlBwSx;vfY*F^xDI-RmPm0KRG9~4ml%cy)tgERts%EM;oKa(apX%khMx-2YV#e7i zv7xorRfLp$%;$1USScCLrlfp7^$?tf{LAy_L_(Mv{RjG&kB-Og#q#v2`&AW)- z2PqkCsVRR-9g3~E-A)Fs8+lj(|47OBEG4Bob?Eb{WNKOnmT>Q%y&Bl7fxQ~otAV{5 z*sFoP8rZ9Wy&4#(f%(TOT$DDN@$`*VFeG@D8u(Yo<45eHXgZzkNl%tEcGuMtQUKe~ z{N!J)Am8P|YyLATjjK@n@Y)}5d=>yWPw2EhriaeL==tXt$y$Qz)95emp(xq_v#8Bt1;%pGsQmMV0#R{cVzd@p8-w zDNMe=B7yS-)(LDD*eP(W!1V&V1ojB*6SzyDb)>~lmcWp}9D(@)iv-RWSSPSqV5h*f z0@n-d64)cKPv9vTkf%yVeuK)huAwB*)&z?5zw9x3e3mR+UjiKD!?6KK7 zr{p$rGWUCVdD%H*PY|?!d5ulMOS<)8Ql~W}yG;S*Ix)PE5U`c$o1g4D)ylHg(_xhH zgz!%IJ`aA3;JyB+0QeN_x;DLl7k*c8F28@v_7e(=y*#`Sf9>xyekJGsrtNn${%3gc zYwvo_KgwF_srL!siT{416$k7j@bdxw5?=dP?dQ^<(82g$5y1ai@z0w7{@}xU6TIdh zr2kyxPr>ca{s%-r1Ng~v7InP!4XgYHBO_ktFrPy#@3{Xi;}5m{q%L(i@JB%p!?7bn z51+pSeoyfCMi_0Kr-1bf!M{0OA$0!V3jUQD3Xh#9e%=@S4U+#{!P5tHsNO&E0S@jR z3!eT#Ey6d6JmMy;g@S)7t}@;&`RNWJ<s7G(gCvg$J_VlgPd-CoV?z9P zy2777Ss`?LrvdNB=R(QfEe(}!wtg-6b1D>{iNgO~!QXj_LWBiRTYx0bomC3K=WTdB zOYk4iB_uotD`3S0zvxnh;4?zJ(r-M7&ux-l_sbo?XIY0?A&(#Wx#T~kS@FqL!1}A; zr+!x4L-1EuD8zAsuMqq?azuFa{C_Io`GOz5NJ*pZCnoqKrQQ=o*q<=o zlw7@Uko*;5hjcfEp0|PbYwx&WN}dm!Ih!Ts$ah;v&Sw@Yy!K;XAbAk*mB%XlTKFS+ zehxl<{C5fer^KFVKA>j;0&lxeoXPQxCJe@y^YXzo$xNtd;x^;Yf)d-QFJH$$st`t?>N{Sno1k z5(c2_sFeS<6BKf_&}IV9_9^`JI9XhljOhSB8AZTXVcMC|LKx{lKdBm zKhfj#Q_8P1888z_Km5r+lAO27I676zOci{^g$glI@QVfis>eUvA@~ofRYvUxJ{G(; zZaEeM4Wt3jJm5*5C&dp-^Q`Ly|EmI3gzw(fc&(fbWkcL$&e^Uz&^l}JX@A2 zgqGoG!DkA8E$8XL(|qKOd(W2q@zWF^J&vjbfB1BTk4wEj5PX`9YYb0*9vA$&$tpcn z@cSI5Wd_?dg>l6dNCx_R1!FS34)${e^fdZ+~0K zy`^QPdxKToB#f9Mzd<7X@U4GLI? zW1^&bTcqFNzWB)(e75irH)>rj_+LmsM|X?qc^P;=y&WG??Tv^dr{DI`b7e@?>$Q`c zfT#7Kcb#$<<457%5egg6&qIpOI?;n3zdgYF$#ck&D*q>!DJJ&|uS&sBE>sBmy$C&z z3En$Dz687<|MwZ6WxXPTT&LJrLyl7QdiOC#2>yFAkIS&JW(ofKX2n2{i>n1+dX~cf zTKIPXp9OpK`jclQ|L}<_BmX`TuL;3FSgY`r!YA`+CFkr56hg~CRq&TIE4-GcR`4%g zr10AR+yT6wezr*dYsLSFSy*2P-s_i+!n{cK>0K902i}kWGRgm#jF&tmmi36>KOL(O z+Rir#-W$JtAo!8_D!&W^>zi0dkv!ggn8|{_bcxDeu7Gu^;Jy1fKLFlO{vDG4%ms>p z9$)7nF!0MC3&1x6PjVh7<9)Tr^DDt`J3}FKKRz44=Y7dPqRE~AP&ioP@AW_91^@TS zD!-PwQScdODtwCq)^mdYxLzUjeDsmvhss2^QSwh1?XQQ2fG2tGnX58ZNd7+w{#oG< zw*2ga^$F$o?&F;Zyp~zAGMFOy6JqBjLTnJc^&N$v-(JyktKdKP=%GjOhsZ=E=3?y! ze-Yx6?mx!@PjY(obB^Ha@>Tx6R0SUa-cSA)0`NP8k0tgd-D4er`Hbp)SPcIr5vve* zn%Cw(uMi`py$dA&cu~BLdpiXGjxwS{%3x3%73O_;t>t5iG z#43OOGYTs%X4AT2@tC6Kg=u^4jRas@esmRnc;MISOAb zYHYH~YOCw2V)0mcc8-6JXhmgBWwf-uzI166-#V&aYE{&iR>z{{jn&mlQN&0^ku&bf zT3uRMlU-I94?8LOqn_>j1m{lE-o#o2v5r;W=O^pr=p^j&@+AYs-R-d%!;DooG4|QGqX4fL`6|W*e*Mr1>v%}Qg%UUL#&{JIfrw{ z%(+sZ7XIS+kI&Mh`)2;c))hvkIn8n>Q~y24~87 zxng>{*G=<*nWNWpqSe9XN!F;c4~8pj`Vvqv9v9$f(c2`2QhH$BYVxnO{WQGDkwR*$hzU0P><`7Nx}URr=k z)X<5Qm&Qw3I!E}p4uhZ}0u#=Q7Uzn1c{$N&V-2}Wc8;-f=7G_d z8xH4!qoOIKe}l;z$skmo2+hY}j22Ig!m33H=;*S`poF-)q2j~X`GEUGA4!5Mg>9fs z;{K%0NzvkoR3}Pdh}%Y^N8{JEG@o&eQNUhiHhf^f01F(j6KFmxt&fF^W|o=5LJd90 zK88C|_hEq4WND;%rR{NIa&TWRSE`vr%PZrKQ}xv<>%6PM%4LvO4OtBKOY?2N8?DRJR~M)|HP6iCkb;cI2Tb$d1XzMzD&6X zgZV$67vab-;RVfenFBMAJw|! zqw!HwdZjwd^3&CqY-#DDWkXZ+6 z!b+$R!I%0dFY8nr;Fr|Gc4=4Qo%x{j!YJGW{9)N;WMR@>DyCDNM~!nw0KPUK9NK@a z0jt)TX0UHB26^3QuPfbCIX4Jv(*`Wt;#f+R`z~~hMXG+XuB(4Pnos zEm~E%po}(D>f^jSV$VBc#`2IHQ(ak8P>mpgqX`Kppjz9GOyh#5P#w+-9HYn8zK3t5 zrjcZiwpw8UrR9sid?8tdSb*2XgHJ|=y-7H^tbs=`L%fE_-+;I#~kZuF{eP(|^V3ZiKrmBgc6pgoPi-QHz^e;i)3 zq}rVHNPpfS2ma96z%qk5{`U*iq9fR@^!B0Nqskpqk6*l0;y8eVN$;XV1PGkabPv#k zRy1Qyacyzbwc&~K(7WFfRByEpvIRXBd$-vA#i%p)OR)7df$e<2#)q>urk(yW9zb4g zevM$HvMKE96nh~SxJXx<544!42_2zm*`mv$6{VF`_F%)DF2^WPk9+IW+%W(V8`nH6 zXlIkRHEHo&QaDYYgABe_j_b9u*NP_9H8w0_8%9V$bH!jY79yN4-&o~XRaSCQ+BqF0 zRwciw-PNGBs_l!y9B1t9>5y|4z4n?H9vp6)H;{|tbybkU*IUv=D;v`R3pwRagG=*H zUx4L$J445X11x$R?~rKE>s}j-q2++MM>hrgLgXRzbVIw`;pzoE6tN}asL^&|(XX?@ z3+^`xa?EW)ig9SVgR*?qm3sN50w}%bK<4P@^KGOYmuWL9j@LK%ZBVcyFdhAW@f1hx z*XDZnYduSp+=($dqr#b0*!~BGFy_#}ue!BOyTQCpZj@PD9V*e__0(zae)>!wbpGMp zuhRPf>;-()PLqza^DD8d_zk!9sk$Yq9fL)_chxf3=_ZXkJvyBzo|j?DFQUJ3!lJiR zZEJ7^M&othjg<_0B70XR4};kq^V#!xK-f1R(x)vm+6&^%Q#ysALm$jZlMo4NvA$}@ zLOui>XxbRpo|*rWH#e`YzLt(nOKLBR)qH(R8W32hc#{>T)}a>dIFNP0Uj;<~s<;1x zhP&cL)ncq62gK&wPo)8!#8xvVik)_6e`pSRiOyd|ephG-H&lrE7iWOD?0|hpe=km5 zkMILqj}(EZO%^P^r|R=rkJ9+1!iQ zpp~BNg!pdw55DO(!1P7Evc`=rXlT%OGSJPa=IJQYttyP#VrTbHd+b14sSY_3Z$xR#gFdTL@@MEMXG3`ooY$AE z{WwO~3m+em$=osSI0r%oeXLOHI{}8v78fo4no_%FaS~k5Bo)LB z7H+9vN^Q*hcN4dnFXbp-V`zQAs?t%my?gH;OrSg2`nW$(uX`=TR9MYd_2#YxknPb1 z%sjl?KyEF-{jgKxGk9@C&h7(3rGYa~b*!3L+Di;x&$B;*7Y{gO^PfK{d^F~I3Li1~ zvXTZws5%Pu*+O>vzX4-aT|@HQq8;c>R7dUUMhoKK;%Ebw#%1v+uAh;Psh=ez`HFMP z057O#8Fqu_EE8;!G+y-}_zD*>WLh(4H8q>r7O986x^?trCyHXwQO{kaGK#2h*MZh+ znCRf|&aI2pRAYD2banQs*UyQPq}A2RBL%C$yDU&9HCTQLN$9NDZ%Xxd72-@_+l87Vs`8`M?LK!3%Nm?rVoRbl`}8O_Xms*|&Y@o@#V% z&5}y^6#B0E!3PYg?{iOj%`(r`kc3 zR}r?4{n;|GX-)?$Rd5vWt$K-}B2jyd;9W5LFI{0c*eLwJbO8?%4RXvsh}vui^d*7f zAa~gY>S0eeV%+Qg1+;uB;wuQoc8q(A-rJLdEkW$CAiA&`{$8D-A+n}{6)>#!Y^=&q z9Ym|}A9BcJuQhcXAEalQ_k06#T4}jfDxM9XpjFsda$zuCy^-hZxM*5;E+eX4A!-_V zx_~GX2UHa1QP+5aBX9qBRyX$9h1|Ht^h-;f;&|-x;9Z&pgYAm&=^`!YuvAueR-i0* zbndr#?U9S8K!{>xH!Q7=mo5N|*DJV4zg5z|2wi7o ztIAKQEEg1RE}cT2k+Ux*0`gW@6}Pf^ zdpH}f*$Zotq?d+RnU#%08zlL#IlI1=Z>VO+7Re?4Mdje8Q>dn_OisCR2Z-hq=Bn=Z zD<1lt_>dT2$s(6lSE4S(9qT+R8@DRyA4--VJNyR#zjUj)hCKPb z<>_ZrALAQyT7LZGJybE|tJhlXZFh z-9HWWcm9xtAFuu|2bR8}r_1Z_=4m)z6|?2n`850<==4oKoz~yw({R0%C;3TEEx(|x z4!lqkb@@=1qG+hU6X?~SZa@95i^@+`#Vq~ZK@IhH3aLE(7E9N!%ij(h=|uClLP*dP z;=lAuUf1L8|23eR__3QK#p7Q#;CK?`~GYa(T?{`w(7PC__3M{t?3a{ms zT-F~w<;!nS6b+YU=$s0A>;H?Ve4qSKP{UE*a+lZkqp@#$%76ZVqG&iu{E^P@t^X4c zhT}h-Enj}mmj9?Kq3u+c*Y#^i-_xVtoa*xWJE8NWyv`R?J`?51{&e~IQvdvb`a_zL zz)>hnV@H?Q-^FW^@>$Y+@a{hiU3k8^fw5fP0?m)G!E(9QDp@9w)) zp^#CQUUfN*J_&^hr{&k*I|y~D9Qhvm%U5XoZ;sTTV`J2dE{~ssx*n319us=1V0uv( z11n#CKzam{_@sv|zqX70fYY+866$Z~D++#3|6o;!x?Y`^eoN|Ce)v$8bCRckCu#j3 D`X>dg literal 0 HcmV?d00001 diff --git a/cpp09/ex02/PmergeMe.cpp b/cpp09/ex02/PmergeMe.cpp index 88a908f..bd89eda 100644 --- a/cpp09/ex02/PmergeMe.cpp +++ b/cpp09/ex02/PmergeMe.cpp @@ -6,7 +6,7 @@ /* By: fgras-ca +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/03/07 13:12:20 by fgras-ca #+# #+# */ -/* Updated: 2024/03/08 14:08:06 by fgras-ca ### ########.fr */ +/* Updated: 2024/03/16 16:28:26 by fgras-ca ### ########.fr */ /* */ /* ************************************************************************** */ @@ -102,6 +102,4 @@ template void PmergeMe::displaySequence >(const std::vector >(const std::list&, const std::string&); template void PmergeMe::measureAndSort >(std::vector&, const std::string&); - -// Spécialisation explicite pour std::list template void PmergeMe::measureAndSort >(std::list&, const std::string&); diff --git a/cpp09/ex02/PmergeMe.hpp b/cpp09/ex02/PmergeMe.hpp index 20c4f1c..8535f75 100644 --- a/cpp09/ex02/PmergeMe.hpp +++ b/cpp09/ex02/PmergeMe.hpp @@ -6,7 +6,7 @@ /* By: fgras-ca +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/03/06 16:17:28 by fgras-ca #+# #+# */ -/* Updated: 2024/03/07 14:00:07 by fgras-ca ### ########.fr */ +/* Updated: 2024/03/16 17:07:11 by fgras-ca ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,6 +21,8 @@ #include // Pour les conteneurs supportant le tri direct #include // Pour std::distance et std::advance #include // Pour std::atoi +#include +#include #define RESET "\033[0m" #define BLACK "\033[30m" diff --git a/cpp09/ex02/main.cpp b/cpp09/ex02/main.cpp index 5dd60a0..f2a2326 100644 --- a/cpp09/ex02/main.cpp +++ b/cpp09/ex02/main.cpp @@ -6,7 +6,7 @@ /* By: fgras-ca +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/03/07 13:25:02 by fgras-ca #+# #+# */ -/* Updated: 2024/03/08 13:50:25 by fgras-ca ### ########.fr */ +/* Updated: 2024/03/16 17:10:14 by fgras-ca ### ########.fr */ /* */ /* ************************************************************************** */ @@ -24,24 +24,24 @@ int main(int argc, char **argv) std::vector vectorInput; std::list listInput; - // Remplir les conteneurs avec les entiers fournis en arguments for(int i = 1; i < argc; ++i) { - int value = std::atoi(argv[i]); - if(value < 0) + errno = 0; // Réinitialiser errno avant la conversion + char* endPtr; + long value = std::strtol(argv[i], &endPtr, 10); + // Vérifier si la conversion a réussi et que toute la chaîne a été consommée + if (*endPtr != '\0' || errno == ERANGE || value < 0 || value > INT_MAX) { - std::cerr << RED << "Error: Only positive integers are allowed." << RESET << std::endl; + std::cerr << RED << "Error: Argument \"" << argv[i] << "\" is not a valid positive integer or it is out of the int range." << RESET << std::endl; return (1); } - vectorInput.push_back(value); - listInput.push_back(value); + vectorInput.push_back(static_cast(value)); + listInput.push_back(static_cast(value)); } - // Traitement et affichage pour std::vector std::cout << ORANGE << "Processing with std::vector..." << RESET << std::endl; pmerge.sortAndDisplay(vectorInput); - // Traitement et affichage pour std::list std::cout << ORANGE << "\nProcessing with std::list..." << RESET << std::endl; pmerge.sortAndDisplay(listInput);