From e7077ab4b5dbb041c4fbe54a2d2d81e53d964c0a Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Sat, 8 Aug 2026 10:37:42 +0800 Subject: [PATCH 01/15] update:depend library --- XEngine_Source/XEngine_DependLibrary | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/XEngine_Source/XEngine_DependLibrary b/XEngine_Source/XEngine_DependLibrary index 237be58..dc73149 160000 --- a/XEngine_Source/XEngine_DependLibrary +++ b/XEngine_Source/XEngine_DependLibrary @@ -1 +1 @@ -Subproject commit 237be589ec33bba0bf3405c095db470c1d3766b3 +Subproject commit dc73149af8aef839085e1f7ad254aea41f0a2f86 From 63827dda13626702455fb8bb0b67f2d9321a85cd Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Sat, 8 Aug 2026 10:38:24 +0800 Subject: [PATCH 02/15] fixed:does not reply when mqtt connect failure --- .../XEngine_AuthorizeService/Authorize_MQTTTask.cpp | 2 +- .../XEngine_AuthorizeService/XEngine_AuthorizeService.vcxproj | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_MQTTTask.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_MQTTTask.cpp index 377557d..7ee445f 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_MQTTTask.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_MQTTTask.cpp @@ -87,7 +87,7 @@ bool Authorize_MQTTTask_Handle(LPCXSTR lpszClientAddr, MQTTPROTOCOL_FIXEDHEADER* //错误断开连接 MQTTProtocol_Packet_DisConnect(tszRVBuffer, &nRVLen); MQTTProtocol_Packet_Header(tszSDBuffer, &nSDLen, XENGINE_RFCCOMPONENTS_MQTT_PROTOCOL_TYPE_DISCONN, tszRVBuffer, nRVLen); - //XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_MQTT); + XEngine_Client_TaskSend(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_AUTH_APP_NETTYPE_MQTT); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("MQTT客户端:%s,请求链接失败,错误码:%lX"), lpszClientAddr, MQTTProtocol_GetLastError()); return false; } diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/XEngine_AuthorizeService.vcxproj b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/XEngine_AuthorizeService.vcxproj index f5d112d..48728a9 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/XEngine_AuthorizeService.vcxproj +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/XEngine_AuthorizeService.vcxproj @@ -154,6 +154,7 @@ stdcpp20 stdc17 /utf-8 %(AdditionalOptions) + MultiThreadedDLL Console From 3f89ddb20bfc088792035d8379b4fd21475dc092 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Sat, 8 Aug 2026 11:37:40 +0800 Subject: [PATCH 03/15] fixed:generator order incorrect fixed:ql scan problem --- .../DBModule_MySQL/DBModule_MySQL.cpp | 20 +++++-------------- .../Protocol_Packet/Protocol_Packet.cpp | 2 -- .../Session_Authorize/Session_Authorize.cpp | 3 --- XEngine_Source/XEngine.sln | 3 +++ .../AuthorizeHTTP_GetTask.cpp | 11 +++++----- .../AuthorizeHTTP_Post/AuthorizeHTTP_User.cpp | 1 - .../Authorize_TCPTask.cpp | 2 -- 7 files changed, 13 insertions(+), 29 deletions(-) diff --git a/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.cpp b/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.cpp index 27fe700..09a7288 100644 --- a/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.cpp +++ b/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.cpp @@ -187,7 +187,6 @@ bool CDBModule_MySQL::DBModule_MySQL_UserQuery(LPCXSTR lpszUserName, AUTHREG_USE return false; } XCHAR** pptszResult = DataBase_MySQL_GetResult(xhData, xhTable); - //XLONG* pInt_Length = DataBase_MySQL_GetLength(xhData, xhTable); if (NULL != pSt_UserInfo) { @@ -547,8 +546,6 @@ bool CDBModule_MySQL::DBModule_MySQL_UserList(AUTHREG_USERTABLE*** pppSt_UserInf for (__int64u i = 0; i < nRow; i++) { ppszResult = DataBase_MySQL_GetResult(xhData, xhTable); - //XLONG* pInt_Length = DataBase_MySQL_GetLength(xhData, xhTable); - //ID int nFliedValue = 0; nFliedValue++; @@ -821,7 +818,6 @@ bool CDBModule_MySQL::DBModule_MySQL_SerialQuery(LPCXSTR lpszSerialNumber, LPAUT return false; } ppszResult = DataBase_MySQL_GetResult(xhData, xhTable); - //XLONG* pInt_Length = DataBase_MySQL_GetLength(xhData, xhTable); if (NULL != pSt_SerialTable) { @@ -921,8 +917,6 @@ bool CDBModule_MySQL::DBModule_MySQL_SerialQueryAll(AUTHREG_SERIALTABLE*** pppSt { // 获取数据库结果 ppszResult = DataBase_MySQL_GetResult(xhData, xhTable); - //XLONG* pInt_Length = DataBase_MySQL_GetLength(xhData, xhTable); - int nFliedValue = 0; //ID nFliedValue++; @@ -1051,8 +1045,6 @@ bool CDBModule_MySQL::DBModule_MySQL_TryQuery(AUTHREG_TEMPVER* pSt_AuthVer) return false; } ppszResult = DataBase_MySQL_GetResult(xhData, xhTable); - //XLONG* pInt_Length = DataBase_MySQL_GetLength(xhData, xhTable); - //ID int nFliedValue = 0; nFliedValue++; @@ -1168,8 +1160,7 @@ bool CDBModule_MySQL::DBModule_MySQL_TryClear(int nThanValue, ENUM_VERIFICATION_ for (__int64u i = 0; i < nRow; i++) { ppszResult = DataBase_MySQL_GetResult(xhData, xhTable); - //XLONG* pInt_Length = DataBase_MySQL_GetLength(xhData, xhTable); - + int nFliedValue = 0; AUTHREG_TEMPVER st_AuthVer; memset(&st_AuthVer, '\0', sizeof(AUTHREG_TEMPVER)); @@ -1315,8 +1306,7 @@ bool CDBModule_MySQL::DBModule_MySQL_TryList(AUTHREG_TEMPVER*** pppSt_AuthVer, i for (__int64u i = 0; i < nRow; i++) { ppszResult = DataBase_MySQL_GetResult(xhData, xhTable); - //XLONG* pInt_Length = DataBase_MySQL_GetLength(xhData, xhTable); - + int nFliedValue = 0; //ID (*pppSt_AuthVer)[i]->nID = _ttxoi(ppszResult[nFliedValue]); @@ -1496,7 +1486,7 @@ bool CDBModule_MySQL::DBModule_MySQL_BannedList(AUTHREG_BANNED*** pppSt_BannedUs for (__int64u i = 0; i < nRow; i++) { ppszResult = DataBase_MySQL_GetResult(xhData, xhTable); - //XLONG* pInt_Length = DataBase_MySQL_GetLength(xhData, xhTable); + int nFliedValue = 0; AUTHREG_BANNED st_Banned; @@ -1543,7 +1533,7 @@ bool CDBModule_MySQL::DBModule_MySQL_BannedList(AUTHREG_BANNED*** pppSt_BannedUs memset(&st_Banned, '\0', sizeof(AUTHREG_BANNED)); ppszResult = DataBase_MySQL_GetResult(xhData, xhTable); - //XLONG* pInt_Length = DataBase_MySQL_GetLength(xhData, xhTable); + int nFliedValue = 0; //ID @@ -1927,7 +1917,7 @@ bool CDBModule_MySQL::DBModule_MySQL_AnnouncementList(AUTHREG_ANNOUNCEMENT*** pp for (__int64u i = 0; i < nRow; i++) { ppszResult = DataBase_MySQL_GetResult(xhData, xhTable); - //XLONG* pInt_Length = DataBase_MySQL_GetLength(xhData, xhTable); + int nFliedValue = 0; (*ppppSt_Announcement)[i]->nID = _ttxoll(ppszResult[nFliedValue]); nFliedValue++; diff --git a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Packet/Protocol_Packet.cpp b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Packet/Protocol_Packet.cpp index b41367b..c4324af 100644 --- a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Packet/Protocol_Packet.cpp +++ b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Packet/Protocol_Packet.cpp @@ -75,9 +75,7 @@ bool CProtocol_Packet::Protocol_Packet_HDRComm(XCHAR* ptszMsgBuffer, int* pInt_M { if (0 == pSt_ProtocolHdr->wReserve) { - int nRVLen = 0; int nListCount = 6; - XCHAR tszRVBuffer[1024]; MQTTPROTOCOL_HDRPROPERTY** ppSt_HDRProperty; BaseLib_Memory_Malloc((XPPPMEM)&ppSt_HDRProperty, nListCount, sizeof(MQTTPROTOCOL_HDRPROPERTY)); diff --git a/XEngine_Source/AuthorizeModule_Session/Session_Authorize/Session_Authorize.cpp b/XEngine_Source/AuthorizeModule_Session/Session_Authorize/Session_Authorize.cpp index 9815f1b..592b9d5 100644 --- a/XEngine_Source/AuthorizeModule_Session/Session_Authorize/Session_Authorize.cpp +++ b/XEngine_Source/AuthorizeModule_Session/Session_Authorize/Session_Authorize.cpp @@ -477,9 +477,6 @@ XHTHREAD CSession_Authorize::Session_Authorize_ActiveThread(XPVOID lParam) stl_ListIterator->nOnlineTime = nOnlineSpan; _tcsxcpy(stl_ListIterator->tszLeftTime, stl_ListIterator->st_UserTable.tszLeftTime); //计算时间是否超过! - AUTHREG_PROTOCOL_TIME st_ProtocolTimer; - memset(&st_ProtocolTimer, '\0', sizeof(AUTHREG_PROTOCOL_TIME)); - st_ProtocolTimer.nTimeONLine = nOnlineSpan; st_ProtocolTimer.nTimeLeft = nLeftTime; st_ProtocolTimer.nNetType = stl_ListIterator->nNetType; diff --git a/XEngine_Source/XEngine.sln b/XEngine_Source/XEngine.sln index 396adf1..ff8a8c7 100644 --- a/XEngine_Source/XEngine.sln +++ b/XEngine_Source/XEngine.sln @@ -76,6 +76,9 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XEngine_Verification", "XEn EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XEngine_MSGNotify", "XEngine_DependLibrary\XEngine_Module\XEngine_MSGNotify\XEngine_MSGNotify.vcxproj", "{E1087BA3-1074-4C6A-B770-A53B7BA1F4EA}" + ProjectSection(ProjectDependencies) = postProject + {F1736B3F-03A2-4FC7-B045-A12BA8D724FB} = {F1736B3F-03A2-4FC7-B045-A12BA8D724FB} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XEngine_Token", "XEngine_DependLibrary\XEngine_Module\XEngine_Token\XEngine_Token.vcxproj", "{E17E889F-D826-413F-854E-DBA6000B4DA7}" EndProject diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Get/AuthorizeHTTP_GetTask.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Get/AuthorizeHTTP_GetTask.cpp index 1a8c843..dc8bf0d 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Get/AuthorizeHTTP_GetTask.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Get/AuthorizeHTTP_GetTask.cpp @@ -8,7 +8,6 @@ bool XEngine_AuthorizeHTTP_GetTask(LPCXSTR lpszClientAddr, XCHAR** pptszList, in XCHAR tszURLValue[128] = {}; LPCXSTR lpszAPITime = _X("time"); LPCXSTR lpszAPIDCode = _X("dcode"); - LPCXSTR lpszAPINotice = _X("notice"); memset(tszSDBuffer, '\0', sizeof(tszSDBuffer)); BaseLib_String_GetKeyValue(pptszList[0], "=", tszURLKey, tszURLValue); @@ -27,19 +26,19 @@ bool XEngine_AuthorizeHTTP_GetTask(LPCXSTR lpszClientAddr, XCHAR** pptszList, in XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,获取时间失败,无法继续,错误:%X"), lpszClientAddr, Session_GetLastError()); return false; } - int nListCount = 0; + int nClientCount = 0; AUTHSESSION_NETCLIENT** ppSt_ListClient; - if (!Session_Authorize_GetClient(&ppSt_ListClient, &nListCount, st_UserInfo.tszUserName)) + if (!Session_Authorize_GetClient(&ppSt_ListClient, &nClientCount, st_UserInfo.tszUserName)) { Protocol_Packet_HttpComm(tszSDBuffer, &nSDLen, ERROR_AUTHORIZE_PROTOCOL_NOTFOUND, "user not found"); XEngine_Client_TaskSend(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_AUTH_APP_NETTYPE_HTTP); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,用户名:%s,获取时间失败,无法继续,错误:%X"), lpszClientAddr, st_UserInfo.tszUserName, Session_GetLastError()); return false; } - Protocol_Packet_UserTime(tszSDBuffer, &nSDLen, &ppSt_ListClient, nListCount); - BaseLib_Memory_Free((XPPPMEM)&ppSt_ListClient, nListCount); + Protocol_Packet_UserTime(tszSDBuffer, &nSDLen, &ppSt_ListClient, nClientCount); + BaseLib_Memory_Free((XPPPMEM)&ppSt_ListClient, nClientCount); XEngine_Client_TaskSend(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_AUTH_APP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,用户名:%s,获取时间成功,用户同时在线数:%d"), lpszClientAddr, st_UserInfo.tszUserName, nListCount); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,用户名:%s,获取时间成功,用户同时在线数:%d"), lpszClientAddr, st_UserInfo.tszUserName, nClientCount); } else if (0 == _tcsxncmp(lpszAPIDCode, tszURLValue, _tcsxlen(lpszAPIDCode))) { diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_User.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_User.cpp index 88f20ab..4024744 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_User.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_User.cpp @@ -466,7 +466,6 @@ bool XEngine_AuthorizeHTTP_User(XNETHANDLE xhToken, LPCXSTR lpszClientAddr, LPCX XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("HTTP客户端:%s,序列号:%s,临时验证插入失败,因为服务器关闭了此功能"), lpszClientAddr, st_VERTemp.tszVSerial); return false; } - bool bSuccess = false; if (0 == st_AuthConfig.st_XSql.nDBType) { bSuccess = DBModule_SQLite_TryInsert(&st_VERTemp); diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_TCPTask.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_TCPTask.cpp index e6ef312..b2327b9 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_TCPTask.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_TCPTask.cpp @@ -149,7 +149,6 @@ bool XEngine_Client_TCPTask(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int n } else { - bool bSuccess = false; //用户密码登录还是硬件吗登录 if (_tcsxlen(st_AuthProtocol.tszUserPass) > 0) { @@ -335,7 +334,6 @@ bool XEngine_Client_TCPTask(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int n } else if (ENUM_VERIFICATION_MODULE_SERIAL_TYPE_DAY == st_UserTable.enSerialType) { - bool bSuccess = false; XCHAR tszIPAddr[128] = {}; _tcsxcpy(tszIPAddr, lpszClientAddr); From 8ec9f73041e5445b1db9ae360aea7758b32eab1c Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 12 Aug 2026 16:37:50 +0800 Subject: [PATCH 04/15] added:create client id and key support for token --- README.en.md | 5 +- README.md | 5 +- .../AuthorizeModule_Database.def | 10 +- .../DBModule_MySQL/DBModule_MySQL.cpp | 137 ++++++++++++++++++ .../DBModule_MySQL/DBModule_MySQL.h | 4 + .../DBModule_SQLite/DBModule_SQLite.cpp | 133 +++++++++++++++++ .../DBModule_SQLite/DBModule_SQLite.h | 4 + .../Database_Define.h | 96 +++++++++++- .../AuthorizeModule_Database/pch.cpp | 24 +++ .../Protocol_Parse/Protocol_Parse.cpp | 35 +++++ .../Protocol_Parse/Protocol_Parse.h | 1 + XEngine_Source/XAuth_Protocol.h | 12 +- .../AuthorizeHTTP_Get/AuthorizeHTTP_Token.cpp | 63 +++++++- 13 files changed, 516 insertions(+), 13 deletions(-) diff --git a/README.en.md b/README.en.md index 2b7e94e..a7dd4ea 100644 --- a/README.en.md +++ b/README.en.md @@ -119,7 +119,7 @@ port :tcp port 5300,websocket port 5301,http management port 5302,Transmission v #### app packet service If you don't have software development capabilities, don't want to implement it yourself, or want to add authorization verification to other software, we also provide an authorization packaging service, which allows your program to directly package our verification. Program Packaging Service is a paid service, and you can package and add verification to any program. You can integrate our verification service without requiring source code or modifying your program. After packaging is complete, when it is run next time, our verification client will run first, and then your provided program will run after verification is successful, which is very convenient to use. -This service is paid, priced at 200 per package. It supports both x86 and x64 programs, and only requires you to provide your server address, port, and verification mode. The process is as follows: +This service is paid, priced at $20 per package. It supports both x86 and x64 programs, and only requires you to provide your server address, port, and verification mode. The process is as follows: Payment → Send the program to us → We package it → Verification testing → Send the packaged program to you → Completed After packaging, when the program is launched, the following window will open first. Only after a successful login will your program start. As shown below, once launched, the main interface will be displayed. After login, the main interface will close and your program will then start. ![Main Interface](./XEngine_Picture/packet_1.png "Main Interface") @@ -132,9 +132,10 @@ After packaging, when the program is launched, the following window will open fi The verification timer will automatically stop. Supported features include login, local CDKEY verification, registration, recharge, password recovery, and remaining time query. Note: This feature is only a packaging replacement. If you require full encryption, shell protection, and higher security, you must implement it yourself through code development. #### Packager -We can also provide the original packager if you have more packaging needs. The packager is currently in a promotional campaign, 500 yuan. +We can also provide the original packager if you have more packaging needs. The packager is currently in a promotional campaign, $50 . You can choose our verification program, then select the program you want to package. Then select the configuration file, and that's it. It supports automatically updating the program icon to your software icon. Configuration file supports configuring encryption and decryption communication and authentication mode +The packer can provide source code. It is written in C++. Please contact us if you need it ![Main Interface](./XEngine_Picture/packer_1.png "Main Interface") ## Participate in contribution diff --git a/README.md b/README.md index 3183dbc..67d5dbf 100644 --- a/README.md +++ b/README.md @@ -130,7 +130,7 @@ Linux or macos:直接运行即可 #### 程序打包服务 如果你没有开发软件能力或者不想自己实现或者想给其他软件添加授权验证,我们也提供了授权打包服务,这个服务可以直接让你的程序打包我们的验证. 程序打包服务是一个付费服务,你可以为任意程序打包加验证.不需要源代码不修改你的程序就可以集成我们的验证服务,当打包完成后,当下次运行,就会先运行我们的验证客户端,验证通过后再运行你提供的程序,非常方便使用. -此服务需要付费,200元3次,不限制x86或者x64位程序,你只需要告诉我们你的服务器地址端口验证模式即可.流程如下: +此服务需要付费,100元3次,不限制x86或者x64位程序,你只需要告诉我们你的服务器地址端口验证模式即可.流程如下: 付费->发送程序给我们->我们打包->测试验证->发送打包程序给你->完成 当打包后,运行程序会优先打开下面的窗口,登录成功后才会启动你的程序,如下图,开启后会显示主界面,登录后主界面会关闭,然后启动你的程序 ![主界面](./XEngine_Picture/packet_1.png "主界面") @@ -143,9 +143,10 @@ Linux or macos:直接运行即可 会自动结束验证计时.支持登录,本地CDKEY验证,注册,充值,找回密码,获取剩余时间. 注意:此功能只是替代打包,如果你想要完全的加密加壳安全性高的,必须自己使用代码开发. #### 打包器 -我们也可以提供原始打包器,如果你有更多打包需求.打包器目前优惠活动中,500元. +我们也可以提供原始打包器,如果你有更多打包需求.打包器目前优惠活动中,200元. 可以选择我们的验证程序,然后选择你要打包的程序.在选择配置文件即可,支持自动更新程序图标为你的软件图标. 配置文件支持配置加解密通信和验证模式 +打包器可以提供源码,打包器使用C++ 编写,如果你需要可以联系我们 ![主界面](./XEngine_Picture/packer_1.png "主界面") ## 参与贡献 diff --git a/XEngine_Source/AuthorizeModule_Database/AuthorizeModule_Database.def b/XEngine_Source/AuthorizeModule_Database/AuthorizeModule_Database.def index e6c50ca..0c63e50 100644 --- a/XEngine_Source/AuthorizeModule_Database/AuthorizeModule_Database.def +++ b/XEngine_Source/AuthorizeModule_Database/AuthorizeModule_Database.def @@ -39,6 +39,10 @@ EXPORTS DBModule_SQLite_AnnouncementDelete DBModule_SQLite_AnnouncementList + DBModule_SQLite_OAuthInsert + DBModule_SQLite_OAuthDelete + DBModule_SQLite_OAuthList + DBModule_MySQL_Init DBModule_MySQL_Destroy @@ -73,4 +77,8 @@ EXPORTS DBModule_MySQL_AnnouncementInsert DBModule_MySQL_AnnouncementDelete - DBModule_MySQL_AnnouncementList \ No newline at end of file + DBModule_MySQL_AnnouncementList + + DBModule_MySQL_OAuthInsert + DBModule_MySQL_OAuthDelete + DBModule_MySQL_OAuthList \ No newline at end of file diff --git a/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.cpp b/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.cpp index 09a7288..1ddb78f 100644 --- a/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.cpp +++ b/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.cpp @@ -1930,6 +1930,143 @@ bool CDBModule_MySQL::DBModule_MySQL_AnnouncementList(AUTHREG_ANNOUNCEMENT*** pp DataBase_MySQL_FreeResult(xhData, xhTable); return true; } +/******************************************************************** +函数名称:DBModule_MySQL_OAuthInsert +函数功能:OAuth插入 + 参数.一:pSt_OAuthInfo + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:输入要插入的信息 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CDBModule_MySQL::DBModule_MySQL_OAuthInsert(AUTHREG_OAUTHINFO* pSt_OAuthInfo) +{ + SQLPacket_IsErrorOccur = false; + + if (NULL == pSt_OAuthInfo) + { + SQLPacket_IsErrorOccur = true; + SQLPacket_dwErrorCode = ERROR_AUTHORIZE_MODULE_DATABASE_PARAMENT; + return false; + } + XCHAR tszSQLStr[8192] = {}; + + _xstprintf(tszSQLStr, _X("INSERT INTO `Authorize_OAuth`(tszUserName,tszTokenStr,tszClientID,tszClientKey,tszCreateTime,tszExpirationTime) VALUES('%s','%s','%s','%s','%s','%s')"), pSt_OAuthInfo->tszUserName, pSt_OAuthInfo->tszTokenStr, pSt_OAuthInfo->tszClientID, pSt_OAuthInfo->tszClientKey, pSt_OAuthInfo->tszCreateTime, pSt_OAuthInfo->tszExpirationTime); + //插入数据库 + if (!DataBase_MySQL_Execute(xhData, tszSQLStr)) + { + SQLPacket_IsErrorOccur = true; + SQLPacket_dwErrorCode = DataBase_GetLastError(); + return false; + } + return true; +} +/******************************************************************** +函数名称:DBModule_SQLite_OAuthDelete +函数功能:OAuth删除 + 参数.一:pSt_OAuthInfo + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:输入要删除的信息 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CDBModule_MySQL::DBModule_MySQL_OAuthDelete(AUTHREG_OAUTHINFO* pSt_OAuthInfo) +{ + SQLPacket_IsErrorOccur = false; + + if (NULL == pSt_OAuthInfo) + { + SQLPacket_IsErrorOccur = true; + SQLPacket_dwErrorCode = ERROR_AUTHORIZE_MODULE_DATABASE_PARAMENT; + return false; + } + XCHAR tszSQLStr[8192] = {}; + + if (_tcsxlen(pSt_OAuthInfo->tszTokenStr) > 0) + { + _xstprintf(tszSQLStr, _X("DELETE FROM `Authorize_OAuth` WHERE tszTokenStr = '%s'"), pSt_OAuthInfo->tszTokenStr); + } + else + { + _xstprintf(tszSQLStr, _X("DELETE FROM `Authorize_OAuth` WHERE tszClientID = '%s'"), pSt_OAuthInfo->tszClientID); + } + //插入数据库 + if (!DataBase_MySQL_Execute(xhData, tszSQLStr)) + { + SQLPacket_IsErrorOccur = true; + SQLPacket_dwErrorCode = DataBase_GetLastError(); + return false; + } + return true; +} +/******************************************************************** +函数名称:DBModule_MySQL_OAuthList +函数功能:OAuth列举 + 参数.一:ppppSt_OAuthInfo + In/Out:Out + 类型:三级指针 + 可空:N + 意思:输出列举数据 + 参数.二:pInt_ListCount + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:导出数据个数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CDBModule_MySQL::DBModule_MySQL_OAuthList(AUTHREG_OAUTHINFO*** pppSt_OAuthInfo, int* pInt_ListCount) +{ + SQLPacket_IsErrorOccur = false; + + __int64u nRow = 0; + __int64u nColumn = 0; + XNETHANDLE xhTable = 0; + XCHAR** ppszResult = NULL; + XCHAR tszSQLStr[1024] = {}; + _xstprintf(tszSQLStr, _X("SELECT * FROM Authorize_OAuth")); + + if (!DataBase_MySQL_ExecuteQuery(xhData, &xhTable, tszSQLStr, &nRow, &nColumn)) + { + SQLPacket_IsErrorOccur = true; + SQLPacket_dwErrorCode = DataBase_GetLastError(); + return false; + } + *pInt_ListCount = (int)nRow; + BaseLib_Memory_Malloc((XPPPMEM)pppSt_OAuthInfo, (int)nRow, sizeof(AUTHREG_OAUTHINFO)); + //轮训所有内容 + for (__int64u i = 0; i < nRow; i++) + { + ppszResult = DataBase_MySQL_GetResult(xhData, xhTable); + + int nFliedValue = 0; + _tcsxcpy((*pppSt_OAuthInfo)[i]->tszUserName, ppszResult[nFliedValue]); + nFliedValue++; + _tcsxcpy((*pppSt_OAuthInfo)[i]->tszTokenStr, ppszResult[nFliedValue]); + nFliedValue++; + _tcsxcpy((*pppSt_OAuthInfo)[i]->tszClientID, ppszResult[nFliedValue]); + nFliedValue++; + _tcsxcpy((*pppSt_OAuthInfo)[i]->tszClientKey, ppszResult[nFliedValue]); + nFliedValue++; + _tcsxcpy((*pppSt_OAuthInfo)[i]->tszCreateTime, ppszResult[nFliedValue]); + nFliedValue++; + _tcsxcpy((*pppSt_OAuthInfo)[i]->tszExpirationTime, ppszResult[nFliedValue]); + nFliedValue++; + + } + DataBase_MySQL_FreeResult(xhData, xhTable); + return true; +} ////////////////////////////////////////////////////////////////////////// // 保护函数 ////////////////////////////////////////////////////////////////////////// diff --git a/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.h b/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.h index 9945666..afeb2b5 100644 --- a/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.h +++ b/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.h @@ -55,6 +55,10 @@ class CDBModule_MySQL bool DBModule_MySQL_AnnouncementInsert(AUTHREG_ANNOUNCEMENT* pSt_Announcement); //公告插入 bool DBModule_MySQL_AnnouncementDelete(AUTHREG_ANNOUNCEMENT* pSt_Announcement); //公告删除 bool DBModule_MySQL_AnnouncementList(AUTHREG_ANNOUNCEMENT*** ppppSt_Announcement, int* pInt_ListCount); //列举所有公告 +public: + bool DBModule_MySQL_OAuthInsert(AUTHREG_OAUTHINFO* pSt_OAuthInfo); //插入授权信息 + bool DBModule_MySQL_OAuthDelete(AUTHREG_OAUTHINFO* pSt_OAuthInfo); //删除授权信息 + bool DBModule_MySQL_OAuthList(AUTHREG_OAUTHINFO*** pppSt_OAuthInfo, int* pInt_ListCount); protected: bool DBModule_MySQL_UserPayTime(LPCXSTR lpszUserName, LPCXSTR lpszUserTime, LPCXSTR lpszCardTime, ENUM_VERIFICATION_MODULE_SERIAL_TYPE en_AuthSerialType, ENUM_VERIFICATION_MODULE_SERIAL_TYPE en_AuthUserType); //日期方式充值方式 private: diff --git a/XEngine_Source/AuthorizeModule_Database/DBModule_SQLite/DBModule_SQLite.cpp b/XEngine_Source/AuthorizeModule_Database/DBModule_SQLite/DBModule_SQLite.cpp index 30c43e6..de85886 100644 --- a/XEngine_Source/AuthorizeModule_Database/DBModule_SQLite/DBModule_SQLite.cpp +++ b/XEngine_Source/AuthorizeModule_Database/DBModule_SQLite/DBModule_SQLite.cpp @@ -1797,6 +1797,139 @@ bool CDBModule_SQLite::DBModule_SQLite_AnnouncementList(AUTHREG_ANNOUNCEMENT*** DataBase_SQLite_FreeTable(ppszResult); return true; } +/******************************************************************** +函数名称:DBModule_SQLite_OAuthInsert +函数功能:OAuth插入 + 参数.一:pSt_OAuthInfo + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:输入要插入的信息 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CDBModule_SQLite::DBModule_SQLite_OAuthInsert(AUTHREG_OAUTHINFO *pSt_OAuthInfo) +{ + SQLPacket_IsErrorOccur = false; + + if (NULL == pSt_OAuthInfo) + { + SQLPacket_IsErrorOccur = true; + SQLPacket_dwErrorCode = ERROR_AUTHORIZE_MODULE_DATABASE_PARAMENT; + return false; + } + XCHAR tszSQLStr[8192] = {}; + + _xstprintf(tszSQLStr, _X("INSERT INTO Authorize_OAuth(tszUserName,tszTokenStr,tszClientID,tszClientKey,tszCreateTime,tszExpirationTime) VALUES('%s','%s','%s','%s','%s','%s')"), pSt_OAuthInfo->tszUserName, pSt_OAuthInfo->tszTokenStr, pSt_OAuthInfo->tszClientID, pSt_OAuthInfo->tszClientKey, pSt_OAuthInfo->tszCreateTime, pSt_OAuthInfo->tszExpirationTime); + //插入数据库 + if (!DataBase_SQLite_Exec(xhData, tszSQLStr)) + { + SQLPacket_IsErrorOccur = true; + SQLPacket_dwErrorCode = DataBase_GetLastError(); + return false; + } + return true; +} +/******************************************************************** +函数名称:DBModule_SQLite_OAuthDelete +函数功能:OAuth删除 + 参数.一:pSt_OAuthInfo + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:输入要删除的信息 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CDBModule_SQLite::DBModule_SQLite_OAuthDelete(AUTHREG_OAUTHINFO* pSt_OAuthInfo) +{ + SQLPacket_IsErrorOccur = false; + + if (NULL == pSt_OAuthInfo) + { + SQLPacket_IsErrorOccur = true; + SQLPacket_dwErrorCode = ERROR_AUTHORIZE_MODULE_DATABASE_PARAMENT; + return false; + } + XCHAR tszSQLStr[8192] = {}; + if (_tcsxlen(pSt_OAuthInfo->tszTokenStr) > 0) + { + _xstprintf(tszSQLStr, _X("DELETE FROM `Authorize_OAuth` WHERE tszTokenStr = '%s'"), pSt_OAuthInfo->tszTokenStr); + } + else + { + _xstprintf(tszSQLStr, _X("DELETE FROM `Authorize_OAuth` WHERE tszClientID = '%s'"), pSt_OAuthInfo->tszClientID); + } + //插入数据库 + if (!DataBase_SQLite_Exec(xhData, tszSQLStr)) + { + SQLPacket_IsErrorOccur = true; + SQLPacket_dwErrorCode = DataBase_GetLastError(); + return false; + } + return true; +} +/******************************************************************** +函数名称:DBModule_SQLite_OAuthList +函数功能:OAuth列举 + 参数.一:ppppSt_OAuthInfo + In/Out:Out + 类型:三级指针 + 可空:N + 意思:输出列举数据 + 参数.二:pInt_ListCount + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:导出数据个数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CDBModule_SQLite::DBModule_SQLite_OAuthList(AUTHREG_OAUTHINFO*** ppppSt_OAuthInfo, int* pInt_ListCount) +{ + SQLPacket_IsErrorOccur = false; + + int nRow = 0; + int nColumn = 0; + XCHAR** ppszResult = NULL; + XCHAR tszSQLStr[1024] = {}; + + _xstprintf(tszSQLStr, _X("SELECT * FROM Authorize_OAuth")); + if (!DataBase_SQLite_GetTable(xhData, tszSQLStr, &ppszResult, &nRow, &nColumn)) + { + SQLPacket_IsErrorOccur = true; + SQLPacket_dwErrorCode = DataBase_GetLastError(); + return false; + } + *pInt_ListCount = nRow; + + BaseLib_Memory_Malloc((XPPPMEM)ppppSt_OAuthInfo, nRow, sizeof(AUTHREG_OAUTHINFO)); + int nFliedValue = nColumn; + //轮训所有内容 + for (int i = 0; i < nRow; i++) + { + _tcsxcpy((*ppppSt_OAuthInfo)[i]->tszUserName, ppszResult[nFliedValue]); + nFliedValue++; + _tcsxcpy((*ppppSt_OAuthInfo)[i]->tszTokenStr, ppszResult[nFliedValue]); + nFliedValue++; + _tcsxcpy((*ppppSt_OAuthInfo)[i]->tszClientID, ppszResult[nFliedValue]); + nFliedValue++; + _tcsxcpy((*ppppSt_OAuthInfo)[i]->tszClientKey, ppszResult[nFliedValue]); + nFliedValue++; + _tcsxcpy((*ppppSt_OAuthInfo)[i]->tszCreateTime, ppszResult[nFliedValue]); + nFliedValue++; + _tcsxcpy((*ppppSt_OAuthInfo)[i]->tszExpirationTime, ppszResult[nFliedValue]); + nFliedValue++; + } + DataBase_SQLite_FreeTable(ppszResult); + return true; +} ////////////////////////////////////////////////////////////////////////// // 保护函数 ////////////////////////////////////////////////////////////////////////// diff --git a/XEngine_Source/AuthorizeModule_Database/DBModule_SQLite/DBModule_SQLite.h b/XEngine_Source/AuthorizeModule_Database/DBModule_SQLite/DBModule_SQLite.h index 065d097..a003e8f 100644 --- a/XEngine_Source/AuthorizeModule_Database/DBModule_SQLite/DBModule_SQLite.h +++ b/XEngine_Source/AuthorizeModule_Database/DBModule_SQLite/DBModule_SQLite.h @@ -55,6 +55,10 @@ class CDBModule_SQLite bool DBModule_SQLite_AnnouncementInsert(AUTHREG_ANNOUNCEMENT* pSt_Announcement); bool DBModule_SQLite_AnnouncementDelete(AUTHREG_ANNOUNCEMENT* pSt_Announcement); bool DBModule_SQLite_AnnouncementList(AUTHREG_ANNOUNCEMENT*** ppppSt_Announcement, int* pInt_ListCount); +public: + bool DBModule_SQLite_OAuthInsert(AUTHREG_OAUTHINFO* pSt_OAuthInfo); + bool DBModule_SQLite_OAuthDelete(AUTHREG_OAUTHINFO* pSt_OAuthInfo); + bool DBModule_SQLite_OAuthList(AUTHREG_OAUTHINFO*** pppSt_OAuthInfo, int* pInt_ListCount); protected: bool DBModule_SQLite_UserPayTime(LPCXSTR lpszUserName, LPCXSTR lpszUserTime, LPCXSTR lpszCardTime, ENUM_VERIFICATION_MODULE_SERIAL_TYPE en_AuthSerialType, ENUM_VERIFICATION_MODULE_SERIAL_TYPE en_AuthUserType); private: diff --git a/XEngine_Source/AuthorizeModule_Database/Database_Define.h b/XEngine_Source/AuthorizeModule_Database/Database_Define.h index e024ac4..0d28c75 100644 --- a/XEngine_Source/AuthorizeModule_Database/Database_Define.h +++ b/XEngine_Source/AuthorizeModule_Database/Database_Define.h @@ -552,6 +552,53 @@ extern "C" bool DBModule_SQLite_AnnouncementDelete(AUTHREG_ANNOUNCEMENT* pSt_Ann 备注: *********************************************************************/ extern "C" bool DBModule_SQLite_AnnouncementList(AUTHREG_ANNOUNCEMENT*** ppppSt_Announcement, int* pInt_ListCount); +/******************************************************************** +函数名称:DBModule_SQLite_OAuthInsert +函数功能:OAuth插入 + 参数.一:pSt_OAuthInfo + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:输入要插入的信息 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool DBModule_SQLite_OAuthInsert(AUTHREG_OAUTHINFO* pSt_OAuthInfo); +/******************************************************************** +函数名称:DBModule_SQLite_OAuthDelete +函数功能:OAuth删除 + 参数.一:pSt_OAuthInfo + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:输入要删除的信息 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool DBModule_SQLite_OAuthDelete(AUTHREG_OAUTHINFO* pSt_OAuthInfo); +/******************************************************************** +函数名称:DBModule_SQLite_OAuthList +函数功能:OAuth列举 + 参数.一:ppppSt_OAuthInfo + In/Out:Out + 类型:三级指针 + 可空:N + 意思:输出列举数据 + 参数.二:pInt_ListCount + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:导出数据个数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool DBModule_SQLite_OAuthList(AUTHREG_OAUTHINFO*** pppSt_OAuthInfo, int* pInt_ListCount); /************************************************************************/ /* MYSQL数据库服务导出函数 */ /************************************************************************/ @@ -1087,4 +1134,51 @@ extern "C" bool DBModule_MySQL_UserTime(LPCXSTR lpszUserName, __int64x nTime); 意思:是否成功 备注: *********************************************************************/ -extern "C" bool DBModule_MySQL_QueryLogin(LPCXSTR lpszUserName, LPCXSTR lpszUserAddr); \ No newline at end of file +extern "C" bool DBModule_MySQL_QueryLogin(LPCXSTR lpszUserName, LPCXSTR lpszUserAddr); +/******************************************************************** +函数名称:DBModule_MySQL_OAuthInsert +函数功能:OAuth插入 + 参数.一:pSt_OAuthInfo + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:输入要插入的信息 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool DBModule_MySQL_OAuthInsert(AUTHREG_OAUTHINFO* pSt_OAuthInfo); +/******************************************************************** +函数名称:DBModule_SQLite_OAuthDelete +函数功能:OAuth删除 + 参数.一:pSt_OAuthInfo + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:输入要删除的信息 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool DBModule_MySQL_OAuthDelete(AUTHREG_OAUTHINFO* pSt_OAuthInfo); +/******************************************************************** +函数名称:DBModule_MySQL_OAuthList +函数功能:OAuth列举 + 参数.一:ppppSt_OAuthInfo + In/Out:Out + 类型:三级指针 + 可空:N + 意思:输出列举数据 + 参数.二:pInt_ListCount + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:导出数据个数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool DBModule_MySQL_OAuthList(AUTHREG_OAUTHINFO*** pppSt_OAuthInfo, int* pInt_ListCount); \ No newline at end of file diff --git a/XEngine_Source/AuthorizeModule_Database/pch.cpp b/XEngine_Source/AuthorizeModule_Database/pch.cpp index fab208b..d3d4554 100644 --- a/XEngine_Source/AuthorizeModule_Database/pch.cpp +++ b/XEngine_Source/AuthorizeModule_Database/pch.cpp @@ -151,6 +151,18 @@ extern "C" bool DBModule_SQLite_AnnouncementList(AUTHREG_ANNOUNCEMENT * **ppppSt { return m_DBSQLite.DBModule_SQLite_AnnouncementList(ppppSt_Announcement, pInt_ListCount); } +extern "C" bool DBModule_SQLite_OAuthInsert(AUTHREG_OAUTHINFO* pSt_OAuthInfo) +{ + return m_DBSQLite.DBModule_SQLite_OAuthInsert(pSt_OAuthInfo); +} +extern "C" bool DBModule_SQLite_OAuthDelete(AUTHREG_OAUTHINFO* pSt_OAuthInfo) +{ + return m_DBSQLite.DBModule_SQLite_OAuthDelete(pSt_OAuthInfo); +} +extern "C" bool DBModule_SQLite_OAuthList(AUTHREG_OAUTHINFO*** pppSt_OAuthInfo, int* pInt_ListCount) +{ + return m_DBSQLite.DBModule_SQLite_OAuthList(pppSt_OAuthInfo, pInt_ListCount); +} /************************************************************************/ /* MYSQL数据库服务导出函数 */ /************************************************************************/ @@ -273,4 +285,16 @@ extern "C" bool DBModule_MySQL_UserTime(LPCXSTR lpszUserName, __int64x nTime) extern "C" bool DBModule_MySQL_QueryLogin(LPCXSTR lpszUserName, LPCXSTR lpszUserAddr) { return m_DBMySQL.DBModule_MySQL_QueryLogin(lpszUserName, lpszUserAddr); +} +extern "C" bool DBModule_MySQL_OAuthInsert(AUTHREG_OAUTHINFO* pSt_OAuthInfo) +{ + return m_DBMySQL.DBModule_MySQL_OAuthInsert(pSt_OAuthInfo); +} +extern "C" bool DBModule_MySQL_OAuthDelete(AUTHREG_OAUTHINFO* pSt_OAuthInfo) +{ + return m_DBMySQL.DBModule_MySQL_OAuthDelete(pSt_OAuthInfo); +} +extern "C" bool DBModule_MySQL_OAuthList(AUTHREG_OAUTHINFO*** pppSt_OAuthInfo, int* pInt_ListCount) +{ + return m_DBMySQL.DBModule_MySQL_OAuthList(pppSt_OAuthInfo, pInt_ListCount); } \ No newline at end of file diff --git a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Parse/Protocol_Parse.cpp b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Parse/Protocol_Parse.cpp index 40a5ed7..ec6a236 100644 --- a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Parse/Protocol_Parse.cpp +++ b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Parse/Protocol_Parse.cpp @@ -1134,5 +1134,40 @@ bool CProtocol_Parse::Protocol_Parse_HttpParseAnnouncement(LPCXSTR lpszMsgBuffer { pSt_Announcement->nID = st_JsonObject["nID"].asInt64(); } + return true; +} + +bool CProtocol_Parse::Protocol_Parse_HttpParseOAuth(LPCXSTR lpszMsgBuffer, int nMsgLen, AUTHREG_OAUTHINFO* pSt_OAuthInfo) +{ + Protocol_IsErrorOccur = false; + + if ((NULL == lpszMsgBuffer) || (NULL == pSt_OAuthInfo)) + { + Protocol_IsErrorOccur = true; + Protocol_dwErrorCode = ERROR_AUTHORIZE_MODULE_PROTOCOL_PARAMENT; + return false; + } + Json::Value st_JsonRoot; + JSONCPP_STRING st_JsonError; + Json::CharReaderBuilder st_ReaderBuilder; + std::unique_ptr const pSt_JsonReader(st_ReaderBuilder.newCharReader()); + if (!pSt_JsonReader->parse(lpszMsgBuffer, lpszMsgBuffer + nMsgLen, &st_JsonRoot, &st_JsonError)) + { + Protocol_IsErrorOccur = true; + Protocol_dwErrorCode = ERROR_AUTHORIZE_MODULE_PROTOCOL_PARSE; + return false; + } + + Json::Value st_JsonObject = st_JsonRoot["st_OAuth"]; + + if (!st_JsonObject["tszClientID"].isNull()) + { + _tcsxcpy(pSt_OAuthInfo->tszClientID, st_JsonObject["tszClientID"].asCString()); + } + if (!st_JsonObject["tszClientKey"].isNull()) + { + _tcsxcpy(pSt_OAuthInfo->tszClientKey, st_JsonObject["tszClientKey"].asCString()); + } + return true; } \ No newline at end of file diff --git a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Parse/Protocol_Parse.h b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Parse/Protocol_Parse.h index 2260153..b41941d 100644 --- a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Parse/Protocol_Parse.h +++ b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Parse/Protocol_Parse.h @@ -34,6 +34,7 @@ class CProtocol_Parse bool Protocol_Parse_HttpParseBanned(LPCXSTR lpszMsgBuffer, int nMsgLen, AUTHREG_BANNED* pSt_AuthBanned); bool Protocol_Parse_HttpParseBanned2(LPCXSTR lpszMsgBuffer, int nMsgLen, int* pInt_POSStart, int* pInt_POSEnd); bool Protocol_Parse_HttpParseAnnouncement(LPCXSTR lpszMsgBuffer, int nMsgLen, AUTHREG_ANNOUNCEMENT* pSt_Announcement); + bool Protocol_Parse_HttpParseOAuth(LPCXSTR lpszMsgBuffer, int nMsgLen, AUTHREG_OAUTHINFO* pSt_UserAuth); protected: private: }; \ No newline at end of file diff --git a/XEngine_Source/XAuth_Protocol.h b/XEngine_Source/XAuth_Protocol.h index f72e310..d0a354a 100644 --- a/XEngine_Source/XAuth_Protocol.h +++ b/XEngine_Source/XAuth_Protocol.h @@ -123,4 +123,14 @@ typedef struct XCHAR tszContext[4096]; //信息 XCHAR tszCreateTime[64]; //创建时间 __int64x nID; //ID -}AUTHREG_ANNOUNCEMENT, * LPAUTHREG_ANNOUNCEMENT; \ No newline at end of file +}AUTHREG_ANNOUNCEMENT, * LPAUTHREG_ANNOUNCEMENT; +//OAuth信息 +typedef struct +{ + XCHAR tszUserName[128]; //用户名 + XCHAR tszTokenStr[128]; //Token + XCHAR tszClientID[128]; //ID + XCHAR tszClientKey[128]; //秘钥 + XCHAR tszCreateTime[64]; //创建时间 + XCHAR tszExpirationTime[64]; //过期时间 +}AUTHREG_OAUTHINFO; \ No newline at end of file diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Get/AuthorizeHTTP_Token.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Get/AuthorizeHTTP_Token.cpp index eb5e9de..c2bd498 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Get/AuthorizeHTTP_Token.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Get/AuthorizeHTTP_Token.cpp @@ -3,16 +3,14 @@ bool XEngine_AuthorizeHTTP_Token(LPCXSTR lpszClientAddr, XCHAR** pptszList, int nListCount) { int nSDLen = 4096; - XCHAR tszSDBuffer[4096]; - XCHAR tszURLKey[128]; - XCHAR tszURLValue[128]; + XCHAR tszSDBuffer[4096] = {}; + XCHAR tszURLKey[128] = {}; + XCHAR tszURLValue[128] = {}; LPCXSTR lpszAPILogin = _X("login"); LPCXSTR lpszAPIUPDate = _X("update"); LPCXSTR lpszAPIClose = _X("close"); + LPCXSTR lpszAPICreate = _X("create"); - memset(tszSDBuffer, '\0', sizeof(tszSDBuffer)); - memset(tszURLKey, '\0', sizeof(tszURLKey)); - memset(tszURLValue, '\0', sizeof(tszURLValue)); BaseLib_String_GetKeyValue(pptszList[0], "=", tszURLKey, tszURLValue); if (0 == _tcsxncmp(lpszAPILogin, tszURLValue, _tcsxlen(lpszAPILogin))) @@ -143,5 +141,58 @@ bool XEngine_AuthorizeHTTP_Token(LPCXSTR lpszClientAddr, XCHAR** pptszList, int XEngine_Client_TaskSend(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_AUTH_APP_NETTYPE_HTTP); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求关闭TOKEN:%s 成功"), lpszClientAddr, tszUserToken); } + else if (0 == _tcsxncmp(lpszAPICreate, tszURLValue, _tcsxlen(lpszAPICreate))) + { + //http://app.xyry.org:5302/api?function=create&token=1000112345&type=0&timeout=3600 + XCHAR tszTokenStr[128] = {}; + XCHAR tszTokenType[128] = {}; + XCHAR tszTimeout[128] = {}; + + BaseLib_String_GetKeyValue(pptszList[1], "=", tszURLKey, tszTokenStr); + BaseLib_String_GetKeyValue(pptszList[2], "=", tszURLKey, tszTokenType); + BaseLib_String_GetKeyValue(pptszList[3], "=", tszURLKey, tszTimeout); + + XENGINE_PROTOCOL_USERINFO st_UserInfo = {}; + if (!Session_Token_GetStr(tszTokenStr, &st_UserInfo)) + { + Protocol_Packet_HttpComm(tszSDBuffer, &nSDLen, ERROR_AUTHORIZE_PROTOCOL_NOTFOUND, "user not found"); + XEngine_Client_TaskSend(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_AUTH_APP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,获取TOKEN失败,不存在的Token:%s"), lpszClientAddr, tszTokenStr); + return false; + } + XCHAR tszTimeStr[128] = {}; + AUTHREG_OAUTHINFO st_OAuthInfo = {}; + XENGINE_LIBTIME st_LibTime = {}; + _tcsxcpy(st_OAuthInfo.tszUserName, st_UserInfo.tszUserName); + + if (nListCount > 4) + { + time_t nTime = time(NULL) + _ttxoi(tszTimeout); + BaseLib_Time_TTimeToStuTime(nTime, &st_LibTime); + BaseLib_Time_TimeToStr(st_OAuthInfo.tszExpirationTime, NULL, true, &st_LibTime); + } + + if (0 == _ttxoi(tszTokenType)) + { + BaseLib_Handle_CreateStr(st_OAuthInfo.tszTokenStr); + } + else + { + BaseLib_Handle_CreateStr(st_OAuthInfo.tszClientID, 16, 1); + BaseLib_Handle_CreateStr(st_OAuthInfo.tszClientKey); + } + + if (0 == st_AuthConfig.st_XSql.nDBType) + { + DBModule_SQLite_OAuthInsert(&st_OAuthInfo); + } + else + { + DBModule_MySQL_OAuthInsert(&st_OAuthInfo); + } + Protocol_Packet_HttpComm(tszSDBuffer, &nSDLen); + XEngine_Client_TaskSend(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_AUTH_APP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求关闭TOKEN:%s 成功"), lpszClientAddr, tszTokenStr); + } return true; } \ No newline at end of file From b32f395bdc96580e5f84719e1c03f1d72dfd943f Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 14 Aug 2026 14:31:13 +0800 Subject: [PATCH 05/15] modify:does not need device type for token with http --- .../AuthorizeHTTP_Get/AuthorizeHTTP_Token.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Get/AuthorizeHTTP_Token.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Get/AuthorizeHTTP_Token.cpp index c2bd498..c920892 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Get/AuthorizeHTTP_Token.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Get/AuthorizeHTTP_Token.cpp @@ -15,14 +15,14 @@ bool XEngine_AuthorizeHTTP_Token(LPCXSTR lpszClientAddr, XCHAR** pptszList, int if (0 == _tcsxncmp(lpszAPILogin, tszURLValue, _tcsxlen(lpszAPILogin))) { - //http://app.xyry.org:5302/api?function=login&user=123123aa&pass=123123&device=1 + //http://app.xyry.org:5302/api?function=login&user=123123aa&pass=123123 XCHAR tszUserName[128] = {}; XCHAR tszUserPass[128] = {}; XCHAR tszDeviceType[128] = {}; XNETHANDLE xhToken = 0; AUTHREG_USERTABLE st_UserTable = {}; - if (nListCount < 4) + if (nListCount < 3) { Protocol_Packet_HttpComm(tszSDBuffer, &nSDLen, ERROR_AUTHORIZE_PROTOCOL_REQUEST, "request parament is incorrent"); XEngine_Client_TaskSend(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_AUTH_APP_NETTYPE_HTTP); @@ -31,7 +31,6 @@ bool XEngine_AuthorizeHTTP_Token(LPCXSTR lpszClientAddr, XCHAR** pptszList, int } BaseLib_String_GetKeyValue(pptszList[1], "=", tszURLKey, tszUserName); BaseLib_String_GetKeyValue(pptszList[2], "=", tszURLKey, tszUserPass); - BaseLib_String_GetKeyValue(pptszList[3], "=", tszURLKey, tszDeviceType); //是否启用了动态码 if (st_FunSwitch.bSwitchDCode) { From f0af397e7893372e56954276d4f2d67f4d2fe594 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 14 Aug 2026 17:25:27 +0800 Subject: [PATCH 06/15] modify:reply work oauth create for token --- .../XEngine_Config/XEngine_Config.json | 2 +- .../AuthorizeModule_Protocol.def | 1 + .../Protocol_Define.h | 24 ++++++++ .../Protocol_Packet/Protocol_Packet.cpp | 57 +++++++++++++++++++ .../Protocol_Packet/Protocol_Packet.h | 1 + .../AuthorizeModule_Protocol/pch.cpp | 4 ++ .../AuthorizeHTTP_Get/AuthorizeHTTP_Token.cpp | 22 +++---- 7 files changed, 95 insertions(+), 16 deletions(-) diff --git a/XEngine_Release/XEngine_Config/XEngine_Config.json b/XEngine_Release/XEngine_Config/XEngine_Config.json index ceaff53..c7c2688 100644 --- a/XEngine_Release/XEngine_Config/XEngine_Config.json +++ b/XEngine_Release/XEngine_Config/XEngine_Config.json @@ -54,7 +54,7 @@ } }, "XCrypto": { - "bEnable": true, + "bEnable": false, "nCryptionType": 1, "tszPassKey": "123123aa" }, diff --git a/XEngine_Source/AuthorizeModule_Protocol/AuthorizeModule_Protocol.def b/XEngine_Source/AuthorizeModule_Protocol/AuthorizeModule_Protocol.def index 3cfecc6..7bf62bf 100644 --- a/XEngine_Source/AuthorizeModule_Protocol/AuthorizeModule_Protocol.def +++ b/XEngine_Source/AuthorizeModule_Protocol/AuthorizeModule_Protocol.def @@ -16,6 +16,7 @@ EXPORTS Protocol_Packet_HttpBanned Protocol_Packet_HttpAnnouncement Protocol_Packet_HttpTryList + Protocol_Packet_HttpOAuth Protocol_Parse_WSHdr Protocol_Parse_HttpParseToken diff --git a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Define.h b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Define.h index 9120942..9ad1abc 100644 --- a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Define.h +++ b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Define.h @@ -399,6 +399,30 @@ extern "C" bool Protocol_Packet_HttpAnnouncement(XCHAR* ptszMsgBuffer, int* pInt 备注: *********************************************************************/ extern "C" bool Protocol_Packet_HttpTryList(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, AUTHREG_TEMPVER*** pppSt_TryList, int nListCount); +/******************************************************************** +函数名称:Protocol_Packet_HttpOAuth +函数功能:打包创建的OAuth信息 + 参数.一:ptszMsgBuffer + In/Out:Out + 类型:字符指针 + 可空:N + 意思:导出包装好的缓冲区 + 参数.二:pInt_MsgLen + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出包装大小 + 参数.三:pSt_OAuthInfo + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:输入要打包的信息 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool Protocol_Packet_HttpOAuth(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, AUTHREG_OAUTHINFO* pSt_OAuthInfo); /************************************************************************/ /* 解析类协议 */ /************************************************************************/ diff --git a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Packet/Protocol_Packet.cpp b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Packet/Protocol_Packet.cpp index c4324af..608cb69 100644 --- a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Packet/Protocol_Packet.cpp +++ b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Packet/Protocol_Packet.cpp @@ -957,6 +957,63 @@ bool CProtocol_Packet::Protocol_Packet_HttpTryList(XCHAR* ptszMsgBuffer, int* pI st_JsonRoot["Count"] = st_JsonArray.size(); st_JsonRoot["Array"] = st_JsonArray; + *pInt_MsgLen = st_JsonRoot.toStyledString().length(); + memcpy(ptszMsgBuffer, st_JsonRoot.toStyledString().c_str(), *pInt_MsgLen); + return true; +} +/******************************************************************** +函数名称:Protocol_Packet_HttpOAuth +函数功能:打包创建的OAuth信息 + 参数.一:ptszMsgBuffer + In/Out:Out + 类型:字符指针 + 可空:N + 意思:导出包装好的缓冲区 + 参数.二:pInt_MsgLen + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出包装大小 + 参数.三:pSt_OAuthInfo + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:输入要打包的信息 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CProtocol_Packet::Protocol_Packet_HttpOAuth(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, AUTHREG_OAUTHINFO* pSt_OAuthInfo) +{ + Protocol_IsErrorOccur = false; + + if ((NULL == ptszMsgBuffer) || (NULL == pInt_MsgLen)) + { + Protocol_IsErrorOccur = true; + Protocol_dwErrorCode = ERROR_AUTHORIZE_MODULE_PROTOCOL_PARAMENT; + return false; + } + Protocol_IsErrorOccur = false; + + if ((NULL == ptszMsgBuffer) || (NULL == pInt_MsgLen)) + { + Protocol_IsErrorOccur = true; + Protocol_dwErrorCode = ERROR_AUTHORIZE_MODULE_PROTOCOL_PARAMENT; + return false; + } + Json::Value st_JsonRoot; + Json::Value st_JsonOAuth; + + st_JsonOAuth["tszClientID"] = pSt_OAuthInfo->tszClientID; + st_JsonOAuth["tszClientKey"] = pSt_OAuthInfo->tszClientKey; + st_JsonOAuth["tszUserName"] = pSt_OAuthInfo->tszUserName; + st_JsonOAuth["tszExpirationTime"] = pSt_OAuthInfo->tszExpirationTime; + + st_JsonRoot["msg"] = "success"; + st_JsonRoot["code"] = 0; + st_JsonRoot["st_OAuthInfo"] = st_JsonOAuth; + *pInt_MsgLen = st_JsonRoot.toStyledString().length(); memcpy(ptszMsgBuffer, st_JsonRoot.toStyledString().c_str(), *pInt_MsgLen); return true; diff --git a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Packet/Protocol_Packet.h b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Packet/Protocol_Packet.h index ce4e0e9..14fbfb2 100644 --- a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Packet/Protocol_Packet.h +++ b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Packet/Protocol_Packet.h @@ -31,6 +31,7 @@ class CProtocol_Packet bool Protocol_Packet_HttpBanned(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, AUTHREG_BANNED*** pppSt_BannedUser, int nUserCount, AUTHREG_BANNED*** pppSt_BannedAddr, int nAddrCount); bool Protocol_Packet_HttpAnnouncement(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, AUTHREG_ANNOUNCEMENT*** pppSt_Announcement, int nListCount); bool Protocol_Packet_HttpTryList(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, AUTHREG_TEMPVER*** pppSt_TryList, int nListCount); + bool Protocol_Packet_HttpOAuth(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, AUTHREG_OAUTHINFO* pSt_OAuthInfo); protected: private: }; \ No newline at end of file diff --git a/XEngine_Source/AuthorizeModule_Protocol/pch.cpp b/XEngine_Source/AuthorizeModule_Protocol/pch.cpp index af329aa..4598f30 100644 --- a/XEngine_Source/AuthorizeModule_Protocol/pch.cpp +++ b/XEngine_Source/AuthorizeModule_Protocol/pch.cpp @@ -83,6 +83,10 @@ extern "C" bool Protocol_Packet_HttpTryList(XCHAR * ptszMsgBuffer, int* pInt_Msg { return m_ProtocolPacket.Protocol_Packet_HttpTryList(ptszMsgBuffer, pInt_MsgLen, pppSt_TryList, nListCount); } +extern "C" bool Protocol_Packet_HttpOAuth(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, AUTHREG_OAUTHINFO* pSt_OAuthInfo) +{ + return m_ProtocolPacket.Protocol_Packet_HttpOAuth(ptszMsgBuffer, pInt_MsgLen, pSt_OAuthInfo); +} /************************************************************************/ /* 解析类协议 */ /************************************************************************/ diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Get/AuthorizeHTTP_Token.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Get/AuthorizeHTTP_Token.cpp index c920892..3ca8d55 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Get/AuthorizeHTTP_Token.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Get/AuthorizeHTTP_Token.cpp @@ -142,14 +142,12 @@ bool XEngine_AuthorizeHTTP_Token(LPCXSTR lpszClientAddr, XCHAR** pptszList, int } else if (0 == _tcsxncmp(lpszAPICreate, tszURLValue, _tcsxlen(lpszAPICreate))) { - //http://app.xyry.org:5302/api?function=create&token=1000112345&type=0&timeout=3600 + //http://127.0.0.1:5302/api?function=create&token=1000112345&timeout=3600 XCHAR tszTokenStr[128] = {}; - XCHAR tszTokenType[128] = {}; XCHAR tszTimeout[128] = {}; BaseLib_String_GetKeyValue(pptszList[1], "=", tszURLKey, tszTokenStr); - BaseLib_String_GetKeyValue(pptszList[2], "=", tszURLKey, tszTokenType); - BaseLib_String_GetKeyValue(pptszList[3], "=", tszURLKey, tszTimeout); + BaseLib_String_GetKeyValue(pptszList[2], "=", tszURLKey, tszTimeout); XENGINE_PROTOCOL_USERINFO st_UserInfo = {}; if (!Session_Token_GetStr(tszTokenStr, &st_UserInfo)) @@ -164,22 +162,16 @@ bool XEngine_AuthorizeHTTP_Token(LPCXSTR lpszClientAddr, XCHAR** pptszList, int XENGINE_LIBTIME st_LibTime = {}; _tcsxcpy(st_OAuthInfo.tszUserName, st_UserInfo.tszUserName); - if (nListCount > 4) + if (nListCount > 2) { time_t nTime = time(NULL) + _ttxoi(tszTimeout); BaseLib_Time_TTimeToStuTime(nTime, &st_LibTime); BaseLib_Time_TimeToStr(st_OAuthInfo.tszExpirationTime, NULL, true, &st_LibTime); } - if (0 == _ttxoi(tszTokenType)) - { - BaseLib_Handle_CreateStr(st_OAuthInfo.tszTokenStr); - } - else - { - BaseLib_Handle_CreateStr(st_OAuthInfo.tszClientID, 16, 1); - BaseLib_Handle_CreateStr(st_OAuthInfo.tszClientKey); - } + BaseLib_Handle_CreateStr(st_OAuthInfo.tszClientID, 16, 1); + BaseLib_Handle_CreateStr(st_OAuthInfo.tszClientKey); + BaseLib_Time_TimeToStr(st_OAuthInfo.tszCreateTime); if (0 == st_AuthConfig.st_XSql.nDBType) { @@ -189,7 +181,7 @@ bool XEngine_AuthorizeHTTP_Token(LPCXSTR lpszClientAddr, XCHAR** pptszList, int { DBModule_MySQL_OAuthInsert(&st_OAuthInfo); } - Protocol_Packet_HttpComm(tszSDBuffer, &nSDLen); + Protocol_Packet_HttpOAuth(tszSDBuffer, &nSDLen, &st_OAuthInfo); XEngine_Client_TaskSend(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_AUTH_APP_NETTYPE_HTTP); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求关闭TOKEN:%s 成功"), lpszClientAddr, tszTokenStr); } From a36c792d0f1bca25e801435fbbb48f20c0de3ed8 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 14 Aug 2026 20:40:13 +0800 Subject: [PATCH 07/15] added:get oauth2.0 token support for http post --- .../AuthorizeModule_Database.def | 6 +- .../DBModule_MySQL/DBModule_MySQL.cpp | 111 +++++++++++++++++- .../DBModule_MySQL/DBModule_MySQL.h | 2 + .../DBModule_SQLite/DBModule_SQLite.cpp | 110 ++++++++++++++++- .../DBModule_SQLite/DBModule_SQLite.h | 2 + .../Database_Define.h | 58 ++++++++- .../AuthorizeModule_Database/Database_Error.h | 3 +- .../AuthorizeModule_Database/pch.cpp | 16 +++ .../AuthorizeModule_Protocol.def | 1 + .../Protocol_Define.h | 24 ++++ .../Protocol_Packet/Protocol_Packet.cpp | 54 ++++++++- .../Protocol_Packet/Protocol_Packet.h | 1 + .../AuthorizeModule_Protocol/pch.cpp | 4 + XEngine_Source/XAuth_Protocol.h | 3 +- .../AuthorizeHTTP_Get/AuthorizeHTTP_Token.cpp | 8 +- .../AuthorizeHTTP_OAuth.cpp | 62 ++++++++++ .../AuthorizeHTTP_Post/AuthorizeHTTP_OAuth.h | 3 + .../XEngine_AuthorizeService/Authorize_Hdr.h | 1 + .../Authorize_HttpTask.cpp | 9 +- .../XEngine_AuthorizeService/Makefile | 4 +- .../XEngine_AuthorizeService.vcxproj | 2 + .../XEngine_AuthorizeService.vcxproj.filters | 6 + 22 files changed, 469 insertions(+), 21 deletions(-) create mode 100644 XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_OAuth.cpp create mode 100644 XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_OAuth.h diff --git a/XEngine_Source/AuthorizeModule_Database/AuthorizeModule_Database.def b/XEngine_Source/AuthorizeModule_Database/AuthorizeModule_Database.def index 0c63e50..df08160 100644 --- a/XEngine_Source/AuthorizeModule_Database/AuthorizeModule_Database.def +++ b/XEngine_Source/AuthorizeModule_Database/AuthorizeModule_Database.def @@ -42,6 +42,8 @@ EXPORTS DBModule_SQLite_OAuthInsert DBModule_SQLite_OAuthDelete DBModule_SQLite_OAuthList + DBModule_SQLite_OAuthUPDate + DBModule_SQLite_OAuthQuery DBModule_MySQL_Init DBModule_MySQL_Destroy @@ -81,4 +83,6 @@ EXPORTS DBModule_MySQL_OAuthInsert DBModule_MySQL_OAuthDelete - DBModule_MySQL_OAuthList \ No newline at end of file + DBModule_MySQL_OAuthList + DBModule_MySQL_OAuthUPDate + DBModule_MySQL_OAuthQuery \ No newline at end of file diff --git a/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.cpp b/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.cpp index 1ddb78f..c50ce0a 100644 --- a/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.cpp +++ b/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.cpp @@ -1955,7 +1955,7 @@ bool CDBModule_MySQL::DBModule_MySQL_OAuthInsert(AUTHREG_OAUTHINFO* pSt_OAuthInf } XCHAR tszSQLStr[8192] = {}; - _xstprintf(tszSQLStr, _X("INSERT INTO `Authorize_OAuth`(tszUserName,tszTokenStr,tszClientID,tszClientKey,tszCreateTime,tszExpirationTime) VALUES('%s','%s','%s','%s','%s','%s')"), pSt_OAuthInfo->tszUserName, pSt_OAuthInfo->tszTokenStr, pSt_OAuthInfo->tszClientID, pSt_OAuthInfo->tszClientKey, pSt_OAuthInfo->tszCreateTime, pSt_OAuthInfo->tszExpirationTime); + _xstprintf(tszSQLStr, _X("INSERT INTO `Authorize_OAuth`(tszUserName,tszTokenStr,tszUPToken,tszClientID,tszClientKey,nExpirationTime,tszCreateTime) VALUES('%s','%s','%s','%s','%s','%d','%s')"), pSt_OAuthInfo->tszUserName, pSt_OAuthInfo->tszTokenStr, pSt_OAuthInfo->tszUPToken, pSt_OAuthInfo->tszClientID, pSt_OAuthInfo->tszClientKey, pSt_OAuthInfo->nExpirationTime, pSt_OAuthInfo->tszCreateTime); //插入数据库 if (!DataBase_MySQL_Execute(xhData, tszSQLStr)) { @@ -2054,16 +2054,121 @@ bool CDBModule_MySQL::DBModule_MySQL_OAuthList(AUTHREG_OAUTHINFO*** pppSt_OAuthI nFliedValue++; _tcsxcpy((*pppSt_OAuthInfo)[i]->tszTokenStr, ppszResult[nFliedValue]); nFliedValue++; + _tcsxcpy((*pppSt_OAuthInfo)[i]->tszUPToken, ppszResult[nFliedValue]); + nFliedValue++; _tcsxcpy((*pppSt_OAuthInfo)[i]->tszClientID, ppszResult[nFliedValue]); nFliedValue++; _tcsxcpy((*pppSt_OAuthInfo)[i]->tszClientKey, ppszResult[nFliedValue]); nFliedValue++; - _tcsxcpy((*pppSt_OAuthInfo)[i]->tszCreateTime, ppszResult[nFliedValue]); + (*pppSt_OAuthInfo)[i]->nExpirationTime = _ttxoi(ppszResult[nFliedValue]); nFliedValue++; - _tcsxcpy((*pppSt_OAuthInfo)[i]->tszExpirationTime, ppszResult[nFliedValue]); + _tcsxcpy((*pppSt_OAuthInfo)[i]->tszCreateTime, ppszResult[nFliedValue]); nFliedValue++; + } + DataBase_MySQL_FreeResult(xhData, xhTable); + return true; +} +/******************************************************************** +函数名称:DBModule_MySQL_OAuthUPDate +函数功能:更新OAuth信息 + 参数.一:pSt_OAuthInfo + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:要操作的数据 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CDBModule_MySQL::DBModule_MySQL_OAuthUPDate(AUTHREG_OAUTHINFO* pSt_OAuthInfo) +{ + SQLPacket_IsErrorOccur = false; + + if (NULL == pSt_OAuthInfo) + { + SQLPacket_IsErrorOccur = true; + SQLPacket_dwErrorCode = ERROR_AUTHORIZE_MODULE_DATABASE_PARAMENT; + return false; + } + XCHAR tszSQLStatement[1024] = {}; + //处理的类型 + _xstprintf(tszSQLStatement, _X("UPDATE Authorize_OAuth SET tszTokenStr = '%s',tszUPToken = '%s' WHERE tszClientID = '%s' AND tszClientKey = '%s'"), pSt_OAuthInfo->tszTokenStr, pSt_OAuthInfo->tszUPToken, pSt_OAuthInfo->tszClientID, pSt_OAuthInfo->tszClientKey); + //插入数据库 + if (!DataBase_SQLite_Exec(xhData, tszSQLStatement)) + { + SQLPacket_IsErrorOccur = true; + SQLPacket_dwErrorCode = DataBase_GetLastError(); + return false; + } + return true; +} +/******************************************************************** +函数名称:DBModule_MySQL_OAuthQuery +函数功能:查询OAuth信息 + 参数.一:pSt_OAuthInfo + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:要操作的数据 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CDBModule_MySQL::DBModule_MySQL_OAuthQuery(AUTHREG_OAUTHINFO* pSt_OAuthInfo) +{ + SQLPacket_IsErrorOccur = false; + if (NULL == pSt_OAuthInfo) + { + SQLPacket_IsErrorOccur = true; + SQLPacket_dwErrorCode = ERROR_AUTHORIZE_MODULE_DATABASE_PARAMENT; + return false; + } + XCHAR tszSQLStatement[1024] = {}; + XNETHANDLE xhTable = 0; + __int64u nColumn = 0; + __int64u nRow = 0; + XCHAR** ppszResult = NULL; + + _xstprintf(tszSQLStatement, _X("SELECT * FROM Authorize_OAuth WHERE tszClientID = '%s' AND tszClientKey = '%s'"), pSt_OAuthInfo->tszClientID, pSt_OAuthInfo->tszClientKey); + + if (!DataBase_MySQL_ExecuteQuery(xhData, &xhTable, tszSQLStatement, &nRow, &nColumn)) + { + SQLPacket_IsErrorOccur = true; + SQLPacket_dwErrorCode = DataBase_GetLastError(); + return false; + } + if (nRow <= 0) + { + SQLPacket_IsErrorOccur = true; + SQLPacket_dwErrorCode = ERROR_AUTHORIZE_MODULE_DATABASE_NONE; + return false; + } + ppszResult = DataBase_MySQL_GetResult(xhData, xhTable); + int nFliedValue = 0; + _tcsxcpy(pSt_OAuthInfo->tszUserName, ppszResult[nFliedValue]); + nFliedValue++; + if (NULL != ppszResult[nFliedValue]) + { + _tcsxcpy(pSt_OAuthInfo->tszTokenStr, ppszResult[nFliedValue]); + } + nFliedValue++; + if (NULL != ppszResult[nFliedValue]) + { + _tcsxcpy(pSt_OAuthInfo->tszUPToken, ppszResult[nFliedValue]); } + nFliedValue++; + _tcsxcpy(pSt_OAuthInfo->tszClientID, ppszResult[nFliedValue]); + nFliedValue++; + _tcsxcpy(pSt_OAuthInfo->tszClientKey, ppszResult[nFliedValue]); + nFliedValue++; + pSt_OAuthInfo->nExpirationTime = _ttxoi(ppszResult[nFliedValue]); + nFliedValue++; + _tcsxcpy(pSt_OAuthInfo->tszCreateTime, ppszResult[nFliedValue]); + nFliedValue++; + DataBase_MySQL_FreeResult(xhData, xhTable); return true; } diff --git a/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.h b/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.h index afeb2b5..0f2319d 100644 --- a/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.h +++ b/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.h @@ -59,6 +59,8 @@ class CDBModule_MySQL bool DBModule_MySQL_OAuthInsert(AUTHREG_OAUTHINFO* pSt_OAuthInfo); //插入授权信息 bool DBModule_MySQL_OAuthDelete(AUTHREG_OAUTHINFO* pSt_OAuthInfo); //删除授权信息 bool DBModule_MySQL_OAuthList(AUTHREG_OAUTHINFO*** pppSt_OAuthInfo, int* pInt_ListCount); + bool DBModule_MySQL_OAuthUPDate(AUTHREG_OAUTHINFO* pSt_OAuthInfo); + bool DBModule_MySQL_OAuthQuery(AUTHREG_OAUTHINFO* pSt_OAuthInfo); protected: bool DBModule_MySQL_UserPayTime(LPCXSTR lpszUserName, LPCXSTR lpszUserTime, LPCXSTR lpszCardTime, ENUM_VERIFICATION_MODULE_SERIAL_TYPE en_AuthSerialType, ENUM_VERIFICATION_MODULE_SERIAL_TYPE en_AuthUserType); //日期方式充值方式 private: diff --git a/XEngine_Source/AuthorizeModule_Database/DBModule_SQLite/DBModule_SQLite.cpp b/XEngine_Source/AuthorizeModule_Database/DBModule_SQLite/DBModule_SQLite.cpp index de85886..a4105ed 100644 --- a/XEngine_Source/AuthorizeModule_Database/DBModule_SQLite/DBModule_SQLite.cpp +++ b/XEngine_Source/AuthorizeModule_Database/DBModule_SQLite/DBModule_SQLite.cpp @@ -580,6 +580,7 @@ bool CDBModule_SQLite::DBModule_SQLite_UserLogin(LPCXSTR lpszUserName, LPCXSTR l SQLPacket_dwErrorCode = ERROR_AUTHORIZE_MODULE_DATABASE_INSERT; return false; } + return true; } /******************************************************************** @@ -1822,7 +1823,7 @@ bool CDBModule_SQLite::DBModule_SQLite_OAuthInsert(AUTHREG_OAUTHINFO *pSt_OAuthI } XCHAR tszSQLStr[8192] = {}; - _xstprintf(tszSQLStr, _X("INSERT INTO Authorize_OAuth(tszUserName,tszTokenStr,tszClientID,tszClientKey,tszCreateTime,tszExpirationTime) VALUES('%s','%s','%s','%s','%s','%s')"), pSt_OAuthInfo->tszUserName, pSt_OAuthInfo->tszTokenStr, pSt_OAuthInfo->tszClientID, pSt_OAuthInfo->tszClientKey, pSt_OAuthInfo->tszCreateTime, pSt_OAuthInfo->tszExpirationTime); + _xstprintf(tszSQLStr, _X("INSERT INTO Authorize_OAuth(tszUserName,tszTokenStr,tszUPToken,tszClientID,tszClientKey,nExpirationTime,tszCreateTime) VALUES('%s','%s','%s','%s','%s','%d','%s')"), pSt_OAuthInfo->tszUserName, pSt_OAuthInfo->tszTokenStr, pSt_OAuthInfo->tszUPToken, pSt_OAuthInfo->tszClientID, pSt_OAuthInfo->tszClientKey, pSt_OAuthInfo->nExpirationTime, pSt_OAuthInfo->tszCreateTime); //插入数据库 if (!DataBase_SQLite_Exec(xhData, tszSQLStr)) { @@ -1918,18 +1919,121 @@ bool CDBModule_SQLite::DBModule_SQLite_OAuthList(AUTHREG_OAUTHINFO*** ppppSt_OAu nFliedValue++; _tcsxcpy((*ppppSt_OAuthInfo)[i]->tszTokenStr, ppszResult[nFliedValue]); nFliedValue++; + _tcsxcpy((*ppppSt_OAuthInfo)[i]->tszUPToken, ppszResult[nFliedValue]); + nFliedValue++; _tcsxcpy((*ppppSt_OAuthInfo)[i]->tszClientID, ppszResult[nFliedValue]); nFliedValue++; _tcsxcpy((*ppppSt_OAuthInfo)[i]->tszClientKey, ppszResult[nFliedValue]); nFliedValue++; + (*ppppSt_OAuthInfo)[i]->nExpirationTime = _ttxoi(ppszResult[nFliedValue]); + nFliedValue++; _tcsxcpy((*ppppSt_OAuthInfo)[i]->tszCreateTime, ppszResult[nFliedValue]); nFliedValue++; - _tcsxcpy((*ppppSt_OAuthInfo)[i]->tszExpirationTime, ppszResult[nFliedValue]); - nFliedValue++; } DataBase_SQLite_FreeTable(ppszResult); return true; } +/******************************************************************** +函数名称:DBModule_SQLite_OAuthUPDate +函数功能:更新OAuth信息 + 参数.一:pSt_OAuthInfo + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:要操作的数据 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CDBModule_SQLite::DBModule_SQLite_OAuthUPDate(AUTHREG_OAUTHINFO* pSt_OAuthInfo) +{ + SQLPacket_IsErrorOccur = false; + + if (NULL == pSt_OAuthInfo) + { + SQLPacket_IsErrorOccur = true; + SQLPacket_dwErrorCode = ERROR_AUTHORIZE_MODULE_DATABASE_PARAMENT; + return false; + } + XCHAR tszSQLStatement[1024] = {}; + //处理的类型 + _xstprintf(tszSQLStatement, _X("UPDATE Authorize_OAuth SET tszTokenStr = '%s',tszUPToken = '%s' WHERE tszClientID = '%s' AND tszClientKey = '%s'"), pSt_OAuthInfo->tszTokenStr, pSt_OAuthInfo->tszUPToken, pSt_OAuthInfo->tszClientID, pSt_OAuthInfo->tszClientKey); + //插入数据库 + if (!DataBase_SQLite_Exec(xhData, tszSQLStatement)) + { + SQLPacket_IsErrorOccur = true; + SQLPacket_dwErrorCode = DataBase_GetLastError(); + return false; + } + return true; +} +/******************************************************************** +函数名称:DBModule_SQLite_OAuthQuery +函数功能:查询OAuth信息 + 参数.一:pSt_OAuthInfo + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:要操作的数据 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CDBModule_SQLite::DBModule_SQLite_OAuthQuery(AUTHREG_OAUTHINFO* pSt_OAuthInfo) +{ + SQLPacket_IsErrorOccur = false; + + if (NULL == pSt_OAuthInfo) + { + SQLPacket_IsErrorOccur = true; + SQLPacket_dwErrorCode = ERROR_AUTHORIZE_MODULE_DATABASE_PARAMENT; + return false; + } + XCHAR tszSQLStatement[1024] = {}; + _xstprintf(tszSQLStatement, _X("SELECT * FROM Authorize_OAuth WHERE tszClientID = '%s' AND tszClientKey = '%s'"), pSt_OAuthInfo->tszClientID, pSt_OAuthInfo->tszClientKey); + int nRow = 0; + int nColumn = 0; + XCHAR** ppszResult = NULL; + if (!DataBase_SQLite_GetTable(xhData, tszSQLStatement, &ppszResult, &nRow, &nColumn)) + { + SQLPacket_IsErrorOccur = true; + SQLPacket_dwErrorCode = DataBase_GetLastError(); + return false; + } + + if (nRow <= 0) + { + SQLPacket_IsErrorOccur = true; + SQLPacket_dwErrorCode = ERROR_AUTHORIZE_MODULE_DATABASE_NOTFOUND; + return false; + } + int nFliedValue = nColumn; + _tcsxcpy(pSt_OAuthInfo->tszUserName, ppszResult[nFliedValue]); + nFliedValue++; + if (NULL != ppszResult[nFliedValue]) + { + _tcsxcpy(pSt_OAuthInfo->tszTokenStr, ppszResult[nFliedValue]); + } + nFliedValue++; + if (NULL != ppszResult[nFliedValue]) + { + _tcsxcpy(pSt_OAuthInfo->tszUPToken, ppszResult[nFliedValue]); + } + nFliedValue++; + _tcsxcpy(pSt_OAuthInfo->tszClientID, ppszResult[nFliedValue]); + nFliedValue++; + _tcsxcpy(pSt_OAuthInfo->tszClientKey, ppszResult[nFliedValue]); + nFliedValue++; + pSt_OAuthInfo->nExpirationTime = _ttxoi(ppszResult[nFliedValue]); + nFliedValue++; + _tcsxcpy(pSt_OAuthInfo->tszCreateTime, ppszResult[nFliedValue]); + nFliedValue++; + + DataBase_SQLite_FreeTable(ppszResult); + return true; +} ////////////////////////////////////////////////////////////////////////// // 保护函数 ////////////////////////////////////////////////////////////////////////// diff --git a/XEngine_Source/AuthorizeModule_Database/DBModule_SQLite/DBModule_SQLite.h b/XEngine_Source/AuthorizeModule_Database/DBModule_SQLite/DBModule_SQLite.h index a003e8f..6887a1c 100644 --- a/XEngine_Source/AuthorizeModule_Database/DBModule_SQLite/DBModule_SQLite.h +++ b/XEngine_Source/AuthorizeModule_Database/DBModule_SQLite/DBModule_SQLite.h @@ -59,6 +59,8 @@ class CDBModule_SQLite bool DBModule_SQLite_OAuthInsert(AUTHREG_OAUTHINFO* pSt_OAuthInfo); bool DBModule_SQLite_OAuthDelete(AUTHREG_OAUTHINFO* pSt_OAuthInfo); bool DBModule_SQLite_OAuthList(AUTHREG_OAUTHINFO*** pppSt_OAuthInfo, int* pInt_ListCount); + bool DBModule_SQLite_OAuthUPDate(AUTHREG_OAUTHINFO* pSt_OAuthInfo); + bool DBModule_SQLite_OAuthQuery(AUTHREG_OAUTHINFO* pSt_OAuthInfo); protected: bool DBModule_SQLite_UserPayTime(LPCXSTR lpszUserName, LPCXSTR lpszUserTime, LPCXSTR lpszCardTime, ENUM_VERIFICATION_MODULE_SERIAL_TYPE en_AuthSerialType, ENUM_VERIFICATION_MODULE_SERIAL_TYPE en_AuthUserType); private: diff --git a/XEngine_Source/AuthorizeModule_Database/Database_Define.h b/XEngine_Source/AuthorizeModule_Database/Database_Define.h index 0d28c75..dbf5247 100644 --- a/XEngine_Source/AuthorizeModule_Database/Database_Define.h +++ b/XEngine_Source/AuthorizeModule_Database/Database_Define.h @@ -599,6 +599,34 @@ extern "C" bool DBModule_SQLite_OAuthDelete(AUTHREG_OAUTHINFO* pSt_OAuthInfo); 备注: *********************************************************************/ extern "C" bool DBModule_SQLite_OAuthList(AUTHREG_OAUTHINFO*** pppSt_OAuthInfo, int* pInt_ListCount); +/******************************************************************** +函数名称:DBModule_SQLite_OAuthUPDate +函数功能:更新OAuth信息 + 参数.一:pSt_OAuthInfo + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:要操作的数据 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool DBModule_SQLite_OAuthUPDate(AUTHREG_OAUTHINFO* pSt_OAuthInfo); +/******************************************************************** +函数名称:DBModule_SQLite_OAuthQuery +函数功能:查询OAuth信息 + 参数.一:pSt_OAuthInfo + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:要操作的数据 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool DBModule_SQLite_OAuthQuery(AUTHREG_OAUTHINFO* pSt_OAuthInfo); /************************************************************************/ /* MYSQL数据库服务导出函数 */ /************************************************************************/ @@ -1181,4 +1209,32 @@ extern "C" bool DBModule_MySQL_OAuthDelete(AUTHREG_OAUTHINFO* pSt_OAuthInfo); 意思:是否成功 备注: *********************************************************************/ -extern "C" bool DBModule_MySQL_OAuthList(AUTHREG_OAUTHINFO*** pppSt_OAuthInfo, int* pInt_ListCount); \ No newline at end of file +extern "C" bool DBModule_MySQL_OAuthList(AUTHREG_OAUTHINFO*** pppSt_OAuthInfo, int* pInt_ListCount); +/******************************************************************** +函数名称:DBModule_MySQL_OAuthUPDate +函数功能:更新OAuth信息 + 参数.一:pSt_OAuthInfo + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:要操作的数据 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool DBModule_MySQL_OAuthUPDate(AUTHREG_OAUTHINFO* pSt_OAuthInfo); +/******************************************************************** +函数名称:DBModule_MySQL_OAuthQuery +函数功能:查询OAuth信息 + 参数.一:pSt_OAuthInfo + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:要操作的数据 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool DBModule_MySQL_OAuthQuery(AUTHREG_OAUTHINFO* pSt_OAuthInfo); \ No newline at end of file diff --git a/XEngine_Source/AuthorizeModule_Database/Database_Error.h b/XEngine_Source/AuthorizeModule_Database/Database_Error.h index aa6e198..893a833 100644 --- a/XEngine_Source/AuthorizeModule_Database/Database_Error.h +++ b/XEngine_Source/AuthorizeModule_Database/Database_Error.h @@ -36,4 +36,5 @@ #define ERROR_AUTHORIZE_MODULE_DATABASE_NONE 0x0030018 //获取失败,没有任何记录 #define ERROR_AUTHORIZE_MODULE_DATABASE_NOTENABLE 0x0030019 //没有启用.不禁用 #define ERROR_AUTHORIZE_MODULE_DATABASE_TIMELEFT 0x0030020 //超过禁用时间 -#define ERROR_AUTHORIZE_MODULE_DATABASE_BANNED 0x0030021 //被禁用 \ No newline at end of file +#define ERROR_AUTHORIZE_MODULE_DATABASE_BANNED 0x0030021 //被禁用 +#define ERROR_AUTHORIZE_MODULE_DATABASE_NOTFOUND 0x0030022 //没有找到 \ No newline at end of file diff --git a/XEngine_Source/AuthorizeModule_Database/pch.cpp b/XEngine_Source/AuthorizeModule_Database/pch.cpp index d3d4554..b0769cf 100644 --- a/XEngine_Source/AuthorizeModule_Database/pch.cpp +++ b/XEngine_Source/AuthorizeModule_Database/pch.cpp @@ -163,6 +163,14 @@ extern "C" bool DBModule_SQLite_OAuthList(AUTHREG_OAUTHINFO*** pppSt_OAuthInfo, { return m_DBSQLite.DBModule_SQLite_OAuthList(pppSt_OAuthInfo, pInt_ListCount); } +extern "C" bool DBModule_SQLite_OAuthUPDate(AUTHREG_OAUTHINFO* pSt_OAuthInfo) +{ + return m_DBSQLite.DBModule_SQLite_OAuthUPDate(pSt_OAuthInfo); +} +extern "C" bool DBModule_SQLite_OAuthQuery(AUTHREG_OAUTHINFO* pSt_OAuthInfo) +{ + return m_DBSQLite.DBModule_SQLite_OAuthQuery(pSt_OAuthInfo); +} /************************************************************************/ /* MYSQL数据库服务导出函数 */ /************************************************************************/ @@ -297,4 +305,12 @@ extern "C" bool DBModule_MySQL_OAuthDelete(AUTHREG_OAUTHINFO* pSt_OAuthInfo) extern "C" bool DBModule_MySQL_OAuthList(AUTHREG_OAUTHINFO*** pppSt_OAuthInfo, int* pInt_ListCount) { return m_DBMySQL.DBModule_MySQL_OAuthList(pppSt_OAuthInfo, pInt_ListCount); +} +extern "C" bool DBModule_MySQL_OAuthUPDate(AUTHREG_OAUTHINFO* pSt_OAuthInfo) +{ + return m_DBMySQL.DBModule_MySQL_OAuthUPDate(pSt_OAuthInfo); +} +extern "C" bool DBModule_MySQL_OAuthQuery(AUTHREG_OAUTHINFO* pSt_OAuthInfo) +{ + return m_DBMySQL.DBModule_MySQL_OAuthQuery(pSt_OAuthInfo); } \ No newline at end of file diff --git a/XEngine_Source/AuthorizeModule_Protocol/AuthorizeModule_Protocol.def b/XEngine_Source/AuthorizeModule_Protocol/AuthorizeModule_Protocol.def index 7bf62bf..d579d06 100644 --- a/XEngine_Source/AuthorizeModule_Protocol/AuthorizeModule_Protocol.def +++ b/XEngine_Source/AuthorizeModule_Protocol/AuthorizeModule_Protocol.def @@ -17,6 +17,7 @@ EXPORTS Protocol_Packet_HttpAnnouncement Protocol_Packet_HttpTryList Protocol_Packet_HttpOAuth + Protocol_Packet_HttpOAuth2 Protocol_Parse_WSHdr Protocol_Parse_HttpParseToken diff --git a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Define.h b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Define.h index 9ad1abc..ebae8ad 100644 --- a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Define.h +++ b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Define.h @@ -423,6 +423,30 @@ extern "C" bool Protocol_Packet_HttpTryList(XCHAR* ptszMsgBuffer, int* pInt_MsgL 备注: *********************************************************************/ extern "C" bool Protocol_Packet_HttpOAuth(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, AUTHREG_OAUTHINFO* pSt_OAuthInfo); +/******************************************************************** +函数名称:Protocol_Packet_HttpOAuth2 +函数功能:打包标准的OAuth信息 + 参数.一:ptszMsgBuffer + In/Out:Out + 类型:字符指针 + 可空:N + 意思:导出包装好的缓冲区 + 参数.二:pInt_MsgLen + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出包装大小 + 参数.三:pSt_OAuthInfo + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:输入要打包的信息 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool Protocol_Packet_HttpOAuth2(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, AUTHREG_OAUTHINFO* pSt_OAuthInfo); /************************************************************************/ /* 解析类协议 */ /************************************************************************/ diff --git a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Packet/Protocol_Packet.cpp b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Packet/Protocol_Packet.cpp index 608cb69..0af0654 100644 --- a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Packet/Protocol_Packet.cpp +++ b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Packet/Protocol_Packet.cpp @@ -1008,12 +1008,64 @@ bool CProtocol_Packet::Protocol_Packet_HttpOAuth(XCHAR* ptszMsgBuffer, int* pInt st_JsonOAuth["tszClientID"] = pSt_OAuthInfo->tszClientID; st_JsonOAuth["tszClientKey"] = pSt_OAuthInfo->tszClientKey; st_JsonOAuth["tszUserName"] = pSt_OAuthInfo->tszUserName; - st_JsonOAuth["tszExpirationTime"] = pSt_OAuthInfo->tszExpirationTime; + st_JsonOAuth["nExpirationTime"] = pSt_OAuthInfo->nExpirationTime; st_JsonRoot["msg"] = "success"; st_JsonRoot["code"] = 0; st_JsonRoot["st_OAuthInfo"] = st_JsonOAuth; + *pInt_MsgLen = st_JsonRoot.toStyledString().length(); + memcpy(ptszMsgBuffer, st_JsonRoot.toStyledString().c_str(), *pInt_MsgLen); + return true; +} +/******************************************************************** +函数名称:Protocol_Packet_HttpOAuth2 +函数功能:打包标准的OAuth信息 + 参数.一:ptszMsgBuffer + In/Out:Out + 类型:字符指针 + 可空:N + 意思:导出包装好的缓冲区 + 参数.二:pInt_MsgLen + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出包装大小 + 参数.三:pSt_OAuthInfo + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:输入要打包的信息 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CProtocol_Packet::Protocol_Packet_HttpOAuth2(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, AUTHREG_OAUTHINFO* pSt_OAuthInfo) +{ + Protocol_IsErrorOccur = false; + + if ((NULL == ptszMsgBuffer) || (NULL == pInt_MsgLen)) + { + Protocol_IsErrorOccur = true; + Protocol_dwErrorCode = ERROR_AUTHORIZE_MODULE_PROTOCOL_PARAMENT; + return false; + } + Protocol_IsErrorOccur = false; + + if ((NULL == ptszMsgBuffer) || (NULL == pInt_MsgLen)) + { + Protocol_IsErrorOccur = true; + Protocol_dwErrorCode = ERROR_AUTHORIZE_MODULE_PROTOCOL_PARAMENT; + return false; + } + Json::Value st_JsonRoot; + + st_JsonRoot["access_token"] = pSt_OAuthInfo->tszTokenStr; + st_JsonRoot["refresh_token"] = pSt_OAuthInfo->tszUPToken; + st_JsonRoot["token_type"] = "Bearer"; + st_JsonRoot["expires_in"] = pSt_OAuthInfo->nExpirationTime; + *pInt_MsgLen = st_JsonRoot.toStyledString().length(); memcpy(ptszMsgBuffer, st_JsonRoot.toStyledString().c_str(), *pInt_MsgLen); return true; diff --git a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Packet/Protocol_Packet.h b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Packet/Protocol_Packet.h index 14fbfb2..99b81f4 100644 --- a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Packet/Protocol_Packet.h +++ b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Packet/Protocol_Packet.h @@ -32,6 +32,7 @@ class CProtocol_Packet bool Protocol_Packet_HttpAnnouncement(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, AUTHREG_ANNOUNCEMENT*** pppSt_Announcement, int nListCount); bool Protocol_Packet_HttpTryList(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, AUTHREG_TEMPVER*** pppSt_TryList, int nListCount); bool Protocol_Packet_HttpOAuth(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, AUTHREG_OAUTHINFO* pSt_OAuthInfo); + bool Protocol_Packet_HttpOAuth2(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, AUTHREG_OAUTHINFO* pSt_OAuthInfo); protected: private: }; \ No newline at end of file diff --git a/XEngine_Source/AuthorizeModule_Protocol/pch.cpp b/XEngine_Source/AuthorizeModule_Protocol/pch.cpp index 4598f30..981604f 100644 --- a/XEngine_Source/AuthorizeModule_Protocol/pch.cpp +++ b/XEngine_Source/AuthorizeModule_Protocol/pch.cpp @@ -87,6 +87,10 @@ extern "C" bool Protocol_Packet_HttpOAuth(XCHAR* ptszMsgBuffer, int* pInt_MsgLen { return m_ProtocolPacket.Protocol_Packet_HttpOAuth(ptszMsgBuffer, pInt_MsgLen, pSt_OAuthInfo); } +extern "C" bool Protocol_Packet_HttpOAuth2(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, AUTHREG_OAUTHINFO* pSt_OAuthInfo) +{ + return m_ProtocolPacket.Protocol_Packet_HttpOAuth2(ptszMsgBuffer, pInt_MsgLen, pSt_OAuthInfo); +} /************************************************************************/ /* 解析类协议 */ /************************************************************************/ diff --git a/XEngine_Source/XAuth_Protocol.h b/XEngine_Source/XAuth_Protocol.h index d0a354a..ab83e2f 100644 --- a/XEngine_Source/XAuth_Protocol.h +++ b/XEngine_Source/XAuth_Protocol.h @@ -129,8 +129,9 @@ typedef struct { XCHAR tszUserName[128]; //用户名 XCHAR tszTokenStr[128]; //Token + XCHAR tszUPToken[128]; //Token XCHAR tszClientID[128]; //ID XCHAR tszClientKey[128]; //秘钥 XCHAR tszCreateTime[64]; //创建时间 - XCHAR tszExpirationTime[64]; //过期时间 + int nExpirationTime; //过期时间 }AUTHREG_OAUTHINFO; \ No newline at end of file diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Get/AuthorizeHTTP_Token.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Get/AuthorizeHTTP_Token.cpp index 3ca8d55..b52cb33 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Get/AuthorizeHTTP_Token.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Get/AuthorizeHTTP_Token.cpp @@ -162,13 +162,7 @@ bool XEngine_AuthorizeHTTP_Token(LPCXSTR lpszClientAddr, XCHAR** pptszList, int XENGINE_LIBTIME st_LibTime = {}; _tcsxcpy(st_OAuthInfo.tszUserName, st_UserInfo.tszUserName); - if (nListCount > 2) - { - time_t nTime = time(NULL) + _ttxoi(tszTimeout); - BaseLib_Time_TTimeToStuTime(nTime, &st_LibTime); - BaseLib_Time_TimeToStr(st_OAuthInfo.tszExpirationTime, NULL, true, &st_LibTime); - } - + st_OAuthInfo.nExpirationTime = _ttxoi(tszTimeout); BaseLib_Handle_CreateStr(st_OAuthInfo.tszClientID, 16, 1); BaseLib_Handle_CreateStr(st_OAuthInfo.tszClientKey); BaseLib_Time_TimeToStr(st_OAuthInfo.tszCreateTime); diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_OAuth.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_OAuth.cpp new file mode 100644 index 0000000..cfb370e --- /dev/null +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_OAuth.cpp @@ -0,0 +1,62 @@ +#include "../Authorize_Hdr.h" + +bool XEngine_AuthorizeHTTP_OAuth(LPCXSTR lpszClientAddr, LPCXSTR lpszAPIName, LPCXSTR lpszMSGBuffer, int nMSGLen) +{ + int nSDLen = 4096; + XCHAR tszSDBuffer[4096] = {}; + XCHAR tszURLKey[128] = {}; + XCHAR tszURLValue[128] = {}; + LPCXSTR lpszAPICreate = _X("create"); + LPCXSTR lpszAPIUPDate = _X("update"); + LPCXSTR lpszAPIClose = _X("close"); + + if (0 == _tcsxncmp(lpszAPICreate, lpszAPIName, _tcsxlen(lpszAPICreate))) + { + //http://app.xyry.org:5302/api/oauth/create + VERIFICATION_OAUTHINFO st_VerificationInfo = {}; + AUTHREG_OAUTHINFO st_OAuthInfo = {}; + + Verification_OAuth_Parse(&st_VerificationInfo, NULL, lpszMSGBuffer); + _tcsxcpy(st_OAuthInfo.tszClientID, st_VerificationInfo.tszClientID); + _tcsxcpy(st_OAuthInfo.tszClientKey, st_VerificationInfo.tszClientSecert); + + bool bRet = false; + if (0 == st_AuthConfig.st_XSql.nDBType) + { + bRet = DBModule_SQLite_OAuthQuery(&st_OAuthInfo); + } + else + { + bRet = DBModule_MySQL_OAuthQuery(&st_OAuthInfo); + } + if (!bRet) + { + Protocol_Packet_HttpComm(tszSDBuffer, &nSDLen, ERROR_AUTHORIZE_PROTOCOL_REQUEST, "request info is correct,maybe client id or key is incorrect"); + XEngine_Client_TaskSend(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_AUTH_APP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求创建OAuth的TOKEN失败,查询用户信息id:%s key:%s失败:%lX"), lpszClientAddr, st_OAuthInfo.tszClientID, st_OAuthInfo.tszClientKey, DBModule_GetLastError()); + return false; + } + BaseLib_Handle_CreateStr(st_OAuthInfo.tszTokenStr, 32); + BaseLib_Handle_CreateStr(st_OAuthInfo.tszUPToken, 32); + if (0 == st_AuthConfig.st_XSql.nDBType) + { + bRet = DBModule_SQLite_OAuthUPDate(&st_OAuthInfo); + } + else + { + bRet = DBModule_MySQL_OAuthUPDate(&st_OAuthInfo); + } + if (!bRet) + { + Protocol_Packet_HttpComm(tszSDBuffer, &nSDLen, ERROR_AUTHORIZE_PROTOCOL_SERVER, "internal server failure"); + XEngine_Client_TaskSend(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_AUTH_APP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求更新OAuth的TOKEN失败,内部错误:%lX"), lpszClientAddr, DBModule_GetLastError()); + return false; + } + Protocol_Packet_HttpOAuth2(tszSDBuffer, &nSDLen, &st_OAuthInfo); + XEngine_Client_TaskSend(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_AUTH_APP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s"), lpszClientAddr); + } + + return true; +} \ No newline at end of file diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_OAuth.h b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_OAuth.h new file mode 100644 index 0000000..c8a4e5f --- /dev/null +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_OAuth.h @@ -0,0 +1,3 @@ +#pragma once + +bool XEngine_AuthorizeHTTP_OAuth(LPCXSTR lpszClientAddr, LPCXSTR lpszAPIName, LPCXSTR lpszMSGBuffer, int nMSGLen); \ No newline at end of file diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Hdr.h b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Hdr.h index c36870c..b0108dc 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Hdr.h +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Hdr.h @@ -111,6 +111,7 @@ extern XENGINE_FUNCTIONSWITCH st_FunSwitch; #include "AuthorizeHTTP_Post/AuthorizeHTTP_CDKey.h" #include "AuthorizeHTTP_Post/AuthorizeHTTP_Announcement.h" #include "AuthorizeHTTP_Post/AuthorizeHTTP_Try.h" +#include "AuthorizeHTTP_Post/AuthorizeHTTP_OAuth.h" #include "AuthorizeHTTP_Get/AuthorizeHTTP_Token.h" #include "AuthorizeHTTP_Get/AuthorizeHTTP_GetTask.h" diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_HttpTask.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_HttpTask.cpp index 7922812..1f07755 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_HttpTask.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_HttpTask.cpp @@ -191,7 +191,8 @@ bool XEngine_Client_HttpTask(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int LPCXSTR lpszAPIVerCDKey = _X("cdkey"); LPCXSTR lpszAPIVerNotice = _X("notice"); LPCXSTR lpszAPIVerTry = _X("try"); - + LPCXSTR lpszAPIOAuth = _X("oauth"); + memset(tszAPIType, '\0', sizeof(tszAPIType)); memset(tszAPIVer, '\0', sizeof(tszAPIVer)); memset(tszAPIName, '\0', sizeof(tszAPIName)); @@ -313,6 +314,10 @@ bool XEngine_Client_HttpTask(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int { XEngine_AuthorizeHTTP_User(xhToken, lpszClientAddr, tszAPIName, lpszMsgBuffer, nMsgLen); } + else if (0 == _tcsxncmp(lpszAPIOAuth, tszAPIVer, _tcsxlen(lpszAPIOAuth))) + { + XEngine_AuthorizeHTTP_OAuth(lpszClientAddr, tszAPIName, lpszMsgBuffer, nMsgLen); + } else { Protocol_Packet_HttpComm(tszSDBuffer, &nSDLen, ERROR_AUTHORIZE_PROTOCOL_REQUEST, "reqeust api is not support"); @@ -330,7 +335,7 @@ bool XEngine_Client_HttpTask(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int LPCXSTR lpszFuncName = _X("api"); LPCXSTR lpszAPIVerDCode = _X("dcode"); LPCXSTR lpszAPIVerTime = _X("time"); - + memset(tszUrlName, '\0', sizeof(tszUrlName)); HttpProtocol_ServerHelp_GetParament(pSt_HTTPParament->tszHttpUri, &pptszList, &nListCount, tszUrlName); if ((nListCount < 1) || (0 != _tcsxncmp(lpszFuncName, tszUrlName, _tcsxlen(lpszFuncName)))) diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Makefile b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Makefile index b381650..d60d5c5 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Makefile +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Makefile @@ -10,7 +10,7 @@ LIB = -lXEngine_InfoReport -ljsoncpp -lXEngine_Verification -lXEngine_MSGNotify -lAuthorizeModule_Session -lAuthorizeModule_Database -lAuthorizeModule_Protocol -lAuthorizeModule_Configure -lAuthorizeModule_Help LIBEX = OBJECTS = Authorize_Config.o Authorize_Net.o Authorize_Task.o Authorize_TCPTask.o Authorize_WSTask.o Authorize_HttpTask.o Authorize_MQTTTask.o XEngine_AuthorizeService.o \ - AuthorizeHTTP_Client.o AuthorizeHTTP_Serial.o AuthorizeHTTP_User.o AuthorizeHTTP_Pass.o AuthorizeHTTP_Switch.o AuthorizeHTTP_Banned.o AuthorizeHTTP_CDKey.o AuthorizeHTTP_Announcement.o AuthorizeHTTP_Try.o\ + AuthorizeHTTP_Client.o AuthorizeHTTP_Serial.o AuthorizeHTTP_User.o AuthorizeHTTP_Pass.o AuthorizeHTTP_Switch.o AuthorizeHTTP_Banned.o AuthorizeHTTP_CDKey.o AuthorizeHTTP_Announcement.o AuthorizeHTTP_Try.o AuthorizeHTTP_OAuth.o \ AuthorizeHTTP_Token.o AuthorizeHTTP_GetTask.o ifeq ($(RELEASE),1) @@ -87,6 +87,8 @@ AuthorizeHTTP_Announcement.o:./AuthorizeHTTP_Post/AuthorizeHTTP_Announcement.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./AuthorizeHTTP_Post/AuthorizeHTTP_Announcement.cpp AuthorizeHTTP_Try.o:./AuthorizeHTTP_Post/AuthorizeHTTP_Try.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./AuthorizeHTTP_Post/AuthorizeHTTP_Try.cpp +AuthorizeHTTP_OAuth.o:./AuthorizeHTTP_Post/AuthorizeHTTP_OAuth.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./AuthorizeHTTP_Post/AuthorizeHTTP_OAuth.cpp AuthorizeHTTP_Token.o:./AuthorizeHTTP_Get/AuthorizeHTTP_Token.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./AuthorizeHTTP_Get/AuthorizeHTTP_Token.cpp diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/XEngine_AuthorizeService.vcxproj b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/XEngine_AuthorizeService.vcxproj index 48728a9..ff027ba 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/XEngine_AuthorizeService.vcxproj +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/XEngine_AuthorizeService.vcxproj @@ -238,6 +238,7 @@ + @@ -259,6 +260,7 @@ + diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/XEngine_AuthorizeService.vcxproj.filters b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/XEngine_AuthorizeService.vcxproj.filters index ff32cae..93b7304 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/XEngine_AuthorizeService.vcxproj.filters +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/XEngine_AuthorizeService.vcxproj.filters @@ -84,6 +84,9 @@ 源文件 + + 源文件\AuthorizeHTTP_Post + @@ -146,5 +149,8 @@ 头文件 + + 头文件\AuthorizeHTTP_Post + \ No newline at end of file From 8721ac87ed229012c3a718dde3f486a2fd2729b0 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 19 Aug 2026 15:20:26 +0800 Subject: [PATCH 08/15] added:revoke for auth 2.0 --- .../AuthorizeHTTP_OAuth.cpp | 44 ++++++++++++++++--- .../Authorize_Net.cpp | 17 ++++--- XEngine_Source/XEngine_DependLibrary | 2 +- 3 files changed, 50 insertions(+), 13 deletions(-) diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_OAuth.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_OAuth.cpp index cfb370e..5745e53 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_OAuth.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_OAuth.cpp @@ -6,13 +6,13 @@ bool XEngine_AuthorizeHTTP_OAuth(LPCXSTR lpszClientAddr, LPCXSTR lpszAPIName, LP XCHAR tszSDBuffer[4096] = {}; XCHAR tszURLKey[128] = {}; XCHAR tszURLValue[128] = {}; - LPCXSTR lpszAPICreate = _X("create"); - LPCXSTR lpszAPIUPDate = _X("update"); - LPCXSTR lpszAPIClose = _X("close"); + LPCXSTR lpszAPIToken = _X("token"); //更新,创建 + LPCXSTR lpszAPIRevoke = _X("revoke"); //撤销 + LPCXSTR lpszAPIIntrospect = _X("introspect"); //检查 - if (0 == _tcsxncmp(lpszAPICreate, lpszAPIName, _tcsxlen(lpszAPICreate))) + if (0 == _tcsxncmp(lpszAPIToken, lpszAPIName, _tcsxlen(lpszAPIToken))) { - //http://app.xyry.org:5302/api/oauth/create + //http://127.0.0.1:5302/api/oauth/token VERIFICATION_OAUTHINFO st_VerificationInfo = {}; AUTHREG_OAUTHINFO st_OAuthInfo = {}; @@ -50,12 +50,42 @@ bool XEngine_AuthorizeHTTP_OAuth(LPCXSTR lpszClientAddr, LPCXSTR lpszAPIName, LP { Protocol_Packet_HttpComm(tszSDBuffer, &nSDLen, ERROR_AUTHORIZE_PROTOCOL_SERVER, "internal server failure"); XEngine_Client_TaskSend(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_AUTH_APP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求更新OAuth的TOKEN失败,内部错误:%lX"), lpszClientAddr, DBModule_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求创建OAuth的TOKEN失败,内部错误:%lX"), lpszClientAddr, DBModule_GetLastError()); return false; } Protocol_Packet_HttpOAuth2(tszSDBuffer, &nSDLen, &st_OAuthInfo); XEngine_Client_TaskSend(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_AUTH_APP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s"), lpszClientAddr); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求创建OAuth Token:%s 成功"), lpszClientAddr, st_OAuthInfo.tszTokenStr); + } + else if (0 == _tcsxncmp(lpszAPIRevoke, lpszAPIName, _tcsxlen(lpszAPIRevoke))) + { + //http://127.0.0.1:5302/api/oauth/revoke + VERIFICATION_OAUTHINFO st_VerificationInfo = {}; + AUTHREG_OAUTHINFO st_OAuthInfo = {}; + + Verification_OAuth_Parse(&st_VerificationInfo, NULL, lpszMSGBuffer); + _tcsxcpy(st_OAuthInfo.tszTokenStr, st_VerificationInfo.tszTokenStr); + + bool bRet = false; + if (0 == st_AuthConfig.st_XSql.nDBType) + { + bRet = DBModule_SQLite_OAuthDelete(&st_OAuthInfo); + } + else + { + bRet = DBModule_MySQL_OAuthDelete(&st_OAuthInfo); + } + if (!bRet) + { + Protocol_Packet_HttpComm(tszSDBuffer, &nSDLen, ERROR_AUTHORIZE_PROTOCOL_REQUEST, "request info is correct,maybe token is incorrect"); + XEngine_Client_TaskSend(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_AUTH_APP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求删除OAuth的TOKEN失败,可能TOKEN:%s 错误:%lX"), lpszClientAddr, st_OAuthInfo.tszTokenStr, DBModule_GetLastError()); + return false; + } + + Protocol_Packet_HttpOAuth2(tszSDBuffer, &nSDLen, &st_OAuthInfo); + XEngine_Client_TaskSend(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_AUTH_APP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求撤销删除OAuth的token成功,撤销的token:%s"), lpszClientAddr, st_OAuthInfo.tszTokenStr); } return true; diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Net.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Net.cpp index 3386eed..18a4d8f 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Net.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Net.cpp @@ -230,15 +230,22 @@ bool XEngine_Client_TaskSend(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int st_HDRParam.nHttpCode = 200; st_HDRParam.bIsClose = true; - if (st_AuthConfig.st_XCrypto.bEnable) + if (nMsgLen > 0) { - CHttpMemory_PoolEx m_CodecMemory(XENGINE_MEMORY_SIZE_MAX); - Cryption_Api_CryptEncodec((LPCXBTR)lpszMsgBuffer, (XBYTE*)m_CodecMemory.get(), &nMsgLen, st_AuthConfig.st_XCrypto.tszCryptoKey, (ENUM_XENGINE_CRYPTION_SYMMETRIC)st_AuthConfig.st_XCrypto.nCryptionType); - HttpProtocol_Server_SendMsgEx(xhHttpPacket, m_HTTPMemory.get(), &nSDSize, &st_HDRParam, m_CodecMemory.get(), nMsgLen); + if (st_AuthConfig.st_XCrypto.bEnable) + { + CHttpMemory_PoolEx m_CodecMemory(XENGINE_MEMORY_SIZE_MAX); + Cryption_Api_CryptEncodec((LPCXBTR)lpszMsgBuffer, (XBYTE*)m_CodecMemory.get(), &nMsgLen, st_AuthConfig.st_XCrypto.tszCryptoKey, (ENUM_XENGINE_CRYPTION_SYMMETRIC)st_AuthConfig.st_XCrypto.nCryptionType); + HttpProtocol_Server_SendMsgEx(xhHttpPacket, m_HTTPMemory.get(), &nSDSize, &st_HDRParam, m_CodecMemory.get(), nMsgLen); + } + else + { + HttpProtocol_Server_SendMsgEx(xhHttpPacket, m_HTTPMemory.get(), &nSDSize, &st_HDRParam, lpszMsgBuffer, nMsgLen); + } } else { - HttpProtocol_Server_SendMsgEx(xhHttpPacket, m_HTTPMemory.get(), &nSDSize, &st_HDRParam, lpszMsgBuffer, nMsgLen); + HttpProtocol_Server_SendMsgEx(xhHttpPacket, m_HTTPMemory.get(), &nSDSize, &st_HDRParam); } NetCore_TCPXCore_SendEx(xhHttpSocket, lpszClientAddr, m_HTTPMemory.get(), nSDSize); SocketOpt_HeartBeat_ActiveAddrEx(xhHTTPHeart, lpszClientAddr); diff --git a/XEngine_Source/XEngine_DependLibrary b/XEngine_Source/XEngine_DependLibrary index dc73149..2d7f1d3 160000 --- a/XEngine_Source/XEngine_DependLibrary +++ b/XEngine_Source/XEngine_DependLibrary @@ -1 +1 @@ -Subproject commit dc73149af8aef839085e1f7ad254aea41f0a2f86 +Subproject commit 2d7f1d3d9111b98d1c9d02efa8d9a28b0931354f From 00be5e6a7e52534c04cf10dbecd2b19427a476d3 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 19 Aug 2026 16:33:07 +0800 Subject: [PATCH 09/15] delete:client user token --- .../DBModule_MySQL/DBModule_MySQL.cpp | 13 ++----- .../DBModule_SQLite/DBModule_SQLite.cpp | 10 ++---- .../Authorize_Dialog/Dialog_Modify.cpp | 5 --- .../Authorize_Dialog/Dialog_User.cpp | 34 +++++++++---------- .../Authorize_Net.cpp | 2 +- 5 files changed, 21 insertions(+), 43 deletions(-) diff --git a/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.cpp b/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.cpp index c50ce0a..a845c49 100644 --- a/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.cpp +++ b/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.cpp @@ -123,7 +123,7 @@ bool CDBModule_MySQL::DBModule_MySQL_UserRegister(AUTHREG_USERTABLE* pSt_UserInf SQLPacket_dwErrorCode = ERROR_AUTHORIZE_MODULE_DATABASE_EXIST; return false; } - _xstprintf(tszSQLStatement, _X("INSERT INTO `Authorize_User`(UserName, Password, Token, LeftTime, EmailAddr, HardCode, CardSerialType, PhoneNumber, IDCard, nUserLevel, CountTime, CreateTime) values('%s','%s','0','%s','%s','%s','%d',%lld,%lld,%d,0,NOW())"), pSt_UserInfo->st_UserInfo.tszUserName, pSt_UserInfo->st_UserInfo.tszUserPass, pSt_UserInfo->tszLeftTime, pSt_UserInfo->st_UserInfo.tszEMailAddr, pSt_UserInfo->tszHardCode, pSt_UserInfo->enSerialType, pSt_UserInfo->st_UserInfo.nPhoneNumber, pSt_UserInfo->st_UserInfo.nIDNumber, pSt_UserInfo->st_UserInfo.nUserLevel); + _xstprintf(tszSQLStatement, _X("INSERT INTO `Authorize_User`(UserName, Password, LeftTime, EmailAddr, HardCode, CardSerialType, PhoneNumber, IDCard, nUserLevel, CountTime, CreateTime) values('%s','%s','%s','%s','%s','%d',%lld,%lld,%d,0,NOW())"), pSt_UserInfo->st_UserInfo.tszUserName, pSt_UserInfo->st_UserInfo.tszUserPass, pSt_UserInfo->tszLeftTime, pSt_UserInfo->st_UserInfo.tszEMailAddr, pSt_UserInfo->tszHardCode, pSt_UserInfo->enSerialType, pSt_UserInfo->st_UserInfo.nPhoneNumber, pSt_UserInfo->st_UserInfo.nIDNumber, pSt_UserInfo->st_UserInfo.nUserLevel); if (!DataBase_MySQL_Execute(xhData, tszSQLStatement)) { SQLPacket_IsErrorOccur = true; @@ -207,12 +207,6 @@ bool CDBModule_MySQL::DBModule_MySQL_UserQuery(LPCXSTR lpszUserName, AUTHREG_USE { _tcsxcpy(pSt_UserInfo->st_UserInfo.tszUserPass, pptszResult[nFliedValue]); } - //TOKEN - nFliedValue++; - if (NULL != pptszResult[nFliedValue]) - { - pSt_UserInfo->st_UserInfo.xhToken = _ttxoll(pptszResult[nFliedValue]); - } //过期时间 nFliedValue++; if (NULL != pptszResult[nFliedValue]) @@ -476,7 +470,7 @@ bool CDBModule_MySQL::DBModule_MySQL_UserSet(AUTHREG_USERTABLE* pSt_UserTable) XCHAR tszSQLStatement[1024]; //SQL语句 memset(tszSQLStatement, '\0', 1024); - _xstprintf(tszSQLStatement, _X("UPDATE `Authorize_User` SET Password = '%s',Token = '%lld',LeftTime = '%s',EmailAddr = '%s',HardCode = '%s',CardSerialType = '%d',PhoneNumber = '%lld',IDCard = '%lld',nUserLevel = '%d',CountTime = '%lld',CreateTime = '%s' WHERE UserName = '%s'"), pSt_UserTable->st_UserInfo.tszUserPass, pSt_UserTable->st_UserInfo.xhToken, pSt_UserTable->tszLeftTime, pSt_UserTable->st_UserInfo.tszEMailAddr, pSt_UserTable->tszHardCode, pSt_UserTable->enSerialType, pSt_UserTable->st_UserInfo.nPhoneNumber, pSt_UserTable->st_UserInfo.nIDNumber, pSt_UserTable->st_UserInfo.nUserLevel, pSt_UserTable->nTimeCount, pSt_UserTable->st_UserInfo.tszCreateTime, pSt_UserTable->st_UserInfo.tszUserName); + _xstprintf(tszSQLStatement, _X("UPDATE `Authorize_User` SET Password = '%s',LeftTime = '%s',EmailAddr = '%s',HardCode = '%s',CardSerialType = '%d',PhoneNumber = '%lld',IDCard = '%lld',nUserLevel = '%d',CountTime = '%lld',CreateTime = '%s' WHERE UserName = '%s'"), pSt_UserTable->st_UserInfo.tszUserPass, pSt_UserTable->tszLeftTime, pSt_UserTable->st_UserInfo.tszEMailAddr, pSt_UserTable->tszHardCode, pSt_UserTable->enSerialType, pSt_UserTable->st_UserInfo.nPhoneNumber, pSt_UserTable->st_UserInfo.nIDNumber, pSt_UserTable->st_UserInfo.nUserLevel, pSt_UserTable->nTimeCount, pSt_UserTable->st_UserInfo.tszCreateTime, pSt_UserTable->st_UserInfo.tszUserName); //更新用户剩余时间 if (!DataBase_MySQL_Execute(xhData, tszSQLStatement)) @@ -554,9 +548,6 @@ bool CDBModule_MySQL::DBModule_MySQL_UserList(AUTHREG_USERTABLE*** pppSt_UserInf //密码 nFliedValue++; _tcsxcpy((*pppSt_UserInfo)[i]->st_UserInfo.tszUserPass, ppszResult[nFliedValue]); - //TOKEN - nFliedValue++; - (*pppSt_UserInfo)[i]->st_UserInfo.xhToken = _ttxoll(ppszResult[nFliedValue]); //过期时间 nFliedValue++; _tcsxcpy((*pppSt_UserInfo)[i]->tszLeftTime, ppszResult[nFliedValue]); diff --git a/XEngine_Source/AuthorizeModule_Database/DBModule_SQLite/DBModule_SQLite.cpp b/XEngine_Source/AuthorizeModule_Database/DBModule_SQLite/DBModule_SQLite.cpp index a4105ed..65afa18 100644 --- a/XEngine_Source/AuthorizeModule_Database/DBModule_SQLite/DBModule_SQLite.cpp +++ b/XEngine_Source/AuthorizeModule_Database/DBModule_SQLite/DBModule_SQLite.cpp @@ -126,7 +126,7 @@ bool CDBModule_SQLite::DBModule_SQLite_UserRegister(AUTHREG_USERTABLE* pSt_UserI SQLPacket_dwErrorCode = ERROR_AUTHORIZE_MODULE_DATABASE_EXIST; return false; } - _xstprintf(tszSQLStatement, _X("INSERT INTO Authorize_User(UserName, Password, Token, LeftTime, EmailAddr, HardCode, CardSerialType, PhoneNumber, IDCard, nUserLevel, CountTime, CreateTime) values('%s','%s','0','%s','%s','%s','%d',%lld,%lld,%d,0,datetime('now', 'localtime'))"), pSt_UserInfo->st_UserInfo.tszUserName, pSt_UserInfo->st_UserInfo.tszUserPass, pSt_UserInfo->tszLeftTime, pSt_UserInfo->st_UserInfo.tszEMailAddr, pSt_UserInfo->tszHardCode, pSt_UserInfo->enSerialType, pSt_UserInfo->st_UserInfo.nPhoneNumber, pSt_UserInfo->st_UserInfo.nIDNumber, pSt_UserInfo->st_UserInfo.nUserLevel); + _xstprintf(tszSQLStatement, _X("INSERT INTO Authorize_User(UserName, Password, LeftTime, EmailAddr, HardCode, CardSerialType, PhoneNumber, IDCard, nUserLevel, CountTime, CreateTime) values('%s','%s','%s','%s','%s','%d',%lld,%lld,%d,0,datetime('now', 'localtime'))"), pSt_UserInfo->st_UserInfo.tszUserName, pSt_UserInfo->st_UserInfo.tszUserPass, pSt_UserInfo->tszLeftTime, pSt_UserInfo->st_UserInfo.tszEMailAddr, pSt_UserInfo->tszHardCode, pSt_UserInfo->enSerialType, pSt_UserInfo->st_UserInfo.nPhoneNumber, pSt_UserInfo->st_UserInfo.nIDNumber, pSt_UserInfo->st_UserInfo.nUserLevel); if (!DataBase_SQLite_Exec(xhData, tszSQLStatement)) { SQLPacket_IsErrorOccur = true; @@ -201,9 +201,6 @@ bool CDBModule_SQLite::DBModule_SQLite_UserQuery(LPCXSTR lpszUserName, AUTHREG_U //密码 nFliedValue++; _tcsxcpy(pSt_UserInfo->st_UserInfo.tszUserPass, ppszResult[nFliedValue]); - //TOKEN - nFliedValue++; - pSt_UserInfo->st_UserInfo.xhToken = _ttxoll(ppszResult[nFliedValue]); //过期时间 nFliedValue++; _tcsxcpy(pSt_UserInfo->tszLeftTime, ppszResult[nFliedValue]); @@ -433,7 +430,7 @@ bool CDBModule_SQLite::DBModule_SQLite_UserSet(AUTHREG_USERTABLE* pSt_UserTable) XCHAR tszSQLStatement[1024]; //SQL语句 memset(tszSQLStatement, '\0', 1024); - _xstprintf(tszSQLStatement, _X("UPDATE Authorize_User SET Password = '%s',Token = '%lld',LeftTime = '%s',EmailAddr = '%s',HardCode = '%s',CardSerialType = '%d',PhoneNumber = '%lld',IDCard = '%lld',nUserLevel = '%d',CountTime = '%lld',CreateTime = '%s' WHERE UserName = '%s'"), pSt_UserTable->st_UserInfo.tszUserPass, pSt_UserTable->st_UserInfo.xhToken, pSt_UserTable->tszLeftTime, pSt_UserTable->st_UserInfo.tszEMailAddr, pSt_UserTable->tszHardCode, pSt_UserTable->enSerialType, pSt_UserTable->st_UserInfo.nPhoneNumber, pSt_UserTable->st_UserInfo.nIDNumber, pSt_UserTable->st_UserInfo.nUserLevel, pSt_UserTable->nTimeCount, pSt_UserTable->st_UserInfo.tszCreateTime, pSt_UserTable->st_UserInfo.tszUserName); + _xstprintf(tszSQLStatement, _X("UPDATE Authorize_User SET Password = '%s',LeftTime = '%s',EmailAddr = '%s',HardCode = '%s',CardSerialType = '%d',PhoneNumber = '%lld',IDCard = '%lld',nUserLevel = '%d',CountTime = '%lld',CreateTime = '%s' WHERE UserName = '%s'"), pSt_UserTable->st_UserInfo.tszUserPass, pSt_UserTable->tszLeftTime, pSt_UserTable->st_UserInfo.tszEMailAddr, pSt_UserTable->tszHardCode, pSt_UserTable->enSerialType, pSt_UserTable->st_UserInfo.nPhoneNumber, pSt_UserTable->st_UserInfo.nIDNumber, pSt_UserTable->st_UserInfo.nUserLevel, pSt_UserTable->nTimeCount, pSt_UserTable->st_UserInfo.tszCreateTime, pSt_UserTable->st_UserInfo.tszUserName); //更新用户剩余时间 if (!DataBase_SQLite_Exec(xhData, tszSQLStatement)) { @@ -506,9 +503,6 @@ bool CDBModule_SQLite::DBModule_SQLite_UserList(AUTHREG_USERTABLE*** pppSt_UserI //密码 nFliedValue++; _tcsxcpy((*pppSt_UserInfo)[i]->st_UserInfo.tszUserPass, ppszResult[nFliedValue]); - //TOKEN - nFliedValue++; - (*pppSt_UserInfo)[i]->st_UserInfo.xhToken = _ttxoll(ppszResult[nFliedValue]); //过期时间 nFliedValue++; _tcsxcpy((*pppSt_UserInfo)[i]->tszLeftTime, ppszResult[nFliedValue]); diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Modify.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Modify.cpp index 9110928..0af111f 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Modify.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Modify.cpp @@ -141,7 +141,6 @@ BOOL CDialog_Modify::OnInitDialog() m_EditUser.SetWindowText(A2W(st_JsonObject["st_UserInfo"]["tszUserName"].asCString())); m_EditPass.SetWindowText(A2W(st_JsonObject["st_UserInfo"]["tszUserPass"].asCString())); m_EditEMail.SetWindowText(A2W(st_JsonObject["st_UserInfo"]["tszEMailAddr"].asCString())); - m_EditUserToken.SetWindowText(std::to_wstring(st_JsonObject["st_UserInfo"]["xhToken"].asInt64()).c_str()); m_EditCountTime.SetWindowText(std::to_wstring(st_JsonObject["st_UserInfo"]["nTimeCount"].asInt64()).c_str()); COleDateTime m_OleDTime; if (m_OleDTime.ParseDateTime(A2W(st_JsonObject["st_UserInfo"]["tszCreateTime"].asCString()))) @@ -187,9 +186,6 @@ void CDialog_Modify::OnBnClickedButton2() m_EditPass.GetWindowText(m_StrUserInfo); strcpy(st_UserTable.st_UserInfo.tszUserPass, W2A(m_StrUserInfo.GetBuffer())); m_StrUserInfo.ReleaseBuffer(); - m_EditUserToken.GetWindowText(m_StrUserInfo); - st_UserTable.st_UserInfo.xhToken = _ttxoll(W2A(m_StrUserInfo.GetBuffer())); - m_StrUserInfo.ReleaseBuffer(); m_EditCountTime.GetWindowText(m_StrUserInfo); st_UserTable.nTimeCount = _ttxoll(W2A(m_StrUserInfo.GetBuffer())); m_StrUserInfo.ReleaseBuffer(); @@ -244,7 +240,6 @@ void CDialog_Modify::OnBnClickedButton2() st_JsonUser["tszUserName"] = st_UserTable.st_UserInfo.tszUserName; st_JsonUser["tszUserPass"] = st_UserTable.st_UserInfo.tszUserPass; - st_JsonUser["xhToken"] = st_UserTable.st_UserInfo.xhToken; st_JsonUser["tszEMailAddr"] = st_UserTable.st_UserInfo.tszEMailAddr; st_JsonUser["tszCreateTime"] = st_UserTable.st_UserInfo.tszCreateTime; st_JsonUser["nPhoneNumber"] = st_UserTable.st_UserInfo.nPhoneNumber; diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_User.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_User.cpp index fa59667..7f4b564 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_User.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_User.cpp @@ -55,15 +55,14 @@ BOOL CDialog_User::OnInitDialog() // TODO: 在此添加额外的初始化 m_ListCtrlClient.InsertColumn(0, _T("序号"), LVCFMT_LEFT, 40); m_ListCtrlClient.InsertColumn(1, _T("用户名"), LVCFMT_LEFT, 120); - m_ListCtrlClient.InsertColumn(2, _T("TOKEN"), LVCFMT_LEFT, 60); - m_ListCtrlClient.InsertColumn(3, _T("IP地址"), LVCFMT_LEFT, 100); - m_ListCtrlClient.InsertColumn(4, _T("级别"), LVCFMT_LEFT, 80); - m_ListCtrlClient.InsertColumn(5, _T("在线时间(秒钟)"), LVCFMT_LEFT, 150); - m_ListCtrlClient.InsertColumn(6, _T("剩余时间/过期时间"), LVCFMT_LEFT, 150); - m_ListCtrlClient.InsertColumn(7, _T("充值类型"), LVCFMT_LEFT, 80); - m_ListCtrlClient.InsertColumn(8, _T("设备类型"), LVCFMT_LEFT, 80); - m_ListCtrlClient.InsertColumn(9, _T("是否在线"), LVCFMT_LEFT, 80); - m_ListCtrlClient.InsertColumn(10, _T("总在线时长"), LVCFMT_LEFT, 80); + m_ListCtrlClient.InsertColumn(2, _T("IP地址"), LVCFMT_LEFT, 100); + m_ListCtrlClient.InsertColumn(3, _T("级别"), LVCFMT_LEFT, 80); + m_ListCtrlClient.InsertColumn(4, _T("在线时间(秒钟)"), LVCFMT_LEFT, 150); + m_ListCtrlClient.InsertColumn(5, _T("剩余时间/过期时间"), LVCFMT_LEFT, 150); + m_ListCtrlClient.InsertColumn(6, _T("充值类型"), LVCFMT_LEFT, 80); + m_ListCtrlClient.InsertColumn(7, _T("设备类型"), LVCFMT_LEFT, 80); + m_ListCtrlClient.InsertColumn(8, _T("是否在线"), LVCFMT_LEFT, 80); + m_ListCtrlClient.InsertColumn(9, _T("总在线时长"), LVCFMT_LEFT, 80); m_ListCtrlClient.SetExtendedStyle(LVS_EX_FULLROWSELECT); m_EditFlushTime.SetWindowText(_T("10")); @@ -157,12 +156,11 @@ void CDialog_User::OnBnClickedButton1() m_ListCtrlClient.InsertItem(i, _T("")); m_ListCtrlClient.SetItemText(i, 0, tszIndex); m_ListCtrlClient.SetItemText(i, 1, A2W(st_JsonObject["tszUserName"].asCString())); - m_ListCtrlClient.SetItemText(i, 2, std::to_wstring(st_JsonObject["xhToken"].asInt64()).c_str()); if (!st_JsonArray["tszClientAddr"].isNull()) { - m_ListCtrlClient.SetItemText(i, 3, A2W(st_JsonArray["tszClientAddr"].asCString())); + m_ListCtrlClient.SetItemText(i, 2, A2W(st_JsonArray["tszClientAddr"].asCString())); } - m_ListCtrlClient.SetItemText(i, 4, A2W(lpszXLevelType[st_JsonObject["nUserLevel"].asInt() + 1])); + m_ListCtrlClient.SetItemText(i, 3, A2W(lpszXLevelType[st_JsonObject["nUserLevel"].asInt() + 1])); if (1 == st_JsonObject["nUserState"].asInt()) { @@ -171,13 +169,13 @@ void CDialog_User::OnBnClickedButton1() __int64x nTime = st_JsonArray["nOnlineTime"].asUInt64(); _stprintf(tszTimeStr, _T("%lld"), nTime); - m_ListCtrlClient.SetItemText(i, 5, tszTimeStr); + m_ListCtrlClient.SetItemText(i, 4, tszTimeStr); } - m_ListCtrlClient.SetItemText(i, 6, A2W(st_JsonArray["tszLeftTime"].asCString())); - m_ListCtrlClient.SetItemText(i, 7, A2W(lpszXSerialType[st_JsonArray["enSerialType"].asInt()])); - m_ListCtrlClient.SetItemText(i, 8, A2W(lpszXDevType[st_JsonArray["enDeviceType"].asInt()])); - m_ListCtrlClient.SetItemText(i, 9, lpszStuType[st_JsonObject["nUserState"].asInt()]); - m_ListCtrlClient.SetItemText(i, 10, std::to_wstring(st_JsonObject["nTimeCount"].asInt64()).c_str()); + m_ListCtrlClient.SetItemText(i, 5, A2W(st_JsonArray["tszLeftTime"].asCString())); + m_ListCtrlClient.SetItemText(i, 6, A2W(lpszXSerialType[st_JsonArray["enSerialType"].asInt()])); + m_ListCtrlClient.SetItemText(i, 7, A2W(lpszXDevType[st_JsonArray["enDeviceType"].asInt()])); + m_ListCtrlClient.SetItemText(i, 8, lpszStuType[st_JsonObject["nUserState"].asInt()]); + m_ListCtrlClient.SetItemText(i, 9, std::to_wstring(st_JsonObject["nTimeCount"].asInt64()).c_str()); } BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBuffer); UpdateWindow(); diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Net.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Net.cpp index 18a4d8f..25ec5e8 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Net.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Net.cpp @@ -73,7 +73,7 @@ bool XCALLBACK XEngine_Client_HttpAccept(LPCXSTR lpszClientAddr, XSOCKET hSocket } void XCALLBACK XEngine_Client_HttpRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam) { - if (!HttpProtocol_Server_InserQueueEx(xhHttpPacket, lpszClientAddr, lpszRecvMsg, nMsgLen)) + if (!HttpProtocol_Server_InsertQueueEx(xhHttpPacket, lpszClientAddr, lpszRecvMsg, nMsgLen)) { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,投递数据包失败,大小:%d,错误:%lX"), lpszClientAddr, nMsgLen, Packets_GetLastError()); } From 06be5baa81a5466637a6e9e5cf69842c83755ce6 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 19 Aug 2026 16:42:35 +0800 Subject: [PATCH 10/15] modify:fresh token support for oauth --- .../AuthorizeHTTP_Post/AuthorizeHTTP_OAuth.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_OAuth.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_OAuth.cpp index 5745e53..14e8d86 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_OAuth.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_OAuth.cpp @@ -15,11 +15,14 @@ bool XEngine_AuthorizeHTTP_OAuth(LPCXSTR lpszClientAddr, LPCXSTR lpszAPIName, LP //http://127.0.0.1:5302/api/oauth/token VERIFICATION_OAUTHINFO st_VerificationInfo = {}; AUTHREG_OAUTHINFO st_OAuthInfo = {}; + XCHAR tszFreshToken[XPATH_MIN] = {}; Verification_OAuth_Parse(&st_VerificationInfo, NULL, lpszMSGBuffer); _tcsxcpy(st_OAuthInfo.tszClientID, st_VerificationInfo.tszClientID); _tcsxcpy(st_OAuthInfo.tszClientKey, st_VerificationInfo.tszClientSecert); + _tcsxcpy(tszFreshToken, st_VerificationInfo.tszClientRefresh); + bool bRet = false; if (0 == st_AuthConfig.st_XSql.nDBType) { @@ -36,6 +39,18 @@ bool XEngine_AuthorizeHTTP_OAuth(LPCXSTR lpszClientAddr, LPCXSTR lpszAPIName, LP XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求创建OAuth的TOKEN失败,查询用户信息id:%s key:%s失败:%lX"), lpszClientAddr, st_OAuthInfo.tszClientID, st_OAuthInfo.tszClientKey, DBModule_GetLastError()); return false; } + //是否为刷新TOKEN + if (_tcsxlen(tszFreshToken) > 0) + { + //如果是 + if (0 == _tcsxnicmp(tszFreshToken, st_VerificationInfo.tszClientRefresh, _tcsxlen(st_VerificationInfo.tszClientRefresh))) + { + Protocol_Packet_HttpComm(tszSDBuffer, &nSDLen, ERROR_AUTHORIZE_PROTOCOL_UNAUTHORIZE, "token verification failure"); + XEngine_Client_TaskSend(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_AUTH_APP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求刷新OAuth的TOKEN失败,查询用户fresh:%s token:%s 不匹配"), lpszClientAddr, tszFreshToken, st_VerificationInfo.tszClientRefresh); + return false; + } + } BaseLib_Handle_CreateStr(st_OAuthInfo.tszTokenStr, 32); BaseLib_Handle_CreateStr(st_OAuthInfo.tszUPToken, 32); if (0 == st_AuthConfig.st_XSql.nDBType) From 446f009b3e5a483a430308e83e4817e99fbd72de Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 19 Aug 2026 20:50:50 +0800 Subject: [PATCH 11/15] added:insert session management for oauth token --- .../AuthorizeModule_Configure/Config_Define.h | 1 + .../ModuleConfigure_Json.cpp | 1 + .../AuthorizeHTTP_OAuth.cpp | 12 ++++ .../Authorize_Task.cpp | 8 ++- .../XEngine_AuthorizeService.cpp | 56 ++++++++++++++++++- 5 files changed, 73 insertions(+), 5 deletions(-) diff --git a/XEngine_Source/AuthorizeModule_Configure/Config_Define.h b/XEngine_Source/AuthorizeModule_Configure/Config_Define.h index 59dbbb1..545c455 100644 --- a/XEngine_Source/AuthorizeModule_Configure/Config_Define.h +++ b/XEngine_Source/AuthorizeModule_Configure/Config_Define.h @@ -161,6 +161,7 @@ typedef struct bool bSwitchBanned; //黑名单 bool bSwitchTokenLogin; //TOKEN开关 bool bSwitchHCLogin; //硬件码登录 + bool bSwitchOAuth; //是否启用OAuth bool bSwitchHWBind; //硬件码绑定 }XENGINE_FUNCTIONSWITCH; ////////////////////////////////////////////////////////////////////////// diff --git a/XEngine_Source/AuthorizeModule_Configure/ModuleConfigure_Json/ModuleConfigure_Json.cpp b/XEngine_Source/AuthorizeModule_Configure/ModuleConfigure_Json/ModuleConfigure_Json.cpp index 3039b57..47d6953 100644 --- a/XEngine_Source/AuthorizeModule_Configure/ModuleConfigure_Json/ModuleConfigure_Json.cpp +++ b/XEngine_Source/AuthorizeModule_Configure/ModuleConfigure_Json/ModuleConfigure_Json.cpp @@ -376,6 +376,7 @@ bool CModuleConfigure_Json::ModuleConfigure_Json_Switch(LPCXSTR lpszConfigFile, pSt_ServerConfig->bSwitchBanned = st_JsonRoot["bSwitchBanned"].asBool(); pSt_ServerConfig->bSwitchTokenLogin = st_JsonRoot["bSwitchTokenLogin"].asBool(); pSt_ServerConfig->bSwitchHCLogin = st_JsonRoot["bSwitchHCLogin"].asBool(); + pSt_ServerConfig->bSwitchOAuth = st_JsonRoot["bSwitchOAuth"].asBool(); pSt_ServerConfig->bSwitchHWBind = st_JsonRoot["bSwitchHWBind"].asBool(); return true; } \ No newline at end of file diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_OAuth.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_OAuth.cpp index 14e8d86..f0424f0 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_OAuth.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_OAuth.cpp @@ -68,6 +68,18 @@ bool XEngine_AuthorizeHTTP_OAuth(LPCXSTR lpszClientAddr, LPCXSTR lpszAPIName, LP XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求创建OAuth的TOKEN失败,内部错误:%lX"), lpszClientAddr, DBModule_GetLastError()); return false; } + + AUTHREG_USERTABLE st_UserTable = {}; + if (0 == st_AuthConfig.st_XSql.nDBType) + { + DBModule_SQLite_UserQuery(st_OAuthInfo.tszUserName, &st_UserTable); + } + else + { + DBModule_SQLite_UserQuery(st_OAuthInfo.tszUserName, &st_UserTable); + } + Session_Token_InsertStr(st_OAuthInfo.tszUserName, &st_UserTable.st_UserInfo, st_OAuthInfo.nExpirationTime); + Protocol_Packet_HttpOAuth2(tszSDBuffer, &nSDLen, &st_OAuthInfo); XEngine_Client_TaskSend(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_AUTH_APP_NETTYPE_HTTP); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求创建OAuth Token:%s 成功"), lpszClientAddr, st_OAuthInfo.tszTokenStr); diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Task.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Task.cpp index 1917b6e..76c9051 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Task.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Task.cpp @@ -86,9 +86,13 @@ void XCALLBACK XEngine_TaskEvent_Token(LPCXSTR lpszTokenStr, int nTimeout, int n } } - if (bRemove) + AUTHREG_OAUTHINFO st_OAuthInfo = {}; + _tcsxcpy(st_OAuthInfo.tszTokenStr, lpszTokenStr); + bool bRet = DBModule_SQLite_OAuthDelete(&st_OAuthInfo); + + if (bRemove || bRet) { Session_Token_DeleteStr(lpszTokenStr); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("Token:%s,用户名:%s,已经超时,权限级别:%d,被移除服务器"), lpszTokenStr, st_UserInfo.tszUserName, st_UserInfo.nUserLevel); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("Token:%s,用户名:%s,已经超时,权限级别:%d,被移除服务器,移除类型:%s"), lpszTokenStr, st_UserInfo.tszUserName, st_UserInfo.nUserLevel, bRet ? "普通" : "OAuth"); } } \ No newline at end of file diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/XEngine_AuthorizeService.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/XEngine_AuthorizeService.cpp index c4010b5..0e29f24 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/XEngine_AuthorizeService.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/XEngine_AuthorizeService.cpp @@ -160,16 +160,17 @@ int main(int argc, char** argv) #endif bIsRun = true; int nRet = -1; - HELPCOMPONENTS_XLOG_CONFIGURE st_XLogConfig; + int nListOAuth = 0; + AUTHREG_OAUTHINFO** ppSt_OAuthInfo; THREADPOOL_PARAMENT** ppSt_ListTCPThread; THREADPOOL_PARAMENT** ppSt_ListWSThread; THREADPOOL_PARAMENT** ppSt_ListHttpThread; THREADPOOL_PARAMENT** ppSt_ListMQTTParam; + HELPCOMPONENTS_XLOG_CONFIGURE st_XLogConfig = {}; LPCXSTR lpszHTTPMime = _X("./XEngine_Config/HttpMime.types"); LPCXSTR lpszHTTPCode = _X("./XEngine_Config/HttpCode.types"); - memset(&st_XLogConfig, '\0', sizeof(HELPCOMPONENTS_XLOG_CONFIGURE)); memset(&st_AuthConfig, '\0', sizeof(XENGINE_SERVICECONFIG)); memset(&st_FunSwitch, '\0', sizeof(XENGINE_FUNCTIONSWITCH)); @@ -463,6 +464,53 @@ int main(int argc, char** argv) XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,加密传输设置为关闭,采用明文传输")); } + if (0 == st_AuthConfig.st_XSql.nDBType) + { + DBModule_SQLite_OAuthList(&ppSt_OAuthInfo, &nListOAuth); + } + else + { + DBModule_MySQL_OAuthList(&ppSt_OAuthInfo, &nListOAuth); + } + for (int i = 0; i < nListOAuth; i++) + { + //是否过期 + time_t nTimeCreate = 0; + XENGINE_LIBTIME st_LibTime = {}; + BaseLib_Time_StrToTime(ppSt_OAuthInfo[i]->tszCreateTime, &st_LibTime); + BaseLib_Time_StuTimeToTTime(&st_LibTime, &nTimeCreate); + + time_t nTimeStop = time(NULL); + if ((ppSt_OAuthInfo[i]->nExpirationTime + nTimeCreate) - nTimeStop > 0) + { + AUTHREG_USERTABLE st_UserTable = {}; + if (0 == st_AuthConfig.st_XSql.nDBType) + { + DBModule_SQLite_UserQuery(ppSt_OAuthInfo[i]->tszUserName, &st_UserTable); + } + else + { + DBModule_SQLite_UserQuery(ppSt_OAuthInfo[i]->tszUserName, &st_UserTable); + } + //剩余时间 + int nTimeLeft = nTimeStop - (ppSt_OAuthInfo[i]->nExpirationTime + nTimeCreate); + Session_Token_InsertStr(ppSt_OAuthInfo[i]->tszUserName, &st_UserTable.st_UserInfo, nTimeLeft); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,用户:%s 绑定TOKEN:%s ,插入会话管理器"), st_UserTable.st_UserInfo.tszUserName, ppSt_OAuthInfo[i]->tszTokenStr); + } + else + { + if (0 == st_AuthConfig.st_XSql.nDBType) + { + DBModule_SQLite_OAuthDelete(ppSt_OAuthInfo[i]); + } + else + { + DBModule_MySQL_OAuthDelete(ppSt_OAuthInfo[i]); + } + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("启动服务中,检查用户:%s 绑定TOKEN:%s 过期,删除"), ppSt_OAuthInfo[i]->tszUserName, ppSt_OAuthInfo[i]->tszTokenStr); + } + } + if (0 == _xtaccess(st_AuthConfig.st_XVerification.st_XCDKey.tszKeyFile, 0)) { VERIFICATION_XAUTHKEY st_AuthLocal = {}; @@ -482,6 +530,7 @@ int main(int argc, char** argv) { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("启动服务中,授权文件验证失败,授权文件没有找到")); } + #ifndef _DEBUG //发送信息报告 if (st_AuthConfig.st_XReport.bEnable && !bIsTest) @@ -501,7 +550,8 @@ int main(int argc, char** argv) XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("启动服务中,信息报告给API服务器没有启用")); } #endif - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,功能开关选项,删除功能:%d,登录功能:%d,找回密码:%d,充值功能:%d,注册功能:%d,CDKey功能:%d,公告系统:%d,动态验证:%d,多端登录:%d,临时试用:%d,黑名单功能:%d,普通TOKEN:%d,硬件码登录:%d,硬件码绑定:%d"), st_FunSwitch.bSwitchDelete, st_FunSwitch.bSwitchLogin, st_FunSwitch.bSwitchPass, st_FunSwitch.bSwitchPay, st_FunSwitch.bSwitchRegister, st_FunSwitch.bSwitchCDKey, st_FunSwitch.bSwitchNotice, st_FunSwitch.bSwitchDCode, st_FunSwitch.bSwitchMulti, st_FunSwitch.bSwitchTry, st_FunSwitch.bSwitchBanned, st_FunSwitch.bSwitchTokenLogin, st_FunSwitch.bSwitchHCLogin, st_FunSwitch.bSwitchHWBind); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,功能开关选项,删除功能:%d,登录功能:%d,找回密码:%d,充值功能:%d,注册功能:%d,CDKey功能:%d,公告系统:%d,动态验证:%d,多端登录:%d,临时试用:%d,黑名单功能:%d,普通TOKEN:%d,硬件码登录:%d,OAuth登录支持:%d,硬件码绑定:%d"), st_FunSwitch.bSwitchDelete, st_FunSwitch.bSwitchLogin, st_FunSwitch.bSwitchPass, st_FunSwitch.bSwitchPay, st_FunSwitch.bSwitchRegister, st_FunSwitch.bSwitchCDKey, st_FunSwitch.bSwitchNotice, st_FunSwitch.bSwitchDCode, st_FunSwitch.bSwitchMulti, st_FunSwitch.bSwitchTry, st_FunSwitch.bSwitchBanned, st_FunSwitch.bSwitchTokenLogin, st_FunSwitch.bSwitchHCLogin, st_FunSwitch.bSwitchOAuth, st_FunSwitch.bSwitchHWBind); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("所有服务成功启动,网络验证服务运行中,XEngien版本:%s%s,发行版本次数:%d,当前运行版本:%s。。。"), BaseLib_Version_XNumberStr(), BaseLib_Version_XTypeStr(), st_AuthConfig.st_XVer.pStl_ListVer->size(), st_AuthConfig.st_XVer.pStl_ListVer->front().c_str()); while (true) From d7c59baebd29d387ebd2525960b854cd1b89f20d Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Thu, 20 Aug 2026 10:19:46 +0800 Subject: [PATCH 12/15] fixed:delete session token failure when time out --- .../AuthorizeHTTP_Get/AuthorizeHTTP_Token.cpp | 2 +- .../AuthorizeHTTP_Post/AuthorizeHTTP_OAuth.cpp | 3 ++- .../XEngine_AuthorizeService/Authorize_Task.cpp | 17 ++++++++--------- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Get/AuthorizeHTTP_Token.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Get/AuthorizeHTTP_Token.cpp index b52cb33..ed24011 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Get/AuthorizeHTTP_Token.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Get/AuthorizeHTTP_Token.cpp @@ -177,7 +177,7 @@ bool XEngine_AuthorizeHTTP_Token(LPCXSTR lpszClientAddr, XCHAR** pptszList, int } Protocol_Packet_HttpOAuth(tszSDBuffer, &nSDLen, &st_OAuthInfo); XEngine_Client_TaskSend(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_AUTH_APP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求关闭TOKEN:%s 成功"), lpszClientAddr, tszTokenStr); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求创建OAuth的TOKEN:%s 成功"), lpszClientAddr, tszTokenStr); } return true; } \ No newline at end of file diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_OAuth.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_OAuth.cpp index f0424f0..962302a 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_OAuth.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_OAuth.cpp @@ -78,7 +78,8 @@ bool XEngine_AuthorizeHTTP_OAuth(LPCXSTR lpszClientAddr, LPCXSTR lpszAPIName, LP { DBModule_SQLite_UserQuery(st_OAuthInfo.tszUserName, &st_UserTable); } - Session_Token_InsertStr(st_OAuthInfo.tszUserName, &st_UserTable.st_UserInfo, st_OAuthInfo.nExpirationTime); + st_UserTable.st_UserInfo.xhToken = 1; + Session_Token_InsertStr(st_OAuthInfo.tszTokenStr, &st_UserTable.st_UserInfo, st_OAuthInfo.nExpirationTime); Protocol_Packet_HttpOAuth2(tszSDBuffer, &nSDLen, &st_OAuthInfo); XEngine_Client_TaskSend(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_AUTH_APP_NETTYPE_HTTP); diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Task.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Task.cpp index 76c9051..704c3b9 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Task.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Task.cpp @@ -64,9 +64,6 @@ void XCALLBACK XEngine_TaskEvent_Client(LPCXSTR lpszUserAddr, LPCXSTR lpszUserNa void XCALLBACK XEngine_TaskEvent_Token(LPCXSTR lpszTokenStr, int nTimeout, int nTimerenewal, XENGINE_LIBTIME* pSt_LibTime, XENGINE_PROTOCOL_USERINFO* pSt_UserInfo, XPVOID lParam) { bool bRemove = true; - XENGINE_PROTOCOL_USERINFO st_UserInfo; - - Session_Token_GetStr(lpszTokenStr, &st_UserInfo); //自动续期? if (st_AuthConfig.st_XVerification.st_XToken.bAutoRenewal) { @@ -86,13 +83,15 @@ void XCALLBACK XEngine_TaskEvent_Token(LPCXSTR lpszTokenStr, int nTimeout, int n } } - AUTHREG_OAUTHINFO st_OAuthInfo = {}; - _tcsxcpy(st_OAuthInfo.tszTokenStr, lpszTokenStr); - bool bRet = DBModule_SQLite_OAuthDelete(&st_OAuthInfo); - - if (bRemove || bRet) + if (1 == pSt_UserInfo->xhToken) + { + AUTHREG_OAUTHINFO st_OAuthInfo = {}; + _tcsxcpy(st_OAuthInfo.tszTokenStr, lpszTokenStr); + DBModule_SQLite_OAuthDelete(&st_OAuthInfo); + } + if (bRemove || (1 == pSt_UserInfo->xhToken)) { Session_Token_DeleteStr(lpszTokenStr); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("Token:%s,用户名:%s,已经超时,权限级别:%d,被移除服务器,移除类型:%s"), lpszTokenStr, st_UserInfo.tszUserName, st_UserInfo.nUserLevel, bRet ? "普通" : "OAuth"); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("Token:%s,用户名:%s,已经超时,权限级别:%d,被移除服务器,移除类型:%s"), lpszTokenStr, pSt_UserInfo->tszUserName, pSt_UserInfo->nUserLevel, 1 == pSt_UserInfo->xhToken ? "OAuth" : "Token"); } } \ No newline at end of file From 93497dca64323f6d744736730f03c580f9cacf63 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Thu, 20 Aug 2026 10:20:37 +0800 Subject: [PATCH 13/15] update:sql file --- XEngine_SQL/mysql.sql | 29 +++++++++++++++++++++++------ XEngine_SQL/sqlite.sql | 27 ++++++++++++++++++++++----- 2 files changed, 45 insertions(+), 11 deletions(-) diff --git a/XEngine_SQL/mysql.sql b/XEngine_SQL/mysql.sql index d0c6419..194eb21 100644 --- a/XEngine_SQL/mysql.sql +++ b/XEngine_SQL/mysql.sql @@ -3,15 +3,15 @@ Source Server : QQCloud Source Server Type : MySQL - Source Server Version : 80046 (8.0.46-0ubuntu0.24.04.2) + Source Server Version : 80046 (8.0.46-0ubuntu0.24.04.3) Source Host : 118.25.14.242:3306 Source Schema : authorize Target Server Type : MySQL - Target Server Version : 80046 (8.0.46-0ubuntu0.24.04.2) + Target Server Version : 80046 (8.0.46-0ubuntu0.24.04.3) File Encoding : 65001 - Date: 30/06/2026 10:05:45 + Date: 20/08/2026 10:18:42 */ SET NAMES utf8mb4; @@ -80,6 +80,24 @@ CREATE TABLE `Authorize_Login` ( -- Records of Authorize_Login -- ---------------------------- +-- ---------------------------- +-- Table structure for Authorize_OAuth +-- ---------------------------- +DROP TABLE IF EXISTS `Authorize_OAuth`; +CREATE TABLE `Authorize_OAuth` ( + `tszUserName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `tszTokenStr` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL, + `tszUPToken` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL, + `tszClientID` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `tszClientKey` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `nExpirationTime` int NOT NULL, + `tszCreateTime` datetime NOT NULL +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of Authorize_OAuth +-- ---------------------------- + -- ---------------------------- -- Table structure for Authorize_Serial -- ---------------------------- @@ -127,7 +145,6 @@ CREATE TABLE `Authorize_User` ( `ID` int NOT NULL AUTO_INCREMENT, `UserName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户名', `Password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '密码', - `Token` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Token', `LeftTime` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '剩余时间', `EmailAddr` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '电子邮件', `HardCode` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '设备SN', @@ -139,11 +156,11 @@ CREATE TABLE `Authorize_User` ( `UPTime` datetime NULL DEFAULT NULL COMMENT '登录时间', `CreateTime` datetime NOT NULL COMMENT '注册时间', PRIMARY KEY (`ID`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC; -- ---------------------------- -- Records of Authorize_User -- ---------------------------- -INSERT INTO `Authorize_User` VALUES (1, 'admin', '123123aa', '0', '0', '486179@qq.com', 'DAFD2A2DAD', 1, 13699430000, 511025198881118888, 0, 0, '2022-09-21 15:06:45', '2022-09-21 15:06:45'); +INSERT INTO `Authorize_User` VALUES (1, 'admin', '123123aa', '0', '486179@qq.com', 'DAFD2A2DAD', 1, 13699430000, 511025198881118888, 0, 0, '2022-09-21 15:06:45', '2022-09-21 15:06:45'); SET FOREIGN_KEY_CHECKS = 1; diff --git a/XEngine_SQL/sqlite.sql b/XEngine_SQL/sqlite.sql index 7d868a4..47ab23b 100644 --- a/XEngine_SQL/sqlite.sql +++ b/XEngine_SQL/sqlite.sql @@ -1,7 +1,7 @@ /* Navicat Premium Dump SQL - Source Server : auth + Source Server : SQL_User Source Server Type : SQLite Source Server Version : 3045000 (3.45.0) Source Schema : main @@ -10,7 +10,7 @@ Target Server Version : 3045000 (3.45.0) File Encoding : 65001 - Date: 30/06/2026 10:05:03 + Date: 20/08/2026 10:18:57 */ PRAGMA foreign_keys = false; @@ -76,6 +76,24 @@ CREATE TABLE "Authorize_Login" ( -- Records of Authorize_Login -- ---------------------------- +-- ---------------------------- +-- Table structure for Authorize_OAuth +-- ---------------------------- +DROP TABLE IF EXISTS "Authorize_OAuth"; +CREATE TABLE "Authorize_OAuth" ( + "tszUserName" TEXT NOT NULL, + "tszTokenStr" TEXT, + "tszUPToken" TEXT, + "tszClientID" text, + "tszClientKey" TEXT, + "nExpirationTime" integer, + "tszCreateTime" DATE NOT NULL +); + +-- ---------------------------- +-- Records of Authorize_OAuth +-- ---------------------------- + -- ---------------------------- -- Table structure for Authorize_Serial -- ---------------------------- @@ -121,7 +139,6 @@ CREATE TABLE "Authorize_User" ( "ID" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "UserName" TEXT NOT NULL, "Password" TEXT NOT NULL, - "Token" TEXT NOT NULL, "LeftTime" TEXT NOT NULL, "EmailAddr" TEXT NOT NULL, "HardCode" TEXT, @@ -137,7 +154,7 @@ CREATE TABLE "Authorize_User" ( -- ---------------------------- -- Records of Authorize_User -- ---------------------------- -INSERT INTO "Authorize_User" VALUES (1, 'admin', '123123aa', '0', '5', '486179@qq.com', 'DAFD2A2DAD', 1, 13699430000, 511025198881118888, 0, 0, '2022-09-21 15:06:45', '2022-09-21 15:06:45'); +INSERT INTO "Authorize_User" VALUES (1, 'admin', '123123aa', '5', '486179@qq.com', 'DAFD2A2DAD', 1, 13699430000, 511025198881118888, 0, 0, '2022-09-21 15:06:45', '2022-09-21 15:06:45'); -- ---------------------------- -- Table structure for sqlite_sequence @@ -175,7 +192,7 @@ UPDATE "sqlite_sequence" SET seq = 1 WHERE name = 'Authorize_Serial'; -- ---------------------------- -- Auto increment value for Authorize_TempVer -- ---------------------------- -UPDATE "sqlite_sequence" SET seq = 41 WHERE name = 'Authorize_TempVer'; +UPDATE "sqlite_sequence" SET seq = 1 WHERE name = 'Authorize_TempVer'; -- ---------------------------- -- Auto increment value for Authorize_User From 28b91c4a2577cc8501e8d7ec2379bc6be182bd5a Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Thu, 20 Aug 2026 11:28:26 +0800 Subject: [PATCH 14/15] update:read me and document --- CHANGELOG | 22 ++++++++++++++++++++++ README.en.md | 1 + README.md | 1 + XEngine_Docment/Docment_en.docx | Bin 152537 -> 159209 bytes XEngine_Docment/Docment_zh.docx | Bin 158974 -> 162072 bytes 5 files changed, 24 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index c2b92b7..4fcd5ee 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,25 @@ +XEngine_Authorize V3.24.0.1001 + +增加:创建客户端ID和KEY支持 +增加:oauth 支持插入会话管理器 +增加:撤销,创建和更新auth2.0协议 +更新:依赖库 +修改:http 的token验证不需要需要传递设备类型 +修复:mqtt连接失败没有响应的问题 +修复:创建顺序问题 +修复:ql扫描问题 +删除:客户端用户表的token + +added:create client id and key support for token +added:insert session management for oauth token +added:revoke create fresh for auth 2.0 +update:depend library +modify:does not need device type for token with http +fixed:does not reply when mqtt connect failure +fixed:generator order incorrect +fixed:ql scan problem +delete:client user token +================================================================ XEngine_Authorize V3.23.0.1001 ci:add agentic workflows for issue triage and auto fix diff --git a/README.en.md b/README.en.md index a7dd4ea..2b71852 100644 --- a/README.en.md +++ b/README.en.md @@ -50,6 +50,7 @@ feature list: 18. support dynamic verifaction code 19. support mulit login and merge time 20. user bind hardware code +21. OAuth2.0 Verification Support ## install diff --git a/README.md b/README.md index 67d5dbf..8a73f18 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,7 @@ c c++network Authorize service 18. 支持动态验证码登录 19. 支持多端登录和合并用时 20. 用户绑定硬件码登录 +21. OAuth2.0 验证支持 ## 架构预览 XEngine_Authorize diff --git a/XEngine_Docment/Docment_en.docx b/XEngine_Docment/Docment_en.docx index 9a988725ba74f68eceb023667bb528677daf6326..3e5c7b1893b37885fd720544bf874543ea96c54d 100644 GIT binary patch delta 136153 zcmXV$V|*Xa_x58pw%OQjoHS{y#tCB|C57Hf@yH!aFHYL!pDk~8ygYth*xT#L z$6Y&NkN=XxWS!L8U>MLBY8$!jAH`v=yH@2ute<8eE|yBt*~@oi^NQ8c>DxW(my46v zLk)_3v5lqL1!zY5?$;cAiOeQPb_TK^>22dexOYbDgx~w0=wxq?ZgugVwnUc@PocZ? zQ7sk!w0sY^#1Thf8gVDHcBv-qP!h>gdz3aBmtJxD^`ky+=sj-C?CbRF*K4z{>%WSZ zeP9)^r*+yrVhie7aDbv@W;4SVOVE=vW;@*N6MxpgGf+u`fmd$Sx&A*xvSNJb%ad(PM4kULFv#N^`+;c>FWF;Z4i&8 zzRzc7z--Qehb85R5XUpE{(le7rO>#QqHEa3|*gWvg2Ic$=K za*jef=>+>{%f}TbJ(nYz%A!dam&^R>`)l*monFH33P}s}%CrV`{9{bcswmIjeLH@t zaSc%8_42nP)Vu7`OSdm!(3GR!1JdEa`SS7CX_0kfM=bfZF8mU=8F5-Cw0(O;;ULLA_waX^OD{W_|sMcn<#T2z>Z2 z7I|N-PvD1uV2V+alf|QYPu&-V=h1$Z4>nCJ^vX%SaDyBE)U}ap#Osg`C$yq%>*)|# z;5)Y*;nL(>c^>`5eEB}GGoMWEkm>z;&mQ#VcLbx=wI`0V?UXj^7V$Z!icRwKe%IKS z4{P4rg9zahaWcE(Pjyj$`mRY@LHQ#pTWn;+V|}(-^~uW#7Wb<6xwz(7Gv?cJ$|xYBA!Y|_du2uM@md^-DF7RNNLV~<{o(h zRY7&rjJ9R7z$)LLZ+d#you){1zzgkYjaJA4$v}BJapdTa9yG^6E+KNad5*uZNjD2# z4%=gePywSxG67gw5rE%I+Af0~Yq+ttL9*Ap;Hr&g)hMfVbtSQLPa{ovk~S>(F9@H) z#Bv^T?RwfC3!8Ty6A+6noKK~>$XWA^#yK*yt9qr&CMl<&ET6^+JcOj zp0GAq60DgXY#?^Bc)XJ~CQi2&JWK)~#_RK148Dtb&HzVe+TgB3S@=UIq0Fkw;pLQe z!-_WUl(w+_bWZaXT%)r#(}1cc;u*yWG>so_SK@}~ev-?w_7)nkrC!DlV-NUqiYYIH zJ1+kX;mh7*TaBTcRNa{S)Jy!%d83NYg5yeb-_}Cz>AursOP;nso*XaIqXR!XVYk3S z#X(02Rqi}x7=aeG!2-Y zB2xuKZcx=DZPtWO%!?AUylR-GOS>#G*1L>H-mql-z`%1m9Og-dXbttZ!vJpuUk}YE zz*rQ|QcgcC0$+%Q+;){Y@>Nt{L2gYwm>fJl2gq^GT;rE*Xcy`CnZ&@Z{K4MHhRv(( zFu^tqD^aqUYfD6IRAx=^DW~uX8Lil|IlB24O?F~)ecL#?eHi1?jJ+Kefx~kugA(Tfa@W-61a{3S(GH7eEf6My7THU5is|1FxYh} zuy*inm)Uz~l*Od)to>P*(CJ>wklpDJ?Z4KGpm?VD!cAs*X2c2`oxj04qd={bu0T0+ z3v<`9=KAYLb|8fskF=zH2^o&dpI!%9#KSpsdAwh=k$^2i{^f+@1YbmQh+^C!1x^+m zALV7 zd>E=c4)NvKW*Q%7!yi^9F;mAH`KOa2!>{zZA6c%(MT+5{>^Q#l*hse!cBK{gn9HjBhIvEW z6hkwwM)z#A&{LQYir|%F7T(3+8MK8B$^iTB^IS&)mE7)gn6)3+TweyPwHJ+ooO^5c zkhTAGJMlO3sR#c|^nbFw+hrReJ#?s+c>r6^fq^#R7Upts4uH_(LqP@%FFbfdGJ0MA ztb_1X$kX9Wn2Tx#pY)Q?z-vU3mW2$o-(j1=Q_hXG5n#(xL;TORe8H@9&%xS$X;NXe z_$KdNi-Tr!U9l(gOyIX4{(G!LBp?3HPT0P82ONg;v+6t}js& zg}EZC%gZBuSEn0VapD}E;HSK)Z4?(oO3G~FSdQ@9sXc32FC5M zN70A!aXR4Zv>_`&UvBr=k9dx?dQ^4ZDXSXWSL}P>96Ruwdi-o+J~wW;hKiTLC{PeH zY~4nS=#}_uqqtH81Z+K5y~Y&=Rnt63`0lXlZLzhyQR6Lo;G?|09%W_KfmrW{Q%rx` z@cl(QF>e$X9}=QUslXYBgWGsE5CMhrJj7oogKqelqd!yE7~Sw? zoFV%GSXswE5fJ?Z!5>AoCr#>nQ24*%!?+FViijfIs<2F@f8EI?SZ{_G!A%jvHHc6n zOxZ!$+PrjL)U13&E*0apxkmE!@LO8AF<~Z7Q6Vg?q~k7#Kem~mlpy__CjOazm%Y;G zC_t_F*C2R>Y8vv4BFB|)?m~y2u2hcGEzLv;_~r<)MGV&>!nX3=VfG`C0DA84QZ-|Y z(E(^|dcKa>@72P=tqL!3YoW1un6k4a*fNgHk)SV6V6SNdup`J=>g#KKZ-9#UhB#+; z)P24SS_f&VIHgCP`mmm$?Yr1j$TKBvB|7#yB=D}agnb8 zgEUdSmYnr{A6NKK0;s-$7WJWTX77j1+XPv|ptYF79{Y7TS%Pn$MA=7Fv*8!{V=LWdAit3T`+a zFG;)n&%FU$(2!AMs@;KCtL5sAD(NFoyH`~53%r<;TX)L~i-ckUhc&#owgJ1z(U~z}TS#t>$Dx*>OuVU5Aac#s^h7q&uxPvi=0(>$}hM zK|T=Y1^f__j<4E(K@6b{-S14xkWPWV=tJv4Ye76qh>E)R6SlohL_F5@L{8blLQ?AS zUr9ulv|RtI>6M(!GqMI)2O|Pk-QJxaw#mXfFxYOj2pHfi65n5;R-|}m=0ASQ^L$Wt zXPRavjuTTimyhd82HaYKH(u<)~ zkR7n1_ESm_9R!R@X?Jd&=SOe4QW zj!p2=6V!~9?g6Clm8j(Q#$}v7@iHz)yx$qsP?2CA|6o#CCqkWEqy{nj)>xhEA0LSE zf=*sZ@Gt>Xqd<+iP@s>v8y;aPH~RR6GqLU1v+1za%{}D#%s9*kqLy+tVBeb|UZNp} z+fh)B1Z;dn=%87e~Y?@YFjED|Yi;nk1zNE%V-nSwV{|e z8e~5u`+&L$$s;XN?7y!eVrwjn;gzCom9O6Yc>N^kZ&t@63*<)Fhjqb1J4`7+bQAP% zcKY+E53ZyYa_F?8JOU~A-AS08wZs@;qGXG}%oWWH(=N_dACIWwKH9-kO zLYE?S#V{hEsw*jkwcjmoCG^qy!vs0%8wf$h7P{ zy&_vuSo)kpMG1z*OJMNWWHI7g-~4~f%;{V%P6L$>*Ic9dcm`g$OH?`WXJk#G4h8|I zFirV)oLDvlO>$_|4s;HDOM?FLGlYiYaunOO&|Tnbkl@@yU%}U+eoAO;EvqD3T4Fh{ z6a4B$Cbe!Oa>y2DvWy;jac2{L%$Y*+9RA2n&-=(ve-1Hsx7sbSTFACd!G`?zi${X~ zdcX|fbW|@o*k)i4_t97I&8Q+-*)xOQYp!eCBVu;v@_q`8tUK99_`5ir`omk3Z_x+S z3~7fst$6s|BFxL*{ZO{{paz_Y(tpS?OZjA{_x+TyK?O*Vt}u?iek-vH39&(yhNvSL zccsWYN*Lmgvl1mWCBAm%S?nM($rh#=76Dw?IZOf-(f_PNEf)nxft}t52?v4p)Bb4A zAlE67ChSolyn-RaFOmKWO%1Gr34~|@>SBrgj{qGrrTTu$SZaZ4ABfa~LM}%E#CnBt zTHBP_e>EWB$4x`!1$Rl7k%j86XRxRMS>!LnC=r?w=ep$s(O;l?@fYc^1tn^Y6v+4| zXKCuc#QPZwGg39Cs1n6DLsF!V(|bkKsPbA)RE(S*;h`P`0n2dS?aB7NXPUDoJx%0?bJtSo;M1oqwXH_Y73^8gZ3; z^zb>n0$aeKcdYqZZ(s0Wr;@4(W|YQ_8?K{?|=P zkXB@KTrmJE_SL*0XRBN;HVCu)oeXfe#+V}4!xdQ(+Z19v!g`T(_%XXa8#B;QPb01E z0d&?elocIziVsIU-=dkcS?}G@Ru0n37_sOoK3IcK#cIYvv=xio=w6>4tLB@OLX30O zB*%}26yn%Wj_$Xitbe@NB$5ZeWEW%`nck=FDGg*?ap zWhHPf%Pc}{JQjhN7&+@SK7E`nXQ-e? z1L&2Y?QS=vNPjNhk$)kKc)rd4RQ^AsD`DJBy|`nRAC4^+yxn^1dc>f0&LA8PpD7N+ zPe6F^a`KdmKNVeQLK!L=HO*+!oVu=PrchLPK{OCmUpO=E^VI1>1S?rRyf!egMyU;55<#Mv>Qng+c*C`<_#RRQE5u6jto|C@H$yh=spd zOiGqra~`h$!C#VPbjbs&^gq|#p$$w-P$yj&~Xa{ z)w$yQ5{hbHgcxV$l9;Lw$4}A z%vxaV&Aw#~uFP2o9=i-raHbWBJ#s`JfF7n_IfcDQr(k0LPm!tHXq!}xn8IQVs{{S1 z9bo7Ax$7XwS%8pr{N9&n-O4_02a^LST8x0SU!)Np)4oBhl%VRAK#%bb83IRJ1!j-M z-ig1TPu&(FBBsXGHIX5hvC&P*H@+a-ZynN*JB-GEU2Z9geN{j?o%B)OI6#zEt?|kte$UGPD3xDj|Z?p^Ef-ggg zaM4hMFGm$g+U)(*QkO?h{*{dtY3+BGAL|3LU%)?qbH0ga0a*(xYBMDZQJaoRU>x8* zT1^Dhe@8=x7_@PWL4QjKUk91}*I|TC|JPyKYDUDpX&H(-k&uJ=wZIh7M0)ezjxMR}YRtS!dO z?XXpD*e<-RoG`A|Ef&&iyT#PrIf!R# zK-G|)tAE`NN94jU`Oc}fyd0iju*^}eD<4TVm)N``c^gaZr3DCP!O-Pb{!OEk54TsI z$N&SuO4y-KWEg3+b! zZi8(CfO};Jwz@nsRC7Z) zzrMwy1M$Gs3-6!&hni~Rb?tBUZ!$2;AIWqLC{@l&Zt6#Lyp+0sd z2ETBp?;%v&_EhXlzCN0)4BdyPb(Xj)>;qmK%FofQ{+^eE41EHr+Oy)oF(q&2sqCbgXJ=W`f;(+d5Iw`%G2qk;&ryn7a9F zg)SWEwJ@5XlQL1z&B5?ton<6S%e3>0QVqM>xTrT~Ie+CViF2F^6u0UAv|;5 z_>Db=X4u;={3Kw#wXB`cd6d~&2dP3F6T8qX&xb^cj;s`SMU)AeT+RP6 z=u)FBZ=$o(d24$qw<%1)Fx^`D-swwFn0(5k1;yi$afm1Nj#Wp~QUVu+z#vc1cLe49*{ zTS6R>+Vr)T(bxX?q-)JfKt)G;W124-N>%4wH{4!HTG!3Y75U~a_|HwZQlPifkGlEV zPw#zI$j8rbbk4D0l*9q&t&0cu$TWD7Vz}|Hd{i z;vTs!Qu`t9T9$wNyPZcq_y~!((oHW)^w*MOve480a@eS^DZ`^7o^iEMEZY`TM;Uzn z#?5Ta1=2tUJZknAdcoW*dD(Pg?lzBrr@n9w?W~?Z=NiU=sHOlIS;V-kNm;%^S!W1j zbm?kU^*Vo*!$6W}NnO)Pz69vd{N`|ljs{IG%A z;RTb-w|VtUowJQ3+WDUZu%hjM896$a0u}z61}XbC7;@2&0hrk zWs;U~@*FF4FmdFr&F=HMQP)?n76Owe=%ii`O;$yIt{%{7FIDw`M^I$j2C@}kHc zIg_wIrshEF>~#OXtrmXm%My1wlt=M~MDUZQoz#oAsx;%HJa;2lHB$17iMNeA#*tRK zjW1&P;&e|(1rPG5sFB2r`vQI(y|*rVuBz?0*xG##Z8wBtXmwFJf}qtjM;%%3i9*SG zj4rpRZWnj;M)RT=!fBf}He{DCy3V1xSPHVCsnUS{Jp9a`LE9fO>D9}+{OI;i;3sA5 z97yZNoxHybksRbts|jB)DBVPV#oY8M^4K%3Yc zb?(-+lSTbuWl`&};O4T>eD8)8+IntCGo z?yO7Vh}LFv+Jy!bA5k%H#Xap(MqW+_bmlYL^rtI}*mx$7ne2PqfIlw(Cn zN>QWKAKQ3(K5ALwOxES3b|9s+U z%hHkq>DD4|fBMOaIHtFhE4AU0Rwdd{au;;Fyob4F$ucM)6G(jd@o4@M7 zp0IIbb%JOMOsA2#CR=pyazpd5$u}Ru+Yv@LT=;F_LD$txIx1L`&dVfGXM$fh} zeg<2g#Wp=XYqklZZh>={NQ7-VhT{HS`A%bVSWmiPiuex$33C>3$w#sYv~@j95|>ZL zwtL>cshgXVARC)m>vd_^lBMW>9UY}V=O5d-rXAAIdva$(UvzVE-Ya-Y{xT$TP#wmc~*+eh}5%YN40y%@B1cy@kS$aRDEH7Rrpj0521@MN4OmZGEI! zCyTt;X$*?Z2lY*GL(8a-k0{Dpcb&s3WJvB)-=InAhW4%H0eZaeOK;~p)GZ7Bgfl@N z3E@LS^mS@))!jAszpFq!{QO-gS-vfUdWpOfFv~Hsy>{<=o%ZR`wpxRQX6ujdjJu(H z%^O?@ilJ?5B+v<7fDuOxKXGXwSizyiDVoT+<{AlX$?17b!o{)%Q}3OnCoORALrG0v zwJTLyfmUdRWP?4?J1WVTxi7`GZvGrO6qWGhF;aZAJb2_D$1cwK#s{B?tJ9f=Fy@?c zk#8YvTDdX^M*jKcb@8(OaT7TEioCh;{9C7Q_=RP=g+}WNus|Ok-}bU>`d&HLjlieV za*?;6B^|0^$%lY?YjZNQd(*t~{V$I7?JCkr!Fn=cO^5T={W$_e-|cbbN_u&cSN*yI z+)Qe3Wz+lK)|Lnnle3U}4L<%!uIxAdycM?|rz9CrG(`1lrta4u^-#T}nYUO3BV~ zwr#EfnfsWB$WnJ`3h^IO84hfbhXLM}DT9mX3fC_DQB3*oA*NiWt*Z|=v%^StjWvUt zZ&7UHi};}WaeI9L6)Y`N!nBxmMi7prT))w#1By`QHzH1(Z2bNKk4@YB7v`;^>cu;Z zzFzD`8Zo^Vdd}V-F5M?jSk!%&LFtTUO|?Ey;kxiKbwX&lv85 zi|I_Sv~Q<*>2tZ%H5ke%C2@GyYD+MYZdl%-nK~%{v>P`)!MV-$lNhaKB(0MqAbtO+ z%71Yyw#q|^c!2He_4m|hWiQ{yUE6j$qet69c96FFsf?e5{MPxzPr+Y8B~_wScFbzP zv*b3V=AO8Eo3C6U2xt2)cf5nc^%iQM=$^z9$YyACJE!Wx{hP$|f-m&&@>N^%l!F zO%oz1ZbmGfcKGkM0S13F;d)EqaTzdr(M?EA=;)mR^(rR!c=0hf|C$W$#M2o8y{yWX zE=_N9@>12_BO(Iv4lQ_l@{dbn~;3%Ws`Uv?|g zl#MIFO-tTn41tv9PaYQSf5(9wf1_J-|1}>#dFgw#>2v#%*<~j;+33=GTm*c}F1H@} zq9l@{Nwd?t-`-wB_|TP{xS^)36xkMYKCPB2zAuvaig+l-xn z6_hrG-40o#t=42MjnguuoClztu8XDn<4L@7VGJ^%GktHRqVYYh(e_kL<)&vnFn^ZZ*97q*;vR6dw4Gd?id-<@7ADIYP6 zt!??o(NjH$Mm34i`f0(~h{ZLvz|ohJo?Z+2Xma1eSM@mdq1B??G}C_XEjwq3Jk|Uf zbfx#r(9OK)&kQj`1q z0pCcu4td^_QF8ZytrO5THEY8pG(e$@p@`$^BcM+b{^p+VE&L!=Iw~M<9TlgMw6DEj zX0D}WQolc^SFz-Lo7pOd()GN4GnEEzW!vU74ZCy7@#09Eq1|G9JWgJqU6dCXQ2>f8 za$(Z-EDaFcf1Hs~e#W{_B`0V+>qNd7bz6L%M{$xncq~_%v;f#+cdxTP6s;2kYF)`- zw7ocmcUG!!oZBwykzq+JY+XtjjQg8z`2_WpEi3VhH)|X-Kef( zr2XnO6JIoaCg}P1=lfk8Eut2X?Z(WEz<2YTX<%7IUe_j+hYkm(+1I;`FqcQGAy(?& z^_10F!6w{>1OUv=^7ieW0f2lkvA$s@Hiz{&|5# z_LNOWtK}rvrC`H#D)=2+k2rj+qEVwfGxSVmW>Zw(%=25!l--pq$Gs-e7&L35WC7s{ zEhftTF9LJrwv)ar1m)q)+G+-}erJvWoRdpyM_xM|set`-h7D*7k`|k$2DSdQT-dg` z+_fkwz=RhoP!dmSq_z;Vs+34>q`Mvstu2M}T`ef0UNShs%I5hSKJ#q}E@qjJ#$NgE zeZGpw?fULoF;QIiV(?_MfCAvar(%wxBL1FGIpC-*)M?DsSo_D(jgPYUh?D@{XQg!% zYmmhD0}#hpeVKr~9S&n7*j(L-3S*5jFZ**3hC{!pl)nykS|w4Y*UT9Xg0&vll&P&< zqZb!AkZjmW=dtG@^C{8CvQfmq%MWZ8w;b=?yV6^0A7ND7efoac5m@L%yMp^QvgG1% zkWr=Cw6=~N&vf?rLkX*Y?#3s7cdrOpJA$!_5+H~eF(Ran42i7hAj~{-pXzsZ0%@n5 zP4>T!4l~V@g|+a?KYH9OvFHx+I$dtOXTQBv&1n+SZ={8hd+p<$K)MmvHR4n=mMPkt zgnnh^*YeMF1(NrsN2}Vcv#mN_$WA8C(^d=dg{#a=#lI(1Y21&yYcVv)FT4s7Hjb^t z0aDfM!@oN<8{p=%s|$>s#CgX?-3_o>>3e;pW_>O?xGzLR)^BKcBrb?Qmn_V(eH`5? zWI0KyF<6m3ZeP~jgyx8+k`&vye3U#6{axq+`T88swX9gKS-ETTVYIDBp#}4#2laIy zOFA@I4-fdn_w?H5#xVI7ORbVyBKpMOx$quL9#~(>@Bi6XfA?6~~6G{qi^*=;Z*kEZeOlitJ zQ*vBhiNrd!@66X}@;?4lNS=?Ku)W-{Tqt&1KKJ6hIS8*bDX_jQj-PitwaT6W`YFdq zaN=WOxrF+9ZoMmhE|AnGhfA?iYu&g1dk=+OXFh+mcd6;5mx)r>zgow>$1q$zov9lQ z#)Ta{&l|A?8=0yNLn&_V!NXBj>N6>TCP!CH&DwXxDz6q~Zi-K=t4j>C#hyssR`J#j z$@tkv+V%L46z6_h6fy2QIS>HPVDqcGr<(mP4|J~TbltmL?U7m8*1P2vZ>2Rd-eg+# z93&EK#uDqzY(HY3@O1}=*|bwThQ>zs-+uC>^5X=Ir;G={f$m?7grv=nJR>d1|k9yg5Kqz{&%gL^Gln4tIaP zFa7%JF^4UsL&>?2{S#zU!@8{2VsY(VpdUKRp!w?3pJ`5aH<@?*X?&^eMW|WT`yp-I zxrFTcxX@NMI5qHo7u^sueX*8|v>U)TTmO9%&xvUmh2-!4_m- z5nq(m@3d%fqH~Z1pAm_~?A_|V6*h%Zmb0+15b*YXX=^K}E?HidDv&nbmW}H(@4|fpUT(ECSs`Z0j=1hohN=xvEHJPvG{9YqW0lbA z=KVJGEv=u-tV=^}eGyfllTezXmZol*B!18ZiBu!CYd8b}(}1mat&y_V!I@JXshaQ2 z>`toEsqEljV0mmKIpU0$=&@}xvB_!AoCFX`{Q4EF)}2u)bKhv%c1Nly5A zz6|>-M_#TUz@e*1FmnP61C>h~Uj#?{O9mP!u<1Y>cOhSovF@0@8$2!fpf)2t9 zS$Ug;GUsun#P4}8Q{zJ=JV`9ch%pN~&UL|T7D<(K&2;m?h$^k>VQa>WXYJ}h@NBvb zw$#ceM<+-vcynelX{(8@c;2haO8iLYacKIP-{{rKd=`iMM$LnZed&hSDRp>pwKHwe z^R=$E1q_n5H#W33RNLNrL1Z4}1tm_2^DX1EK`)CxTbI(VYR7GRwjWD8&odCm7b>%O zM25jpbqEWP+3bw((i`t!Z>wU&K(6D-Au9nPdfm5+VNuRR-voSCGX#H_n)6Fl&Dtzw z+$$!VtiQQ)$qwF`7nxa^G+-8VsOe|w-ND$;fQ5pSuq(LZ))ZCrqw^NjWVJuZ-|3Kn z^G}6Jts0p1CM2kwIC6~?lazhrD`S0n=GYX=<4OZ=dc5i{>a*2xRIg{5CaWKo6W8jh zT<8+18K=dCh7s3%;Sc2uQ(P)ZZ*pvkFno@_&t?v^l0*9}(bX zv?go%TDmY0Uuvq|?l$t$hHwrCf(pP>)*^pB>3d5I{;o@=i>0KF-`{W7kf3i|QV3ZbZBa<*C`b~<4NV2nOZOKN&k8DVs&iRYHymnB+9Hv-=X4})2L{wgcLkO z{+!AGF?jiTEadw+DSL-$C^KQR)7U=dctvEib2wmWl!TtJdIdn1x;&Sh(|8_E3fKz_Iem9v} zUJr^n%lCourpKbTJ6{8lWvrB-M;<_Q))KxRQOBX~og8gF$;4jrrW+K7=5U-?#XP(d z{A6kCk*Q^Go^>e%JH zv1`xyr4#yijn-)%Sl6x`)F+f+?uf@>-hVYLn-cQE^Lac*eCC5m%lzR_0!ylY01q9F zru^c2$k8Ug&{duG-s1M+!R9gl*?PMtYoSkjUn{ZLH)uQz-y7$VB2e$p)qd<;o(u+s z`}#}XF75tSw`xSCNvtPseF{*xECyh9jVk&aSrH;^2F9elpQN?mEeZ0xwGXqVr%TAe zKsT||$m?o!&#<>C+Ty1$j2gD)ig(`cOsDDAYVh+OMTrNn_%$qW?L*?NRW=GtYi@rT z>1E#2h#D6!qX(E(Ih_v+&uI$}OFeFGdWVE>(1i75*K*?D1h~wx+W;ol^|VwK7nx`? z5tF(8jq5wR?2(ov%1Bnqd|zh$C|{wouF>PFY3cf9$D=! zddStDkjjklTzFh6dFmQ%S^AW{pmd+cuS%6cc+*g3n90DEhya4sZYiQ^odCc0Eedcq zuJC!6{c%e2wo?sUeV}}fGyC3PKr(jIKJXyPQ4zXn8K^f11L;OS>8YiunTd<;Nqe_0 z=foX&Qg(AltF}~wPee%d7<634io+|{wN=N<3kUm4mxs#%ly(B_)A+4$bB_GhTSu)& z#}$NHg#mp4ph3H9PbLu7^UCo7@Q%6ho-6fL*&%-eu97fqN1DCvPX`i0AJ3N`>#rmq zx#84UFAz|?YnvWFGpXnQ|Dc^;rm1k!!cFX!rE(~>Y+NxBFMWOWQ4JiX3w`?g6Z8j@ zyuzi}Je;hROho+~iq>cZG>o+vu=oWcvViO(5&TSZ7n~ahq-V`x(y80xbdtjQF7L*T z;ggIq7==o~)?eGD_8+ebo1cf9+zyo*a1>kDOrrB3wYI`X-bJg4MuhyB=zx-6mAs2( z71mf(`VR{66OAW2c@1bWbMUy0n0U$;$(ZBa%0;aZtM+A|tT2Cz`pTto2X=FWZptkG+THU^mQwii}{ zBSUVrQOAj66|kb{@unpMQol^ZDLJ{WdBs2F7d(PK&a2+7lC`c}NBmn=U#Y6*-t8pI zZE22)5odP%A~J8f`J!g41k(6Bfld#fWufz+!g^l%O8IS5V^k;oN{Y+3i;2sP zT{r@3l9h+IQ3Z&At+oe5vGC`@6Z5 z{5BP=XB^#)NU+n4lpaNw7V)k*J}xm45TKKe>lrr&--4C{w4jd1Wk2#(UsT=`-EARy7$>`o~|)8 zN{(^@LwwLQ>40d;)n_yV@RGWjH5In$Tiuk+FXd@IT%x&H;D2kMp!#}x%GRhmA-$rD zbn{=+zUKW|0bO$1#uMRY@o7~IZS@C2nel4AfB5RwWXckJwbUwH4Dt`5UEmgde?Ow5xEi}S4l`0PY(Hl5f#$d-J5Rq{!0VN5e{Ukglo$_* z{D?5^lmTr5TQkR#r(iwCc1#V-o+XYaHn{oH@825ge^6IK?R8A0S zEZ?4A`~zFpKsv`Z(zipgzJwmk{{9D<>!Lcuj>Hq1ClrxSlvC0TsNbAI5ZMxQ55GOchoEGiq41?e0n;#c>GNrmq{7CT3&(N z4#QwIf4l7Qd0=<(S7+_c@8Nz6_uB&_99$#MD13nwoii#4NdcF5o?ibxtsNcY%{$mO zKknzm_*@Qj6sMXJ^D$?fe&L#}oVRA{Oru16u5Lg}gmmj}@IlH5Iwn=kmnETHxvr^2 zz+2kJjLL+_UOb@|OtpJBKiK{~XG+i*ymgGVlN!8;5`~Ghg?2>Wp&o5UGUK207v)cxL zGUSPQw9q=vV-itVymnSU_6sS5*p5*O3gdyUvg{1sNB%LYI7APq{HaEw)v6e=4(@zP z&`-(4Nk!OsjdQt!sdt$htl^Fcar-mMe`a1{csaphCUr(qS||tqRql@%S$?-M)oo5| zRiGED$cbl+8Ph;g@k;Rq1?C?xgwF4=+wzEWq|ilLIi~`3MbHmHHb^!JD0%hkZAKMg4;|sXUX?xYB#pvyY#^&_!bUlst^>(zaJ1IOWs28*=CaGp9oI;LGYH;I6K^94hHryZv@W z?)CTJwa-vjM!^%cJk$yQ@po%dmd<-YjLwUj{qhoIa({rr9Re)bhLeO90KQGtQ-N%`k_bzzN1$lIs7ahdDsXWwwuXR|PJl}WK zn>n}2NbJ3T`3NLLoDT!T^~GiCm$o-rKEj;gcd+&u8{>OMJSRYAQW!uhux5FF4{6Tt z{1S=s5PiR^Vm$QZ|3>#7v{CrBb;nxXHTg{;TQKQjk{qaDAqr^0Ra$LCVFH2PRZ3$ zGwT)Ov@TWv9<==mGan4!&h_`J?&urPLdgbvJ6@f?y!1LVs{5O3b(lx+2TY7>G=iHV zFvPqp@1$o0hB~uAekLE2IwqBcyI`RO#q~Tsb!-Ilx6^Y z8;ssvPlgAFzyv%9C}hmDc9q-+UQTW|+TEoO6wL^jJYG@=g};|G#g9Lex^?79i(&-T z`X2OUm<|pX6~cO;R?sI513z%B8LCb6(KMQjzgCEOE_L_8;Q>Tg{!h#y8F(^HdfaVlICG3BT%;WT@vKAcXUc|1~&;}G#6 zWw@=@@tR`^`*A=#(wKqOSV{(gZrn~C0cd0(sPH`ieQUFS1q=ZVlP~+HN#?Oo6H!Ky z)Rk^yisySKxC`S@>O#vfJvMnXN5X}E%{M`lTY#4Mk}DPB+O2F7sIQb`ik3Z+3jo7jlQ!NRE9A7m&VgVj*NJevRRJoHqVFj zg;&0Iq0X;=Upl=^dL#XX>I=SgAaBn@^-mRC_|}1%w;adw2)-re9XO0)j=TqUCyw=c zq`zbG`2YQR`k!@&T#(q`9uEhfC+{-hvwQy6>7T)P85=G_TCEuy8<-JR~< zSKU3WNa&RI9aY+keRrL9>a^27X{W4lyi-q|dfG=hHmL?c)aP+Px2y8Y-qDZEkAFfw zcY*DHVFTA?`zMLo8opd?;ATJ<(tUlg!O#Bpk4%`SN*CCZlapiTS#QvLldf5q^$6x3 zSWwkKrl?pZ1@wa$($Mz$^etO$(v=eZSr?@I$IUo7)6G^I4=LSN(~=hNYhX78*EN2{Bm^Cn4m;bgy| zx8W&9>P;p+)xkBHcAC8$4kwE5zAZUfN{7^WiF!9vZAuRsFdhhlAd*J5C6)E~a(^o3$KU zt>u`ATn6---1?9-bN%L|v%-m2^wAX`j0PxlnZ;USD?LBuPW>#ITnx_+k6*lhTAW+G z3Yzu3K5JWcs2}@~LTfEMZJ^6LK03UZOs>n}s=|W~KltG2Sd!)C$p`Yzd+|ZKS?+^3 zn@6>5qyzC74#U{mRj9)0j#D>tF$S~31`)#K-ObvJgbV@`^G8JxQWjZ$banGr3Dsu3 zEFuVEueoMXBk?IK$y+r$9u3ZahZYpzGE6p_9Z?7vkGy7^9m~=vJMUbNWCbOu@MVIo z0z4Oq%H;7kKl<^{fA{a+|L_ls-`;r2jkIAQCN2pZQxYa_DWo`#F}5tvMjkPR40;~3 z9cQb@*(++7S|Nd6h&*m@18W9`i4|fI3jhROW6D{DehjZgZq6i;nv3=t=MOWl6=~pdrOHVs7MH+Y`TuKwBEpr^)$5?Ln`` zv33pVFaGa;sKONQfA7Ei?C*d7{a^m4_kZ(8)!_O0AOGz?{qg@S1}Z0&Rak=g409G* zyTsSb5>I-gvn`tNt+K>_H-GV0Kl|z5zW?DL*GC)}B8&rTGn+IRYsR^5Y`=e{hlroN z({lpMu2#@f+rAoQuf;I|MwXm=JdA}NIKZ27^P zE`8f8CLa3)x`DO8e?z2DlYp8f#rwbhop1j92er`w`y^svXgN85Rx2H%XTAQVcXpOf zs_JcVO zi7&)HX|zB(Zj)qJsPyyy@#FWu^9MCk2{T{##Iu{bF`?4n_+mIno~LE7hY&M2{W0+^ z8H-tn?Ir%qfj$a`7*hbP@B2#2t-Wp$k+s_ zUb=U0gX(UX!R)<->H1ciYiMRlwf!> zsIqQD=_|+RDu?B*86uw3>EG#)R2u8l4xo zAw!KBU89<&0C~s-mLnEM$s;B>j$&wyOqI*2^s|=Bsr0XACn}$BLb{a7dD=G_(yb@L z7h{PaPvC&pyOoJ7VyWtpOVv{mA5j79&Hl6#PukgfDlUBH1A95iHqg~}J=Nv1FqS6- z#IDO&X!m}9TVFv{4E&H-`^|fqq#PM*P(!nf)gt73ki0$qU zv3M3mOC_&HDiTr-?X8Nbz&%E{2jY1_Anetj*XambRd%<~ z=Mxow*^g2ErU1luiCuMAx!maXNTo9Zf{-}CjV@7Hgm#(&Fo71hA`n&MeiS6VF^XJmP)_a}m{mpGh?Pd^JAUq%CtEw>Lz=e7_s0qjK z4APp&FUD~IX!9oQdqx)&#Dai&jdi6=f0V#a%hjd8KM&D!;D*oPa|q4!7mRo)TDYu# z%ynK!xCLBfykcNEV-yJ5sLN&43K+zp3+>Il+632c8Bvyn0J*;1K=`^aONo{?dF={d zh#Ny#i!E&?y2GU|3cNOEtI!bQ7%^*Vt8y`bGJ^%h06H+5ov3_36g$D?aGYeLrE>Hu zs0Yy7!HW^aAmP4iZ*z8yVPIUU9zb4yV%(52d((C9c0B;VZU{Yln(IE+1Dqq^&DshAF!f0kQp-sIvjJl+Kq$1_eA#Z2pJ9*qVc1wBT^Cv}8Cpk>2-Iw9 zX?GgvDrl0M@zVUa>DL>G1LC1C;^z8ajVfG2$RM|UCo*zs33h`hs=30|mam3?j8pdV z_RE66-uTxFARCQR0RiMZZn03$&K;GzhyrSPB#f#!MuKBUV zP@1W#%&S7aj{<)uh2)+IN=;$3=H-M#FAB(RwsOt*YU`?3DtzHZM&(w2EuM0l>R13g zNc^2_@VPyplAJQNvNR0b2*oXWk7gAqR;pAbSCfG3IFD{!&5A^T0F8DsJT`yIX>7lA zVQ0*U@S(~1e2gM(%vYT+dq zra7O+hQu(}jbYAr#mIAiBj}ozc(#kF2I@LN2n6Sr=d)N8E2H{PC_=zo++xH32A6)z zI#CcYgh0HrM5fSb^5Nmyc!ABm{AO2HwtpsUHS-B-D!cI@OOs zK9=e)Ue3qrt&WvWuQV2Q!sIfUBxYGxI$N;1j3*8~6ndex2vUt|TI~xq&$>#t1rg-! zbsDk3tScct5s|%BulF(QdZuM^)6+L+UBfUSyhRPWuI8geK9(^rhOyV8qiyIa(TEFn zm&T!?2!|omknX>K*VLt%T2C`Ud6@$d+{tEwX&j&^pPhAR(Ab>s{w=%grni4PZD@wJ$qv;*f|V!Q!1Przo`)lM6pYa3_WJentbR z2Sk_-_1I*_g@lGM_GZoVQx{Um_|7i5I%j?l*K|k8=|3 z=9QshRLsKx2zK=LP;w+Z4LmpS;chmOlpF~!B7k7fVojl8Jp&I3v^QC+R-w+u!QuQoKe?&ULRys0}28U;!r`=EUd-l?BXGWjs%3zLn_S17GuUEWSLjDn%Aw4_N@2S z^jwCg;C_sGEAu&1o|*Q89DL$^c=F`oC!fCjG<^8%<_y`(L)R& zqz_$x@ySQt!>8Z<^gEwCgoqRJ@H_E$u^GV#3Yj10-AckC#6Zu^ygjPxVh`xid-X6a@pPXZlyM^7ap+#a~}VL|7a|90HT}78GI^>CoQ_=E~mD zb>7*BOA#S=Dzn(Ll_^NiU!1IMG?+h4DM}fC$v4Ga>EcGtoSa0t$k?%#~XcBP3 zV%O6^XP#JJhlVbbbNMTR=VwoH}{dN>L^YPYMwdgiQu zsX4uzMhr_@*~Nxg*2;?zLd4$K(V{D-Nkm>nfeIq>dYI2tQIx)=BIjrzxxhRoKZCS@ zNPtM!Mb8ti4^wt7=Oq{S5_vtxu#3r?U9mZney}v?`;4wT5tHYE8-?6&F+N!)CQo2U zTojvFJPx_Ejz!QezLWZq=}WT%7!C-3!jQ)SGl^4g2aSD`yk+BPsc^n@Q~WRvO~U@^Ra0WLhFG*w;jsvo0>phsO6c_vn;PEfbu#4NU0l@s-vW3vXen0wr4 zuj#I$YCgVMS#phHR8i;?q_MKExY|Bq;tXysFO9GjxG(@l8)SDFTk~Pisu(+e_~c`V z!iPFU@eqaH$Kk_|y)gXlLnKWFG3;a)0zsqA$2*M7EdE^?j|dnc3vvz^+jq`e9aAoY zFhr}whDih>#*M-|JB-2GOwu+8BzXjyaG>kC!Zq4ZR44unhkyW=lVBhGI@J{hJ%69s zvMIj~y0K5O(fEpc@7Gb+2c95*`|JZZ=+`k969%bCYQ6L8HjAnB>x5BFU+33JzmA7- z17WUR_v?&BH3&sO-96{7_S`sWKoR3q9lljJ&PXdq1kqOGIKO28CJG`R$4fy(z+K`Y zWm0T`X*OgB2Qi43HnK(3C9YmQcMDDEQv?d3S$roC%|<>i%uSg3jp-kM<+3JkFOtc{ zj&^$8$Rqx96E+ew@QA(bfOe=<1_SG6l*~K6hiO)8C#j{r+kjYrB0oU+Vp8hi$md9D z0uy5SF=HXNDpIR`<|<;f!*r5THF8w>g8{L)7e*{{bCN~8*u{a~4%Hs9*0}69c8Zb z;pnQD=d21EWihZ}3%dUKzVQ5DIN4DOXUc6IeE^ZZewFWjaM~NxMxm-ut)S5BL@A~v zbC(|EAHV-+^1lo3eNgNcgfa6uUdp=#5nyOB_<(%CgTmlL_KqDUNe{3t;#NVN4^Q=% zS*5KlLP~AAj+t4147@n2-z+C62IObh4PzA5TO3a^$hIx{M#lZvIOKlJ+uZ17RHI6H zNMpfFO1YY!KTu|(9P>DH?QJQrdJZF*-zJE*ll#77E&|%-tWl%TH|HpX2-iC|-J~~1 zFA2)`=3t;35-XivX)HXQFQ3MYa*Q#BBf9O)nJLNwf^r0ZT#oEb7OziH<5ImjR8Zo& z_6A4WaX`wQy2%OiK!ky?*N52#y4vo|u{2>GdW0|-w7JBlOm|MeM1U+$uQi;4Bt!vhBz8UvE;X)FA+ zy7?7cy0S5h)*LI8e8o*e zRU!s#2?Eb^BVjijSB))AqzDKR$C1~fYSQ3;PU+aB5LRHk!BJSHPxvm00EG}B`N!># zS-&oFp;)eP>)5Q2&5kdIgXF$*8pJI7G2*buMG(6!?q1m^4pYtN&wBk!@9gXzbJzh9 z4089^zWCzN>F~;IR6YePfcD0+-g!1tPGk95BzKC-W=p({$~a@fe9BtPJnbQa9rwzA zW~uHVgPCN}81p0SE#l@UAaZLl^@Pa%)-dS_7`;H3xtSz+$6uaBT*H zkWT_EbW=?0fgn|4V4?)}RMQyMP9TQ-0Plp3Ik+0Xxx?g`7HAmNPw-gYkK&zQZy&^z zN5UGIl~a(q^?oj?NC{t)gG}LA&Oz#bC)uO8(%{G-2U&fciOxa3Oy2azlcm_h@`Ko{ zM4^C^5D-S~Rc6;{6w56#;UGX50R^v}gKhGQYfxDYW+CN`nIdd&KU5p&YBvixDi+7` zq<|3P$TQmWw*z@d5PMXFZN`kv`bR^=1ku9sEXccOq^Ab% z@oC#o0TtN3t5T>~rGP2)!Z6(PVwip5(yqv%bddu?e#ipQsnM=RqOllr`5FnxBZfS< z=cPFN!=+t`MY$3Sjw3e;El=Tp==gIje|8lbszSqvI|20s5GJc_YU0lIGbwZn`ase2 zY4T-qd2mP#4n=*S=5Dq)3(%I#m@U%70C5_0#i*t#;z@6G78uk{++h`g;_zcH1nAo# z0xmQv<^n7fLEQFjKud)QxHO=C=(ahk%LvQ}2n6g+m8vywZC=bpL>MrCV7WftEci!U zjzY$po70sJddbOg1ssE-ugH%jFFrG+t`~Z~-E@Zap)k`yFWaN4`ly(^jVZ<_1_2QO zSf0LRHXk))u?N6*1q|6cso7dQSw#JSy7f+sF{pTAs(f|6go)uPz=a>zbIF%0p0sAG z!a}Pno(x9ANZ_kld|mN>bi6dzuizQ8u{+B|WY8CklHH#Si%U+1{iFvV99=Oe_EF&*2qJl?3SLc+% z&`=%4vSGSMcVYvs!~~F#dTqyYO@#;xK|GP)($_e+Q#v*&gB2KmZ>#0(cPcn^JKOl# z!{6{c2p&@R`FB2k_?;K=)8mJj3M?M}#wP)04}asuM<-8=0?m|Q;Ud~%pt;Ml?HeD? z@@xkD1zk#@bi;N)HJe=XiOVBK_|7*-fe3mY-iNlDGV`r*KmymZH+nJy!)P-C47pl4 zVE56x9iD_J3`wkiH|{iZ=1ux)&%=`>#v*2}UG`nK7~VuxP)q&oqIB@!7XL2(dBxlZW@W7c| zB)6X$C6iGqYQU%D|$HvLzfzun5U%OmIsZ1)iI#|P{THx%w9`y%r z7SVOyPc9`E&zrzPtok0HtKGPL?y2f=Gn6sG2oM@EC3Va4-r@4J z#Q+czYbv&Nu`7`cKv9Hf9GheVe98lzYFdJJ@txzjmu3er4Eh7&`8?k-&Ugq|%(b6Z z4Voyxfyg*QLu2vkuu-(;p(cPaqBGz6rQ^}uiz%9a$_Dz&eY^G`JSjyLq*h){4viMH zfsh6WllpmTedTD?OJL>D+bx#L6^J7gz`*4uF_s<1S4EF(9$!X-g<|S+dDUzYSw=J3 zK#U{m=BI=qpT-_jK|gDH)#z$YY3Oo`3wP`EJI$kb00}0It>v(i;eJyZF%a6#W^9h) znXP7jhdzg~u9#{Dwu*{l+pTX>br`8v7yBWkyIUJ+fuDJiCSZhVUw|(Qq<< zJRM#>2zq&HZ4rR9hr^{Em(xLkDj%S7AeX~8Z`9v+0GIv2gB4RncLSA^i_!4r&4tr* zZU+4?ZW5<|rkHUmtd8>bonH=)KRgN_I9EfJg?K&ejm{kP?+f*pv;O#V`L9i<+a8s_ z^62EEztKIf2Tdu5jZ&Pv?O$Fh9#jc`7-urnDJcEHQJTF=|DJxVcQYAY^^|m9UcPh2 zy)P5}kx_Cw9G#^ZyA0#+oVOQ=!mmp3T=d3H^3`>JluSP~QE9@{;o!?;pxj00d^l1< zFd8ce-~$kZdtlfd~ETc9rU5#RATCrl1r`u7)Fp@za}sk-}_m zAcbGzTH$?8t3Gm$Ce!V>IUJ6MS6Z7$M83TkI%mVdFG=g%ODS78fwUO6BqA(=*qT#b zOJrkRWrcPHO6A%hz4K&Ss6une;3kynY%NlJ9fjGv!I7Fhw z%_f_JHXpsx9U2FR2dCFJ{j);|5yEDXn;3-%;1&lIZx`iZ5W7IYHuoeOfr(=m5_>z8 zYD_iJ5~(Ieg&RX;SJfJBp5`&d99w?$ju(tmNn=BoYJ!u_kjpT(-4;C0fHWkKkHlGoK1+kjf*wM5qA~mrK2UsB#U=^R1Zxmgih={xG~Ju+$_ts^2Mq+Us_n(o%kgMq+*u3~j_R87{fSdv;# zelhGduz=qT8)LwJvSHZ9zWV=IyZ#xDNV0BZvUoBXnM_u*)dOjG%ZPJMoH*w@x8Vq4L z{EpMBr6gxeI7SRZswtZy7OaN>7P+f)24e>21kHm{mlij4)8 zN`64sbqN3fR;+&nP@Ncpyaol$o4kHt1Llcw#zR7-O)hnl+wyMKa$T;%4wDbZ-+-|3 z?$T-&(%OVp6l8%BC5cgu)9Qh2m*%KAdOj#}`5TosVTJcZLF$dVDs7{vXiE@dFrhH4 zRw6e#*oNDGG+>iZ>Z|85hpthfLJ}F8nO#<4!8wW|waFd+1S4PO;-CZO^sz%q%@E;yu% z=%mOsv!>!Q?=TiroFww#Yq4fiQEs~Q&)$4p7G^GgLNa&4%yA0mOiar@E{k<6N2QDC z=bQl59D9DqdauSm4n_-S==$k*Lag&fY1JRHLQ0P3Ipb@eEN_z3OBk7P2s9dU>jbGYGBx{AdhE9iMG z#cu}FqI{;%A-y0YSA$q`GrWu?U&E#1xf*o6yt=p;PnObH9y)us=VtTgmp>vF0L8fN zcryHT&_-{&LNAn-YeKA@6bh|en-yFJXeUa4smugT)^5JB+|QsUsjuVnCwCLel8e@w~dBH!g?to!_6iiK^{}UZ z*DYA9Fuk1iB#R}a4g!>PnD(>kw$ZpMURhmM1*5`9n~q*h-tz=p<3R}Jh=Wp8QrCD0 zNwIb<_Nc1RPE1O#f`6BoEKSv7G~Z6lSY&zO0JlSqA`mgYnm#$A0s*5hf>NK($6UL_ z>E*9+k&&K9!RaLA0A&Y+_b@-g>If5m5MdFOlKOOQ5}>P|Nz(mwvkL3RD3^gTX7|RF+=2H zhW24kpG^moJ1;-&y&qr2ZWg2QGAITLJ*Wj1o<@6AuewE9xNH?@{ z3q5jzUZ@1vA!!uH>5BayH()1>uv*x3O_cV4-5#)eP{|hXS)s;S-_-o&6}EGoU!+FT_4BPQl#Z=^NP#X%o zA>xoh#Q@4K5&9OM>prO$;6sX!7!W>0xe3>BW9NP|+81x^81-2t>SLsXp6M9%=TK?) z2|qJO3FjGr*jPDh98cVT9Sa2I5*=p`H$1@-0$`Sp;l=n4t*e`Rv}e!9mjL+hp-H%w zBJFS|@x3`{2NB!N+={} z#kX+8TFh)D+IYv)iNO}AwFgRf11K%j@}t5@xnWx9bd7AcaeA(C(&sJUq#WfcBk3}Y z8ohMjI4PsTA(=YY4VGr-v0*Ot)Xv?+NfFn1mZ#2R>nu(Rkq(EY6DajKS&&=J9YShp zTyWZ>4k%TXQ8|}?xYfm1YibAH^YeST_wwiA^klIuUx|BNRL7Q63cEa)c~LpsIrn;D zV{;0;dOPS{TPD5Bf&#tp`-90@_=z}6X*@cA-|P3LH#6#PJ{>F2ig{Mit1ZUX^^2^u z$siC7V%}3itWvz$@kkK3rg+w}T+K7NDl_5XY>_xmDR#zxzLvYo-WS8A-c%)G_rL^1 z$q%~tc|Xgay7GJ&DiQ$TW| zjOL1L(H`i8TqGRS{b(e^daYE^8vR3-jIwS^AF^0~aF+8-9qx!y=c#blC4Efk1K>$&PAOx~hURBuWAsHH*}C%Cd7x~j1G=YzenxC7C6=qKVM30-;T18-fO+s=x#4m zRfOt)%Rq+VUa0P%_ktpvb<+oG)!wa|QUAz2W0Gfrbuxg^rc{{zXq2R%P0NB&&Q(q` zmOIc0n5~9$4Rbul+fTiUm1rfYSFAQ4V+5G=UfxTvf@by=LoCV(CNnO>eckOgMf2TP zO0i-%W{)Kd?61=l4V>K;Q>?Jg1@h@o?ro5N>scpKtS%FzSP@JNl}qz`+SIlcQmioc z)^oAN;#*L%2}Rs9z0FLp3Mp2Z0$~MFOypwI|Bh@4bO4*x2z6%TR(rw^vpe|N=xm%o zMQ>{A-9H9(G!IkZEIZJ=(q<&8_8`-JQcW`w4hnoJ6UTvfvi(BKvawIBS&|OS9Ol%2 zr!Dc?P3hPt*DPjb3582dz<`2F!x%iZdjY-d`wxk1YvCWL8lsJIPo`b_`NhN$k@OO{~TV$TBe^ z0-=P1-)9fMXe1|vfO|6F9K}%uTP!4m^<>bVQk17{QI|-_KhT~G%xRY8xRWUPbx#J! z0Z^7>MZ4Y-hAP3ONjS!?O#MLG0!BSul0#Uu!LPM@ekgjg8@YEp8BfP2^B7o+{p3%^fxjo9 zHig1CiN)5ZN)%~sC30T$qpU0Ehq(7_6bQ4v0bzDinzBqHMls60ZMH*b3QI&(Y(OZL z5CY+yPWNmvJ66byAd~H9bwVD0w3rwBy0~#Z8kQZ$>a0K%5u$mr+quRDE2PFEjvWX|i0a+!~v> zk9!ATJ2&dTK5rrf6zRV3vo+RN58?&FwnVuM=?@yupI-j@>{y?kR!m=iO|{i0M^7HT z#}o8!WOD0s@3COBv&zE?*87&8Alo8GV7+khv1YVqg0x7f>(L{56y!B#d$RL znv3rD-j3)BJkG-m4*scsPCJjf+LA%z>x~NzmFcF>*Me&5V()E9XfCsE4grA2c{sKr9{w#dpWEOfbaG3eGq}gQyMuQNZMZb);>9VYX^)M5kl3haC}$tML~aio z1@H)QEJ&7k+HoQtfieLd*1<{adcq>I4ilGd>_DSl8XQNX+;YTi*KssKq|P%LpT7Hs zRt*|;5l73dBc5%4vCbh0j)s)ajCR``T?*>CDu_@%UCXfAI9iN^l;CJZ_tRRtj~a{i z{%|!|DsL-+(QY!jmnlR^&}2yLf`X>inyhM_b6i9xcNQ0F5k`{&Ih5mM_Rxn2qn$4g zm9NeS%y33EO?Dt_Y_CcZDUuHR&X2H0IAa#$PR64v!E1njy>jb(#_$%6KG4-HjMmKL z>GX4R7f%(>K>FC{J@IUDAX02(a7lRD5N&b`KB(!*r2oD;SOvN;A{g+;jdd{bIrB1c zgSR!H41~ksW?(sIX`|O`)>UwN^ehib2-E^CcY@Kx!x$h-tR;-qbis$5fy}seNSoG_ z%PPLsAR{++&ib%};8L7%Q?KZ^=Or+5ADY{O1oaIUuTs z`4K`#!8-$yJ99*!#KqYVatC5%5%kZwsotw4q0~4ARxg2Q@Y&}$AaA3FbLQYmq&<# z2ovsIp@>h5{QwDb9qy0zG@;=y#Doz-_&ld+1F7pw7?8POGj5e^)x-ydbZO>d7p(1E za#1dSLG`NCF^p{cK*hqT+TU~Ki>rIjAukx_=|=I@f4p8BWppL!1kT{N5{h7u>uSHH3e14a1 zwuC=Wat6G$)eo(OJ=KQpDsBdr7nxIkf>d`EYz;V2NX3P)TdYA{y(dr#x>B5pZO(Cq zHG^{2SVfZA*p0gH1e__4v`0$QwD@SXCBw3cxUvRyv+-FAO0<(Rhpcy4bh0~Um6<~s z$}qBBS3f9|nUv{T=GC1!l*JX?0a$~-A_~xR#m8fmY8j86HK$F-bABk>=zCIsV`z3V zsebwXayodo@bD4@y0}70-zmmItvCe1CX%^L24mEQ@1ym9M_eSv3;VhE>0)Ke!iAFy z*CFoB?DB0%SqVGm(~nBtnfHZ!P%_KqfIE+vCEbrv$cp2P7}Z=@oLa!w5BqrJ!3=6C z$~8|dFbj0GZ~K$Wa6O^o>xsL6oF9j+yc>+B36j44=|B7zfGko)8PPbI#WCOd&*RDI zx0C+G^)Z`Yu{A_=a|!%{;zH0nADT^~=w z)Emc=c`%!jvz7>gLp_8`#!2#m?b6+Dv?tJ1DXo-NE_HwRD`F{B@g61=pH9 z39$AAs`sz|@Y}!puN9O@t*895&ytTYdxXby zY8sT8%!`7vy{!p<;cAN$!>>8|w*S)r&P_py;YjSc3E^h(11+=jvPdHX^AmZK5tFXj z;-luL`{iOddEYWa2gO6-93_(HRMQ=fY_`SG!RX~+GVGtf3P0EeLt$N0T$cOH@7V`n zUob{G#XBKYti##2z5zU>t2h*OG7oqCejqh#GTUye_I2d!}rz&vIw<5cgkQ3}FD z8Mn$JlWr7!>)ZT5Fwwue9M4UQF2SNgdLl`>vB8hp)Q?8~jD>Bm@5y)i>sOy0eD~dV z*Z+foqXwf)?Sby~G#*8M7X1O+U?&CzVFN>)!$qmro_p)gW8R$gFin zCoeI3y!>o`4M-{4-6I_S_Aow*e_@SVD7I2?y9YbhQu%e{r9N$;8Ol6U0(2mi$}sln z+BZJt1NrsyFNW`i)An_2p4!Oqy zyS+mI(s-A%c2un>yUBIj{3<*ZWPC`(I2E1GljshAFKzg6|D+WM@5#yRS-t-0Y1r~5 zEHI}TMTGA#eAgmF?bYRUyx0_`8D5Srro-_FWP(UzUBVfUTQETYyX4Grozu?yv7qi! z)G30MOsz#P8tMB&;LYv0%SfIsTs2?DAA=4Z4Nl^D_!ESt=0sX9h*{po>z)79w>8eSAJKG=;DQXvxQel#K-`-T5o1N89j|*EPfURMQ zGA&d(j~2YOjS@G*?(PrKEZ-f=or&S~_II~Qf)!9InT->>(oGMnaGh^ZaW=PV5hl-n z9l_5bdW9M6wcm!>vQafwJb{R?10)YHk3+hVI3f^5%CzTUC#@^e%}bINjocLsm5v+f z()Bw9?eC$%V4Icgz;;cD&3Uf3!PVl$MmI-I<_%ZrFdF#gHmc}=?G95aG$o10pl)QM z)(-N*tW-*{Q`&6fZrLbpFYt2~leRB^>8IZweD0tBAwNKZW%%GLOg}$9c;Sve{q#Uk zNg(zEH-uuOTeprj%5@7gP~i_?d&025=Y-9E;auJ*8SIA3-@hW?e}C}3{ll?45HfiF z2VXw_^7EGm-+cS>g*(6mXAmw6k|`M|wk0xbWM1$Z=7mQ(cPd?-1aP~r_33GU!w5;( z8OClKz~H92H#Z{fU%mYP<$>4v@mB{}2tp666H*_TufG5E_&`cbIe-!pahFS*c-;9$ zH&%@A)*=iDRl%7ig2ipL&iVQ|2=y`Hzr3$>Gn5mJ7^kts$-LwHG?~ZpKW3T0QvHj+ z{N?auAsW0wJ-Lh#i<1R2sn7O(}5GFc$aopIKel#_^Gp!n+R!> zN~27$Mb@H(w#95I`%xx{F`x6)S%I}jnQVjH$Nl*%l;>Z6@kP@F7uZODu30M?G+my9 z6901@t=AHh6XaOdPKT21PeDPMr@29`Wbih$+u2mHNz7#G#XQNu0uZrc{W~8lSzQ2E+rPB;&0sP-8=mxI z`d)WzU^Uk@bu3+`n4t+n=gsK^TFKI-(kg>}>QwL#-qK~>*o@KC*}ji@XkWN^m7;lf zjnx)JG-eZrORunKtI24MhpjM~TTs}ARo?ji+StiYRpHfx@Qi)+Va zmdcWj;&m3Y!XTVANt}5b!^On$6&jCduN?2TtMO3A$;{w@J0V1HMTBYiT1;~Pt>E&D z!SrgPz0qKB8Zn#}*n2fS+Y(dH#*=q_ z5PT@H*6I6_R|kAzfVSjZ^V-A@NB9u;o{a)Y7LQhmY~QGVo@Ek+rAX(q?jx*Wztzwb z6x@DmQ%4B)Xo_&wQr<9KcO`B(u2w}^hv0}IZ;@!F3Gt5cVUEyj7or&zH}FTpGF@B) zU@)8+=C{M`)&rZwXiqHJ<-jJS1C!J=r>vcpfvtMrvGvO@Z(ogn9E_eEVL};?c}SpP zlL|Y*+i9(T-a1J@s;FTvz4=~eGuNY<+HGK`Pmb;%!8%%(I^qOvr>$1o(%5EyrWsUK zO(bfu{K>W7J9{FePZMTZFjYV-kB-NXrbl7>$Sc-L56On^TF5pLXPFi>^(fqC99lS9 zAM3J-P1hH^#*!hH4yVc!>N^RQwV?#xUA_s*X%3NpH?IdlmX@JR2A{o?EIApU4xSu= zYRsg^gvew-RSj~3)K6w9q9$GCUzz%WK#nnus04BpwS_HeEYiyd=Yyr7Zwcghv&3Z* zQ7cJi*)C}4ilquz=9CueZ4es!@E}KINM^W6?LO}z$CW3PTA$^74>@)lay%{5#WlEX zMeY@U+F{423gjrT7ZP=+45!9!A%-{$E|3s7wH?ylHfxPquL(v{n-Q&CXR`XL%fudx zd^}*JG$xl>cXCWqN@F3Bqi1bPck@%-YzDH}N)` zaR}j%ourx5CSBv;8cPOQ3X~gRbT{!KkV1cdbdVk4)McKgZRDSdC2+`2Sd>{Mk~IUX zL2iipAsM04=FQ?!5Xdg3L6kstvbL~AjYWH3443S$62R_8KQ0qUGO4^_sVAH?p`WW& zTp|&yepHm>HV7_r6$*>J6S~d{Hy1#X??_v7sBh*4s|p47u>(V84-C-QjdFr z_zZ-5r#((a(b=OPFgo>Q(qCJES0hCA$VD0i|0w%5g>$Pda&c zU3VZH5Vp#l<2+qH4tR+mt+FgG8>O*-6{%?p->a?($~QO9cq{w$=_eSL3PM?yqpY=K zd&7%+gAW3U2qN?Vkpsfw>~+G9f))d;Ul_?zu9E>pkoAM+Gb5%l>(UJsPo*CuXA1jb z1zXS$1SFG~W!}rgo$&Yi;l6$#ApJlynR}TScS@ii{lIC44JNJLH6R>+A4}mJ zYR!E36NuSb3BmGY5#n`=dQwau0BQv)v@}k)x41c~30WJrOp{!;c1r4Ms!f6IpsWDY zAk27#M6!C&`J+J@?Jh%9iOp`e`8zY$^8U_(f8{M{HkA|76(Yv}N^s$M8|j&v-~9gI zhpPAKVA^}tzx=U{{sG6c)(nt;-VF0P`Q%{FiZcfgJ*hR5o~15atR6FnTBt-e=8eQ_ zuqBAWAua?V&adi~jMpe(P?1$!PANt782_Uvj@On7eqd_aT0d~5aQlT>@ge>5nq z-}T>J{C*mf0h`|vCKNAB|EhCD7$L}IYNwCL4X)opM}0)I%x1}J$eX!Z;J7|=(rE^| zF}30fN9bf}Tle2NzVp(}E`U(K$*9Ocmd<9YS?iqjK;D@!j2fpPcv55Qt*YXHk&HTN zw9`+1_&O}D_LQ_h_WR+J6;gscf8(U+bG0q1$3LK$NrsVRpb>>lE_D;nelW@hKMhan zPlJXYCZrirT5OxGo6+j!W@EtvttbpUC5lS~K_j|KtI_kpv~igt%v<3=6Vy9Pr>IV& zdt8@L7exu8Fx}wW$T7mCP__21A^Tj?=34NYO&F3KzHE2ZiaWb1GbiTP7JKgb-}j+#yg# zK~qZw4WrGC7qH>!n=KO*ci|=zR*TKLWv!08@EjwO^X+%-EuOW6t<(9Ui|5qDYQU7(|Qye>X z4N7*V_x<_!&2V(Mu#owC$CJTNl^dNyJopu=FJTdH463fBeMP-K}tSK%B1S z`{_6=X!7&$vYXRXs#2;3B`S~ZNw&G4qtwJ%7Wa>J`Qbr?+a z(m6IHUB>)QmzuTEe>sgP*6n5h)ETdl2(jP>Hl^AbP!KG2+UnG2e_Z^n-Hfo>teRs=iA zXC}20dlZ06i=_Z%{b;6>_i38ZAR`fRCiT@m?Z3X9|NENFCqZlnllb+EabPUN{QCa7 z{%}`YMk`~fN;gWh#%f{3{)kAK&Wvp^viC{NM$J-de;Ul-Ep`-qz^XqUU(P)dSfaWz z!s&Feq||#Ud_jyLjUI{Oj$*yVsXwqjv$X!twAY78B?um6n3P=@(bU8K(RQpnO3D-1S zSQV(jf3UMUbE*l#l&osSLhF|geDh_RI8DP63TmstjLi))i4nS%STTB*KN2>O91*J1 z4d*CU^gyV-Ee3s2J$Zc_JYt}uqGV8|puF!69+hu)gA*Lq4PDzDrH1EQ;>7gw*KhLv z`YBD@=S2*kumgk-km?0G6LQ30UBe_cCet)=e^^0LFZ{h?O z8-ipywLlAC$#bq8%@X$zyrspv%lldSTT&(SWDr<6mp3d2)%GWkJL}w7R6Hcfqw7Xd zfAK5`u^dJ%zB}Ji4U~t#!l?1_^EH+nUL&d0W+zasYDwudqe4)Ux^MdjA4kP1lSJW$ z0|omy>KzN2dL+blvT*lt)Z#%8#8DH?(Z$L!jf$$#lw5vHkyJ@M&L~go%BPQ{Qo*Fk zl3%HvilkDbxO1r+m^QOTkaB2NPqi?@fA$;qA|@hM(}WFdHN^~DqNL_HgLD{aJ-A(# zNk8BEN;Iez8Oxth9mU~HNrmz)4ia5WOi;fFu8dJ6Exb^T8L(a;SYz(HU))4$h%PgkYMvE#~#CuhW7Y0IzVy)71^ve;_v~ zJ;~Y(+vFx$4X`U}>JqT4&|S5*U+65_`*M6bJX=iXDTBN4YRiH#q_77ym)g3Pt~QO9 zp8mjxAyc$@lI zbsX+`xFHG{2;-a^lY<)iZPg|>f0@p?+J&Zab%8LRQN%E6Kgd*Piy*bJ2f{i8gfT}g zhK*0C5IkQ4Zq1XH%Mqw*G$3U^G5rJtF%xNwWS#ULAHV>Y(~N704k+;kc}hJ^oLbQW ziOLdvYf%Z50Lmq%c|ymiEh?2I;WkGliiFeHB?~_`O(htHRyTvT7M)A^f0#O57JJ6? ze4A+0V+xH3Zk#urR1Kh1*sxcD^cD{-2%3~uBExy=)P{yYH+X0SX{RhAX$$76tr=87 z$D~7s?L#Bo35`&aG2`tPB_~N}B=#%JMdE_M^!kTbCYfRjt*?Z4)+t(aIJ#M89&ANZ zOiW%}=KXhy`3LitiU*ddeBM}Y}#9y>$%(}c;w5g zi;HoP3vviKc|3E(P_s~9$dwb)vHK@4sYqXEtk+;px%fwLutfZef05AX7#h#SAzo}n ze~+C^20t;Y&dyKlWU%aCl%2Jk;OR0uk;R-SyKqG_Cq2(t5l?;itZ_~3jFdZh)*j+Z zuBGykF!yy!@#2gDuig$Xdnb_#ao9)kAA`$cNW;nba4?$op5?uM;KS$cd&p%$JXY8) zfYzJ|928=_=^8p&f7jvhEwW;EN}4(+6++pW#KtZbPh*KyE{dLr5Eh_tc#53)hgh%* zXRpVH?M1>LJV3X*uJ+Tdj5u(?FmsD7nRw2uSM>JOKg??G1T7{)R$z65QxC4=<LCtdL< zP>-Rof^hyO=flyDy-8tyOrD(<>!XP5Nv`tL4&U(8_o7zc%oi^%Kj#aYAakEvMhAa=8}RWgbgLoRqJ_hnRa zYk$snL^A~4AaH9e*XXCcQMR77b zdtaDkvw>Ta!Sre}8l3iCzn>4{nvLCxrds^eTn2i9+r#nc(_VP%a&R&po!-ZAR_H0| zGGWo8%P%o;nS9WMnC-=Kmf50R^r8$1gC)N|2XR>jf7(bxsV5=ZNgpdRTiVy9KG^KO zj;-28o*UH}*IX^ADU@d{+@(+}cc&c<@}Q2foES%HFb@jfQ$~X2nM2Z(>M~%yA_z(^ zq%_2G2$s6pYId`+hBSg8oi$FLb$!r^-FK`D2aJByIG#sqqb>0QDbT7nPrVef=_fxF zcS60GW)(woZNoP{Iz%f)a~ zfQY-%{w_L4pjOe0dc$S&_gq6A)@*^|?n3*{Cp8d}lMECN~uV09Lr2+6l7obPgOaitCOe8Hr{$md$~+dPUAZp|Po zf8?0Zu@I#m3%d+AG9~YZw`cpEzj&V))A2k29Jn$|;pp`XC#e_ir>DKMIIev-D)7b2 z>0~&1^R!^!42vvYo`1YRBmrj(TO5eFG>5}TqmaG@k&~aXuAn%vC*MP?)0oqfqe+UK62?ce? z+-x|I!fgW(Y#` ziSX28**s3$IL8MuXgR3I^5G8f8ye)4G9xA!M7z(?`8E8g53zmy7ykC!i|LL4Ohqa{yBr z!j$5o^rH(AG{ZSYe!-hTh%l!}gd7?&6hVDfi=SMMpk;R$lFDGDYs|%aj$Db^{$lV` z5b<7&$J}_x3%_{1$Gg$8q6m70oG7VyFe4W@lab5`d7HTXXifOoe;oE9o*+%7+#sq6 zIjWxIjN66A?1%^N-#(1(-eJLfoe#5MA9s1+r`s9&BywfFU#R=yHYlBJ*6Q=yE{EOtD?1n6Ge zf^3#ENg(5$0X6pD&>q}s?1^hGm6=QMtaNsfYQfinNN~B~hmx4QK`S zYopZyuq2eveJ*Zu(h>+(R~?O|SixHB>E5x=GD-Bz5v(R)e=i0Xl~T%A@Gt1-T&NmB z>6xGzL5;tS2|bpy%6pre(fhMkuZ};8?O%eG)BEakz}b+J8O00xe`BRPvmWm|9g1PZ zvebi5@1HY#U*DEPEd~FVp%zu!8TjpA|F1F)m4fN7-VP_H2j2`P!?WQD6lp2?ZIv@w zI4&e-4Y#R!@(2{7tfs5y||L$ z$)I=AANAh$N2fv3uEJ}x<_1sWzs6V7r`O#Lp7sXQlf&>klkwI6XYX2i8^^NqUm<#v z3E)!mP02tE@TF<@xL$2{s(NM65^ZscB0VBymuDMff0bo``4a;Svdkv`W+uNQ=bU>< zNfaetQIyQ8xY6#m^&olA`R;k$^SGN-uN9$LaSLngNjyd1F-R!Mc^V{OfYJTw>R@NU zjo=frER1jI!IG8q0r(WW7-dq?gM%))@`?n%hY4P2%vMH3o&8hBZZQtvCIMXL5tFEI zLMcgMe>KS+yam?Hmnd1SiLD2dY<|{He@6r_{QAoUCdq?A3oI|*9;L}` zbT?<^lbB{N;#h(5F#Dz@a%R_Dz6%wj(9PE5f4g3|_Pg`N1T~6fSJDM;djSDVbuSwP zaNki>Uu%0*&MKLNP8=w%zD_1mp-suOVaQoMmFR4vo=TRiTaGWcH~;L#qQplUYi6jX zE>v{dj9mLu0|d>6PVag4=MO=a)$J{TQ_41stn^lLxyTcdbe8JNy5HUq)t8B1v-woN ze}vh6nq+MpJGajlp@-U!4nJS6S=7(0y-m~^;E?Mg9U@d!H5}VLta2678kASRt~E$8 zH{t+l4OQBJ!#cG=ep)@56xXtczTUY`>|~&U0Sh+yu9!Z+-shcWPExS-ss?8_Ha_|> z0hpcRp1|JF49hlrt+l<;)+)dw>jtxdf7jUwxR0G=HMz7izWb$M*#QP`qyq#5FTAtF z!?46GyakFGAVn*h(wfB z<#okd^zh%EQzoe0!mCZ^0uGx}hFjL@BrB?;7_HCw-Q7S@>IatV#R*I!I_=`te=21R zdYww9>+3_gTJXFFm0nTu4%-W6H9*?s zQKz239Y>!IcyQyZ#Lqk7Y zO#BF@THTww-J*VfcGFfRX z160&)itN8Fi7blSA6mL5f6{f~h{<1P%PXxW;FTG1IHhRJp5jD`Zt2h=W9fL~jo+s< zx+jXcvxF)^C>{S|41Ki-2)@nckE{hbP?nM?GUiJiT76$^XwHFUaD8f=K}xit3|6JL@Pv_Q z3Zb$kIZpQ!x$pW1f0n$@V~M0v${H}>3iRYlR@D3Cn3ENp^la@qaJD)gwR8sI& zk3&kqM;DDvAG`_a92XQcygN!~*pD%O>PbKG%;njXsZxeXe^}f!N`jaVB&5r%WjxcX zprHA^;G=hRc@d1NMqhQzwWi@m!zeK)O6E8x8Wud54bo?N6XBS~JiQAs{byl~ zB=hMF-~g_G)eKpgJU$D@bF{O;WJ;4z3Io{8_z5aVfUApANwtTXW4;)bTtH4brPYoD zwBi8n68dZ0e-uD-uZoI=;-?ieT7lgcF?SDemrkb`qo>6B^gbksHx(g=X7x=|Q97XO z>J$2mrU`x9&MmB-CV_1i0W9AU+A7<=P7iL$_R|JnXz6m>G~CzJde0{ku!Zt%#Y%jp zIKciMej#51g9Y%DrBf7WVLV2$735`=&qB_D8QPQVe`$))1c04LKdg{Z`Zx#ICCZ+n%!c%_z`t=R_ z!T(Xo2_Vl{euBkE${!(7;SGIX^SWk2qn!QW_ndH&3j$aR}0cWDz&8P(z(az!faoVmV)&A5p?Mf@10> zjMGOU8k<&M9?(%$cWBH-$S92ggj|LVhjfpM>4K+WOnjpt<~9-AHKR$8@M1a;(C`3v zoYahhg}MWn#$biejwDsb`Z~uL7>L8XXw8dLe@LqHy*-MdnkKC6S$7Kzb}3F{X37tgbk-A;GAq0s(ges zy-JCzU>T%I47aJ>;$${)ORR+3!j#3UJm56#iWDy9+?aAv*f$M>Wa+N_lI+g(T~jWe ze@)03={traHh=P%46(6Tm%L0a2kT5*R@}Nw*}}$UHL;Hr?%=|LQHWRiJ_J$B@{IAz zg}FOU=NKXENyB9ppym54skv||?}(p;4?b1CpzXvP)w4APtMXo4tkfq~8qE_cQLLzx z(;zBT%2SLQ@vEz*G3=Z%cy<2P=OTrUwaKwASHUXHTIf|9vh~fk*(sR5v+A>%bPFBof1MxefmyFlN zO&D=4it3nkF^20dy#~+zKurwb;pa(=vDbzF2o~>Gre}qA#84RwkWF1P4l7qHxF#ME;rS{F zUy!aKpNlBuiXyG3(QFP>g&k1UoCrPqE{7k8aJq*O`V`ZXeZRf5iN^A{KH<=4nsCVE zu_k%Jlc+e}l2&LAeZ{d_&&%BVe{|6PjkYI0%qSr?4xS3pycPw*aM2j|Bs&Dm!n}e{ z{BjQi`y|R%geN(IT#}P1z%EpC0V%-$RV+WiJPL4w-{Pu_8R+agad?~4H&*YpV`xrS z4Bd4GU9-nOVb>GtX|f_!Dba$Pc%-X%01r8~Fyhbxf1hC37|chEpe*UAe@XB_{Z7K$ zTaX;2r-(N}49;`Lg*15Ig;rfSn?d%4JDF($>qnJ2p)e|8r92KnFW{cqvItP$^b~C{ z&|khGgj%1sYBbGTeI^pv(T)Lh?<8f0eO(sIU_Se5Sot{2F?Pcc-Mr>@gqEjl^DIlfFs&*(6pDC+(k8NIB zl_fM#e81mXf76Fr1uAlsrqSrSrLKs$NBgU zk0(U-fUbcR2|wQge{)$_7X(0p$!7~ctCB{!2j3a5uU&SFbXNS<9``9ZkXc!aq|Y{= zSg0G;4rpC8ie%*HJz#FaEUsB(fQ;faBO*Vd zDTjtzL>p9yf6$6=s2X)?{`LsXl1vvPbYl#5GnY0+BNNpI!z)3xkXeOPphUQ3#hjoE z9LG;A*j|V_3edA~JB##D(gkjh^4eUyvyH%H3A0Rvg2l2wu$%$4ZaE+iHVcT)egd*R zymkPK7tu{`9LE(IybNnWqx5$omk6>^6#dH&|NEE!fBMJY{^Rfe^Pjk|;)0czCpNeO z)z{XZpn@P9NMdt@Wq&SSW!Yl*ii;1yEce1DE*Eh9+5YwFr)%fe^9%3#^3(a1`_r|1 zaqhpnx_(YWiIgmMdFfZ~hy4NY&s798D5U&G@qvx}S|Ff+=rBE718=SEj*mNw4m-XB zH!7b@e_w^ibKq!aa|vKW^<76Dcx@jU?2L`~AHw7^i(iq^8D!|1qIibgUIV6Gk-=TR z%XIW5%wK`g8DJ>B=2@C{;Pd$Bfnk3*|0#^`Uy<<~GLC0yXr^VGo`2x%&*!xX>!x7e zN3Y=M4md!a^tJx*#cECen5D_+{#9Od2oma0fA$8tf7pZ-q4T!-{xn9*Gt;e}ag2V8 zuJ?!V;OP|`qUjeYkCX2t=$TfV84b4?MfY^Dfq&xcuJtsh~CK$)f3$hDfdrPw*&FSm5?zEi)yf3!T%fpz_ETrO240e|w zUp}hjXzod$FxO+Xnwc7S;L$mPi@~_&f2(ktQGjuGRu4UnZUM!xG@jg%&(fIA*~)6^ z`!vf~e-KQ6g%`6txDzU@vmIGc+_p`S2H2#VtzpwF4mx(l=Jo_h18ZYAY76-+0NX7c zo2;R2nx1>$;6SreOgxXB&sIw6S>qU%sm*Gy2-TP=%~6@cuT1`;oGoiRacpBzf0ai9 zxagcTo<<3_cM9@!Rvd({y&E!`et}I)?h;v@Y}lq@bgSSvKfA&(so1>AEIc`5KY;3n#kJC3jCPStLx51j2Ew zZy29h`fQQgh|5E`&^dB6!<20*6ahPIk^IGl1D#keE*#~HTBfqDA7x>Yf46~1DL>Bc zDgY2oRR)SPIIPwb^3v*?X_?9%7M+PT12n%@KqGGHq$T%t&2c-Y5kKL`R%&TL)x^cD zUaBDqrOS(t=T|-{JN)zQZBg?_hX3v zUD971D`=ZjN;iBJe1|8r=0P!G^q$-W-t`ab)!6edkVVGUa)M1pOk7ItEQ>Xl^%OyM6)y@g$agLl%pnQ?YO2)PBu3yrcc?Q;vW38XhW=S37(VL@cGK~ zku@~z^@Ow&(;4O=)}(R@Y(UF3WYw|TPB2{EfMg{+w*l)rQ<&uIG}?gw`1ik7NWJ?- z#5x_WZ)mM~sH<%Me=m7qHkw70s3;&oN+Pc_S+#A;R9X+??ruiX6tEg5H!pYZg8|?K z8R(q_-G)(R)_py}wiLcws%iRad#5990dKL!=Y+`qV;PW&r(A4_+-;wFQLHk6h4t{D zP(*0Sircqa@15JgYN%FQ>z2-4qWaI*7nhmMrwRf7*LQ#bfB3mwQ}APeuEY1XOR=@A{+jixWT5(8tR^`so(K7zj8mc#`La65p!B#Cd_rc-Q^$>9RGZfAXEn_wFD37Dv0kAnSp@nr=F67a(+q^%x>-jrldzUf(9)71#89we`^> z4ZP55;fZ3hdC{9bzo8hQ<>E7RWwm1j`LObeH8unI-@WyFa%y*=Uy5%t)MPlP!xY|N*wb)~I zB-_&>>k+RQW>iMNMyM>hVDR=@RDtKX`EomE?j@ON6m&ieJce}No9uxO6v`$PBD8rvdhHb7{1^QE(35!6bG z+aGGSU8#c9eN}Z_ld2NL!NTA9fG=r|Vh^+<y6pYY3p-Zt|I2!_#1%r=3K~;VCc+lkhQ!e|y#8 zSI1ePLSZl=(jQhu@i@y#@X{{u1|VRo2SlmF`NhU?3djsaF%?(u!tuw3E)C6#5%J_g z$Em1MvQun-OS=Zsw;j#%TFdfni~pSq;1^kV4W_f_Ncpuuet9b6X z;z?;OO)~qGqDV+$Op#g=vaR{`+W@JHqHR)!ZA$T^V$-|;^!Ih6(P)6^@+_aDI38d> z!)L!-{p+DO&(d`4W*PU;!^=6kJey?xZ0mYPfAouAUYg(>?wm#mzC1&Ie~!&O^2v?A ztZ%|s_b7|Tfgj;CIZqG@$wge;Qd=UelADCjRA_y*eRa6US=`I#egLnUXDCP6JvzJM zrWnt;DS~#6kdJq&2tVhvCftJ{_vU`)Ux$}xg5dF{uJdQ~EJlx*oYl&IaJHA_QFwcK z#`CTx$|||BIOU+Rzlbrpe^UHAqi-+jmn>$*K@{J|@Wj0z!;M8_;o5b$IwzOyDjy(~ zEFP?vXIqHz)u`|1xw*j83SI{=p!YCEc#5)4B99V(6eA9&9G*s5_;aI5zFH&Nh@zf= zimo}lEUPCe);D83^^yVH${ns4Gw4$3RDO{O3y~dOdB4iT#$vy)VOIzmt?55|hYv z&m=NzB0Pe!F`R9ne=(wKX}n~2Ph*Z&1E{s8hOuYf`%z5#;!bM9j8ydJn40h)j!=TR zxxbu|-=x^Q0ed7@Fa+7u8M9|Tz)NsoN{UD;kKq|pD$_S_nNmp?1Xa>X%CVA}ej!{a zRpYU$5FoT=+272JyGf8O=Q#Z!<6@`DIGQZ7DyM6tAXDkre=|pwBvXkZ=pvP%a4xfw#Udprk6*F*PQ;J*GB4x4DR zWxIy)>2FX$g2>D;%zFF6>q_76L-kPJWEie^u4eJJ`3Y0#^_rjx{+wXR zM;MxWe;ZW4f&4m*DhwAh;-EA@mbZDqFpX24X>G5s;C6ReU+YE%^~g%HA&D+eFg(U^ zIz^*`!2ytZQH*+pd(sY2W{^4N(6r2f%X!x~E@wK6-XHLY z2kRLb@MvVlw$)gNmiGkL9T*)trp!uKtibQ?e^>{E-$?`a*CNMUn#4;Q^Ta8cq9<`q z?jgd{bb(vVC~Ar;dA3CYPRD5ildt~cAo{@~v^eu0Kga;apyy*S!(3i%Nj++^s*0v# zx+m(A6sX$iBB{D6qa|IB$W#yTk80S9#Fyb5@HC{Oou0?Q0&}`M_)rw^mG=(=LndsgI zHrZ7Ti6m3(!M1y)zjf+;k$lnEuIgUQ)EK6!m9t3{{$J6O5&St$Gk?-eD@^)cN|L!> z$u+KLh-6EK=U5d-T5t@njMn~L7%~F$e=w*8_7I9xU$HAkQFaT_w0rAYOct}K*h}-r z)v?f1g_0z>S^(a#l8uCU2*qB7G-&ZT$wWRDs7b4n=Pw}auwa?5nt4OP1~Kw8 zZnWfb6pwdhT5r!q%Qkq;VLbvqAc!Q9H}40L=(DBR+hIq7NIG|m$P`AaIMTYhfBWK6 zOv#m8c5~*<+|hRJ{$4b>9c9~>(<tZ@n`_y-|Hf1Cn?8%DEsX>=>L)sBdDTjDKt(df5u2}pz6k&+qh z+BgKNA*l{;kom+DjqHCRi`?xg3hpX!9Dr)Ce#LxO>`g#gSw{FdTqR&V0W{UMHIarI zPm};dyI-S>hoFyxc_(pSv+~6;{p&kk%CRQJyg_Ik1u66p4T-I4uAyq`e+gT*KL(6= z{eVV!8r-37TD4Dh*9``EiRZOrOeJgFZx4s8>^9l#=9AjTLT%a6O<6W8Gug7>2$tv3 z;Yo99msjY7muG6cYHYJTqT`Kml;!v)N}$fNxL%Z8Hk*+MZqdXqH#3={)q463`XRz7 zAX#8sl;k*D(Bu4^v&s z0&dEJC-EXnP{@%5s^r3^^w}cEWNm5=H=c7oK?<(JxH?|azd|4T9C{3c)Zl*0d+dVp^x%y7So!Lw!`R;Vb>QmiueUOK) z_uUWjl-mm(AYACHIkSJwU9VC>iw)+A&72BTQ31Fv=CfUXf1~N(de9WjatuSXc0rR| zP2eqK*Ef14XhjDSqcJ=p7rTrQBL<3B{JqncysSX0Y81&2vLSmyQ5?SdZqB3MTdxV; z=_@z2XVIs(2{H+uX?VO+U904%@SnMx^B>F5?t z!&duSp!cH7e^%S30^M>Z>a`um3u!HfGT`cuH%@C|OwF~I)WlXOnkp+oWqMgObzYDt zVNZdY&ruKOKfdLA*mj0`i~YKNpwVkMQzt31YUoOJmfaF{!`KW;{>JvM+?J!Oq-(m- zM{|Q$&l8Q8JxO;fshzT_NW5he_vMo(`TkcQ$ zmLk9@H$j-L$EN1Ic9Oon3QrQXna(tXrQTGirYI_+Q`wzE^c<;-0>5A?L*0^O|EWNUEnxbYazr zW6mUa*ICg2jW9>rNP>XxF%Ld?z)^)@FNmU^f0E8ysv@823ZOOr80Cd^nt$&=yBjpd ze;>F`;fNGV)FqR*#Lth9Z7HGc{EC*nAiUe#T)i7g6lBPUVH(NNdIzR`+y|XV1N{Y_ za(PoXMNw>16I|9|w$61EzomG8&F2Bw_G(|$4VJHBip`x=MbrgBKj9TWt3Z^UhAhB$ zmWe-$f=;6U`&NP-N7{P;A0$V2EJHule}ys!^=e;O?C z^qR7PeE7}N)XIiqqM$m!k=<-m(U!}_Ayqc)UZGh+<*5!5zvWX~J z2)Cg`qYA&VAVGfY_wHjQyd5WsrvH(^2}$*(2ia<3m$agyX;lNWtumgWnU+Ykpq;de zC7K1E7fsYyQVhjnKA$+>$&C`qe_B498$}D-&yCU!CXPR!qa=)~yWy`&cek>jXd(3i z(p15aT>34*w-ZpKTjpXm;3V6*(!ip3Yilce4<)DxbUkX=r9Ko z-Ot0SD~EmxyB<$j&{WA_x8E5vO9KBgG)5Upg7?U5Bi|Evx6C#>oz1?4f7wN&%ob1c zMBDrLY)yr}c}s&dp~yjg>i#Fb7g~Ooy|vt0FW6q|qS!zem9i-Zz}e4IoCay!SRa*j z2e1#fX1k8Aip=z}MD+bOVK`Z(UBTQ`aV1akG?!;Rn|XlZR=;DVJl9bw^&1xJ2kXZR z$|*Hb&ci>sH6-7RUw{9pe^Ak=*-ClknGKV9!4Y*?X9g}Sv7U6dNt~YiVp@DA>*o5m zZ{KUxFh>FIlVYn7kc(5~Ll1Jh7SXD5VFAk-mr?Mu>rf~eKTcEJ@Cj6T=X#ZvvlH28NG5xN%*iUGr%76k`=GFk^CCaf$> zAys-fO2Z{RfHy2=D8X0%2b1x{6bb`PVhy1I006rOv!kRe0e?SF!!QuVcOAX}+PTuBE*S93HC{!*gt$>p)STdblUW{L$66g-uRax7}xhTuY3b7thYO@tc zVPjo`a&HQ4q<=tHnkB78wiZjEDPu!wx*lY5<{8a$PRuNK{pZ^n{^G5RqRikyXN?4f zzqFvBa;4E-A({)b1mxtP#LkP*-w~2tNCtFg;RLWRTQTuL1Z7Z-T!3*iK5-l+AH+>a zh(c@pHjSg?9Y-3LLg8F2s?JD`l8+)NMAlf;^4)biLVv{ZNu?!%Oud=>H;s2!haqV` zVetxxZZkWJ(hYVT>h7 z+UpNmu^W`28|1wq+YM`P{H$}w{J3!&ro{eo^z4^A`IGR(6@OcD)Y`uS000sU000sI z004Jya%3-NZ*O#NZ**mIE_iKhtd`qyn=lZD?>p0XV7PY#Ha;=2Go6xla@({Ipnxz; z&|xHD?6>cVbAp=zQeOyp#eVv=TCKQ$xX{cx6RA?p4z_#e*cM?Sk5YCz*nfWiSnO;| zY0M&=aYhdIm47Jv;rR8-ec{KPYsNKE7BHCd3lSddL~G$Aq{4(ytnO$UO0IaU??O%y zkK;5XsNga}OUHG}o{&5wO2LHRF*{>r*SPR9juuH=fU^O5C`_=_sd{0ckytbYpRwd8Fl#w11sPS`A6Nd89!)(P4sfK^P3i zTvDvzuRI}&r2CbB{b)T%Hf~y&ZjZ=CXG%A|a!l+h_kf2vB}|u5Ly}|=N6u7|incn?xilC| z8p!#h0Dqim*1T5;cjQs~S7{5XZRmhwPhIIR%vab1R$Vyy#Y}xp%yWVT+z2%EpH7TR{E~qp zC<7LpWUJf((?TMfN7*Hp(r)sn?!=ktM7d>3t9|T!OvXS{v)O{ux*Jw2gipY{%I?ZoO}t))bH!=b7$}7`ik~ zJ2g7qqtXVgDBDKnP01l=I%RozTRp#*@7z%Dc>%;XSpQe`H&uMJlHMP6{0o!u#1sl5 ziJ}+50ssIE43iwHD1R{y6FZZs>rQT)^Z^tQh6y^1B#iy`U13fMZU#twA>DOwt z;{M@8bL&W?$~fED?u}zxghf2g*kNP;dD$=4wxu*?G0r(78~aR@{jmN1?Y;~Niy7BM zS%6?FEJd`jQ>{gakcv`5vAUsIB)Q^=zKJ+RJV~;MppwfNd4G=UR6QYiM3jR0eqeUQ z%C2$IX&fzZ02WwhuUVeyGccW1 zgTWblo1qB2T7Lrd{oQ67`rj~fc#*o97frn^Jrq;sVk zUpXdr7xx{H3QCx+qJ|{NA>G!t!gpmS+3m^P5(X8}0Uym_w_?#QF|uhO==Y(obe zBfs7|nqQQEPIR3SyJ--u#~2Ck=WLWv$lz|`S)u6#*MA*Zd>Vi^0IVXCO=5VLXu^8H z^Brg8rPF9xcbv9L7*00wcs86)Pu6XaJF=F36w?F5#k9EijSllL?md=@b(~JaHG7SW zFV;B4sy%!cVluLzG{j|(cuCZpM{Qj+OfoHKw=M8YdwVDjUpw%>Brilqo0gsf+EZ8h zOY;#nfqzvOj(#yyUla43VgWY-jl!n`;}XB-pa{x<1t;06cEGfd$mUUX$*HoN{HZ%h zZaQ&cnbK-+yN^k$4E0$6P!WM8)?C_PGRJA*R__ULT!v=s35?!;{}=>rU{_YSs?dpGgv;ZTGNgsxX5*H#L%T_+AXQk_8wI>Xhqf5Dz6ESIMW#`s;lbx zqj=|vc0YLB?S0Qk`hVK5s`z9bU0-dJ@5B}gM@6?83IhND8x4~ItrvfnOH38t>4vLcyf`^1*O6YKF3!Q0?iY&(}dX1#KzI|7Ih8h^#)Cb#HX@B}_S6VCAHwVFk z9W|CIxd@~4Q5aB3RKnzD5&nF-Kbwbvbyy~tD@hmOk=pQP`T5iJKF$&ofVZ^qUXw+b zIj3WUEXkzn)(<5q+E)suUj#()Yu!5U`2ZiP&xKYRAQvt>;z>HAVi!m;u3G)HZ7o3hCol48R z;nY>ab6CgiS#cUYtVvMRv6lWT<^+&z`^9Ba>F^Kle!{YeOR|2rD%Z&SVuv$q>&;gX z(~bqDB2G_;#X{wZ)OFD_X}_Rd)WD-S$)VnSY{P#wYO8-6TEFGlqCGUFfA7yPo zI4x%OV`3gNtl^6wNc^yo%HTBzMNkF;*vUbj0e^>u>>v3nJ>+)3e#)1W`aFkzcDc2@z#79@HTkg!N2AsKcslbP3)3A<@s>N^ zQd|Z7o5_D4kM77pUcAGw?(i%`-uj1BmbHS91K3dGVU$W&#y}5u)G$%2Dd&$4&IN^Y z-pdr7&ApP&Lf4E*0E0k$zfeH2b+?w`l2~?f%U>(GVUl{AD_Y(jX(f}PHIqWq^np98;=gCzB$@VUx- zp{o@Tnvvy&&U1CORGu2uN(%MR()}m|&(#Y^tAGCb*MIe=f1+u_q=KZwv{}UFbJc|~ zZcTi)6pF?`%PQhCTk75v_K|4wU9indHP=THtv-k-C$2#;3&-dU3 zVba1KM)$(wCp1D*4}_p@eHcNcg2)1X-MXVh&($mmn>YEVhdfrjS<2sj9umNR-?V5t zi2`Tnr|>SDyvKH>cqcNm0ECcOjY@!z>==cq>&1`ke-L~Y4Gp??ko?ySkO%&quZWp< zhT6|kTc_NH7r^(Zf7`pjFE#&lM23FHZeoas#CufucFwyd0rKFNi9cnUSH@-DnSAa5 z>>B{V1m1@**wUJ4JxKB!oOd2NcU>AUIFBrWalChi=N;!oAMa&@n0MyV@0EE4U}Yb( zOZ~0~fBwPZudq@JTJFc-?t4vPSsm)Go<4%FM6}tvSxK4liJ9-|W>Fq;D>j1t}O zkwz#DR8S;W$PVB)a%B8Nn&3?6*ne&f+s6$nf2-isTK$UZ$QTj0W~?Xr0L2c&(QQ%T znJS^8BN$?;czY1FiE34A{#>Q$uEKHx{UCLKt!F;OBjr<~&l2*pfEORB*UWX~cRE+4 zFx3l@s!iKVQaJWP&_;(oG7(#+3F?FXT;-5jScG~2manoMMzbV}YyxRUew5tj;agIx zG{a*oh|CSzcnr;Mn&?nsZg>O(nN;>6NJ1SVt`MSeLTtMc+K|c|oH8!~NH?^HWLdWp z0+TMYCl}is^nvHN$c!w{2)x7!T(x2V7nuqjr;}{67#xMd*JDD!+kDdyZzL@!tyW#c zHo*hH^2q+8+)k6Avlf52BMrmpRFMNX&orOeH}avjma#rc;vc zb>t_?5OVmxg6g2WUdfW*nc>Q$f)z&@DviqqTEZeGisN2NVoqhwzTtncgvZYUHL^+?PtsC3#e==l4R*2;GBZkf58=Q=XUmTO z{Fj+a{=1P%)8M8NSr-%`NmPba8k-79;(7{a=zt+al$?Jc&QLbWRL|Au)~Z%ehPwWU zj`@*`qfwN!5}el3Q>G{AAoK?zN}UqJaX64khvP*S$MfqE2TTHomVI*fTvOVI{FV?wr zNUTxc1oMCEKDH-H(5ZI?bKw6p-Qttmgd5L-?pF!>7zTe$y!G!m-@^Vh^OgwZN%TGL zjruL{x=hNYeaN}`I3cOWIZBRH1szd_ZXREXqIQ4OQ>i^9j&hjrZYIh3M?aeRdMLHUF zD>H*NI}TlFblI7y0IQr=<<7Ep4^CQYRTshVw;10LL?#vZ-T-Y)*?9cW~RBaI)=f9n_U) z1H3WQ$L6rBi$Txx-G%3j%>}MiChLD*yBYz^z1g`F8@V-9Y26w{!6iPe2lJIa+O($~ z2nT)SOZp1W>I_#}|>=?Auo3IMG*D z-?>CxZD)8eo_JeHn)QY2?y~3(gE$xud;VLxsAy&GX6c=muCvo?DdRC6DLy$3o$F=mWmoU0!idR}5z0GCd*WKw%FqYY zX)8}og706_(uNc1wA+mOLbUd}i$Iwtv8+%5Yb_WqAJvmVdpIAiHi4=)267l!OfWnb zU}s#J;sCY{MT!T>Ooc<0J(hnqlv>K^ycird7m9M=Xn~?U?XPMav)XJIyDeX6hrv+N3Idu6+5Z022W)71&!(558O1bHY)L)Ph1i3YFPgcYZf zl*pUm$nqsIwE2NkE3R=-n}vf|8n)0TOVew^){xC-yQ>Ed?B=o~fSZ3s4IB=s&H2!s zto-(3$&UQQKW2QYb?2k3#ha_ED}Y@*>|h!hSLJ zS%KN<XBMY;l1 zvjN<}Y8NDj@qVvw^f?4vusG+ZoB&c%Jfi|Dxjp;+Jh2G=WLgNtsPW_{*oQkWgx>>E0?`Cs*+tZ7) zcUXG01KrExe%gQ8dC2w4O`&%e)=t<)A$0ckf{p5eE1qW*mACgwvho(fJl#!fChEvy zTa z6|li{!`>MV3d>5yx$g9nsK(lp{Cq5o_;BLodU4Te&NzRu7iDtjQ@hbJ3L@QS5Ai6_ zcS+XwSA7_4ref-_+&tswiE5^;q!_oNzV3%x+nGySkrHD`T+XlJA%p9h%U#P|J}_3E zxfe=S-kxZ7X841di6|WxA7)*Am?^Mhusprr@bs3M^JZ^--7ZL?T@%3LN|_>qYjfKg z)Ybk)@z#ISjFtz;5!73%+q#w<8-c8W z4VMMjNwBI@TjbWpv3Ec23E>?|Y((Rwy zUbj~84(-c9dYEONqs(en!%wH%aloP=ybg1DxjRYRc5x z)M9@e2`$;xWQ7EYBfGTdX?-!^7o9q$a2h%YTk1<3X|hw6BIpq{?N@g1tSyRe8v&0> z$u*Mg;G{v_a*+cYtv+XVeJtqC( za@!_j?g8$~4F`jB57ciqWl(hQ+WBfAbq!X%gDTkAGRcKIc|&$~Me-uL^F0%QD!y~z zg13VIzPIs}(9F`Z%BBBE?)!POtb!}W?YkcHh2>*X5R|ft zYLf*2k%u+JchT~iRDMk*_a=NryWh*o-rKLC_*3ckA6`H9v9)OWdg$EQukKTO^72bV3X&Y%M=O}+CmMew3eqn{n0jh@-V#rY45c5Uq%Vi5hqVEE3gy(( zUk`R~G(7HN#ve+WDOt&l-1021T*gP2onG(EZ24UgQQBDPZ)m?|oUi}+PyhP=miU~T z{CDX2qLA%d_^%86mqpoHUSg!00UR&9bNHKtS>zOdrX!B{67=~KeO8ZrEnMiF9iE0-IKoNyT}8*H2HcKmY8rH_yJleRcEZ?;c*?-V1#3@c8QH zN&oZlcb~nwdHns`*FSmo@apx=)7@|HUfw-@`yu8#hkw8Raj*NhMxX6xZ=Pi5tu?tc4t^Y~t8d=TkZ&p!Y8@9rNSZ+`ny!;xrz zBI*3(-RSoJ*COx#diTfMKfe3>J+~kJ@Z#nEgQotcQfYsBc#~AeF@Ip~#fKMPKHWTN zJfFXLef#p|JN5ePs z1@~b<&mV8T(Mx{zc=!C@ZXciSp546s^7YL#{nf{RYGZo;PwyZ8BP-9O(x z-s>N|1D<_-^LX=2gMa++WPiASdVF~K@daB)KT3ss@9Fn1{QCLhmtWt!z8&v}_~xg7 z|M2;n{TCm`{N|HCe17{!P2cVFyC<2C*LTlf-Ds;j6W@*gGkV20pTE$A-D}SN)ReuvZQnl05WM~E`#=5r-Self-!IUXg{Nc9UJp28dm)eVUo6vXQ z+m~NG-rT)gvG;%R?qAP8zLuf=^6R@7Pyc%RB(v}ix_SPeZ{Ixq;_m+TA8+q|_x01y z@4woD{{B60ZhzPO#m%=5Z=c?;=({0*`Q9+=+wN~(-M(MQ?~Ls)AD-WCnS1+q_t$UT z{lEvIdOv;qLk}Vn63E+k1N`#o+n1WO`=>AO{&ZXKpZ}A-;!baTFGzp;2>!bP+}`hB z{tEh!$3Oo3{(rf2#{bxl-Mx5m`=}qdlNR}< zw#?n*!#D5d`MnzYpZZ-%*uU!^OLcpR?6cpuho`59SO56!>#sG}{~uQJv+wV-=MT^R z?dI{FGI;;T?~CxOhx={RzI*)k+kblakDtB#{m=jN;qF&I`}v=K^`G@m|JVJ;%U}KM zH{bknRDbj9uYUFWU;gR&%m4V38yM z9|Ywu5Nj^aZ?i7=59aCzNO7JK@8dim%~VEWGJiY=Hf4YKo$PWrAg7gc)^#3%b0zcd zxDW%+sF2RH#!F}E|FLJGAB8>G^ac}m$~c#u~%XV zxndkVwo9s)C0_5!{5#dI`GH6NCE|1D^?#`{!aUbCr-OE>c~nN4iIcTu^Y$=r&9}t6 zq)B#owOcIZFoJm5!`qUnyo0-yjGT~zBz9X3?*$=~$JS%Lc(r?~jaR$p7#!S#v?7mS*b!LbhhGOyF`W#+2^l;)Q)Z6mdb*K#1XDtFKynHEJ@YsR%ldWFu`sItE{NYz?BoSm<`Ixb(U*MK{+8Qu%)$Ijq=!nbrtoS z4Y385kdPX)TN`p%yjTv3Uy(;$QeZwR zyA&?|oocH)Ag(T!s_NTdxvrrcB)+DLeI{FTDEv%I+CYeO2|a&lca7PG?SIKL3$Q)+ zi+^YMJotBpzsv!N@nSic`Xqj4O1-hXO>+gF9oa_9UpoDDkkJ|J;xCsP)whO*O35jB#un{Bw-&ZL-79|#%j6*y}uTN!6#WiIAi z?!14THgfo~^UXA(jIY7i$WaPu9#8d+^#^3I0NTAY|qP z5@nwm$p_C>$aRow`Lvbi?GlgXdAm{zsQKKLQ|0xkrWPKX?2qRet$(huMshWJwirT2 zKRlDPQ4nb+cV4+>?csZxxE=5MW>Y`>j$a(>)OXH%J5p>%l%T5m(_5sO< z_32?Ut8x03!>EV3BG0JoDf19FV&mA88`%w>gQ@>xNfeTJY}3rc-k!c6cGgTI@LVqw zGSAyG(evAuO^LPt(tln!{Ek2PS#IUVeu+1xaNI?P$qZZ{A(7*W-pUK)XRHkdSHa8G zW8UkvNgT?k7b$PJa(+{9Mx6D`tGsiDC0^##vQ&AO!r>Wj=j3O6suR~oNM{@DgNq#b z@xk|n65>P5iANB{uz3z7hlf!|Us%KXD5n;+n2^XGn2^#~4u9meRhFF;EbA(t>xFcV8u}{k!Xv05 zUA*gStegk*H61)XU-LD2-kPn<{e2U?WvObuFiZ0-M0-LK^AO)+Js{n6=83+C>#(L9 z;W_A{gZ!mK&VM+s!jNI&c^f;L#)xm3rFR5(&>^x*2VFI_PD#$i+##8dKI?6$CDRSmp$iH(c?XANW8$|ZAD9h>?Qb6tDI{Kn?4;xwNrqW;$k{UQ4aJtlvQxC{d7qY; z*~$p1Cx1kaE6>{{g}`fig~`6=&WLk-REXpJ&qkP~g)3L~T!nPQdbC>0k>DV}-}VWvY}+KyInb~%VS za9$=X=}Vrsb(Dh@FZS!h(k{Wh5RJ`TyCS5sTu0*!$N8d(!=ofdlQlR*tS!togj9~| z#$5=5t01IvoIKjl7JrY8bsmu1m?K4JEXQtz1dgEynVeydE;aUlqBij1OT8J5$0nDb zJ%6LtoEJ z@r))rIrFVOf2i9K;tw(^J+b(ARh)Y&q{ViLz) zgiQ86VzHh5(^&lYc!1N?ZGb0Ve zsY=#+_R)oOw%f^u$Z;1ToogE990raJ3W?0pk~8Im*u}dsId3@gEyPd$QkMeznnL6? zA>xhas)^+7X?DDur)T`+D1lt(Lx0_qkal`oOs7%D$~HKODRcZF1?$)08DE&;r;rQl z#1!{dWkkA)Whc7GmDx!y#$o@+Mduh~N}DAyk_>y*DdoyGE9LAeuR_j;EYC*R(h8{@ z4NoO@)?%q>?Ra)do?Hc=E;|l#a5>KmQl8l%XOyncIAWHrc&O|V(m9%!s(*1D?-df+ zGfGt?n&+)L&v9iT2VXOZ?{I}zs;M4kr=~f04#ZG6SDl*6Y=4AQu7nYCs4Yq@7Pho$ z*R3BA$quin*yzE^baz_Q?rLGZ)7`}zH#E`P*h6T)%-Y_n(2 zNXVfMCGThv|Bl-e#E5U~iDwrU*EnYv4;9l{jE`j}i`g-E(OMgh>gFI{hF3eJ#r{GT zbK%<79BnwvL9~hWXpXLPm0OOvT1JwwtjTk-ldA)BlIZZ4il%YRcHU(U{H3C4tdVlI z^{}Sd9?sZ^z8$jVS$`A9Tuex3?Vq!J7M`7)GM_le`VU7zb1}2>mzF#@x{|L`+)^ug zI9HvkcYHcGZ@$CxR#W5XSFX7;zt#i<&XNkL9K)CHADpeoEmp@P=+>VQ?<`A5_tBk@ z%o%ARrL#Wh(QyVU_jEW3y=@ssXoZY}4jJK)XUZcrj#K36BY(#R^UQ(ko`h7kfO+lU z1|xp4Pn%b;T)`?Nvp<(ttn5t{IpTayT*#`pKIL8h|A1tUY!{>D!MQFbS&pF;jhl5< zv1afYsAA*cT(ywNY@;~uIOZ+n;Qz>3uxx{i%Y*lJ*(IMmHm~VHO;Nlx9NjP88D<+o zF5bb#d(YOa$bX)4y=4hL^DZeN1wO-3LUzm`g~Wp#MAMmHmuNftfF-E19K|UjR(xKw98b{~2{u>ymEs0xhDynfnW~UOeMq^CRe=E}^_P5LQi!=FU zhU>6@W*Xd2sLbs6{6dj`dXSK{Pa+?XLnT>R;b7~_iid1cS@{rM5t8`4*|p0saMVHu zYcXwY!+)0PGNJQ6y-f5RncJ;1SQ4+zg-{NzeS{p>R7hce;j+&0ZoF)4d`?fu;wq|Z zt6m;~bCa3S<-Fxi4?+r`DihLpFI?KDd=~E7fh=BA7aH%M%f;(32VP8-e@Bd*_x2@= z&MaUf>`4e&eB%1@p|M9Pq;tLh<#QPPrD6`8g@3z3>YS6ff?Qf&?T}Bi6QgDC@QT?S zz9;#{XI8JIoy8*%58}F-E8CJ$`(HbR!Mh~q%9`&Ih2%4L*QR#7rsdQ}<|^qB=etVI zoqy-r=RXg~WZrvSzH%nzx?%t6RJd})<+W*M!gdY7yE$`<3QA+aZM z)qk8h|8q6lI0tsM;5dG;5%ye#%!3{kM>=Sv7CXmku9gm&d?6P{>aTA6K}Nd_1CP2} zUwE#&tQmjL&Q|ajtuQ&(S$Fd!oC6_?{e`-F34h@4h{gxziFKb>;b*MxY)f{)jN_x#oocp) zRPKyW-6`i<#WgsNR9y&MHz=3jps%ZJW8-=AF>nUA`sA6})nG4XTtYf?J|Tl^!)tJh zs~M!K4DXT}jc1-H6<9qhJOp zq#b5-*wbnc7daLnzmUe1r_H_ph?S9MP;RTnC9?$z+tOwwoN_?+8i! zJ#CZ7!!y3H_HQN{);mHDwUbQ)U@u3=;z<2&x4~J2X3ZfRtF7SJr`?S>IDe9*O_JE- zZ#zKCZ*wVgPC`iK*llyWJRK3)C9ZdA-c7ErYCcx(4=d!rAe&ExEmQNk9M&}0$(+3H z=20vm!DVJoErgTwhSWGp-S)8<+zUbiS9rDP26M5t6%uNS?aFZFNZTz~`AcK696=W{ zI4ad*?i{CRJ6FJ8nnLGuhkq@l#JpEXXWQ7aiHB9lE^}-{$f3t)%OP`wspaGjV=Jz* z|I>=k%->oGhdwf`qNeY3-8u^4`Akb+~#kdVb0jwXi0%uYx@%t4KZ6aGRjX1A@TLsyN~%xTv*TYotp+*&?#%xT?t z&K-V`)OlVQ2L`I0o5ti~*g4LU zugNFis8pLFaul@90BF+3oJ+%!oEUuBpU2vRrp(1NS!R&L28b zc2Q;a>$}T_`-i+k_)Eo8`E+~t?$8UQdtW%?DWvh9>pq@lR1O$dz4j0j*T{6S4c6B^ zy26<*A?@%zQL2hZ9Yqs)-eO!Vy&}q<^D;ux;h7XXN56WC7k{&WE0HXoakU z-no3`x`2L#Lm#GorGp;r)f_5_di9>q2=p2X*Hd)4VBD9ww_rFjC&Y2YOi1MJ`hC+* zM!FfCff6#gAAd^kVnS#!x|AYY3?YemV(+^@1S2Uh?-kMxtI)GO=$)Pq-PgL-nsdl~ zq{{ISAt(DY<-YSAOy{{{PM>~oysFO_*b5ah`4pCrb(qnqUC+C5*>SLD%Q^PVgapoK z^%W}T3i?Wi7-V0$^6U(=122rYz#3M_p}uNt`i2s+TYrTeMqu5=axG+X?c}hhJ6wcR z*8V~|pIH?$SPq7>nXU71u5bl}kj_!i;X-76Fx);Z&q#`=v899eF=Wh`)eLVB-ROsR zi>>qU`)mUuQlo5tMmW`RjUdP9@Ju?~H#MS7Y=ec2gY3kRId(f@oQF}TP&7Ju$YZ=iZK^Cc_cuQS-$ou17PO&wu5NWAA4vQOEUFLQWFjv>RD^`>tPM zBn+-P8a*C55ssb`bJ#IV;h5c+J~F!2WI4|? z#d^6vl90ujlxdCQ+LdYj#S%ZIl$rC1iW!crPnRrv)zf9qb3MHqELGEs+2KB&J`Il9 z&3~YQ^Opu!csB|;oP?es9-@Xb%Ae!ambc41amIXcj&de<*!43-&--+ye6b##IV_IM z%^VM%`)1w{B1I;Z*GJwi#~^2Mm2+*g_{g!eSx)_xXNiXE--LL!WI>)Rgq$>z><_mI+F@1+~sXGf4CKAHLVXz zhlBz7r4H6jnEEzZhwT%(Y!Tc;Rv9Ri~H3GIh>nXBL$9&t?lx&=9~LM2S#k> zT-%yHaz1#;5#}B@LJt1VnkjLtX321K>~`(jHh2Wf4d&!BOX0v!R(5<=QOLxTC)QY7 zP*d#NgA3k8V)sQ*SdqK0L*^SGtQg-w-^`kn`NlZWy1+R-Yvj+NrGK^i)(Wf>5=(Rj z*{!uMH>~rvc1P+-yI7kdSFCA1O+w#UNaF7L)>ctFoE=*Odq&o3_n@7#wu`Eg#9KQI zcNw*IW`n+&-S=yv&9csV?qp+~a}oEpbu;n}(^ll5W1PbJn7L!yzN)#S7PI~e9<7Y^ zZO;!P%NabeV}sA!eSg62ViSza*--Ws(~N|I_juZH?OPiVsghrms!)BwibA`)>thEk z8;#>LxHj5@C$SN}gTh8{GM@X`y=M9B^1fiYvn0wj%q+dJxrnEu_GQrv<6<`XV0f-m z(8kBP-uKC3B+I503igq)smFTwof$5SM%c9MWKFR$W*Nc#%B@iwG2liggCyp!d7Vn>dKFo#n%C^rG zu^*(6%<&N0m-SdvVt17eMjFN4JjY#xM82cfj$j+xpMOy^cL(3CE+%F??U>>l_&d|4 z3-fb!=jSkzB_uaIk8WoW7eaZPLB2Ep&b|qRpD8IK_qVedzNN&@?iR1+CWEBhJq48`4n@oXdQhopU1ISb?`MlH*$m^s+EfiwTKbk-L$I)u_&0spHu`=en3G z?O-8pVsyp1DNT-Y;MSJ<19Bn17UDBTb=|)87=P`YHmRA|u|PUhGJ>-sp^A9Ie23Q-Wx@n!$xFRJaNu z`NI1&q*$=Z+J)=~p6+m=M34Ny?OWzp4t5tnmfn314Lu`mtiY!(Tr6&2zfK|hhBHK_ z)_)syNL+_gz;63ln4fcLJ1i*IsRz#GxZTs7pUJ!K7N5yB7`*S$WgodagxmN1Vir!s z-|$`9F89#T%Ml9-8EvqT)Ui*nD^2DR<*key&_8vT*LJ{XE^Th~HRa;C#UqfS;xlSO z_6>oIU6*Uf`P?OafH_xJwLZvhg@5G15>j`54(GaNQ&>iYOstJ?Rg7!!Gjf{n zgujrT@;o3NV?s{;k3}!%9fI)#SLaSIBXa5x=$i5DFKBUWWERl8^~}ZO>|U4;cKh5e z*44On$xTO&)T%ca7jvzJiawK*XS6W3E+i-9u&xJ_*lPB)4<{kAwI%K>`B_{I`AikhbcqI8#~f+OVZrle zZu&T}U(GIx=9sD+Gw<;Pg`2~1-QXrq9&0q+y7I!Th}*eCj15X5+QfEyb-%EtL}F+> zdb=BmY-!g>6>E#U*}W=hcCO7(|; z`Fii=Ya$QvzIm=s^nRa2V`L^iJuSXv3RZM%CYE{S#FaZ%VhYKelkmZ%g@63O2TcK1 zS!+TAN7?*l(by4Lh-?XePs$#5qYqgso3y15RU4n*Hf`orh%Rzh8Xx^3QZFP9%r5WS zX$R&Gg^0=X2#V#doYJp5!AwXpA)#gR$){PvS0md+=zoYb@6ZAY2?KN0e&3SCnj#HZGalQLHRETN>*#^`eKQb7 z_r3W2!v0lWPS(H-l-9soVI$|-e1K|R9*<%HsZ&h9>kDyBT;wrSA$KVn45b?GR z-;L+&nD6dTX)YuTjDMwhxta%7)5|V+L8Q8b5i{SLbF9TSf}WA@GfnK|>Bqi966bB7 zYGzwMTuf{iM%Zl=7|Gln!tWEXSV1InZZh-4QDrf3Z;zHTW;~@tWzSG2j-drdsT$fP z=otx#6?4^oEV=dgJ=5C3`fb{Durl)6CPrlZtj1y7Ur2Bmw}15ebO(DZbAKuBg(+sq zva?Kxtd*CE1^s%zyp%uAj(p96Q3AgJ|8;ppa}Z?jPiZR@4+>$AU2fB^SdKJVPiXcsx@q=fgU*jY49?ih*E~;k%Z?z9bRj zd>i3;3+A#FD}TU)4Z-7@hF$c7v5jEszS@eBLljg<*QN-Ji1xBhyfkRGwAa4b9_RYHET04jS95$OCCDfwtN|2tlIFve ztJW2~V-tfOOK2wYnH2edv108?Xv0oCAr{(-1*2@CM>APp_h@az zQTM!?+#qt373woV?QmNa~nxjJx?6_Mwg9sm#fR#Ef#V z@7U)1+IE}Bfjf9#?32;zNPjm!#~`l>bCg0PrnKi`$T=Vn*=H2EL!gj&VOBAQ=?!u* z(b2775RsIkeiP!kn}R%?WHG)I<7FDwEJQKYiMfIpm$j(r|Mc31|lPqBe-TNe^5o;Hrf?Q3=r@w;dn5wTw6A+cP3BJ+-A*M{Tl zh>s4QgG*!`ExHV&&1li%Rc*!CV7x@ekcS9KhBeZ)0^f-iYj+h-@Ciu)yGO-3cJ(|V z&7_90!Pw-{V$>tH?0-D^!LeQYz8FU2Z{sR#g`Yad1JiFj8sSzz!BfVEr0c4u1C9(w16vmJ)AO# z%)HRg*X~NJJ_5PS((bC<9b8E3*d3zXoeh1EO*E)r>_dnfzn}ZczzRMgUXT&D_sLS= z?|HFFaL2z=^w@~RSa*Et_wwTR^PU~%Rqr|XyVVU-xi5}=y*%vxDdT1X=S`Vp_`pb{ zrJOl`M`E`OW^Mt1a}SelI$m=NdgYnHYT+=)SUxVA!w#2)P`%PD=RT%#O5VdcGS zSZ!!6ExSw{u8x@Z#@%a?@`+PqEFWu_M{Fg1Jgvr}XAt^Btd!J{*+qJMMa^W9Mum*a zN^9H)!^F`BWT>Q#Y4!Z@*_kf6jJ`pW6kq5Gww5w$3~SjY-ZCZv$GvB)iC^RGZ05Bfe>3ZD zc>kDMoDD(6^oRcDZRE>X+cYDZP%-83b1!8{l#11CrFH(C5 z>ADrryMJQ6)P#J;x^iX%k~C zHcx4M|7bZK>pp}O?vP=kA(QW{6(i#Dovs$?_J~Bv8a~_VvFjQ6QMYTsmC+YqYg$1s zsI6TSpZc|JAV;$G>ca@3?eF6%IU!Nrhe#?s-G9<{tq@u}}kANrMr=;Fq+ z@P9sk%sNGFd49b;55EH=X<%Kbkiu2x_M&qvKig>;`-j-O-kEI(S@>)&9$)d!@-K^r z(7FlvF)b~SiV^83QMlNjTu9{{Gygni^f0+z=)kOTA>s#&EOBz$i7{h=d#4L&3p3~a zlYGaMbd5IaVC#RG3cT79R0=k*?LLHo;=TQVzy(XIzIH!N}#8NS-c_LxyPCp zYh1}0BRx1j#7lSp@tu}!3-4{O>BnqvvB$=9eZ@w_cW`y8N6TAA5@#}d?X96FD}NB~ z7UNQ82ep~k=mE~(vwtXLsfceQ8x*30f_A4x8wgwju>;Q9b7`4@>d+-Z3&!+>_`+Mp zn`e&xdz&KpxI@~~GVu4D#^2Hg@_5^n-k%w*xk!zUJmA%34f`NPnMUwF;hvREoIat9xZaQ5+Is~G_2fmzaQs| zd5_RDK0!~q8-F0pkga>q>7uXGdnpMcxI*eef0cK$jao*CKjdOAb?Dd!-TQL(i}{d2 zVv96n$kB%)q;W?*k@%c3TJB@Y#^Sv_rt_3jA5R7WpL!NO1itOr%HiERn}6OmzPZ_S zwsD8dUOvpu2qf|SGiUm7ex@D)HM*}_CbP6?I*gHGU$bWBiEEe1JaN4|v3|~Xt_{_c zHcs?#L}Z08_y^MY{A`_hzL})-ScUr0qhUYd2$FWpyNye3A@h!A#9S*cBwfsh^>gcF zyL0Z34rhKv1JEBL#Ca-?-+vcv1_*gMJyeu32H)fR=Z*aFx=G78+QhDlabu=MkC-&x zOg+4v=nd~*7k{H)DkSrC%l^&wAw%im_wzSws;zY!_SS+KQfaN^nlA;fq?z++wEAsiw?b^8 z(i45F4?WI8TE?5U+ejA~akmwFo{{=6@*t!+)*W{L>cV(d_f!gc>bvX0z-qkiOT-t? zTrc)vHmdg8#~QGAmuSIV)ng_!f6vMV{cpYB%oRJ@HX@5hC0eNp9Js;#deXLTk zQ%aXKyjbleq%PiXCC zoKMkTq`l&^Ju4j*Wq&cyoIh=S8})X7J8?|Bzo&bKPVo4?x-tJ?M0ZEDmg6fwX3dW9 z1!Fgo5uO*!svKX4bm9j>%+NC@#98T$Z#qYP#X){dEq@v*mxJECk*afs*AR>5Y0*L& z_i`KQRPOvQ#6OJ7=*}z!S(*@E=s%Dy%G?uX)63 zwdTn0$NZ8}az5y@8>QGri!@4f>BVQ$xms9pJ;V|-ueFeY84!`_QSoGra%IW*simqh zw`kPd9)Bu{5&53jg>O`|jd`l0t{D7+$o?_Sd$jzqe@95kc>j!0O#DluVwBHZn~mp4 zk9H%~ff46^cEcpVQ0up)YO3Y!~#P55L7R*MD$y(NXLUpG479PkYm=u83SW_Nf><* z(mKCw8Bs&sIHpzGupsds1PrhO*hVx_2uum)iG8*&Wkc!LT=8+_x3Fx$3Dg#y0>u+?y3!Ybc~p{ ziT)PN^bWpSdQ^nwT+<8FRm8?#_{}S;B{p&laPA`G46; zO@cT3|(bd z6kQwsUIPi~28pGS2IE{NsRfqq7MAYrkgf$>x{+>{?)dmSKjzGtd9E|( z+|M0r<99Y-s&LI(%C>{xPcn<-vDi_2qYRS~0Ix*t5!@|dvZLRNci{-}W8+=T-&Nsq z|Iq7zo6G)>&DM-g1zyxkS{~jay#8tOwkE8W(j|D=ZyghTmLM+>U&HJ&d%svgbWJsp zkMy&&nf0XQy2AzduqUPWVwVCU-0Pt@h+ilUXvcH=JgIc?`zv9(kvFyZJ2fKe$$az{qr7PyFmJ*+|gRazDgOS^V6@n-PKfDp^&px z*&Sn|^$*K)ja;E5bTd`s)n}n}TF&SQLa4H+8mV1kAv=SaHMrN|G;?elZCafg z|8gm#)yd*2<9cIn6FkvN*$;;Dr0xJyI{(u7$TD)0zgMIIzRE8gW96z%eRz(!q!zV! zKnkjN%J#w@_kq65^O_h=w?-tv*oK#i6!m$2B_PR&1G89G;TJEfhB1y`qZuVBM+?jRVk~#zxcc zb-O!4&gs7L=x5d*nEFr@;}(_duyNtN$F2UNzW_E0(USGDF=W2O~p&6Gc z>aMO9$x6yyTz$`T_Vw|rcLq>;?{wz}jb~>&gS_=*$>(yc{Wca;cpAHrQNm7sYmxst z1@mE-Myut-v{~RK&Um~01oCZUnHhqC7`K>bst^n<%&2gM$qRvQSui{xP2W3G4nVy` zS#gQB8<2}(QDyk54x;C6E2P|)T+62H0e$?|kUpH`v{*heOkX?(2>0*M(A~~DFV#-q zqpmsM@cTA0KuS@HWt4*C7_-I}#zl8J=5N}+XV_O$35Oe$1bIrWw5BO>O4|jID3|Cf zvPNFJ#e@5O9QtmhjQ-dZa`hM;ZAaCA9dY(c!K{Oy^`UQ>4+!0{B`-&p{)9P>g*1wR@BM{180rt@anJck z9GT^7><#Fm8pI_=`hG9_5Ng z4*6*X@%s2payXr_Ln+Qkk$I5kOLn1e!z~+>AU^>jDI*NL5NsK6A2)3e>#8;e$Qm`L z6l_I&;2$ia&Ld@qUcXe6T({kCUY~8DSzehjRGE|23p8>KA+3T2^}B!+X*hH z%E%vIolF`wxSw33lENK~k_&oxuBC@|@$uHFTt+;)@xuor!Bn3c43%UYnmd=sENqXI z8yS?8myAk3cwhy=M1)H;Ie>+#kV^~jLk^WYFb*_l|5akvrlM)ZoT?KJL;hYT&W%Wa z-cF35tj$#0hK{qP%~e-;@0^)x1?R8NXM=k^ZXBg;w2f+9;HF)xw6>$?3p9oKw57Ob zwB6OTbO9=TpPTM1l8JbWpbsg(sv{mDq-fS551%0h7d2?7L52+m(i>@m6tB}b&#Fd7 zMSx)I*{LQ|tEN5yTi@CJ*D$|U-L&1yIX79Wwd*>%EeKKu5BA+vr;xFr8C27w_H(d4 zJi}x$IWt>#w%8b@sX}cB%T=$&X$_O9_nkY{+>F{6iZULPC4S$<)ik_Zb8@Sp#^k#y zNi}buH@2&#lyi%5*8cI4@Zc+VMoFz=XD9&f1l{g~w=YH6=6u~6Q!2hs= z3a5~S8?z^)<@#jXoJSe}=X!e@yO6#un$XpE)UVjJ-9a}NO4XV^4-NV9?A~93>w>+Q zd>9>zz_fITSX`v|Wx#5!vf}RO;?8*_*$%L)nZ?Dt{mj}dmTvG=D!2^+}}3F z+k>~NYiYhi|62YcojZ0P6_VC{*CPzrZ-+SB%l>P(dsX)`tG5q&fzy^lQGdnaq z11T+R2#$ODBE?Ln&kfnstX^P|*0zAx3KwsO6DEQ8dnf=^IQ2kdOl}3~Dmabn^@rGL zhV3s|bc$g%*LiB#+iTeud9^r0>sFpMK_okj!>V8H*Rh6Z?-)4o2tPyMzSZtJkW8v< zq7PK7?pS~b?Kp?`r)XEew5J2NFt0`BD2t{)G_e>=ruU4G%LK0xi(~Q4rrc|$vTU`o zG|fMX9a~2iJBl8^wQocYn4y5YXk_qmUkBama^D#HJz6&_U93y;+(o&3Ri4y%-YAB3 zkyKbo#(#Tr z-@arRccqf}dex0j%L>0{Q^x6ZlwmQC>*P6-RBAPlh3pmSqpYRpy7dZpzc&Rz+U~@- z$8&+YDN zha1Pqb(`57?4+QQ5Z>9rEP~PG@OAU--NfQ{V~q5g!w!EtM^2?Q#6@F!G;Tdb)Wzjv zNa2&kbISedlKtJBY(8J%DH$5v&*x(C;1$1 zk~x)k8(5EjWzQV?>^8QI`kBi3>k#pmRW~aNrHs1^4}EJl3VWMH=%Q$e3`3t8R%08bi`b*Wci(hOY41s=i<5DasgiIS^~M*K0q|%Yb3hV=NT4r z#Z=lF#H>|u=9S%nVq2ZB zH7o@T-tY5sy#^!uS#&#yU7Swb{f#`1>#uVGg0q!EJLH9bPItk92H-vWBrt@g=CDCae9*arsx2EAtdwUHY2T}D9g zd3Tg8&;CM9a-Bm4*O1akO6kejjA@-C5q)dnEV-`|5r+|mLjY1?f@Iw>ZnbdbUJWya zteg}|*jQBtYxjg_YDHZD*d2n_qk+pwW=s>^gZrh$>{BiixF*U_g0NSk&s^re}Y<``1SpZTOd(gn7Q}Y_X96a$_1|^4q=1wffqU7QhXsX+%-VUu%0Q z`hqvZK4{90kXU-NwTP|jp}yg%4El7OL$$0<;kYonKDD+#x05jfT(OcVovwb;(SFFE zu`>?ZNIfp2l6`JcbDH|=GLsc!(T1H1&{jr~2xu}!iB${$p0s-tz0;((GTF`ia^)$=vyeFymt?2z(lFVJw|#_>DU_YTiE2A; zdh>#o$K|<;q^nmonkuh5>U&84KwN<5#tOe8>s36pO}9n*kV0Bje4qW`x(GyaBinms zn#Y~%wi>R3%S;@#CWoELU+dQ&ROCA{qah!!7CrGWB0ScCNR*-*Ymd6nTUn&TkjIj6 z+#p41RTkY=&(o~(#{oq8b*>M{TQ18i>Rf4xZ;k}R4?*#2LtI%e&$Quj5~FVzh2oF| z>rJP+tZP6pBM!}zbc2?xZSq;->r?5M-*ytmFyB|)1TQn0*Ve&p17L@4_N1@kGOtKi zGGa8Gt}Lm643(6Qhp(DEapyT!!7*u(AK$)a4)k>oNI@(r0aDJJ%(&~S@0%RFyz^Z? zn$`Dr)@}X}qE=OD@}g(R%SNR|qEJCSTUDeVFGD>Lc39(3oQq3Vd#0j+k0fE@Rw!nQxGTVUwUxR{&H4 zdhjthrf22^4Uw6rVT3)&-uNuY1=pp!t z{*7T>kK=*X%gF z<~9MP)ck?P3zqOD-ZWd$a9|HhjqNk{w_U8 zII9bpBq+F;{h8oc%lr#$$P9Yy5&H?2?)C;2KJTx!nqg&qf1t_{sUX1o_hUjO97R+6 zAf09z#nK_)NMqRrx1GX1ChoDPjM}P zCcziXtm?pizOsw;#Sc?0@BKqnlE;=jR~3Qrn+=L*=dZrwq6U|F%E6v1n`lJb@$swT zVbFZATPwKD;UV966aRQc9ABQRogma$ZO0tcYIin;(M&bdk#|%4S~={gT1HeoSKQm) zlSnnrCNG>HROzr!6{kA2e_k85=C}zAGc$~;e)>AdTXs1u0W`;Ou=Sa}gnAc4`BVt= zYKFm)u_hm}wkjYYI^9vyxTm}sA4oEJ#4fyK4%|5s8bNfwa+-wL*o&dUH6wuU=v_P-ATbmZfCnLzQ8a-rw}q2JL{%HYu<} z>C`R#n5+Vfrq}fQEB~~CrvK@`enwa-y_Ap(W-m)+dbDbc6TQ(q^M=}>BDR;~z98>@ zG+o}NG^Hg7g#H70p(`Fvfo^Rb%b^STO$G2Y9VEpVFs!5%i>u%+2|wzEEXpl)&X^4vZFF>8Q21R_9 zG`vAOlqXQc<36N5SCThNUB?Lcw9PIgf_Yz)UngFS{ZMDXW8sJ%3s``~jV4e;;Wk$v z1*|z@!qw(g6P!%wqy|fs9%U|RT_g=~PY2z;(`lu#G3O=A;p*c$Q?L&^;KfC#NI6p1 zpR28=@i?EkmTMXY3a?LdnUrBoX4>bx<21(rZ zzUp84gGG@h6#?2`vcFMB7EGh2PUt*{vM67```+{H6tZVSfKSYFAbMCRUvdVe`D--m z%bv-UkwH6|;DkUqj^v{DUbj+jyNhV_)3COW2mdqO)Pq<`B*q`u!PR>hluKlxDF574 z?4>Ts|2>_8-TSew0_p<2m5AFrP?b%Ew_p`y0aIVOv_Oqw;q4e+<|^*rsmpV+IdtDq zmUPP@gkJb*K!Mgbq5Xb47GTh)c6q9(g%;-^0XMM*KoGvirEr)M*V#AS@Jlmj{olsV zI7(as%U-Pge~0Vs>h%fE$%N+jGolylGzUE$1K24RF-N=sWltH!^CY$m#cv2Hc) za7m2gKwMsf8#`JH=7-M$!UluG0&1c-RO&8_W&_JX07MC`WLe}`tLTazCsU?wcB6h6 z;OW$4ngq+bz!t~hY+?i?e?;@Jxr{_?QExT3LJ2%J>xC4Vf4zT~BH8qwkpR6o z_sMlzjxG&WSF=&Z{OWHT2@@W2>ik*fO@ok4mxn`cf3W8v)wMdP;0+{7PO&|H5ix(lxzXg zqwf_n3(Vhb&naR5g|)4guxl5L7*WlAB=4ZIH9d-$`D8V;gs*-Cl1wB%%YHwmPcfN$?)Ks4362do91f68Dq8Zn4; zE!LLE^Hs>Ts$W>lHLZjcgw&!RAaqpCx$$2zEfAnRGFd9~bi{X&3y(`(WM?{4L$ zOeUcpK_irkBsev&cYHKEGOTrn#~~|2HOa*4t>&TlRGpSGRK&jfkMAuH^PFp{9jh|p zge}^WNSGmrGiT|&qS0X>HR(lEe-<2@;M{BQ7fI7gENwR&c6-@`T_-T-q9R-R`mu^W zt^V7pDM;9fPojB%tY2)neXq*ROHgCwG;ZMCdC)Mv)1NX?&{5A4f3un5$q#9yd56ah&)RH}BC>(MCc{N~1iouz>j75p~Fj ztO?(?VpJtydWjpU0&?f%ue7K{b1X=cStKzn_HvHq1r-XN1%9j%;S#z^Zi!xjkP-89 zYrHT|zLBC81_0mm0$CL?s8&k`IdRaOqTgp@!(?9#d3d%31L+!rFzIe;hPg^wS z@|7yiPcyI!0+3Vdi8(_sHtMJ6$L+n*BZQ&-s1;ix7<1VRk|Z`J+%xDUGA!_a# zL6YxK51dPyfc`c;khpKAip`S$Lu47&_M2I&JRr;~@KTp@HP8)dnBSWA*>i*TN@ z^yR-)`cRYmF|nyas@8R79g65Kp3A>qS^^`6lr@)0wAt9#R$^kYX!Rd>{ySmav?QJX z&Z0{J|6siam(ZM)D^2xqjQuwNNyF(Z`lGuy&ly^rc#Bz=#HJs)t7B!J9Q?HMSv#QK zIS;sT%reB)0m^?S2#C2&PoCCF6@a)wXn!&gdQ*~jct{n4qSSHa6abEIGl4sI1b`uR zxSDhgSFq&z7~C9o$%4cGDwOnwZdvQpswZvk&flL^)XE#KSA z!dbQ`Obp3Bh7m2N6`Q8xIQ?(`=gavBnssEcNSsaetop^M(0wtq)*{%dKDLv$G04v> z2payl8f0fLtpqT zH8sd>sQ(C`yO^)(`|2-H*+!>HY5N(;CU%|*>o8iI7rqG6iSCU!^sZqZSTx=KeH1Wh z6DO6g|J^VzWZtzmaekpQ$uCvhfIW$ zn+bswBnw_g-x_u7uSwuP0cAg0YqHrRX?JQsx2Y0wWq9gv@wN`N-L$RRfJ?w4bJqS; zr)h1h$E|gToTQX!f^rl>d}ha4*c4X*Z(B`f*v>)4mG4M1K+ubmPx?`pA?ue9vz8BPyhDorT6`HWX^K}q;l&i46sR=Fr?(qCs!^Ui zI%aalJH%WahbdpoR6{c~ii5{8avYx)LJgxo3*5uKYa%r0o>9FU%4egeD`Mcw^yPZa z7jN{aymC1H`_uT9=syxBK)hv)Zp57cC08#u@g&CmS$_Ci6!Ko9R$$CB5GUu!n6N5y zV3Il9ppvxJXPzQhczHgN$W*W?`_tQwuFT7m>!r+Qy@EbZ;)@>LCTcF^kV%=yc?_dL za0i(|Ey4&dR@G}qWN6{xbhbAUp|xSX8FHv8+e#vJGDs@(62H9*Fi9j@jN^axXwH#0v5t?cwYir(dU zpHxb@zBkRG8OAmHB1!c6%$8#XTP_y|sonXHTTlFg)9cn7+^}Zefc^N+kj9)0C@cu^ z>j~cMh@thW9}JQK%r3&32Mjx%t1Y7=BC+7RC$dZfYRDSv^ZxpZ2?Afa{Si#q8D%1e zRah(K?t^f7;jb484(huKz4)(Te#LImdi`Q9E4@?*a?n8?S$0{&2v|9(k;N3Hv#wF- z2D5vjmsKTtyh~ww*Sv+xRv9w*`q=$>p*zce#WKMPRO1RjZhcIoMNUgTqge2JDa1%F zD##90T=&6D$#owndt?x5GNynv8TqGDG^xCS%DYo1o3$52wxPff%sa- zzwIx=gKyUy24#EBr!COxhLoqC)NOF@Ar7fdA&G|%B>Q_qRdg)=D!r-3Mynz45tg~N zQ4r|n4F+ts)x>jMNwh3`)xY^RRwjnM7bi1itXp~3vp8>m{7U=1t=E#s<3F>OUC(FOD|g9K_KRYy#{rKj93Cjc+jVW8PZt&pisijN1!<0c=!e^hrDe~$L`sX#@8?yQ`iwS*=F|CmA0w5+nt*QdACNTrhhH5(KnxVyrI>ackR=?)~%k3D+cXYt&oe?h745S=$>wp&JVle28Q_PsP~vL^nK$3sz51u}Ba(pnC|C7D3dCT10>5qiNyf zq!Hbg`%p-6UKioQ(%)9oq*Ad1)J8t_R>z5Mg1Dh_{l~9O>#6%7+VZTkBX_0-^(KQ@ z&-EO{W{swquAb$y*3r)kN}0mcLpJz$nTj=mBjFi zcwAjCqNJBoQlU`PkYvA`upx?V9*_Tp6_sT{WIIl9T^Qd#frEEy6g%d?RsK*BJLbma zhMd~>u?!skL&i@Io2(~1N%NsJn=;6qoTD|Y?hUMsl1``2tG`+J6WEGsn35hSl`oC8 zQiA?Wf6j1D!-|Y)Zo^Rw`vp{AV(1T9hrHX9@@&5UcuxB7_d{ob8IuUfrpaO)iIU;}a0 z;c+E1ZE}{Pd>-l_e7Tyt{o%m9(+UzT^wK66p5sTxi@I?hT(Yc2Q>tWpF82!@X=N#2 z!~^vNJ-+gwSfO9C_qd98C4|R@BsGh%@c?4v=TQONttxE~&;OsuFC!Kta8@nx)9rMY=o5Yyd1mEw#h}h+y=ux(C z|4OI-NVn&SC39Ln=Q^4rblg???=wR$U(MopiJfSIN(9P}CX@n4DIY!APjwPzL=`-E zG_5~Zzeix6?PmZa2SJ19!76>@wr}Qf5$%!J865=_WpDmQB|#esVyKok#l*P}RNO=6 z*es%aX=(U8$z(1=@QK9{|LZZ#&4zqb#<=Oo!t$OElEi&WL;2PYGPvF^phg{^f4#V% z@sOq5_Mfnn|Em2G?qP%uG==S9bTFl#FjJ82Vjv=vJ}Vcv9Zh?8)$nYgjCSvZVI76r z?YRHSY(CWi-bXX)P}O^|U^usWrk5oKJq2tDdYHx=HMf07I6ek)65W-Pzw7|o#ta%e zcGaP6*Ne@X@TOb$$X+eUUiX-MG;4Cd-q@_Un+H4FWDh;}nYC6Yq#?rP?kJw}?pqL~ z{QSDDNd-U?EOw|v1bfQpoeK+2aN?wLeW8q{_>V-=&>vnph94j)Iiqgb?h-FJa*0Vy zY%{{L|MUHGtAQQP>fKe5s`RF9sNjUb1n5Dy^oLsxj*j<(=*UNlD*tP&AbVUS`(0{p`-Fs9WdD>FFb=N+Q?hTNM`OZ$;4CQCG`Yww=n`qY zl2!WXOHuj=jYNcH22C-!(X``3jPpE)lh!5Qrgk3g${)X+sNV_e z0g4n&0fxo%bU&D8YmaIW*Pmcw?~%dt4p2#kJWD;#2FpsC8zxu{m$uRPlawL~jjmc5 zD5He{eZO(uNXS?2E@CN-Y7i_cqH znd6drnO-x29!;+1rz%g>e=+NY9Q;=ZEN5^MySD5Eruy?RAWRh;?;a5Gb}g=`y3>=D z{7{-f?(<)b^B=er2(n4bUB+=i{W^(Y-`XIkA&a|Fx+x^*_lNhSin~;q&$T8u9^uWDAB<8Yi159mgQo(fRa}--xw^#$N|)~K{D+#dV_19O%NhmH+KAhvbK!gdChipO zd}{X-gx7x#=~dE(=|T-3Qu!7LSzuPUO*IKJ3F)jhyw? z*mL#`B=oZ<-3vCAcJZ6JMbU3%*qjCHN-Qcsh~X${2Xe{ht)fP|_L;)@kx!Y;wqLas zKY2he`x;k7<2rFpFF2pQ9bSqW&Y0~ZZTmv~?0};v&$Q-1vt;`v!^F9&Fx{rD6D>>M zaKCtsM0>puZ@t=1%Tm1Z7&#@(vp5{ZTy|Vwh8hUbUQT*=mHH1e^_PeJ+%brcmb<)*eW9SUQ>(BOo`z^@;#3g0SB0BP#dM3p-T!GkH>iVWIEFJrTAfnEgGtA2l+!k$1k`3=BS7zVERKTAV}2AW=%W!BRy^O4_BZwQuuv_o(ZspN<`!Z^sUd6!!E zfkpL?&Wf}He)%;oym{XdGg=gEX4%7f!0WIl#dUhQX96x&l-+i41`l`1&fb+g z&NXug&HO$D2BAy>2jE62=L&)g8%{wp;Uh z>z#a|P8NH2jLA(xG$K(AaNTCgLz8CL!{&&QI3}X9CZcux^5uGqJI>q&vufWmiCi8& zZ`vSjsmg%`6Rb9umj5*$BpLo@xG*b!+zLxnvXx%}5L7i+BN6mscSf}C%cojqm67=MAg^p(5hi&WNe8p%rh+j#s(LeR*S#8~R{W+b3x9A%Vuu1&Xj#sP=@faPY^%$5C#w(SI6{CWyB zu!JkgnAJyJ?^P6%TVNo)N4gYhC?1)rbpe^*5%hUp%_-QerZ#WAor2~Dj26^f|7V_u z3C~y+l~E&+G{IpTR^m8fO$emqakwFse?dT7qrGq7ZhnmN8lKFY>7W>FmmUvs)hgfy zn(rOMh+d8TIJ@Y2SUn~SF{-0$=!5b;sJb{gi_m8Y`)D=D2;x^1Rl+Y_0z}GSOa3f+ ztUjOk%TQK(&iYd^!LIwK9wF|8M{ghLjZ(6kIyb30yR?R-9ao+duK13ZEaNEjGi5hT z6i>?^BqID6{YX?6S4YrnJ6_yKdI6t;-LftS`5pE3`@pyPa)VtYDLC_EO&GN|q0`wu zD58Imskk1}f+?pvKa_VSSpH>=8Q{(2p<0K$2gYYn7U+HQTR11`wOGRP5F55jxKGfgqvC#mt$a1)u$ zNgg_wjC_y5cjdA2e-ysXt~xLz?gW{IFy&*o>B`YijaiHuDz3*Lj!}N6{C~KP|C&1r z>2{*17+d&r+JEFSY`$}5$<9`bzxuE9lSm*5ON>y=;R(-#!=Q|EJur2PWJ_knPo#P^??FecC)N3^RgV%PWYQU*Kk6 zl^JWE?a@1N+~D((Z^vgF!njdlizFD>-1CgYlX@#$ewA%YvXf`WJ>7*)mPQfKjF$=5 zprdRPQIw{pmf+|VF##F~zjw_wteP_O5 zlfJS>@6P-mcryj-oP*T2PbcvBZhaoMA2)m)Hn5^BH~C)FOQJUjq~>7s;Q~J9$GLt3ki$r9OgHAI%`yVykY47YU0 zxM;`i!%{lK-G{MA8&mzpWYbp^G!txA!r5Ajm7Oz(Im@0|I{}n`Xeo`jM*g*>qV&s; zEry9I1nAeTILh^(#*tHk5)RVCmEnIoi!VbP=M|0C0W=D5%|@2Z>i!oZKNovKH(Bba zr2~Fs>6RgH`v-; z8uRtqh%daC2D@(p?Dp)0Fu-IUuI*bdy0JZ?)Yi6K-U=!q`o^oaZ&Z?eR5E#vZU?(L z?QV2g056N)M@NxDt?Sjk3_MUfHC6i&kno9y&8RFM2hWWQqP^i@-q@!uk&wwyN>&@} zC_HpiE(PYh^T|&zw_baR*m1g$!YF=6d#go+Ars<&jsJeNC3-=qb8$>0lO`tMx;UoD zS7wt?qV-AI(r9WJ+`Dn=qtG1~e-)Gv0o9fT+@SxSYE|IggcI16QGR2OGLV2dVb(w*$_kdNLCXa{+M79Ru-a+dl0Sr>a z*}^e!R2k0#g}qIclVV7cpo7T*w)!3oP8#zRcQkPErqxO@@oQW0n(?3;Y|=+**DK(A zZ`11JV~3cI5pbXEf8QXw`Q(w5P+f5}mem}38p$pAa?3MVWe$#ywv5+K8Aa{hvHqSh zfgVH)zTWOauFThbJ`+kbXOM4E=Z-8{{#(&mIt#aSaNF=_^62w*)#o?(L-8o<;Wt6p zRs)2GYNlTwi=Be7K^)#ow?EY zra9cBHYQj;E(B8Cc%uwB#r0=oOB`nms9xO8Rff{C&nZ-GWH3vdFwkie;861)#lenQ z(6IDC?PHrlhxKX+CeMP=9X|$6v42(Vv^<;nh4;(Z16u*&6g(GEaa_b~=uF-u1a8YU zznD0I8b&8axoqC&GcIPW{tHfzjLG=5N`qIP{FUlW4JXZ`vm!p}aC~`cj8?k{%Q&i+ z7jH$dk4_`QLK;V>>fbRuU_DezotVvo)=MY?<93XN*NHt{!1ZX3ia91&juQ%9}Ij=AQu$+B`|D|K!MIcvtrrEx<@=<$No}eS0UUZ>#h@p1D}IFO`$tbf(J+&V;v#xpb4V zkH@LgR21d6Xfx{Wj}_AG{^$H`$%_fkgwEyX@IUBOQjOF%Ec`X}Y@pA7Kq+*JPM7`P zPRBhsQgjpqXnqiSZq z&_c6DYk%X|%f$4QxqTSwM_aJNeU=}tp$&Ha!pD^7M1&;g@mL84sbRMtJ09}gn4!(H zf+VhAZA*3TE)A5PN7hyKq{bADnDtT|6s$Dr4zN2Sh5dk9g+qDD2? zmGn&f7soK~^HwQ&Igvs~uWs4R`0pIhuWiJL4^OtU z#G?~4^ou4xSZUfn)ieeVx)z|DgR-c~^{6qCtN8Rx^$GyD3iAebKR?+ne!O&lPeJCVPEs7{{d3lAg2U_`#?V{gmXKrwgVfj8r(m&nAW=as z0#K__n&f4+UOLkvS4>N>PeRPf$K|d7fJ76FQ4KxUe~pIyik3|ct2~ATG=y|Ng!yu% zhD`V+c+ux=DL&zVL}^?hzUx~zqNWSEL+N16i(bY}mLt4Mya`_%0H6Et4DHFHn|&7S z&PD(tpxMhO0jT5bd;?RDRD<(l;)J(~QP!!P@&L0M%FJ@ij?{vBDOSb7qENtO9o*p> z7K*C#SaS$ZX%FGPTb)4lFisTFxn^exMD}0O8Yw`u4lk%B!E!n>0V%Osa)Twi^F%dA z-w4BESRO-IKE65cvsp0V-JHhETc_g(NeSVShR2LCdZw$3$RVTDEtaTsSkt}h->72U zs@vwJ>5E0)r>I;=4PJH$sQ~-+vBCP2#ay3n-Z?X2G4_C*qgBPIGYz~ggURiv3zhj1 zjHCA=demY0ccCp>@{{kRs)L(|hcR%t$+utBhN{nX4ub7VgSFpkpVp>0Ktkf1#Q5u5 zzuRNZnFQKjUWqm{355KNf~zBo$&uDOMCKi{q^`|WgcgMK?p4rx1f5VJIF|yA#%Oiw zZLyr*!KZb-*@fywBOo$wHprJzhLFfPnRVeYM=JForaP}TvlR7}x$g|?z2&#i&mj3L z;jFlZ{b-~$qu@%K;P$B6X3n<5{3$!GD&krl))eH(6Z>(`GvUBLO{Gp*ROooS_uyda>>&9*uUg&-`uRfm0bUX5 zHkiCzoGT}bR`{A`bTZnqx0fkee(>KADcGXU3QTvGx}F?9^_{2FBF$6d728_)?!V9_!$~`3GDNs`Fc3Kczidh@&Zq%PYCA*srk=f8qC<4a)`74;6?=Mo}^$*h;p(CYk=ev7Y##e7G1}t z@oO(2aYdUk#T_IxNdeVN*j0^Qs7bKV#%7|Mu-tu|0x{9C3R=I0dNQU!8+CPcMfgABP{9@vR9LI#`*|>UnC%-H1)>ar}|jcaq?` zOqbB58^Jrj>!~y4rh3y#5# zhEP$96>?*OsPsg~UEM#z2a}jkge4SFTFum>!nM$xUkXcm6R@RJ=?(4^s&-NrqH-(!dQd;UNQxl+^FBH!V*Wf3S5NCzTB?C&`P(WqjM-l%w z>WQdE#)N@c#v_v8$(&%()4~M70Ol2*8{c>@SvVQn^oT>OicXBS9PHYqx0cxDWO|0DzjrM)j%whWT3HVlv~2Kv44qBqzmuRn=6nhis+zGdm_TJ;%QOvM%aWy z+MqS~f+QsnavjWP|HCSylTFh0=M(?(0@@D4+qi0H?Li0P$97&J4%+KVHenwkGYhE( zDjGaV=q3hYcrBT4r(*#3b~mtP0`;Z6!EbM0>3;EdX4fgQV{D<89)Pybc8GxVDr1d9 zaJxSeaWk<9uJhJ>Jk8K8A$LqgovRxEBCAeIjmO;8R7k`w@Sqx>kb7KC6wAIuMSdl5 zo_hH80#|D}m7Hg&Wbe&+YVF920;H`j#t38RP>aYUx@E`azZyTQEp_bmFqZx4NJoao zkoN8%h0fi;GXHqc1`y5=Mt*LyPhy^%s5Wrd^8(GUWo$hDo$O?%SJOaLpQ?_b7bdC2=qvT z6{_nc-KQcUxxr#P*sR;V@%(&wZDF-^7kTAkRKYUTvtp_d;BAA3@lZ>Chf#@w80B!k zwPxs3X~>`<2o=uFZR)~ri(12R40y^sqN14H@^59Z+(dD?&$|S^LvPmFK7r`Z4FKAw z=rf|(SJTbt)%~ev0Sf+s!V5XIZaV#`lsV3E23%yUCwV^Y!^>n3ywqNL zC8hrdyFf(0gSx8(f6@>7`RZGVvuA{OLH}rdCm+m%tS^Ee^gAs{yP^M}r5HU;d)m_C zIS+xff!d{|ojO&Xh>Df=s6ttYW$b?)NU!K!Y55Z+=f5^}fM|6hQ+FXhXj#I8yebgh z?N(xh82(O)?rV&A#a?bgR=Rj&wDJ;m^9jT!dN6b=NT z>zn1x-jCd`eiFi{GM_9V7yT41A_B;- zCA`M@l24tDRvVGU9e*A+sJmyEOEm zOS$Eaf4Rpk#-y-R3E`|TAwJN*({9aNVcBkPnRo7X&zL>au2ebekUI;<7usE=@&4RZ zH|8U?8^XiiqeZ}Yi4Z%yb1yq~Ij9l*S^U?YE;K$RLI(5R_w_@a1fr`|zF4i&q9~tl z+P6j5`3(+FT@muKA?NEU)q(eRPdz)bClR4qf6)q+M8=$1hnqvxA5=AifdWF3;k_ma}X z3YT7LXAf;J;+@D7g?L4NEyeqzLOGC)H%5=nMZDWpf{0$JUQ3_oF%x1PbyctWAANQ` ze;o2?f%V|gEb-O3KcA3MKFogZ^^4YhjP!x|RlVxY!Z=2+J1Q~|xqhj$Z|&OBkNThs z(Y=kFqBqZjIt>Z=s!`X}+Iu#ff+0jE272ndwwwL_Lh?hOP}e`M`U}d59i9WR&3dN~ z-&hr+Rr`?%)4RwR%e4@;Bzoj=p)Xore-kyzgovys)>Y9x3hUl`R0HxZnAu~gvT)Vo zskfo41mD_X;yj)?-z8J8us|wyf)a8I&Y+N@k`;)SL?6<=n9J6OHLjo2W>?Nn?Bk30 zAtI6M@dNo0k?#MK?eVR@R1&YjSL$TF6ODOTSA8xXf~WBt(YX$h&j&^b`zOAIf3ckY z?U?pT$do9sc9~v2zO&|M7g<`LQ@RhobWWS-0qk>iM^A8HsVwxA^d(!DI-u5Q-}tbb zLSL3A+6#SoD;N{+ORNTMz`mBuKt^QapdH-TlQF?>Evtkjeutrhr*XSYtRCq5Gxmn} zJ^SI)xTiaMg8NB4udPNPXHW-6e<2=Y2@uhJieC4AX0+u*WQCLK2eSAyo>c~VH2c}f znFXAe4q8+F=I8>1NEGa&^xj@4T2qngn9(=bua}Dc>wZV+)UjGf%zNiISkF?Ev-f&A=Ppp=-e^iV!djc`c zwZn6-ze#L6oRfBn}ModfZnvzjtThAjFzvBb+lceJKVToorj2O@)k5wC`o zk0!Rmxj0tC35k0u<0oSb%w&Tutjn=*&EZ{dqQo2ni>v^gs3auj!l4{U`5M|X76sSn z!#DBxiy4KXS|;yL%pyTQg%F>p<7KhQ1VTBmn3{@fV3FL4f6cQWf3yyx2W&+iV%}3j zUyZpZoKq}h#FP$1zShyZBE%6c%e%g&0oTh*ZPO)rA(}ZN9TsNo=16g3~&M{3nzBKrS*nAu^Kr-BxOt%VxVe z*OuFEwehXFd;76&dsg=5+1^sw_@!D-_Bad4IFqK@iJC4ve~l;Q&S&Aoa0pzT6AY3O zOW12XZj0iqmGAVy`alTwCl_*kWBkWnG-G5$AB5aRJlPz*9-d^QV~k(-May_Q2ZDW^ zg?uId_#NGv$cR1XZ0K_cwFmR)fsjWo1q5=HoHD9ka%xNz{h2ItI>HGk(R_AaNSx?ncuoa**D$w-dbLG%Xo~-!P@c|ROZ+{ zS4d0`L}ZnQccZsmGFBXTJGLA!Yf2x=>C;5oJn2a>81aON3jK3qH z=5AO*e52oAB&2tK1N$UcC_6Sg=bT19Zb5x5ZjcXpsoieN=Tq=VYox+V6}g~(3Co$Dhr|AF-tIYw;#w9e9=GeSPRbHk4h zuFfdNTp%`P-dMwALtYN+;OPUw@ZDyL3FB{$e+=~Nr5Izy${w37KJ*G~&X`#G&z&+c z{|oVmGoFJL!@zvK5Zy+U6mq2=W))>}#)e(m<_d$)j;n3fjjP*1&(&o6<6LYT2+`%jH#o@x#$D`4(_^KDoi6c@=lU$K%0=WwLk1JmhlY#0eUrDX zB9eJ}qL3ONa+V4y+}$Ch9^M5XEsWljUFjywu-olEeE^YJaQ2#z9X@P-Cx^gHq`hhj zng8usC~W(`5eoLc*jr`si5K$Fdl%9^f4r&pJ{ZAz2#IsMPO6Smn1q19M(?5IzDu+~HA@ZZ{u{=Jo8ue_=_w z_(XNqfIYW3u}-ziGl_WXyNr;G*}k5gX$W^aPs^yCdzR8dudSEh<*kTBFCIa}hnwKK zm0TLu7WGoS6dw`izvefX5hr*#QZ7c!x{e`NG7GW6XQw<{=$rK#OGfUDUQ=8s#e}4X zj8nblTKL`MGChos%AYJ5^R(T|f3+|#iB)S)`pr_ZXJbtWG z6;c*<=Q?|D;GL`TTrmRJ>uZLVU6Mn5Csj zU}L;W4w#fM>MTpf^|0NFcANiNFU-T#WuqOwjkX#ywsn&~iE)>1Uu;XgV9N+V%T7o$ z^y|B;Gi1=}J;%!{+TEeTQ`JW}SPj&>bQw$Xe!@b_u8%0AhLIEoOXZPD#wi$mc*QiX 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 F{{#JLi(LQ! diff --git a/XEngine_Docment/Docment_zh.docx b/XEngine_Docment/Docment_zh.docx index 420c88cc9c722f47cc70ca8e1cd2da3d945af490..a9dd22432865c277557ffdfcf40e971f4291a6c0 100644 GIT binary patch delta 136031 zcmZs?Q+Oav)HNDSIGNbS#F^N(ZQHifvF%Jav2EL!*iI(4ee!<)|DBt2Zu;qqUA>>) zt7_F+wYxu7VA5`2YRI8rQ~r*u%GH5@7{nwpKw$w^ZYW}Hms>fFQ*Ku~gB{CWU@99b z3ma#64<}Y+R*nV;(u`hND^@8r-`owg@HK+s)X2hnwWAEccK$(#6S{{Eka0=Vv&M9f zYgkJ7x^(p&N0Lfaro^|E&(2;aRs`GVl$GcBo;<7YsC_fwlL^!0GFU`@DzD1{^x12((C01ic6uCW6g;Dp z_*^<0rZzA?(K|PnUwz4?K_x@LZLe>7XY9+!Ru4FOH>jsk;?kWH&`RS|;PUbE{^ql9 zlgH&EB#H{yDvAuAd7FrG<6&aEH?TF;>jYY6Vm+yCD$=;leOBn=a4~t(sZ(wU&XfFK ze+A+H{ZW$jO#%k?=0d(NOJvjsWAMjQ;|WC=Db+~1ikJkmh6DrKa6&SvOG*JLwZsLD zgp8_UD3^>Yr@H|s-$AEGhkWKlatB`|`48!T5d@jPeJ82iIn}WFSa}(AIroyo)$@V0 z^{06#7|VU1a*e(M?nO74G5^s%bzebzt0YBtpRLl}`QDdDJuBa>>X+WD*L#9VyM1!c z_6j$SbN-L~*#YU&>kUJ?Cb(|f1#l_-M)1M6AhY4V`H9i%V^ileY0ck{|3*cL2rf+h z5Xi}~bGUe-y{s)a1T)ZhL$biUN_~O%6&cwemaR_VC{Op_zDSdHcZ$IeR;-qc#~xQx z!6@lPgDow?+jA8BClr3s|At?wgkUR=H)0 zNuuEeg#&*T$YJv*TaHrGFQ?5LG`7=6Q_R?Xh;;&ie06q~P9;s?Vnty!gX_;{!xqeG zeud|@IlL*;F_qK4vF$2J-~LfAo18RSM5_^sZgdAd{chua{5H(fr)SLBC$#S*fZB2K zD)*kchw?#ZR4n@Tx9u`+DIMTe#pK%i%zW4+gerC#T+h(O>1(3lNXR>b)4iA1zR^=T z`Shs9zvHYj0^EHF1e*l#EZOwxZibzT$s|9xc7SNNAFp(!RE^TKEmwCthF5#y#}h$n zw}AxzxKjsSe>~BBxHMe%l|aRL&j9!Qx75S1!3f^V1e6|~5SM|z`2fN%rsRw}>6_I2 zUJ)f8TrzEvWZ`-1R>8Qh#)Dob?`AF_zKK#10<5QE; zo7_NPVbW?Ly72t+*OKbAY6|*#Bm$LQW;OQ{nWE!f(OGHjKiY-Mw%cp>W-}^Gj#7NN z_pBcNY^!--{*v~M0f^7woN-4c$nl=^E`I;#tp>N{Ez>8Sud64P*az0hFlKOh+~IXr zO$&6!XQYi_Ofz>m&%5o!_gy2+F%>*!nyq%d43}PaXN`p}S<#;JOR;q7aeFnYJgdtO zF*p?!7VW70&bjlg)~lVXo3C@WMj7kB*6Q$f3yrxiTc0>;0WiAOlcf$Or{Bw&aVzc{ z6JO>hrb6?w-P{H@I%fWvU0(#T=p@*TcBiIfh|bqo%RFRR9~P-dv8v3j$uzT_=U@K5 zUsNB%%P9S{?$E&HbEw--<&2+>KIr^)s!sIe)VBRiMrBt0eG^;H#|7msPhiKsR-PUI z<#9NgTEYb?3wU0>>&EO74Or^%%E9D|r_Q4KX9gw(VHXm3wX43(NRTXhK&E+)>k&3g zJ|t~-#yI>bUpJkX=*N`wp=f8UtQW>K2H(Ub7xS)$ z_5O5lyw4Mh$JR)WT+G|^UOZn8_Vu{AFO#BS>iG2jJ3y{8*1Wh~@F?rhhqLxn#meGY zCm$s`)lUo8wYpt_r=;XtTmu|)yOZVTohT2 zJB#n3{kpdHP1%dZ(RcgBrD~x*5w>!$yrVlK=Tf(nx613N<|E`CY7NW6$*cO$&-NSs z-y|x9jKKX+OIq^FO6rdty+#$c*53JmgsowbaEM($k+kxV zX8{`W+4dCWK5HEq$m_TkS-jfxqc9!a(-BQ48sF5WUq=z4R2XK|QsoQL)6{xCWK~F@ z0WHK~paCEP?<8Ry%C$78Ix~g8#SJ~HBQx~>)^G&`Bs+j1p>APb`_iDI?0|9h49FV@ zf=Yvsy$nOB%6!8bnI>-34h;p&kN9 zelXc-e-Z!72ZFLp{QKY2Ot%U(p;cL_MV#|)V7N~51Q>(BSHfK%xBK;nv#gs%aEF*5 zY1zWWUA9DmpSkT zL{l@MDB295V@5r~VA6zIZr=xQfcnEq>MUj*LFLc_6awimReZPpAYxRMwI#bHRkhAP z!Utz%>|#*T_Ja@<*`O#A^u45WNzu?`aYidez0SUAJziKS{xdl}W>EEIJLTCcf?GzDJIA~yG$ zHm8>70%DGlIpyFKEdgM6z#>QlL@r^-IVN_*#rNQ}QtBOi=QuD)c-R?Ft5}%X5iPr} z+hIO|7W@Qz_%<`>C5b+kIp*{eBmo>%`ax*t>CC=H^No6ps)P7ur~FI7uC8LKAN(zl z?+ihw5IdT+E+`pATc1{wOI%H*DB-s_;@%L^kit<#XUZQU!cNY8@u==}iGmFf&+;DUg7XVOf#&-q z9_rg72r54Wk(&jt z427^ls&4dBzb+lX%=(#rn!uk!;h(xZSWnPcek2?YE z_D_Sr(wxO!|a%;wYy!4{x|7F zH>U|QD5HGi=wLdSCt?vuBKcL}X(SUC>hO%&Q{=MH(TS+I+GIIQ8z1iCe&T4bAo1|w z<8n2>ZyW%tCmMc(^1WaM3m}oCHH0w+N6W*4r-oD&EAuIVg(dXg60p%%a7|?NQ*aSy z{)PBK^9zFsmn^5qjOLt~XZ;itZY-U+E(zm_4zrG_eLw=O-}ei{V}lU>j!R6ByyWf9 zAUK0JRDlP29S@YtK{fo1vVoyJ)^43WQbbabzdoTs{ z{ZerK;vp~-OiyAcMbK>-^f)MRx?B+xw2uAbqth}Yaz0yb)^*;9Gnp|CPxxW03P3oX zK@tG4NGskB@!szmwMY+%8kI~3zr(FXU`^fqQA;J_qqEn^gSY3Xz(iYa*{l#!23tAf z0;nnZRe1dh;s#g-iYF*2}{zz2yIcw8zVwjC_f{Os2)*z$U%62xH23leLPS^A zzTJU@8+Ja6xvxWROh03<(Ss&XHzt96G$3;IR?v8B=X!+JXRxjTQDN^PhM^%X8c#40 zmOW9j?l&xg*@gX81N~q!3W*+o0SJCeLbmWmLf<3Xt1q7S248BS(;5l$|I-_#WS z481@k7$8Co5YeQ>qKOL0?-0+xrhqXwL1Ml*MmN~4-d@p!?MTe|92dY zcs#}H0N@;`Kc_doA_%+RY05DHsc26mq8eeN(O~FxI{I+dc}1w|Q1zo=TM|~@8Ude@ zl(g#Eew=qyd?xy66F;GXW1i6tfDA@l>G znsVOnq-Q9suQ}I5Qzj9%w_428DXQ84D6a*AVR2|a5%QtAuxDd9V4z!3Q}1eHhxH^w z=MLlZ6Myg3-BV|C(Q$n9R)j-Bl^QNX%2WY03cV8^k&KlQt`6z!+_Bw6JlyYru8IP| zVx=dBAxX2vY7@!#ay3_9O#5-DU~dqVnfyH?Oc$#CTFB%$`->SxuZ)AfpIGSw!pNe8 zD*03@?=&7(rV`1{d5nM#4LvarNu8ozqTay-v4iZ7sO>Rmd0hlTl8~M6utK7BLBwku zNaKH44RD=gygVL=xbG>!MWJ=4ov(Gz=VTraDnenuBtqu)7|dTCaPkCu!4zDjMTt9Q zt|*ovT;KwG2>F;JKKbG|Y<405t;V?E0eWbHfI`Rb1K%Oe92!j-&pdkh+;kOS08e7s zgUd>w`yccehKJ;q)ZNN#YWm&`K^-9Q4LX4|l$^$I|OO0kh&@OzZ_WLQPPvh>wr%|T`I*geK>CN5@gG7{k+KELSq-gsek!5EV? z-=Pkd6U|;>CF?kOdjkk0+QA3=+^Dq0%k$4LPTc88Wni_$*6*sVSjtom0<7;8l(Y{K zmnVp#-o{XD0C}0wWks~+DH#E&4q2Bvz^r8BxgEF|Y8#<;PaDrcT8aP>)Fy%$v-OiF zhCUu(pygux79*pRa3IeCf+z|9ry^-1Vw>{niAfPu&d3PV7hT{#m3p3|NfhMW{$0SYJHiOpEWg$7P&C<=kRZZ@}^ zkOo4up@oRv@CuUwqWGR608J`3LNrV^+_Dd5I}S5cMT_3OtT+1ogBsY_!X-5eTGpir!vverR*Z+psWS3y~CAK#&1XXo=*;N}>_>M4aAs8$7&Xe+i#-V2XcU zHAl_&t)RnoFbmLq-YsQ!gVMAw{03bM6^AZl?@6Fyyr3ZOJjX{iURK(hN5=bwPuTg4 z;1$C*001pMK244$T{j2CyWV*6y=Z8;eUQqe0>NkW8*w$=VWlqmy);T{XL!E~M89p0 zmmpU5@$OH(Bf7BckRn$Mw8%g2io6+MNo0ax&I_5#juZZMLm&(c*;eKoBotSi59`t* zN*Zh0DefR_P5v!FgX6=7!u_t$*`@s@oc<$j;ETDBdSJ3M^$E`*Wl47+l#FGXDoa%5 z6lt4jRzMMOV)q1n*)LdU3=4qi%Z>h@)12BneD^m(c>@N2XtuN(4>*wRlnV zen`hyU!rNvEJ(j_bEA4a6z+d%Yg4 zTTJ%sxK@~z*e(_&&JOH<);}0#ydP3Tz65Oi+d>s>ls;nul9N8QBX88mSG}0PZe)7? z6T+e(B*^rFq7g>wz2VuFw~NYZ>Ag<%6dkEpMA~yYy1?nOj}Uu6(5%_(XywU^(c^CC zYH`LcHWGapbs+y7{CCMd!cheq({JS6jWJ5NBB>JgamW)M1*UNc(M4KFU4`cyZs$sm z2gKH&4ALd?{EP4<;sLM&hzz6~d>QR7Fv%pN5r$BTO#C92%Elz8s>0+A_?xA?8o}p$ zArUBq=fKyi{(h-}uE)dP39=?!AVeN6jpdmPw=Vc1TNCArmpm?DPRCtd%SW}F#9r%EMR&@^~KSCz2_=t-ABvQVh%6x^x%)D%?+J~v2$|L;sGX@`nMf(Wpu`uOOcwc()cj=BC%FzN4TWc+*ZY2pDeWLC(IcO&M4j3s-^m=B;k zf#KH7o4jOU>gSu!m+Q$~2N)PsYy>JP7oc>W9s3|xU=5o+k;W_J|HNa?${7Gn^7>j+ z4dKHypVhgS{cV6+_c6fl9%Dq%E~@tts` zrpGZv{-S{hfx=d!JnMgv=3ab0q~~|sbqoG8vv;TvSVDu}{>CB@V$}S%Kf|T{UM`}j z^MqZYQjxETB-*c=brNXs1v=K2gJ5-e8hN~mn_RluJSy92Nv9V4QMDyNsq6?v@{oe6 zFw1O(MG?i7Y^aXuIi`Y9Emf)PsNCUI#3SsDiT;b_miQAe@}(z(P<7MHCIsT29fIKV zMo|a6zU)ZyNJhAhmDiqyiNT=Gr*>v4IBARE7lI(+!u>G9w7|G1QZSo>bQB9o+C=b< zu%&pIs{1SVa;#X)+pCrxej|}Fg2V`9AxqF1DN#oHa*_#G9YL!hQ>X;CvENgW^^D{x zp|KQ+-DfC91Cb$u!~o>REr_VK#T5zb5Olg^4VDz-DHWj3Q2{vYu`8+?KA*W}Mfcg>*aiabp=>%kfsXS|* zrOMsK_TwV8)K+LiiMK;n2k2qmgYzh8?l<#te{>1+KbS?d;vbX=f@zgKFsuK0x3bkQzsK{QV!9C; z>yIiV0{fR2oH8LUz;Kj|HQan1H3KQi!!-ASnX-;UY>hm4+2&mkk2%h;L>$!8{0pqJ z#4`1Xo*9wSG6Q5({Bp*q$H~L|?9RUEH8N0rS-Uw(M_0&!tj6pMksBuuMGnjyjg zD{zD&o{Gl#ArBJQ)W?57(S^Rj$%}x~B=mq`wOLB4l7bF0=g|kB$ARj{L!z%_dY$(R zBEdyw#I9Fn@JIY1{uWmIpBU(c1{847H~0cQ86cEkVwewvBCKONA0+-n{2UwmxvH!e!p49~{f_7|`c{2xp7dz)c!dW|gylrkg&m2lz9Kp{FzhOQ|G zi@3~1WCPJ*QzeFw$VUHJsIU~vP)@G@vHJ*OIx*B(Rlt8IH~vNeArapR#~~R>iNIY^ zWy~antwU+GntqNcq;#gTUH`31Fo{fFZN<1;;N5W6n`(37>t#1AF$bNs&J`inEQz7v z=nebhg6nUC#Wk=i2G@~lL8STH$Ncrd?BX9h^r8@Qg#aFpU+?c9zBOdR4B;phjdoe$ zsxBHsLBQV2JkLfWhA*SDcg;Wd;HQUQu6)HOu{alMssD#O23Sb95!HV9KVY*bncsjC zQE3Pu7X%BzvXlm$@xwskN=_2Zte#e|ld=al)~IV~fc}6-3*}#d$CXU#=nFA6K*vHr zibB%}yhgcqC_L!U5_qJxb5b9YJqlo zH=0>VLw!y~C4<#S2g?n;*3Z$**ILUk@-dI#uQzqsv z7UoXI_$YU$Jc2UuF*pnaPPp6SUFNf^FD^d|H25!_jr@%sAc z)m#+DROA}5Yo=XsMYSpw3abAV{s7!5kKJO?Bn$hDXYHVTu8s8`VCHQ7j8N zXhSQJ zo}4>hC*z5V8W#Lz@w-X7IRl+i!D1?&nC@n)_8wK?uDG_8P4q>CiG(G6M7Y(F0nz;` z29RoZPgKMT>D$>z+-(`1C)y9-01H}_s)ap0@u6=!YtOsk|9bjPVNx6i72jv`y*f0S zHa|n#*ru{9lUPn%cy9*(0f&N0VtL#N>9#8$EqoqHmuG2>BLr^VFH&oJD*XXSASOff=_N#>Cm0OYq;!>EXwv9_6mKP0bLt1zfC@iONvo| z)-i;w7CMZLL92_^Vg^+NY{RS3U)ORe0j~Jx-u!WEt)J0x!`~QKfB$MYuAg)(93;P}Vl67Yo5Bd&So=*aT{N2RXXaB<|WspLgv<_-`2x zHqLN8HcB<=7AY0ffNPt98!^J!^!SIdToz`|Sh3sE$-l;vA;pruG8)KEK)Vny zwipJ{^DK?0|MW&yt<~o!SJMqMb^Om^Gf$lN-+rVbX|o6b|5$1ad!e+5J#f$Ja`ZJn zW>J%^KgnbT#`3RTtD<0*oE6sVjBga;zgZ0Zww-C+*Obe4I=>T8s24Dy*(VAnXot+B zmEV6c{JQw(M66Ah%Q6KXYNoHf<5bJmy_GfEFt$kix_WwIPh^Bdl7xR~DM0r!CPR)a zk?~2yy^voNO3;jcPobv(S8qu z>>lEkLwr+&;4}W}62&YG8W_IQ8eDPtTvg}SvPc2=$keHZrE6+L@6z}8D;#N`9Fjmb z+S^+CEVWU{CyBNnO1jp(iBi5|l1F&kc5l87-KJ2nH8y&xwVw2Kgg+j+4Stu`bs9xf zFoU@Gby1bPQrdaxpE7Z!cchB2-FOS5g}Pvm9|BFXPc%JIFF(mEYwr$tL_ z$Oixir%Fc%_1HtgUZZAk_>I>$4<3|n;jpmM3@$K~+UOZWEY!l%8-jUJB&FE5+DsdU zu@{5mDS75iv||h=QD}iCpuw=6jU=mg_QY+@XMi9-eQ{K zR>w#F?Bdhb!6bKnGB#!xOReN&MBI!OVizMhuxkfq#*%Q2 z)AQ7&!uJtTGaqTmDAGa%^2l@T8#+g&#n2#ya8N8^;9!@FkPG`PFYg^u#TBWfqePtJ)vUq{7;c`Br@aVv+|3747bo9bFf??a5sY zTSatvH?dNU3pfmD5kQ=9A{vgxG2mH;yUx9=+&VXTn!Zlz`t*>vs_JZDRU8X-PO-_X z+acDL?*x~z?wuLAr|RpD`76trZn{-1CuwQAv8t?M^SQ#)Z8Gb%)X|}-u0ivET*Bb{ z>w!JS8*{?jBIjE*KJNT2C=`*>8F9teZO(JFgZ%Ghfzt<_|JtFq$$%|(L!d3~a-GSf z>{9&+^Iv!SbN;1=#V6&>oKXw&Va0-Bo?^JS@{U%O&aN{K9Z&MzrlyvTR%Kl+1n{;c zidl>nJ|Cn;yXlak)!OwTwuM)-jmp+@D4d;--HWl{RW_%K{7KL{6Z657WR=HL*JwB> zp&>SKQ-$GP=8ffR6~G}cRJLmChtaNZO}GqWvv%Zz(JNg+?37{-JZF!P%iisnT8@b1 z>32hciYUM{4U^MoNFJj0{PwUD@))Vk(Tb(>TkP*p;I+#J*JJ6e)90?)p?LXD&$Pu~ z>tI~$KF-yy^F`m)>p|AzRNzS!;XHgI!1>S7+-x6Ozj$ zOeG;?oZ9L6=ytJ~u^qml<#g#Cf0r(GouDejC;Lj_Zu>Bylxa=4 zLy2wO#s*E4{8s7QimZ;&jUD}LWk8)xIZJ&$GKRz1oFlE}2c@zX2|sNT7V(0O1^gd!0X5oBK73Va(=Mw9j8D`E#FD#--nHkPS<`F-B22P zRXLJ#N}GFqAnvfTyV=CR-TGm5GFw+QjV|q{V{?bEZ86E`(iZ6m}@S$GvNI#Cy<4;Avi{|PkNe4f=^{I)b+rAOO^zY!bae0|Gc*Nwu6u~3+Z_vMFwGnvd<_>iUSkG(pSFL3 zXn8OBZBj2PTVA^6qU8Uz#P@!dx%NvU=8+QmJpJ z%THrBp2_29If<~H!P}N~#hUU&mtctsGTM+T-0%p)LLRksGh7aRD`<4=fpj;5&2Sch zfIg0(!t=tF)n+rR!)~XX&m&!3w?mGJm$SodDtszB8tX0JBNuLWjdCHGMF8ob@!R7W zkmc!We{py-gt3-mo1(V~Qy&6u(0VgO@_2&g=Fs?HaUxN?p?dukzJ5A>&={EvSD$S( z%w6y_L|tCzpIM@wS}N=?Z_hN{Ytd2Nc&Qfm*JN>{*sOeuj62O&?b4hjCFZATv)$pA zoD!TFqlh+PHpQ@`lG1Z+l^AM4TmIMvKx;?(H;@i_F6o`6yPqC=54rQp;nlCn+1{_K zqm34X$a=ti1YsVrkxPCu28jA5W@LV(Zs){rNxN6;{|LDiP14PD1K!Fye1GDqD|fv) zzdkJB(@-!h=#xF(XYJBFaf*_B-pTo&>k`DX+#XESiQL{jZSLdS8?@Kj&ZpySy%)8#ex^v^YDLJx;>2L=-{}X>_qc0vBYQu3 z=?HQ|V!QFey;nMVnRqQ;77uVAsRmLAt0rAV6?|09&ww8)o;(ayu8#GO{ZEJKx>N60 z>ao4{ufmjORjMVupoJe|7#Bca^hx2R(aXqnOcYC*eAJ-r#%ljxPWI&jBlF6Idcuwl z{7Z7~6iz59G|SlT6<&ZrQSXBc`^Sk0EIv>Q2{*t2Ch|L2s^qY?diAS*k02wKf2DHC?{L#^@`T zPjG*caVs@L9O;0_Cb8M4qMs!Fi*X6E9V0{)JNj`OSWEPmEutO+jggNV3r;&XE#ejo z5r0gjj~jRwzpD_78t+Ck&1E{kf{htc_O6g7G#R>co zttCW_x#m4j!z?7vFCk>YG1Ercag|r4tRqtyEG0~$bc}HJkk(YEpDq1c$T3mY0$&t^quH3gg#f`8}Sk^#^V#@cl2Yzv(5lPaep(lJq8)4wrZ^G_`JhtD&a# z$!gwiWDln5&kH|o+u!`%Gv!ximAQV`HQDGe)$pO!DD7|(8QRZ&$YNyPO+UI1cBZI1 zY(-zf0#IFcdfhr&I`>?UX8ArHm|d5|M`l4s!p-?G3>r(}OR=lx{z2qEn|aN-1O zN0~osjWZx3w;1`Qx=j2U2x2=v|8Xt0UlMpU2D`2>`cc-2s7z=ZjRyh8FGK@ ztAQ&dug=L?l`BMx1vq*-7+Fe07$DZZTCn9`|C;%$H-w7^SrOAeOJ= z%9=|x6UJ7xV*==g>^4OHJ%C$i9X=i}1%?me`SzWR5^+tBPKJfHo@v%wOB{C`&U+75 z&D^M@w%mN`uBQ<=qL9at+N;Is&dGIIs(-3XUe;YSd5!N9JHhSR+nkm?3hQpvxhBr9 z)kWjtuAC-O{C*_d=S@9Y+JX@+=1eG^bB#+xG<}6RN*+&sF8@Ql_;}Om`Li>44XBMP z3H!J1Wpi4^^;lA#&D#Dl_|x!}?y%Ebj8gzB87`-tZtiks?krC8p6ysK(u-03-PS{WdrsWhmRCitM zFjw{WGqcOm5ZCVuq1?%}xT~f$oq+B}Q1-PT_0Vtnu4ILx@}ek zL0OA6!T0;a-gG(i>krCJUIu^a+#4OO77#`Z9uH?s-2*=f*mHZ}8lY_X(1E9FF_E?9 zA?Zo)`f9>)OeR~2j&GrCi1DJEp0`bEAZXYWOM_wkqgdvUX1R#R$xgaBwH9O}G6gkz*(KM?Y6dq$5SvTp6Ww7!2wcbuYbM z$E#bvdzyW)_U?cVRKbl7VSM$vf9X(F>rhtf&{R*paL)Ba`_RrGZY3{WwoR)+nnWhh z$L_S2y!KCyjqzD(xdB!PzuNVHgQ+byy6z|7%;(h!b-3}WTkyDezZ~TK0?Rh|#naOh z*6=$c^qK^f2#h+84qP~OIQv7T@@Pyi*sY^rln0i050Nk7;c73p%)(>w`l^n^=OA0G zjs-!z;uTS>JL4oUsm)<@kFw@lZ6KEPfrMBkEOo)j?3PN|Q zq$tfz?XpZHo|B}3DFZcpr|!VWdF4i~m6mTn)`eFi;S{)dDD1sek77qA*s@%(@AAC; z`pyae&sc3-#*O;-5(DJ{RUt&g4@*GUhxy4k9{*%hoW;xtLQ*@+_zO|VzBF1?WY}=d zD#0S1$eZOSV8U9TAb3#^Y1~K)2K&di)*8l7gS*sT42*m-Sodxol*arR>*^A=L<^2f zE0|B|2#QAMdyDgDy;Fcg&&Sv3%0wo!#9*uaB{(=YT4H{pY>)&eiV3EfhtncbV7z8U zHUCi(VtqHZ$Trdxl1o@Wy=d{l{XU5M}=e|Jz*zdpX+aegKTectcLl)R|!+bl6 zZPL6vs!uOiT&?UURW+loOi6%Lor}zn0y?oZnmO&Grt#C$o({y{>n|-4cuRRdrD|Gb zN;r9W$%;(50A^6^%ZoIh?&ssOM@zI?w@0yJw}^&FRP*x}jK=muwef{KNk7yrOR^f| zZr5{Qu6{hyY|-Asq48rf>&QBc_*y~1{`{gl1!zeni}7i4okdyUdQ83G4Zp%#^nsPj zgpN;}T*ki~bkVj|DkdS8vHnp2a-Q7MmyeFnxr&W{H-r#MM^jhk+w7JDmY=D@<;8V$ zh@|(-3o)^9)cSOn^jYldQR{mVSP1Y``WOIY>bRd{E}G(Lf>afzGS}bMW>Ft&pc`hY z%gmI5iS#Rbes$ftoGa%rA>S^wr*>7)YEObiK7iYMb+jWmgxOfr2z6XO$&2k!ixenW zqQB17E?7Wd+6MYhN?*g;4Lh7N<5W3wM_%tUBSw1EZGJbP)E?rVgHNA5jz>Z+ommFP znt!Oh%Dz3XuWHBOJd%vN-zT0Vw%^|Zk-NMCQ@hEbjnC!xOt)X3v-LI->Ktd-VQ;S6 zT~>O#xLv)UDM>XS`$g(~qb($99t9CC0L@xx6Mmm~&Q0p#>g34oMl8bQ+O)r$U3-jJ zwbI|~Q)+lQ8r_xxC8?AT0J~mwGjIZ;>mQ*w6u#Fh{=K4dZWUSI2UpAaBy>bg`>k(e zDHSQyAetI^nG^EvHdXEI-Sx5JCY5UUOl5dA2$+I&mAk3g`YNPl-Kv-?x9~kF^4Vz_ zdR4Ub_x(xm%$l74W40z)(U=LFj9nPW~B9DCMgtDw%T<%+74IM2c3fTqVjWR&j z-`dbQ8K3#o>6AsbfPHNY3e!*2`_FZ1va9>oGK@~s$np$o4JsY$+o*E8v_-vc3I@kSdn3~KTBzj-OtmKo314UOdzjN&a- z&6pM$o)pg=e!Ckgo~iSOy3J?*nApzpBMa-pO}BX`+#hBA3<41_vAWyN8kNMA1=1@E5A${z8IqB_eFT`Byw7dMHfYi{(!`udJE%Ub8P5;r6 zY_aSPL3PS-3Jq@DEkw2Rr2Ocwtvz<5QYu6xACeRcn%u=AWv$$6J?iQlf@=ZXcII8A zF?tI}eofqtQbff$D8XI>qoqFNR7`tLb4*5;S%2FCQ^*~Elh>_!T`dSjhdg8rJKl2R zzuuQ{lKzM}pN&&D^b#MP8oDeTu!Rg?xW`6&&zv3b_WPaRcT$nnJ%Q;BKC4o4F8S#> zuZ3`lqw+eq-1Yw9#HKhB`cS^~aCQrb4X5lXBkj0or}*tRNsVd(2^#*)^#Y4q1;0I< z-$uBSTftE-Q&W@;KK z+&FMzn-7nzHdJ`LuKcRae9p@_xstxG$Q}zD!vQq<&tA?J~S zujy0&)w#!gv=F_iG*kwG!FPp}O~q!tLhrU!nH&RmG?!ZA5PHT@D)ceo-gYlWB|RN; z>Ex2p`$R3WHs0B0NZJg-g!X|mJ8g1w$Y>8GBhiN~{kld2SWm+-^@s}JIQQw@MMEG$ zTyA2{+KZPRv(NYaq~mO7aYx261=Gqrii3pN-K|-WBez)12}&M_j@2w-@pZI);qOVT zI@!KxB=_RV!F``jtao|^pKRbFbv^C>u=Y+$f?Ari}o;rw+<>Q>kOHC&(MsfIuD7_V*kT_F^@Fw;Z`wbhVO<-$VTIdfy^R8ASil^#UKakGw}6R`nVw3ClGhZ3VJ~h7BIcY& zmvdtUG9%amF;&r1vt{+tXTMWT=FWZ}8~YA>x}MQ0<~VKJ=tfgvMTamz6lP>%Os-P2 zzb|ZJ`73w|wSOGr6i1>^A&F?QHx_-02bC!)FVwe}0Uzir6B939gk9 z06Q_aEVttCyPuEfkzRTa6ng1Uy8ryivEE-4YkKV%B-6g>4&5^jaz4!v7jh3y;m0%w z`JpzI>(guG|5xGvDf8DQ!U(3dkcc^#NLf=*!w~PyJf3Q|FTKh$1+kWNC(X@S!Z60j z>z5`DI&;|1J4W$~DZZ0|d7?ltz>A8oeAIW8{KrHmn}$U|C{8X5K7Mw#@8Q$a1Q*o5 zAu}*kvVcrhY#MGB-}NP?(4nGOLTiB$XhNi+TAU_ZseSjs;O1T%aVZp=zirR|NsRO8 zUyE0Ye}dP0%KSap4*X+t2mR=!pFvwZNj7PV;~(jwE-%WW2r4HqdEprWetV&K>^hhs z&y9a>lsjdv<$SskNMzZ0nlcMgl=%NYl-lZKy+v(V9RiI4B{|#_dPMlkEUuca$ckx1 ziGrVMdVRpmR-Lh>x8Wo=h#pt5(&QSAx*BTn&&YuezW;Y(Yrgy&uR1=L}qD zXe_j{DD+IuTf+g4louTO1TN--1vQ#znj4Pzt)R}ZO)sT*N3tZSXm*cLkCFn{BS(e~ z2p@N9@W%u$@FGItEHtu@dtSnu1`6og&B0ss=#b23Kb--S6LXUyM`!1^^9Uv-EP%XV z&huGpEw}c2L9W?y-xBsd=`2zb2OcXqA*^9ZfE-F({WU-;U6%N3JE%d?op{36)5_4) z)pmLyDV9fo=<+-Nzt*gKoI@+K%lWF!*uPbD+GSatDzCS#t6%4qpZ0e4mLGjRA==s% zyq(RAfX(yZaHH96V`PqM4tJ@~%k#~!-U7aMIWMmgG{q@g4()VKM6R}{XZeeHm+$M| z!Qk9|#v_n&!F>ga_lCCi{qN1t`vHcU8ZWOJwD}3#*He5^W~{FkezU<|Vj7^`6Q6O}rgU;Wh?Jijx7ZbxMX84rk^?X2<8Uo5ODIIhnd9{)JWq-y{#l5I{-Rk2s4Q zR}No3*Gsq9mAG!FPj1VR?0E-P&Zq>`86g3gOH1-xNF8>Q1b2;-+I*UO^Vk*=VQ`_M zq}{st{G?st=cz`;?A$>ceUvPX43pU>`7m>he+m`1i_Ym#W>FIU<9!t}6tyPlVjBPA z1D(+<+hJAzF*LoZ99(d*7yU`c(r2}=AS&}@8+pl4W=b`|&$yflq&*;>Fm~8)pt%La zRsZ$=Bu7qe-R-BSY-?+#xy7U!EZ6$ykGbR5Pw0}1x)D&e7i5Cpqq6R(;$OET)y{@* zey*>h@ehfSbr^Z2f#2ozD>*UiuW{~>eou;VZq6uDP-~IgW5x#*8?5Xa|2|KwYy)^< zw<%MS9R^n+))DGde{R8vZRH>mKgW65|s;V-GWN-+~2Zr89nh z7r#N`?@;qqx|JQpVNaKz4pgz8aBCsdt<>j}?bX62yFP4Q@6t*UQK!5IYoQ?ptIxs7 z#!2Fw0z=Dckox+*9FT>HG1>d#CgB)mKfYrRDPTLw>#Tc?^KJJd1{BZz65j|b7-zmA zNTbAJIfO8BKwwMD2k<^wb_1L>cGaM1_};b7y*&<41**B zYuf`n%H`c30Ani)m({D}`F{X^K!CqEQ#*CPKL3yC1g<{)yWW%|hPV*eF&!N`k+`%q zs7i`)e1!F!{SYYLXF-fKy;!<@zrOHeL}^{0Mbm#3cYURbGtyaJTuiIaN4@&wLR43; z!(KKJ%0oC+_QD&p7Y+@QZuSa)JxNB{%Ls${%BTLX4>x2gyt{Jb8;gNc44?Iy{{4%Dt+dq|xtxF?k{i#P$4!6`nn!-6)~0h9t;ddM}F z<+vfBtBD{ZJD?7L7(fM4=(;usVB(%eA?WYQnfFf2O^@sVI)DQy970%s0Ae2+4ln|_xjp$WXA|Z*#9#=KB7ZW0u|sEHm2{B zz&koVJG%<67PQpzk0vNPBnx5>`RBtLXd$$Kf^bM)7qpEhNucdKAX;DKgTx&aEtlxb z*!4!Q>(ks$pDbDg;S524z)6Qd0N3(t1xOn~hz)HJ>~j}E8c(zdvK}=!L|m@6`r1D_ z)AC`2+ImBA^%18I_ji(Jc4UQ!SEl6TL}h9&I<%mc%Hl*}iiKHSyD^|{<@XauDvi^X z>JStFmjD)QT_$k;QAe3_=GasPd~DJr(s?zbzGNvU_xYyLEZS~=JGhZE5Q&Z%J2=Dn zrao3Z?Om9 zLaZfopb%UCvtt4N;YUX%E8{cag24j692r09+dx}_%ipB`)C<2_X}iWGn*f=BIofTh zO@h|pnaJMV`TuTzNB^ydWSb`V&)MmzcPj5SgxW0rhokRuwwoF@Lfi_GNM(~p8ZAw_ zEQZa&!#fgf@6^fThka6Hyu*kJp+a|FDkOk>b8fAczqeFR!>*o!?AKB`ZC2%kX#2&d z)J~;#8Y1n~;Uq8B)MiyvrIIR@)bJ~*Fh*7?sZFY+ENG{HN`$T&q*x*ZkGuSjxss*S z-KFjxR^8oOZXmvqr@6+1@3 z!d+PgutB8Qjafetp!(#p&hGY+s<36(*qDhrj|X?cQqZ7`y<@eQe1+A7_?SK9Pyra` zE1TTIv_`LgL>Na|;e%5#*o!Uu)qyeZ;GQi8iX?)9(@PgxMKjg)@{C-&g0EMNGscF{ob^|m8ss`UPBV5;VS@!7YxwXL!}KKl*|PL*XW@vq+^ zr!X%%=3HzT3dso&f22_}lYLjGXeBz@R+A88wm~W=E!!Oi?HM5*33SvAU~r0RPjcBn z-4v(OMD_XYh(xth3yoQ;KV7LU7^rDCM625TvqBK6_V{7-(dCt^AJxv@HbS3Y895V- z98ddyr>EzBHuy62+mDyeez^4E9bk$|UtsJg3!<2RpJkhvTM7ig0;3R<;h z9B17dA`VY744_QajMORO2rIF=&B%sp zEiscOF14hl%ACV1NmNbWv098}NqSqBKI;IR5RvN6tiHcrZMhCH)2bSeCl~b`Dwr~M z!t?=a{jY7-ls;}Nn%!h-mpbbl8;{$6 zD;_uOK@W4=tUwQ1ZR^XN5XhLfr$G*Xy*LHoxyT)gZMs1f&Y{1f; zZ>mop)-GMijOZ325a?J}X$fmc$ja1#a6(Pg2xN;^cPL05B_Ppp*rW`5YZDVa-A-IA zU1jUojH$xjX6$O|N$h_)MCw?7Uqunqrl_tN%tl0YJ?lCJQDsm#u4Sjr?kN#IYNBO= z@U_L$oh?YyqdK&Lu`w`pK}~_`>ecayNpbY(j46KqckSCtD<3}a52%cYPh8|lM{77} z(TKli`t6A+bB0+I1JBqVvpgh3>X)|^h%aX<<8u{r)USVkzjpduw$!(O7_lvj=4>E@ z6rCD9Ha%6@8>M#p#u;XI^rh7blVQhmaO(FeEkt&^t5{G7eY-dMPs`jS3_)l)sT)38 zhy*9<7(1HEUd@xVrFLiy^$Ti)qo8% z*YTO%Y+B_8*G#R$3oys>t%@w+3Tf9KWz^Dr)Pk7XEK?dbU~P@&YI)bVLJS~gR!{4| znmFALV$6lD6%jHDX$WnL2a`ewP~gREd;vY4u&DxyXF5lJXASx`M>52$@uhW;ThztW z$()%Zz+3#SdhS-CFp_qT&^G+5dJakpV`8Jsg)fA*BVOZcScJ9$x)t#)5bOZ<4#@T5 z|J^;+2{coh;9`n7PvT zqyPsz-p?R^F)9R+mR?L*a1{<4>;-q@N#tvdez;#$+GmWl;qh+A1EJ!WxGgp z?i4_-?SU|hS_k9yC;ei)9$tVE0UCIXA8we_Ym4vfBk%&b5Uk4p0?cDBq`EwsHJZsH zG~BZt=$Py3ql@An^}=?{12CMxo2^mTmX|rQ*F}4Of$i>vdm+@zJFzWkksOTtwuIgh z3+j|;ASJP6j^PXB-~qW{{xiWUGtT^--p+c$Q9QFLca4O9Ep3G{vt0l)JyX zN1j~AJV%%<*h`3V20_Uq zlhd>9{mbIX;hUbe@=%@?<5@-}0d#HXx~9uD^(y|T!?;$JMfSm;{vwS?2uN7=lf@I1 zLtBv9c6e9J%pT3E9GWqJk#LJu4vlPJSz3vIZ>EhhU#u;gYo&-6^ytqt)CXrxKBZDBOAg1yyD@J`0mA|OBFCYNIn_!XtlB;K-$#YY2WufEqqt^ zJuS?xG`E+579j?7NcF{o`sK&E4Xb$X+ZcteLY}#nG+C=;lJRW}D_{xFY-_rNSCfo? zZ)40NKv0>Zde7uGc6|Ei#9Qxa&;w$GJ!aUZOUSNS_N?-^oGkws~v}DOXQ#& z!8Cq#qZC8o&>YiqH@@aII;LptkZUncokC_-hA8!sg+zr9DE7=cxJ}}eJX?t&;$p{a zz{4O$AyxxtHTf4&{}2Z`8pk?V4v_tS#EI)-DRZ<_bPxdV;n)1XS+zfn5>cf zB!WDTU{ZKw2g_rkR5Acju^Dxc^dVoLS_11h?;(dwgafO3;MaH(Cet*2IBk^m(~MdG z(n~X<$h81*baZfU%CtX;rA*?8X&W7qClMhFaffy`JR$@O1e`#cbvRlBFCFNAljR0M z#u= z$5zJJBx{vyX2hR%`~`cGDFSjdQ8SOf5Q&&A%nd8-2jvXnFGnkrl{uYsI3Ev2X|9Sj z({wlmTw$>sUCdfW2zCKf$TeG4VCwMhFa81~<4EN>oXBLF9SgiIkQ6e1x3PI|jB~Q- zpe8AiFi#CR*zFMrn*^mVIf}RznAqnbySo)#zhGu>s$`qJCn@j`?i>Y9OL0@|K?@c1 z)|KG)$T9M;=M*zqp1g932}ck&$1tp3l@)Y7Ma^Yh#Hs|HdFElIarf;pOnfu9mxeUR zlZ&;5E47P1CYxt&_r64ba>^`dTSd&k9h_XzT<^ix2~EIuP14`?85`;gbtH@m&Rugp z$bS7Z;n`03IJ0wzuJKY(?B|%40C~V3Q$n#39Rg)C-)>kRV#8N%hvkj92z+KmH z{8>|VSyDPU?6G0+)$8zkf{vsJ0PI1nVYWtK3%;}*K8Sj@E3$7^ba?md!P&}D-R?Fv zh8Skod1n>O_A&r}q@|)gf^Ek&ECG61nlZV?)>a6&_<#_)gIan?WuBv`%`)!_79jBI z_#c|k>vcX&@52);+KN`jt0-w?f1T+4_q28rItugk5Rd zxYMVJm>_nTrr8tKX!uKS{2Nb_;y?JQqW*AV!oTtdJ07>#+|HPG46S$yMTm?5pWErP z`+7eMA(pNcA(;qBstrMhu=PMmtF{44$8tMUApMh-V9M9zEr7sN(35N1KR8>r#NGDp z8(WwDjdv%1r>PddyB_lp>(KdB0^9!+NP!Lw+Mk4}(=9+Z%&m#gzcX2R%l{QC@@>5} zF*7^2XJV=nlwPbleOjzDea$di`iW@^7^C9%4e zZ*3Y*fL;eKy*`1|gFtUwo*6?lL1c^w$EJX0wvowyqg@0M$*BqsZ<99&z1Ta&LYngw z^zB~{kLhmzdKmTTM+5Y}9-6ou)-V3KcIsXNFFNe)MJF7(o~Jc5u#ng7jHi?_B3=K! zZT7N}aQCxr2q+k|1@81v0#|Sw1f_Kupqzmhy>sbw;=M!eF@p%in?N35mv+>a?2L+1oN!00DNmZ9h9q9~>uu4V7>9r( zElaECW9s0y`}?-&O&@Y3Ma0tynWYYY+x>li%hbuqNxiyz#Ie-MIn4rtcE{S5kvHFf z$lV%VVz(k!yy0$rL%8m1TamANh+g5nigC+xGrt}JIGDEP6+%XWHV?+Nkp$ z4_xI?5&Gs$fvM&8rY_>tVI7GxfGGukBx;W=GfEt_=45Muru|6|Xc{MH8%)h_12}d1 zTB82>V(rqG%YXa2`uxSx<@+`sm5hja!8PW#z-aS069Ltuwc?Qrt1nFhZS#i5HrpW{YCo|bd6)rK;_i`A!pU%qpHtrqBCPitR)e4;@K z?g@ar&IX-;1ae1p+l#r7P`BYtPGNsdkSCPT<@r+@B*7lV0(DN5f)*hTv<4zctI1Xf zvcyN+;>iM-#W3oeX5;gY2xgjUlEtAAxK0OI8irmWC{q9AUj4?IrE4G6uRL72@`DCl z7_p#lId`xNgD&>43fs`E(#2(e1cl{2-Ru%QX{XEJ*tA%n=D6kjo#huF*KgdaU-3y* zjH4zx0jiJg)o(wmpF6X3>K}uzdEm7@2G}X&A|I;Svx~)`)R!ODzqnC-bUxa{V!(89 zvHJ9$Z@I)RHMjGB=WqIdI-j-56=TS;8)jmXH}^2X+g`Oj-hlA+9=6?oj@S;8OxP;C zK(7JUPnjls~u3f?gr?v@2uyDQh^ohQPq(pgk*niZBwUvEFMy3T22ujDc zbM5}9~(WS(w+*g-Hs2Hk2KjPA_=()F*$U}*Jq#v^qxwg6Xlj*2k*Ax_vL z7%QDf!7yjgX*UsMP+Cgi9E)l*O?KmiSwVr6QFJx)*O&y7Yvo~Ne_HofU5=$Afor(k zjz$ujP7WKSRC$)+Hh%_!`J6N6**w!~62ldH8dws-UCBY=YG#msMQq!HnQ?_qKnyv| zvVm3(o#~F z5ZrGubO4s-8l3mRJX!(qVDx}3jA^5OI~kI&%(eS|3;Vp^_S7OK?yyn+d(8%hWc79* zLwzg=qbNrW)0^dg&626h2hd}sSE|$9J^6No{(toA`jEXa=B`#bkiT( zj0m?gvR(waG(x26lM4}%s*mQYkG_f-=h1^L8MTq6l~`JTK>HDA-S-hthAbDpO#U_u zq##zVqoY#wx1IF4N#EN>9pWI&Uz(BW(spf!6#c%$DRpegbL_@BemFcnduXb*85di2 z=tTJ`vpnFsIf`8qC9NGGHpEcnIQDRz=vRnH|AMkghn8X8{vOhfaotd_+|soaVtLNI zG)Ilrq24}!L6VL2rjR=T166DCrY`% zQ8{WPJj@KDqTw<9{(kNBxsKIhyl%9Ke>eRRav|<+cV(9T zDJtEJ8=?`RsdVVepwt$$WpfS zK%T~bqmG$@q{E>t^1h$-)KyIf)7bdo$96WAIcmI*f`bsfmuu;J*-PRxP4m|QrJ;@r=L0?^Tf6Vy`} zQZ?i*VME01--k-5bQ})_H_nobaV}Ub_YC2Gz+o!K0goCjlBNRe_EdgfnH<^CKIkJJ zDTWbc(A@+v7p(??NFwH`aDc{;qZ@GYuJM_pvf*JIL7w}DZ~^+2i+~Na9CjYCd?fQG zM!0!8@+YxvJ8quWV6B-8Hgs*54{5n#;NQwLs6YX7T}%xR=hC}A+7MXWu*I9W;nkB!gFhD{8DU*B-jSO2uAoxiw${NO?T^Tn0&DK{AP)NF@|lba-FQ6e*Eji_kh6LM;Xp)VpW+g3DxM?Z~b z*8|J(9CLY7$-&eMoQ#gYr<+=hv4AMYT;*he4^EYo-J^4}2Dg7{Xmev6XzgMUxH8uI z7`(dmH$p(LmD+n>d1LD<`@B7)TQRk;we>e|O3b$YX5Z^$yY#xrbLH7w=2)hazAIRV z(Oui6PG^JNTo_$z9I9_Xb6W;~P~@c$HRo(X*EN@(o4rk!sm}*MA&jTCYx;bs1k7^H zYR-atb_lc(#D)`Mhr+XigVIdPGK{%i%LNNqTyJbrx~`Y-UEQviFhjGSUFoewh>6j= zXMPIQ$l~dx+aGkS7UO#1P5k5NZz-wVLPqNbCsWinx%Oyo#M1(QD8(ERPCvivUdzYmI7C3LF`WgqMzc-Was=>% zW!5FD+fl}`fz2~(^qZuwDHTFm7B*|8ZR})g)@N%azj6;tWIEMuW5Y%G7VpRotqpcL zB7hps#M(gHR;J{CjgpJ81BfJ=(J7Jlf`m;7|b;i*a%pyR_L4(M_PtkwCjfIpd*E`SNHAk4u>3eJG{d* zy#_{xPF`x_+D-VSdBvFE}rqiRrp`gi0Snn^0GKKh}4<>Auv zPnVwFh)|DG3kN5s!TEoUCdN_Ai>Q@x?fmz_)8fomjxrmokLK$S{$0Dg=>KKu+DFTa zr)vvecLz}VSpR2o^x$sS0HD=JPwO{d48D#LV3zKDvvmD)6Ttj@@I~r3?=8Q$zI^9g zY;To57Tjik0H$y6M$lBBU8`OEbY=d7+QN7B8|Q0h@6@gqgY#FR@j+bv_^aC4`wo>ls-S{p#vg+4=2qLZz&eTqS6{D$rbZ|vm8ua{ra@{|~>VNva zae`g@DEoZ|fZ5ava}b8ow?Z>cb|*|y)H%F+K=VDZM#wbMhlI@`%d-GEgGk@pj83vU zfYiUMkUaDLGY#}PHs;Fk*uG?7YBiZ5oFWNw48N}LVS8QeAFCWcq32-Z3R#HcSwp?C zGv@Vw17SY+$c~XCCr(Zr-2ov&Sj!{BD0G<0v-Qeg-Wz6dpgfkRL}+!;^lV8zbA1C+ zIn?_YeHjfianhniInLy-p!6(!O# zJhMYnSvbJ;&(99GBms^PvLn_DZOCEhz3qH|b^DVr*2@4Eo(iGq+fy7^S}~sDFsrzq zjq0sfn2FTrD-Tz${Lr~hD*+vaWi$Sr%ECmoQ@s4KY%hOYVaQ#mlYL@A%4u+A>Y`wO z`;(A@jgR`}x{U9G#IY^nb#{DXoZ7_2VS|HQsF3;0iLY9H5dHWiRqw+1;L=Q$|UX_TnQ=U$PSB5TP-Cf!h*=? zqtTg|50eU^R^}tHm0+FuzCc)j*fdDn97ZcC+aWYA$DY(05(X^}dfX@4o`e*CY55DEfanJhCGf@ zTz_h56PyNJQ^G;+==Yx!Mbhs@puy>nE@JP4Q+ zsXvLaNj8lEMauN&@jRK+nrAd8lNI{)n0v#UQ_TG=C?8XuB+|7F#`qxdu5Ddrm008v&Ekt59@ z8mP|2{+oP!0d3y={QlqG*}U`d=8fMJSY+>mUvIy6qo_nHz8|wqt+4{*)|=84q3-B5 z&GQRzvgbgZ8j9lY!?!2ie|u78rAXjLRh1V!PP!9tx(7>BMKxA`gSt6JIyBc<1fY<1 z>-+cafBQwTQF=G;_TKIv%HptgfB$yxoh#XqEzWD%eyZ`ICnAo#L>%Fn9k-dD--dgw zIHX-7k3_rS$3j#AW+F62dN^$0oDh^ZUTlElNoCj8mjC7D*H+GVmRDEiFRZ?@yz);A zude-bmT#LMxb*pdcd||_{qMvaDJ%^Z!xQO|Glr9VJkaDN*1i6#-n)MRkl6T3^c%$A z*bCm)S_X>Ju%??8oO;1)lfww-2kXhB&osC~+M5f_RDolb1nL}!h@MD;t#QG#Aaq}Dz_R_iL_GO>yJop@-_N@z;Nv2S~?H;_Tm0gmKI?KbbI2JO$pjag&T};M&O+`>jHSl)XRR?cKgw zJkl&`E~jOGtW7~v_r^Q-zrB{VRLvjq?T#~Jt~O#3W=Z=HP+q_=0s$4}Uv;FjzuAW{ z`kVK@8hx`{0s-w{w4;(|iXh~oQmZqFP!=7Dd%ymA>$5jD@BKNISFt?{U}XID^TQ3- z-Jv)-xl#-8xp+NZs^%J>0zv52YrX3?(#r@yc27Tl8BPIER5VEb>W|&qd!G-N?{|z8 zC8<%E=uI=hXn{0~JYlN2PyO~54QRv2QyQNnlA{)<*ffJYy|%Wv&{@iXrcQQ?&6j;% z=g~@@9!b3N4%pMHxU**sz93%l#A!a&7gCLPi`iAx?EDr*rKK9W%UBe!VH51FgLR^I z%~r~Pag1Y;HA6xvC6h2QVlv<&8}L*Kx{x{~j)HCSVVZW3ij=TutU}WuB=8icy#uiZ z&_q57eGfQ6@ktgL%7ZPiK($msHC6*4=>B&f z7Bp>sb#?2T%e`CQ6n)pWZ(iz+^sXG6#PZFSMhhxE&yyW!KEar>;o-^Y0rW(*IjFUN z@oENzIYSoK{i(=t6EWra3#%KzAtfgQ5hae^oSAxBj0!24PaLvpW~-|j9{kBQCyX)R z^k3ZU0G6HtPk;x1)(spr37$ba%KHb7QS#9gdFXs{Yy#xvuZLDE@!xl@kP^jzJI!$dH@g^0Oh9R=U1I9j;$Huv_s6^a4&?9u zd+`h7e-MC!z5V93?v16(|p_jlKoTU#FwM~)?jFdw;Ft_7*7a2CyIWgTz4N;{iQMqQi5CQbK6!dSU~1eqf{ z5p&}g%boK-edLv;PJ}RoNVIaQ&CFqwopMpg`g;JEBUT~vpl5(lSsUgg@=1FP#Fg3+ z%D9j^f+0yI(%xpIx3vMInlBQb2&2Hzkmk)wqv5H*O3(yugi#GzqngeL#?vTzI!{xL zVr#>V;JQU)4pZ08RiZG#ErP9o2k>$3Om1KO(uJi?%1~$hwWX+(XyOghda8MPX6cpX zjZQXvH_N&Qj5ME|w#P0t=|k@c=O#U97O{ zq{cS5sq9cNV5n$06U!0y98>7J4q%R)e{!jUl33z}@l$GB`z)PW?JS>vub?KWUFxnX zXozPb>G&N(<#NOO^1_9UC?2_Xh-L)N5RXr#AG=(EN9vNmn4Qi^B!dfNy~1Hb*q{u^ znP!IU!ph3hV!>0)S>u+cJ|J|TkHh*VVXEf?0@vP=48~_s|~`=7-L0J2fsyjqXx8b8xkF+Gp-s2 zmz9o+=8Y2CiRpBVHaagAuF(@KFR#Xponx99iSwT2Q^(IZ@R)ReG*A;@TUktiuj&w) zG(tE5=NU|jvx+borvVv+rV`KG%~mz2OxSF^glN$&#d1|4IFxA^mHwH^YkfCU6(KX~ z4CQz#@ul5dRff$3Qz)vFaI0)ph0eG)EHKw%JHSZ8RS_=3I%tntG{}{oxejw&89dY8 z8`S3W`pD~~5`ZRuxS$yEX=kb;h(@WQjOCNZ>a*4VNxr9sH@{*+x~arbW2!okR0$ET z%`h~oBb0U_d#?pWX7k`uqs1pUjU%#XqD8Gnm2w#)LtxVxZC5Woky3c2;5wp%vePd< ziC}{vq-~NvV3_7Bfukg~!g165YF`O4FFo?l8b$r{3T-%lC329tzuWhI*S&GAd+puW zDGB-f;&KI0ZUsv6_WRSe-2txJ;&t+8Z}h(U&+%7#;xqt7xBt@p;8MRU{FOg!UAkOQ z*L(ZT?w$8{Iw$wO{=EB}w71fY9Empik(n~098ngo-CZ4)Cz&Zbm&b6AEU%=y zDkfRRj8LjoY`oEA8Igut%i0XeqNYGQp|) zrBR`mz?I5}fi~kGm~&xe;oOD2P|x7QA3YAxonZujNZMIFD(JJ)CS;0Xv(CmZpEz9% zPXy3L){!^;y7@UsA8RHzZ-k10^I95}P;qMtX39N6(=`71@<1f;Wf(BG=U%J}+ z?SI|>_R{vp-!-%yq)7ekc1+K{{K<^b(y!A=|&X5j=lCM zY0*A^!~yJ%;snFxlADi78wJ=INo*RTwb?Wvs#YoyMCj?P5U2sLBcJ;5qRq1e0e*;72_LM~;{T?oO@^9cF%533Ql))^O_0?iY~T<;q9f?|m|~P6>3FPp;kP z1W2C*OlP#nUNl`~Pl-p;wpshyICO|8HY~J%J9M-G=x{Nwu8oifp$t=E+stM*T4ygA z2|~8%Zbr48a4PYrMH2`Q9a2WEQNUx}pjfI16^g`h#MJcG%ffg*N)x;cCxI}_Vh@H_s&zTS3EY#vH<=nJ? zh+)KeG&C5;{B&Xy)u9%QR6u4*dzZvREj0Cpk=Jc@x{SFJ1b5CMH`(&$2tXx&_EiF? z0`34?o?yJ6xVO3aE&kTzko}wa8iQCp*G+f|qf_LqI4-LHJgm3pC#> zS95AZn*c%+fXapCjhIR-!buu2z|}5)*4eBL!YLvsWwf4l=L6Y*uxu0bs|2US?6Z(y zCh4^M@=`Ny9h`G|#C>^01!EkzZDHIIp~?$Ffk#suwC&CM`ohHmqWW=+Xbg6QcxKm+`F9?_3!9$tL9clFI^zvE0LxPEr3$ocva^L7SjB%1kV1xn2*oV>e zlc;oE2-HyENcK>FAj@RL`2#e6An%m}o-sGR)u)VM!dz3bo+^0V3inQfQQIWsi9*hxjczzoCgpRgC*u|2xeC@8WWm+MOCp| z&Ljo~Xbv;YQDzWpoJiniTL5N;Nl%GZEt#2YUq;23Cb-m(fPI|s(9&do`!YylRWge< zd=@PY;#goJfQKnhk)>H!%>G8nf*NO?7tJ5)y~c$^*%hfNLZ(qe7*&dshAz^>H5WOI zuDFm7JDNz^m=QkiR$p7`6cBJ!;KF#4Dl=*96cz*)F=>>&BP<}Dx(tmGSY>3IkTQ7R zn6o@oR1-rX4jyCR5hZbdc`6i~LK^P9TI~XpY;TtonB-4h`W#id`}a?6F@VI@{qOJe zZVp#pmK2!a0p}%0#u9=JT$7BZGlZKD8f2Pv;25nv*e5Ai=?Z<&mbT*^hJ@O9xyF ze@I~P576v~appuamEE2PA>_kmKQYHCO50RW%#s!>KM&XTF2Dd*-w&Jp3~vW&iL{!* zVl7qZtUu>q_S*nSpIAYsb3AZN08SA_&a^q6H12Jh@rqFjJ#w_cXtmLLR?4-K6gdA= zjn=rD4W)2UQ+arQYP?Mo9I3=k=gf@?Z_@~~n20v}r$=20)M9D90L#SI?X#aJWOhM^ zSP7LQj{E$2cGZp|jVuqvY6**VGMpX%g4z7~-sZhw%UOae=3*)R$qv>!sxYja zPBh%p&DvOR<~Z+Gm>{?>{nB609IFzA;kpXj&q_!TM6-K;A zy5uMMoQZvQf)w6UxEaIET65WSqj_Pu^-+Y(2~UjG0_?R^Uv$4%U0-}*ePL~IfctmyM7Aju zUNcB6U?NX{p!6?3$tfa5e&PJ$&z3Gea(;cJ24tU|9E?I7L7T@WrP}B$g5ZTENh9JK zODIvOxYu6k>1XDE_@cA%%L3npfZKbwuXW%0xclDcjpC{}anz?*+YD=A<@D-$C)EK@ zX^6rO(_lqtIm;|>bY3#)b!*nvidpSZWxQA!%H1q~t9s|qt*sR}JH)x$dh?6!o%ip5 zceQ)t+UB1De3Gbh#{v=7NiYnuRb@P%6|I5lV)N>i-t8|N(gjVh64FBVooQMZE8+E} z^F>NU4c)3JaIYj>v*-5oP&{eq z->k=hVCMp}?A`ii`_^9@(g@|mT2E))&ZQbjZ-nKI&eA%tPKtT0jp{@g#El|Hzz=*- z)BvZC-+tP=eYH`2NP!W7$DLcyN1o4tzO-(C-0i;gd9w$Ed#o_e5>hj+knsB2^7=(! zjSQ-PnlvMrTd62?61r)PEUlbbT3=qc@a)C4Od(N^!m!7Qp$>Z3PV=m%2DA#_0(*lo zcu(Bs`F{L`Dr_SjG%|dKL#RI6&p)-gxHRBAf^n{B!b~%HnK2lzRfHKAJSRv6W@kKq zc>cl0YX6d}5I+k_tq-#dkLT>C1~)Uc1^b!7ebGGk?BjDUzWCzczqlyYc#;^nj>9cU zV8B#Za_$=a`p(s-5KL>>EZ$-gng71IR!@Ogn~COXh|V1 zU25Tc=8Zt4jo-Mr`SrctAHM7U{dz;%VAg0N)DiFq+-n=1)mMS@_v0_MR|&O$mgru; zyM5^@RHOke8BJ%JND~851YQ zQ4Tk{vNqk%FRjnx;w1oz+8~r_W_hc#L3e89=3`!m3X=$mX`3f7FLH|_7GYAHD1>!sIF_Kmw zxa@E}st5IEF%%1x#;hWLpQzg+#XA*QF(fmCu*9g%X~}zPmSSk8j2oqOo2N2&J&M~q z#{0mC2f~szt>d0V^?Z?qacAgbFU&oeocfWULxL$h_cW$Yo}POqoPO-FIYA|fu}Vl- z&$(`sxd(aYd7b`=AetzpEyXP#)dwl#zDCYIOU|C1JL`UQI?M@w$*Guo>eN$Do|$|8 zg)`5DIZUvM(MWneBo(UVLp{g=XGV+HFj^)sMhI_>i37@h9zACk7vtkP?2I6)<-N8i z6WiZz$+Kt9o|#LGKmGI^7J|?@7lbr(_UW^aot{g>CCX#YlB2lQE_wa?I7|4%+{Vag z&pcetv8F!y`NH{spI?lb!p#zEJhCmDkX<>od8P!G`d@$k^AqP+Uyb1)-CNYR3NY^E zp`zRj=^T>=x-x04a#N)&c-qw^i6V4h7p$DL(WXlM#!}U#wtrFpA|+5Hy2oE9vZ<2T zE4W=hkpoSX>;w`xb^*E^XYWp!VDg4E+f)e~O<8L6fyH%yG@2>}u8=_wn<_QfREZMB z63Q~^Ldv`}k=(EYyhf`P5D5$s@EZ2Xv}eni>b-NN_rb4wS8jCQ`VeYojksSmmg)WB z&8&OCZ!UL#@9gdIzK`G$@xj3rUDS5bv!JHL=kB}dkXxGqZ0zkX-rl$5k13WGdNj##t{#+mR|gSUHZ(1JG_ zDqtj)!*JttCu+g-@Sq4kr*MaU^50v3{j^Wr&G)wM-o5|*$Gtc1MkoPM%@ntjZIT}| z-y+)vC1FFq^FQ1+R}fqL@|WG;z16*Tee2Ghq18%!{(QP`x%4IV)=)K-vs_@slpdGv zSGP8Qzx?d}xBs(!`%-$*kH7wN&n9a8ReB%&efSYuxw4qU!ARM9ge`M_d-SN}qcCcS zpmI--^bmo>dcEtv?_U1&&;ulQuJ00^B*8O>}&hq(xrAL-m(hDV~ZiXYGnMfXHq~hXfZZtL2 zw391^5m!{(36~g3)eN(FKqroRqtQ9n(n{4xm6r=1AA4Ltt^b=r;Vu?N2yQ&uM>8Q2|HmFcgKck_4 zPNV1|A(R?#+k9;ob-hw;z2Pku#2;WPst+fY9+QOY7T*>hz)t*dVr~Vs3U1!xgsuc^ zt>s=q=NzjeQklL>5UGBJG2|@*a)(^`X#2fShSn*;o$!G3vVER-WZlf-P7Rkqi^Li! zF|>(361Wpjq!b#wx6?!1=>VA{ntIHCA+!_o_Eo_~RH2IT?Bl7TIoxS+>B3Uf%vma_ zqim*2W17UBuysnvWR~NZsA;r>X@o^1-L7W@caq#m4Cp=2GVUa?rrg6dkeE8$Y2^u@ zZjYGj(@TPRnBn_iJbZ`$KL7v#|NrcL3v&}!*5F@px$4{6tr|?R zlXNzhKad_zz0mqTQsbkkY-;p>(D0`zJDVE* zjNvWc_vP`i!Q8~~2*KGzHkC_dKTq}V!vn^EJRtYgARrbFgWKN)3o`

PfFvr4H!c?Lh~B|4S-`OT-=x*jdRMM zeo73&nJA>M)y;}*zGg3;>TD!8F+!s>laGcTDRT=pnakJ&naTLS*X&WRRwFkN*%K&o zIexQVM_|SAB-|Z7q*xgwcAzZ;Tw1bK4e*a{szOyKgaC`(iufuYR_}+H%Fl;Mu@d{q zK9Q%ljU1;8dnuKT!T{0KmoSf3gN}4+pp(R?`$L|@QP`Txly&i9^D-8zz@^jkoW*Z< zn^&fihu-2zPNRcQ66ymEyczAQtkEVkvkPNjKVCVjmeJ&NfSeUVO+a$@2%&!JG#%(||1{9S3Y_dH3;Mxh3gAhS#hyz< z{vPdX@bY>_NJx=tD586x?HGz_s$vdleE7wdO6;FToc+VJ&$QTXL`Rrn#b>vdQO zMpeY6j8ch=NRf}OhEes;xV=C2qC;A?{rHOW`BS&aiKh3g#gYfR==5U6PN4lJ?54Bk ztVu5PYWB#kp>+Htq(Jo4JNp;wJB>V#kt#Kh%+)jWR{;5!FP(x1|}H z_w2ueTGNEsjWrfhYiQK$DBX~iV?99clgqx z6Z!lJj+Lx6-wP1qcmGU25#0s!qS>HA;tt&Be5Q|&J^4W~Y8FG6{4gMCw+L2+w%G(l zh^We0gdQKdSNj+Y#D43XCG*su@n6wlHpse-qSY$U5}ZD zug{h>>Q0LAD&(K}|Ifc>hEv*N_Eo-?$m2R<)|N=?GZ@DVxeEXND53?p{1=@qsBsF0 zY<^lj<+Am}r$;{EbPaJMD68~azZ$-+jCdm-YQkiW0yt|=?ZOIqr3|NKO~|Y0JyT&q zT22B}^2esK?5p&L8*3q+3F(JRQHVKl>=oGZT;-btJ}4HFD2c}ztj?d=Y&YLdERu+* zL7_!&&|Tcu)~WTA1`kzyXyTAMjXP)xp)zKXWLL1a>o+zqgn-d8?bl+e7Gq3wBs@hw ze;p%s%e1dTsFJ;&OE$R9WB}j-&OTNL^PcT3T;JmuPjM#^6K%g~fP(45k^lCsFnF4M z^mHB3bet{c-9w#YaOZ1onsC<$;g)Y`(g<~k<1`wStB@t^_Z)IN_h4`vA8_yv^w;eGGg)QuDvC+VDdpO-G*i)I;v$ zNm(zw07z3^i?ZI$47_DCMe0QCUr>bDw~mG0t4ZCwxLHNX4CTELNZ_ zebvnc>r)QFBVdPxr|eH1={`3oY^Ox#`!qP7v=%@|vTn1Av!3fxyRyLaPfriX0vxJP z&DU{o^+S#4XN&L&^*X_*^)%OKhdO8O(-#LV^z|C3WHi3&M2%y#k5KC9?iJv$1TDY* zap>=pvo;vWJ{x2^s4(ABn^vSp^D#Jqd_KcsWKXd&SeGK`6kX|hGu?bZg~f#@hB+qY z>Js2#d3H828||k>kMRlG41U9 zv-FFP4SL-TxR|y!KnkH)%v&GI&0kyN;K~{A*!$he{bl!|_QB8VHf!hg-iqhTu5_Yr z;ObWOlj+xBrj7eHzyl{um-;0TQ*^)le7wKj(m3Q)kAZW+dUv(n(IMQ2S=#$`nz0nc>vZ&-E=y$JG{4|LUn}AoCwMkpxDGmHztM`M!lz^#u^o z)N0a=TnUcMhasdK2U*?s_LX+^MI~*I|RGxxS8W2H5>nM%>(C-LY3DfiT z?MpwV(g~_+ed~~s4sM{F$?_V^6JPaB@Aho0$5~Keq7cHU-8Jtm?D)3LOe$X^Ri%HS z@@gW`@PX2cCv7($%T@9d3%^Ra-Vm+ij!tza!*?_`ZgXHLbxzl|5+gy-J zKtik?I7vaCU8zM*ryYG$FG{OVJ7W!YxBOvyi}a9)1ggKClMDP%U_1eR!Dqi_;Z2j> zsLugzPU&r@EU;slCniHJ*!`UD@8idL0Pfp|oI59y%5R0)PIHu(~+O zB&Q9U!05tQX27t}$ZI=goyiukyOV`fycI6fFoWSWR}T}&CPF|vo0*e$IU*jYvCeX6+cHiojBma_R;#R_X9o_qjbBIb6NnsCAcFHkpcJnMfc;G zpSE`2^?IbApKFRx`|j)shl#A5J3@vn3Y5tBdeN*vCP8HnI{(d1@VcIzIp5=M$ggtZ z6Rr0E2O!(gs9OPBm>k0IOBO>3uUw>Il9ug&GBr8`ogfZ@8H%q7VrQVuguQTQ^Kliz zJ3l2u^7`V;@axK=VFL;5bybRKMPc4|KS6BPyUC%jO?gFK=J<0;lot=M&h;}XSeyW( zQO`ZEo}7u$%88ee$I=8cwuwY+n#K=m8MN$|BHFc;W zuDrhlg>Y#J(b->hPr>{W)MWVJ-K5+%xUF9NSEJFum_$nAW4U^@v7rI1X&2JfO*|sS z6GwQsd_=OLAj10?s_6P(bWNT19FGT#S6Tqtt(K6K2j=#_(U@56vGx7nA)HK}`oZ&4! z<-Sjcz1mPBOnTM+lcA%uD_nsv%Tg>?VgKH6|?1-M9Dj z`ZlI`I$a(Ill6yara2Y5c{k0#AlLYDr{3wr#(2V3Dhe=0(D>eMAQyXT@L&o-fIn_C zrHP83GJK5i`TVT6RS~6%GVWr>=O5`japsXrJ=JA`d2Eu97TH+7h8rnkOY|uG!)~ ziN|S44S5Qlc&~pVvk3Lkpd<)O0CLM0{N3w%nBNw2MAIy@Gjh<;(9wSmg8s41wDf)5 zmE~42wl-?&I<%VkeM}%{v3U&zjIVRs8P9E_BSD5n*M3mq;BbNXU0szudF^Ml4?;ofSIcFYnYQ+ zo7l4ZE-~5!7(Rc^h!tti7&BdWBHhLV6Yy zyhNVx)USEw(}Cah3xiJ1{ZnvfChpib1ewdAZ0!I06Y~CznIEK}D|eY~t&$kLvb}@%_&R zDlQz7cV+W$q+Tf`tt(6cIif64D2Rjc&6OJO(8^N7>Z69n3)LV=fPRww1ijc7EO|2c zPne3PXS}Z17LKgRWEDG7{lt_{F2)$c>Zi%QG7DI~QWyTcHBIC8UD_kOv*j5wjCbI5*={;3f04U3fPSJINn=@P z`+opuK$yR`LfaAohydqdl5(Lvzj}QEz80xr)eB*gWNLGzXk{tY!@}{kUR6IV)PbPNu+*0xQ>;Lm_-~RLe{L8=p z;oHCd_iz99Pk;62Kl^{ppZ|{~q7t$eA{JDN)UVM9K=gy&=(s5FUZw~B>TiDe^Pj!_ z(VyQ2Ih-2TBk|V%0EApVc;?#imDP?ga{(*clzhW*&K5g@WQ$ZX&FuWnO~P5*v|(wC zm?j%j|Fdj;Yx4%Q3|Y)@lz4OV>mpc|mRDo&_NPDi>My^43+#Vr%(O^T&jBVFcKUIz zf2NL)M=RFvf4=>%Kl;r-{fQAyw?LAqG>jANx7WgoV+I)dk8EF=mFnlKfA{mZzxda; z);dzAEDpm~I5;s>ndB?6{MCQ|@!KE#@vX6>A`WAw{Kf?!SPl+OhlBh{aj3qBsfdan zkj@mD@t-^gWk7#GKTM|(bBr-6{{bmbB2a=@yfJ_K3TP`2AKB^I25OiJB}fa`RPrWB zLqV_;^2;DCuN=(WTp##n6SEtP{$J$t3P=jp2N^UmNfFl&CR&c={FU{wv|BwHUJNEX zdjZJIp~h~+L@r1tMs>)rbE6^LGz03A68+`wumx-OSO;5%O%DgCaK~lvHQf+cK?vp5xwi{XD1aYh07NE!sBNL)=+T z@Td>z;O0)utEt3@3TYyn?G)@MzO}4r-4euN!b9Y_Sx=J(Ix>t!j68?rydLPBEi&5@ z`ADNk7$<+EMMUbH=wv8Px#xIyJ!m0*Ibt}BbmTXt<|8F;PJdpW6oD*-EDR&%xgnh| zl=cT_{edy$MQIq*F!S5i(<3fMwK-k`ZEwsa z_SeOAjqMGx-I!8I5_;pFM%6F@A2V?&nT&lW9f5xYCQ&Nl5#QJ$#Eu$`dT)02ejl>G z(v%|%@?*Vu5FnamQ4(vhQP0NFZjEp{F>FQj=K8_Tz*_r=LTV#Uk!Rfifwg}4Uvf-U zy0HV$IcVpDScuq2R{4WqO?U}Y9I1^SJYGS+7&k0`KoM=@sl*Z6s6e;^ymlBaWGqYQ zM*DxD&OM z4hsdA(Les~ckdq!U%}b~bIx?;dBj)^=x2{+fQJtuHITItMIh()ZcK@8^Np}zayB1 zWU~=mK`=p;L_!mNY{`iOb~C&*`SEC<9Fd^K8bmZLeDc! zn>6!n%+)wuZKi(RVCKJaJO@D~qKUEg+RPuUVdo_`9JLTDgu)#tt0v#3+mt0;d(((@6dCv+T2>(q{tI3`KFl}ogq11Pc53ER#*(Mzmu zo#?^CI8+*R&e4`h#cjrhKoNg?Nia)2Cy{w#@;VWFL{&&Kyq(d9+7WwU#A%W(b`{vVtt*h! zp&g6SHPxLE15$D9Lg}vSB#X;}v5GP|q&QYb(Bf-l(5+p+u zWl@WLLY6bBbw6eXH+^Vl6WuE&5*g74UWd`G)*)C`$ zPu$D|mrQ$|PAm@NFp9UoUWC+~Zo??a!kD$$1*e`{igACI#c9-{?t8GzEgd^P12;p9 zaVTYriCMLrQp{8u>Fv*|rbfgndhRC8^Smsu`D#R z<&m3&%h7-C#l!LQaefRHPbuPD(2Wk_aA3|Ss1i_`3Q82FsfB8@uvTZmg}WFB1`x*g zcnE9#Lxt32v%ES*;BoJZDfB>CWt>sjN{fzyGp5O+J0Gj(hac>I{K?Z#(%r{TAAOVT ze)35c^4;g(e)O$}yA)&0ccbv*57q9YZ-4Twk9U7Dk&NwrEBiKuEej*5h_gjQk4cOv za_uv&P>mw0kgN1xM76w97u7lNrhnAZBl?ST;}0L(#jSeSlE~%FMvoH`JmYXwPvPO0_t3*GN1jsq2Le z*>ivM1aoAOOk|OAK$rGPF$Vf9KQUhknS0Llnb37mveLRRQau9sw8+gFe?L(s$N1`u}Fv+L%}r* zYK~HVoYR^kCYW(gDZV>VRVj?!XOv}&0Q-rm$|TaMjN6=*Q6s9#aLOVA8X7LKG%~je z+W9MmjZ=Jdi2$(DmSUMD0upJw9W;;_X;3RjY7|nOW+_CCHU@ebrwJf|8YGYm6)1oB z-xR#|2Nb(eJQ7+#WLcA-Iuc)oa{}=64Ma1kB&gee+)&GSg|yh=a6s_~*RC zU~qAE2ErhTaDqTH4K{(nd^{!C`S>GD(p~5F?2=S{l~xSB^Say@{rph;s+P$e|;SC&9i zYR);Brhn9m;OxCV%_pb%D7Y|>`&|gdL!KzsW=G=(vwC;0h?xZw^LGIBh?6)Wi>U-$ zQ5{QSxd;M%oC%TA+2xqgq#l2kq(sTA$SANeZ2(?UrCR7{VO5yQBAU3~nQP-Ut6%-$ zHn{%0YQz{}ERl#Q8#3EMeRS!6w_CC*p$>OuB@u4whVH7T? zHI}AYBYHJ`$3h(;f?R3jHGIk|^Z48zkr_ojAJKh1e-^G19%50vzSe&W%Eix%_c)T> zdv!6M1moQNXE;50-JhHWIOQa6=X<{9tGH1e>Q zj@-lS@~2U#3SGgQ<};+lWn$31fAJ%ner_3 z+}6Jqn0_(}m{3wg{#x63#iM>3@k|;&tYB2(c~{8TKcBq)-^TM zQ~_Je?gqF#XW#>{Bp62_2{&3R1B&CR7>QJEj4L3KPLzt6DbH1@z_6zA zk28`%!q)9u1aN=1hf~QSCfn@#1sgdaah#y-EF`Tn%`{}fkbEl}r>>E7on$FW(6+Zx z#Uvq`V{b%Xy90^~)n2(h6tU9dsl40T=oLD{|#cw3NFyuD;zu$$n!2EA(+ zz;Nd_-^`6`Z?=K~ih#t;uUR>{7^zgJ+uwR7FsooKjFD$TZWawkvb6(uD&}v2?aWv#vr>zLu`npd5=#={@cL2bU8KhB_$)(^dIPku zjtHhvi;a7{5n^selOeKS~nP?hstih<8d6N~O10RihR=JW_~wh(rb|?`YEwBQZ;8=rVWO z=IJ6Z7y##x5kcaFZpCJFkw7a->cj$NX4Gt(bFN^qz$D{Rht0M)hr~-3C#iELR|HH7 zIIe#OOx!H=b%?b*EJ6Tbk+ol2ghig_FZ<&OU~-IDF*(Lq#Y}L2r|Auf*?P?+BuWS+ z$imy!PO29eF*YSPtk~w(Ul|w~Rk7PLrlM3UP;ag+2#ugj@i1-E$Ajf8rbL9I%>g&C z(8!@1fewp}5QV}__?z#wK2EUnQ{(R-owR=_Q#`pl-hx{gYY`=?#b~ZC2N0GvY-}^_ zieT zOAG7sLJ^U?%}EG8Ir(z7yX9n(r5~vjk#DBN_7VjULm-icN!GRwbBhN7mnS?Uno;+G@Twk1UVh1JZd7@N2%dh~FRd=A~WbJ625B6F3e9XWL(0 zNo!VDN@YA?(&{MhdZByH;v`jRoA$uU(Ea%Wr!C>9gm4s$<{~h4dsC$U&;_mxoX>khb{mOL#9H1-SXE2cPipfArf&r@Y$Emah^nPEx-A*YcY05I! z0cA5dZ;eyRG8$$A)XdbkQ_3Y*ILy370@n5#U3bMRHxNe%m$_7xw=eX`!A7vJN)lVB zFP%D>>w0@@Rn;+o`{^jP788CWp9FF5=(E5cKD-`|7CX*Wyv&uZE)joyLdIe0FPKmt zq2>Gb;Yn~_;uz$EqtTo5Nq;y9`r}}7F&gB@!EkUdn4IQUca8GNsGl2F3{EZvNAB)X z?jC9ZnYnG8PwoXhL!p_hiNLiWd@Sq=p5ehb)LR#yM(6*%rF_t+hw6&Nu!VE-f!m|t#W{9~=Tny+MwDVV7ALjC-O9X(? z1jJM<7ZWRmOp(Z>Q*-Ma*roMOJY1Kt@Ou(Jp13Lw%bW}Ac1L75Mdv%ay$i;+CA0l%S^0?Umt zVhLxOf8IaJYrrY9h^Coq)x9}5=ZB=%Qj|hyh7;xYe65yNtf3TnNQ^n=z}g6~Ae}>a znnk{0f@Lx&8q$O|TgM9t8Z9&eV<;-yaaG>!AiEv}a>sx1l>ri`aZAd02wqtA%K<^4 z^_x9s=JVjgeAGYbAN6dUQJG@J~NhG+MZine3ZIyf8SvEiSy;meoy@BP8OX+>r*IUNlzUY-WM;9}7K z?nNH-kL`csr<4w?0TKLma`60NdM|i2v|*qZ!`|pPu)m+$za00+pPAqO;r+wY{$f8g758%-BL;{&F863aAJpV}|=a`dQ$S z#L#bSjehra->hR-#O(J7qE!wCbPA3DVBTh zV$pja%_5E|51A?`TZ=Jl?#841Fu6G8F zC`#STwIVfL6T16KE{hXrO0~u(?^rQjfzJ647o7>g(rbH8V_TW^8_xZ3_UDUfNRf)QC`uyM+k_AhQ7WP=rVIHQEQ+aQ{3?HC>o%0! zyt#C(%jTTOyoI?0Ec)Q7h^2yrf;J##QN*$^!;k`?#>8yl^21v7vV`I|0cG_ztrn~^ zV!(!sc_cAGnF5_UG$~SHO`J)r;|vn1ZxU2T==m%aAcJIvrDIUQY6I{W0pk*W(6mxY zB1vMN zok)!>#hN`U1B~W$;hx#(y6t3IMAoZrmky5W!T7aP>5Nyv0ykHDj%byUWzRkTFLTCj ze6w89jbDa5)+FA_lk)|{N{T%<>Ht5#N|gi84?&CxyWr!Wq(`@o2}df_2@djI6ohbuASbk z+Iv^~=JxNeeud5Ov=RQ{sQ+bNY}#_qR&RPo48SI)hWkT7z4d?IX)K3>)t$P^2uo?! zW+q>mdiV_uIlN+2b3)pjLHVF6^YFa?yVD~3_Z?6DgWjw2-?=bc`To?Fb)VRB`0^9? z`>_ipyiWxL^-vgxkF?nq=fHqsx9^@c*6&Sg`|lN41QX+X-y7v8`Djl+dH(p*gQxq4 z`^o;JRDbv|(Vu@FesZ7zXp+!o|7wU^(sWklU^sxB5DG>`EE8`KH!2(mIKhh$$`J=0 zx%f`-5|U!2H(1D5qYhHaEHbu}XR_Rwh*hf&GEPv!{Y@Oa5kwdN8D30w_NYL>=#`)} z^Ji1t2;yY?r3KPhe1@0=5weTIUBUy*_i(g_35c+WN=bh+e{~;FsGVWH05_`vH%6&6 z3*)!3%__LRICX~S&K|bkF}npr8s}3S#u;+}`II=YTwcp04U448ncr(1PbYj6)+J|uHVw?`9a#7+?-G-FAahUF(tFi_RI9TkD3g=RNwya z#PRdAhV00^xIeha%R0Tnn{^xHlJ75>ev}XL*S31?vLjg0uERMB?js42B(7tWdE0``_DFYbPnLyRrA<{BBk+G8r`KOeLT#^ z!If`ld&fHSd1^f$St10(kukaZ6W4JgI5vM4-f-kvY7}0l5l#02{6a}YBO|;U`e-{N82RpV39=@*Mku=0$JBo> zvjft+q!kbq)`Tn8U2}i%Ae**ZfA+dRIa=%vTwztX7-co3uufB%x~#jcvns0P^xFM_yv78SZdsoBNcv zWCJXaw;;g=NS+b|L9nm+Kk;sUM!J8`%upI~W?1L2&zv*P`T|>|G_0!buCDsJ>Z|nm zqv@OU5t(ReGCsc^38lVtKxpX9^%RLW@Vj{zo?ZMd6>?GkKyQB)qOoh_#T~9K?z;xNnqSUUh zU$cXWl{lylGuATYQCMJOdAWa4?M3x?J&(x!=zKIw3eBchBalwo8m>u)_rU!+Eg5@j zXyu~Oy4?K2HnggW_u(pW=D8BSmt7}ImFCnD;6)0CDsTGf`CbUb1 z=8d3Gjf4$?YuD=~a{l8{jYX0X1tddy~{PtZGqe41oDt6>l#D8j0rzV@AOn$|eSI1sM{>t#@Rqmdns$D`A^ zQjl{@74reqcHe1oXj$MMcMnCb=LzN2;cKLQ&L_#>#R}jEMY^}JU`oYh@)G^7i(F`5 z3vy&Qqp9U!f(Am@gB*Xc@dCvzqi7i9cnN|WNy@CLyu)U&OKoaEju^)j9#`bPT}cZ8 zUnt^{nJ$sh8jz#Xp!hIv6WL{F=@ykPXJ5}wn_a+k+DQS#+0>3cjmeyv!Zb+R zOdHqB3at0_Y5>)+fH{q2pXyuCtR`GTC=VhQu0Uu(t$L7+RGxnu<$J#kYr!^DTFW|} zl><|%9&|%wh{#t2M!nXmCVYdF7nBr4n%t>cbs-#teI%;?%T*VN5t?`^x(xbYdesF~ zkWikYa--Z@a~gFp6^Rv++Vp-C)`V4ra+*@vOSM3((AsHdWjQ^0+0xV%JJ>A zigFNe%>ec&Hz9v@2^oND227+B`Lb2Gg*JJEngJFJQy%v+eqPoLKsJwd9P4re(poyY zR0}R`xi03$Ma#FjDHn(?egL8?2J`D;04IN}YFRhfex3evc2N}^ zU!`v@Nbx4qOfoPYoq$Rig$)vm&O72NWOL1SSPb}XwjF;Sayl(Aq47l@?_0{y;2cmRo@s5GMN9may%cL-Q8{*oC`&S7~UnBM4hR< z90w|H4=dTJw4f0|6cfx*KdTR$;rUovpJXrn0DG&vp-3IWlZ@{#^EJqFaihJnZfERi z)iSKe)kuHM*I_(-eSW*mdTE0K^HuNUx;LK=%It{_3Yq@G6|>7y~hE;HuV;h))%wvUI=?Hy(v^P7+c%}g-;Y<_B%!wVI?O95gpRjQe@3uC#oU1EkUXP1#7&-$(3#_STH zAL3XLRhYr2kba=&tAI@kcl!RyhFps0L%IIIR^ttLHbuGPh`YXLQ-Vn2RW;78e-5`n zHsxI)k#$%UQY4!~Ix1^Impmk(mM1}kj^%$U&KqY_>qpn|hfHG>kLlp2SEK3bSznt> zZJ8uTN%8_n?1OWw$BM~}@f=s!XjeP5UNR*G3dk3pKT}WOdy=X1+Z8(zTK-fUewys0z*}ZLlPuX98;sv%Z*^J&6lt%#Ff@sjh#3 zc!8BEAT7)cyls1$>2!EKPcVN5kdH*qqAc7;b5D{8v0L)D%yU+lH+8#QmHoy~eLC8p zZXF*4qlJ6qAtJ8G*60BByhea=6OgexJ2V9?dxP(6vh5?R$zv>3E{20aKFCK*N)L3{ zl`)nN?i06-l7)Y zThu*N^Ez%B24EKwHA&&Y&ZZmYzd)~xk*erX+0cB8TtA0F>MR;=cXq4JZ~Y9s!ft&| zG?$JPW^I4?tK(%b)aG1dpnyCum{bU5F&a{3r{Ay=V}IBgHCa$tN9PT zx@H7bAvY;@bIs&^396K)fnnr!p8`MpboTtFK~XTw3v+M%>89CeZf_(Lwk#gqr<-PY zn*RpbLU4{4DqNIR|8gOadxd`!r-fuYT{lq5N0rrv>8L$Th95;a+6zS7?91JQxb#kHh0m%U?m->l@lekUFMjW)1i!CMCgsewx+SIjsm-VL!<+Xv|cA|Etb8y!j$C>2*` zOPrW;)%kl@iHGz*{O-3u{N2C)@Q?rg!|#6o!$1G^!#{rz6o*TOlTRr(#x%P@p0sYB2M*99#SD^}acD7Z-DUsKmMZ z-@o~fAO7o~{^!4c^TXf&_K*Me`yHJ-<_ROX`1@Noi}5l)sTW;~KmO)#|M0v2+?5Xu zR76#r%5Q(yYcUSrk51-@@Bripu@Br>RIHq)BfVcg9iL_YUk#`MsEvXTTFafpjP0lm zs&z%qQsgRDggw9Jo{zq%am_IssSM>BHM{ey9}TCc-wmhLJ@=7$?!Pq8!@zy!1IVj! zNuwibC%Iy~c6k4-Yw*bVkHf1arc`|qbl);8OmcsBJ-0^l>6yt+%L$XKmRf#wPAv?2 zBji=F#=hSRE04iTYy4vP?FeoOL5bx^{0J;j;k>J+xU8UGuq{xuir8{3dfnL~e1CB^ zyJBRtINs4 zmDNZUgp5Rza^$7mU1|9;o2#F%w6Dw;pMP}l)mL9F|Ai$C79*wiK5-gnTU4zc`J97* zkfclqxO)EH^L^llv*F!+Q2lcN+Xc+IU`>DVm-LQou?+I6)@y{*KLd;p^FOdsP>P)t z-0eL?mhE6pPnReeXd`H?Fpk9vnXwWtc_41#=zQGn|Ynd z(N|&o&Dj|8w#;?35tU}IUC8osG(E!eib(`o9E#I@E=}2Hue3pyg$75E7Kuy(pmDi( z$b}Hqt3OBpf}KS!6ed?nTXg<34cVfIr7zW>K9&t)jvDZh;h;=O<8bclR}IL}Luovx&~dCG=}L9L3G7oLAriSh0g86pR! zR2WK1d%o%tn)@A47)x-_#90PyGQBOyPsiF#Y)W;CVRy z@WTU<0&0klcv4c{`j*4ECitkE~K#hz<&1X!{Y-fG35Z6Wy*xTbfq0? zeAesv9Li%i+L!4j8_omQd4Bc=qF`Y(U=tH&pk)mGsR zTRSL594?&<-(Yy43omL%jW1pHy9xtAT9318dp$BREw{gnDR z6M0ws2y8ySCE|PE(My%rcoV5~iV90V61IW7)f<+L9dZs8AMJnFhvs9%SoFN~lTRnj z$Irg_j+W$$qQUw}C{L4m2=l(TlI}Cqg-qA#bSBrc8Z2V>d*%rh^ z9eBSl`EA(x+%Lkfe$?V!%yA}&(0Uy zU^Jahrh~VakfI32Nffx;Gw0g90HC_7_(kpp4q|bV8k`gUSPjg0Jh?glrGhbq(*myJwrYsATi|BTu5l+c-62u+KS`>F)YcjX zkb*4dN+^7II_?97K}5GddhawjZ7RHPCC3=@{%C7 zbIyO15#<>DTMcL7Nq?@=B(7YSas!b;V{fRAgvMUxlMMzHU`v@yv34)jfe$KRGGanH z9l!+}RNyG0wsYeAsycj4vR)<8jkM3Foeccwd~|1a>zZVJ%j7=lBvGz7<#ik0t!A|e zmY&i|-WF5ZE|PU*iL$)hyx~1a)+u#SdH#R@J6S)yd)hahY2l+r`~0p|BUu+X3W@f* z5(z{^nnF+^ijVHtotllvC>y5n)G15_TFj6=FC1qa7yfm^qhQnhUGhPDl$+*d za@EnxLSNGT^V_~+gRQtsPNBF*=pujFfA-n40MXb+A)+ar(6r+N;qe_-M0j6#PCP7T zBRmEZaWRX|fAp5X#Z0He>qmz_gZNLOkwk?fmwQr5(8E-q94lIwOJKWP@1?u2$r~YX zUU(KcM8uVc^%X&zoTT+XaPeNh?$c*aFzhjoGUbul*|uM?&-C3Cn#?Cm4-kJjAT09< z6Ly%q06>0WB}d*AOLQUf!-hpMtz0Na_FL-AO3pNnl>{A}SpwRVn5h_LVP=HEnp2GAz?NmBuaDUfa=zQLR5=~-2#j6R7uet3`;~u z+ATVPv@VJ2jVo^Jqdd^=&xUU={(P1n<&Q9- z7(~3s2th&VE>*h$nPB`jh$`h&@kW4ljs+ZKLO}+@K&RbkuB%~Ichp+_&hdL+y3qoN zJ6T1A0(t3&Npo*h1si{HEi9upXh?F_n!J~@ufIsYUW_7wAZP?d#!1yM+LhG#FA%7v zFp>F!4Q&z|K69;oqgFfo6H+`TaVtx3(m*=(E< zYNCcPJ?uh*?BnxeVb%aPZb{+HbPfqvb|wFEcGNsf91cO4HVr{1H`K8jpm{$;`+z|3 zdt0J{Sa!XQ0>;w)Ffl>k3%5!*BOcaNx*2@o9wXv;_w*dq&$^rUSBdz-VD%$?GVs^w zGtW+L5x%7mcEx}6YcT-183W+R$e8?JVXL)LEbwY_H8>fL2cz-uby|{45x7iG=Zrt+ zlW)$(k8jyy@rRG6qi-|S&FksaY?Mh~a>ws3+7!6rLmIM?DY2Pa+U}7 z4XSi~kT&ntC{re$XWE6)=1BI@p+Zz@1;Tu+!y1$P z^LHd@MinMkvqy&%wAdLgrrZ^tEV4zw#qgvQ_utg0umh|HSR8V3h#3q^a1JR_`f>h# zsjCd?uH5{P!Q@7WD{JZQw!=+#DrFc8CK+h_>P#cvAzO3j&bQsuYPgD zt$8lX{J2U|7aG;QoiG}FK6-mGnGUDdD+%(7UDoEt)u5IQXF>90h~jhX>mv&5XWEE| z%(THNQUmrRZ5ddDWekYNVyCXP@FlBTuPI69>ht1{z&+p);gm}+Xz8wzZa74M6Khhe z5S4!|eUST*guScUSl3T9n_fekiIA0u1Y7!gm_i8H;@)q>W+w%y9UGDL1 z{-cMlE5E;CgDzSL2ZxZVV3w9#($am7O97uiim_zy*lJJ-SzQt4KlYAPAkvQDj0(C9 z!>o~NgP@NVv*z<+f;upmb>1Rd7^bKzb?)tgN=!T=)RZIfs$|*n)KOcPPpYb!qz-=r zEr6D3FN11M+FXE_OQAW8(Zx8AN`pjog`Qph`lTPvDzP)(#SRcYKzfiwBIJ<4n&Bk2 zRvB8j0knxK^HRe~87KS;q!CgWQ4T5jVZ>sAV_}SRo5&z48iS;!i$ZU?^q&@e3K(Y+oy>G1cdwn=mETN)nA*MlpH?Q%X!D5~7>(hpu5tFvT&}ff-a)S(dcYj|r%hBw~L>%Z;&Y zAT4Ohj9^l$;%>QDKqa-Bhfum1xg8ZRXJ5Yz&+|hnj9!>%X*gEJCS=x^d3z=QS}v2> zlXpqWy6@Mt+1f(F9ADQ>g?P%SHS!&DylyrosJfqPYjwFf>kSqI*13TV=CS|v$W9lbfq^&&y(Hl9X#MPm~($_tp~Ngb{Z2| zWjwD2#q~c&Y?cOdMG?bjFJQ{rX)p`aVHlN74e@}ItY92J-U#Q#%Wp5q5q z{W1J^fuAp=M@1hk;v&A9e1B%CmgiY|a7Le2$>)kb<$vJQQBkIoci*4Mau}()DK{Sl z$$h+>Rd|K{IcpwWT(f_oJgZ8$f0|}+UlNy#2hp;VQ>{Sw60AUJhCVaHpYsj{lSl9gAoBLQBjI?~lM5uBAs zH-aEAzCxUDk|KYNXGcT&^2|4b8`+U%Tah(m^F?;BwrO}_qSc;GPuULq;=ol*MxZ{ljfORyEC1 zRn?;J_L}}*|LuQn05Bja+)mSC^6D2*c=zczuF^bfJ*l2zm`&Cu$Who{1v4~E%h0`n zS0SaR-=}{?S-noP#Gl4RNm>QJ-h2!aM3pyF7sMLw54CGhk-lTe&K8|2IQzDkO& zVPGpLRntU@m+;@L;#f=gCh0hl#&IT1<7@(ywuH~5S^kh_=lD;)tl*nqAkz;?HNJpx zihTJnZI1;nmK66e#|!D|UV6%x(qo)eQk6^dIE#ND5_&$3Ud4CtAh@F_li5AJSVmvS zl4OEkfV<$sw3P0b*%$|>AvZpe;O8X6fhKHb1Zwf0OZJFK3=fH6n8$QBlkO5J%V9Rz z16+E{i;rpcAi&bH5rm#*;Ub?rG2H?L&!-<^$8P$0_59I)*+H8-WCJW@NlW{~?d`R6 z{q}$6R+=Z(G=~L$oTlSxv$o~(Zk|>ZqaC7!MKT6~0w4VR?zI$;$9XYMfw@J<~6dtfB@F^2w>Y& z)KDADo74$Y^Zb1<>D@5Vcl*KwK)p-;vP^%sM#-vSNA-wAQaI{RuV*1S4z2aJ=xw@(i7Afe>7z&NN4HUh5U!V@rXG-Iv>Ojenea$mpFrIR- zJ~QOV&|i{~zo^f;E*|y>&H;xiG&Kl+Lff@o(gm=s(8|LUnjTo1>?+3@~YT6T%lXXk+J^i?wKM|`!>Gqu4{XOS@7O2V~ zEvq8ETVnjdU4ptP(%(e*Z;umQ@$JacHS}N)iP$p(PnYX6Z3q9FXq6SC6-MYjF$$TIoMR7Ua&)*gv$j+1*uEG3nXX*HfoDZ6sR ze%p?8i^wyWfD_63(5XzqQ>8UKl62}8OWpS}V6*%Yl+t367ge`VJIrLjz(bKdfGQ+0 zT(sD?0fET`TH(Jb6nxfylY|n3s;33ML|I{;1qMz)b;H$hUKAkSW=|K=4?Lfum@_5I zXc8tjPqTQ&GKttQTX`7tDX4D#EV%W7h8Lkx)v#613lUUt=^dr$!i@CeB-JbBZ=76E4%R?jeTvO{U z({3f3C}$p)UI-+AQGu!dkkDQNodxi>%;zY!lGy}>Q(QF}hAU|XX6S|F&T}L{Aft2X zYy(E=rzLD%((369D34?(uEr+o@&|C$`;cS_&@T+V@tWm18h$|C@q96Zm(-aMMOOyC z9HV`>V-9cm`Sa&j>@WU9>25$@#`+tqZfX7s34|aDLoGOeH4_@8>DeDRaFP#VVgvVk z+(H6GQ&7dQ+O;5A&oQl0XKE9#OZg*wR8G@{w19=kCt!mYDahDK0y2Xn4mYDv51mV} zDwr_Jat8Q%q#0Wg6h?Q+EPoWj*tBffA!ozsV9W)@IG+I#a!D0M^o*7y!6*q6(kO1Z z<-@pUJdHDdp2!Pg7+&CkL(LGZl^T%g3~UYJNK$B%lvxV^{Vb{20I(~sNWcpqYMKC* zJa{5*54UZ10*2i;0fXfBg#wZrY^aHJ3or`E?LCPWy6Z-A5DuNH@?8GD3H`S}2AoVv zHd!Q`^W8#~-Nino3?I<{c{YQ`bh0=ZN8H|O$ZchRu;M7N%FCoBg((*ZuA6e5R6I}O zZ0)IhNcLpIDE{KbT0<@Rpa?x2sIZj%@grnxbdm=1?`}~w88he zJ;VxsJ#1U7^v_B{v7%C}TU4m*%S+N#(}+&a7`(lD6LOKlHcwxWD4SGSwyOx%wp@xt zg*0s2MXZ1_2Lw>PVvS}Vj%ux+zaEl$b>1^qNt8(bA;oreFpD;{)q~x;N_Ru41KSwT_RY#pP8N&;)qCb z99*VTGY?a?x@-a97xJ~1%ao;kBI|bxFq9grRpe{Dn=tsko$b0s0FzbER2~1w8|+^8 zbeDoe67KLiq!?c%;S16gpeSe=>CZqmxnnT;+w=zwb0)3 z0-?KTg51i&gJn{+C>OtcfsTC=avNfmwuoHDlaas%>KH(Z@t>AW2;6|8-QbV7ZM+FO z`_3%6ujm__&pOaGrz?i;d(Np@>hH0C7LzJ1H{>m)U~uD)v>12b;fk%yJG9N;X6QBs z!xDWfYualXf1)bP>XM6Z;E`J2uC}3Z`H^ow^9<&X%5+L@RHBt8 z9D@6U1r>`5pl=3><~YMOJ?bxNx-%W^{+W&_P;`lVUa@71s9@QX@2F}aNM_@I$PuA~ ziPiu4=JxHIbr-~#O`GpoP_iJ??@@(o-sTBl)wqGyHQs&t83>Shf*Qp)lAhpC3)UXX z)mc|tUC!r68+rn!>vS}qkIJ@BvIR(ulPas)(cVVc%-b7sXjPUJc?AEL6-h)W7`E;y zvVLl5H~*iAWJC45Fti7&nCldO$s)lSl}6qc$^CPxEfmPJ6#bz$!5>@1+98Tpgs=^h z9D1H%xTi*>tLcqaS#WRi$#Rx_;MeB#8%miJ^IGs1Dapq1qFl~mjH9CXVf(aIW*2VY z*7hb81z?RT*q!7S;t9=vUQQm+=`2ERx&{^i{5>%knO_dLD#Prdl{wsh%7a6M8LA(A zc5hzPKT&cOQ(dd1xy~<8R?J$D4fb$eD|)|dHqrH#uFh@h9PAHCg`ck)bf8NlVf*o9 zB_41Cxz_E4ENxsr3dBh{bMxNclb=^)89guXLhIDHfgBc`#8YZX(s-dmX%=S>OKgb3 z^)4cn;tv!sSx1L^o%le17`vn}7<0rfu!5JloIcy;t0G~B%UyDhDPyfIy$FiF?^ zmX`$bBPwT9#VPTJ5YS3!sG9e}KBJyMvqZES1|T|gl`$(hN3#KcWfr4XBGp=C)KYQkJAX<|T9?;_J^zLFZ8=&9g--!$nm*X`3{_Ow#_y7IZ|Mg%0{r~*J{l z#$Efftv6^HK&0`P;CM z0BxwD@2O5Ov}5gH+IV}NWH;sPcgi>!%Fs1M2@H3zh6o3LQwHC%+~nhrN%cEnoD5+o zp%z%0cI2qlmkGnYzWO1VEqnT-+LQ>H_cKk*^Z8EwGUIl3?PJms-2rn;@jPmlqD7Rb|#-4Ks39M-X#xlF`_#VkfA zF(&N6YmL(ddCc)wY-hclBU2=QS*8WKjk#Z~4ipG~u!`*XvLlDbt%VZFfKam>v zeOcu~k#48xAgpTG1sG&c4-3t+bypwm0F;5^3|Ebpe+;BaeHCEDhAGw~K%Dw7r1uyW z-Ylh~x^j%zA#pJ>?)WM^W*nnKmlfkp(tDs{m>Q1*S4BRf08Ue?x5&$qm91m$6}BO* zfQbZuXw!5(SyB94tf z#YWX8>sr8)0a@Zd(Jm(AaoWq_M<$g~nl^<+cwRwW5<+6OZrd@Lry2GZiL1P*!ylrB>E^n}b9p=5Pm+)~}`B>m-0U3+k5%D#0?_4U8ra)k=>P(ty zeMTW*X#jD|%VhS63buh5mX(BQpcECOT=W&;P$t7C?Aalf1*4lGo}qVYyj*95kFkA! zL7f9YIUXO#DE)xc@~#GIJqKVF*(P4c6F*)tL|K+uomPaSHs^gNpm}Us=!ics^Tb~b6hPXw3+Dcnd0<6%D}oXF*THq zND zcAtmnumAQxTC{gKA&Yfx+NNo(f3kAZ6Icq8a$Ka8R3*SfdkTnE*R@P#aQ9*lORBrD z&*|Ss-Uc1$#U+T|6>d@5I#H|}uswx*mTH=zI-DQ-S!96I8P)QDeSCp`u@4cxmlfZ3 z2XC6!L&LPotaMA~4#v*=HF}e6Lg`TvZHHc^bHAo zww!bQHTyKH@#irOxORo_w&9N8UufyC!;s5v{p)K`TO;^an&A#JlTeKb(4TCZiX9Gq za?i`a@cxEScuej}N?{Ry1wmEZKpXz#!j}O7V~GUAw5k@uWDv-a?1e)caW8_vU691{ zJR8*&6%+bZDwZPhSTS_V4ZaP2xWn!yKju|>|1_#AfHL|O{YK|iu}pYNf_V0bb=&;n zGOJSN!y2=?qY~lKMq9PL>nORzP)PFRRwH9bxAF)*q^WDcCr1oaROFY+Xy{}pw zqIgI)tClwtBsP2KKCR*xIAT&#=$-YvTUEVZ2oSX9sHQ3pUamYG&tq7-`>?@2Oi#gc z-b}w^&~A)m(^vH2&vSg4o&RnAG08ZfBl?BWM02kRn&5Ep>iP-RQk20xwQ#9)4tPmToh*2vv3Tb{35_TW|QFT~$PXE&|t zav+#td{JCAPYc7y|2E`iH>f+%K5T512864iSip1bG}moq!|0)^dcH|^p*XJm$~AtZ zd5Y_3M}WGzEUOQ{Qij_A6gZxI#6#{HLu{@0ng~&U2EMBq^3Yi_FG7@vDyi@h*oxTc zBTF9R*~Ke`Y)x+9oTHJ6DS+$uuwI)Yv7Jl{qhfpc;CX ztof&hU_V5NOo>WIZqwg?{lH8f{awUQlqiXGCX_TADvqMNLq~La*cF{gvzpwyHmy6? z5KRi>%L#`_(tYVSWHqw+K_<(-oLxTYC&hBH_o{w4YQu0KJB! zTX)ht&-ft=1s!`MfF0;=#qp2aw?RmMsM5o>g=+s&E0mwBVylBh+@6eT44j97JJ{~F z$HaDI)!h7Lvm43|5$(CU5jsOJ_{-SFH$T0`BNj$7uZB8TIx0_g5WeS!j`M8@Wtg!$ znG_>dn-as1NhxAc8Bu6?vj0saCBn=pJC$J|n4XH7L-F))!t#b`W8jkmfKf|-6s7_o z$Uf}eT<4pJWgr!RF0845t3?42G~LnEP(IPX15IpW7QN7+dJ&{IUxV=E-3$^HxGzKYR$6JJ=laUj72`7yyp14;Shf93J48*Gc?o2=YPFnI)eR zA!9u<4NpJS0wUVP0x}&{mwkaL@n9rz16Hwo)0fQ_TPcI(_ah*3Yqe(JL zD$s>1!eb%M@hpi8Og*K4HV6VFsCvF5TfuR=6$lxZorgnea(`Dl8ke^8E}=FMhuD{U z4u>>cE!4sn^+o-l+AtuXznk-wV>kDQ@jl*EJnT6O3ELIh7zWi3_HtgMP9J52FhlKFY5=hA;3?pfPHI&gYipBBA2Jj-O6#{dxg#a8)O)XW|`&EeK=bNpQ|$E+EC zBr5M>huPyuKdls+`grUjndhJIdDN=9=~}yf-Z19qmpPs$PcW6(G?=&9tLxq4J9da= zT0PaB&)IT+@pkNZ?<6hj@8Wx#(&8EfmHvB1OzxpHNC*|HI|LI?X4?=`QWVCps%J6oiGXmbCSZG z6y_Pz9X(RmXkeAPi}aV4Lw@ZWt)~y+COX6dRwCDl3xBt6%`7eT)UXe9t`?jUp4_0mCwNLuomnRM(aj zjTZ7NUozOSZ#CmTp(UfzbU{aoX6UA48*QhXr`nFQGQ7U(rNYdQQ(dY9Qc)~fk2Jg8 zx>Gj|P4;|LH(&osF*n$$t`(@S>V7$s;zf#o7BY6(XgICYXV?AUoe+qD`7GnabXC<* zgI0E<8U-5P*nWYAR1K_{)!uDC4Q+4Kj!r`v_F8DyC!G)p;l^vLeyZR5DbihBrsH!J zwlWVunF6b?`<88a*3bpZo2x3)^;z#cVN8>s)67?uBEDTLr5o6Bj;9CtjrSZirW>k% zDZ9hL)?<1*dOx#y9@YWch)h3}-N9;chW29Ju}K9KJ05^f&`^`uXq+xYKk@eGU#>s)&E=_+1O03dW7$VhkBK2f@J~a?s$3s*c5kN4M zI6R7GMz*G(Y}>E~oVg}(C`PKs#FLl&6YjW&`&fipaE*207L`S>*T&7 z*Qqd2s;#-QM@QJ4AW(kc$D57MaO@t?X@MPhj(wtk(dAw| zNc{^onr$2oi>xTBWrW{GyMHe4izk=}9%B_3Pn&H=oA{luXwrOL)m8V~I2VH9J2Ac>U}nA@;|^bT%hIqn;Rkle&*sG+-`erS#`#&5Kiq`m6v*hY@!dMd$n z7$LCq687R3BI~Ugj^PcyYu)q}D*P??`U-cn8}EOjO1xNr#7Z~M8tL|b3hq1O-BcVc zq-2KU0VL#1ZM8ErY?GHGbl={2?yRP84jYPhTn@6N2(&8F`xob;w_gH8(@ez6yXVYX zU9n8f87`xIC?F;HLuY8y;ptdJxpws5eE!3vxDayGMOLKx(Fyqe+g-9Og++RH-A^yK zO|K+7jzF)f2)*`CYrigk@+u$aGjW>T*L21Y1KU&wqglRgN6Dw$LBlm3qI9f9T4aUt z(9WG6blmPUVC;~>P#vK zy5efWjh_2Fuf)DktM$dh&2MnqBP@X85ciCx@Uv;NJ{5Swn;74($`_=N8MJtuI{a$0 zOrX2Gs`B~jGD|(Iud-Que`ZskKmLy2pE*>!GJ056^ecZK;CNgMj41_U>O>OtBsmC}NvEp^R*dS1No8dw~L8>ZJiXnNF>?8}7e zeQEu(v4_9(R#nv&@Suu8fW#9P3}h)4+7U>`bq$!%gA&+Yl$}Pn^obw`k%PAJE)28e zg1GSsQ7MH#f|w;2L=^j^KzkMzg70z?BNv2MhGHqrG@40A^D-o0Y!J{-P&*_Bbkn4(N!>1YO( zQOVKXO_kyi01~B`K)ECt5=?)xL@f~`fF((WFesUbLE!mbHRFOIET!J?5z;f1Zi7RY zakN;#Qac;q8lV&kg)be$pA5MJA=nNao!oVM*R+CX1U{no2>scVJYCyW1N4oKF zn|Y*QNV=a#S`A6td8EN{BEtjDIHr0rVS+%V|B4eJP`nj@|POGj-KWZ(}hq zqi-`5X|I+*R`F!QJs>Q``6{*)ws#9bqsD*H`Wxv{?cZEl51fzNR&N&qd{Mbn)>n*) zUG08ks34fCDr!LBT*r}7nP$B04rDG(FQyi9{wM%vlH2=A?vE_Bf3>z_orVrLMt+k! zlGn;VCi>opY#K!CF-CvF-+NjmM4#Yp<5{8U1=kZ}+})&g(m5+Ybx9p+-(dn_5NIGu*GIReHPDwsmq7EMh|Mm7RV zT=$6e0m~U``bK%@^fNd zQpj~DCn$P8Q6}JPt`+I>b#w(fRR+wc53;#bQ+%oH=KM61BsY_|a7;^d552EIr;OB< zYof#)3aFTHwaL`e!mn=R+H)P5wP$U-_nv}q9Xz>}Rlj3ZWo>@ORezGkKliTZeGgZg z$FMaWaRQ56^;R{BShk5fB#Q)DLS4+t`_)LFGSd{EhUW z^sg?B2Tq4=tG8PNd{L=XwXYZwyVCu@P)0CSMbv=6sg5I~GER8Y9mrIgUW{wV`Cb6d zB(3kuxjV4b{?*zJWg1%G5cyT^NLnhtPjsCD*))j8V~B*m_pFr=eS+JKCxxaHTz7w9 z^Qi$|53odd;LDSt;1Z5dxs@M z6~^Omb&i1Xg$l+{Hbqksqk)Z}CeAy=@_?lbHT}#m@wlKZ8sL?5a>!3#E7Tu?WxS;& zU!%RYEju?KPa{}W!FQXG{F<1z7;=Bz$q5QxPm~Gxo@zz9d@WspR*?ZS>Vs@9#S~u( zyE#AABudRB%q-Iq?QQ!JXyt*rat)N2Lje^Nwl4%qr?@>uq%H($Ge|>qpSoof? zSf-dONtgbSe;WU8_5R)MKFL$xmN7!n zUg;D?K^RoCLMuXz0aG8a++pK4IC2<9OEunuvIEW#$+5QdaAJg`Ay?=IE&8Bn0tmh^ z3j3&dG-{5VS3S^d5(vENk*=nZ{_=72X{4x6x}HXgfBU4xG*T~}L_fh*K_$G*lor^+ zquwHc_0O`n0C0gV+c3`T5tzZe#b73XPVfk{I)aGP(S&OxR7!cAwiLDWOD&T||Dw}( zt|zsAGjtl14>JqqZV)|KZfvWohs3T{Un^1yDs2@tq$!6uDrs_7blpKrrNPU*h3sAn zz)tXXf8D+a2bS8uTHCtbh7)jz`_0}7UVHvJF$@OmrbBcZLtOaXX6uQ73_cm26q>W( zh69^V3y6AvIiUl87A<4ZFc3Lax8tyZWz}-(U2zhT!wpXT zjAc@r=Hqbf9wDcTEzYs&il!!J0~A0X>b-<%I+rwh}wnF`= zRau;9>}|BCQ_J4FbJGY`Q}E|a$h^&&=NuQ%$puNCwo+-l;ouRJuLl+ARXgDBkjQSR zru0zBUH&wajJru%dafn(lZAebcu*7yl(=Q?~?$MHR!ADt9_owkxT7f2I0W2Rr0 zVSW%iJVvv*TUd+MG{Ysg?oEBw^iR4Pp6!u?d&v$%-r>2Aob(52B^w1z9b~A}sBg{u zQAulHZO$YZpxD@Z!*HX}EV8R_4|2;S_5Sa*IVPXKzc@p-HdlLD-Qn!K`URKKTLKgc zHBe|7P7eS8^d^%b$r*pH<2-V{50G~-JU}kuIjzN7EdO(QATRPN+wyKF!9WYO*xD>n zlI@onBzJj$T+ZVRg1kjY%Jwu!sGB%cpeM&HenP;p4n4#3 zJ$ONwv~Y*fz3}(}jgZs>A*fqFj381$WC6c!-BF_FYL3K;`We-KF(Q9(%~((L0g4@lquZjwGgU%GM<>Ko z@%A8U6V;g3{JBcgU4`WY`a$XdThDxmN6M!}pC#mH0WUsMubJz}?{uz8VX7A*Rhzb# zq;Twopp6b|WFods6VwO&xym86un6@4EMH|ijAls`*#y#z{3yB4!?&bXhsRhDnH#k6 z7@8{GG|^$g-0%nnGO6rCkc2u!Tp>i`gxGc?v>}x_IAvY}kZx!X$+B*l9g}FxCjrTm zkjxbugM<;s9k9x#eu*+T2;0C%%SD@}`+ihR(M7y<3|$qZK}6|6YQP-$E?&=M9gQ5^SD5_5XG?Q?CF`99lfy{ye4k9>hZR(R^e}t_IWX?0k?&b}lyvawLEBF% zB=!x5B|Lr>sF79Dc#@XNDIV-)?*)m%^AI1qubi}S{wj5t0~`4OT5CDMSM%Pp3mI~C z3;fp91Q2uEX!-~C4dC0@CCrVVSf4odLl~#t-w=LCkeN}+dk6;}I$OR4;J?gV^52bA zng%z2jmWy72uY$ctkT$2ND|jmI70^vA)@32afY%{rh2YMw^p@+GSu~3bj*)j9F3x+ zmEg3No-#c_2cbU*QRCaWIvg*uIG$gR7_UddEI`KqNsUN5(!~7Gzc+1^gElBa zWIQYCm$~z~YQp5+X~U#sjS>^cGHI8W#c{ZQz~4~H%?l$rgOTkKpMJ5xM zRLYw;nUDnir!x+?Kcx)KqHBAEBKg}?Sh@msVYL3+nbOn^ln^oqe(`|~n{*6+amlKi zB2Ry+qi%tX+vG**lZ1Lf8a>@*pO68(D+&r!=-HFgW_PoRyCD~RlR4b#Fa$ng`{JogV`)S)4c-Jw@=WX5-OafTj zGgFq)5*74zn_@CqgzU68%6j>KfL+q9=~!}CJ%gW`8pmX5&pb29NK z*BeXrPD>kDTiR-OrA{)O4Cjl20FGxeWmCrv*_;+J?%=jL;bhy}I;bmu&jxs7rjN~G zR~Lhx=erBf8Ji1St4!9tb~OT+d$V&VHgapI(z-Q@f=hf_59TX<%JKB^~!_HaI2Z30zq4CF9>u$W+YF2K&XGQ|OG z8;TSUl9>vJDtjz#D7BQ+c`-O_E)?a!(E>$z+F#W;X0_Qadb{pMEBaT_;|<LX4w_a_R4nA*vz}$rmGXcp-oAm3Gz^qhOE=25)EFn2`f$|DUmnBk>yKb zX!8T7R$SwvHVX%Tu{3O&{16i#JzS%S}#eEekuN<6M(wd#DcOLyO*Vbmoj4OLgKvEBqw^?1>tGxbmIW z2_F3&7e-ULE?jc|vJ>2?z7Oe|LI=b8YMs>TYr~X!pfw(UPvu3vZG`<|>azl~)5pr=2N@VSUQvW+UOl?$ANdK zvB{tT_opm>9}gX!3z=dz$cHoG)Y&Qoz9@|%QJX%ISQ=BIh; z9+hG|5q6+qE`efu{L;`jnQ@wl{pFF{&o7;AbiNuBHtB&f^!5Tcr7Qa#iMEGd+xpNq z`fC0*_S+)@sPuLX8qydI)uj9>TE!36k-b*b-D`11^hP^W! z6qc2LjC0-TCsB>HC;9nU81do6%k|=-)tqr+FUsW5r*@-d6hyku9^z4;?~<(Vulg|9 zOvTh;xp~IV6V*&xNil9keccbYwlkNuA|=L>xSU_bLk8D1m%Em`d|<3Rb1#&vygkwE z%@WYkDaGrb&d?KwuCP19@ht5rE1hr%+0>KZ!KGgGM1;ONv&uj{pZ5!UBiBVENO?ijKv<#%J|z)p*CcwO{= z!bNsywF%%-wY8B(3Gy{w3Brh5OYwX@i1%R!9=A(lS7fGkwskEzHUe1#8!ijz=~z9r zEpE0xPSiMvyaqR2gqqJ2z=ek{ok~8lXuosv8^cCT6S(17T&x<)q}xBYy>6}G9omJno5?ZpW z$qES)M|Nq^)B0k-FFJKh;WTs*w$zt6(qyMBMbIN^+OO>1Sz8p{HUb`%lBEZH{j?le zegKvf{OZi);){5FtK}eC?GM*Erud|eN*@sSV#&dsMuF5wwh4z^ z0zSm=&kN^W0*QX4_o`dQAGw<+e@6+ymT| z8x98N9;jbz%An}pwe!_L>Kd$i2UW1KWs(bb@`mi}isVIf=X)jqRea~b1#boa?QY{M zp_!#+l}rDg-1qZlSp`>$+jl*G<`c`uq#!0=BY!6fA|o=De_{lN`CuF3A^a50v!EXJzq(KD$?I=_ut*Ny3DKQQ zH}PF80VzmwbRVr?mhWhgC`i8)Vd|;rc}qMoGL(LZlD-_K9@YlvDU?%Be?8c}(eSv7 z8NVrMreq~Ia?7*4av49m?DTqPX3Ou2h|+g*=*z zS^)qf;*(0=I09Q{lZ4)Re~YK5*Pnm(*_&rCZeQKJ`MZbLxAy|Set3L!^Q8az_`Ao$Uq9_f zK7aW7>$_*SAO7p(6OVt*@4kOzJUn~*>h}KW-7kLjc>7Xgc({M_4dU+gn~!gM^|!uF z;ER)q--mx+{J7VBT%*tSvo}vSFK*s^Cz0>p`1Q*l_r~zOH@+9Jmk-Z=|NVE~{ck2k-4so_YpKaq5P@@{nd z|7(%=f4%$T?H}L${hr$ofB5?4{)49er&4KudU%tM;4y#T=eJ+qynXrf)y;3ee0q4T zANa$KzBsrKFMs}c^NsfD&mQld|J&{3)7`V1mtVfVd8WVm_)l$2@Biuj!@s<}fA;kD zo!+tgg)g2ze);0&_3d~+ z#5X_v`-gwe-|WBmFy=R({NeN4KWZv&pWi*n6uiEB{^~~C)|vQj^qzW>v|-#veSdhvdN_PYM!_T~?_?dI9<-@Mem zs@ojC1K+;<>hb38-HN^ci+BHe{_(Yp=9e$-zJB`G+b5~`chJrA|9t!A=@)nRxBqy1 z_q!KQKfnKK3+?;&yt!TT7dPKNynTAVqVI{~!CYyRW~#ebf)! z-8|j?Qd{Qk@!^|y^ZZ_={7?O^B<$bykEMTxy+roe@7u%E)5EKO{Py(=&Gr9>mHh1c z`|SC{vwypJe5VZF|MB}G{OaL;8>sIdzy0=~9{%HJFMt2@|9rUn)z5zZr(gYN{nP(- z|MBuyKl{x$zZ}*4`m104{+EAx{_;P5_RDX6{ngLS{`+75>^FB`|DP|u`0&f$`#pb= z+2`N=;a{aqKK_g`HoNNb`$^j9pOO8aS`LW!?SQ0oLN0T7o3(i{;^);Fi9R?+QqG6p zN#pc8dA1LN@)w9Tm*=-x7yJiv^#i0h&xrSN9*|}#BQY7C1Dmox{7!Z`9FWt>IqN!) zz`2t7cU*{pXH-b%*>TCc!!v31!|#7&H+c@c?Sp^E2UGcbd~|_V+oxc8wSzH(p9#)3 zp3&fv{lHRwfV6%Pzmc3S$ zk#HrJkQ}Btj4fS-_fL_s;%AEWgZD!5*I`XdybgPzpAs%)e9ZnjhHWUm`N7Jfk(IgAS>AR7RSKlXYVA_Aoomx5Rs)NkVu{ zTP)=;f_T}(+mflgPrH>QoREKmymea*OT3WDW9zYAyrwtn$ebOXiGz8fmHIchgY6z1evgneaeb`yX`z4Ku{IXwAwn*; zX4YvTaJ8+AG8&8|J8*r3EM{r4OPys@Yh6xA3Tzv#&)M?Wf^`*jl?|~4mV=NQvrZdw zU`{S1M@FJEhq;a-q$~$9+QVwc{iGa{ETd-;jv{` zIJE@-{V7`JZgE! zj^{0ecJc3oTpZ7i2nut5A)OhQi_&~N2PyT18cE1tufXN)ARdsbq4c`! zsPCKy8Ewh2?iCUbBj~nAmYp6n>;sYy>(j$z?&9<-hf#kIb48v}*;B{6e#FL695=EX zJO@+%$C4-{@z|!BhrK<0KkTfTM&P+#CS;zsWuoV|Et?W+|E0Zf_#J=nf85HA{RMAK z;n;=@lNq=^LLx`zyp?yx&sZA_u7Z~f#_ZN>lQ@)7FY4WJ<-D_=*^_tj_z%xS%d+EL z3WsOBos)l`@u^N+1tFa+tq(4848;fE7s`Qr_ndeHQ9PRGK+<*?b@YYxsE=|fQCA6x z>`e(NjaOS9SY-)G!Lmm3N$wQSf$TO%0DbX^V>Q0y*7iWr5ZgIfx$ELl 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