From e4189994107774d5438c39e541c8b8ad0882d620 Mon Sep 17 00:00:00 2001 From: gho tik Date: Sun, 20 Jan 2013 11:16:58 -0500 Subject: [PATCH] v2_02_05_src Former-commit-id: 32034ae504c467f19255c155e1af2dfca7c6b753 --- build/dxwnd.dll | 2 +- build/dxwnd.exe | 2 +- build/readme-relnotes.txt | 7 ++++++- dll/dxhook.cpp | 6 ++++-- dll/dxwcore.cpp | 36 +++++++++++++++++++++++------------- dll/dxwnd.cpp | 2 +- dll/dxwnd.ws2008.suo | Bin 80896 -> 81408 bytes dll/syslibs.cpp | 6 ++++++ dll/syslibs.h | 9 +++++++++ host/Resource.h | 6 +++++- host/StatusDialog.cpp | 8 +++----- host/TimeSliderDlg.cpp | 11 +++++------ host/dxwndhost.aps | Bin 141004 -> 141512 bytes host/dxwndhost.rc | 5 +++++ host/dxwndhost.vs2008.suo | Bin 39424 -> 39424 bytes 15 files changed, 69 insertions(+), 31 deletions(-) diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 1f0d515..fe6e70f 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:df99818897624e2426ed40251d25c8c8f8a50e5174746aed2c5c1be3dbfcd4a4 +oid sha256:d748f1b239ec33cab73c3a6b40b6900a093f28c33c42e1b430f2e08f499e36fd size 262144 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index 140ea66..08ebd30 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:63d93b8775f8106a4ed846e49768c1ff2203c049656866b84a8f046d1c9864d9 +oid sha256:b9e5a9b8b7cadb640fa36491af117b34e6979ac7eb3cee8fa4b55b06e1a3ab9f size 488448 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index 7a206ec..2f54251 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -12,4 +12,9 @@ code cleanup - see syslib calls hooking new configuration flags: Hook GDI and Hook OpenGL OpenGL custom library field API hooking fix with module specification -Time stratching by keyboard control (Alt F5/F6) and/or Time Slider dialog \ No newline at end of file +Time stretching by keyboard control (Alt F5/F6) and/or Time Slider dialog + +v2.02.05: +hooked winmm timeGetTime() API: makes time stretching work for Age of Empires series +changed time stretching grain: now it's not the coarse grained 2x, 4x,... series in 9 possible values but the fine grained series 1.5x, 2x, 3x,.... in 17 possible values +added status and time stretching view panels to tray icon menu \ No newline at end of file diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index 723f6fa..c85fe37 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -694,8 +694,8 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp case VK_F6: if (dxw.dwFlags2 & TIMESTRETCH) { char *sTSCaption[9]={"x16","x8","x4","x2","x1",":2",":4",":8",":16"}; - if (wparam == VK_F5 && (dxw.TimeShift < 4)) dxw.TimeShift++; - if (wparam == VK_F6 && (dxw.TimeShift > -4)) dxw.TimeShift--; + if (wparam == VK_F5 && (dxw.TimeShift < 8)) dxw.TimeShift++; + if (wparam == VK_F6 && (dxw.TimeShift > -8)) dxw.TimeShift--; OutTrace("Time Stretch: shift=%d speed=%s\n", dxw.TimeShift, sTSCaption[dxw.TimeShift+4]); DxWndStatus.iTimeShift=dxw.TimeShift; SetHookStatus(&DxWndStatus); @@ -1017,6 +1017,8 @@ void HookSysLibs(char *module) if(tmp) pSleepEx = (SleepEx_Type)tmp; tmp = HookAPI(module, "user32.dll", SetTimer, "SetTimer", extSetTimer); if(tmp) pSetTimer = (SetTimer_Type)tmp; + tmp = HookAPI(module, "winmm.dll", NULL, "timeGetTime", exttimeGetTime); + if(tmp) ptimeGetTime = (timeGetTime_Type)tmp; } return; } diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index e51b646..bf50ae4 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -51,8 +51,8 @@ void dxwCore::InitTarget(TARGETMAP *target) if(dwTargetDDVersion<0) dwTargetDDVersion=0; if(dwTargetDDVersion>10) dwTargetDDVersion=10; TimeShift = target->InitTS; - if(TimeShift < -4) TimeShift = -4; - if(TimeShift > 4) TimeShift = 4; + if(TimeShift < -8) TimeShift = -8; + if(TimeShift > 8) TimeShift = 8; } /* ------------------------------------------------------------------ */ @@ -378,20 +378,35 @@ BOOL dxwCore::HandleFPS() return FALSE; } +static DWORD TimeShifter(DWORD val, int shift) +{ + int exp, reminder; + if (shift > 0) { + exp = shift >> 1; + reminder = shift & 0x1; + if (reminder) val -= (val >> 2); // val * (1-1/4) = val * 3/4 + val >>= exp; // val * 2^exp + } + if (shift < 0) { + exp = (-shift) >> 1; + reminder = (-shift) & 0x1; + val <<= exp; // val / 2^exp + if (reminder) val += (val >> 1); // val * (1+1/2) = val * 3/2 + } + return val; +} + DWORD dxwCore::GetTickCount(void) { DWORD dwTick; static DWORD dwLastRealTick=0; static DWORD dwLastFakeTick=0; DWORD dwNextRealTick; -// extern DXWNDSTATUS *pStatus; dwNextRealTick=(*pGetTickCount)(); dwTick=(dwNextRealTick-dwLastRealTick); -// TimeShift=pStatus->iTimeShift; TimeShift=GetTimeShift(); - if (TimeShift > 0) dwTick >>= TimeShift; - if (TimeShift < 0) dwTick <<= -TimeShift; + dwTick = TimeShifter(dwTick, TimeShift); dwLastFakeTick += dwTick; dwLastRealTick = dwNextRealTick; return dwLastFakeTick; @@ -399,11 +414,8 @@ DWORD dxwCore::GetTickCount(void) DWORD dxwCore::StretchTime(DWORD dwTimer) { - //extern DXWNDSTATUS *pStatus; - //TimeShift=pStatus->iTimeShift; TimeShift=GetTimeShift(); - if (TimeShift > 0) dwTimer <<= TimeShift; - if (TimeShift < 0) dwTimer >>= -TimeShift; + dwTimer = TimeShifter(dwTimer, -TimeShift); return dwTimer; } @@ -417,7 +429,6 @@ void dxwCore::GetSystemTime(LPSYSTEMTIME lpSystemTime) static FILETIME StartFileTime; extern DXWNDSTATUS *pStatus; - //TimeShift=pStatus->iTimeShift; if(dwStartTick==0) { SYSTEMTIME StartingTime; // first time through, initialize & return true time @@ -430,8 +441,7 @@ void dxwCore::GetSystemTime(LPSYSTEMTIME lpSystemTime) dwCurrentTick=(*pGetTickCount)(); dwTick=(dwCurrentTick-dwStartTick); TimeShift=GetTimeShift(); - if (TimeShift > 0) dwTick >>= TimeShift; - if (TimeShift < 0) dwTick <<= -TimeShift; + dwTick = TimeShifter(dwTick, TimeShift); // From MSDN: Contains a 64-bit value representing the number of // 100-nanosecond intervals since January 1, 1601 (UTC). // So, since 1mSec = 10.000 * 100nSec, you still have to multiply by 10.000. diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index b73389d..7665ebc 100644 --- a/dll/dxwnd.cpp +++ b/dll/dxwnd.cpp @@ -23,7 +23,7 @@ along with this program. If not, see . #include #include "dxwnd.h" -#define VERSION "2.02.04" +#define VERSION "2.02.05" LRESULT CALLBACK HookProc(int ncode, WPARAM wparam, LPARAM lparam); diff --git a/dll/dxwnd.ws2008.suo b/dll/dxwnd.ws2008.suo index 3e8602a6f162c77056b1c83ca27372b37108c2ff..58cb1cf11756fe22e80566de69b7d2b18c51a75e 100644 GIT binary patch delta 3027 zcmds3eQZ-z6u;;7y+`e8*L7vy}9LGcqc@edO-1T-c_Cr(i@t-t%;D-Poy@{fObo6~dd z?|z+ozV6HXs%QStN7m?O?nL+4g(vwY{S$Yo5Tby_PalYKi|*!}Tj%vgA8CB#u38`- zPWyHK)#x+xnh-(3y=KGgJXS=pvKFM|nc%`@%c`Gn@FaM4w|S37ZM^DKdA94E*G=uz zH1_!yV%zR6QxK`8LWFH5K6tS;@I(Ilg2E*Zd>-V**i>Be2odvS^M1`WT#+6QuBS)& zj^IWr=bwX{_~{+E!1Toi)F}9imoSx9LU3orOVlP0$Ek*II3DI`Wpp?+i&uw2Ggf?r zUD2AvwPGE9LR5lqy70;}lVVaMsm`{wNuq_A>iFI_Nl~F+muh7jLUwa zrtF^3<7AWro_<=7I`qC1ydm6U3_x@h2cDe_llc&k%yj;J#s;eATO*q&mi;;MQOtcQ zaCM!cld_ZDp`N<;q1@Xbb+v;Ie;0fX9Pu8w=HjM@50r?*mveixr}J0V*)whr2zYW@zp7J zK8(LK_z<}2D|sh`Mc_}7>?5kjx>X(2*nI5v>yH7oZl|~qWzbbEnga?zR&CJ1+T=4; z6tmAv=ts93HN16c3)M=pRoNV;q~7uR{IA%*rG>XI^&)@lYF8ygBUM|)f zPq^UhLSc<&9i@&Kx#7&)ajhQY(&K6+6ivbg1NCRI?%rq9Uz@UwsNB}JN?FLy$)jhr zi#pwoF#p*pU|ks*m*9=ZR&G+}R5Ue*RK7KW0)NBn(Qp3;{ARe|Zcy`-`E`)JNKUnP z8%S4)idO1iJ&^rg5wk#Y%7Y7B2N@s}G!0Y%;^;(&9#_KPL{~BaVHPL}Y5+BYW`k6$ zH-R^UT0nDo+r$_AKlHI#18+=N)0qCC>XMRg(b0>2y&i$6z^@nEJtQu?9;tXVpjr^2< zWz|C@qa75cMr<_qu`j89IK7;ZOJ3CAkK+`SnOWp}tdHE*sdD@RKwCppL2+5zN+~s5 zA$y4~mq9Q53{8S^JVZL*+2@mKopiaIX!+=ZdDNo)6$*THrCT2IkXN>PXu13>MeTB= zg#2=C39tn^HSwNMfHOHCjzASksnPd&yu!3AL?c}SeQV^nK~XN8@XPPoX<+m~J#~^y zC&){s@)@EFWJ?v9crfI62kF$4UD^6Aard%|NB5VKiwu-w;VC`|a?($qQCYD&I$1`& z+Guw*y+Nb6Zh^GIf}*j5^5a<)qDo0|nsd5p1n6S*cBL%)$QR<&ubwU2B#t6fE$4bL zLz!GIPLO|Jm@*n?Qq?q%59_s@GjwA))LL28!%!hTz;~o#biOmA)qDq~;U3}*DOC0% zSaJa1ASR=!7@DJ86PA++TF2x0202s(A5J9TnX!Dk(mw(rB1g`rsEW1#dF+SR^04wM zHOV7MI{L38Zw2;i`d>$olX&WJOH#Ky(m_92A#F!Mg67M^DY{JF(n*W$NPkoye; zwk1zfX_`8nZq%&e(+NlG8-dccPm#zWD@}HX=<+jz(w;ZnKE}#kgldR{+?>EmkL+we z9jsBABUFz6Fs#CE`x%IN*#G%Fd|sHGzH!Qjpsqdy@lg`w-}}3=yS}X^E0xZ(b7Etg vDz1Z8?zGxaST|MxyQ1h4V@xHDHKW~`;f95rZ*lVwMi04onY%}hMX2jf8H+(< delta 3645 zcmb`JZE%#;702({JkPVc*^q3KO<2}#vWdKg1d)G%JDuAq&R}S<({?N**7%`iHcW&-O-n6y`ax_ItJ4ml(TS95n(hDWp2dXX zjCH&-XYaYcz4zRgbDwi=eAJ3xwvMz|j(_akd!D$Y+pO0-`AVrIiavNEqN^>BPIxT6 z*>2SRR;7;mEq&Q;bPCbQ$$I!nFb-CzMQBQ+Rhs+SheY$_*w7bj&FXfo( zdF1I{?EQ`7de5hG{mWsxA?8&?O6`OE9Kx0deoy)Nk!5!;xfrc`vEq z`nQEQb`&4}WJ~5u2{}4Z95urpnyEJqg?JYzA+iDR(I7zWWc^Y(~2$*Bh6Q%6ZC??nJPi>^$(I%-Wpm(aIscCA89B4b`9d z6Zy3giUj zB%~j53UV6qJIJdpJ!j8JAG9Py;jp@%`YDA@Q-8~8_MB4fQ{aeCil)+KUHeYnuJeZK zyWU(k?oOC}wN$KU{cX+E1@w@@o|DNImrB{d@FN>1+SFxMK%YEUuMfVn?th)&*nHX> z^tKDDXTp8zGh56X`q4yd#d`aN|6@gk=f{tamg7o{Rpeq;p# zr1(2>ORXcr3$4`ETRXg1_Ya@l-&(B?yuV)e4OZn&oGs<`iD!H;n{xHQ`FmsP76}m> zQS-G~3Tg4Yf?t*j$oOymf>$Y)f~z=?nhd#`zl{6M!X;xzsoiLGrsfSQ^`cCCGvKdf zF$quCNIXl&F9k7HuL(}?PW&s8WzN)5Hf8^CJKdw>?}a-@U1qeD`pk1p(M266!M#L-oIN$)=&GDqqtXrc}ku>A#W z(77Rft`DLgmxmyH&KzYQ7X8~&^Q^3Mc@DzvRXuMx)Jt8LS7wSrVD2aF0P)FU)p58plBKuY>Bs&uo&4{1Q;#x~&?-|LbJ6zqn>Wp_~J-p_=c74~(o*M$wCj`5Bokc$FGq$9sMJ{0z`uqv=oVFmJe zwu2SQ=Q&pxpG=Lg6~Y#QT_dK%5LECF%2w&f`Zi%Zh1G%W687Y{etU#HC9DJe_6mDW z*lw_NP`Or2!TBeo`%~b)PE7ihr&9SH-s&Qeool?!tMn7 zK-fpj*#GPT8UDwh0skx= z-xS6t@iz1ssNWIx4d{QBet#Fn>F6KAE(_y?^>1NrJb>61Kd3#Tm!d}6!*G;h^+Y&LFAxWBL_tICq+GC3(zfkeWCO zFJOZqGd!OnCW?2a@e@K`NjmbTg4e~zBbavCB>IZkQG!h4FTtQp3d+%&+9FiL5whNl zSz?{$m{mUX�__{?A_4UQZ6MP)pGjHWZ5THBMXqP{FgH32neLcK2!QF<*1idp5R zxx6rIVy;Uk&z=#7-li`;JNw5RGIQsWH+`xpurx>k+lK`<>fVYarg9RJu@y|` z;q=;&1mT3Qjmv+MRt~4n6lpSO4p!kOl_4`(GeBiLZk`@qK0g>DRlIahW`SJMH$cl diff --git a/dll/syslibs.cpp b/dll/syslibs.cpp index 4853ec9..37354db 100644 --- a/dll/syslibs.cpp +++ b/dll/syslibs.cpp @@ -2566,6 +2566,12 @@ DWORD WINAPI extSleepEx(DWORD dwMilliseconds, BOOL bAlertable) return (*pSleepEx)(dwNewDelay, bAlertable); } +DWORD WINAPI exttimeGetTime(void) +{ + OutTrace("timeGetTime\n"); + return dxw.GetTickCount(); +} + int WINAPI extShowCursor(BOOL bShow) { static int iFakeCounter; diff --git a/dll/syslibs.h b/dll/syslibs.h index c178e0b..a922808 100644 --- a/dll/syslibs.h +++ b/dll/syslibs.h @@ -93,6 +93,9 @@ typedef BOOL (WINAPI *SetWindowPos_Type)(HWND, HWND, int, int, int, int, UINT); typedef int (WINAPI *ShowCursor_Type)(BOOL); typedef BOOL (WINAPI *ShowWindow_Type)(HWND, int); +// Winmm.dll: +typedef DWORD (WINAPI *timeGetTime_Type)(void); + /* =================================================================== hooked APIs real pointers ====================================================================*/ @@ -189,6 +192,9 @@ DXWEXTERN SetWindowPos_Type pSetWindowPos DXWINITIALIZED; DXWEXTERN ShowCursor_Type pShowCursor DXWINITIALIZED; DXWEXTERN ShowWindow_Type pShowWindow DXWINITIALIZED; +// Winmm.dll: +DXWEXTERN timeGetTime_Type ptimeGetTime DXWINITIALIZED; + /* =================================================================== hook procedures (possibly more tnan one per each API...) ====================================================================*/ @@ -282,4 +288,7 @@ extern BOOL WINAPI extSetWindowPos(HWND, HWND, int, int, int, int, UINT); extern int WINAPI extShowCursor(BOOL); extern BOOL WINAPI extShowWindow(HWND, int); +// Winmm.dll: +extern DWORD WINAPI exttimeGetTime(void); + /* eof */ \ No newline at end of file diff --git a/host/Resource.h b/host/Resource.h index b371b00..5a7b00c 100644 --- a/host/Resource.h +++ b/host/Resource.h @@ -148,6 +148,10 @@ #define ID_DXAPP_EXIT 32810 #define ID_SAVEFILE 32810 #define ID_VIEW_TIMESLIDER 32811 +#define ID_DXWND_VI 32812 +#define ID_VIEW_STATUS32813 32813 +#define ID_VIEW_TIMESLIDER32814 32814 +#define ID_VIEW_STATUS3 32815 // Next default values for new objects // @@ -155,7 +159,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_3D_CONTROLS 1 #define _APS_NEXT_RESOURCE_VALUE 151 -#define _APS_NEXT_COMMAND_VALUE 32812 +#define _APS_NEXT_COMMAND_VALUE 32816 #define _APS_NEXT_CONTROL_VALUE 1080 #define _APS_NEXT_SYMED_VALUE 101 #endif diff --git a/host/StatusDialog.cpp b/host/StatusDialog.cpp index 8ed0167..d505394 100644 --- a/host/StatusDialog.cpp +++ b/host/StatusDialog.cpp @@ -56,8 +56,7 @@ void CStatusDialog::OnTimer(UINT_PTR nIDEvent) GetDllVersion(DllVersion); DxWndStatus.Status=DxStatus; if(DxStatus==DXW_RUNNING){ - int idx; - char *sTSCaption[9]={"x16","x8","x4","x2","x1",":2",":4",":8",":16"}; + char *sTSCaption[17]={"x16","x12","x8","x6","x4","x3","x2","x1.5","x1",":1.5",":2",":3",":4",":6",":8",":12",":16"}; GetHookStatus(&DxWndStatus); Target=&pTargets[DxWndStatus.TaskIdx]; @@ -76,9 +75,8 @@ void CStatusDialog::OnTimer(UINT_PTR nIDEvent) strcat(sMsg, sMsgBuf); } if(Target->flags2 & TIMESTRETCH){ - idx=DxWndStatus.iTimeShift+4; - if(idx>=0 && idx<=8){ - sprintf(sMsgBuf, "\nTime speed: %s", sTSCaption[DxWndStatus.iTimeShift+4]); + if(DxWndStatus.iTimeShift>=-8 && DxWndStatus.iTimeShift<=8){ + sprintf(sMsgBuf, "\nTime speed: %s", sTSCaption[DxWndStatus.iTimeShift+8]); strcat(sMsg, sMsgBuf); } } diff --git a/host/TimeSliderDlg.cpp b/host/TimeSliderDlg.cpp index d489502..c420dcb 100644 --- a/host/TimeSliderDlg.cpp +++ b/host/TimeSliderDlg.cpp @@ -12,7 +12,6 @@ IMPLEMENT_DYNAMIC(CTimeSliderDialog, CDialog) CTimeSliderDialog::CTimeSliderDialog(CWnd* pParent /*=NULL*/) : CDialog(CTimeSliderDialog::IDD, pParent) { - //m_TimeSlider.SetRange(-4, +4, TRUE); } CTimeSliderDialog::~CTimeSliderDialog() @@ -41,7 +40,7 @@ void CTimeSliderDialog::OnTimer(UINT_PTR nIDEvent) DXWNDSTATUS Status; CSliderCtrl *Slider; CStatic *Text; - char *sTSCaption[9]={"x16","x8","x4","x2","x1",":2",":4",":8",":16"}; + char *sTSCaption[17]={"x16","x12","x8","x6","x4","x3","x2","x1.5","x1",":1.5",":2",":3",":4",":6",":8",":12",":16"}; char sMsg[81]; static int iLastPos=-1; @@ -62,13 +61,13 @@ void CTimeSliderDialog::OnTimer(UINT_PTR nIDEvent) } else { // slider position changed, set the new value - if (i_TimeSlider < -4) i_TimeSlider=-4; - if (i_TimeSlider > 4) i_TimeSlider=4; + if (i_TimeSlider < -8) i_TimeSlider=-8; + if (i_TimeSlider > 8) i_TimeSlider= 8; Status.iTimeShift=i_TimeSlider; SetHookStatus(&Status); } iLastPos = i_TimeSlider; - sprintf(sMsg, "Time speed: %s", sTSCaption[i_TimeSlider+4]); + sprintf(sMsg, "Time speed: %s", sTSCaption[i_TimeSlider+8]); Text->SetWindowTextA(sMsg); } @@ -80,7 +79,7 @@ BOOL CTimeSliderDialog::OnInitDialog() GetHookStatus(&Status); Slider=(CSliderCtrl *)this->GetDlgItem(IDC_TIMESLIDER); - Slider->SetRange(-4, +4, 0); + Slider->SetRange(-8, +8, 0); Slider->SetTicFreq(1); Slider->SetPos(Status.iTimeShift); SetTimer(IDTIMER, 1000, NULL); diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index 5cbe54c828d832a15a28f8d832a0bf7042d84516..359278852ddf9b17beecabf9bb93465b8b936250 100644 GIT binary patch delta 4707 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 Z%5?`Tc(1@OEBGK`&aNuP@4bPQ{U5@|B4hvn diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc index cb07e96..8f415f6 100644 --- a/host/dxwndhost.rc +++ b/host/dxwndhost.rc @@ -146,6 +146,11 @@ BEGIN MENUITEM "Start", ID_HOOK_START MENUITEM "Stop", ID_HOOK_STOP END + POPUP "View ..." + BEGIN + MENUITEM "Status", ID_VIEW_STATUS + MENUITEM "Time Slider", ID_VIEW_TIMESLIDER + END MENUITEM "e&Xit", ID_DXAPP_EXIT END END diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index e87fc66156b27c3b5d23b1d225a81c283c0df62e..7ce95c6bc97e4d404da0976ffff3b48bfbb6189b 100644 GIT binary patch delta 2086 zcma)7T}+!*7(SF>(|Dm5(=1Kq->A>|`W1^Yac}eVob$Zz zdCz;^_nh-ZE*T=13=7{GtSyYOr+^M%IgvbO>0Vtf&G+VLtluKhZ}QvrZJe)jLZ=*Ny0yu7vBb}*thk2G)*7j?vhRbK(?pTVT@-VcAvfV*3ooVH{pEB&KZllT zB|2Dx47;=F>wclX;NF0dk-O+jWjQT?e{0M^bM8-R$-RdBReo7UG$XX=EY&l8r>5}9 zadr?t#>#;0D>|?IBF5{97niFGRc8(KPGt=(*_~?0b61jzk!*Ei!@E`*tX-gZjfK9i z3el~;o;Qy~o%wc9eNoBMxUL^Wi_hx>z-9Vl5aqpjQv3TjQFc?SQ4=I#?Ze4{K&Uuxvr= zf%Pj|Sh*}J{YN--r+0yFG>5oJoec$Kg;&9PQ+kor_|T0^*T2GM%%FKq{}a2gM@L(w zE^LoYs1YtEskMI+H`IUT0hVMbn09HZ8y*ZY}L75 zw0(Mi`Aqnm=-6xjByu*H$T}n~fMhfx8D6BO8mS8)RozgL9YRp zKFk#QCd}(hOXTJMt*e$8s*tjAGE>F%(%Sx=u4y@v@mQy#Vr60;;n32Ni4iYjx$JQq ztki}6nh4lz7*+ynfz%tJjny5yelp-Dy-Km&5x)AC7%8&HrRB0njqNdJa6|g3p!oj7 znG$^?LA|gK#>CZRv}LkLs`+!CXsOO>MrJg1 z1KLb>aT2R~B$-Z54)%=bs%*5+1HxoX=fp+c0SI{k5Gxb{6M&EdfH-1U&fM=>d0UF3 zQvte`?V-a{1JosZ)%a8vr&!1?J$vSmO$0QX3aAYpGKDLMh(N3$9&_= z0z&M7;Di(>8|FeQIPpH0>)bY-6Ca9Ro!gn@)-eY<&* zPpqNiCBu0`um{7;z%U?=>UMgx-$x~571T2RAp!~qo9O7oh>^LW?1BG9d#--*Pv<+d pLOIyesQ)2K6cv-x?ks^J7%Q6rNe{E_NNoi~r)9#cWcyByoaWCp}Q2XmPD7acF4DZ&iZ~aSMr*f~*2b zC15EgR6?mLe^NmlXq6x#fq>BM302gnNI+-L9gRYGYnicwz{)mhE9 ze0df5N=B`d3lwx}yD3s`L}r|mh1QnVhh6?;IQaX`>rG*wBim~vcapg6J4rvl?60&h zIWOA_!2(yAs6B*VhC=vkJSZx)8=*?82qPWDiD;I0_FEkyCpxQ>^N0#2kg zT-=Uqv?6x<={j z$;>rb7DU;-JKhTuDRJmqa=5gojN0HNek>fLm@$<4dwf$ANvtVgVv5W7bz<&B%J%IHlEVr4gqan5E&cAVe&Ka*7tk!tqj) zH}PpH{RM4m&%W7)EP+t@(ZJ9!O$)nKu4qf6_>4(T=gtfD>PKx%44i&zf5*lfw}3F( zK=eZ^sO0)&B+IhwRVPY_JtcpB8@$>fbF;9!$64rp63yO!=r;+u=SFMK?^MK07I9(b z4LZ{4R5Zo#!_zxp%_iHZt9E_X>*1OkI5g&tcocRDONYB4&FV;YYY~|O2tq<63JGJo z##$r_G<(m!z$MheNi0q8bK~T1;pB8stK_``9S7X?zrm5p!>VKHaF<{=Djl3sI`d*+ zn;iJxtQ;iBTPOW(@WkweaU