From 5bb6f9e45f2a41f6427ae43441ecb1aab3137c4c Mon Sep 17 00:00:00 2001 From: JustinAJ Date: Mon, 1 Jun 2015 04:30:54 -0400 Subject: [PATCH] Added User-Defined literals for string types. Removed useless empty-string references. Reworked STRING_LITERAL_AS_STRING and STRING_LITERAL_AS_NAMED_STRING to use user-defined literals Marked STRING_LITERAL_AS_STRING and STRING_LITERAL_AS_NAMED_STRING as deprecated -- Probably won't actually remove until I find a decent way to handle string literal concatenation. --- Jupiter/CString.h | 22 +++++++++-- Jupiter/IRC_Client.cpp | 75 ++++++++++++++++++------------------- Jupiter/Reference_String.h | 11 +++++- Jupiter/String.h | 30 ++++++++++----- Release/Jupiter.lib | Bin 271056 -> 277378 bytes Tester/Test.cpp | 3 ++ 6 files changed, 87 insertions(+), 54 deletions(-) diff --git a/Jupiter/CString.h b/Jupiter/CString.h index b54bc63..2eb9cd5 100644 --- a/Jupiter/CString.h +++ b/Jupiter/CString.h @@ -473,10 +473,24 @@ namespace Jupiter /** Definition of a Strict Wide CString */ typedef WCStringType WCStringS; - /** Empty String constants */ - static const Jupiter::CStringS &emptyCStringS = Jupiter::CStringS::empty; - static const Jupiter::CStringL &emptyCStringL = Jupiter::CStringL::empty; - static const Jupiter::CStringType &emptyCString = emptyCStringS; + namespace literals + { + /** CString_Strict literals */ + inline Jupiter::CStringType operator""_jcst(const char *str, size_t len) { return Jupiter::CStringType(str, len); } + inline Jupiter::WCStringType operator""_jwcst(const wchar_t *str, size_t len) { return Jupiter::WCStringType(str, len); } + + /** CString_Strict literals */ + inline Jupiter::CStringS operator""_jcss(const char *str, size_t len) { return Jupiter::CStringS(str, len); } + inline Jupiter::WCStringS operator""_jwcss(const wchar_t *str, size_t len) { return Jupiter::WCStringS(str, len); } + + /** CString_Loose literals */ + inline Jupiter::CStringL operator""_jcsl(const char *str, size_t len) { return Jupiter::CStringL(str, len); } + inline Jupiter::WCStringL operator""_jwcsl(const wchar_t *str, size_t len) { return Jupiter::WCStringL(str, len); } + + /** CString literals */ + inline Jupiter::CStringS operator""_jcs(const char *str, size_t len) { return Jupiter::CString(str, len); } + inline Jupiter::WCStringS operator""_jwcs(const wchar_t *str, size_t len) { return Jupiter::WCString(str, len); } + } } /** Re-enable warning */ diff --git a/Jupiter/IRC_Client.cpp b/Jupiter/IRC_Client.cpp index 8028322..eeee2df 100644 --- a/Jupiter/IRC_Client.cpp +++ b/Jupiter/IRC_Client.cpp @@ -28,6 +28,8 @@ #include #endif // _WIN32 +using namespace Jupiter::literals; + Jupiter::INIFile _Config; Jupiter::INIFile *Jupiter::IRC::Client::Config = &_Config; @@ -123,48 +125,45 @@ Jupiter::IRC::Client::Client(const Jupiter::ReadableString &configSection) Jupiter::IRC::Client::Config->readFile(CONFIG_INI); } Jupiter::IRC::Client::data_->configSectionName = configSection; - Jupiter::IRC::Client::data_->serverHostname = Jupiter::IRC::Client::readConfigValue(STRING_LITERAL_AS_REFERENCE("Hostname"), STRING_LITERAL_AS_REFERENCE("irc.tibitek.com")); + Jupiter::IRC::Client::data_->serverHostname = Jupiter::IRC::Client::readConfigValue("Hostname"_jrs, "irc.tibitek.com"_jrs); - Jupiter::IRC::Client::data_->logFileName = Jupiter::IRC::Client::readConfigValue(STRING_LITERAL_AS_REFERENCE("LogFile")); - Jupiter::IRC::Client::data_->nickname = Jupiter::IRC::Client::readConfigValue(STRING_LITERAL_AS_REFERENCE("Nick"), STRING_LITERAL_AS_REFERENCE("Jupiter")); + Jupiter::IRC::Client::data_->logFileName = Jupiter::IRC::Client::readConfigValue("LogFile"_jrs); + Jupiter::IRC::Client::data_->nickname = Jupiter::IRC::Client::readConfigValue("Nick"_jrs, "Jupiter"_jrs); - Jupiter::IRC::Client::data_->realName = Jupiter::IRC::Client::readConfigValue(STRING_LITERAL_AS_REFERENCE("Realname"), STRING_LITERAL_AS_REFERENCE("Jupiter IRC Client")); + Jupiter::IRC::Client::data_->realName = Jupiter::IRC::Client::readConfigValue("Realname"_jrs, "Jupiter IRC Client"_jrs); - Jupiter::IRC::Client::data_->saslPass = Jupiter::IRC::Client::readConfigValue(STRING_LITERAL_AS_REFERENCE("SASL.Password")); + Jupiter::IRC::Client::data_->saslPass = Jupiter::IRC::Client::readConfigValue("SASL.Password"_jrs); if (Jupiter::IRC::Client::data_->saslPass.isEmpty()) - Jupiter::IRC::Client::data_->saslPass = Jupiter::IRC::Client::readConfigValue(STRING_LITERAL_AS_REFERENCE("SASL.Pass")); + Jupiter::IRC::Client::data_->saslPass = Jupiter::IRC::Client::readConfigValue("SASL.Pass"_jrs); - Jupiter::IRC::Client::data_->saslAccount = Jupiter::IRC::Client::readConfigValue(STRING_LITERAL_AS_REFERENCE("SASL.Account")); + Jupiter::IRC::Client::data_->saslAccount = Jupiter::IRC::Client::readConfigValue("SASL.Account"_jrs); if (Jupiter::IRC::Client::data_->saslAccount.isEmpty()) Jupiter::IRC::Client::data_->saslAccount = Jupiter::IRC::Client::data_->nickname; - Jupiter::IRC::Client::data_->autoPartMessage = Jupiter::IRC::Client::readConfigValue(STRING_LITERAL_AS_REFERENCE("AutoPartMessage")); + Jupiter::IRC::Client::data_->autoPartMessage = Jupiter::IRC::Client::readConfigValue("AutoPartMessage"_jrs); - Jupiter::IRC::Client::data_->ssl = Jupiter::IRC::Client::readConfigBool(STRING_LITERAL_AS_REFERENCE("SSL")); - Jupiter::IRC::Client::data_->SSLCertificate = Jupiter::IRC::Client::readConfigValue(STRING_LITERAL_AS_REFERENCE("Certificate")); - Jupiter::IRC::Client::data_->SSLKey = Jupiter::IRC::Client::readConfigValue(STRING_LITERAL_AS_REFERENCE("Key")); + Jupiter::IRC::Client::data_->ssl = Jupiter::IRC::Client::readConfigBool("SSL"_jrs); + Jupiter::IRC::Client::data_->SSLCertificate = Jupiter::IRC::Client::readConfigValue("Certificate"_jrs); + Jupiter::IRC::Client::data_->SSLKey = Jupiter::IRC::Client::readConfigValue("Key"_jrs); if (Jupiter::IRC::Client::data_->SSLCertificate.isEmpty()) { - Jupiter::IRC::Client::data_->SSLCertificate = Jupiter::IRC::Client::readConfigValue(STRING_LITERAL_AS_REFERENCE("Cert")); + Jupiter::IRC::Client::data_->SSLCertificate = Jupiter::IRC::Client::readConfigValue("Cert"_jrs); if (Jupiter::IRC::Client::data_->SSLCertificate.isEmpty()) Jupiter::IRC::Client::data_->SSLCertificate = Jupiter::IRC::Client::data_->SSLKey; } if (Jupiter::IRC::Client::data_->SSLKey.isEmpty()) Jupiter::IRC::Client::data_->SSLKey = Jupiter::IRC::Client::data_->SSLCertificate; - Jupiter::IRC::Client::data_->joinOnKick = Jupiter::IRC::Client::readConfigBool(STRING_LITERAL_AS_REFERENCE("AutoJoinOnKick")); - Jupiter::IRC::Client::data_->reconnectDelay = Jupiter::IRC::Client::readConfigInt(STRING_LITERAL_AS_REFERENCE("AutoReconnectDelay")); - Jupiter::IRC::Client::data_->maxReconnectAttempts = Jupiter::IRC::Client::readConfigInt(STRING_LITERAL_AS_REFERENCE("MaxReconnectAttempts")); - Jupiter::IRC::Client::data_->serverPort = (unsigned short)Jupiter::IRC::Client::readConfigInt(STRING_LITERAL_AS_REFERENCE("Port")); - if (Jupiter::IRC::Client::data_->serverPort == 0) - { - if (Jupiter::IRC::Client::data_->ssl) Jupiter::IRC::Client::data_->serverPort = 994; - else Jupiter::IRC::Client::data_->serverPort = 194; - } - Jupiter::IRC::Client::data_->dChanType = Jupiter::IRC::Client::readConfigInt(STRING_LITERAL_AS_REFERENCE("Channel.Type")); + Jupiter::IRC::Client::data_->joinOnKick = Jupiter::IRC::Client::readConfigBool("AutoJoinOnKick"_jrs); + Jupiter::IRC::Client::data_->reconnectDelay = Jupiter::IRC::Client::readConfigInt("AutoReconnectDelay"_jrs); + Jupiter::IRC::Client::data_->maxReconnectAttempts = Jupiter::IRC::Client::readConfigInt("MaxReconnectAttempts"_jrs); + Jupiter::IRC::Client::data_->serverPort = (unsigned short)Jupiter::IRC::Client::readConfigInt("Port"_jrs, Jupiter::IRC::Client::data_->ssl ? 994 : 194); + Jupiter::IRC::Client::data_->dChanType = Jupiter::IRC::Client::readConfigInt("Channel.Type"_jrs); - if (Jupiter::IRC::Client::readConfigBool(STRING_LITERAL_AS_REFERENCE("PrintOutput"), true)) Jupiter::IRC::Client::data_->printOutput = stdout; - else Jupiter::IRC::Client::data_->printOutput = nullptr; + if (Jupiter::IRC::Client::readConfigBool("PrintOutput"_jrs, true)) + Jupiter::IRC::Client::data_->printOutput = stdout; + else + Jupiter::IRC::Client::data_->printOutput = nullptr; if (Jupiter::IRC::Client::data_->logFileName.isNotEmpty()) Jupiter::IRC::Client::data_->logFile = fopen(Jupiter::IRC::Client::data_->logFileName.c_str(), "a+b"); else Jupiter::IRC::Client::data_->logFile = nullptr; @@ -761,8 +760,8 @@ int Jupiter::IRC::Client::primaryHandler() case IRC_ERR_NICKNAMEINUSE: // 433 case IRC_ERR_NICKCOLLISION: // 436 case IRC_ERR_BANNICKCHANGE: // 437 -- Note: This conflicts with another token. - const Jupiter::ReadableString &altNick = Jupiter::IRC::Client::readConfigValue(STRING_LITERAL_AS_REFERENCE("AltNick"), STRING_LITERAL_AS_REFERENCE("Jupiter")); - const Jupiter::ReadableString &configNick = Jupiter::IRC::Client::readConfigValue(STRING_LITERAL_AS_REFERENCE("Nick"), STRING_LITERAL_AS_REFERENCE("Jupiter")); + const Jupiter::ReadableString &altNick = Jupiter::IRC::Client::readConfigValue("AltNick"_jrs, "Jupiter"_jrs); + const Jupiter::ReadableString &configNick = Jupiter::IRC::Client::readConfigValue("Nick"_jrs, "Jupiter"_jrs); /* * Possible Issues: * altNick != nickname after first nick change -- loop initiated? @@ -813,7 +812,7 @@ int Jupiter::IRC::Client::primaryHandler() { case IRC_RPL_ISUPPORT: // 005 { - size_t pos = buff.find(STRING_LITERAL_AS_REFERENCE("PREFIX=(")); + size_t pos = buff.find("PREFIX=("_jrs); if (pos != Jupiter::INVALID_INDEX) { Jupiter::ReferenceString ref = Jupiter::ReferenceString::substring(buff, pos + 8); @@ -821,7 +820,7 @@ int Jupiter::IRC::Client::primaryHandler() ref.shiftRight(ref.find(')') + 1); Jupiter::IRC::Client::data_->prefixes = Jupiter::ReferenceString::getWord(ref, 0, " " ENDL); } - pos = buff.find(STRING_LITERAL_AS_REFERENCE("CHANMODES=")); + pos = buff.find("CHANMODES="_jrs); if (pos != Jupiter::INVALID_INDEX) { Jupiter::ReferenceString ref = Jupiter::ReferenceString::substring(buff, pos + 10); @@ -846,7 +845,7 @@ int Jupiter::IRC::Client::primaryHandler() } } } - pos = buff.find(STRING_LITERAL_AS_REFERENCE("CHANTYPES=")); + pos = buff.find("CHANTYPES="_jrs); if (pos != Jupiter::INVALID_INDEX) { Jupiter::ReferenceString ref = Jupiter::ReferenceString::substring(buff, pos + 10); @@ -1268,12 +1267,12 @@ int Jupiter::IRC::Client::primaryHandler() bool Jupiter::IRC::Client::connect() { - const Jupiter::ReadableString &clientAddress = Jupiter::IRC::Client::readConfigValue(STRING_LITERAL_AS_REFERENCE("ClientAddress")); - if (Jupiter::IRC::Client::data_->sock->connect(Jupiter::IRC::Client::data_->serverHostname.c_str(), Jupiter::IRC::Client::data_->serverPort, clientAddress.isEmpty() ? nullptr : Jupiter::CStringS(clientAddress).c_str(), (unsigned short)Jupiter::IRC::Client::readConfigLong(STRING_LITERAL_AS_REFERENCE("ClientPort"))) == false) + const Jupiter::ReadableString &clientAddress = Jupiter::IRC::Client::readConfigValue("ClientAddress"_jrs); + if (Jupiter::IRC::Client::data_->sock->connect(Jupiter::IRC::Client::data_->serverHostname.c_str(), Jupiter::IRC::Client::data_->serverPort, clientAddress.isEmpty() ? nullptr : Jupiter::CStringS(clientAddress).c_str(), (unsigned short)Jupiter::IRC::Client::readConfigLong("ClientPort"_jrs)) == false) return false; Jupiter::IRC::Client::data_->sock->setBlocking(false); - if (Jupiter::IRC::Client::data_->ssl == false && Jupiter::IRC::Client::readConfigBool(STRING_LITERAL_AS_REFERENCE("STARTTLS"), true)) + if (Jupiter::IRC::Client::data_->ssl == false && Jupiter::IRC::Client::readConfigBool("STARTTLS"_jrs, true)) { Jupiter::IRC::Client::data_->sock->send("STARTTLS" ENDL); Jupiter::IRC::Client::data_->connectionStatus = 1; @@ -1290,7 +1289,7 @@ void Jupiter::IRC::Client::disconnect(bool stayDead) Jupiter::IRC::Client::data_->reconnectTime = time(0) + Jupiter::IRC::Client::data_->reconnectDelay; Jupiter::IRC::Client::data_->dead = stayDead; this->OnDisconnect(); - bool ssl = Jupiter::IRC::Client::readConfigBool(STRING_LITERAL_AS_REFERENCE("SSL")); + bool ssl = Jupiter::IRC::Client::readConfigBool("SSL"_jrs); if (ssl != Jupiter::IRC::Client::data_->ssl) { Jupiter::IRC::Client::data_->ssl = ssl; @@ -1352,7 +1351,7 @@ const Jupiter::ReadableString &Jupiter::IRC::Client::readConfigValue(const Jupit const Jupiter::ReadableString &val = Jupiter::IRC::Client::Config->get(Jupiter::IRC::Client::data_->configSectionName, key); if (val.isNotEmpty()) return val; - return Jupiter::IRC::Client::Config->get(STRING_LITERAL_AS_REFERENCE("Default"), key, defaultValue); + return Jupiter::IRC::Client::Config->get("Default"_jrs, key, defaultValue); } bool Jupiter::IRC::Client::readConfigBool(const Jupiter::ReadableString &key, bool defaultValue) const @@ -1360,7 +1359,7 @@ bool Jupiter::IRC::Client::readConfigBool(const Jupiter::ReadableString &key, bo const Jupiter::ReadableString &val = Jupiter::IRC::Client::Config->get(Jupiter::IRC::Client::data_->configSectionName, key); if (val.isNotEmpty()) return val.asBool(); - return Jupiter::IRC::Client::Config->getBool(STRING_LITERAL_AS_REFERENCE("Default"), key, defaultValue); + return Jupiter::IRC::Client::Config->getBool("Default"_jrs, key, defaultValue); } int Jupiter::IRC::Client::readConfigInt(const Jupiter::ReadableString &key, int defaultValue) const @@ -1368,7 +1367,7 @@ int Jupiter::IRC::Client::readConfigInt(const Jupiter::ReadableString &key, int const Jupiter::ReadableString &val = Jupiter::IRC::Client::Config->get(Jupiter::IRC::Client::data_->configSectionName, key); if (val.isNotEmpty()) return val.asInt(); - return Jupiter::IRC::Client::Config->getInt(STRING_LITERAL_AS_REFERENCE("Default"), key, defaultValue); + return Jupiter::IRC::Client::Config->getInt("Default"_jrs, key, defaultValue); } long Jupiter::IRC::Client::readConfigLong(const Jupiter::ReadableString &key, long defaultValue) const @@ -1376,7 +1375,7 @@ long Jupiter::IRC::Client::readConfigLong(const Jupiter::ReadableString &key, lo const Jupiter::ReadableString &val = Jupiter::IRC::Client::Config->get(Jupiter::IRC::Client::data_->configSectionName, key); if (val.isNotEmpty()) return val.asInt(); - return Jupiter::IRC::Client::Config->getInt(STRING_LITERAL_AS_REFERENCE("Default"), key, defaultValue); + return Jupiter::IRC::Client::Config->getInt("Default"_jrs, key, defaultValue); } double Jupiter::IRC::Client::readConfigDouble(const Jupiter::ReadableString &key, double defaultValue) const @@ -1384,7 +1383,7 @@ double Jupiter::IRC::Client::readConfigDouble(const Jupiter::ReadableString &key const Jupiter::ReadableString &val = Jupiter::IRC::Client::Config->get(Jupiter::IRC::Client::data_->configSectionName, key); if (val.isNotEmpty()) return val.asDouble(); - return Jupiter::IRC::Client::Config->getDouble(STRING_LITERAL_AS_REFERENCE("Default"), key, defaultValue); + return Jupiter::IRC::Client::Config->getDouble("Default"_jrs, key, defaultValue); } void Jupiter::IRC::Client::writeToLogs(const Jupiter::ReadableString &message) diff --git a/Jupiter/Reference_String.h b/Jupiter/Reference_String.h index 46e49f9..1c6e8bd 100644 --- a/Jupiter/Reference_String.h +++ b/Jupiter/Reference_String.h @@ -295,10 +295,17 @@ namespace Jupiter /** Generic Wide Reference String Type */ typedef Reference_String ReferenceWString; + namespace literals + { + /** Reference_String literals */ + inline Jupiter::ReferenceString operator""_jrs(const char *str, size_t len) { return Jupiter::ReferenceString(str, len); } + inline Jupiter::ReferenceWString operator""_jrws(const wchar_t *str, size_t len) { return Jupiter::ReferenceWString(str, len); } + } } -#define STRING_LITERAL_AS_REFERENCE(str) Jupiter::ReferenceString(str, sizeof(str) - 1) -#define STRING_LITERAL_AS_NAMED_REFERENCE(name, str) Jupiter::ReferenceString name = Jupiter::ReferenceString(str, sizeof(str) - 1) +/** DEPRECATED */ +#define STRING_LITERAL_AS_REFERENCE(str) Jupiter::literals::operator""_jrs(str, sizeof(str) - 1) +#define STRING_LITERAL_AS_NAMED_REFERENCE(name, str) Jupiter::ReferenceString name = STRING_LITERAL_AS_REFERENCE(str) #include "Reference_String_Imp.h" diff --git a/Jupiter/String.h b/Jupiter/String.h index fd3d147..e0a592a 100644 --- a/Jupiter/String.h +++ b/Jupiter/String.h @@ -493,28 +493,38 @@ namespace Jupiter #endif // DISABLE_DEFAULT_JUPITER_STRING_OPERATOR_PLUS #endif // JUPITER_STRING_STRICT_OPERATOR_PLUS - /** Definition of a Loose String. */ - typedef String_Loose StringL; - - /** Definition of a Loose Wide String */ - typedef String_Loose WStringL; - /** Definition of a Strict String. */ typedef String_Strict StringS; /** Definition of a Strict Wide String */ typedef String_Strict WStringS; + /** Definition of a Loose String. */ + typedef String_Loose StringL; + + /** Definition of a Loose Wide String */ + typedef String_Loose WStringL; + /** Definition of a String. */ typedef StringL String; /** Definition of a Wide String */ typedef WStringL WString; - /** Empty String constants */ - static const Jupiter::StringS &emptyStringS = Jupiter::StringS::empty; - static const Jupiter::StringL &emptyStringL = Jupiter::StringL::empty; - //static const Jupiter::StringType &emptyString = emptyStringS; + namespace literals + { + /** String_Strict literals */ + inline Jupiter::StringS operator""_jss(const char *str, size_t len) { return Jupiter::StringS(str, len); } + inline Jupiter::WStringS operator""_jwss(const wchar_t *str, size_t len) { return Jupiter::WStringS(str, len); } + + /** String_Loose literals */ + inline Jupiter::StringL operator""_jsl(const char *str, size_t len) { return Jupiter::StringL(str, len); } + inline Jupiter::WStringL operator""_jwsl(const wchar_t *str, size_t len) { return Jupiter::WStringL(str, len); } + + /** String literals */ + inline Jupiter::StringS operator""_js(const char *str, size_t len) { return Jupiter::String(str, len); } + inline Jupiter::WStringS operator""_jws(const wchar_t *str, size_t len) { return Jupiter::WString(str, len); } + } } /** Re-enable warning */ diff --git a/Release/Jupiter.lib b/Release/Jupiter.lib index 8850119378e967dd44a9bf130a4ce01b6dfcad25..827f9d474a249bc02c2b6dabac28a4b968cb3bb9 100644 GIT binary patch delta 38838 zcmc(I37k&V|NlAXKE^)AI%As|V;_UDjh!JR+aQ%BhLGJ5lJFo&vJ8*r2-%V(%Ou&e zB}tYc30X@>)>2BA|NC>!z4y6irtkOr`~AQF*X!@~dO!D>=X~xtpYz$y=PdWi_#$lL z-LTY1U+o(4b>#VKR=B@rwS+p+^e;IVW7!TeF}o)dbEYxz_HJg?zopS&FtZ5tZPdHL zEJ8z+6B^-nLPHx3PzLx)hG~>o$b5uSgKaQefzq*l`T)@+1uO4VX6;<4vFH-B6x!el z)L5n<4xDEStIIK=unbq=(n5_Zdzb*MP&B|gDOg)NF@<(ukkGb(4gYq00qXA6sMifW z1L};?s2h#nf!gR1;Rw?>e1%zrj8Phg(wRj#+)5)U2eSxA(iFtct(ZmzuE4r<4gV+c zOen0ubq%wgS)nm%90h6(Eu6s)JA-|P(_ zcGQ=97!$IPg4Jn1BZv=LDEN4PMzHQ?5d7#(O$BiehNo}?S77mIjfJagm=?4 z7D94_MSs{pqlm0$r0ex`2l8EIfqp*dH3rCNqoB zyuHR_&^w{&Sp{FVh4BAu;3xz!0I-r_tqOB-1zPo05Pub83cq$@Lg6f~z?}*jzb$2g za3@{k_j*ha{+Oik`$PN<+~1_}peYlChkiu5hlCIXi>EM+d$q2I+D>k4823Q9)d`~lrkPWI-D26L_VzGi1vW_YELn`14kR2i-YA&@HcP~)~+xTS73pS6Ddp(P9|u~Zx8PQ?&eYO<*&mCeqY#frjUOdegF!f z0I<%0DZ=SF8fVtvZ{Td4g0Coy7O*~x(b$&CEW&5YHL6`<7GdOm4SzbU9T*RZ0^-mC zf}e@?(3=9{`Fh~f5*i0jFhN+mUL(CG0uFGck;d`KOb||W)i}8gJp~ru(>NQ#1mO%M zLU`|*#@D@=0DKh$;KxT*gjPbO85)(lFdw1fUX2Q)KnPTYp%N;?l?ZVm8nF$Sk5C@> z6RN=d2yquRDn+1Ppkhaj@-d(Tsx)OjKYhfF)QDY)ihv52G@{lpAEDG)jhJ@KM~I%I zQELqIDIfsV0uoS0s9s&8Mhf#OoWK>R4(17U$7$3Ef&TH~t93=A&N}8J)Gee@Z9nr7 z>KD_fhcZH)RvNX@Lqfea8g;=qp*DI;NLa5?8x0cTZ)lWj!F+_WC*c2O!CBe<8s%^U zp;}jsG7p)LP;;e?Mz{h|kQyNp_X5^yks2drFpKaq0ux~pT#_*1lE$m!m_?Y|Rbzl3 z7CHcU5mrhV2WuycS+DW-G-eUz+|USYVHRNyDkr2B(zvjaS%e?9+epL}xPW+1_-&Yi zui$Q`PyqHp@E2@`AK(&a;WmWt5IPAb&r1Bqvw! zy#%!|=@2fYNW&KN`pPeZhX__-QYuc86q z94wyjBJu!0{5?(MegsB0;6vC3VP#K^4>RyLuws~k^>G)bagCL>KE8%5r-8=0Im{w# z_*G-$BxY@#6quVk#=m+Yvj}ToSAZ|Hr;T561@cYQ2t()qtiqrJ#BvOpgk^}pg!jR# zg1{A6j#Lt`)@;{U+lg6(^i?)sis=k_%BPV`1Csv~*w9U5UL3O&cH#;wK;wk@&?I4X zE(KqnWyrpOymf3Gz!gIN67fHgEkWAthC5cu$p#+&F7AdZJ< ze6=1OTF$oyx4;Ha@S8SOeVfXR71Ff-w2!cYYd$O2?4_pItYVTX$*OqSqfKh1>X0g;`f2&88*=P za$qUMM0l^W#?RZCMd-IsTpO-&6u%wy0Q@vb<2D*s*o!N06Za5c zs2b?i=fE-C5BMVcB7O_K_kpMM zVIrfMg3pJs00o1!2xwtxWGG*{!7JJ8=9qz)K7$`r6M6<45mOO5Cf$k>6> z$V~w2$155auQH2Jqnt*d9@0zTG$aRzBk>xW{h>^3Cd^Q zgqF}B;jbJTfA(S);a(Mu$q9)2z_8;QO;AQ?1c?wTk5LduVeEeT*a~AJY{Pej^|%6` z!N3UDCo5R_VFQVMH8veU9t!y5HBN>h)B@jwDZ;548v7bBi}2-cjcZ^;;UcaV;r}<5 zBGdvm!9C#@=#p?1Iwt&bNh1+A5XSG(7%mX;fWfgEcUv)w@H+wyVNe;3>64j7c%_7m zdAI@tdJ>@j-_a=HVWh@`xy({1fGbc1jS#*VuCeD7vlP(S9^mLw8|82XFppKZypmZ8 z5x4?BJ+uKM{t37QrY`yM(LYh67b+vXlcv%CD1HZ;T-9g{1_)0;3JP6t1yVjS+b;iOPdmQ%+;&Ug)1bc4TPmY{vv)7v>~{8wg5(l^=QzL$v#B zjmGw-Oeo;K?R0N@jT>R02X<}H*p1vlVH2*vO;|o)71)CLu7=-N@(-pEABt!Nl&GLl z90Y*1t%%0OK5(f%%vU%;K^%j}5cVw7_yWBm+``fkVULZytC%2siR_B-1-=vZ!r1r5 z#$jGj1qJCE`|2>Eunt$?)(VYpeN24oTNfTtG+XaMDZ^h0MAt1IQvK;_)f1Zr!s2@e zy31UFQgw@cGBo}&FZfdL;Y~;M>C=1Ill?~bZa3tyAt{Q!blWD)ySIBHu?y?oz2Bge z?v4KiUARkUQc#;E-LikGgD7&k6tZ!4(Je5(dWdX4nr92_tiD`Uy~Xp$Z5Mf@eAI`B z1eVvpmmhdOx&0z9A!k0za|Tw_C=tj=&n+8Y!ZKpaWMprWMFbk_-mXd0Wvhzw~YLmXO|1+iKtKRHrQ4+P`*d;z@VK~Nu&|@QYLV6XP6v3MO2Wd!b-%t8wFMWIS@K;9>M78yHCJ{K=5PVHIp^E48{r(AuKq_}-$NTzu2=$!jm6 z-ScT5tt?hmZT18|s@1GfqgqYReo*yV@v1aA*FC{l&)I@anka%KR?^27mhiE`rF@J5v88=%5`LSS*J2BITI|vyi?sok)v(z41A>)X zE!Z+(;U&TLTtQ=@7V~$)?5oojRNBsB1=?C{JFvH|#k!%vF?B2!jqf*VTZ|pS+UsG9 zjmofC`XP(8!uK3W7E8nLt$r3P14v&dSo|k~tpQd%W3hRo(D)#WmGk-7?msNn=x2*f z>29&n!pG_yv)HO{EI$ivW3h>?E%rw%i;1r-HgdnkI(-Eu_E{|U8;f;3go-~FEEZUk zE?5E@S@^WY8f5pek?6s&+!iY&1>4`rVl6%ptUvd$jJp=Ai3WQ@q&I-kiy_U0_- zw0FTIzW=dEuwjd^9(jL(U_D!)hmWIC;B<3vddp&`fCaZLw&f;7`3V?XZ?UEyS?nk< zdX>eBslw7KZy+iDEvMunWupEq7S#I57Hoi(Tt#v5@B=av&Ms zM|Xj0o`vKdv)JTj7Hbd2`{VoBrqF*j*h7eqg(h2UF3=a!E%ujSoqiSUEKuQ&U`v0) zepEWX)cakqNq-3T5Z6uj1#9{MM)**$5FmwH>>kj}f^7(h`VqtrTw!YcogKjMPx~yk zI2#%O7Ne1MAr`9uw9gJ3$box+ojGy+QLw2$pd8ox7X=%6QTW+Nh(F~7^mUqV>~zOP3;<8ZwZ?_({>p{}w%)*o1p z?_F{4!!lr|rjIoOnu3`Vkva>m73v7xAXuv(Ew=9-{6EJX=yMa?0v0=Ys>SNOWwCAGtOE3T4~((baq~pD8<_Y5 zj7=P9v0i;G=Ie(B-#`?c0!EGqmSc-xGk|hi5quuOOIE@F$D$5k6B?e3MvHBP2V8~9 zuL*V>*ZxgmFvmWJ5f!x92Kei~D;B%c7`@30H_C;On;ViqkZFPM#o*U5&mb-!@QluZ z9u@#IdEj#SV07IOaQ4G~<_gvkSciaAt~31pDT^gk1zi=~dk${c2lavW5NNl|6D-D$ zkIC-{b^ye_r{Syd7Q2cYPJp-s#6RtC!6M+2p&uehtwfl`b=V5Qx_pdy05m{gnzPPg zzizPDq>XU11&EmMT5Rb;^c>fPt0CPrP;aP@{R&LX2YZ5NRVfVBEr>r(PJ=h$dM_39Q!u*DfL#EsCRi-_CA3uv{y(lfj3)}C zTMT+o4!Vv+E>IFKSQrKsj(A=Po>3ZuQ3MRB1S%^71}flM5iVIA3>HJLkX+1OC0G@N z*yzg`u7MJ31X~VtM(BJ>&{JUkOY{=Pmg6r(#y_E^d(iD<*Z^#)R}(PP2!>o4*%YL?9MLg$8w?$& z{u%s#@^$DaKink|!{#P51c`*5L}lMYWT?EsKE!l1(CZp{2`q&bSGkGa{(_!^flIhv z#JzjQ!@yvOu`u3NcVS1r!w?4{F`14)_6qUn0UfsU4YTB_B)H= zcK5-|Bh>L1+;jx$gdOeOi3qwwuy(j6?t*RI!1#Xvy*~w!u7Nn3ZU+I-9zPxFSNkr*Lf6O%++-i{~nIpS@RCZsqe zz89y(8F5T}E4~rO#W`_aTo5hA6XKS*E^dh5#2s;4{3`wscg3ILbAE;o;-mO^cAUqG za8^xx%bK$zEP;38DPp*oDBAFVNEAm!6VXas^NV|8H$Tl!vg)F?_>665-?LM!rl=w6 ziaO#fJHtNa>-Z;pJ>S4T<(t?>wwY~ZTUayER1{;CMHO*^6=zjgRrU;jmNyV1MPt#K z&lP9Icj5=}xVS0)63s;mF_*o==CgTh0ehD%Vhh<$wuNuv68SHVtUbjh^4IucwuHUM zma-M>L-r9{$(FJA*#~SnTg6thwQLPr$3AACuus`~md-b@p=>UX5}ida5iOn-rA1d! zQS=lQL=RC$JTD@}Goqw;S`-sciU`p`6c?RDjCf9z72QM$@subkI*M|lyC@$gl0|P( zN^}wJ#cZ)j4CgO#KOe`>^MmXH_lqLzTYijZ@FRQ#8!0Cw@#6kj;wv#vd?-@IJ~4}> zvgvFFo5^~xZmc^?X1DlM@wM15(pY2Gh&5!>jP z<70UZHk6OyFNtaFEjER{$)>V5*km@4zs&2hIqYrrBmaTd;xDsN>bBY6^fXE|4MP4ypl;;(AIbN1mR@ijldeIlFK#rJY9_H#=J@fH7)@8jF~Dc*tiW&K!x_936m z1AHN0#Fy~Je2SmH$=~8rc^~#7Tgu<#%lI@toj2g~#bog}kHj$X7yns&&GxecY>*fz zCb8F9K{k=S#(w3$@vUNu*ew3wcln!QiC8QiV@+8TmdI}NG3-?~n!UneStVA1Rb=H^ zW%ilaCYrGZtUkNSFY}-I75)qN*WfkzyW%>ZA{L2-;w+ya_OdV7muw%a&PVX^d>E_D zV|g5}#Ow00;;I-Yc8gu&bFowG5Zgr^79!pdABg2*g;*-y6TkC2d>N9z-mE8kf%Rgm z`5In@*XQ^6da*`4$!fFJq9dCo-VzyNx~Rv8_(cwJNNf}v#HV5pKP=kwl58#Sz+Mpb z*jB!oC$OQSA)n0x>>MA!2C_kH2ph~&*h>BpU&ZI}w|N?ud^g+0K4*JaJg>&9@@u@0 z_(hCm=$-{U1E3GP4*MJ%6?-v*pKXI_A9&2E@IYtn_Xi+u*>X{$j1wD z*y{f_-1`5kc>CXnTmOF*Z~yyn>;JFf?f-4K?ZtcWwyY=b&;7}~04u@Tuow6M{<3&o zoD}bf6QUpgQT#5t^4|RaQDpvCfw|DXkIdb<6Pvs6{~Vp$ivJX!Td_X>(-`d!2I>DV zG1?yt(*Iv#v_BZ6|En1N+&@O?B=Mi(wBHQW|6QE!#{bum+MhX8|1TnSYxW}V`+ps; zpXXn(Ho~7ZXt#F5_W!G>-A={rZ2UfZ#5jMz9;YZ@O{KY(Bj%-JZkQ8Tlao05*=sB}91d_H4}P-57TZCiMu9-PryJGE23Kp*Esq z`cd9B?4P#7JR4O@kb?zwzUteU^bIecD~ET(MeQ7I9D0WD2ywPm)CSc??7g()!QHFC zko1s1((>GDD+?0JF1P*!0jiBH+Vu+Dc#vZwL}leu0-~*!jfd~>O+^Ex>qZ2glc9ll znIn+?c1>LCZoC&NYKMEp=I(cS_P0n(w3U?@h(A+Vo*yN$Z+y0#*pQ7HD5&=aot-|t zXBgbY*~sHWTs=e9frsM~A%on39R9i+7xxj(veB-WBY1a<%-j)EyI^Ct#z;v0F`4`m z&%UwUK=Gtk{!<2t!T%`#5WP_-D@F45GPw`9PaG`j=lKWer;HZA;=h|Nhiv}5=u`7}{bp6?8kUOYv_==M_g+ayV#Ku!mez>s%h1M!1$5>+1QpDMyN zY5W#T*VYQ8!Xd4aw#lvwJjQ|n88=n**LS28wC`wxJA8CUJ*Q&bJZ=e>Q3tGoic36j z!m=qUnJ-Lwkwy9API1sQK1bK}C}wmrNIx0=EW+c;rK!R;8_E{TZT(d}gi)3)VngR;)h( zHn6cfL%g8*OW%i@Kbs+R$5K$5he|8T#GiR1nK;uCfAj{>Rb6k>RRdjK>P(rS0A%VJ zyNwzs4OOM&kn))$qO@*o@dlfsCMfc03i8sHsh(yupYfmw(=DvsBFZ`<4t65HT$1W^ z!ccetS$~#Ou=t)W{bs1HAQjY+DN{v0IsQFcv{@BfNMgyLmZN^JUG03zuB{1bD@

