From 464e1d8c316a386472f0ddb23275a3256ea492d0 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Sat, 9 Oct 2021 23:05:56 +0200 Subject: [PATCH 1/3] Implemented Notification system --- P3D/Content/Localization/Tokens_en.dat | 9 + .../Textures/Notifications/Backgrounds.png | Bin 0 -> 1780 bytes P3D/Content/Textures/Notifications/Boxes.png | Bin 0 -> 640 bytes P3D/Overworld/NotificationPopup.vb | 176 ++++++++++++++++++ P3D/Overworld/OverworldScreen.vb | 48 ++++- P3D/P3D.vbproj | 12 +- .../ActionScript/V2/ScriptCommands/DoText.vb | 26 +++ P3D/World/Level.vb | 9 + 8 files changed, 269 insertions(+), 11 deletions(-) create mode 100644 P3D/Content/Textures/Notifications/Backgrounds.png create mode 100644 P3D/Content/Textures/Notifications/Boxes.png create mode 100644 P3D/Overworld/NotificationPopup.vb diff --git a/P3D/Content/Localization/Tokens_en.dat b/P3D/Content/Localization/Tokens_en.dat index 443a15c48..013b0e9d5 100644 --- a/P3D/Content/Localization/Tokens_en.dat +++ b/P3D/Content/Localization/Tokens_en.dat @@ -90,6 +90,15 @@ Special_Attack,Special Attack Special_Defense,Special Defense Speed,Speed --- +GameInteractions: +game_interaction_interact,Interact +game_interaction_gamemenu,Game Menu +game_interaction_pokegear,Pokégear +game_interaction_pausemenu,Pause Menu +game_interaction_notification,Notification +game_notification_respond,Press to respond to the notification. +game_notification_dismiss,Press to dismiss the notification. +--- MainMenuScreen: main_menu_continue,Continue main_menu_load_game,Load Game diff --git a/P3D/Content/Textures/Notifications/Backgrounds.png b/P3D/Content/Textures/Notifications/Backgrounds.png new file mode 100644 index 0000000000000000000000000000000000000000..eaf06854b2d77ba5ac000d23f83a3abe14597e17 GIT binary patch literal 1780 zcmcIh`8ON*7XKzh>@VSY#*gy~Sv zQk2dVMNKWSwYn2!sC}uSwI-O%5A!F?J?C>j_ug|qpL5T-EC;)bGLqj*0sv%4M8YK@ zvxV>$7Zc`;EDh9W7)OED1Rz*$3jlpTdu=CT; zqMNT>k6Z}axtZwIzR|1~l708l%aqM#o(9v4N5$+Jsz!%xDzIc7|tSh z?GJMUF@kRO@X=U%HN^@4&pmGjjwkxxydNjs@#h|M{N2Xc{Z;&XFUq4;L)7HtJSt1@ zbz&Zpd9m^7`)p3e{%o;suxQ8u9I&#r8+(`!H#eEeiGpEt=G3BW#+*;Tuqd077+E0g z>nNv&O{Tl^NkqJn8uLDFB9;&_3@ho(o!>byJ7O#JM>=k`&N_r@U#-kptgFnK(Xqp4 zxOM%I{tN1qTJ9|@#j>PLEE>f!aPU*lOR-NVNc|dvAQh(e8V8))n?Xkm$0YI*w+a~q zBoY;W1c@BsZIfF1ld5>v7kdv^o}T$B)Z--0)uDGR#HF(-f71D~ zbErLxcqw40>16G_R0S7Gvv)XZxv{GPzqT0b;i$1LSbP2JqlL2Z($e%_)+Q5-wQAlK ziuB?7#!Vh9A^QlXf#KSf?H;J*o~)~1R^&a88)ligxCB*O2`=Z0zqgXM-Yp*?x4$xa z*O{4prVm~IVw2NNzjDQCnV>U_B$cjV8;%V4dj) zX?}-k6mDFfY0>x5jZp%uV{b6Ba%m^!|DWYEEjIbIkD1}4GD~iX5a)uF;0T2pZeXus z2Jr#crT(RRZncpdHS(k6%2)L3@<5u6mvSkg$;^&>zq{9wBymb|zbeP3ap^-Tbg(5S z^jy}r{RDG<`fYCN-oBab33>VK$GQzU>)~)Z^u*S)m5G|ppLZ8B`nLJ;OOcq-;+x&c zm=f8|Skrq${v=euv5y*yK2h?+F?Ro5_P#&ZxHhh5;vMi*eniiiAWS&*-{-zA*@E0%J13>MU<8D-YQ^qVhJKm?12HbON^^JM1%;_S#rRPVu zE@wofKwbyC#Fwi+?wC>y@@wlW>U*+WA=82%4T~LrR@8;*y`>2ZDW|J?A=5qNHdqYz%LVz$x LmUe_XoOkkHUzZS$ literal 0 HcmV?d00001 diff --git a/P3D/Content/Textures/Notifications/Boxes.png b/P3D/Content/Textures/Notifications/Boxes.png new file mode 100644 index 0000000000000000000000000000000000000000..82a4639dea937e267825e7d906c8579e6a4b1f2c GIT binary patch literal 640 zcmeAS@N?(olHy`uVBq!ia0vp^2|(trD;1#J|k}2fb!}TrFhuYf-~ez`FB68JNx2KIfHGD;Kob!T?^Xvzg|;|e``OxUV7h&t19*N*8AONFhuaiE4MJL zXitXxXZsm8oMBgBnV?XAy>7?n zXZ%3#BY*~r1Fw3d9YO%enjr3QSI5xi|KDZ&46aOH>@zlc<-5MP)^zr#{MznF23wWY zOY_e8vn^;(nf8CjOZ(aT<>&sd;M=b9>TLLjpO>qQt^Suzu-8o6$)X+76BT85^~jl@ zQ;LoC85lH@Wp{;Ma+JBgpQ%Br&VIs`ncelm@7O0k=CUZ!w*M(nwKK-2dG#u;I-Wby z@e?1{)fqBW{Rj=6+4Aad@gG&I>*w|P4rKk1Qe?RxQE#7k$4^h}z$$rp?g^{r$E!3v zt!GYV2>SM!5ydZ9I1Nh}&Ry&}0doJ=E583%)cxBXZv3mxsqp9;k%y{ZKX)^E7_zMD o)MuEsqf6_#o}}Ve(Fb#i|Eq7(du#StfEi?>r>mdKI;Vst0NynEa{vGU literal 0 HcmV?d00001 diff --git a/P3D/Overworld/NotificationPopup.vb b/P3D/Overworld/NotificationPopup.vb new file mode 100644 index 000000000..889cad02b --- /dev/null +++ b/P3D/Overworld/NotificationPopup.vb @@ -0,0 +1,176 @@ +''' +''' The notification popup. +''' +Public Class NotificationPopup + + Private _background As Texture2D + Private _box As Texture2D + Private _icon As Texture2D + Private FrameSizeBack As Integer + Private FramesizeBox As Integer + Private FramesizeIcon As Integer + Private _positionY As Single = -12 + Private _delay As Date + Private _soundEffect As String = "" + Private _text As String = "" + Private _size As Size = New Size(10, 3) + Private _backgroundIndex As Vector2 = New Vector2(0, 0) + Private _iconIndex As Vector2 = New Vector2(0, 0) + + Public _waitForInput As Boolean = False + Public _scriptFile As String = "" + + Public _show As Boolean = False + + ''' + ''' Sets the values of the NotificationPopup and displays it on the screen. + ''' + Public Sub Setup(Text As String, Optional Delay As Integer = 500, Optional BackgroundIndex As Integer = 0, Optional IconIndex As Integer = 0, Optional SoundEffect As String = "", Optional ScriptFile As String = "") + _text = Text + + If Delay <= 0 Then + _waitForInput = True + _delay = Date.Now + Else + _delay = Date.Now.AddMilliseconds(CDbl(Delay * 10)) + End If + + _backgroundIndex = New Vector2(BackgroundIndex, 0) + While _backgroundIndex.X >= 3 + _backgroundIndex.X -= 3 + _backgroundIndex.Y += 1 + End While + If _backgroundIndex.X < 0 Then + _backgroundIndex.X = 0 + End If + FrameSizeBack = CInt(TextureManager.GetTexture(GameModeManager.ActiveGameMode.ContentPath & "Textures\Notifications\Backgrounds").Width / 3) + _background = TextureManager.GetTexture(GameModeManager.ActiveGameMode.ContentPath & "Textures\Notifications\Backgrounds", New Rectangle(CInt(_backgroundIndex.X * FrameSizeBack), CInt(_backgroundIndex.Y * FrameSizeBack), FrameSizeBack, FrameSizeBack)) + + _positionY = CInt(0 - _size.Height * (FrameSizeBack / 3) - 12) + + FramesizeBox = CInt(TextureManager.GetTexture(GameModeManager.ActiveGameMode.ContentPath & "Textures\Notifications\Boxes").Width / 3) + _box = TextureManager.GetTexture(GameModeManager.ActiveGameMode.ContentPath & "Textures\Notifications\Backgrounds", New Rectangle(CInt(_backgroundIndex.X * FramesizeBox), CInt(_backgroundIndex.Y * FramesizeBox), FramesizeBox, FramesizeBox)) + + FramesizeIcon = CInt(TextureManager.GetTexture(GameModeManager.ActiveGameMode.ContentPath & "Textures\Notifications\Icons").Width / 3) + _iconIndex = New Vector2(IconIndex, 0) + While _iconIndex.X >= 3 + _iconIndex.X -= 3 + _iconIndex.Y += 1 + End While + If _iconIndex.X < 0 Then + _iconIndex.X = 0 + End If + _icon = TextureManager.GetTexture(GameModeManager.ActiveGameMode.ContentPath & "Textures\Notifications\Icons", New Rectangle(CInt(_iconIndex.X * FramesizeIcon), CInt(_iconIndex.Y * FramesizeIcon), FramesizeIcon, FramesizeIcon)) + + _scriptFile = ScriptFile + + If Me._scriptFile <> "" Then + Me._text &= "~[" & Localization.GetString("game_notification_respond") & "]" + Else + Me._text &= "~[" & Localization.GetString("game_notification_dismiss") & "]" + End If + + _soundEffect = SoundEffect + _show = True + End Sub + + ''' + ''' Execute the specified script + ''' + Public Sub Accept() + CType(Core.CurrentScreen, OverworldScreen).ActionScript.StartScript(_scriptFile, 0, False) + Me._waitForInput = False + Me._delay = Date.Now + End Sub + + ''' + ''' Dismiss the Popup + ''' + Public Sub Dismiss() + Me._waitForInput = False + Me._delay = Date.Now + End Sub + + ''' + ''' Update the NotificationPopup. + ''' + Public Sub Update() + If Date.Now < Me._delay Then + If Me._positionY < 5.0F Then + Me._positionY += CInt(0.7 * (FrameSizeBack / _size.Height)) + Else + If _soundEffect IsNot "" Then + SoundManager.PlaySound("Notifications\" & _soundEffect) + _soundEffect = "" + End If + End If + Else + If _waitForInput = False Then + Dim BackY As Integer = CInt(0 - _size.Height * FrameSizeBack - 12) + If Me._positionY > BackY Then + Me._positionY -= CInt(0.7 * (FrameSizeBack / _size.Height)) + If Me._positionY <= BackY Then + Me._positionY = BackY + Me._show = False + End If + End If + Else + If Me._scriptFile <> "" Then + CType(Core.CurrentScreen, OverworldScreen).ActionScript.StartScript(Me._scriptFile, 0, False) + Me._waitForInput = False + End If + End If + End If + End Sub + + ''' + ''' Renders the NotificationPopup. + ''' + Public Sub Draw() + If Me._show = True Then + Dim TextBody As String = "" + Dim TextHeader As String + Dim Scale As Double = SpriteBatch.InterfaceScale() * 2 + + If _text.Contains("*") Then + TextHeader = _text.GetSplit(0, "*").Replace(CChar("~"), Environment.NewLine) + TextBody = _text.GetSplit(1, "*").Replace(CChar("~"), Environment.NewLine) + Else + TextHeader = _text.Replace(CChar("~"), Environment.NewLine) + End If + + While FontManager.InGameFont.MeasureString(_text.Replace(CChar("~"), Environment.NewLine)).Y > CInt(_size.Height * FrameSizeBack - 2 * FrameSizeBack) + _size.Height += 1 + End While + + Dim BackGroundOffsetX As Integer = CInt(Core.windowSize.Width - _size.Width * FrameSizeBack - 5) + Dim TextOffset As Integer + + 'Draw the frame. + Canvas.DrawImageBorder(_background, CInt(Scale), New Rectangle(BackGroundOffsetX, CInt(Me._positionY), CInt(_size.Width * FrameSizeBack), CInt(_size.Height * FrameSizeBack)), True) + + 'Draw the (icon) box. + Core.SpriteBatch.DrawInterface(_box, New Rectangle(CInt(FramesizeBox * Scale + 5), CInt(FramesizeBox * Scale + Me._positionY), CInt(_box.Width * Scale), CInt(_box.Height * Scale)), Color.White) + + 'Draw the icon. + Core.SpriteBatch.DrawInterface(_icon, New Rectangle(CInt(FramesizeIcon * Scale + 5), CInt(FramesizeIcon * Scale + Me._positionY), CInt(_icon.Width * Scale), CInt(_icon.Height * Scale)), Color.White) + + TextOffset = CInt(FrameSizeBack * Scale + BackGroundOffsetX * Scale) + + If TextBody <> "" Then + If TextHeader <> "" Then + 'Draw the header, then the body + Core.SpriteBatch.DrawInterfaceString(FontManager.InGameFont, TextBody.CropStringToWidth(FontManager.InGameFont, CInt(Scale), CInt(_size.Width * FrameSizeBack - FrameSizeBack * 4)), New Vector2(TextOffset, CInt(Me._positionY + FrameSizeBack)), Color.Black) + Core.SpriteBatch.DrawInterfaceString(FontManager.InGameFont, TextHeader.CropStringToWidth(FontManager.InGameFont, CInt(Scale / 2), CInt(_size.Width * FrameSizeBack - FrameSizeBack * 4)), New Vector2(TextOffset, CInt(Me._positionY + FrameSizeBack + FontManager.InGameFont.MeasureString(TextHeader).Y)), Color.Black) + Else + 'Just draw the body + Core.SpriteBatch.DrawInterfaceString(FontManager.InGameFont, TextBody.CropStringToWidth(FontManager.InGameFont, CInt(Scale / 2), CInt(_size.Width * FrameSizeBack - FrameSizeBack * 4)), New Vector2(TextOffset, CInt(Me._positionY + FrameSizeBack)), Color.Black) + End If + Else + 'Just draw the header + Core.SpriteBatch.DrawInterfaceString(FontManager.InGameFont, TextHeader.CropStringToWidth(FontManager.InGameFont, CInt(Scale), CInt(_size.Width * FrameSizeBack) - FrameSizeBack * 4), New Vector2(TextOffset, CInt(Me._positionY + FrameSizeBack)), Color.Black) + End If + End If + End Sub + +End Class \ No newline at end of file diff --git a/P3D/Overworld/OverworldScreen.vb b/P3D/Overworld/OverworldScreen.vb index 191cee38e..931ac8a86 100644 --- a/P3D/Overworld/OverworldScreen.vb +++ b/P3D/Overworld/OverworldScreen.vb @@ -12,6 +12,7 @@ Public Class OverworldScreen Private Shared _fadeColor As Color = Color.Black 'Fade screen color. Private Shared _fadeValue As Integer = 0 'Fade progress value for the screen fade. Private Shared _drawRodID As Integer = -1 'The rod ID to display on the screen during the fishing animation. + Public NotificationPopupList As List(Of NotificationPopup) = Nothing Private _actionScript As ActionScript 'Private ActionScript instance. Private _particlesTexture As Texture2D 'A texture field to contain the particles texture, currently only used for the crosshair. @@ -188,6 +189,16 @@ Public Class OverworldScreen PokemonImageView.Update() End If + If Level.NotificationPopup IsNot Nothing Then + Level.NotificationPopup.Update() + If Level.NotificationPopup._show = False Then + Level.NotificationPopup = Nothing + End If + ElseIf NotificationPopupList.Count > 0 Then + Level.NotificationPopup = NotificationPopupList(0) + NotificationPopupList.RemoveAt(0) + End If + 'Middle click/Thumbstick press: Show first Pokémon in party. If ActionScript.IsReady = True Then If MouseHandler.ButtonPressed(MouseHandler.MouseButtons.MiddleButton) = True Or ControllerHandler.ButtonPressed(Buttons.LeftStick) = True Then @@ -217,7 +228,6 @@ Public Class OverworldScreen If KeyBoardHandler.KeyPressed(KeyBindings.OpenInventoryKey) = True Or ControllerHandler.ButtonPressed(Buttons.X) = True Then If Screen.Camera.IsMoving() = False And ActionScript.IsReady = True Then Level.RouteSign.Hide() - SoundManager.PlaySound("menu_open") Core.SetScreen(New NewMenuScreen(Me)) End If @@ -225,13 +235,20 @@ Public Class OverworldScreen 'Open the PokégearScreen: If KeyBoardHandler.KeyPressed(KeyBindings.SpecialKey) = True Or ControllerHandler.ButtonPressed(Buttons.Y) = True Then - If Core.Player.HasPokegear = True Or GameController.IS_DEBUG_ACTIVE = True Or Core.Player.SandBoxMode = True Then - If Screen.Camera.IsMoving() = False And ActionScript.IsReady = True Then - Core.SetScreen(New GameJolt.PokegearScreen(Me, GameJolt.PokegearScreen.EntryModes.MainMenu, {})) + If Level.NotificationPopup Is Nothing Then + If Core.Player.HasPokegear = True Or GameController.IS_DEBUG_ACTIVE = True Or Core.Player.SandBoxMode = True Then + If Screen.Camera.IsMoving() = False And ActionScript.IsReady = True Then + Core.SetScreen(New GameJolt.PokegearScreen(Me, GameJolt.PokegearScreen.EntryModes.MainMenu, {})) + End If + End If + Else + If Level.NotificationPopup._scriptFile <> "" Then + Level.NotificationPopup.Accept() + Else + Level.NotificationPopup.Dismiss() End If End If End If - ActionScript.Update() 'Update the action script. Else 'Dialogues are showing: 'Update some parts of the camera: @@ -342,17 +359,28 @@ Public Class OverworldScreen Level.RouteSign.Draw() + If Level.NotificationPopup IsNot Nothing Then + Level.NotificationPopup.Draw() + End If + 'If the XBOX render control delay is 0, render the controls. If ShowControlsDelay = 0.0F Then Dim d As New Dictionary(Of Buttons, String) - d.Add(Buttons.A, "Interact") - d.Add(Buttons.X, "Menu") - If Core.Player.HasPokegear = True Then - d.Add(Buttons.Y, "Pokégear") + If Level.NotificationPopup IsNot Nothing Then + If Level.NotificationPopup._scriptFile <> "" Then + d.Add(Buttons.A, Localization.GetString("game_interaction_notification", "Notification")) + Else + End If + Else + d.Add(Buttons.A, Localization.GetString("game_interaction_interact", "Interact")) End If - d.Add(Buttons.Start, "Game Menu") + d.Add(Buttons.X, Localization.GetString("game_interaction_gamemenu", "Game Menu")) + If Core.Player.HasPokegear = True Then + d.Add(Buttons.Y, Localization.GetString("game_interaction_pokegear", "Pokégear")) + End If + d.Add(Buttons.Start, Localization.GetString("game_interaction_pausemenu", "Game Menu")) DrawGamePadControls(d) End If diff --git a/P3D/P3D.vbproj b/P3D/P3D.vbproj index e34511bab..93c73bafe 100644 --- a/P3D/P3D.vbproj +++ b/P3D/P3D.vbproj @@ -15325,6 +15325,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -15577,6 +15580,12 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + PreserveNewest @@ -27523,6 +27532,8 @@ + + @@ -29322,7 +29333,6 @@ - diff --git a/P3D/World/ActionScript/V2/ScriptCommands/DoText.vb b/P3D/World/ActionScript/V2/ScriptCommands/DoText.vb index 13c82802a..e7823b0a5 100644 --- a/P3D/World/ActionScript/V2/ScriptCommands/DoText.vb +++ b/P3D/World/ActionScript/V2/ScriptCommands/DoText.vb @@ -11,6 +11,32 @@ Dim argument As String = ScriptComparer.GetSubClassArgumentPair(subClass).Argument Select Case command.ToLower() + Case "notification" + Dim _NotificationPopup As New NotificationPopup + Dim args As String() = argument.Split(CChar(",")) + Select Case args.Length + Case 1 + _NotificationPopup.Setup(args(0)) + Case 2 + _NotificationPopup.Setup(args(0), CInt(args(1))) + Case 3 + _NotificationPopup.Setup(args(0), CInt(args(1)), CInt(args(2))) + Case 4 + _NotificationPopup.Setup(args(0), CInt(args(1)), CInt(args(2)), CInt(args(3))) + Case 5 + _NotificationPopup.Setup(args(0), CInt(args(1)), CInt(args(2)), CInt(args(3)), args(4)) + Case 6, 7 + _NotificationPopup.Setup(args(0), CInt(args(1)), CInt(args(2)), CInt(args(3)), args(4), args(5)) + End Select + If args.Length = 7 AndAlso CBool(args(6)) = True Then + CType(CurrentScreen, OverworldScreen).NotificationPopupList.Insert(0, _NotificationPopup) + If Screen.Level.NotificationPopup IsNot Nothing Then + CType(CurrentScreen, OverworldScreen).NotificationPopupList.Insert(1, Screen.Level.NotificationPopup) + Screen.Level.NotificationPopup = Nothing + Else + CType(CurrentScreen, OverworldScreen).NotificationPopupList.Add(_NotificationPopup) + End If + End If Case "show" Screen.TextBox.reDelay = 0.0F Screen.TextBox.Show(argument, {}, False, False) diff --git a/P3D/World/Level.vb b/P3D/World/Level.vb index 75163c553..a7dee98b6 100644 --- a/P3D/World/Level.vb +++ b/P3D/World/Level.vb @@ -7,6 +7,7 @@ Public Class Level #Region "Fields" Private _routeSign As RouteSign = Nothing + Private _notificationPopup As NotificationPopup = Nothing Private _world As World = Nothing Private _pokemonEncounter As PokemonEncounter = Nothing @@ -98,6 +99,14 @@ Public Class Level Return Me._routeSign End Get End Property + Public Property NotificationPopup() As NotificationPopup + Set(value As NotificationPopup) + Me._notificationPopup = value + End Set + Get + Return Me._notificationPopup + End Get + End Property ''' ''' Indicates whether the player is Surfing. From d3a010e05071c67b5f45e06de066b1e06f308333 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Sat, 9 Oct 2021 23:08:34 +0200 Subject: [PATCH 2/3] Added phone Notification Sound --- P3D/Content/Sounds/Notifications/Phone.wav | Bin 0 -> 77966 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 P3D/Content/Sounds/Notifications/Phone.wav diff --git a/P3D/Content/Sounds/Notifications/Phone.wav b/P3D/Content/Sounds/Notifications/Phone.wav new file mode 100644 index 0000000000000000000000000000000000000000..e3b454056c9fee5946d86f5742c7139002268093 GIT binary patch literal 77966 zcmXtA1z1$i*WSG|b8C~fyE_p@6kF`>?(XjH?rwi}cXunWY|)?~A|iq!f(U%?!1sT6 zcJJPpIrX0RoS9wi7SOu&s#;o2?`FMPjhZ;4lv$(EXf=YS<#~<9d_~Yujaf5d=!~Hh z&(znn)zr{5(lpn2YwBtIHH|fXIM&tF!m+NV4&Iw;Drl-|d^Alo4e?hCPxxzmacqWh zjq$3hsiJ9#JGJplQ%!Z8^ZT_iV;!6|)HKjk!&A+1tv-(akW(91>)_d@7}-G6Du3pB zxXY#2#=K2&-y84sA>9{q*T+2daIZdQsgL=6H7)Y**TvI~@oYUj$F-`D_j<6U7M|la zmBw>Ec)qqK08cf<=av{(N7DwMn&We${PVgv`r&#jNN$<`s*lgU(8?Fro8xKj7jJy# zb2Pw_Yu*HZbuhD^rh}$6j{Nz?n71BY+(&UPI0BpJ&+3g&9EDu#%8*h$U+?;m%j4PtvsJ{b z<#4?oo~(pt|0jv#k;~)Qtqp5@AfpLvUpIl?%mIL0`VInKD`y7=?K z7=Ek=JFDXTe+b|{){5tx>*bYUkVA0Otkq z<u?c)K+++8uYG-@qFG&cyEr+^?=pNxKrQ?Y5_X9u6!IvVl`M<6;D)v#Hx6TXDw$69U~8-LaE$8+>^)bVWM{KB#5n}5GXzK=N4>Oo3n z{Q2fz;a=n3;3N2}5@d4h_&{0%yf?wC2Ba5wn%l(j-V%3tUT_`xxXSpnTsw}~0=}yREo#6ERUn&VsWE)l7&>$Q=JQt1pNGrgC~B1N4W4D3Cu`$a z;FDVUy74I2g#I=2^Nq6^#~rtrql0r*UChZbS5RrVW<2u?)U?lf3_f$c&cr+dXDT0D1m^{HjpqQzE}x?o*n!(r2P1v(;+#?ib2P&r zx2YE9E#U2fyyy694BT<7a~77wdJ1RHKrM!^2PPW_~Y2&JX9S| z)`FdlAUgoZhPck_6W6IB=4t{x8stZuqwjxmc%5nkd3*-09nZBE_}m)Tc$dMwU!V)m z-p07c{a%1kF1sN#X#%Z$Ag2j*Xb4?-jC~=MSAK3;J6z$>fu5xeeJT$>ojtAcRbis_=y9NBj zW%K@tR~MciykiN#JFhjoCU69E^cCCWA;{T^wg|&USocTg=@& z-!`7byjLx#*Su!>Lngmg;8)IYJd2xQ1kZ8aJNe?A_X-8w504nHI~*6h?gilaj*!w8 zXKnK}E&Ko8Y^do9nVeC1)hl>$r1Kud2hsKc_PG8$7dTIIf7Ze~N3~x*YB*ZC-W~F# z`)fKusz1EOdm|n#K6fiT5deKTTXCBU@~Rnh>I8jw1~0Jx69X)>+27l3iyxnR}1LL^NX*m{17v~eyNSC1+||0t^lRH0&;dM zV2lD^afJF{HlFz$5xk$~^_i~{cz;{KN(D8ifMMETh8n0%&GCEz&Ug>ZYdeoNj~kc4 zKl2`fS3%CtJbwy&$#KCw);#|i&IARx;#tec*WqoA!iGIY>Fdieva^l7*iE@IO;h{3eevP z$7Z!yGH{U#X0D;Kx15}xFJDzBED!3w%=&Q-jM@*b_AJK^Xk=m&YN;A_^pu$lLX z|62`nUgl`=!K{2;!ZV1oC1-~M{r zyglyM#vMLmH%%YN@W%TfXi#1=N;6C2p^-KFG-ovv^48{6Q4cDs3sv>{RcMRXheDIR ztc50coh=mLb+}MHuNj40yoMA~z5EJ&^Q=-R+_Pw*7oI=7?s?WOliMqFCNB@qFYbGa7AkU6dszD_eni6H#8+Pj#piu4nROy-ke82V$3kYW-CiSc6ukC$ zb@LPpUGtpmRmAh2*8tBZUQr%Hyv&}8SC~gTFV*v(XOf4`E5YNl=W~x_&sQE!&r=>j zo<}_1;CRb(mWKnM7kl>hi157NQQ1@LVf2dd=;_hW{d%FPUS7JB>V&UxNpbOe6Gp{* zC0M?@{@CmK%H^xq4bPh%yWKl^Rq@n#es)jxeC?6#@ydO*XCIGXk7Mq&JhR;&daQNV zdd9hL@i^!n>=Euh+hdjcVUG*$9X-an@9|jeKEqFJ?l!k zoD+F1+CTe!_B*ftJny+=n16Z1xf8cSuBAN+yZ3dQ?z$P{N4Sl2)w}E5`ndIXjdXLm zwsITedd|(^TE}g;>teTCuI_FvU8lKibN%P)>be5Q3|Fn|S+`xT5w58&tKE*d9&ml` zvea#hYirjHE+KATT%(nB%Ho(^AN$1h_}n{sY3#7?mXyn8**p;URrhij8RhcO&E|U3 z^{Yz{w^6P~TyMDia@Dv_b6xH7*fq|j2acy*vs~)9u5;Pu8sk#fb%M)E*Ox8^*H$iz zUGKSMxm0l3=X&2I&83LTOxL3>UtB7>ly)8LQp9zr%UGAE=G|`hT+hX?NuV(;K7NV) z`{`xe-Os_&d1OM*)Ymr1TCTwb}Pn@hMhb2;F0-JI-F&SkmF zOY>b9oy!E5kLDvTT9=_NFU+f4zL@*F>@e?jd2R0Qvd_H2<)(SE%Mo)MmzCyaEE*;Fb;j2h<3-dX%r}>t-nRx@Q|A)`(&EHIi%~_^B=6KUd zbF%5OnVJ`v@0y;NRkPka-sJ8w!d$|%)7S&CD3ZH6w@J*Xk3O+uKFx@_6qA=cIVH+8 z*i;2_+M6$%YPifd_cXsUeK)r;*D)_N9XBVLRC5Q@Wb-vss;Qf)vH3q!f@zS+WIkmI z!%=TuZF**EWBO+rjblC2FH8dfsIMwK8IH^CA`X;S)*yo7eA4kVsca94mo)?{0!)>l>vVOb1sLNV&G2_-o`(Mb%t%m(#Azu)&7169UZYT_Qt1R=j`y= zKTrPZWezgA8ZPQR&1+4$hGmBBraWVL<3)oDY%gxyZn$hL#77#I7}E{JxXLifs2bx9 zI}M$T*#?VYp`oKO&T!Ar$1uzI+i=NH*RacIG%hn342O&+qn{x{f5=$IC>nO_{~FgD zU6pTgortSZN2AhXW`w6luKhgY%V~MLT-12laLd@pm}XdRxCyP33}X!QAmzECiJ^*d zzu~OG(;z{I6^62g2D(|H9DL z(8~~~UutkQY%&x#eA2JdXBk%*JwE?SXdeC{G9j`@%!8<6u|9cM^KKeD8Sfg}8QvNC z8x-Si!!bh-LH|_0Tz^pCR{umlMt?%zPX8LO%lZI3(-p_o`tf=b#w^m`(aqOwK`hkVIk}6X zKE)h~s1#i>{88kb_(=(ObZc}oV9!i_dHotgQNv1oZGC_tMn6O^>zQGjzLP#u_ZVlD z^%mVaeN%lk{b$`8eJg!2eVT5ezPjE^@6=7!m(f?zzrpq5`V#u*y6yUk`fS}b-5h;k zeTMFU&R?Ido2D`cyYZ=dBlUT&t^sd7tSP>MH9KbPseBb#3(Vy34vQ zx`F!dx=lKN-2}Z}-(6?W&BJ)JE<}Byo2+Y>HuvXddymkj(HmkDZI7G{GQG0)80#CC zsa@4ehNgzTIuBh@_1MQx;y&=uFcQ~T>Pb+^@d>OOd_mYS+8G?Xx0&n=nP+O7-z z6xAp;#dg>EI;B=>fFViWP}Qkj4e@$a_e_1GAE^(}eN#v3lXabSsVdPg)A{OR)mN~w zhAu_DfMYq`Uv-;qyv|*hrXGN=JakWSe}L|vdRYAeZ6nmVYLaffZofK2{i8diYp1$H zAD!MQUy%bM9z~T6zZU5Xofgq1cJ8OQf=oK-zv@n5{1#nv-Cx~4%v?ejsOzumhM6|& z6kTQLH5oQC-2*j1=c4S}d^uDxywyf+wg z3_|RR>0YSiAlt4kRCCn}>SJ}Wnyube&#QZJ?V5T?-KxIF*&fX9RQCZzL)2(>r}{u0 zr#@0wsF&3#>T{TbFbP{9e^XZdz4y5)v6)NQs8Awo-J=@)R&mep)Degg|>=V9P{#HPo;&@ zOXsO;rFy9Sx&4^0mhO|R0N&%5UV)z|UD_gfdoFSoc7gt7IaEca+h}e`+K3t};#O3>{x8dz4mc1@(b) zN~x$8Qg15z6kj!4xvZ>Lx~rI;b-3!TB*=p9hB^`b=Pq4uUE5zB z(@j>LV^rja=!w>Tjut;x{PNU2R@*7X6@Q&Z_e$BSq$0W@%68?5+CqJzj8rNiT zj!O6Rll6`QnHo%%4(&n@=1AutAmszXf;R)P-2zmN_(ZU!tiu^#YOQ}KPeTJU$Q^^ zk|)2ATOvwNozO>G4_X2S#>HJ z^}gb+UQ=Euvy~uNxk2$&ZYwhom1fFeWvMbs=?>2?Q~D~cl_Sc0Wr$KqIjKxh`Y9!q z>xk7brHXP+nS&WiV}`bPK0xtOlHi-6>Zs(f?+YDG!VZU3ifrfn7k1@m=&$bj9Nl~Q zKY0TBql*}!Q^SWn`Z96KtF6?a6gDztQ0G|F>%KQg9OCe2zE>Jd>d>{*23xE)$3-ZNo|uA$DXIAle& zDiO*-<)N}f`2kC3C^eL)n7OI)Szdz}Q~;h9D;*%s2(8-TT|w*v6pB7$p5m>T@!V=0 zO-iVIMClES@5}q4Z;*UUo~`&}WGTf(XeuN|SN}NNQ6a2*=(q4y&X(b0rNPot;KnXr zlP9T_R7rU+H$j$tldnRjQ%bzNTD}c$hRet0sY*j7MRv%8lvYY4@}{m*UHO7z56qn= zKahth9!jcwNuG)8kL2CZtGRMOo*~asx+w?cY4Q*8qv-qPN8&r{dB?JFA?l&^qT@x@ z;=j>gj;XSrJQewsCcl=8BG(1wp8Ns6NR&^>>)`uD*wITV1}{93TPtOiH}YNCAII17 zMVZIoy1Y=HsMJ@s$b;px$i=R5DLDy#v`NRMscH@NiFiS*rFZCRWhj4+TF%+VMg&G> zhNRdheveKWDYub{5-dk4`w_iVIT%@HQk?Qmr3vgkE4PBLqvb7fP277eZ<8x3qH+S5 zDW$k7XXTA@F`O@xhsj-VK1ueGwA}t=#bSH&+Dk%g zsZSFfrNdsKFBZcWM}GLbEW5ZaP#r8ckasD)kV)}!Cm_qL*yKF_Bja+rJo z(U>p4k`Kx|xPRP2ijB@*a7!+zZdG!TDg>4qr`_I{}GH_p7`Wj%a%K&~SHl{Vwq zU-Cb{We@1F8prxTz*fv(1-34io5&UM>?FCZtjL#f^ppQdvG9_cY?or7{R8QkM36=2 zq^;6z`kYq%STSyh&BxgzG$TCLzCU!La6(vueD*=4=7C$L$W7&*imLRI3(Gp?iCjlc zk)Fu2<&tuObV{Bomxf(?)|D$T7}fKFU<7Gda5i}o=c~s#bBMfGL?OmY-sUM zqKHUIIYPQ950c&GAZe4_9&!?;sqoErDOs8gxe<~@;yGZEj!0J#os-g3$qc;qkcvs8 zfuvL7X0fpPM(M;_vt<1e{g^DTzhi>eTUUf@q8^8wvxg*3PYPneEEOo)E%(PtX}WBK zpJ&3eXXL){XQs3WJ}xUeq|tH-IY)9z{pH$-SfbQMt}cI+UQ4}kOp(q=3xKn?(tP-7 zsC-D8EIpDJ%gv<0YX( zB_@?b?&@TxbPuuQu^%Uw2bP>tVfnQr$8X@0IdBY@en?5u2iTt`1xqi%cPgxp zm3Bd&_fmwkLn*Ye}}YO@{_+xd!@Eg7OriVx+3EHFvCDdJuS^dT%Sl+q=}Nh^j6vc z3o1z&(q*Zxqyh(skoZ7cAbZQbk$*M8uL^TzjdgF->M8wy6bY_i%?|4ySvVxecJIfx z)bf%jDTo=*gnI3SRhu#M1!d~~fx*ob)>@fJ~r0gZx#0Frx{_v?onv3~muuD12nj?0Wj8Zem@|Q|TEu@N4 zHA#;OTV5(8{SbRgW~qo2BTj_AHKkB-j#O6qDP9q$!aJ|Uo#HTXQftXw3i$KskEi{i zGahTiHX-hI*SO#DF=6Q*bf<8SZXeP6$eYXqNfxh_K-ZF z$v3ece4i)Ai4Ac-Q?!X(FGYHT`xJpI~^1^;Eb8OZqM6DZqx&slOB{c@)w31p%65?N2Dk?n@n zUz*^*A;rS>L_}JS+w4iLl6$c>EFSgR9rK?A(mKM6Lm}B;N)W3^Z$$|@Xr#k9-h;Q# ziZbGKS3C}1d=&o^_lQjTj%qVX^pXCG^TamdB4E>B)QNZC&6n&Tt0I4q?$8UgiTYJZ z%I@>;yKTR-vGZA2N2}r}^|5H&KJ5eTa=AHb)*SH`7{&wM9E}+Bn3tAbia*73i1tC) zegak>5~Ib7kbeY`I4xd+wQV2WEQjw|c zi7$DHUUZYSx5MEW5H`RrhqnErWWHC&sBOVjV^J^0ihiOU?0j9EC3cqt>AW~j%oEQ8 z(c@tMUTCvcd?IcK!)_LLiL0T}GI0y!KMBQe`Xv)eTtHH%}LobD!En3^QZ|TX!uroE6j;EL8k+Qe=m%RlKFBJ!iZINGx#cr^D zJuL2r879E<O zV(G|)1@vlUNOV!_PkUdxCRBEA4*Ml|knUnRVCWBgydT(l1iu}{`%EzwR?a~^xe9B# ziWS6_Vi$aBfIEG}*5KD^;y|&H=n8Awy5g^<6t!=Jl;xlL}9ZBjd_0x(-a`Xnv}c0K~p%Mp(qh+I49 zHw>1wLT)z~y+nVpq*xa5t%i3mF`M~|B}7$>V51NNLA=R!i;cz4>>N7)4Y#mKEESd| z(|5E!`nzwrh4NZNY>GN+^K;gZj3hO_05|umy`FhX{Ck)zUi*IJ*t`J5?|g+u}-X)lr4s_lPnzh zmC4Ss*|0H_U12TJ*ZgMhSaC6zWwS_@hrbjYGg%CC7o(U?{J;u}fy^L2XSKw5_K}@} z&Kc|go58wajx}r~d-H2k`c2C+TZPcA;Yq-PBVk%%XZ=0hP|~0DL>&%b#n}MVKr1`M z?n1sOUSTcZ(ZB2n<_?9VbIenWWqV*-3DGDnX2aQbY?I#s-QE#}lk7Z1~R3 zz^+>?jooGcv5hR1C9zFx0c(mJ8^rt&=T2f(mP2EKl(TdWa5heAkYUXjuibGo3-Fp}y5%KWPX!WhyJfy1;K+5#Ky^iCtw=*$c?shS*$Y$Jk~zkHzE4WY&bW z6D45wDlLy%FrRcK%M~}JV{FM!XM&eoRmX-j~X@ici>j z_~$#~z8=2Y#h$YXuzV2^GzW;B!)CKS@aQ2ng>_^pw*T8>=Aj4IF>A@x;40s zby4n}+-q2AyU{OXHafl-dW)u_-dAGrbTzWEJNrXRiI-qQ8TJM~+yYxhvAS$Gn~ryP zW@9H>g_i-{-KStQTT;gpFmTXa+gq$P2Av4YEJ8*9`rXlJTQ8*3YTr0|`L4 zlR<;&Lvf1OmdUKM_zR5Sg*=;&k%ia=)*F$kj3~8cgIRS*ZVQPmVQ+89FUuZ)^I9;< zk`c*zESYX0!-zKSbbK-EYx`fzMcb$^v55!RKz4`jq8GrTtyyW-6+AYD`7lAejZsZu z&q%fccCABi(vKAZ+S|g526%Tgb7B8z2s_TK^gIoKZo_G9`U4fW8F3?XluWs3QvYuw zY`+{Mtl9QzVPhk5Q4uS#So)K_WKM9&f6z}5uL1>Cz*cM7Fs8t!jzEYEo63MG>#_2v zh4Z09EPX*^fXY*J32lM=98SIHZPbV3h}mEC=xWx&tmDBGt+nhYoT_tD*y2nfYc$q! zHK-fCgSwncAJBfHr|1n_xr%pLBld+}0wOxXhS{tJtP@xz$Zrj~3QM6=S!ZTqcDf$+ zmS$1(AnO24uF;aBjd|qO%T13kMc)qzurupv`|Dr((g&eWEJX$ST%0RDMh^5xeK0c% z&13gjP3EK*!MENln$E;*e!xo;rbQ%kXa(3>hGo)`tR(Y*Cl9f9EQoHU8Eh}BNB@x< z;IRs^c^}8w6P$yB%UK7;75$v04pW1KyFv@}UKpq~)2R_M*%vVE)$`$bQ%F7TX{jsqTQGaIeXvS=whmq3GPd8T7; z=uJ8v)?THX=@mADZKGZ3KlFb^XgK+ZPN_#mbVhaO!myW?c~}Y03TyCh>%XGn7Zwhl z$ze|!W1;i|+sSh22YM8k*0B)U3wSQf?$hEdjFv=Pg6KI~26rCPgLDG4*h3f64e;Sc z+LxYU{aIgHj7~#$kdXH;FU}DVb`ZICCUBW$;*UA02Hh;Rj8ID0fWAMB1e2rS{3Wy< z%?9@c(`9r8s|c@dr;WfA7J8Nv*cMDr;1~}y9;HoT_kKDIv7N{aG>VKC%ZL|*LxL(F zld677iCY*nETohDjq}c@CGi>TIvY%zQbBylz5+)#*<2vu6YT>O)I`L~u=mu!9?@L- zkS5}OG`#{Dr|4HmyheA@(oAIA=?FRvjM9VZsRh~oh-@Lf!Id|X!@rldU38SN1X|Uo zVlmaUb+qyHB5=?JEbx(T&4VSEk-ry#hntAkF1m-b7J7z`qyhL%+fJt=EY-5emSP*}topq}iWTdkRb)J=i3&Oyd~+X|KSGDnzRZ)| zMtyT`v_HUf4wL!0_Q=uYZKRXPeW z_?J^O_iIFU)Pj(b_JNk-wkIjUKf0iA-9l!Pzw9BaNpr|{^afKQt2T0YC9MftcVh1P zuw*#U*cK7%jhHmYDr^8y*%tQBqMc!74&sqTo|6Tr3SJ~laKm1}$=F_>9M;K>Iu@tZ z8hheXZR{N%7ZwZEvEK23tXbf^HJC#S<~s=fd4$O9qb(t;3z(uJtQ!mzn1G6f=yuac z9?WiG-3#|MDnwJ7skC3x-krP{RZ5(XsPAkCXzO)KtK89yKX%fi<+LOpR(gL|T zk2EHI#h+|dhUt&N**)xurMqp1&BIwWYim|GDse8c!hg+KM~v@*{&py0ud;i{98Veu z|IMbA={i_60TF3JU65_P@cxrrqw{GAnn0ez(}n4Kk^(P$Cuc}omQ5RLD`_(wK4H`C z-<`dJ+(Wu0FZkX?eWl#jp43{f;u}HQlCS6h2z^X?fKM8rXNg1Z_5$MmgHM}7!eq#+ zMJd>@D^N+1=gV;SC8>!TxQ_UfK;&t6p{DQ}Yr^cf<)4EC&sloff*qERE8-f%mWFt` z7R!UL+Jh%v@Cu6eu|Q!npsXR{R0Fn^0xpWd%RZE^O?tsXJ^cn9X5sw>`2#=RC(}tg ztoHDv$hDe{nlA8F2DtS+ok;IO&)0MnWVA%C^}|es z=}cN2*eg#vQXTCBUutPInSnTdz?$(fJwSH?%Z=DK+LRc`8+2N2h2laYcBo_40{`KEV#dQt}WGZ{F^m796fyl z;z_Qe*5;7c#1|clH!>!gZbbg%k&TE@7esvm?COZ?)o`ptMPz{|twtqeTUnqdlWc;2 zbIDzD2V7?(+sJ0plT?Vi8{gULul`fG3R0JUhO06e~(j36^uG1f0bi9%0$b4mGS;$X(mC5KntRW^m>$tVafsCZro` z&};ZT2T1&e+I^Q!M-{k9#sP-svY!kCQmsJyAY`8f zHFO*;M-K@zgujlaVO_B;Q3Li}`kI-v5#P`6)2`FD#_m!rB9pPG6>rFL;-ou}p}XLx zLh$58(hfPtZIU4G1-Mp%M%R)1J&_CBNI&GjbnsNPFn~#{u8^gDiCo(9S^4srb0d1I ztdEc4{1DR=at*w_587mb>xQC|2&iJEfcPJXRTzBto_GPD8nB-VtOTQe$@C++3R^k= zu^Y)yau7AA11U+o*duyOm?!iQlUccx!augzG90sm%UHLECWcqml+fsCDD}0rkN|i{N1sC0b>f2TxTC zh}~&0)@foP_i^trBp-w>v0#!xz>1E}A(f!de)8?(+PL%9N{+n1$ClJi*`jm$^P2z@|WV~(#FSAzz@mMz4HJl}zuQVrOjOuCR|=&`DiTpqt#7#V26m z8}J^E{JjKOAMkz~4Ac zEirjM_ExG0R5*!)zGN48=s6h$?1z$9h-Efp-9r9-KwVi6*^#hu7xp!a zgQG{nrunF&>EOLKES|2_j?<3AuLqK`CUXSOw5EkDuvd+$6_bm-1wtHx137F*{*1;L zJuE7Y{L&+4$z(flaR~9=0!*xdKTnX|z@`=69041A5ZOA!3|YOpV7Pp*jlDPTMiwj9NEZrfDg?=d1a7=5A+nD8em{9lwN373Sg zsPAQkbnPGDEIXl3VshXW%a)MR_F*xNKlawP)Rq9x)k4h@!PqrvDscy6NI<_Aayp1C zAyL4^9n}0Y!1@!i7}+=+=X=0bjlq?n@Zuj~7n#qmBc&=@hh45a;oMOT5#+gR(JhaX21A5_nq zU_>`?)L&vGc3~%atBdFdv(QHh!ZYo7?3)MT`{xJ2-K^hiU7fdsds%n=9Qmsyes{4| zyH@)cyJ1e@rl7F9h@BR_M`f%LykO@Ec&-k3Y9->*iyS5s5vMW8hB3&gxj3H%KaYeD zIC4CYD+we>*egV8Pir?vO^+EHR3;=VWTySrw}|9HsN)w=6Mmu}=mj1*h?V6!5&%w2 zfgRmR2H5~>+W~*05v8H1D#KyjV9Y!m89xe`*#e8J5d*wYhy)6=(5oE6ev$=MOfj?RxA@WD7RoHu}Z&sPFY?JbX6{yto9}(3XTi|CPYz zW8`xq=>HNL6*Yjh-0X7yN;!sy4hM&6u7UhRXN>F8HB!W3 z(iH!*gC!z3D$3g3(dk3w;Ebfo$v^N7bwjOL`vE(pr-iw~AM9>a!MHEH4ehtVlC`jD4e3VOkc#-c0PI_o zdsy zlu!%nlupc=Sv2dWgM<~fZnlR7Znb>;y(r@xzBBx&y{Vmo9`1s$UigBYA`N*e%%tw% zbDK~aJ!5s`?Qdw%7(O_M`dSK}+l2U3fgcYeew~O5xMc%aO+tm+0#tnxK7nI?3onJU z3B?oBg7$_?vBfxO@Uf6t$$P%%;THxe+PB*B*y(ITT+xI0&~4yAPcY;;*z^$oJc1lp zhZ(m(&O-DX>%o#^;8)Jg{o&h_s5-sCD3?$Xh9KS+)L?ItDOkV)m4JiO$jw;j@GNzA zT4wO!{59g_KyS-{n5rKod8<@Lh}Ej>CS6WiVr`)ZpRGmBJ_tS;jw)9PcJzUzKB#gN z$PCg7_*n?Aw+5`;>>>CUT z)nV^K*y|58%))B4KGJribP;e!Dp4N2ApJ z@0SFH*&BzJ56lYo{MtKdh~O*K!MZ0D_PWs!)T=Yd$z#Zstw3-uRNWq^Tn$jS`opue z&}&SBTwffgKyDGlg|kPd!2MK%gbAMT<3HfN3A%_mLOb*X{pc#~VC@$4P*by>W_7bZ zwFg)&_RYcm)~JY>s5Uv%a^~W@qtYZr*n>6XZPduRSleEKcazX_90pe$2KVoPl$EIa z8-Y)bzq#u90Gj`!ylu7pud6xe(^&bJ^{5_@=VADqi#Ycz6WdX;u@1iijIrf z9Nf;@)Ox`_)S6%~_WSe6MgrBFmLV3)W%a(5E?;CElc z0vlNRMh=T^EWea)YBy*l)b>Ug+Y5Pk3_cD+E?!2R*bLb_fxV&7Wdr6NhDgrQ}W?UE(FV?x0DT0yh$T~hG% z0Bs}faO|<{0D3FZugLqQ!2e$OzX$r7c8El=eEGA1wPE1BnXs4Fwpq}^7jc=7{HPEA zAIZm^Q+Nlz<$;HOLyyzwf!bh4AVPar8;WmkM`rKIF6|r=mSNdydu-`w`-k7)R>&TZ zT}*t$b_jz6Cw6g1LS9eo@hrsLS&%*jF+GO}k0u6a))aBCjOcj7dT-#pHoR09c~Bh8 z<%@eF7_B+-AxqecD49uw@DhCeP}nGxqY)%q6R$b`$v1vekbg*d+d0Q7?1{#uo&K4D zUl*R&uGaR)_YJ><%ji-4XnU|p33>`>OoML+Ama!a1Q>>etlDK|z)&_K(gk@0$gEj+_1Y z9R9^jq~@097`|hDAuK^p*c0+Igz~_}K-Ag?$nBXpu7s>%*bkWtO!NWj`oR7^@J9zQ z@Hq6ugNY7)s|;N@s>^Gw##DWjEVQn@adrMQa0otah`70uaM(+shV>x0i>d3XMw0+8K zo3#q4s)QPJ5PV+_YpvH{J1eZY4n20`H>=CRhYMljH0UxJc{vLC*d9I~4BYx4Hq*fg z4UmTiA-5vQ|#}ZA%QzAMUyLi z|Bm0MHw0EULS9AmcNY-zU+Cx#K+XZoIR~S_vgGS)x~=6 z47714!NP0cE?qbxNWjo+p@Fak>z1L~y4qO$a;w$vC%;F9B-%DwGwr2=?}z-3Irp&^ z{s+QDx`BEFGhMMqxD);r>3P(jD%hzQ3i%AoR0}v%5#RENLrpMUd9ZLj_`d?sRS}y1 z6S$7eNwRPl?^V#hJ%m3$W4*w6p{J0iEyixqN;xfaN<MBs5gt~EoSG9Nmtz{M=gR1~&U_;u;mfuMFF)IP?U{{DGTp-)fa%F8>Y z2HHQGm8=xjoO^_G_}--tyyu1(4nu5jqbKb}5`~4Bdob)94-V==%Hf_jqUD7sxgp!N z@QWw#$-r49kU?eh3>9K>!*h-HAG^e;yifwHjhy7CMzhH7pNbltB!<;CBJfxgrlU zfyd5ZrBlLRWN}}?Q+SLW=}Vfen&Yx0e~Z2pyW~Ub;N`YRM`G}HYufLH854oAdZ+`d zFn1059_x?h1mB3{*TPGP_E^}rfpawGACoV;1TwcQWR*k|WY}FAkxmr0f)^@aef1I< z6OMI71#nqK;iL91_8lkSf4Z^bUzqrO9hh_pec>egE9aNMBbFUsQWMAFJF*qnv+V&c z>xZ@6HrQVj{m5!WFBqO4O@1Q&Wr4B30xg@6;fqEjQg{rn z6a$8$!5(*nv4S6Z&0y^Ttv7y`cOk)9 z!#b@uaNZST#)6O2Q3;2W@4`*gmiA!vMaaQ+s7up>-V>l>3EyDF$gNHN<=$Fbnr)=3$kGtT2z?5ngR zwPRQ+{eZRYee6M(#n?vlDbV{=umRci$*cSt*BE-OhV;t$xM&WW_0Y8nV)6$#t%%(C zg?z0Hspl8GPVJgMf-BLO77#2vI!(KeWVLi{NpN?g{X9191Oja5U$_ML0IZ{@iA0 z>x)`66MEFZ{=s0xrW%P7rXX&kGOuUu4z6PTX6@|Y>$CFF|6=&MzlER*-|!t!NnmIO zzK};~bE^CVMvWpfgPaYN}(;KM~pE zjeXFK=t*7B8#M+FehFJ(PhWI9vtU&l#CVZO0p#o~nnZNJMc91>q0d4Q}$oZ6#RtOOWeiA2!(`y=waQlnqG>1 z%0}d^P>J3|G@fFPevlj_9E11kA}`lLdPC?t1&m)0ewm86^FC@3czF=wFg5>}BeaIj zQ=l6mH-%($7lZM?aLtKJk8d03Y8hp}?kw`*Yf!|mdFeCcNXbL{QS%zVl3OMC390xN z{*$l+zKh4`V?qLKC84&baVday0v zjUwb8^06jZ{yu6`Y0^E7{k;2OQt)?s(@@*HbAi!`HIvrLsgh0eTH|0t*h*j~f&WGW zT;83Aqv~81B7vo<@W)x?zYpZ?fwi^KWiCQBs0+@S3Jh0753m!*O2GUnWJMXsJ&hPh zcpkk8;S%8PJCB#caW`4!W^z@Jb8pjtmA*PXJCu za$Shv%q|3L+ldx-C;VLGxuA|AnITi{$E`&i1OHh6Bm!}s^eymL2fq!7#ePtI?2&B5 z3dxK$QY$bKmtP!}`6u$-8%WS259*?7c|x}mxK6PW1%`ox-q3jwJWw7Sb^@rpCrrkE zNhn#R?WZj(oe{&oxPKiIq=b~Pt#XtMejSqjweq)es9RR_a);3Am7%Y&Chmy+;7zEn zWw9q408IZxTx-GdG+_lQUVG#}|J_Vepu7XT&>p-r3ZKV<4|;%qHX$Mn!AWPqToG8O zrDF%-kM@zauy~$@{2G_O(E7vvGNhyZZSZL8lc=3BXRz;n7~cg~1HPt$Ge*OA^{5lM z^;7tQl|V!6wH<^sALRJ%d>s4}CIJ7{(0@z-Pt`^*$bH=em>&&nP6p!oA|FR$o^n{P z9)ZWUfaCe^f-@ib3q4SEfQpL91J14P z!0#Zuw}$^>v?sLdzc>=7{vSza0an%0g<;N)1DM#|-FfW}?C$RF_Nv$J?(P=516#2W zP9F~4ARW^Azr+9B$9n`}@0k_f`qr8?Gajw=$(HW6>+U-}wX}vTCd(g_qsJSe`v!4+c`eB_$oqidc)TV>_fhQzM_c5=g>?_UU1$Z<7e{%`Us}zbB$ZQZ}~>#2IVdxrcYLK(Yqr( z3W3xE99aW7S76s}NUw82uGfqwMS{oOv46MPCj0S$e#mDb zqZ$EM$tOR2FPIzkit_A`x#GVlaJ8<1aUA_FlZ{E{#(x9;iZ%U@Am|JHpq%mytL;O* zZV&OXC^=dW@fC5t0W-?v{msy@J<@H(2psUox&^#oHqw~LxTY6ib5TYai$65Sat~2A zJt}*U7o4L<`E~T~m}2^S#thSZYo_jsv2VD0L`6kM&3y$Nc!pd@c?Ax1mz|U=phFqz zMZ@HQJmn~2SW?=oT@q?LIL3_B^RNg-n9GK0RXEKgqNPjlJUkWUIPDVA9 zSTj#eP}b0wyV&y3OE&H`FE-?v>U;O`jkNo07f%07ymU=EPK~oS&l#;GVd3Etokh&| zV}V}l!!`FXin=`eUp~th=%F9p7Avj5J{s}49X<4+I(7#8uZli4qb(>`{u-7PxT74V(Rli6Zq`v&}Bm3%;&z|WVJ zcgF0Dt>_V`^S3m#wf*g&bBVng*PY!nKdD`}W8K0?U&vk7*K5eP;Duk9(G%j)X#DSu zbOn^JjNKo^{);1@lSsWHetrm@$;2%;{4!rUDut5C7^x9uz^-;m|4{FED_3UyF^4$2 zCG&OW9M8(^iV3hb^^DPP4Qd_oLvuv)N4i6Orm@ltzn)J2(P(f@Qf^>Z-sIdvkoXVy zKx^d!4FSqm2{W!f0xz}PyWG+ zPf2SmpS&i}vvJeVo`_(wjn6!sIfV5TAN2hInO0NY;Q=*>M_c60VEk9Sa4_-h1lkv# zy#p<`AQxGIP8(tK3z53uy+Z$8u-ENjN=Hl0SLHx72_iQkH~hYQTv6)T^CCG2BNB0muvwmW&$ zTt0j7J44Y*Yvd(rY`wsV6`w}4^32)su_=&2bf-4 z2C`RkNl=ZDK}weV7-_%cspXX?tc$=Ulv{XDarzyW;)h<+GyJ|A@k-=8J<#|{W?Pwj zWGPZ;N&c}CYiN!fcEF2<^K-lT`TG3cWVF;3BrFapi&*cS^*1Zpmg;k#y7?}nWSPNw zbPMVvEwMj0X&3fCL=kwuUdiUk7O9Nl!i=s;QH-XJ>;mT;1BPJj~YDeB>s>feI!l} zK})yE$u}eMWl}wbRW;6v84sQmlRj#q=`D2rYx?_9-_Nw(pqQ6=UGu(?k(x0|%~C$o z$1tCc%rV$YbLA`iKNBAMFN{2%=Qm*{3FtQmS=uA>XlWFZu!H+uz_wFZm->oq!l;Lq z1UolMwWZqXW93_BPUb5wAMY{7cjmIX_l9992`Tl+kKHs^G_~nDxh2hE9ixkqi|t7448Xn6|?>VePRKd1Cv4-?7y;cIpMZPngc|E~uhw!dVXtOJERpi*^`1fhV zu{`Og^pr|W09>lD@?2ga)c~LCD^JLu?bIX6uBbE7R?p3bNW(<)2mh0SN%@xiaQycj zT;)Bi>=oAOMuv8p2z8%78;Mt28Sx_IIzjYCV3Q@ljyXioOlpKLiGiNdcBvw^zg?;$ zi4Nw+nnjxN?C;A@c#}ATT3Ud99{KDbYsq{$Utn5$Vr^fzg{YG^Q9SU55P07X{82~F zAZj+j%qhJfE)~HKHh~^iGSlBgxd+lB)?h!&yP4M_WMsAkwh;cA= z>?!&<Jr7Yx)k;;1?a>u;sz$U&P5~@Q_1zdMo^41bV8C zzWO1}X5iFT^4R+DGIub=6C7-zxXaBYU(Gvdxug&LFWA>}uVJpyWL_JgkE{n9_<)bB zqi0ssxob181;h;>*!Bi=f0}16Mmw9aiD7uxFg&9sIocRFU=8Mb7_MVaJuH*@@J;H& zBb7KgPjg>0hnk0bc;(1FrbNp(&l!e!e*FWwv&Tl2+%%8q^J#$fIw>!aUQ2ofMiMz1 zP#Z3d-t4e!ClEIde5nQMeTVOi22qbm$?_d}ht!F_j6#Ye-PLqvx6A{(C3dpIJp1>5 zol`D&wlZ8bCtI(YBju@UDo88E(pLZqwE#n7MdF%9qZi&m) zT;;UXhgwrBr7q8Gt3(r>lB8(z^f}~om-+ogVEGd4V+xFCX3~aM}K`%_=w0Q^xCdrZ_IEtT6rR^kdD&FTa&Ss zQ!azUfzo%-dJ4MPji!2FvvaYBvhelQ%q5%tF&#CD7t}5%DdDmcy*mTR2j+18atX(g z4l$ACqmFp~V~8^Ku#WSd?R!A#2d@~$I{I?fcn``h%qjp~?_hi;{A~e#{T%eA!%A9< z{(6Iu?eP!6(F$Yz`|*lWyp7dd7|c=pjTLD67+m09Ta#)eSD{uT8TOfCt+l+P(|ctI zo!Wur!<1wqQ+0X?e}Xs_MqHT%8VIhtnlWS3MoN!_F`*hw;c zq9gBYN?h^4wtItD+nLvJ^fQ2`4`Nnz$=Rl0qm!6fAAI5s-wl(<>=j@6rDl$%sQn7< z5Bj6q=zklJQJFpzQa-Gj{W0xN%?XW4?jgA6VtR{2yq1*1_?IN#z>}wg`MY=*nW;1h zJE+gQS2N#2aG`t5I0pGuR&IkKZP0mnB}lVg6UuIaL(%`m4AAS0%ZTmzz|FzKHDxp{ z(SJL|0yC@2`rAqQAtQYQ`d%Qyo;B*6g;Gf{ue&nHu83W0 z{WIe<(;G{F!$(titZ!T|hqLzGH7eLxSUoF^mAjN34ZdUh<(wVE-)80eM#(p*_5DL8)|Wc$6zsrGIReAdz(Knf{jarD$t8v3w$b7kPPCbo-rn zP)xoorLo#sHy|u9&{V_vpGQ-@YiPUh5uDZ0O;c2}f&B-s;UK4}d36UPs$gFWh;N^m z-Ar_JjkyfKcSUbNF>H1ZUKdS_O#b>JQZBKhD~Mg|7}<}JFIzM0@x_Hd@6QV317>WhM>Pu=&}Jg zeE|8Dhxht{SDDgDskCxWJ|VS|^u)(2Nu84$nRZyd>8F{h(x2BS{aJbnb@ZypyEpuD zv#>GcGdV(SdZ1TP{Zx=oLu{l3S}25$>J<3)cII0K9C-t3Rsz#}7*`Se#8EjUKP5+u zr2p_^&Yhf(UY_2K%qy+B--mUfiPw^PIXt)jYxmyHM&ITzdRyYzUEvR=PE#TnyG=^q zonw&ed7|SKvd^)ML*V0-0<3f*pK1e!egcD!p{f4#BM()IY0P%3IfLuC-peZ4}wLjGQQiLXu{YwquXtR_|=2w&+)eFq86!pP>n2(lciuITrVoPBdo*h_H z3wun0|BGEP@2COq#iw_YM}L-AN@d{HIypWnF}kYZoasM(Nz)a-Z2^&aKk`Huo`pZ( zkd!YTY(zFM!K2^E>JHL6#5)gDYgm9Bx5H0LVcREphs4-|h=EbkZsNO}e3}~86Lu#3 z&@9pH)H-N`|Bg+WY<^?48arEjbvumd*+p}b*;6YxNJaIY5-6RJuED>Z80%oh){U$o z4*#8r_78(68?c5>$nq%JUMb%71=d{%=9s~!J?tu;`IVwhXJO`%a969bgQdE0yLqb7 z(_A^GO02!ZQ2SMyPMQ_;N57NigWJwZZSZ#>@oXBuk;uE|Vs|b`Zx|7BBTT0~pUe0h z0I$2i{M&=d5sWAezSTf^K=#vF`oh|ZC8T#)G5uL%tbV@9A$(oLHezxVHS`0_UsNXs z;L``;it*$yhwv?7_gi`9MV>tq-xV>uHGa37@7E_*o0v-iHH$9FH}aR3QXsv$t27NY zmF?GPw?{ty^Ow1~>KmBulCQT=^srhN>I$A<;R5;r*T{cC!t>Zg1l(U>@O|`j1}j*^ zSS}YtXx8UC>z{xPBB?KAm`W6Tct9`(|R7W3kt+%vY>o zjm8%*g3oiY)BX74YCc_wOCNL3=3e*N?N^yzfdR%B=DfJb_-g7a`lzQ%&)6r}7Opl$ z$zl$6`1TDXRFYo8ZlFUMe4DcfK&oNPbryCqf~;@}9=05BoW;*S1)UpEyUM_FKTA{S zqq{4=@!K5G)I8a0@K~v@AN(O?h{G-Wikfh{!|c)jN}c3B>yZO^XG7%$?6bic#p+DiGXA=OFUm+EL4;8lW}N>}R!TUchvtQ+`MH-2vj zwWKxRZx6+XQJ0|?YYTEyk$)S!NaasCEL7A@(%>WXN>RtV1|qkF^Zz8;h;^7?a>G>K zd4S&86?wz*&Un4^4q#q|e|vaZSkwFAs5;Kz29?(2)*aXvRE3_DAnI-llr*&dUCM>g zP33v7dCP3(v<-{zf{(8QD?7pYUZSyL)JB>qZc zH$RpWOO7)SM0O*mz63U|B|i(6=SwQJ{~k(Cj5#*VFxgyN|H}B>_muzRywiDMMC3%Q z*B8yig1(WUt{X`2j>QRIzR!D(VwWq>&K~4fmsoHI4-l~>9Tpoy9c~coJm;{Jw_t;x zX0^tJ6MgQcCZ;BsoUMwvi?yQXOT95GI;*4oIqgICu^i;Yh-+}44E9ng@(pRHl7VO4 zqt|6Mk_shecgHSE!ZjSR?#AdUOkyV-pP^vkB;uSmHrf*=>BLX!Bzx8d-q4rzS>MBS z&y;UD8nY#~gZ*`Fq~;WTOF!9Kx+wRNP&$2XW6)YOHO01AUJ0JXx-ovd zi1!JeFZvO?;q&2)$&p%VGvy;IhC`%CIAmOCpKx#XS2Up~v257>@ZtEoUfN3^)^KGq z&l;j6F#g)?cRWDvPXqe#dxBntVHzEInua-v9$*nQ23fLs;AqFnA~WYmZ&rCL%bn)|1aD^wb3wgF6SL`s{NV14rGUDXLwd-pYEORZe%& zu*CGqBAcgKr=^6XDE7;=WhJYors_&g{ZP6|4Yw&z=!h+kV-B%MYZ-cZ2-+_|Zu78N z(Ld7@zuS-9j>gZg@hSR>ME!alaor1RDwG$J`_gx(|4n^M(;&lFQzW%Bh0B zg~jkjFUIJo%tS(Ul*{;(6E%wdeCARUYl$37gM~GDdkNlOw;)HnLe|!ric&gqPlCHF zQj+Bs;Qu+!e@XK{7wAsk+8Wl1TLwf2_I2FtP+eoSTT8z)E0NTu8z_qza}DJvK31Ea zm7ZW&S!$-Ou!&4`)d{cugOAUmg7-?Qro5seJ%ygX_DV_Vz2*e_d(U#8(FBJF_LCAy zCf@!%S=Y;a!g|e=`XLyU~nTx{nvd9bPD(n@O?AS~BQu$!F&TbB8 zk#q}v5Vp{xtiG;!jdggS9Gr$lH)Q6^*spy6TWU$Z`VlJ(!5Y4TS8tfh1HOM9DIEl% z_9EYbSp7D>-vNsdU72<9xAMdoIz3s3h$e@sC`tI+fw*DupN-WmE%lF#KfS;EPRpH@ zTauXS3(`99Y2&jPnEI0{O$2j#z>}VX#V^pzR^D}o*yfDf-Z0A=aIj1yok0KIDAuW8 z)3@8V7~tGZX4qaIBEmVU(a$8y$evaa{6YiN|QD#M*KI%jK~**DcyJr7UMrIswg z{WdAt$ni6|!ajT}nA-GU?4%@r8W3yhfC9ysZ=Ztiu`7Ui*TFB!z?tR~@it36HK}%| zyv}>C(#IR8a7M_{Kh~&oobT3MN}{Lm3OOLT5c`@%ZNG`~2%E1h2V)UO;BfcAd$AXX z9iBY19CB;}@;k|*XMHrYOT|*lV~_2?g0HLx^@4r5g_VrBXmBt;(fwoG6e5LH!*&9t z{mg%;vVv#L0e2p+^;mb#AG zRx$jmCNcN|XLBrq-!xYq<5PuMQ<{Xu6~zZS5(`8=(**YKMEvQA4>+>cGz-tOpsTyA z;H-tyby9pa8#P}!`R_;2sE`z6J4+q?3FBJ75dlRUrr5{QYgd;XW<0Ea1vvTz|H?&z z7Igm+dwan=9uQehg2ArX$yjPHKd{hh)LUCB>``HT{sHGUjFVzD(^NO5A^dv+=QWK< zicR|NF++dK6l`&|J@(m^voB|;swZdnmo`&(5%GSa5?Npq^_2_AsVIHz_fUQ^#5${zn;iYcvf`gQ9&TRFovlg2dEax=AD zT5a{JQj|3uclLbGB6e&7k9WYIgdA`48OJ=Yf{nM4-$nk+gX^=q6{{)C&X74sQ6+zz zNE~Bz1eUiG+1il3x8^_1Fxya{+vY!3H;<|MwSUezMY!yFLw|#Md!s;W&_ih)HN%l|H^qvM$SjqY@Vd=%3>Fv9A2)o>fF;~PzK^hx zD~x>#_II8)u_Kn)DwucxvE>;vx+LvT@W-nah6r8>S@7aQ$cFT-yep&biHU zYbkH#1Q=mma_<=IqOsyiTp!EY{&w`lDh1DVwFF0Q|qR+bJ%OYfcp1$&OLh%H+E1@ zDD~kon-#4xg}7K7PhUa|wSrE2@FlU1e+r$6on<$$j^o7c>%?3Gb~K0V;vdF-llmMh zz0wn(lYZ-TrHtXG7S``kUeU$02h@G!`GwSrN-ucRA?ns*XPUF}0p3-My(aUphf46{ zVMMNGte5me$_=s0J_S7FGpIZR8!4%rMG9{8x_ILYi@}}w^1*Pgi2X*rxdVGRngqLr zOeD6yV*UY~S0Z-X%w@0fC(ypOavk{%!xpFD&yD%}IQ+Rf_BR#=B;kvDuysHD>@(hZ zTDru3=#_B%S*pKMO7q2TKIe~z#yyCC#y*K!=0(;brg@gI{7?B)RV%jtPO@=Y%zW(m zGAFaFLH9G10Qf<=R7Bapdz`S9q455W_*qqIF%yuW9rM1xeB!Z>FIeh#X@FwntNqkC zODRipM(0#8{cAaGC~6L4kBT*EUGgW+I$a@ElWMR|DQXN?=y}+R-%e6~Bdbc}Gi#Au zN#r;Z9d*HCTVw6R3-Iwe_J0gqe1+HDMy~hx_cyQ+u{Xdw|6IPm|E0ie_N33%DaLLw zontSv<}R?muNqE0+Cq(ZqOuVVFkUf(AFbGnx&wQ!!rp{_#K(rj77;@m!-NOIS?hu? zJFpZ{$BrX%&y`B5JCrr76QpvE^41`ykl}{kra!!|xNokXnKk73-^8MpiIv|01Xc9G_imaz>#B*N~!{0KuIpEg|SfLY`dmXzC0E3S*JF(|~ zANmq|DApIueLi}v2^X1&gsb3x^U!ts0^8E@Zn6KazoL`dNU0is&a*t=JI~*un{QlV z3beeT3Ob1zXk%jOBKpbyU@tp}4}W;#2*sEE@x$Tjd+e4fXy zT)_huaOeqg_(i<9NgNJk=3DlJw|{2jOh#*RSBEy1izV0Y@LSfZsRo27u@?++q~FX&a~Rn)8KA;=YKr#2Wvjn z;AuPIb-t`uS$O7I))n3`m+8d1hsd`a0)?dzW73KFjUr?-*EAf5zC{yxqFMkYs9=-7mX6al40< zp}EU>aLviL>#E0;sl?nzoOLi8YwiK|i*=WZ#L(T?-Cstvoq0!~={-E%hxcE@X4&D2 zyjml#z1VDHY7HCt`6h7cnfxTZ(e$ru{&PF(kH>ZWDC<#MzI%k{pv0<4dpOsBJ!d9V zVtqG~^}6x&8_dL)UQq*D1~!eRPPhSWR>VVg!Rb=b^iJd>_P=id$Ly68=)4{=@dA;m zq+AtFxd7X1$hdnG^IDMG7XueJvz9VH?M2!#&-R9^mKd+`9u@R|!e&O4CMGnckMJ!g zVRoaQD*WLT9PTn_hdjkE2BHmN|E0lzTg18q-hT}FhvJF*(Rm`$*w1{Ol*9b3H2tuT zs7aL~pSXrKYO$?LFo-K zy0Gun0rZ*AS3$_Gxx%?r_<L*s8#ZL6!XjivP8mwz3|DXS_UIJ4&+XGBSK zdOU@v#mfpYqcQV%g`Y{-^anD75Tx-8AM}8=-N9Zx@CR4qq2uo#7?%a<#}@cXJ6T4O zgNWTz;Q~XYB2p+Pf0vGnkE>(2WBSLu&3cYIADV`rjo1m_?X37=>#yWP)F5Q#4*Sn@ zv9-;diSUYNi@w5>)EIm7?89K%EaJsk-aD6n+kt(}#Ag>UmNCd|Hh?yGte!|KTSoRK2d$3GL(tjKo- zG2l6N-G#jTCVF;29>>vWK1gsHc|_y+qHj5a82SKiV#iZH^C>Im`S;ey@DLu`x`6u^ zQ|`(Y>=N?J1>Xw^r*C7g#ow#9N4{=C=F!Y-`fZXlmo*i&`&BJ@*Hkq`84mA`rtY+W zy3a~vxB-43xY$;3seJxt0p7&mbTXuw-2zzLb-8=!Q9p$#f^wGqF4)A~~ z@Y8fgwIg;(+&Pa?`d-#kwwJ%x>vqOoi2F=TcV;izSGBv^pXkr&kjfS0@tPBzu8|2& z1FMCfH&b3P-(GSdo_k6#XZ&+Feo&h4Z-qTHhqr8IZEPMqeB8q7Vo z`v`c<)~s7uwRIm2k><8u-kz%rvw|vz)RqD?tHEw3a-fgkZz9ZRx@d3Q)$9P_V3pLm$_>9jo)XhGEkY(haJY@mnsl~r9BnODa zTi>9sE!MNP>zwg0%J{{6)#_#2n)xm>l5?!)!xKdP>nt_J3P|8z{4fPi?ucJocyBH6 zw@Zs>?3dN$@^L&I~O=fMddkhxg6QTM!20fxy(SY6Czfze7{)M z0K?D13yPsL!At8it|P?n*-AKC%9Yk4$KvFB1#_o9K2}Xq?j?>&n&DAX-_p9!w#K8D z-u9pop_d++p*w_5fs?nb| zcJi+s*d@PK{$QBcYvx-7UH^iY6jct&``~AP!SylB?>FyhtK7#Arn0v6oAuVUoJIDD zam)noKEneBfD@nLXI(gFM$h*{ISj^&N zon~{+IGNFiUh1xjJ7*fj%X>KIrH$eSAByF7FT#zVV9#`b;0Hd)MVyoN6J$(+G5XH^G;N6E`hr zra!q zZQQdU_K!DJpD>eg@<-OXM2%`CHRzXocHlkl@xPk*#dFwBHR>tHscToqehz^XLlkk^ zRt0$r@12DoK1Pno)Nb>L^UmZZoQ|#5{QLIrc8{L=2upoiXHSixM)-vYy|hz`gVFur zwAzZuIGFt{_So({_Fv~Rld;%+63nkav5@~4_#S{rc&&|*W3=>lhB%*j5Oy+_T0 zwZ4;&5IeVX7T!SKu^K#SP7E5#_XX!`NL&iWra09X&T|BwFj*;NqNBGDH zaN|4v;Y=Jgfs@?|FkYM^An;oBTh$A4502pMIisnewY+JCg z$#Zvt0h1U*C!W6)p_i-p=33&y zIpV@HeE29aVLuV1n%sxnenfoz1f5~5xvF`;)lEOZbUnOiZ5x@A1#I@khQ}j^^oqfYT8xhMqu*Y_c{Rwtc zpPzRjZ%g7CdpJ$9Zsw@W$<|A@&BjRc7egmbpls}i%%Eqe-tZ# zYvgONgZJR^Y%uII@sNru@r{ZDT>Bn=SOeU9f*sUB{%_$)-O<-Oxu-mp-(E|evYy(C zSoiq^^G&8^(3Q34ZS?YcdG0niStfaH)zvq)&YqKPV4tHn%V@ajjwj8ROR49;fiaxZ z*_j!1lh=R~Vtr%~die>?G{oMXV*eGDP%lP~OFmVE0@)>zy2YhcY zm|R*p!MuGrpKSp+@R~XRomBYUZ|tus^8bNf)a2{;;NU>U`I!2~PP}&yInh>n#K(~5 zKBcZ7LR@UE8kMh{31jc=|;u&ziuS+I>DRA^W0(R zx+ykMLpdauAy#S_k0UW61kYE{mLEvusQfI5PYs9@0{?qqHG#yhMo9HLIIX}}bzq>7 z@oEredialsVun*DA5(wpInFRlNzf-2vOl2hPAo4$&AtKleH$4#^ZO&Py(aiy8GNfc z<4DK!6$@$Ha@IL9dkEA(cyu_Wv%7<{bB&xyEI0ef^Wh>Lf~+h!4?R?FY00r?~^ z`1{pZ%c3#Qu#TsPJum24NJs8XYX*lXqTVJh8}Y+BR2ehSy^j3c1P9v+SA9n=yuM)V zGYqyV;*kL#uZWcjM$!U*v=H-~AP+C_U=Tc$Xi8j2u6b z)qI3A0A%w#YX>P^a|9o)Mm&t-yyI#_0xKuMW`XQ?IYHMfvu~Vu_7h$*T=B-w*T6q~ zz#&ddLPzhBdlT^R7d&YceCZ9iyqmuL)vT+(BF}T8d#*9-Je{etYN*414{aLm>v2f$ zYDxBLp!;UHlvXOezWRyxtdbq5*VI90QJgMbLOF>&)?(z#<+bnwf8xLZF*-C zE7lNOPtQnwm8f~qh3PSw%^R-}KNbYYhgq<2@IM275t)1;n&vN+!9HD{=lKcEIj`^qh~!SH(8OIkY7i zk2hRQ^m}=N4;``FpV+;q3A{ia>#_MIaus@LxlQ=`d$P zbtOZSQ@5l}v;VHG#TxHqH3SrMk$u48j`+hCMZ+rRCHUk^-g~7W7L{ilDtao(dy|QH zMff^{aWrDAK_GA&#u1NP`Y<0o7TA=Zdjw-H$?yEbn6E{<#5~atHQCHfyc+2}jXR=V zM^AQew|AkR^djeG$MVcX&a~~sybm&(PWW3(e7`CFSdo}h3EXvnx7Eb{?8*DffEQ8t zLsQe&siYL@?)^pna-a+c17*__%`z2r!QgJX^OS{G0w0w$!m~zlk+!* zGR9w=kvW}ry7Ts)=-?jqP#7FoLVOcvql{%<3Dl+rF|SZ+VC{)o-r#Z%_}L$DXcm4S z0G~Tgo$)Aj`(H3^4K>>yszGVZ`t?!zh=Rg8N4)Wvsn4=Bw^h`=F+5D^l&az{VxOI= z9#p!av%l2poAG{8FD$Pdz@8HDgAL><@x=Da;B7YVJ&S#&f z^IhcLTNzJ0DoXw1tTasOM^E>t+`hT3y=HqCG3~PG4gJhxxF@!5&X}ChS}*kxb7%r4 z4Iv+P#}4LVXS=B!{-fMu&Y!`*M{ut9_`i*O=N2umfjoJezUMMo#g3 zE@JILoG7#de_SE61A{o#5 zRlC<<>R{r_MBdkr@ifQ(+JVcpm~&P1QH1Y_6OBtTrhgcRJv@3aaigSik@dM`{9_IF zn~!Jr#-GFqh)d-e+3T~nSe|%QqefBGaKv=N_SvT_WB-?&s0G|i?dV}WOP^L9?KSng z-37azg?2d}1`BKcPWBA3mhtxT+-WEhpAs)>zh2CE0~yK>*w87)a|lkj13Q|`oTs4I z4&dQH?5-m6>JD4f;IEwuLf5r8ZaJXf|uw zIh?a^k+wT6PrubKE&t~v?pYoT|;U`?bUMFP8s!q zEO|$K7y0KHwwqPcGE11Xy7%WyhpcAym$lvK8#}~(Nu|N;B5-rDukQsctu}LC%@ajD zaAr(RuqKfsR|Bh?QH!lX9#e$h>4JXBC^w1Ae;D5t>@W*E+`xEBQDNyt-D`kifuDAW zT>K|ncZrk1-M!A}dKinwD+xm#uR3&~2cx~#ReeTmU%+~PDdZ8%nsa?@Zz<1es$8ay z5K7(H9oZ+~2VP)8D4*`+hF0YAo1BG{9Sg>H7u@y-pAQfha^NlFsW&*`%{%0QsjjJw z3{OluEuLOwJ>TeKf-Z)nb60z`=ANc2XXT69|7iL#1<(2fGWSLHi}Ae{$X?iZ8O9^- z_wXa@T7#Wjp+;f=V`js_#Qy&8tfM?3DmpL4bACgeX!%sKga?PuUZK}`D zyl;7*IfIPbM&v5$ee%IDIaOJUxBSF*dcumHQKQO4&YWh9Z`Hu&oWQ{r;7%Tuy7~Bu z6<&IipEbgFgQ!8SCokX6zRW%8e(5u;r)_1}#c+z6e3SHD>8_k>@r9r3tp*TRKFShx zxORNLBkyX*oHk?6efhc@?`p+7CG_0^n~oCIKr*F7xc6S>nMJm77KUbo`_bTGa{hZk#|eW>FD$F{vZ;b!o_|EXE`L1n_5qpO4r0R{d28A$KdziN!KfWDP^-1iul z)-C<5sfu-i<(8Mhoo+Sh(oG=;<*p zxX=0`d))lFBjt=dLhh&fDGK~66js!jd~7@Ns)sL*z}M@7H#L!?J@Hr6YfJI$!K^D3 z#a4GPSFuL=4*YhJTM%*B=N$GeTn6pM`dIJK&tVJX%GC5mQztR;(;wwDc;{&B`Y|{& z6CBxuFZARcq93Ig&m4!$1F*jta2&BV@J5+I^|K}RbYCe+i1AR4THCr5h+7F6t z8&}-4%2Lv_)Y9GLY7wWl6jION^)KaW>RW98rCfu48G$SD=&=;&cod#dhuAraIkiQy z8StB4aKZ27J(u7_C(&6Rkzp}BqCYu91id(=w0qUs*^ROT_0vsDOy4Z^EF-+SrF>60 zOCNLu`(F&$kLbT0qWa=R$EZ2YgioGe{l^aPxru&k*vKbh>KEeaH*$>UygQEA{S91+ zhkJjb*7uE{d5gbQRg&|*=Vki63~(`2FmEG|7!o@=?kKm-O_qzxdpTS8FYjo={6w#> zjy`Fz*0Ph>-wF8*CstHP&K=-L;(n;WYmwg+DhW=ayA*y5%ddaRm1G7>r1Ri*kxR{@olj(jq6369mBpr&HlH!`W|; z-M=NS`;lR?q9T1{Pe`SV(HX0}PI(S7%_P56N#F;nj2`Ndf9O^#wigcjyUu8dg4{k7ttpwmIGUC}3&O zdFo`%&`lim&ZSuT3+A(r-(Lr6h@05@Fc+~7&;wi)cg{58XA9$DJ@MsO=C*;pA2(_s z-?69T_;LgFj>2vODV6i^-zKb1tjM0ci<~D|%%`;9;k>U&~r41JGsL$ zDrXMhOlzB^ylu5-6+>9ssPsUG!4AoqubNfd$J~wHv}fGOdKVowqNbDp-*`bZCIInuc&WN#Ma9(uOa9v7~dboPrHJ)uL}Cf>Jks1Dl+}S5!~7IgMBWq9ZEQ~ ziq|9*GHxCF!Ma86R2d#p3RyNlPg!KR-Qo9T zz{;W2n_A-CeUNc=Sb__3Ig!68|C0a2z^=xx=1t`HU1Mg(-oU5D{(BeBmlXT?S`*Ji z%|uU}7rlr(_^KZD5GULExt zI{HYhY7*G^rXa@jK%Tv+2Z;S&)xeTk=t|4`2P5NRAn;gpCi1pE*l&Nv)CjBDD%X&A z`>gbP#Qu!^y2i#9f7V46FEq#TjAou@JNICVvtM_qwbejsj%j40b+C&|^qe*$7A%9) zlqQaMhhHVI3gL|1xP$v=@sw-S;Ib9EMcKRj4QwqUeb6Lor)w)kj`_0`?C4;=Y@HoY zH)sUB>m1zqBA9rYXnBiu!0UXy8jC!DFO5VxOOaGZ^x2LYPXm0_9*$Lyc?MATSOY`1 z;;9zSE!`)#mg}qU$@6YXqqH9CnuIoqx6GMVfBiyJH``jDb$OffP77Q?-@oAzE68cZ zji}QZ{}ZG*gy*gX=LceO9hjdp*q;VNnhAorG5?3i`ZQ}Y8ucu;XfMxJlNA?wsPnZm zw3_TH+3B3GY_Zg~b<;%~8mIhBY3z8?!Nxf!TaaTPu=EzX{Y6c%6)`)R9Qh5|R2lfr zQuI;|du&b&r~sxo@mYsC_vQUX@U;U(Tvu{wNA)si)gF}=;}fd??*OxIu5qaOmUT>| z%bzaPZo~;++qr2snRs7IeL=mzSN0%>9)wo*z(GWu5%*)YB2TM<937EdUF0b9j+rpC zbg=OjmCrZu_;jQsPSP^sckdz!a}L2b%NN~Lg~fgOSu^aazh@wZdpz8-#+$ttcmzvvnF17&JnX|6aFa;Q!p zkiTKB`LA)hMepn7KZIUkaV|>@^(!n4b_@PqWJcQ<=|z~F=)+k^OdG&wcQDeK`K7V~ zIh=oYr?cfbHISQNok}0$BH2;i${x7e?01>MJ-@sDmQ9(WPcYUo9kA@O-S%0WbvbJa z_u#&UPfb(viOJz$<2~|QGk!V^y#Ik-^1&)^bQTZi35Q>M!hcj|$gQUQ#vgL0yS&o} zxrko(HF7CA89Ry2w9h(bd+M{sm})*~sALZN`)^7e?R!<6x#G$_OFq;M2hj^w1^J0} zwKlMt%Y41**6{+&`h`C!u#BJ7t7NeE z7j?55pz#y@Yb=(rg#Mc=_?IL<;&$;x^t_MJdaKqyQgj!cmtm^uy(KpAe6Y+pNN31Z ze^Y(hiS#~zahIt_p8*dp!SR+bpDi$&@x;!t=&L)QCBgI|=r@H``Xh`;Pu}|nmU)=C zCVCOg>^Y6(p7nhRLlP6sjlDJ-iknAT&)JISmCCcR>avLOi@Rm#V0%ftZ8|n#<^RK& z+jjhUIQBjmd!GR-$;Cbvz+-=b8=vs}`>azr5(78Nb>(qtB=^vrrAOIGJ3hBhZgtZM z%Q;JkR~Nmz(VTQ5d5YsZhfIxLbDT3E=fkz$!$thyi(QFp708vWtV4;~?^ak(b96Tf zo?MMtH3y|yU>%EKd}7c3qXN_xnEDOecad5k^VWfZLAQ0z#w_k1@rh{h=NR{h-;hVj zGu6Us9dNG_dHX2v!3$dywU6C!;|Xx?QOIu?T5`s3%aA`glL?3#<9=}MFJ00ie-Zlt zx~M;tnyj(?U~O&ip94{i*h4u>SHd_Wuzv6uVnQLf!xio=u1@SK3f8XzpI$M}-RNZ# zzB_~WEJj~Fz~=>g{fADLjp$dbBluJG7iWS^QWNRxa+4Zq&#A99YczI_V;tTl5Bu9y zZ#9}MPPXU93YJGXKXb}(rgItkIepX(*gm)Ja;8aPa;M_zRo;3N9@-mh{75~tFcOW& zzN5k8GRzpZPpmBqw%w+xSzLKd4@nm)ORN!rqON(*^D23D_pWTXX_~^ixliJiq+IPP zZFlnAE97rQ;lu;fFrIEAui47Fv5gvMV=RT!7SPp5bkz<&>w)!)JAda;2WrmO%gCy_ zQZt?na*H+mr{o*$xd-51|Dl2P%tx&kJ$o1eqsqtZv`^8_A@3Nf^;OTyW98FoO;wDs zyz0WJJ>=g!r6E0OC=!S_bsC!?{|b6AlB)ibe<{SSQpq_(Q| zkl*rvaAQwP3*!^>s<6axgF|bFrBVm(W_+UBkjHrZtp{UIMv~(}i+k9|4D4?$yvv#B zJRX^fJA3A08HMrX`}m{iwJA>RZ#kH7g`Ukf)Nhm2jcQPINX%E=Y-25AjJN-rz#(=W z?3y4qk(Gt;{D+(`6$GQ($2h;^uM4oj!;F0q^O#OGVFrFyiKj1M3^Fz@YFA>Qb0ypSGfQi`+_nM{bxw4Y3<}T1#|i!8*F}{Hx5<89SMc z57gyzJoefG8$AF+sS0L#F?%yT0?y!m6V8!IK_~UtL*}bnYCL38tfRw!MSRBIwbZyr zuxDrvnBG8rK&)YP8IL#y8eGN({^ckB!{(>Lx+bA1k+)C4Myuh+H_(|Kxnrtwmds$7 zJcU|nan5pEsZCKkMlFrrVGgzy)!#L)@tYSg5viBi5>v4j=z;R(2+nq9!&OhR8Ar@I7BUFEjdsbP6F%59iYFsH!{nimqXjs^Qqf( z<%|`qBW&r$g_a{(@3KzX7qKq{ms7+Z5b%2wd-{tbzjoMHJFr5mO^N=Z zKO`oIyR4^SCnK;uC-pd99Y>sM1|r3guV|?OrBge|0V5soxfJwQ9%<*2>y`z93Kw9( z0W>K5?wzz$DjE1bXs!9X^)~nDJdVhVoK2m2F?$gwaRkBoMWG;vC;du zJFL28me*z5E1!B`hp6qJU{v|a1GwTKMa7P{;SEvL3j`j%fv+uO9{-`gap<@`b6H3} zWzU+>4Kjm#>PzB|Skb4^n!3gYxjON_k2*KiBXtV3;Z(y$bBtGAp9`FO+D99uX0yJ& zl=JrH@s8H`*<56%QMZ$^<;vIb-?iv!DNkLC-Wua`|MITV%dz_T}tvasJmR?yDDfV!9I7iXfkE)Ry~$ zOMdv-Xr6x=oSKIHPvWT~c|&gyWGwc(gP9IMzB;niQ1X(MYL4<8yejLk(Y|DWSKv)U z1NO!RSdv2ygvk!e?Xx&HFH$`NFEGf{!Nz4gL!%x=GMq5V>gp&uLQOmh!=)X=dVd0z(IMa ze4RQ-7=5cV?G4%&e}|@gusGTxj8iOb>^a<%dn&iE_OkkdSo=Ypt~!CL%c;Ngg4@(n z-{V(4vW@310y7VRz?;C9uK1a-MOL`MvO`$xc{vY8>rcMbf_|YV@&quVlp3bFra8pf z^xe#ltP72y<{Ru!?dbT>VIp@)tkYJ~y3mjKU7e;@DBvO%Vx_+v1@ezZ8&6;fL$JV= z%(Fj!w7wv}*I>Wnd4DLJ zRN~oh&IKE1uh(||Gbd`D`HR)0pJA%y)56b=-2OT_{suU~VMd(CNNwot1+$0)LDs+p zeEItnnCLTfI2ew4ng91hmd6>B;In7I(J@H#Fr#o*jM!2uB9K3_=na}YgQtwU&n@Fy>D=ZOLM@;c(1 z8{Z!VK40N;Ff%-hemlb`cQEdOSm{w}ETT^Nl+V8C|2Gz0f|#2G0~U88byq{_MJO)k zXxue6UpId@{bExrb+uQV(Px)$pZ^Mv&t*1c)Hg~rlCPjXQ(PHy7S^*3S&J_IDOk^Q z#xwztj19PjpBZ?BDqy_XL{}P zUTO-ptTxJ)U*1OFk~v*+s@fmYhLcNwR!3u*T@|sX;61Z+RM#Nq`i!AH@wzE|t34jf z-M_r)AktU?TAjcS#omVJNMQk({T;MiNX+wQJYs)KG<-;4naJ7B((m&rq+i$=L#Szw zIo$ffRMgrkB`Bqj!$*5@wo+y76?G=KxJT8hhsdF;s{43n3B?&z_GuzMSDs28J z@?Q)wTtbdDlP6jXj zGMbLerjPmyG*~X*0S7CQ+aA;w)^^bp*E}qg;+PdxKj!}Lt-3B=OT1^mn_-E zAM)u){9gE=iXRuI7a(g|JV4-DELVdsMP}< z{zERF3m@MJ@0l-Glq=AS)Ren{%?>Rc&ZpK&Q|Z$$O+$1930IRpLz?5|+Ifx*_{$b}?%w+Z2yJjQn1X9D*)uEAS(aer_YJa~*6t(3(Mi>U|ki$%;~ z7|$7}ya5AW@+oxh!n|&yj|-MsV*ipe7A5wWmeL+jo6{rx z)S;?F+hF&QXWW&TZ0TmZVd!k$omMp6%6J#z2kBVXOf{Fdco2WQfiF^N$Hw)@*$o+p zHOFVz+FRs%9^Vvl*p6L3Ldv^AylA98p82*>?-$_DKKx*fTvhI(HL5m^i^k^I((zN= z?f6vB8-}Iq)#ypBX=v2G=xg#s`L5a!iBCZeML>(g$lsNDtX1sQjp%_&E=<4``MyN| z4~T=Oc;{`#cbIX#Lr%M~Rnb>9A0F6JJ;ir*)bXQPWtlH~(WCK`Gw9>(XV@Ri_?2gpZi2>lISmK28b*xsN54VrGQJUaG5)n~veC!d zz&p+3sopatGWKmDO`$4MxW;Rk5$I2K8lWcWROLOZdq^S?t+}(pnDh4&y`qz z3Vl2U5ANaruh7W{{L!89=y=~r-sg+=iS^&A;Bx}&M9sM?Z=3C^Pds^HZ_dA-V!dUX zlshNaAKTgocZouKo7D`ZhdY8lnoWtLMTJj{p*u@RtK{izD3l)AK?{4Z&^q>p2VIphnfvnA7{nOCF zSgnqAV1_J_Npt$pQRZF8~P+UCyy{D(>M6T zp6Ip1d_SydL^1Mik?In@)knFew!}+auS|gs{yevq`T~30L5XMG&+t1uLDYZnzMk^$ z8o#>>7F^B8%6|N9JnL_!Brvb7Sb(zXeY^)FIUpx>gTAf)KlW-kXV=TV>+R|L(bU`O zZVs~+^lsu?HMd4?UoBX~$Q~#0n8=mgxajU>ad%etEXoJH%!|Sj|qJ!<2!;^ia z(|(mtdFxWu=PQOpnd_5pLk6dg+AG;7M>_Z>i)RSOOPjZ8ou|@rmw}a?@ zXK->ZYsU*^E)N;|C$e)JxwV567eRyD*z@bqcLV-)$K>SXv)mh7+CIvA+V}Qe<0H>R zWxI5D>B*ULg|%bo;Yocf@km|7c-Pc=>NzmJwR)R%mn44M2JZ*Mk6rM77{1DOY|~$i zGar3y1<%&OpWpHAw_~@O;oC1oe}6{@hw}SBp-W$7SkA>5xgTQ* z=la*iW|!pb#GBCYJ#m_pzd6KIetfqa{?QZouUFUejGjsimhUujZvu^Eyy%6V9ET18 zj4$nSEI1|og4_H~=6ULYgeR#ZhUw1eE*lCMUin`3@8y+j`oI}YGdLUmaYklF6ms{7 z9vm<9`yqK8d56QT6WPu)$=HebsGxDbxmWD4xIl1w8}=xj z*Q@wLt{~uQH5KezLcZvsVuX)+bqyFeoH=c09+RN|TIjq8{x5~TlbD0d7cXN@U6I)n z%(6VW&u>HxPxYr+e^JiXPSVC{byLozjIlhits;+^Y}{hW416Cvmvf>UiMOB+83NAk zwt%sRs81N-cTe>-<26$1Vh`k=;6xw4-H*4I$U!1_Ew9>RFNgdX^Sz{i9mcCgjByf)siQ=o zA2*F;+k?_i$nm5W#BsWvdylRf{k-n@$c%Q{4T zV(qWsh)zAmGX{gT=fJ-4=;#4Pc2@!!^#=S%WSm#5Hx-J9!2h@COa^Eu{efk~yp=dR z=r6-VZEjH6kVjsV&FPj2_EYAfwtguQDaWX5x-(u?l|A&FK~s!1Oj9GE@ph$=dJ*{_ z!}vSVNA3nmrqFG5(SM?|sp^P$0%_2(XwgBy%IFg>2 z-on1zdxJU48gH6oo#Z>$|Dy96=S`eT>JE04V!!=2=xR}WL5-fuGBpvtcThU3kHEPO zN-5@c9a&0agv-cVDBj3T_z{L)zQkUqF()tNBZt=y$cOYXzaX2tiScKUH=5@(+G$|$ z&yZeTKTWM{>m2f21K*4`nYo4uhE(o~GH7c=8TtwO(|0tQSkDYD?8#i8+s87~&T+(15c>S^SozfuWndKFyJkl*9rNGkuAy8)|GAL|&~IWE`Z zvT=ZYpZ7%Uktxm=|HV+x5X8Mj1?Y{eKy2Snd+$`iE-mbjcUo!ZZRp4SjM$iDX? z@b)5nQPg|PYXIxL2p+V=f4$F7E%2v4AjL(Xn-S_{(%beKiLmLnt2NZInVT|Od3l@W z;E%oXSYRB2eQwBJmFD!se-+(DFEXls;1^uPj=ckyZ}KYd4Z4pWS0U!O1Yb(2PoTpn zML>@u*u%o$)E45$%4qFY?5Nx~z6SrYh5DY?2FSt*B&Rc6>Y%JAZ_t&q+-H!b7-qJU zG5O)WKkH@IWb$f9InOVJmAp_#A~pMzeMn(6JZz>uM*e$|L%c#=a0D^abL5X*a!CAb z;=d^L;U0cU2GsZn{eSTtD}1*z#~iR?4p=$@AA6a;n%+knrj@0yrWJRY6|v53_N&= zj~bY7ho|S`VHS4nBeW@iMdIk0rn5{2R;uO9j1rV z+nGTL^$31>KRN&|f(MPD$|C%-Q2f0=;p-*zU*f?T_%RzidW!sW`V(Bahp!sVm>~OL-fuDVRPMQ~ zi=3Q-@8#j!F7ziGUOa^-*K|X4&Dk&cmuHr-kiD~a;`e{NJW_k7d6L5^Mjy6<9@M4( zYqSVZR}$mJ(R;X#obfVxG>?(TX{(wTzb$z@6Z$ui@njx_x(E7j8vU#eefHvyjX@4q zG42@fRPM7{N6j*kzPcOWOGe_Oq^lldj5X~uy=!{JdNqk29rK!dbFWdiI7&auQslOR zI8Mf@n{o$yyoX*5VUNWRp64F{XNswI>|`%|kPmpu)$kuJcnpP*^<1bC ztKX!SQ!9YQcgR0}CU@2se2K~p&24OaVXki7Z}(#F$j*Q{LG7H2ItQUaX~eKUkgHI7 z%HnzQ8R#ER+$7Jx`^vbrpug-zsQ?b#MgEJh{?p*03wk2`($>5`h%f#Zw*L%#`|%%Si~-7V!=%A@UCIHXK|SO+AiBd9fLFOWyGkf)w!HI(uwcBAa7X<+24p& z${`EU2ip{d{MQBNd>FShHscHP%;KpZd1@x8{2z8R5l#08{j;Hh9?qrmv+QL#j*XrK zP3Sn%Z`7j1nW%@+n(3e=&C<{Q-t@b*OMI<_eWHT+2@Up;t6M;BW2_oRe3XC>LX{c0 ziYFE;Ow8wx?a3i3vhmq)P~a`{AIWN8V}~-~{wHK#!HY`B*V8rpZ57x&nCHBv+H+I? zLG%@aQof{gu^zCuw4AW@H#sbW1DXaUu%44@Ric+0$~S0K3Ix1^FByuyEl^{yhds&L z-N)Y=f`9OYl}{y3`G5v2M*bf$qv7!5FbFjq`8>_;-8sWqr_Qm*>JuP zRv|*xEbiK}9D6+m7laUx}aI$f3bs+q(PQ8VR8 z$_4U-akhruaUM5~`>Bn~TE!yrqcz2A)rPO1$sUO`{O+rq_Y;V{btjAUmCrQe^$k3& zft|a``fHNUJcjR8hk5Kr#{0rAiT&H~XGT-Uzev1a3ZMKPJ-kopf1M~I)p^eCos-RT zZOtqfYzp zaWQ;<&pak5#gU6E$Vn4k@8QpO%Gc9wynjfn(g8U+j-N6P>}Zo8d%X2O5*TQlVOeVV zVso~Rw69Llr9KeNg)=r_Cw&qd*oW8|UeCaW)CNl%fJQOUr3(C%XM$($S z7IFSZGw#>Af~?*F1ExTS$!fT=6l+um-$rJQ5}|B!^&jH23FPk{GoIA*5Bc^`g&xoN zeQEq=59m{!@7U0vD(Y?YW*j-kgNiToJ1k>Nb-P+3V|+#%ySw)ybA;8`G{D-xySwjk zYEpNw!f9~whq_SBgj#lWI9fA`_(;!++am{F*uk#&x*xDBp z|1Zyndd24lLPNP9e*kNlNKHxRA7>FG*}13qbI{)*mAu}WepyF23VYo)rDwb5%+h{{ zpX@2!P5o#yK4fe0FPdCe@j`xXq8Cf3E#Bd|y_m;C=v*Crkp74Za&QEHp)`Kc1>~Tg z>cE?6Lf$C_FEv8{4>bM2e)2ZlD-%Qw&rMq=7RGFdz34gI)WUMvw#v)3&Otd1`#%pm+Z*dNoSvHX^rdw{rmWD%!hQ%T!~65*{ZR&!E)T@5;5t=8s@Z_ zX9m-EoQj`z5t%B7S0g2Rv< z^iR2`!3!I{L#X2BkHER*?f$8cAHHbOyR$Hmnu-Sirm%pnI z(c5c`vw?VOA8VR|ZM=_79EIO(L>?Oxhc!~0(DU<4-N~Nqq0q0PSU_L#XqOv?VJWXu z`WsDnYXck`Id5Tp_O5I{&Z&OG9^kpcNi0SlRrdMGn)hAol{|Z6Ah;8b9u`o~k>A{b zjhsiW>^c~=1UY()%uZEWGCvRIP#XTm;xo#;=w7F3PPM!{`i?OMnjcw9Ij$s5Oq$4k zBYCcDFM6hrBlB_i316|fd#EL3$ciNvLSj<3vK@KZ2rh2K|J;Lzz7t%yqJ;9AgWk(n zIvh$C#Ww!nv$34LdNpul@Ec1>dwb7FAK=OZSI&iGG_(UXVR+e=W> z2R;7-eGh|Tg^`2L_#=h!_imtXuISrl{K9c~D}BjD`w>|`pl9Gd`TmyNJ6G3rflFZ2 zujn$IF|G4C93B7+E~De@A7ygQNOibpP9 z@w1EiFVfUQ=?HJ9Jqtb4saxU4F7h8!;hD^DjKHp0ke5#R_;nJ$ zU=dM*?9CV^f>pPiyzBu!!~7~+7TVfzUVodPK0h6^^k2mQ#thfD6z^C8C!(OA zGQT&8wFaW|#lVyZ{Hfr4ziBVBzk?k7Hs)~w{hN=y^8{J6eEpn9&&O|uSz30$!ysq# zTx%KgHmh6c>9BaiB*PH)ckC4fh3p-PRF{LUJIN*J@wyK{!&}(BHA*2OTUmR}!9%!5 z4B?909V50GhmW^V_F<@P)Jk-GH4-P)@$7|phz<;oYZt%EtFHNiImg7uW&Z1lO*Y{V9?!Q&0y}UXd(j(O&%uwngk5h) zS4UamoZ5d^QYc+L~#Lgt}nG3VOIcPo5$H?XRxx)EA#!`AEohh@Bdoi$D-&IslSEy>sY zrv8bZI*H}#diny#YhT5YsN2z*me%%~^qzO~{nNh^-PJv@x$)TYa!_#%`>lI}!Tr#J ze(H1RwGaEbO{s>@BJ=14(0CcsH^jGGL>_-LbgNIjRTH~8PhtW&)5_u)d+dvI9za=N={EOz2w%;=zVWuXvGs4eIpJ1fZTk1! z=;#~BS#am^chc$O4`dDJkjXr7unT^wv&yM*U|$Lt7{)l#6R|UH44!-nTu20G)M_;^S`YcKn3Pd8Jm@FNkIw31qV&dBuUyzHsi_e#`G=zat9tAJUn z`0i)y3sEnaDDwd2Sl<({u@+W+E7-V)eSlr*pD93WdsW{-pC_h?ROh?S7hEG;%Ep$B z`{lXbuJ!f0r6ruIQ9!k_lBM_=jaa)>!|M;cPMiCo7#zbS4V8rPwo>N>T=GolryVevO98! z<+1Hu@X*kbhDDke`(nn^Bk~=*h#{_*=Pm3+>l)${|ADSmAn#KH{F1qACv?>Z-7d%& zm%!&y;ME%B;hx$=ZATujB6|`p=-cQ|5Faj$@0^feoN763DqyV?kVsE`1*h}q${;ld zJ5~5UciRVXZ+9PYKAHkv3;xZYxEt}w(KFR z!rqlF`nq}(dvyz?PD*{txpUvmjcvnBZ!L|o2W89qu1kSuD>y%X4>^)*;yDP?6^v}9 z`r?6(2el09V*ISjjCF>**-G@_1M)5N87};$GxO9VVU3k}yq-s<*Mscw_;d3(zhj`~ zADe+QD5}NQjPr4+>=J~(;KrEp%#nWVE4hVEf1dT#CY(qtl+cSKUyp`2E+A z{ZquYZ;0P6fYo=A*R#m#I%O~jB=?t@oGv=u_1haTl6=Ngi^(=D{`Z7WVz_8POwbcM z_8t3_r0zjO4=bm@q2gf15ahBb`I5RkPv*;$k@$E#s~CJnX_G4O_egBdcr}ikLl3^! zSnUtJ_98ncf-8kiu->un_H1BE3RxSr*6>49=t+wdE5&MP-$;A_KlUg$k;O{tMQo=X z8QhIcehGGQ2eE2qWg~f?29nfO{zYr*!m9zoQ=LaY@oajf&pD5E9_qHob!1$#_?6#l zd8ONGd9SlS^#11b+-bgW7Jm2_k?Jlq?KwHM@$60@7YpwU>P}=Ofbn)=tN(#_=ae{T zSp+_Mpv~^k_ysiE#WyZeu|0(s<4!+p33??@Wcz-AuG?`^DvyjsA`qVVrEzG_D`NO?~jH5D9r&zLiy z-5%oE>gaZ0-iy5BKHL1RSYz!6J$f0Z#*a$q=5opKoO>yIu}7g6J;)0=7vdHkbuf4= zeUCMG{7&jJbl_ut&fS$*A^=P*&g(a27x8#B7~B<~Wwfd&?3W~`H$hiTH_i3F%c_vn z&_Jt+;5*BK~2k}8BVKqMzx8~ueeF7g}fWeRP3$C!9BiNP) z*v;e6^#!=K3SA7v8|g_-pf3JZPJU013wv2=fsq~J%O-@F`dMd~A}z(a*JecS*j$ww zV;$o06KYeWoe|agWVO7BIkV8^b3E?`d8AwD8TZek70I!#1_g6*K= zOf-7{alI3gw}f$CBK!YP$J>e@JAukv=4Cy;+tAG+qau?EthODj_SlWZNTmB=*v5G9A1tm^}$h~>IOd-P|&)>3_a{ZwT8REB3p zan82?Xw^GfTh7_4r#w#iWf*VR3O1U>9I>3-Wk-CvPv}fI*}xd^eJ@%kbz9!cmx*_i zfkpWVW+n4#z+Pv=p^{iYd4`sPeHe%zkqSl_oQ+OR0^$P?kzd=)-EGI?j>hkz?%$HU z=xF5P8-Ai9wyG-jqh7?Vcq}4T8Nw5?!0Pp3qIy71YjvBh|r?7mRg`+-5E88r5y| zsSNVp8QU!9+Zwcf0CxNdS}(<}f25Awn0REkh)`GPtLojgFXFlLa_3an7Oqp1iY71r z-ofjoEzNP;ZuZX1P0I}+=9E1Og~UaoiR;*=x$x?cazkwf1=lHK(OVr@+?KWd0_%gp zdX;&6SGX^gPsqCMY%JeBFn=GmVlnlUisHVSl~FzOJa^cKu`j-@ZK-2IYGmqn&H|Tq ztPXkdKzI_ZuEk%xpqvKv%RP;mU?2%8$-T0|qiV^**K`#6SlpL=XK=vDu_uQ%)$=zt2OA_pS&Uw7sdDrV< zMIxSY=ShyWvtw7_z+hk2u?7FAsJI6Tyd^dsfHafQMb8E^T217vC;!T!3pLT_bRy|2 zXq|*-D)%6l!vm8s#yGI#26^*Gcodv)kBvF14vZNR8))umtIAzBnr|upyqprb-@&C3 zcsob&ALrrMZbsY2pm(Dft2K7NHZ+y85(Qo~2bEqUd#zaSNpkS(z~7D7+;3EDry;qcgJ%*<$>IoIWz!A#BDT?-Qi(KHwII;;`35Qq5py_}3A&(SaaC0->ggnzvBX&rou9ae3 zNUu$0dt7AK=y!(JhI#tdsz&JK3*+m zZ5nu06518VNBPLQ>k?C+#$Vo#4O|Gu*{R1gBd%yDZWCLNBPN_Jy61Muymmf_LoHCUo1c_6Va)T=(OA`DDyLE$fG|i zD+F!bz%4g^SD&9{pI|R!Sw}{y19i`?f$>2FxqR~L{E%LYZ;q)nF+5+vi;afezRv#mW^?>+n2iW)#zhDzGn+l@zR<1*buI!m_3w@>% z@BN_uemOFwteOi|o<4B7PT-(NRBjC8L{I{yXMtZsJ@UMgt(_ch zj%GgfaysSI(w>Wn^aNBFU$BS=px*|bv4x`gZ8}20!Nxe)mOUjHkp- zYti>8MfTb(L_crf_v|CDv<_QZff`+btddze@2b8w<2Xxg>vsEJsa~mXL~lWMSCMCj zda)xB`(V7{EmI_g;HXuw8SgMI~BXE?f60vg(&X(R9>QaQ@HP565kiSe(IYrO&% zeB*rb2;DuO>wfcWpB>TP|Ml7%^(p$RTOqdy_GCTOT5Eyq-`^`5izC#})6j(oYQS5_ zvuf&6u<zoxmZbC0PF@c`0@ z*();+Hy)_<)ZuC@*zpTFen1}mp3)v{%!6Jnk)4NRGaI87r|AG##<~tr>w8Gw!BFx@|J@ynubp8?_YC#;;s} z(QCB12Yc1O{wNt$*sxLihck69fWH^Pw#vk*DLm&od7g66PS)ScL%ToFX}Q%^`mIha6FT_Uy_28M*)E zDfsn(dcqU>HrAl$Ql~~>Cj-FH2CP|ft`3;#jE^MGLn(p3n@FCZHZj!~Y7m3@%tGwd z7j>e#Ti;Kg!oG)$l%=Vytmo{@Eg`n;Ce8XZU`LQiw?ik-0Qksv8jH`^n;Xr;DC%NE<^?C;rA40cVPOA;vD^KiBC$rc5(YMOgbtx#Z95`O3wY3!PbZ@@E!B76z(IUOyOIE%%JV)NUm%M) zSA~Cj^_}&nqP|3rV(-^gdy@Ca?~T1O6MrNnxD0ghByY1;%NBA^=~K~C$R5G6)YyIT z(I4Yygy4gX`~Tx>yqEgx4BA}*XZ^7k2k4=S#^2te%;j?t_-ez@0_m#_<-M#WZ$(Gn zr?gM)@0DlzYOC#C$kS+4!jDCqLAE_OHzORM{sp;txqc14Mw9n0fQ%o2D^BFa#$%(i zi5do}Md8R(e2;=y%Jb;86NtDGT`z)-olSnK1d=fazLiIgrlDuq#EDD5(Cn8hFb0M3>G}wCAJIS|fZnfNT$XKR&n(CnypZFv(rzi381ibG%_>2Yc?~Z_5$ z=v*J`Gy5;|O5&PVDZgQxu7H#icy_3|5&urFzE}GY$p#RIIzzb!#2fL{JOAbRKZ&({ z=vVl`c;5I8{@~~n)@MW(-ZAzAYEWL_&T(W$4+S}+2>k6VaGX^~6`~p*rZdDaiP@@%N*Y(rD-aa+jslFXVJ{ zuuVqvF_Ezzg9j#R`}e@}|A-qtV~?IP*D&nL27Q>uHb0*o=QN$~(IFoHm!V ztv2UbtNL{D)3G-zS8NxTC63VFRUUnABHo~fH_4@pU^ctJp{h`NGjzztR$L{PEkIuJ zU*ymUO&|lpJhHGMQ~6W@@OB>9FMZSgAg0V&N&TD&=dNdcHJ1v`2cE^zil?5jQZt zg5k7wiajzF==Z#f{%s&4x$cZR;5fAWs6ukIt*f#|qYbJ4eDwb>zakf8x+bmN(#Vh^WX1I?v1k=E>KOL&H#l&a@yaoeC+K-OtojY;;EErypZOIA z31(BjtBv)U%lhjhEt8a`&`I`uH^Dzy31?e7hWUhXcAB5Lm+g){$a{OHM`l~`QT;%k zZYv|Fs0Y;*7vfmPRR9q=v0fCV=$xEhtge`VZtJ`7{5_SoUBjNgOLcV=!w zkyHUKj}y&zkSDEZzi9=2{`+%?<+;ttI?LY2_{DPX;_`x{~bB_A%_n%@)u-vhfvG29U+3PvibRMTgi-Y9B9uv2_Vh1OPR3!Vf zQXDyqM;>3$?Ubqgy z$uZtbx%|RDl=Bf;KW2GWGP$$w;e^Ljqu?y3X@+3Ujyz$V|7B!wmDGscbf@7~`%P8d%{B}O+DUVN^q@&Vtx1b8-2Boc{Iw-cKfk-iM9 zL@m}O^A`p27O0)L}Jhd=?neRA)4^W)EU|;;p*6i<-cR&|J z&o6Ut=18NHWtr8_{r(do9+z z6Ra+ZFE)>NuE^Ltq%lwVNZ&zO_;iN9mx6Cc@JAb?A?#h`dlC2#lX;h@JU~ZYkk1{d ze)qc_aMV=8I-N73d)rPswx{XR1ITAjfyyRzlp3Z^$2K)VANu1FCi7g4*^#+G?wetG z$ML=_de9GPD3ULSuDs{OE^w|MV@yL|`ttk1M7&+d4LB30OoMjr)I?^`XSyu#o)#jq`y6KznO6xBF|&sLKDX7 z2M$$2ce|hu1(@HTNU6-tjb(h;1@Srb&hmGOOUii?0Ov4=fp$7aWP?_g6(CKBsrl8iwF!LAAHZ8-Q zmJOZiIDOIDX`Si!&lNkx7jh80MIjM}U)2O(QpWQZ=#hjyl;_~(QH|eCmN!}X4>@ec zil2}VFAEZ!$9`8tKKEe<K38-tnsDE#}4SkoFx0dZa}O)T_;UgHzai=6YUe>#>};%#S5<*Y@0yZV>U z8IrR@)I;mrs2;?z@#=Q<2-x)zEu4z%pP)xVp7*!_scVW{Ooh(HL7cISR|?O0I#eo* z-2Kh(OCWdhUX*g^!*-~sXWp~GZv%F!Ji6hHZH^7z9ookfWhr1?Y2RYWwe|X$_4A81 zRC5sP)Fv140Dc>Zjc#Ctwj*PEdD=+)t64myE3ebwLK6^h4C7X3etkiQhRkCO_Ob)G zF&eG!jO-6bZ)!7N*&oscx<1E7KO-kyIWaeJpxMhh%KFJ(!F0zmDzvzsJIt^2qgA)?E<0H4$pKg8b4ir~odk zgc{D|DHgDXL~Kus&__s%StRlzab=a#v?t*iNi^`pI_PanRSK>lR{Ya2z5WGa-a zO|D3;CyVbCNB#6#lK!=jdG0^i1oKqM@X zenPoJ`ZX9%PZsOj30Dg;zs2ZflFY=aJ;0l1;7uRKT}dqLj{Nr~PjQg-mQaR}AB<5Rmwagq-fY%?l#wxlQz>AaS4pcgI?R@kCO!i3!fCU66@I>NRxn z2t3_@H1&cmb3nmAk@wNerwN+hi~rX|AICA9vdG13q@o7#(^lkE`a|2n4H;*y#A>PF zc|Fka2{!IQM43nfy|?$-hxgDl$T~lMO~SwAR^^E@i$!rUA1Ts_)9640^*S=Q3GPp1 zylGHd>fr>&>wvu;g0xEyq(3NJkGO0aua$X~`}Z32Iv3fl4sH!&{uP){Wn{XNxTEg+ zRW+qK=W#W&9=3lmjmJFWIV40LEuqHtH!g(F>Z0>WG$a7gT5T)Q;G256m55&qz~3PAp`ELt&R8(3#h79;YEAm%oOZNIdV^Tko&^;MSED?Z#-u? z`0Feqa^7c?DO!Tw=TY}KgtRL36nuo%ugLfOgo0h*|1kWlJ=|j^Y2Y4ij;P=nXLPdn z^={`CYCCxl{i(O z^{0cftML~?@t^ud}h8NnE>}T1ZITzrTwSwcO zv8Uxt!15{{Eqz1WFF;^ zk15DWarALNbkM-7yR0DxKlzzD2(2AWd@-N+w35;i{u=b&y5xZSK}Sr@tX4~Rdspid z`@57$smBbZ4Kv7BU&bzufV!o~mF#4_Z{fYHFU*AF1 z1$()O(W@hItB{sz*n_S7R>l#s=TPop?uFlWg>S85KWwh?n5D37xnq>k)zU3`bIcl- z7()i7vbthS-vhSj+rMG{#z@yyDGy)op6M3w= zp&HBRGG5z*G2$%r;&d6PZs$4lD9Hmv_~`n3?dU3P`*IEvd=4m(g08 zmp+GGdP*((Km1*}v%8v8aVKX#T|kO)zvYFchFx!&Ym3Z{$#o-FG#kxsEbcLSO|=p= z+$GRE8ZWgKIClemt^uD9!1v0?!z{+FiX1Ls)z#3~zj-I^<_)AH9z2f3j>>y_n~1lZ zYy4avL|*@?Zi6n{Fw#&osz-D~k3_E%cDuLE>z3&(XA=hCgRF(86&Uw2d@n8z;E$A6 zBap|@jCUFO^<%tk$b~#xasgB>3Eh`~iiNQY`}mH`pS;YEBBoOt*@zxgR3?-63*)@l zGTIffp8R?Z*JUm}QoK@PJnk5W+s}AU@=7=Pgb)7lh@7oEHu#{_Z*d459HKhl^nI+N z^tI*w^s#9A4o2&UUM@h|8h{s5um{Dl6PuY|8T_%E(4zo#6MO!wHqI^2g?NG&h-rCx?yMLLSKXMKezsD+Pl#$fI4nkEO^Eil~bCb2r z#k#E|UYG{TjluGbhx;8=f$v%!87HTa)`KHebz@d$gL zfSr9!uexj4q3}>-;4N72yZNd0e)9aEGhO@*an!fNi47Ve!~KKp3yE{E6yQGq*+q%2PtexPtM^#`%y26TQcYg>XIj_2QS z>}z*uF^lJRN7Du)E3M(rOzdVqJoDXrwio(x5dOH~Kb>cGa?kuT^eUD3B{(}ZTeG+K zu3*_?n{G<7^z&Zn8xNkFsOJyGW=Ov}Pu-<@QTdTN^b)SmfCopQ>o{<4DLz6&aBvoU zZ;F3BE&nx`IHe*I@CiMsz{u=j#)^j1ml((FSAffZiYV2GT`RITadcp#;LBcv%+IaG z92GfdJuurPClwFi7L=9w;(u9{5LeW_tj!Bdo`hd?n$ZT}r|snFe-M#uV$}^<{|4Sy zBHp+;AboWj4*Nr)|K2&nau5kD~(+0%Ojv~x%9*D_jH#+UJs^oVDJH_|_l zag7GQZ{+LaLF8?j`VVr~o>-$EJ%L~8KTOd*(hYHWWAIF?o?h8>*V2@;dR7~&Sgr-T zhxVucB2{b^a<61}5u^SCHPhk4b)NSe9>|*d2L3I8CL_SBned?#vOf-VY6ap=V~#cQ z=~D~J$h=BBr1OIE0nL$qayBa%$o_tR&QM(8G~TI@e{MiS^KEMl%SCqC9Q5(dte4f> z@J!o8jrSdW_z$6X4t3w;7TDh@H+JJ10TIuNmX)ov5}Rcdl_TQ*K9iPFJ6nxH{u^8taSBs8Bg3W zObZt>_qjuq5nYjK12WMEOuh!CM<9!`*LN&>F$kF)4A+N2i>c`2AN+0>@BiXEGC$fE zKXMOxBIAscj2}+ieg}M$abv~QE2*nZ#jLk%365FZF~23aYiL2Yv92xYC7r6p2v=f~ z<=o@35}i*|R};}F-eYGz4-n$tNYvV)mLf3eMpcgK%HEsN*nx}aQ(f_ieDMhNC##n6$qU9> z4`0`@PT8+8jejz?`xo;;o1f(gr^ysXnthvy@h&lKi7AFhuB7q(%aM&hsSWzMyc!0miiPrmyNS|iU}yA*dR z{*Bjs^L%o)f#hrp$MlUI;&#h5fipsGkk@}tU*&7jQ%GHIg$#|wC-X$&-N`@7o*H+? zoyFP*LhW&kKNh){buwv>q>jpcW-_ND-U_k}um4TiXgf@BDZMtUoTl;*u=!oj2m6EQP)@H#dvtPr??;ywyao zZz0~|SoHKLRPT-541pq1=zkOOfxSIZ`kLA$F&)3G7yZ_A!u=!0c~mzpw%_$0%8gz7 zlZXBsi*EN6-q_&wYHPmpANheCr2i3gdx(U~^A?UHYjdFHZfH6H++9GV3rwu{M5uLZ)%2WhUoU@AaP+_;23JyyZfVgf&*( z#1rCRIo@%0ch*yVLHYfx_XM<;dGe*;{NK=_5m>yN)nzCadcbz!4IZYh@SSW_FXaI7 zrH_86evsimEiq+EYAJh9?}C<1wiMG!YmvNKdHc2E+FbIciDC_T*b~Y@@-|h7Te_k1 z-9U^GxH$uP*~J>S!p|1i#Y1S4E3#vT;xZSh;48<_r%;+4t`|AnHsY1~l3tUsW}7v` zGQ>XJ>}xH>y|Ue0ue)^D=jwK9MYS_vkx2{^CDhx*surI3MTtOj`|yOvtf>X^wi@2G z!{1xP+GVxn8h@=rY?XmD6L}C@o7ExoTGYnxEgL>JqMh-pIov$Nb}y`MgzN+T3;pjZ zg0UJ^)DmF$8HxR9=1rb|6AtZ$XSHJ&4ShB}&IWoje@AR^*!hbnIP3bn-wGPTT z=;A@o%4ow|ZD#D$xF`5biN={0&8LuGFfC4mWa6g!pKD^4>3-Mjqpj;F!gsjc?!pCV&tR4&k$o=xyvHT+#dkQNW4(fH{ z=lSTzNM1McDs71DLBEa!bpRW4og7ZL{dNU>F?O*eS-RQ>$N!m7OM4|QlPA0?+KU=+ zc@P*NYjJw96$-gw3tGbsb{OMbEQg*mp{0zWM`8>5pnrd})`4K)Bm75s!j`kxhF3Hi z>>Q+a3Hcr>&xH5#Tx5z3ofe*Cm|~cuug+e+IKgf`Wv{3&2ExNKVlOsV&sc4cd8y0g zSWg(SP%W%1nPgBVn%YkR^yL6OH^<4rCv)$^S!BC`?x*u4w-c^o;yX~A{$O-)SN2%^ ztcA|Qo$r$SYz)uaAtTG-Pd(^2lQrZq+9Krc0XQ-Rt&(@6O#;Ju5sNIr-c~?9?lXfT ztRxm4NP~w(@pEM!eii$p%4QD8JZdvK+)W{t&-Nld-_n|;57YcbFnOA7^o8_BZ@Uv0 z&VY^u#CmLauJQ^xu49ec(6bGU@Fz4|2<@7oZ#Up)6ZGRhW>bMtVnMlRYT4(=ojUR! z=KbUI!cW-xI0|__HLgw=oOr>dkV{qevHq(y)8sk2c5uc8`_*4qp}Ir)fyXczeY%bw zOkzzF@XciZ$7uAdD?Y^wI7aqEsf*6cA%|Q_+aNyaw&^stuCA+tDun#uWi~}vYdYEm zhlf1UT55C1A-<;fx*1wIfLxx;qdJQ<#H{7W>sP^6DCF6Tv0hhZE_FJcxVa{l=o@fI`VgzClnOt!2com zBzwWg*2K!=)wAf=Io5E5u@*qnjf~Ndr*1^@_2g!J_-xq!!~Pre2%h4M1%K{em}>CS zR;Kx+eYO4OUD>+SUY`3@I%hA)?q~4PvbblrzGfD$$*sSlu4cfO8U(gB#j$M(T z{jAX)x$lYWtRgC}&Y0)W0J&G{GnAIT^JQ>l3HnkSt5*}cHg^p6xnr(qn`HTH8xpfR z*2vkRyE*H9f|e>iD_isRP39R|(9=AGS$o41d2irp);El`El2hTu_~F5Zb4q?1o~AH zO!)zl`O|OP3M|@8ovXZhOBoz-?nj_;wxy)`gw-i*L%0hys9xxOJK>A%tgV)%27M0O z^@S&&0t;jx^g8A$@oETmdnS5Z4!>s&Bgq<+CtNftI~d~?zFcMK(o3x7tmz;_Kf}(r zh4CA#f%Z414%XH77v9nM`pclm9i&TOAJ$+q-LUx!d3FX`Ci{P0Ld|(Rc`A~yjh_pX zPdX1$I;blO@$+La1#8+(61JPEL#p<>v57d@f````8eH2%~<}T=XfAmdOIy&LM&BbRJ!0Q%d zbRo2re$!G=>nNz&$SF6^oxa`nrsozv?i~0UXNot8N#X`Ne^PW6_0Y(X==20|)`gye zxxBvMd-5LKwV=Ix9l=-~L5s1B*8`n6g-_8C+>JoLy@|;>i?8Yc_82CJrQ&5s_b|J) zqN5t;Y4-?D50Pgq_tzKH521J6pT4YlqKFs+0_pI@wxU<}kgsJt`y^5@63jS>r7Vvv zy^7QXDx6?Ny?rJ1`upN9@ts>3A8C!WBD(L+l^=#Jt?vR#Ek3NigQMA}0bmYtAUfe&xqY%7-5y-`1uwxKBnv8D$ zP8>NC>8Zl&b7tXBOe{Yy@2l>?zVjiRm$Ajo;W|0Y65fnE8QR;nI(mm>g`NS!ZeZ(< z(0kYdPpP4>6A#GT`U3SBbUVhASFv8{Lr=r5%>WUbvoor@Y^E=NsD7=MCw9@__DxI`DafTen9>wqBpNB{5B}|EZS#@$&S3sT zJgmBC^>HMoC31fSt1}+{j$uA_D7~Ds7^1Wh+9dC_zQ38yTMk*{?L}hR$5wGUWq3?q zO+D?6un;rs#4l(_j?Mj$J-!OSD*Sy|-KN<<*{ zz{~yX@=S^b@O$8oW04n4Rjl(&5f+!wf5PsQn{3WAS`qs%g+|51C8*d`eFBFrBi+)c zljm!0hL&;%u&fWd@YKD;VyVhw#ShQ?5x(u8B2gW#=#&VtOmx%#B;WMbkQQ%CQ0a>b zH21KDP=Anj*EYlVZGddZyWQH5+vzU?n0p}mjt=wsAMs%~_!Uk(uQB@~AgM3$uI$>q zrbOYvzQf;c4Q?!?$9W|^MOoZS>`wp5@3}2<&lp=+40@H)skwwkC-kKU)DE=We9juV@oIZqt;Q4ToiiSF=24aQjJo_;= zd=k?AH)uZu8z6HywOHpAG@uL^BJT=RsH7GZXQ*cOB=#;O?yzsVv|)$l2x}K{$(m`u z=hfLfJ>ajPC9XD?+3d9u+HKb33D$?=L(!jy3?9Os9mRg_$@jnA$O)+AEGn}S6EXN8 zyn_9l_4No_*$&^VlE~FxAV=v(Ze*A)(Pe~7lb^mnA8?*`V{(MWyqo*B${ms0P74rG z$od%09qEqzmK9-OUpoH4Ht6Vs-`D~P4?)Ljvx+pO9rDy4T9wMr6?8#f-YK83gi+vf z7T(H!*5?D}m&llzG1YO-XSONJvc;-63Z<`44+Dq&i7(dU>&f1RKSVUo%%r}!pVdVn zAD!R{C*(s%iB+xnS?1=;@Y$7MRtxOXL4G?FJ=nr;rSEW>_w~5X=9G4^Dttw65 z!&x*b3|W4UC6@WQcTjN~vMzJ?b9wS2xHSyyZ^L@$u*RZb$Ynf-O!~DYHk#?fX^X!0 zW{-9%{kA2OKPDHlF0>ajUA0{GdFIz3w_9#geESWo+ezHO7yXl*?rC(mq3VM#!)ai= zs{$66zD(b*!mv~`WOd8(q^2H6 zZ$TT6BF5Hf&(h?6Jv(=bdTO(@E}ZqH*N)2C6>`tV1d)ZmRz{WmJG((IBeT6lp5_L) zumQep;&0M+ZbM2cf+xq(@N`AS_lJ>>dD!^~&TdK88?=2QNB2PY%Vn5Ly@afUe&$cs zLDrl01Z#IkpzgNLhOeR!+b^Pq+zvVJL~PIxtgI-mfVO7k9XXGA#H4a3{2X}KnsqM6 z(g^a(ud%U7)LCR-2iMogst z`3Haf#-7X0@N5#dFGY%pVg+N>F&x$U{tWz?;d#Wg&l+Q2?zrs}nN=k_Oq-b^_}QL{EQ#E&c$dr6=jJo%sJ`F^yN)z>LEE2ji&*aemsrtjbk$mB|#c7XYZ!-vgilRS%ZBd?Qr z>P|jaSwwV} zC|r*5TOhSRp!Xc4bf>b3{REG=gQXks-o1e3L66vH_SmXAzOc{iJbCl!^hTSgwN=Jz zA1E@RqK-W=N0_w>*w}^@Ix}KveqS^{U)>d7bqsWDgFZ;!)kOCru?%wWdtGvY$H@iC zJ8{jCg`!(quGy9v^UTMB#)RzTo@iNDm_}}Q1@c^;T=5Oi>IZ0k4Sl`_9_)li2a)t? zjClzCD$hEvqXjAG*)P!kG4ipP{83AKa()MgLg`AKFPRZ?_PZqgBeNn97%>`~c+ zFH#R1Q-`tof=l1w&?sbHo`*3OIT_CSMk14a;M-)z9|?U|^KT(CC9A?mv2n6y@nanKY6hFf*@kis{8r?{ zMz2^0kqq?*(d)5EwSe09u`5=%v;&zq51&?`!Salvwa7&!@Z}&nn67*v4|fE7+NJy@ zsIHT1`9MDL8S#Tn>#J=^)uk0NUNw7JI@otQUir+(e45#(*Py{wot&I{_3hrTSKm&5 zx$^VC>2szonmcDQza2cVx596lG;ZNEeNwZ^_2nnKHq-OsZLteP!^# LF1>mCf8Y5ZI16JU literal 0 HcmV?d00001 From 78e25a85c0ff997c220df5d3de6f584e5aaa4297 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Mon, 11 Oct 2021 21:16:39 +0200 Subject: [PATCH 3/3] Notifications Implementation Part 2 --- P3D/Content/Localization/Tokens_en.dat | 4 +- P3D/Content/Textures/Notifications/Boxes.png | Bin 640 -> 0 bytes P3D/Content/Textures/Notifications/Icons.png | Bin 0 -> 1520 bytes P3D/Overworld/NotificationPopup.vb | 177 +++++++++--------- P3D/Overworld/OverworldScreen.vb | 36 ++-- P3D/P3D.vbproj | 2 +- .../ActionScript/V2/ScriptCommands/DoText.vb | 20 +- P3D/World/Level.vb | 9 - 8 files changed, 116 insertions(+), 132 deletions(-) delete mode 100644 P3D/Content/Textures/Notifications/Boxes.png create mode 100644 P3D/Content/Textures/Notifications/Icons.png diff --git a/P3D/Content/Localization/Tokens_en.dat b/P3D/Content/Localization/Tokens_en.dat index 013b0e9d5..7396eca37 100644 --- a/P3D/Content/Localization/Tokens_en.dat +++ b/P3D/Content/Localization/Tokens_en.dat @@ -96,8 +96,8 @@ game_interaction_gamemenu,Game Menu game_interaction_pokegear,Pokégear game_interaction_pausemenu,Pause Menu game_interaction_notification,Notification -game_notification_respond,Press to respond to the notification. -game_notification_dismiss,Press to dismiss the notification. +game_notification_accept,Press to accept. +game_notification_dismiss,Press to dismiss. --- MainMenuScreen: main_menu_continue,Continue diff --git a/P3D/Content/Textures/Notifications/Boxes.png b/P3D/Content/Textures/Notifications/Boxes.png deleted file mode 100644 index 82a4639dea937e267825e7d906c8579e6a4b1f2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 640 zcmeAS@N?(olHy`uVBq!ia0vp^2|(trD;1#J|k}2fb!}TrFhuYf-~ez`FB68JNx2KIfHGD;Kob!T?^Xvzg|;|e``OxUV7h&t19*N*8AONFhuaiE4MJL zXitXxXZsm8oMBgBnV?XAy>7?n zXZ%3#BY*~r1Fw3d9YO%enjr3QSI5xi|KDZ&46aOH>@zlc<-5MP)^zr#{MznF23wWY zOY_e8vn^;(nf8CjOZ(aT<>&sd;M=b9>TLLjpO>qQt^Suzu-8o6$)X+76BT85^~jl@ zQ;LoC85lH@Wp{;Ma+JBgpQ%Br&VIs`ncelm@7O0k=CUZ!w*M(nwKK-2dG#u;I-Wby z@e?1{)fqBW{Rj=6+4Aad@gG&I>*w|P4rKk1Qe?RxQE#7k$4^h}z$$rp?g^{r$E!3v zt!GYV2>SM!5ydZ9I1Nh}&Ry&}0doJ=E583%)cxBXZv3mxsqp9;k%y{ZKX)^E7_zMD o)MuEsqf6_#o}}Ve(Fb#i|Eq7(du#StfEi?>r>mdKI;Vst0NynEa{vGU diff --git a/P3D/Content/Textures/Notifications/Icons.png b/P3D/Content/Textures/Notifications/Icons.png new file mode 100644 index 0000000000000000000000000000000000000000..346bf6057dd6a2206ddd9f54c2acf5e2b2bb8b41 GIT binary patch literal 1520 zcmVYAX9X8WNB|8RBvx=!KdMT000Gh zNklk!;}xPHzxyKsVAYxkk6L!R8KN zP=sXb>C4ad|4nT$&WrtvtS=;4Rh2*>d_w{d0)P+zgcukgDJ3geRaHsS2Sff@@;3sK zQdZnbCMl)!O^{MnRr$y(|Kf_4e>FXMtvDX6$Crl(>(7eGwb$>h=BMw!wp{;DfK)tE zN-p}H5vh1&am6ElB_F5!-|$GeXOaKS+x0ggvI63QM@2*d#08IvhysWU9u<)npspWf zY92m-*yQgCh)e!nfVk9y>RhORSmo~lh*SOm)F(g;^PeBi#CGxmKmY_l07R&}=q*_Q zN_+#<3vcSq@I7ZPK<}0I+q2WxS1&>NX9Z;I0th)@4nX>6Hnl{3u1hXJQp!(oJ{_}q z@j7o7K=lQG{(fov`T70P3sP=C%d0!Fd0dd^Xo#`^l2TgXm>`ia zPR2)=3PuPKgeN~Wxhv7?`z@xMAUr;Rl$#a3^zlK|lz%WF z9Zwq^A4Dku+3IVH=|%`4#NB==7SoNm+b_NAby)$qqUHvOiiZOr(`T$pof?mh$#lHa z`v6ef(uaa57a$#v+Kjg$0-#8MY%Q)jnvUxdP*b>0YXP9hfX?raqAbgk*NURB9@}XN zWSMxj{PpLw753w+`5c7z0U*LRxGYOCpU;I5LTtBNQ4~ekHyD7TA@XU)Cj(@e5^Drx zJGM(eb=}4kDj-{!D%PEMBqjiqq#vjakp2kc2*`GfsUwkkj+}s85wRM|XgbDqG#G$J z49N8YhW;)dVQ~=o-~pf>R-&T}#Tce@gq$z=SXk)P2>^-*h*E`M0mv5w_1pk7&=N>j z-&V2aG9PG2{XnVfK*9WUSn$dz{~PW4|2^9O)+@ytiDLd!%WH4U-@3@A zU>KA|Dv^Jl{ISe0@(;=%3ymYf9?bxR03ZYaApi&gKnMf?Api)`dqC)j>o)(@@q$(U zx0nBD`-SaxJ66(Xvl(e9;D%Yrx+d&*wmM!^wj0(}*m5!srq+07vl)xz)qMImn%%VD zR@05*QVOa0=!mRO?B4&Hy$2nRDva4giG*3qbnz1$EfAF=)G}rt_K31waD_L`6i!2tWe?q=$;2 zX*(xVH2rQ@fcnx8X1t0(lsuKawh@0_E9gYA5K%|Pa8k9;k0F4|_XpjL3ffdSPh0h9Qy#}P-G%lem zc;&U ''' Sets the values of the NotificationPopup and displays it on the screen. @@ -28,14 +30,21 @@ Public Class NotificationPopup Public Sub Setup(Text As String, Optional Delay As Integer = 500, Optional BackgroundIndex As Integer = 0, Optional IconIndex As Integer = 0, Optional SoundEffect As String = "", Optional ScriptFile As String = "") _text = Text - If Delay <= 0 Then - _waitForInput = True - _delay = Date.Now + If Delay <> -1 Then + If Delay = 0 Then + _waitForInput = True + End If + _delay = Delay Else - _delay = Date.Now.AddMilliseconds(CDbl(Delay * 10)) + _delay = 500 + End If + + If BackgroundIndex <> -1 Then + _backgroundIndex = New Vector2(BackgroundIndex, 0) + Else + _backgroundIndex = New Vector2(0, 0) End If - _backgroundIndex = New Vector2(BackgroundIndex, 0) While _backgroundIndex.X >= 3 _backgroundIndex.X -= 3 _backgroundIndex.Y += 1 @@ -43,16 +52,19 @@ Public Class NotificationPopup If _backgroundIndex.X < 0 Then _backgroundIndex.X = 0 End If - FrameSizeBack = CInt(TextureManager.GetTexture(GameModeManager.ActiveGameMode.ContentPath & "Textures\Notifications\Backgrounds").Width / 3) - _background = TextureManager.GetTexture(GameModeManager.ActiveGameMode.ContentPath & "Textures\Notifications\Backgrounds", New Rectangle(CInt(_backgroundIndex.X * FrameSizeBack), CInt(_backgroundIndex.Y * FrameSizeBack), FrameSizeBack, FrameSizeBack)) - _positionY = CInt(0 - _size.Height * (FrameSizeBack / 3) - 12) + Dim BackTexture As Texture2D = TextureManager.GetTexture("Textures\Notifications\Backgrounds") + FrameSizeBack = CInt(BackTexture.Width / 3) + _background = TextureManager.GetTexture(BackTexture, New Rectangle(CInt(_backgroundIndex.X * FrameSizeBack), CInt(_backgroundIndex.Y * FrameSizeBack), FrameSizeBack, FrameSizeBack)) - FramesizeBox = CInt(TextureManager.GetTexture(GameModeManager.ActiveGameMode.ContentPath & "Textures\Notifications\Boxes").Width / 3) - _box = TextureManager.GetTexture(GameModeManager.ActiveGameMode.ContentPath & "Textures\Notifications\Backgrounds", New Rectangle(CInt(_backgroundIndex.X * FramesizeBox), CInt(_backgroundIndex.Y * FramesizeBox), FramesizeBox, FramesizeBox)) + _positionY = CInt(0 - _size.Height * (FrameSizeBack / 3) * _scale - 12) + + If IconIndex <> -1 Then + _iconIndex = New Vector2(IconIndex, 0) + Else + _iconIndex = New Vector2(0, 0) + End If - FramesizeIcon = CInt(TextureManager.GetTexture(GameModeManager.ActiveGameMode.ContentPath & "Textures\Notifications\Icons").Width / 3) - _iconIndex = New Vector2(IconIndex, 0) While _iconIndex.X >= 3 _iconIndex.X -= 3 _iconIndex.Y += 1 @@ -60,27 +72,14 @@ Public Class NotificationPopup If _iconIndex.X < 0 Then _iconIndex.X = 0 End If - _icon = TextureManager.GetTexture(GameModeManager.ActiveGameMode.ContentPath & "Textures\Notifications\Icons", New Rectangle(CInt(_iconIndex.X * FramesizeIcon), CInt(_iconIndex.Y * FramesizeIcon), FramesizeIcon, FramesizeIcon)) + + Dim IconTexture As Texture2D = TextureManager.GetTexture("Textures\Notifications\Icons") + FramesizeIcon = CInt(IconTexture.Width / 3) + _icon = TextureManager.GetTexture(IconTexture, New Rectangle(CInt(_iconIndex.X * FramesizeIcon), CInt(_iconIndex.Y * FramesizeIcon), FramesizeIcon, FramesizeIcon)) _scriptFile = ScriptFile - If Me._scriptFile <> "" Then - Me._text &= "~[" & Localization.GetString("game_notification_respond") & "]" - Else - Me._text &= "~[" & Localization.GetString("game_notification_dismiss") & "]" - End If - _soundEffect = SoundEffect - _show = True - End Sub - - ''' - ''' Execute the specified script - ''' - Public Sub Accept() - CType(Core.CurrentScreen, OverworldScreen).ActionScript.StartScript(_scriptFile, 0, False) - Me._waitForInput = False - Me._delay = Date.Now End Sub ''' @@ -88,16 +87,21 @@ Public Class NotificationPopup ''' Public Sub Dismiss() Me._waitForInput = False - Me._delay = Date.Now + Me._delayDate = Date.Now End Sub ''' ''' Update the NotificationPopup. ''' Public Sub Update() - If Date.Now < Me._delay Then + If _started = False Then + _delayDate = Date.Now.AddMilliseconds(CDbl(_delay * 10)) + _started = True + End If + + If _waitForInput = True Then If Me._positionY < 5.0F Then - Me._positionY += CInt(0.7 * (FrameSizeBack / _size.Height)) + Me._positionY += CInt(0.7 * (FrameSizeBack / 3 * _scale) / _size.Height) Else If _soundEffect IsNot "" Then SoundManager.PlaySound("Notifications\" & _soundEffect) @@ -105,19 +109,27 @@ Public Class NotificationPopup End If End If Else - If _waitForInput = False Then - Dim BackY As Integer = CInt(0 - _size.Height * FrameSizeBack - 12) - If Me._positionY > BackY Then - Me._positionY -= CInt(0.7 * (FrameSizeBack / _size.Height)) - If Me._positionY <= BackY Then - Me._positionY = BackY - Me._show = False + If Date.Now < _delayDate Then + If Me._positionY < 5.0F Then + Me._positionY += CInt(0.7 * (FrameSizeBack / 3 * _scale) / _size.Height) + Else + If _soundEffect IsNot "" Then + SoundManager.PlaySound("Notifications\" & _soundEffect) + _soundEffect = "" End If End If Else If Me._scriptFile <> "" Then CType(Core.CurrentScreen, OverworldScreen).ActionScript.StartScript(Me._scriptFile, 0, False) - Me._waitForInput = False + Me.IsReady = True + End If + Dim BackY As Integer = CInt(0 - _size.Height * (FrameSizeBack / 3) * _scale - (FrameSizeBack / 3 * _scale) - 5) + If Me._positionY > BackY Then + Me._positionY -= CInt(0.7 * (FrameSizeBack / 3 * _scale) / _size.Height) + If Me._positionY <= BackY Then + Me._positionY = BackY + Me.IsReady = True + End If End If End If End If @@ -127,50 +139,45 @@ Public Class NotificationPopup ''' Renders the NotificationPopup. ''' Public Sub Draw() - If Me._show = True Then - Dim TextBody As String = "" - Dim TextHeader As String - Dim Scale As Double = SpriteBatch.InterfaceScale() * 2 + Dim TextHeader As String = _text.GetSplit(0, "*").Replace(CChar("~"), Environment.NewLine).CropStringToWidth(FontManager.InGameFont, CInt(_scale), CInt((_size.Width * (FrameSizeBack / 3) - FrameSizeBack / 3 * 4) * _scale)) + Dim TextBody As String = _text.GetSplit(1, "*").Replace(CChar("~"), Environment.NewLine) - If _text.Contains("*") Then - TextHeader = _text.GetSplit(0, "*").Replace(CChar("~"), Environment.NewLine) - TextBody = _text.GetSplit(1, "*").Replace(CChar("~"), Environment.NewLine) + + While FontManager.InGameFont.MeasureString(TextHeader).Y * 2 + FontManager.InGameFont.MeasureString(TextBody).Y > CInt(((_size.Height * FrameSizeBack / 3) - FrameSizeBack / 3) * _scale - 5) + _size.Height += 1 + End While + + Dim BackGroundOffsetX As Integer = CInt(Core.windowSize.Width - (_size.Width * (FrameSizeBack / 3) * _scale) - (FrameSizeBack / 3) * 2 - 5) + + 'Draw the frame. + Canvas.DrawImageBorder(_background, CInt(_scale), New Rectangle(BackGroundOffsetX, CInt(Me._positionY), CInt(_size.Width * (FrameSizeBack / 3) * _scale), CInt(_size.Height * (FrameSizeBack / 3) * _scale))) + + 'Draw the icon. + Core.SpriteBatch.DrawInterface(_icon, New Rectangle(CInt(BackGroundOffsetX + (FrameSizeBack / 3 + 3) * _scale - _icon.Width / 3), CInt(Me._positionY + ((FrameSizeBack / 3 * _size.Height / 2) - FrameSizeBack / 3 * 0.5) * _scale - _icon.Width / 3), CInt(_icon.Width * _scale), CInt(_icon.Height * _scale)), Color.White) + + Dim TextOffset = CInt(BackGroundOffsetX + FrameSizeBack / 3 * _scale * 4) + If TextBody <> "" Then + If TextHeader <> "" Then + 'Draw the header, then the body + Core.SpriteBatch.DrawString(FontManager.InGameFont, TextHeader.CropStringToWidth(FontManager.InGameFont, CInt(_scale), CInt((_size.Width * (FrameSizeBack / 3) - FrameSizeBack / 3 * 4) * _scale)), New Vector2(TextOffset, CInt(Me._positionY + FrameSizeBack / 3)), Color.Black, 0.0F, Vector2.Zero, CSng(_scale), SpriteEffects.None, 0.0F) + Core.SpriteBatch.DrawString(FontManager.InGameFont, TextBody.CropStringToWidth(FontManager.InGameFont, CInt(_scale / 2), CInt((_size.Width * (FrameSizeBack / 3) - FrameSizeBack / 3 * 4) * _scale)), New Vector2(TextOffset, CInt(Me._positionY + FrameSizeBack / 3 + (FontManager.InGameFont.MeasureString(TextHeader).Y * _scale))), Color.Black, 0.0F, Vector2.Zero, CSng(_scale / 2), SpriteEffects.None, 0.0F) Else - TextHeader = _text.Replace(CChar("~"), Environment.NewLine) - End If - - While FontManager.InGameFont.MeasureString(_text.Replace(CChar("~"), Environment.NewLine)).Y > CInt(_size.Height * FrameSizeBack - 2 * FrameSizeBack) - _size.Height += 1 - End While - - Dim BackGroundOffsetX As Integer = CInt(Core.windowSize.Width - _size.Width * FrameSizeBack - 5) - Dim TextOffset As Integer - - 'Draw the frame. - Canvas.DrawImageBorder(_background, CInt(Scale), New Rectangle(BackGroundOffsetX, CInt(Me._positionY), CInt(_size.Width * FrameSizeBack), CInt(_size.Height * FrameSizeBack)), True) - - 'Draw the (icon) box. - Core.SpriteBatch.DrawInterface(_box, New Rectangle(CInt(FramesizeBox * Scale + 5), CInt(FramesizeBox * Scale + Me._positionY), CInt(_box.Width * Scale), CInt(_box.Height * Scale)), Color.White) - - 'Draw the icon. - Core.SpriteBatch.DrawInterface(_icon, New Rectangle(CInt(FramesizeIcon * Scale + 5), CInt(FramesizeIcon * Scale + Me._positionY), CInt(_icon.Width * Scale), CInt(_icon.Height * Scale)), Color.White) - - TextOffset = CInt(FrameSizeBack * Scale + BackGroundOffsetX * Scale) - - If TextBody <> "" Then - If TextHeader <> "" Then - 'Draw the header, then the body - Core.SpriteBatch.DrawInterfaceString(FontManager.InGameFont, TextBody.CropStringToWidth(FontManager.InGameFont, CInt(Scale), CInt(_size.Width * FrameSizeBack - FrameSizeBack * 4)), New Vector2(TextOffset, CInt(Me._positionY + FrameSizeBack)), Color.Black) - Core.SpriteBatch.DrawInterfaceString(FontManager.InGameFont, TextHeader.CropStringToWidth(FontManager.InGameFont, CInt(Scale / 2), CInt(_size.Width * FrameSizeBack - FrameSizeBack * 4)), New Vector2(TextOffset, CInt(Me._positionY + FrameSizeBack + FontManager.InGameFont.MeasureString(TextHeader).Y)), Color.Black) - Else - 'Just draw the body - Core.SpriteBatch.DrawInterfaceString(FontManager.InGameFont, TextBody.CropStringToWidth(FontManager.InGameFont, CInt(Scale / 2), CInt(_size.Width * FrameSizeBack - FrameSizeBack * 4)), New Vector2(TextOffset, CInt(Me._positionY + FrameSizeBack)), Color.Black) - End If - Else - 'Just draw the header - Core.SpriteBatch.DrawInterfaceString(FontManager.InGameFont, TextHeader.CropStringToWidth(FontManager.InGameFont, CInt(Scale), CInt(_size.Width * FrameSizeBack) - FrameSizeBack * 4), New Vector2(TextOffset, CInt(Me._positionY + FrameSizeBack)), Color.Black) + 'Just draw the body + Core.SpriteBatch.DrawString(FontManager.InGameFont, TextBody.CropStringToWidth(FontManager.InGameFont, CInt(_scale / 2), CInt((_size.Width * (FrameSizeBack / 3) - FrameSizeBack / 3 * 4) * _scale)), New Vector2(TextOffset, CInt(Me._positionY + FrameSizeBack / 3)), Color.Black, 0.0F, Vector2.Zero, CSng(_scale / 2), SpriteEffects.None, 0.0F) End If + Else + 'Just draw the header + Core.SpriteBatch.DrawString(FontManager.InGameFont, TextHeader.CropStringToWidth(FontManager.InGameFont, CInt(_scale), CInt((_size.Width * (FrameSizeBack / 3) - FrameSizeBack / 3 * 4) * _scale)), New Vector2(TextOffset, CInt(Me._positionY + FrameSizeBack / 3)), Color.Black, 0.0F, Vector2.Zero, CSng(_scale), SpriteEffects.None, 0.0F) End If + + Dim InteractText As String = "[" & Localization.GetString("game_notification_dismiss") & "]" + If Me._scriptFile <> "" Then + InteractText = "[" & Localization.GetString("game_notification_accept") & "]" + End If + Dim InteractOffset As Vector2 = New Vector2(CInt(Core.windowSize.Width - FrameSizeBack / 3 * _scale - FontManager.InGameFont.MeasureString(InteractText).X * _scale / 2), CInt(Me._positionY + _size.Height * (FrameSizeBack / 3) * _scale + 5)) + + Core.SpriteBatch.DrawInterface(_background, New Rectangle(CInt(InteractOffset.X), CInt(InteractOffset.Y), CInt(FontManager.InGameFont.MeasureString(InteractText).X * _scale / 2), CInt(FontManager.InGameFont.MeasureString(InteractText).Y * _scale / 2)), New Rectangle(CInt(FrameSizeBack / 3), CInt(FrameSizeBack / 3), CInt(FrameSizeBack / 3), CInt(FrameSizeBack / 3)), Color.White) + Core.SpriteBatch.DrawString(FontManager.InGameFont, InteractText, New Vector2(CInt(InteractOffset.X), CInt(InteractOffset.Y)), Color.Black) End Sub End Class \ No newline at end of file diff --git a/P3D/Overworld/OverworldScreen.vb b/P3D/Overworld/OverworldScreen.vb index 931ac8a86..99e624e6b 100644 --- a/P3D/Overworld/OverworldScreen.vb +++ b/P3D/Overworld/OverworldScreen.vb @@ -12,7 +12,8 @@ Public Class OverworldScreen Private Shared _fadeColor As Color = Color.Black 'Fade screen color. Private Shared _fadeValue As Integer = 0 'Fade progress value for the screen fade. Private Shared _drawRodID As Integer = -1 'The rod ID to display on the screen during the fishing animation. - Public NotificationPopupList As List(Of NotificationPopup) = Nothing + Public NotificationPopupList As List(Of NotificationPopup) = New List(Of NotificationPopup) + Private _actionScript As ActionScript 'Private ActionScript instance. Private _particlesTexture As Texture2D 'A texture field to contain the particles texture, currently only used for the crosshair. @@ -27,7 +28,6 @@ Public Class OverworldScreen #End Region #Region "Properties" - ''' ''' Array of Title objects to be rendered on the screen. ''' @@ -189,14 +189,11 @@ Public Class OverworldScreen PokemonImageView.Update() End If - If Level.NotificationPopup IsNot Nothing Then - Level.NotificationPopup.Update() - If Level.NotificationPopup._show = False Then - Level.NotificationPopup = Nothing + If NotificationPopupList.Count > 0 Then + NotificationPopupList(0).Update() + If NotificationPopupList(0).IsReady = True Then + NotificationPopupList.Remove(NotificationPopupList(0)) End If - ElseIf NotificationPopupList.Count > 0 Then - Level.NotificationPopup = NotificationPopupList(0) - NotificationPopupList.RemoveAt(0) End If 'Middle click/Thumbstick press: Show first Pokémon in party. @@ -235,18 +232,14 @@ Public Class OverworldScreen 'Open the PokégearScreen: If KeyBoardHandler.KeyPressed(KeyBindings.SpecialKey) = True Or ControllerHandler.ButtonPressed(Buttons.Y) = True Then - If Level.NotificationPopup Is Nothing Then + If NotificationPopupList.Count > 0 Then + NotificationPopupList(0).Dismiss() + Else If Core.Player.HasPokegear = True Or GameController.IS_DEBUG_ACTIVE = True Or Core.Player.SandBoxMode = True Then If Screen.Camera.IsMoving() = False And ActionScript.IsReady = True Then Core.SetScreen(New GameJolt.PokegearScreen(Me, GameJolt.PokegearScreen.EntryModes.MainMenu, {})) End If End If - Else - If Level.NotificationPopup._scriptFile <> "" Then - Level.NotificationPopup.Accept() - Else - Level.NotificationPopup.Dismiss() - End If End If End If ActionScript.Update() 'Update the action script. @@ -359,19 +352,16 @@ Public Class OverworldScreen Level.RouteSign.Draw() - If Level.NotificationPopup IsNot Nothing Then - Level.NotificationPopup.Draw() + If NotificationPopupList.Count > 0 Then + NotificationPopupList(0).Draw() End If 'If the XBOX render control delay is 0, render the controls. If ShowControlsDelay = 0.0F Then Dim d As New Dictionary(Of Buttons, String) - If Level.NotificationPopup IsNot Nothing Then - If Level.NotificationPopup._scriptFile <> "" Then - d.Add(Buttons.A, Localization.GetString("game_interaction_notification", "Notification")) - Else - End If + If NotificationPopupList.Count > 0 Then + d.Add(Buttons.A, Localization.GetString("game_interaction_notification", "Notification")) Else d.Add(Buttons.A, Localization.GetString("game_interaction_interact", "Interact")) End If diff --git a/P3D/P3D.vbproj b/P3D/P3D.vbproj index 93c73bafe..703e0a2d1 100644 --- a/P3D/P3D.vbproj +++ b/P3D/P3D.vbproj @@ -15583,7 +15583,7 @@ PreserveNewest - + PreserveNewest diff --git a/P3D/World/ActionScript/V2/ScriptCommands/DoText.vb b/P3D/World/ActionScript/V2/ScriptCommands/DoText.vb index e7823b0a5..5ee43ee09 100644 --- a/P3D/World/ActionScript/V2/ScriptCommands/DoText.vb +++ b/P3D/World/ActionScript/V2/ScriptCommands/DoText.vb @@ -16,26 +16,22 @@ Dim args As String() = argument.Split(CChar(",")) Select Case args.Length Case 1 - _NotificationPopup.Setup(args(0)) + _NotificationPopup.Setup(argument) Case 2 - _NotificationPopup.Setup(args(0), CInt(args(1))) + _NotificationPopup.Setup(args(0), int(args(1))) Case 3 - _NotificationPopup.Setup(args(0), CInt(args(1)), CInt(args(2))) + _NotificationPopup.Setup(args(0), int(args(1)), int(args(2))) Case 4 - _NotificationPopup.Setup(args(0), CInt(args(1)), CInt(args(2)), CInt(args(3))) + _NotificationPopup.Setup(args(0), int(args(1)), int(args(2)), int(args(3))) Case 5 - _NotificationPopup.Setup(args(0), CInt(args(1)), CInt(args(2)), CInt(args(3)), args(4)) + _NotificationPopup.Setup(args(0), int(args(1)), int(args(2)), int(args(3)), args(4)) Case 6, 7 - _NotificationPopup.Setup(args(0), CInt(args(1)), CInt(args(2)), CInt(args(3)), args(4), args(5)) + _NotificationPopup.Setup(args(0), int(args(1)), int(args(2)), int(args(3)), args(4), args(5)) End Select If args.Length = 7 AndAlso CBool(args(6)) = True Then CType(CurrentScreen, OverworldScreen).NotificationPopupList.Insert(0, _NotificationPopup) - If Screen.Level.NotificationPopup IsNot Nothing Then - CType(CurrentScreen, OverworldScreen).NotificationPopupList.Insert(1, Screen.Level.NotificationPopup) - Screen.Level.NotificationPopup = Nothing - Else - CType(CurrentScreen, OverworldScreen).NotificationPopupList.Add(_NotificationPopup) - End If + Else + CType(CurrentScreen, OverworldScreen).NotificationPopupList.Add(_NotificationPopup) End If Case "show" Screen.TextBox.reDelay = 0.0F diff --git a/P3D/World/Level.vb b/P3D/World/Level.vb index a7dee98b6..75163c553 100644 --- a/P3D/World/Level.vb +++ b/P3D/World/Level.vb @@ -7,7 +7,6 @@ Public Class Level #Region "Fields" Private _routeSign As RouteSign = Nothing - Private _notificationPopup As NotificationPopup = Nothing Private _world As World = Nothing Private _pokemonEncounter As PokemonEncounter = Nothing @@ -99,14 +98,6 @@ Public Class Level Return Me._routeSign End Get End Property - Public Property NotificationPopup() As NotificationPopup - Set(value As NotificationPopup) - Me._notificationPopup = value - End Set - Get - Return Me._notificationPopup - End Get - End Property ''' ''' Indicates whether the player is Surfing.