3%^yvAM~7>!JW>uL5C%t7JAxJddaK(?A}48{5X2G`#ayp^NLu9%(3U|2$WAZCk%# zMn&b3w?!oxoy-f#@xNgANNw;MeJw^L&)Wr?Y^m1bgnJC_&Z8V7_PB>X)GDaxT7xc9)0NX)o}VrXcpOw2-8*xICLap& zD4RTOrfB0KB#EmkN#fC(CPA)!$7@ikoD8azE-$S**P^;*i*B*E`!RC*Jkde-3tU9V z#Ro+JRYOPAP#UUB&v;yRoA0qlZT5Ag1)t0F~4us;6wzMYmP$)b09kf$hU1Z)cVikW(-q8XJwsk>|hh~`uf?Qs{fFm)S=x`i$c8al-yWmOc59w$L3 z)#cGLr5+EFL+bGSa^`9$Y`IZi(NomNdDb9(epzyjLy9izT1g2{*i>cQgo@lNT#`ss zRV0#DZdI9r7kQdupFFL#9F#7K5qH@9{iC)fS!82==d zW{L4iq7*k(PFG1LeF`oY&K7a5SLks`6<3o7sdz?1oZ=h3!7xELxGKV0GHC+{&o<-* zSX!-W;^Lrv4kc9Dk8N&TRjkM(-+qFL_6}Qe9oxa6ZJc%|Mq{5 znU9;CN)o-QhD84Ys_B+d-mE5*nf8*?x4I&6(g{@qxlwP#siFOF%5%+D!${mdD_bV_ z?IZo$#1pnRc}4r8e6-DJK;1@OqPjw{x3Arm331_a%@${Tra?^cK!aF6^x{_EqQru& zd)M7nHNj=nJ_PEQH2E3A`Smrh~ z5)BRchlUIvdKpy(w(tGdF65fiC|UUnM`o0Er|q%|sKO_~(JQjUUReFkFGLs3uS(3@ z%&|vL7K<>eD?%e2~N(9`4Jv@CZc+2UyH&X8r3C(>G87Eelb9I z$ynQ%Km`qPza8q0wULRE9}x9qSQ9L3Wn#lv!+4G8dh6QNIR9=LJ0K;ZCzHVBk-@xH z<|@wn?QqiwM6YY2*njE?&6<=&(X44QnZbo^E#!i|j!P@SH#ubI1JgkCh9*jsiw}vO z!CtFMl2ATHmp7EJ92ON_MPq5=u$|VA1ksyvQHF>m?In3+YmDbpiNv1ZLAQE*qG|bC z`rc$e5}})Soy5j7?T$Jo;xhHsm~~H=A0NT0OLX_5(m%twUv>1eqc)Gj(asD-Ca>S; ziJs*XcNkVyPjj4^L{~w6m0_Jl-s$ix=qJ_U39|7iha01c*|OocjwFn6 zB!CFKuw;317CQpF7NXRV2=3;PI(FSFFBd)1(@KXD7NUsALf+Oy)n%UVoSIyBQn8$7 zYiS^A+_QbF%A zl9ze%)suGeqDE6UP8Bhk(<9E?v*@R0$Byj2_7ai(x%m=vC-lS4;vuT7Cml)5N6 zd|xJ=bK<|-mMSF^SuPKs%RCWN+|oqs0|?5;8_JsV92+yD)Cy9`NM3{V<_*f^*s2bi zTzv?l2_re;zE6b6uxn0DuJQOLxWmS^QH?UF5(?r7m- zI9qzpPV&u5P7l&ith~Diir0~Mx7+=ctbf@lA3xu=wdYX&38Zj%6t)e5w<&AHRaorekH)^8TK%@6n zWcFHt;ZB=m<6i{!Xs$XFaAVlrOr`y_ybXnIk>`GKoXs^DS4~@~w33Yf!5P(DUAgA6 z4Gea8mH(5uC>olMe5PsQ|xYkWVbAJ`+s7-pA+4`G~Yc``fttm3q_I1e5Jw4UfJZ%|3D^R+GPJhCi{rY zPWuc`{z~2dZ#mg7lYVzh#K;-Grh@;RGaOK4|1xKAE$JYvB)=b{#=#87N{Ch0iVo@W zaxzoiKs>3)PMc7NRb=lXCk)~B4$5#ijcxwhE2FDkBE`^{_^f~89QM|KgzN-b4J1Vtlj#qgM%8q+q|c|TjRDa~8TCNa_cUtklbw>Y z9ylu|#^TraR8UmLJ#-dYvNC*H&U)xDtV(INtz<{j)ibv2WVMpK$lEh5Lv~mfR=uEg z;j<*WJYk}gOuFwF4o%8c|7lWw?rm;0)E#hV`b<19@ zUHql3veLNm2fA@q7?uWuH)gH=N1|F|R!`L^=BS#BGD*1HVV_hnRtE(?;m$ytv^a^g ziB5j%&4w<)9S-}E4UMy$?FwZvw9}=0hSoeU( zkhYwELpN4V#Ex=$7embBQ|z{%0?{2gG`GX8A^+b={;y?`ztRuM{|}U>yvExGg+z;U ziaBchE-^Q>uxN-a>MX6RN~m?bfkNiV#aqd|;lUn+OPV9Ny827b4>fdEBA>0RXHWxP z{Uaw#;%(&X`Rp2`p{u{;xqMl4rP?Q5-KX}mdo@j+P)$=O9>}Qt&dnq>m+yzTZ`SKx zzNN7g@JMzq;P6aVn~TCTNe!nc?ia99v~|!eN?>H~91oua8s1GLZP|`x+$p$BEacot zT~v3r!kst=#R4;bg`QncajnwrsgFaQZ)EPNDyE)hL-FW0U@QNiEhP@pR*2kH#I_aX zQZyo|8XiYscJ51?!W(2ZHsZusdCDOlgaR(nL)W&_pea2rk6& zGC=~xQCLZPz3l}M<(EyOEUa#owEDV%CtQAB(sq&oUo{D8{=r4+EW%ssZKHO3#1%QkWr;AeO5)@ zdd@Cxj^g5~xSrft+6fHC_)$XUFXN0K$_{C@PKh89HVcGl+2pM>MuTP)k=dEOF_VslEiReCiw72$%@L?tI!q2JZ&;J# zJ*v;NZd*#)nHnI?P?jx$fO4*z5biiXnD@|q?} zZjE&mt12?~IxA?R(z0PCrxJ21B`9*LiqQUqh+;BtX^}&2tz=YWtS`j|3BggEQyFoj zDkF|6DVox9d#uqjV?R1h(L~8Ql`Z>lP}WdT8BEKR(g+31uXt(-a$SYAmWs{xV7ZZ& zRh92nanmyIK1jUGU)2ikg9K}=h8lO4M~&kjb6RxyQuaw9s=CY@@1z)p6l>t_HZ^c} zy?Ezt%3+nND2J`dDcdX~BHm8%d9p!OF@?!ma#3}wvRq%ykqHG+w={uDtIDR;?MS5F zpDvBLMQtLn=N8)i9=E;p6;xkGR;^(L>{QEJb6wqTxtdP9Zl9G-sn7MGuM!EBWZv%$ zk297z>MNSk?pe^31vuUi46ANDP?e5Ar495A`mAURS`YB%w-gf;DaC|_E@|=}3heH= zL)U2(DLG9eXyN18yjgq##8_3Tk6hRg_7MoG!a{DTz{DZRLc9&fse3w;dJ4dG4jbOz}!- zWfCkTe;ShUWOuM~W4R(q1W|iU6rX8SGqR`-pqZ7%V`R=mClVTaVI3uJV&VNn=ZXf> zPiK>3I~&fUyv#UN_9W5UlNTdH?j(0L#R15LO{{j>@QgK_r&MVma(-osTV5YBlKZEL z%uWUuBl;JhG`l9c`V8Vyx>&lrt++O z?lC)4368uUxsOAl`$(lA@ujYBRVX)Lg zkTukCK!z zwHYQ4cf<%7-_e=c7}J%Ps8mlzj4(c2j(yVcebT-Pw50tJ5Paa#w0bi6E1pXxeQrc3 zW8yqgQ#O+E-5ehyTQjFSFUt;3IT6_q(kS$=$s+6pS9;p%zmm2wh`geSs!0Fqj!N9v zqa;PKXEca%Rl*YU>i3jj|{Fv$zXK@^Q&49ut)BgZ}K`mgs8nqQuI)?U4Gja`{58T)wIy^Hmd zHfCBuRt2!8tO(Y)~k|5&btzR78Xbz_cXb$%p5iCg%b&0@h zuC84xQnKqwHfeaE%aLN4$z8Q7a+2EXAP+?T*!&;XD}tspnTS^Z*vw-f6e5)9X^-;_ zh<1Dwuj&zP)|RHAlG(SK%Ufg29(cq3o5cLA3JCY7x;ug}cIBp`B|M5AFH?t_wRlzZ zmfVr-EHD}dG)*??k;QK<@Y^o3s=)aI!C7p=^Wh*Iku9h9ev=a8=><^lc*3OBbrA#+FK&toEW)IpsXcRNA3( zNmg)hYEv27*Vc`?nHDJ(4J|0oC7O0)8p{v+I?WS<1#7vg2=nSTlW62k%qp9qg2+5I^Gz|*~{dRAF>XZ5s+7_w@_j@~yFa~JW~CYV_A1$7 zxU(WnmZ=m;mbn@%_4tSv3N-xUADu@LQkYny2|czejk61D!G^5X6tVjJN5~q?O$Rb_ z#W2N=bepoFtn{)YCL>;bETcwQWo2k#oqc%MSB)K&bwsCkRFqX2{``qtGRn0o@1qjy z(UJQV@u)=CR~%Cyt5Y4NV{xCt6e4dl%Pe?fwSEK1{PqoH+jg321f-4f_Go87q^v=O zAlkIqBFyOrZ>yVW1NhSno{i0#=sV^8@+}%A%5(p+|f@FkqvAGQSut3 zb(zKoV-VQ}qFHM&h~ymSh}{^@K12D=H5krN?zK)gPAFz6PHdOg$2rWZFl($m?m#{H z*J7^$4`DeRdrvv;)a6wr-sEUMvSfJoF1cj96to%!v zZ<1%w4UUcbU|*qcAt9LLNXN)|zM^^~Tf&dFx{0N+&c0usd);1V&zgySO@*~(;ud<+ z#}U6vrtF0hHoO)`=3mE?1_?N~!<+waD-KrC~ zwZBB>Wgyb7YM3(G?}$w2Q+n-y&Ri>->V(o0WOx%U$I19lbqICb$Gi7*QWM2Xyg<<| zC;L#9(7wniGN9FM@Yt<8HU~!y#Rx@=?`5S_XDXgmKBwj8R7XCpgR6U=#=U1`<5}KO zRy9qj(phSHNn6p>vx`aQq6jGbowEtb$(Z0bP1JC*u-nf z48xRzeN~jy*UOp`Pf#wlYI?jQYn@kY%E0-0d1Uvw&T1oNgGv_eiS620t zEB}FKYQ3S}SO&i<^Dnh($n%@&JPnZTbo5R?&MWGFMpuTX4N@5W|V^} zn9x~NrxjmYc!=%ca?nTiY+@9sa@tfFgPilVS##@LvcoDTx6T@Watk~(*R1BhTv%2d zzk;^%D8ee#QX7vT)qq1=EQ*jqZ(elmuU$MgaQ;}hTpaE!P$@zqvkTRPINaeb`5I4R ztUgdg;XfjMbSnC8iV{(#TPEU6d3ko-iNm}bFfVMy0 z&1=i#j~($ES!F?zY{qkW*EypGKH)R7Px(h{WY;^MeJv~o3SBbfN;w`3?OQ{GZS(Nv)}yyFAS6O^UX z$?lTW-H)FamE`3w9M4mhzILN+=`VsR5>$aBi4_8=O=`%^k2{3M3D_u2lRz%)9Y9oV ze{HfC%KD+UXnA-u_Fc@njJ&-RQP{zlEK0FU2e@L0-RSNxj3*+DR*XHd((=I;C)8&3 zxiT=mMSJmIhnVrkII3J$)5K*8HRiFIav<8j7sr${?R&Z&qBM~Rw#!2kapmv;psOw8 zMGO_FS2L3F9R2+u0akyN4b$pxMG!Pj89rpN+*uh9yc|vz`DO4GBJTW7d1N)v$I3I? zoi#&a8@iJ0zT+SF!s4jFYmO8!Xai35fwqz=qYvFqwe+l=XCbKqfwbF)-KO5oc~VNw z^teS!omJ(IUCtsE-E3|j#LMoxo$UivO8Kkm66JK&B>&t_J+cPb>axim?A#AogMCux zbqL;pIIDze&>i*(Q)BW{6MZ;T8k3hxsL_si-sRX@vhf$rjc%|}TvD(}kh{KcX8Xn< zUt2cW>kRV7Nt7jT(jpNMq$cTpa!XS11OUFTtJhr~< z@s$;sc__|0p=m&LQJK8Mcw<0AqOjizqhw&bi=dHiC%%^DeZhrc@QuN1An(LzImXRR zpz(0IdA~i}_kk=EDSW+Gg#IU)=CWR-t&ObHpC*d#sUQixOhd0H(^%h>d?)x{>d*<5 z4z;m~=4K>Rpwn!f1Kphc9M6FXlwzrl=%-kiZD{gC*;h-PU=YOfGU8}Q~IsQN*2F} zcZW2{aO~Td3AC1Lk60CD#z7t?54j}9#J>%Z#LB9DF<}e78;cS@<`P-{iZd;jwHzo z70bvO#~eeVC22#IPeK{#m+N~HB15K~c~=$XAM`kpHYrRZ2EX#bYY2b(=4*!+#2O z!WkK9$W$gzIsbErFg-GO(=4Z&y$`%~1<{cVURmBd=~%OolsvD?tI4US9NRK7{cb47 z+q)~!Nix0vs{F~=7wE2OqP-`{?3GUyBIpS{#Wg*lmuwSb?F0X#mpVme$80yODOy^` z>Jg;HF*5t)NYxe~~ z`YAf^|Nln+51I3-#cK2H*V&m*eD{~HoO2fY zT-ho^C)o~={JgUUMu}WBwMDb?fmzxL{$F!hTclB+at_sJ$~gv6pPe^v2BWZE@-d$B zA8b>$2rlKqlEB_hdw6(*my~Ua-~$Ihyt%ItCSH=IE;?btO-NK#(9LG-(ng~(OPNW5OuQHtB1Dy8;bmQ5}>c??;%VuYgXD9uRxdYrOP zK8iQx1Q{{H*DJE^WoP@Do(iA^7o|8_5U2muOlG8r_MSCK<2=KwAPCHljFXj{7$)!L zK8jJA#f*`Ut~jf&WXGz2?0Br4{1o@bl& zJE4r{{a%w_UbF0%pctEVlVs!Tj&3NxD#mEm_qyD5-AUh#kTjVJV&(QT*nSv$!?6it zruPO(eA=-}nQ};DjcSVQe$yEqjP2z&si1`WpZbM))&qEAtFf?^Y7?fnhpi3#)5uwjv}TsP z`8$?rhind&4{kdR8*|;+L{Uecx{GuuPjQA2Rt z&)U1U6=5x6#49eNV`++}d?0>pJ`#W(fhdkCC!oa}sYzt=pUz6Hk^0S*=l+7J{KJZ$ zGGmIx?+{7JOfwASqsFTk=Mh=(q<*+Gyl1{{C(|^;aMuM;&aCfwUC)?cJgo4pE(a%N zLTILM`?Sl6>N2f7F0=_HTCQ+jNDG287@ygw3lASfNYs2 z%QrTgy#ESTQGywcYc8tFM9{uZwDto96uS%4piZk1%PGuxUx1DDt4C|+(4OkQp{Wnv z?%=b-9CcqUR8#j?P(33C%UQi}zWiZR!-x};1j||zte4k!t!&U z&wg-Aacex^jUyo0eD?F*ZeNrZsW0o~EVncxoBix~6be2OIdNVq1f3`v;&c*k&DMiW zF%YbmFNOGO=sB%=o%X?;_EY7>QTi#K>GRd{lsU>L%fDmh*Esb*uhf&tcydjnXYLXHH*T z-7@u8-A4W0DqnF6vUX>i{5hx7np>%2m@54Y3@4t0Jq*m{Fzf~irA`VG+o7$%{9;k^ zaxRZNaW2o>s~xgQZlfLJg}OWC>fElYcwbAm3k=MNz+2H0^EeD-mDq0iP9CRjLt>xH zY7&t${jy-#zi#wvIU&s3sM0$%dO-Hb?<*$f z74qek?eqEU_rn{H&>SQZ`xOC3lZU9FpuC#jSLRlA>|WPTEe4zH!vt&QD8Vp zB+gJlQZiio6qOd1?ZO>VyU|WLDn+~R;U~K;V2Qk7VW*#21$9~$k8lK)we*a9^WT)7 zm3Ph3o5k$l6M^Q>$=*eM)jXzR`2Kl$u&86As$JvW3$ku8pXABn25&~`CE2`$Q%dzK zg;D*N<;Nv_RXrUxZo4AGOL}i}+4|XL>zN_LdU@C~s=g|JE@@Oi95mbd9QhY51_-LkG&+QO>AIBx*N>NUqx?{p9VEKKqe6rH`*m*)0?S)eY&7 zGTMI-ZI_0l^rrkN%9c3hk40pBw6BnoN&yt!l5L}Xl{`{0RC!yjjW$$iRQ#(fTFR?R zSJc1B38f5v3~ukp%Vw!j>F;g*Jdn9))AFT3?XE1k|fWNB*gH@u^W;kI~mEo zCB%>5O%|Np*keZF&Np7Xos{PuIs@1FY@^;dA}uHd9F zPjubdHB|U18RD&0qjos|7oU?T%W{(Mbt3ux7?NW)k`>X)#$H^3iVj-fcc3!bHSl?5 zpppZ$Rcb*VPiF(`3V9gWH`-`}E0A+2dHILOb67+EbAha-9)t1doH1^-K`9~&kY8^w zn4L&c;{mR~4?_)poJ*2%uM=4pBMd&>Ko+CkDTBJB$YRus^zsj~DwMJTq6$E{V+Q4i zlf@_pi5MGu8hqV`EDdz{HL#(Ojg`0p^@kd4ya)PwB#)J`u>@COK~5Xqarg!JB)f*y zBsXbvhqR0ra~k}Hju@va8yqP@7Nf;AgUfMbF}BRLkq=j(&Ip6rx5(0f0JVX2y$rlx zo*;{{7E)_qfVIHpBn`Q#GHJ{Q$Bg9BHo$N)Fh5Ddx}FazKTL9LZVjtZJz~gd$r{$B zSYpUa4Q%Yebq{&vgchXn(JhjUi4zParIOTWg)8t;M-8h+9nv^HjV#7I_=pCCmjARmwg$eG|8u*%#sD7&33Mw{*i zZ7Yz)_zDiiSii?cEnI;Vn1FGAjKPCKWN9qM)r%hw6Er-c4>7EzvkjKP42&hq4ZdhV z7Na?&(RdbDpjlrVV6YkR^lpQvK&R0GSD+ebHO}G+R9{M#mw!a#1`XIO8n_CE7}v<4 zC4Sd{Mp^>3j%mnWZLM$3fu}axH+9968r)D8Da2O0!hZ77>IFarokcnuF)M=;4toIe1FtN9In6wLmLSHVBE~28Y$W0eEF5C6aWzTCyxcY>;tKp2 zVz4WoB;(s!279JKLLjMw!TvOo8qmgmz}HN}>&X*G8if+b!^n5Spul4CF!B~K$g>-C zKp{*djDq0?`8$w@k$0RyZrsl(_`sk*HS`1I>uC_2Oddw=febH*k___iL`Oj0I|jiu zKnP^LXON>Zc{FC@3S>KLP;4)GG`iyo6h|8)G|`~QX7VtKmNN(i^NjHQfEPcCfO|&q zS_a{S21Yl7&=A}Jljf zz`kn+Cy-qk|4cWyI|ljxE^hb-12Og@To^k#*?<%~fY#s^keiDbEWC`U06y)dVI3$( z8fWK{#W;z~$@pZd!4(L=c=L+E5YR9NcuV02&=v8`cs1T&U{A6b{V*`&HRJ`xXfVcj z;i5tNz0erY0a7srBQ-PL7@{G!jwX%IyOGqmh%2xpQN!~7I)W_5$M+0+t%J&e-e3ff zo2M9jng&UMMaY7TpCS!@K0=c5(@G61YByOc>S5-D|KNY?`-NmhBHsV$Px9~eB=2G> zzuy$Uhl6Ga?0+3o?u|IIC>f2X(1;G6S)w7oLV{s@h%Bjrn?D4`F4eG_Ou%XhXmr$| zIIe^fLBiKgkOM< z;VpnQvy6=mxB|2D8O-WQ76Xewjrk#DY3#%mcptiFjDY}*4~7|xNyXp5^nnJLe=Wuz zxfzJTKNcALT!bu*G+cp;t2N|b_b~qg-@%I*2ZC)}!4)_-!65ZGNsVW51yrQLug$Si zX^tgyFAaGCGZSE422+>4`0+A4h|y!Z!PJ#xF%psuhAkwEF{y=y+}V*d){h|xSQmyE zj6aNB3or>D$nXs{m>Q1$fGIE!Bk7jG1dQqBA0Lf27+ePd3_KZc5R;uOMro**QKqj! zL)@cL16QDQq(P~f*d}3hvSG8q%sp7WV!%$gkI}QS!N)Hl-hnq;AO`V6?nH1izRIm( z?Y=`A*Wf&i5-<@X{Fp&&49aMQHb#RbHo$Cy>{!WSvH+~Dh&{&kdtsRzX_E>YN6PV#(5g zSr!2&XB&L#jl%8_=yccM6*Mqj%4cIEuE5J}43f|(V@fT9$rzk5v4{;YIuSTB)8IJ| zS&VZ>4BkOMj4l@pyn}+sVhq1$FrpAyjCY|{#(ND6MxvcDYOcX>_y{8boipCop4D3QWP@Q@s46n8EQ@BpIJ!AdTU; z0zbDg*p^6=u^odkj@&Sq)dvCqN3gA7q-D2}j4N;o_b^sZFj$k5Bx5`7_u_{q%R0=K zf1)fAM4rM2uqSU$R?$`l!Ifbi0Lx>I+?QcDAa7rTf;C`IAlG7ppq^wgJZlZI4kwFI z1b)NFx7;AxMwo3Q?Egd=*cr%w%b@UT*bN9dZ;;~->;`1V-;7IOkddX6LFfqh18{GO z!CQ66(m0GO5ci}(yB3&-fw)wIB^Yx_8N~nRV-1FOAd7LXfri`?Mhxr9FoT%s$c8}E zqZ)F{RI~%1-7+|S0OkW8G$qdy@iva(3dm^&*|5!K6FkzG&WiTQc zVF-LPMni6ey%>vo*|>-+@BnIDxYXbW8d;2; zLo~eB?*7R2z^>Z{YZj2DQ2|%rM{utJrhWu|f~^_Ha~d3NMi%1-48}OR-JmM&WAu$M z=+X-r4|p-j;52AYbN)ZI#GvCivKT|J7<7jz7(K|~`8{MYPL(tG1q^F|`CowZ7Y&Ma z#sUyndE5q=SP86HX|OpvS&U5+055)gU&P=rY|S`?ju}`?7&ONfIMmJHxkbq7KwEUk z7=6#+d3Zh}s+mERRG1H_)xn_VUibmTAgRz$yj6?x@ zGggKhtcW0~u^3liCFXp_NhBq}q6#D*)*`tqyN%hn0?Toq#u8kC6PL06!wHV+yXo`XGbTxSz4(6hq~` zDr&01Q)TFyy@mIN_@0>?;tT6j*7q&s#6YnsE(Mv#14si0Zxu%X6q@e~1#Q z=`_)M&50)M%ld-*v{U=?%0g?x`n>SOnjLTEuE2w!avxSEd~8}i&l@bh)P+s;cH2Wvn4$MhW;RF?vIi>-IEmIy@b3brU+CFKKi#ItG&Pd%o)y9R~Ng$4aW#2)oK@l437e)Bq~n1GJbR>DEV* zCQOu+ItiKtI^yp-H7uHT9GaPjae&3sEHBkj7Nr4KZdf$zCOE!jQODmQA+8s3eIPB0 zohj*F8H=`;wWxa=#9dox>nn@)thcBZFe1gGG54XF2j~sYaGmm-q+(Yj^}H%64c8VoBpm_5Zb_PcQ_?kjKJ=QT z?cVE>8UTyX5cRvHVYemS=IceMkE^3V#GjH9{=!YT&b))`AxYhV35O*e{a#WWa2P6Y z@r|V5J(4bfiQIp~ckWm;1=rknEtpG z^nPbiG2q%hc`vM*R z0v#~UvM2-@FBP7CVJh-CF#2OjWo9CC0{JjN&sorFGU(=8v=f-}KKdU6yMJI&Dy{>k z<60q~G(f+=9i-#~TcM%t77gBJQN&i{|F!s|z&&uY6UismqP4*0 z8W#Pz4p;`smSccp7!c^Y3iHEii((f+8esNGgxROCBN&?f3OattqK!ZsXrwQss|6{i zPlk3UqEBGv5t#Kki;kQF%{vxd=mPr(4T8#tWAG8+_FYUA@8R!}2&GXL#p81iRNCup zNC362?2GvA414CW=y*YNk{hZGM#lwU%UlSpCt!0A7|wz|Lcvfzgkv`Jo71A_^MjGX zxQ0Ob92RxU4ne$F7+jepY3y7{cd;-ScNF%TgOv#Wu7;HB*^R&VBILdW&1B?$q}s*! zZ0$Ztg@CnF5D7r51rp3?!a{Pp!tZzDAPw z28h;W;cc;pg6bm73VW#em&j&CF?B++ghKFoNZB_p>!xf)WQhm?09<#|YX;1ZG#G%^AjnF3SSc?((to{WS2TeL$+#Np;8i1W{p zCWpcVuus?)%z{^7KRD#krU*s+eGAeZfTT?yNQ!^LL&tz=(nEbPC)~#JYv%!&=OE(0 zBq9Ok9PS_WHQ`KY$Yg-$EF1~`&;T~xS{2@1 z1)dB|c%V-D0&x!HUJCUA@h71Ehmv+iT2u|4PU~aQke$eWh=SYbe8CzdD%PBZaN91#8VpMnJ_#TMY=aE40`R!jY z0C4d<7NEu8ge%bruyO?)bhAYhHo?ihhvbJrdkF2R7BvUD;rB()fvznab2LnV{+dN0 z{!<}ghg$GlXdw+D@zMm?7oF3u7A2m6r^e%V_(=Flq|g;`K42z(A97M+`-2dJ2C^@c zG#iLmj)f?28JY=Rg_RDF4~}*hw1os1go&EM*E+$+hG6BK-NO7o{4>P%L4@IbXkiDI z$neUIcT5qns&NVgW(OZlgeV3imC~Lez@7h|b~_(MR+a zy~MM$oL->z)PbI-=jb~sE6d0TSy86ahhn@KCnkuo!rO)xi6P<*@uo-+J!!Y7CX2`r z3Z*bvLKcm_|Pg65`hN38%s?ko`LA$8Ds34va%|vBcMRu2ip-d#@}xYAg=3mLBY*MA3-VXFTI?5{#A{-g z2$h8?T<)f)Xgie?O+^>^svIO6h*7et+$N)BUHP-TBv*-jVlS1H<>U%lN&9IZm6oMs z1zBDmqyv;J=8Fa56Y;57D3;LY^aU-WrBq!;%OX@v7MI^rQHrFh^t5sGEz1d zAIR_IZh1)7lBeWFSwq&8<7hm6L=$KtO`^$^M62j?@tOFL7Em0uqd{V@m_k1Kn5NQ9 znniPHHccZ%GiW-^rFk?Tv;0E(gg&LuXc5g5i>U{FAacv6WqX-NHkbKiOBo{Db(V!? zoXjs<$y~CT43baD9I~;@CSzqz*+k}*Eo1@NT0SA0%Iva{EGXN^Lb9#wAcN&IGDeP+ zpUGE6H_>1869>g+N)`QOA=)W+h%I8Pc#V3go1H{aZ=zf;Ka|s@SEk7KXcT!Vkw#KS zIxXIo8{}7VEXB~1)R4ldB$c4bbVPhFwu^0Ilh`b}%9G-hXiZ&3Us0Xn#p|M*96|5W zFnR}z=(lMoy)1f)x-^D9pu^&jC@XqXA6hFr%9rGevWFNb@_9uaQCIva*2r~ofy^sv zi@CBU&5~EeHE~^hA-)m6i7R4+%qnNfzr|MhgoqYfC`eQjH7HrmmrKPSkw?@N1w>=f zMC2Fa76Gn>5(hM z9r3jk@*iFHKJHb6aA?l^`+M-f+`^iRiyG%g_g=MWK(KD_30;ZR2&mOisPcR zC?h6F?+NjioG3q%--&@Th1St}`ie@4?qYx_E{cd^qNu1S`pTbVKep^EI!!;&aXLq*=zIE!&eBObLdWO~ zouI??BmE#Bk_We7Vey|%shKjW_kT8}X3D7E|Jjt9DWiJ-+fr%=(M~)oUKDX69~GmP z)Ly(KdddX3M~;=>$d2N$JTF@b?{ngjx%a;}^-?)1LuIKHl~(_B5_xqJZY!KL+(P_Y zB5ol6zo%la$;JO`sn~0B@&8&X_L^M$UrfahhX*qfe@|7+>Ejre~`$lkz= z{Mdxtf}R&I{1?-5Yq5dq%gm{{o=(o*$7SdLN^)+f)AJv6g|5?0x=Pn5o5(6I(ldxHO9zOwmx*M1^p*iDfm zk1x-$(qE>^k3&;FDk7H@_H8;}QU!OH+0>FUqH;q-Z{-TU7WWnWpn{rxROC$=o*;kqOxY3cJN;o6HTRbFq%Xd1HkEsr%sOR9IbZm= zY$<8OWVm0NVD-vy8I`hcxO_jzS7&yql!YJ4&DquXsj{$nEg-3~CnVTBcnA-V&)Eul znxish;S?;xY=YUcklHvE>s)+(V5-a+@Oi;%wd?3-7U{S4eeMT!XsRrcQV!c;n{;b? zD*|_`mz3;pI!z0)3ab^Pto%8S%D&IFB_g4^Dw*GRBRRsC7@b4im@R`;)wvFrppVd` zEkG(A(nysyU6u;yu}d+#$7euhIb;!P-X@tRptsc0hM)a2WZ!_huUD||ej0aY(RZuJ zeX_hdFENE!39TvXUA&M>g=c6jm&s9)sn}Y4_oas}rii=gM-1 zaG=KuQQhXse7c{3>hv60MQwdeJgJgyTDG#l3p)G57PmS&3sPI=$=0Ta;AETA8feI6 zMk%ZMBs(K$`I(g<=9F2*sjnB_vYhwp`!oGsB>lv_)xw8gTiA@wJKUVS@2qCryv*j$O@(>SKcUZh$>~2JLW5!k0|t1 zL5Y>}8FP2kM%x`KqM@Q1xl%Uqi&Wo~V2x{q6JH$P z=q=?vCdkX6gX*S(jAH~kP7QVPOZl{|YR6NwwCpK0Va7?XBBqzM@D*Rx_KhJ}5_)5@iF%VV!C|*bDF;0=E~-$gIo38-nOiUr|P-gLP!3Jx)U4 z46nn9GyGFb@mZkPTR22jw#kZqXEN4jFKcPqi?Sa%fg70qTA>|P#i9x-uVL#1|sH3Gs`@6SMv@yI@HX#W~Ck~ z^q_3$54{YFlb-6MgU;f_KaXf>c^-LKjo|Kkv@ih2Ww<^nVtn6+QWTsGq4Olsn(Tlc|pSzq)qr~>A)$Mn$;?UUaSWilBA z6Q1sbQ&E2q-E0U~PVdBJivegq@P;wH%c@S=(1LSj9LR!q&1JgEMCzJH2cgrgO)-yV za1~dO3|8%aa188P8Na~;jkK_{$e>~NG#yHu^%Fo96BDf(jkAjQwjRiukr>NpqlNY$ zev?;9gPW_WC!F-7SJ|C@v{%_3K!byx>QI7shKT|*LwvMlBBdRO-eTScWfe~acEy{} z1;=DQt*SRcHI%8gd1P;y^l#t@tKJ zjXUlHDDQo=m3i;;j%lx_fibd?p5WdBxzkC73l*B03l;Ag z>ZSqGy2c%W_C{}sI!^dVnLJ$qLFXmIBU9q_znlt z$&+XwY1$(mDWHGHq>~5lm`15Hr{wGQ%zE0+DihG~9yc`c_1_g6P$BTkt?y^KM>AQh znwRFxM0&S)KF!`O4gtyg>S3CkWQJh()%S9aAHxk1Y}4|lmA6N_mA6M9nAYI2BCC4$ ztmBQY<=9x&^&Ff(Ijd#wiZp+&o%e@KV()dqnput|sBLF30}MQeBfKkm29`iv)A4w| zw?Y7aF779o)(rgd)>n(bb%>ADp5}_rw~27*n3x(qaip+Hyx^>CTvN~__1gt! z3StM)oyMZmB-QU%`J(BREw3Bc@{`s5U!9d9hmUUH@R_2*J^i$YIMa}1-Jy8skU8l1oKa8TKhb$%`)0odHbOx>z$QV4Y=x*kjLz zPJK78Ns@7Q$q}M_#_Zr%i>BmV^L%FJDQvkiq&FT%6R}e)0MVf4D5|9A5!Y_&6SR+f zLNrtxZaRt7m1h>B{m=+eoy`|G3Ah6EQ#JpVQx)Ur({@e3=!>|al1j~k+>u^@blLDT zCaK`t`hrJ!A2{LfionH&BJRbkDy@@i_HZ%rxjOVGI*NZjhl>2ek;TQ$5>26kJ6UZ5 zCKnesUzkq*g`1^J(aug}<1o?PXl?qFm-cCqx#lJf6R@2G9 zIPf;6upO94v%&hEF19DjQI)oF8Uo-o4M212$b#q#Faa`Zdk2*Bf)6m~{l!a7UsI0F> zh{M)mbC8k&(c*H-a+)jGFjmlKn6TM-5L zK};#!eFS&M#B{0MtaslYYG5ua%7n9jDWHeprN9p?+}lO*IN_B%j-oUb*RM3ITnIj@ zQu0`K`Hf`==5bhtAMJ6}$h)F|iVL>v5}0c%eM~J2wwwYl3b*=ht`q&_+}$V^<)Eae z1-5N@U54=Qy!Aa?4?gbPllU}71i5VyP05c4G$n5se|9Jj^%E#eJhpdeT?@)uKcOb) za}=t3{4Jkt%ro@Q>EbZ8Q%wl=oH)YVze<5qr_ zsm;O9GSfiin>(knnpVIO%s(4wCV5$OMqMv}*WUHpY-lwpg{zonvCWK5sisyGbWF)l zUv)O%ozOYt=CrZc2|Xz8be^=yd`8gHK{0EDE)B+udg%}ujYSas?-osO%1H#$jFI9>xfh8 z6{zsc!wBxgP8+Vh$5nNys1xN{YS&ZnYwDe1)~kj&y(t_~!d@jjhpw;l*h%5?87`#< zuKry{y1_;o|9B(aWFt**87VU(x75S1OpIt5nUUYo#YcHX3-x(vN65?;yscuw9Sdq% zwuW2gk>CsH;tzBY{gG&;DwYiB!swaJ$nO=Xd8Oo&kF(=ns(2~Kj(+~NnYh$=2e(ejB-{7IqM3)#YP2Pnmuiwk)?KwFh+1vjim0ZReXspFI>d`q)?(yiG zAH=Gy>m48AIMMBV=Y1A#Pa#O3{!9ciq)Y#RI|#m;QFzTcJ26gKsrJr2q=+;VZs;;yi*IQh}F3(Tp$t>UaT{2M&2 zaNgiOq1r}T_M==qwsSTD+28f zyducYRC7z>)XntjPLTNh!SBNb)XnOS54$)i2+?jHt)+IeKMd+ay0Rt%fElxo<(FHYct&(hpbN}X(A*_B2=586$bhccWH28D+D z?uS0{C`L3PuS3f^gv&yMRE0lX*~-t7-}}lL>M&n$h(|5@(orTC=rv7M^jO}|ln#*1 zl?*DV`Z14B1{Kw|7$+HIUI<30MzQ{dAfB1%K`Ud>N*GjKt%?WUb-#iP>8lXGYP4Ee zHI-F#BWDB`V^!3uMwuA%TQw5)|E?a&P^TLC#pY)v{CG;U!HeXo0?WvgvqDs^0^lNY zfpav&pDQ&buO*|H;gZoZ!ndM*R@J$Q(`RPNXq&RKy3oXlJKpH%u6UzU%_gX>_HJ?6 zFWI4b8&uV8sw%$JcDhOxI4@-$wT8o=+WV9fn5-?W53ab?gg&~?5~cC=5!u!A%^d!< zzS-4t@qEu7Rtr7F_*R}P!Dm%f)odPTeHU0BudRwdW7!AJTqTn_D!K*xdVP^c&HdFG z1)OB4+ty_|r*0eg1fd@IJUttgz02swWHv4lX*sw=R3Ghm=ODAK$m?+C*M{~PwpIgm zu%$Dzq17ZWo}C+VLzEid${&h>r%s+!ms&Zy8a>S%e`wEaop5iA>eAYJ)3Bslxx}XV z;u2dd__{eqbl_AIXexiQ*Oa_qX#~pob5MxwI~QN|k%62&MN_h;GzR6!xuQm(tbtFt zn!r@PuBV?0n1Ng+*VB(?+)z2-HlAGcZM?2~ zS~Yyu8e|mVno*i_Lp3$2mNOc>%SglPnP(tP*D%b4Guk_|uB*n^LQU>qmG`Bd3sW!u z03D_;4P3R*mQ3apLa-dwZ1Hlmm1_4qPVh!PXSFfBY1O-)$Fw#iiFNq+X~&FqGF|bq zybaUY8iM(bS4+SziUTfe{YZJDK#!y^?%7>$WP%t2`EgN!f#oC|cDCnCdu3m2 z%WVIenVxqDgWEL9_~112urCjoiIjX zL?!i#@C5oGXF07)u1TVelxQd;)r9!RYrL~fRZ(pzkB*b%HElYc%Q>N1+69CDfEVxrp3y30Yv`1o0}&#&b$1TH!-iN zGsEyo#lWedzKQQ;_e~m=MZM6=={U2yyslRDvU>Z|NqUCptJ?K;GK4Fq_EW$0_UBaS zO3T5IWBWs)dFzT=0qZPR{d0gS@w&4dcO|@mYQ^hL!h=+%N6u1%(Bq4rqXsmjuips+ z)B9j`u&=|4&M2De`i3yKWjPJ zpNGI+gMMopP!!Nffs4SJhKs;&X`1Tl*Z^mR_Sd7o5Q-*P(gYf_KKnjFKU4M=LLCJuGDaXHlo+@7amITh^J zq+dyTAfElkf}2Lm@lsQ|x_LvW2jRoFAEFZ#R}BT6bapi>ykpn7pLguzly{huXdXjd7=Q3hQCq2jxQ-)8H+Hu}OUW7P_4l0TUD^*^1?HK2d)`*42|hPE z(2&|u*pRc-iqV;F*R5PqoUK~F@04U+C5JhXZ{*FI>R|$6K7C8;SA^!D6)~3?h;EJ3 zCuMgy{QD!vzf_s0N_-G7_Y_vHrEId=@`1x6=RJKJPu%m>D`PGDh_dJkKIRuL!5rnV9Z;SQ>B*4PT^~~~ft>fazU~hlqh{4A; zwGp@kv4jZ*#i0ZdH{BJju2%rRP;DnVMqq7fHS=y`sk%PVi7&qzwX1WgS;p~|BH9G# zke`p}c3uoDM|+zTEC%`|`I+OB+OGFcR)DBP0|aRXhjLkUC5v&Y9Zs@fs(IAndKJ9# z`ps(GiM@VuO*5<2pefEYGVm-S}@aRe^+cf{6nU1!9rMgbD?4#}4 zCR{PsT|A2}Hn65bJ4ih#+nVCRwNW_izlLB}z7kCWH0jzIY(#tH20papb{Lm`Z{kr- zc0h{0G~MCUAKQ8;o)tI4DDhLCQsZVgHgm0SwqT@7brFIkW;%UvSy($CKWg8qy3V#L z`EG2@sbc0>`2x1e{`Huq<@MOMblSErxJ;6nc01Fy_Jwc6spvHhXPV4a3E9D9P9-GJ zt#?AKcB^Ztv{kOy*7EanG0hY|7u%)g&2dTy{#LCWZru&>@%1vz9YzAzc$(TZWqzZs z&&@Pt>b`i&+=IT_Y{HwS2XbORm;Uyy>uKhw)nP+)&Xs=V~5)jWEzq+Wm5-+0GLWc8;nQ zpIL7Q?C@Q#^`q*t*l{h_2J09%RP)_P^{9rQyVUG*r=L`#B~~F{*#5^(fXA7_o&foj zoZeybDY>7arXwQ4W^3v!l}f%_&A{^ec^2M{J!sxjFYOw(nqp?iW?$*12<(? z_m?{C`xkBcAy*Uda9Z=wBSCHLDogurY{{PC4%dn$4SsiHJC1YrS?feQw`;@4qO&t> z_>rAu4IVPksII3_XVv@_Rvoo+rWN=m7HdXJ#hN+CBzDGdHJs-Lyji@Z9A}(NcIQaa zo$xOI7l*c#y50rvqsGj0slj#3=z==48c(TGS2+)$Toue;{jEX1_{~KErYRTMMJBTg zo!Sjug_}#<+S1QTpn6R&?&1Tn=R{7G{H5a*t_OC%8KTyzpIgzcD88Z|erc!u z^lmg`uJnAB$(-~YIBi_xhU$((1TyT3#p~)&3QoB}cbeV67t=Fm-y2M9m#fR~rqqK5Qn~ghmh$dES~>k;VHLi^(T;XrUJ~kz!b?IN zYTn^wa&v?(@Q_;;RdT1Zk>QBeXVhYGTUPK8(?4OrKsBfq4%ema!}IO~I~@)2PDTsH z#h7f&ZiAXwfArer5a^`s%2wIcwq4F~Dc5|NL*3kMHTqW%)xxlc=44v?kf*Cg{DhkH zjk8^Mm1Toeo;}WiLsxk#7i<>&9m-qjkMMZapoijBLvA(yTP*RH=JnX;7+tITJltxp z?p^r{)5G3?RY-=fxX7#8?!&V=bebn%LF*bfACowH+rXE3@~e~koVA%gb@I%9yWIF1 z*exLOTG`VTRnmUzc@qhK6X;aKCCP%CrZzun3rqyMGv9ai;l|z|#OC-r>peT50<$Z= zJmx#Aim&d|xifac9-(!|9ucDMA8_`zI$B(5CY1eUWnbCoU&EycQ$_W|)1~Ai`1XeM zN1?7gQ&F3$k}7e^iE!7lvlz_WE*0C1^bTCpe{t?0xgVzg3|eu${}_f|HmBnK$MgdR zu61(>b^Wko8=b`XakCDPXs9C`WB9H`mR0kygxY0XKv6pb3++ezDip2fO4o#6s{Nh%7UidnWq8@d#-YC zIW%ueYZg$B(p|XLrRCMEADzWS<}6tO65KePIZOH#rrBkMRWy|0s>|=r^DCD*BG4Z9 zJ$Y%3*0LUxVBQ9I&^O2 zM`MwoiW%JF)gfx~9%nD^is7p2^v_NVXFf3!rTU%l*X#LPa9kD1Xm#dTN%HmL+gNxMm1RnlLw<{bX7tJ z=|w)BC)%I3^F&XO)=~pbTV6X)@DnT79;P<8hWH*XiOG0m&F>pJWAN$3I;zVV%l@Vz z-Ri2;*M&Vx9z~riz1E_g#`VPt^$bx7wfwBJKXgS|eW$(hIm`a01J_!q0Y~Y)@r?sk zbD0Neh)%8@#Yzl?p+MdE7dG05d13P;D1(1=t?OJ51!7puaV7DjDgGD7i8H6{SoCtJ zHat15wg?U=26Fb%L-BF7Muw=0`ud`4h36{AH3rfAIw;3wc-WbF%qF1hdJLRn%pf)E zSLaxsret5$1M^0#X#iz#z(YSiXrYOC5%!cJie&B_uf>TJ?Qi^Acr%ID4w8q+A{kF8 zY3*~hP?K^=|7q6Q)*<+!kA{D_B+cwH&5^F6uh$PSrr$)`>DWZi;QdMGp=@R~v;g0Y zBC+f_6=@c-_Uh1;iCP+>lIr+xjuAN|weTF0txS7iwe_+UX#&MBmga-SYOPjXang}) zb-kh4MnzwBvW&}N+p@z}{=l9TE?aAa# z`(1nQ=hc?qofDw0y6_9EfK?M>Gb+GUz=iRUSF3^4ADa2`(`%YjX4${}<@hn?xIjqY!-gTUl z9Y}Y;yTh)Ck+kuF+gH~U$8LQ8^5U4VGrW(;>v}CNFDhR(;<@T%c8=p#4{2{oO_)Nz-8Eb#8b>QnC&-Xm)q)A_}_Am|4 zUSAQ;i9Xjpv>)1|&fr8K+5?y7u2oHc5aGMJ@qThP*Szd{axnm09*-!)bGMyr{gbVh zmnYkSTAhh_*DXV>)3uWsq)uBN=h0}Ox(4&@14lw#8E$vI()NbB>G9aFw6PevddCr! zfZJo<=sir`T!Yfc#4OJK%AbF<#(By6CIlXN7O%R7Wp!S-brJ_>2oON9pAR7#_B*er+2L?*JIeX4N)kcbBkcgpn%u4T*+vdO^NkRX|*?- zBb95{_>Q`n!&6OtoWo7VpIsC~n|7 zXZ8$3xw83teyT?e=TgXM)iv0o3!FJwXMtZO>XPsM0J>z>L#14hAw6}vL>%)HPQ5ft-@o! z%WM*oO`db5d9!2>!kZ1vYy_B10<+gc@y$c&?XLRhWV9zXMH0xc*>X9-6jh=yVy0># zkNsvrW>fi?q`KN#$YXy?i9S{7DeN&-u;E~3DwBL{7GN&l`IsA`d{Hg31-#bJD%aVP zRX&Z^rz1baW5o<7=v`$|g{dP=sU2`|SLb?Lw_2r?b#&)ySfk38dt}2} z~A*1LQYsNTVVgg}Mgaq&|!Y7&Ki0o7G?b1|wqN zw+n1xKMbCTZ;{(j(Y3tMq-=1V3d@6otu|?h>RkcTr#A{YR=;|#N!f2TvmB_~;9UdX zDxi8-b~NX*$#xZ81};Yygl^cmEzLZI-k>K#%LnZb#Jk8ZNF}tv{&0oK{!&NA2!A^zQfX z-T$b*t!a1f>fo5&!3zThcTeY!NwnEmgrC%`TAr!_+We)Kt?L44J+4G;PnFDq|I8h~ zkubQ&puW8y)A0$luePh>ck9_57edD;RdgL!>x#N|YhkpWQmT&M#Qd)ZoUP+2pjpm` z*3;@?9Zx00vdf5Rs%u@B5nY|0QTs66`en(_ZyK-$&ay0TX<<~?>P~EF8@gCNr)Jc9 uJj>_R!+L&}d17S;D#K&2&;H_!(XVU5tG#;TUz!})JE6zm$nJgn(*FSua?uX} diff --git a/Tester/Test.cpp b/Tester/Test.cpp index 9ed5ef9..8633875 100644 --- a/Tester/Test.cpp +++ b/Tester/Test.cpp @@ -1,5 +1,6 @@ #include #include +#include #include "Jupiter/Functions.h" #include "Jupiter/CString.h" #include "Jupiter/String.h" @@ -7,8 +8,10 @@ #include "Jupiter/Base64.h" #include "Jupiter/InvalidIndex.h" #include "Jupiter/Reference_String.h" +#include "Jupiter/DataBuffer.h" using namespace Jupiter; +using namespace Jupiter::literals; unsigned int goodTests = 0; unsigned int totalTests = 0;