From 4c24768f0b7d41c85b75820c66f1218668f51b59 Mon Sep 17 00:00:00 2001 From: Mili Date: Sun, 28 Aug 2022 15:58:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=A1=B9=E7=9B=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 366 +++++ FunGame.Core/FunGame.Core.csproj | 15 + FunGame.Core/Interface/ServerInterface.cs | 34 + FunGame.sln | 30 + FunGame/FunGame.csproj | 51 + FunGame/Images/back.jpg | Bin 0 -> 99907 bytes FunGame/Images/exit.png | Bin 0 -> 2065 bytes FunGame/Images/favicon.ico | Bin 0 -> 67646 bytes FunGame/Images/green.png | Bin 0 -> 1708 bytes FunGame/Images/logo.ico | Bin 0 -> 16958 bytes FunGame/Images/min.png | Bin 0 -> 1916 bytes FunGame/Images/red.png | Bin 0 -> 1708 bytes FunGame/Images/send.png | Bin 0 -> 1876 bytes .../Models/Component/ExitButton.Designer.cs | 36 + FunGame/Models/Component/ExitButton.cs | 52 + .../Models/Component/ShowMessage.Designer.cs | 164 +++ FunGame/Models/Component/ShowMessage.cs | 191 +++ FunGame/Models/Component/ShowMessage.resx | 71 + FunGame/Models/Component/TextArea.Designer.cs | 36 + FunGame/Models/Component/TextArea.cs | 100 ++ FunGame/Models/Component/TextArea.resx | 120 ++ .../Component/TransparentRect.Designer.cs | 36 + FunGame/Models/Component/TransparentRect.cs | 123 ++ FunGame/Models/Config/Config.cs | 76 ++ FunGame/Models/Config/Usercfg.cs | 24 + FunGame/Models/Entity/ActiveItem.cs | 18 + FunGame/Models/Entity/ActiveSkill.cs | 29 + FunGame/Models/Entity/Character.cs | 42 + FunGame/Models/Entity/CharacterStatistics.cs | 34 + FunGame/Models/Entity/GameStatistics.cs | 35 + FunGame/Models/Entity/Item.cs | 19 + FunGame/Models/Entity/PassiveItem.cs | 18 + FunGame/Models/Entity/PassiveSkill.cs | 27 + FunGame/Models/Entity/Room.cs | 33 + FunGame/Models/Entity/Skill.cs | 17 + FunGame/Models/Entity/Stock.cs | 23 + FunGame/Models/Entity/User.cs | 44 + FunGame/Models/Entity/UserStatistics.cs | 35 + FunGame/Models/Enum/CommonEnums.cs | 97 ++ FunGame/Models/Enum/SocketEnums.cs | 27 + FunGame/Properties/Resources.Designer.cs | 143 ++ FunGame/Properties/Resources.resx | 145 ++ FunGame/UI/Main/Main.Designer.cs | 644 +++++++++ FunGame/UI/Main/Main.cs | 1176 ++++++++++++++++ FunGame/UI/Main/Main.resx | 1193 +++++++++++++++++ FunGame/UI/Start.cs | 15 + FunGame/Utils/DataHelper/AssemblyHelper.cs | 99 ++ FunGame/Utils/DataHelper/INIHelper.cs | 63 + FunGame/Utils/WebHelper/WebHelper.cs | 368 +++++ LICENSE.txt | 661 +++++++++ README.md | 1 + 51 files changed, 6531 insertions(+) create mode 100644 .gitignore create mode 100644 FunGame.Core/FunGame.Core.csproj create mode 100644 FunGame.Core/Interface/ServerInterface.cs create mode 100644 FunGame.sln create mode 100644 FunGame/FunGame.csproj create mode 100644 FunGame/Images/back.jpg create mode 100644 FunGame/Images/exit.png create mode 100644 FunGame/Images/favicon.ico create mode 100644 FunGame/Images/green.png create mode 100644 FunGame/Images/logo.ico create mode 100644 FunGame/Images/min.png create mode 100644 FunGame/Images/red.png create mode 100644 FunGame/Images/send.png create mode 100644 FunGame/Models/Component/ExitButton.Designer.cs create mode 100644 FunGame/Models/Component/ExitButton.cs create mode 100644 FunGame/Models/Component/ShowMessage.Designer.cs create mode 100644 FunGame/Models/Component/ShowMessage.cs create mode 100644 FunGame/Models/Component/ShowMessage.resx create mode 100644 FunGame/Models/Component/TextArea.Designer.cs create mode 100644 FunGame/Models/Component/TextArea.cs create mode 100644 FunGame/Models/Component/TextArea.resx create mode 100644 FunGame/Models/Component/TransparentRect.Designer.cs create mode 100644 FunGame/Models/Component/TransparentRect.cs create mode 100644 FunGame/Models/Config/Config.cs create mode 100644 FunGame/Models/Config/Usercfg.cs create mode 100644 FunGame/Models/Entity/ActiveItem.cs create mode 100644 FunGame/Models/Entity/ActiveSkill.cs create mode 100644 FunGame/Models/Entity/Character.cs create mode 100644 FunGame/Models/Entity/CharacterStatistics.cs create mode 100644 FunGame/Models/Entity/GameStatistics.cs create mode 100644 FunGame/Models/Entity/Item.cs create mode 100644 FunGame/Models/Entity/PassiveItem.cs create mode 100644 FunGame/Models/Entity/PassiveSkill.cs create mode 100644 FunGame/Models/Entity/Room.cs create mode 100644 FunGame/Models/Entity/Skill.cs create mode 100644 FunGame/Models/Entity/Stock.cs create mode 100644 FunGame/Models/Entity/User.cs create mode 100644 FunGame/Models/Entity/UserStatistics.cs create mode 100644 FunGame/Models/Enum/CommonEnums.cs create mode 100644 FunGame/Models/Enum/SocketEnums.cs create mode 100644 FunGame/Properties/Resources.Designer.cs create mode 100644 FunGame/Properties/Resources.resx create mode 100644 FunGame/UI/Main/Main.Designer.cs create mode 100644 FunGame/UI/Main/Main.cs create mode 100644 FunGame/UI/Main/Main.resx create mode 100644 FunGame/UI/Start.cs create mode 100644 FunGame/Utils/DataHelper/AssemblyHelper.cs create mode 100644 FunGame/Utils/DataHelper/INIHelper.cs create mode 100644 FunGame/Utils/WebHelper/WebHelper.cs create mode 100644 LICENSE.txt create mode 100644 README.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bcf2cce --- /dev/null +++ b/.gitignore @@ -0,0 +1,366 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Oo]ut/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# FunGame Implement +FunGame.Core/Implement/*.cs \ No newline at end of file diff --git a/FunGame.Core/FunGame.Core.csproj b/FunGame.Core/FunGame.Core.csproj new file mode 100644 index 0000000..b8bfeac --- /dev/null +++ b/FunGame.Core/FunGame.Core.csproj @@ -0,0 +1,15 @@ + + + + net6.0-windows + enable + enable + Milimoe + ..\bin + + + + + + + diff --git a/FunGame.Core/Interface/ServerInterface.cs b/FunGame.Core/Interface/ServerInterface.cs new file mode 100644 index 0000000..ce13dcc --- /dev/null +++ b/FunGame.Core/Interface/ServerInterface.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Core.Interface +{ + /** + * 接口需要在FunGame.Core.Implement中创建新的类实现 + * 参考: + * using FunGame.Core.Interface; + + namespace FunGame.Core.Implement + { + public class ServerInterfaceImpl : ServerInterface + { + public string RemoteServerIP() + { + // 此处修改连接远程服务器IP + string serverIP = "127.0.0.1"; + string serverPort = "22222"; + return serverIP + ":" + serverPort; + } + } + } + */ + + public interface ServerInterface + { + // 实现类:ServerInterfaceImpl + public string RemoteServerIP(); + } +} diff --git a/FunGame.sln b/FunGame.sln new file mode 100644 index 0000000..2a2bce1 --- /dev/null +++ b/FunGame.sln @@ -0,0 +1,30 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.3.32804.467 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FunGame", "FunGame\FunGame.csproj", "{BFFCC8D2-DF96-4DD3-81BA-552FAB33495A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FunGame.Core", "FunGame.Core\FunGame.Core.csproj", "{CC6C83C6-5818-4565-8873-67587FED1D0A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {BFFCC8D2-DF96-4DD3-81BA-552FAB33495A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BFFCC8D2-DF96-4DD3-81BA-552FAB33495A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BFFCC8D2-DF96-4DD3-81BA-552FAB33495A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BFFCC8D2-DF96-4DD3-81BA-552FAB33495A}.Release|Any CPU.Build.0 = Release|Any CPU + {CC6C83C6-5818-4565-8873-67587FED1D0A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CC6C83C6-5818-4565-8873-67587FED1D0A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CC6C83C6-5818-4565-8873-67587FED1D0A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CC6C83C6-5818-4565-8873-67587FED1D0A}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {9AD4C55B-5C44-4486-8497-5C5A7A7B299B} + EndGlobalSection +EndGlobal diff --git a/FunGame/FunGame.csproj b/FunGame/FunGame.csproj new file mode 100644 index 0000000..e78eeb2 --- /dev/null +++ b/FunGame/FunGame.csproj @@ -0,0 +1,51 @@ + + + + WinExe + net6.0-windows + enable + true + enable + Images\logo.ico + + logo.ico + Milimoe + ..\bin + + + + + + + + + True + True + Resources.resx + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + + + + + + + + + + + True + \ + + + + \ No newline at end of file diff --git a/FunGame/Images/back.jpg b/FunGame/Images/back.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2bbc4dfbd878e114674cd62e3021bd56b9611171 GIT binary patch literal 99907 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%0AQ*_xWA>0eZ=@(Y*P9! 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

-=Ci6={Z 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 literal 0 HcmV?d00001 diff --git a/FunGame/Images/exit.png b/FunGame/Images/exit.png new file mode 100644 index 0000000000000000000000000000000000000000..f4fb70c664db1e6441fbe94c5056e1005018e261 GIT binary patch literal 2065 zcmcIle{9rL94}xH(M16xuxMyHGgR!gz20@#x^rxI8+XZWjO_wrLE&Bd?ylRlue9CW zZTN=}G$W!hpaJy{f0BqH1R-D)aFLBUkQh`VN^}S=Fh~>^f8dV25RpH!|vfFCX z1Tht<(Kfp+(kRJDa{&d#pew5x7)=n>HCY45ozNy@Frn&x>eBu`ic}Rpwagn~BSruw z)liQKTYH+Ka!;o$Dpbv*WOY`;1RAsfnblIdC1w3oj#t8Mr<DJ`SYCLTbhDhuus(+4X_k{%LGo6Sg^R+`OeHS01RDym@Ry%T z+O{DvOeT|YWq21d6AUMcn8VGu-84qfR<~}0EUjA=MTQ`>WK%V473rkI2x6$q_ET7C zJ_XGv(dt&AOt@f778nfYVx5$Vz)0lgP)#eLExSIAqZIUBm)MGS8<1&%7V0u(Sf7Tv zT~Q2XB$17*B)WmN((h{&Dsm~H(PgG`c(F6&~(Y=$Ox=&^}g>Y3TOEd9RljL~m7*ZLz81 zl><^&vpT92%qV*}nd1bOuJXn>n&&-`1}ucM%nMZ@?h$>W04Q=iZUCi_89@rJE>=6< z9}WbXO%zvC_=nZ9sE!QR2Lw(O1lsN5C{mH7I5IVWjizcK0U1M2IJUpjtx9k;)IXvaG%%C?$6s`s`(b$=dPVL&ay0QPUQMvrXchQ_LU%czmU}gWso&~S5 z<%7}hx7)|=>`#Y!FH-|+W}H1Z+J0bU)}Cz_zG+ZK4!yEx)B28%(MPQG=!wB;)mzrx z@*9j@`E=g1<=gjmpZuh9V9nU#foB?fN0$?mTLzBq5YftW=RRm(|Nh$3l~-oZJbQ53 z*yHQ7Ox=Om?>#ZIZ!$XEcIvCsFZZ2j8s0Z|j6w}phISw68(4F;^K1La{8#rcyZGne RA3^8P4%asYch;?1_YY_^%XI(% literal 0 HcmV?d00001 diff --git a/FunGame/Images/favicon.ico b/FunGame/Images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..25a4c9048b0d2b93656355fec18e50ea2f5123eb GIT binary patch literal 67646 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 literal 0 HcmV?d00001 diff --git a/FunGame/Images/green.png b/FunGame/Images/green.png new file mode 100644 index 0000000000000000000000000000000000000000..4f3b032db5d8a6a78af55a607c540606b8a83df0 GIT binary patch literal 1708 zcmcIl&u`pB6gG!Mp&^I^hpG~lH8HL*R$ z_GULZ0YX3zy&wb!E~vm2i32ANR9xUdZb1U$AGHJY)Ns_i&JWq_i+BlM=g@-|V zKi~JSdsIXkVWPveQIr5$lCErw5<(AoE_Zk@h%3q;-+iyh0jnr`mXG|T%KJg%B;~s& z+iiMsNL{9EtjkwM9uP!4C-Nu?G@LwVnC$yJeZ+0ty4 z;*ukmT@BkMWZG-8fv~G1N5`g$u!n5VD$CPL0dFbmdONkNQ(y2^QTlnFc)C6u4z;1F ziL|F<*98tkHw+aJYIYpwWTeK~>WrbrGnxiT9*9^j7)eJA@`?gVCm}@1oHov;X@Z35 zBa-M?Lq$k4pzogzjiNa^%j-wrWvcg)#98||;rb5G#2}@-e#GN^b>@uGxot8?!*QgH z>OABTz%meq=dO~z$VJu{kBMWxJdY;vswpSANZUe$vyE!aSY!jDmS5ZpVkU;!ONFAT z0k4sqR}=$5u92f+vuz;HaNvF!IUYh2s1J3(NKVcN7A)ue5>wu+RTL1V z1p)I6W+IEbrs_HrtF~EUs$-ZKO3g$aifv9Y8S4W3nxKOseTDs`Y?+|IG0%{P%OygI zVX7D*Tg7h4Qi+QV)#z{wQP(vL%4Tdg(g02l2~V>Ysu(ajCN;4Isya3;sf3oW+9`Lj zYFNl}%B<{C4%uSV>xwiYP$xk|dR$N9o+AIFrYb^_`hr2u&C~PEYPFS$ZV)W-jw{E@r EH`o0Vs{jB1 literal 0 HcmV?d00001 diff --git a/FunGame/Images/logo.ico b/FunGame/Images/logo.ico new file mode 100644 index 0000000000000000000000000000000000000000..4082874accbeb80cd336bcb14ff9004ad35920ff GIT binary patch literal 16958 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 literal 0 HcmV?d00001 diff --git a/FunGame/Images/min.png b/FunGame/Images/min.png new file mode 100644 index 0000000000000000000000000000000000000000..864c84f39bca64c0a142bde2c30fe44a8782cba9 GIT binary patch literal 1916 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 BbDRJG literal 0 HcmV?d00001 diff --git a/FunGame/Models/Component/ExitButton.Designer.cs b/FunGame/Models/Component/ExitButton.Designer.cs new file mode 100644 index 0000000..25cafce --- /dev/null +++ b/FunGame/Models/Component/ExitButton.Designer.cs @@ -0,0 +1,36 @@ +namespace FunGame.Models.Component +{ + partial class ExitButton + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/FunGame/Models/Component/ExitButton.cs b/FunGame/Models/Component/ExitButton.cs new file mode 100644 index 0000000..75862cf --- /dev/null +++ b/FunGame/Models/Component/ExitButton.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Models.Component +{ + public partial class ExitButton : Button + { + public ExitButton() + { + InitializeComponent(); + Anchor = System.Windows.Forms.AnchorStyles.None; + BackColor = System.Drawing.Color.White; + BackgroundImage = global::FunGame.Properties.Resources.exit; + FlatAppearance.BorderColor = System.Drawing.Color.White; + FlatAppearance.BorderSize = 0; + FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(128))))); + FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(192))))); + FlatStyle = System.Windows.Forms.FlatStyle.Flat; + Font = new System.Drawing.Font("LanaPixel", 36F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point); + ForeColor = System.Drawing.Color.Red; + Location = new System.Drawing.Point(750, 3); + Size = new System.Drawing.Size(47, 47); + TextAlign = System.Drawing.ContentAlignment.TopLeft; + UseVisualStyleBackColor = false; + } + + public ExitButton(IContainer container) + { + container.Add(this); + InitializeComponent(); + Anchor = System.Windows.Forms.AnchorStyles.None; + BackColor = System.Drawing.Color.White; + BackgroundImage = global::FunGame.Properties.Resources.exit; + FlatAppearance.BorderColor = System.Drawing.Color.White; + FlatAppearance.BorderSize = 0; + FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(128))))); + FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(192))))); + FlatStyle = System.Windows.Forms.FlatStyle.Flat; + Font = new System.Drawing.Font("LanaPixel", 36F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point); + ForeColor = System.Drawing.Color.Red; + Location = new System.Drawing.Point(750, 3); + Size = new System.Drawing.Size(47, 47); + TextAlign = System.Drawing.ContentAlignment.TopLeft; + UseVisualStyleBackColor = false; + } + } +} diff --git a/FunGame/Models/Component/ShowMessage.Designer.cs b/FunGame/Models/Component/ShowMessage.Designer.cs new file mode 100644 index 0000000..ebfa044 --- /dev/null +++ b/FunGame/Models/Component/ShowMessage.Designer.cs @@ -0,0 +1,164 @@ +namespace FunGame.Models.Component +{ + partial class ShowMessage + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ShowMessage)); + this.MsgText = new System.Windows.Forms.Label(); + this.LeftButton = new System.Windows.Forms.Button(); + this.Exit = new FunGame.Models.Component.ExitButton(this.components); + this.RightButton = new System.Windows.Forms.Button(); + this.MidButton = new System.Windows.Forms.Button(); + this.Title = new System.Windows.Forms.Label(); + this.TransparentRect = new FunGame.Models.TransparentRect(); + this.TransparentRect.SuspendLayout(); + this.SuspendLayout(); + // + // MsgText + // + this.MsgText.BackColor = System.Drawing.Color.Transparent; + this.MsgText.Font = new System.Drawing.Font("LanaPixel", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.MsgText.Location = new System.Drawing.Point(2, 51); + this.MsgText.Name = "MsgText"; + this.MsgText.Size = new System.Drawing.Size(232, 73); + this.MsgText.TabIndex = 100; + this.MsgText.Text = "Message"; + this.MsgText.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // LeftButton + // + this.LeftButton.Font = new System.Drawing.Font("LanaPixel", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point); + this.LeftButton.Location = new System.Drawing.Point(13, 127); + this.LeftButton.Name = "LeftButton"; + this.LeftButton.Size = new System.Drawing.Size(98, 37); + this.LeftButton.TabIndex = 98; + this.LeftButton.Text = "Left"; + this.LeftButton.UseVisualStyleBackColor = true; + this.LeftButton.Click += new System.EventHandler(this.LeftButton_Click); + // + // Exit + // + this.Exit.Anchor = System.Windows.Forms.AnchorStyles.None; + this.Exit.BackColor = System.Drawing.Color.White; + this.Exit.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("Exit.BackgroundImage"))); + this.Exit.FlatAppearance.BorderColor = System.Drawing.Color.White; + this.Exit.FlatAppearance.BorderSize = 0; + this.Exit.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(128))))); + this.Exit.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(192))))); + this.Exit.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.Exit.Font = new System.Drawing.Font("LanaPixel", 36F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point); + this.Exit.ForeColor = System.Drawing.Color.Red; + this.Exit.Location = new System.Drawing.Point(187, 1); + this.Exit.Name = "Exit"; + this.Exit.Size = new System.Drawing.Size(47, 47); + this.Exit.TabIndex = 15; + this.Exit.TextAlign = System.Drawing.ContentAlignment.TopLeft; + this.Exit.UseVisualStyleBackColor = false; + this.Exit.Click += new System.EventHandler(this.Exit_Click); + // + // RightButton + // + this.RightButton.Font = new System.Drawing.Font("LanaPixel", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point); + this.RightButton.Location = new System.Drawing.Point(125, 127); + this.RightButton.Name = "RightButton"; + this.RightButton.Size = new System.Drawing.Size(98, 37); + this.RightButton.TabIndex = 101; + this.RightButton.Text = "Right"; + this.RightButton.UseVisualStyleBackColor = true; + this.RightButton.Click += new System.EventHandler(this.RightButton_Click); + // + // MidButton + // + this.MidButton.Font = new System.Drawing.Font("LanaPixel", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point); + this.MidButton.Location = new System.Drawing.Point(65, 127); + this.MidButton.Name = "MidButton"; + this.MidButton.Size = new System.Drawing.Size(98, 37); + this.MidButton.TabIndex = 102; + this.MidButton.Text = "Middle"; + this.MidButton.UseVisualStyleBackColor = true; + this.MidButton.Click += new System.EventHandler(this.MidButton_Click); + // + // Title + // + this.Title.BackColor = System.Drawing.Color.Transparent; + this.Title.Font = new System.Drawing.Font("LanaPixel", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point); + this.Title.Location = new System.Drawing.Point(2, 1); + this.Title.Name = "Title"; + this.Title.Size = new System.Drawing.Size(179, 47); + this.Title.TabIndex = 97; + this.Title.Text = "Message"; + this.Title.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // TransparentRect + // + this.TransparentRect.BackColor = System.Drawing.Color.WhiteSmoke; + this.TransparentRect.BorderColor = System.Drawing.Color.WhiteSmoke; + this.TransparentRect.Controls.Add(this.Title); + this.TransparentRect.Controls.Add(this.MidButton); + this.TransparentRect.Controls.Add(this.RightButton); + this.TransparentRect.Controls.Add(this.Exit); + this.TransparentRect.Controls.Add(this.LeftButton); + this.TransparentRect.Controls.Add(this.MsgText); + this.TransparentRect.Location = new System.Drawing.Point(0, 0); + this.TransparentRect.Name = "TransparentRect"; + this.TransparentRect.Opacity = 125; + this.TransparentRect.Radius = 20; + this.TransparentRect.ShapeBorderStyle = FunGame.Models.TransparentRect.ShapeBorderStyles.ShapeBSNone; + this.TransparentRect.Size = new System.Drawing.Size(235, 170); + this.TransparentRect.TabIndex = 103; + this.TransparentRect.TabStop = false; + this.TransparentRect.Text = "transparentRect1"; + // + // ShowMessage + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.WhiteSmoke; + this.ClientSize = new System.Drawing.Size(235, 170); + this.Controls.Add(this.TransparentRect); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "ShowMessage"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Show"; + this.TransparentRect.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private Label MsgText; + private Button LeftButton; + private ExitButton Exit; + private Button RightButton; + private Button MidButton; + private Label Title; + private TransparentRect TransparentRect; + } +} \ No newline at end of file diff --git a/FunGame/Models/Component/ShowMessage.cs b/FunGame/Models/Component/ShowMessage.cs new file mode 100644 index 0000000..7b1aee2 --- /dev/null +++ b/FunGame/Models/Component/ShowMessage.cs @@ -0,0 +1,191 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using FunGame.Models.Enum; + +namespace FunGame.Models.Component +{ + public partial class ShowMessage : Form + { + private int Location_x, Location_y; + private static int MessageResult = -1; + private static ShowMessage? s = null; + + private ShowMessage() + { + InitializeComponent(); + Opacity = 0.85; + Title.MouseDown += new MouseEventHandler(Title_MouseDown); + Title.MouseMove += new MouseEventHandler(Title_MouseMove); + } + + private void SetButtonResult(string text) + { + switch (text) + { + case "确定": + MessageResult = (int)CommonEnums.MessageResult.OK; + break; + case "取消": + MessageResult = (int)CommonEnums.MessageResult.Cancel; + break; + case "是": + MessageResult = (int)CommonEnums.MessageResult.Yes; + break; + case "否": + MessageResult = (int)CommonEnums.MessageResult.No; + break; + case "重试": + MessageResult = (int)CommonEnums.MessageResult.Retry; + break; + } + Dispose(); + } + + // 设置窗口可拖动 + private void Title_MouseDown(object? sender, MouseEventArgs e) + { + //判断是否为鼠标左键 + if (e.Button == MouseButtons.Left) + { + //获取鼠标左键按下时的位置 + this.Location_x = e.Location.X; + this.Location_y = e.Location.Y; + } + } + + private void Title_MouseMove(object? sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + //计算鼠标移动距离 + this.Left += e.Location.X - this.Location_x; + this.Top += e.Location.Y - this.Location_y; + } + } + + public static int Message(string msg, string title) + { + s = new ShowMessage(); + s.Title.Text = title; + s.MsgText.Text = msg; + s.LeftButton.Visible = false; + s.RightButton.Visible = false; + s.MidButton.Visible = true; + s.MidButton.Text = "确定"; + s.ShowDialog(); + return MessageResult; + } + + public static int TipMessage(string msg, string? title = null) + { + s = new ShowMessage(); + if (title != null) s.Title.Text = title; + else s.Title.Text = "提示"; + s.MsgText.Text = msg; + s.LeftButton.Visible = false; + s.RightButton.Visible = false; + s.MidButton.Visible = true; + s.MidButton.Text = "确定"; + s.ShowDialog(); + return MessageResult; + } + + public static int WarningMessage(string msg, string? title = null) + { + s = new ShowMessage(); + if (title != null) s.Title.Text = title; + else s.Title.Text = "警告"; + s.MsgText.Text = msg; + s.LeftButton.Visible = false; + s.RightButton.Visible = false; + s.MidButton.Visible = true; + s.MidButton.Text = "确定"; + s.ShowDialog(); + return MessageResult; + } + + public static int ErrorMessage(string msg, string? title = null) + { + s = new ShowMessage(); + if (title != null) s.Title.Text = title; + else s.Title.Text = "错误"; + s.MsgText.Text = msg; + s.LeftButton.Visible = false; + s.RightButton.Visible = false; + s.MidButton.Visible = true; + s.MidButton.Text = "确定"; + s.ShowDialog(); + return MessageResult; + } + + public static int YesNoMessage(string msg, string title) + { + s = new ShowMessage(); + s.Title.Text = title; + s.MsgText.Text = msg; + s.LeftButton.Visible = true; + s.RightButton.Visible = true; + s.MidButton.Visible = false; + s.LeftButton.Text = "是"; + s.RightButton.Text = "否"; + s.ShowDialog(); + return MessageResult; + } + + public static int OKCancelMessage(string msg, string title) + { + s = new ShowMessage(); + s.Title.Text = title; + s.MsgText.Text = msg; + s.LeftButton.Visible = true; + s.RightButton.Visible = true; + s.MidButton.Visible = false; + s.LeftButton.Text = "确定"; + s.RightButton.Text = "取消"; + s.ShowDialog(); + return MessageResult; + } + + public static int RetryCancelMessage(string msg, string title) + { + s = new ShowMessage(); + s.Title.Text = title; + s.MsgText.Text = msg; + s.LeftButton.Visible = true; + s.RightButton.Visible = true; + s.MidButton.Visible = false; + s.LeftButton.Text = "重试"; + s.RightButton.Text = "取消"; + s.ShowDialog(); + return MessageResult; + } + + private void LeftButton_Click(object sender, EventArgs e) + { + SetButtonResult(LeftButton.Text); + } + + private void RightButton_Click(object sender, EventArgs e) + { + SetButtonResult(RightButton.Text); + } + + private void MidButton_Click(object sender, EventArgs e) + { + SetButtonResult(MidButton.Text); + } + + private void Exit_Click(object sender, EventArgs e) + { + MessageResult = (int)CommonEnums.MessageResult.Cancel; + Dispose(); + } + } +} diff --git a/FunGame/Models/Component/ShowMessage.resx b/FunGame/Models/Component/ShowMessage.resx new file mode 100644 index 0000000..c28b501 --- /dev/null +++ b/FunGame/Models/Component/ShowMessage.resx @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + iVBORw0KGgoAAAANSUhEUgAAAC8AAAAvCAYAAABzJ5OsAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAu + IgAALiIBquLdkgAAAQlJREFUaEPtmYEJwjAURDOSI3SUjtINOpKjOEr9h1Hyz9+E1haN3METif2Xp6CE + mpaUll55yt86pJC3x26Q/LfYLJ/SaEzEkD4I5qkPjOH+JTvkr/nakil77ArmqQ9cw/1LJC/5t85T5GcD + b6AEm+NLV3LJbi5Yp+sA5rlzDvcv2SwfsfLJZV8XrNN1YAp7W0he8kFvC8kbHFvBrwheYcKjRNTZRPIG + x1YkX0XyBsdWJF9F8gbHViRf5RD5hyiOCHsZwt4WB8lDwJ45dDCrInnJB70tNsuvbJ7ddgXz1Ad038Yj + eR/MUx+QvEfyPpinPiB5j+R9ME994BT5jv9Q+yX+S74/XvIdkpY7JUbXJnJZ8twAAAAASUVORK5CYII= + + + \ No newline at end of file diff --git a/FunGame/Models/Component/TextArea.Designer.cs b/FunGame/Models/Component/TextArea.Designer.cs new file mode 100644 index 0000000..a532cac --- /dev/null +++ b/FunGame/Models/Component/TextArea.Designer.cs @@ -0,0 +1,36 @@ +namespace FunGame.Models +{ + partial class TextArea + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/FunGame/Models/Component/TextArea.cs b/FunGame/Models/Component/TextArea.cs new file mode 100644 index 0000000..10f111f --- /dev/null +++ b/FunGame/Models/Component/TextArea.cs @@ -0,0 +1,100 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace FunGame.Models +{ + [ToolboxBitmap(typeof(TextBox))] + partial class TextArea : RichTextBox + { + private string _emptyTextTip = ""; + private Color _emptyTextTipColor = Color.DarkGray; + private const int WM_PAINT = 0xF; + + public TextArea() : base() + { + + } + + [DefaultValue("")] + public string EmptyTextTip + { + get { return _emptyTextTip; } + set + { + _emptyTextTip = value; + base.Invalidate(); + } + } + + [DefaultValue(typeof(Color), "DarkGray")] + public Color EmptyTextTipColor + { + get { return _emptyTextTipColor; } + set + { + _emptyTextTipColor = value; + base.Invalidate(); + } + } + + protected override void WndProc(ref Message m) + { + base.WndProc(ref m); + if (m.Msg == WM_PAINT) + { + WmPaint(ref m); + } + } + + private void WmPaint(ref Message m) + { + using (Graphics graphics = Graphics.FromHwnd(base.Handle)) + { + if (Text.Length == 0 + && !string.IsNullOrEmpty(_emptyTextTip) + && !Focused) + { + TextFormatFlags format = + TextFormatFlags.EndEllipsis | + TextFormatFlags.VerticalCenter; + + if (RightToLeft == RightToLeft.Yes) + { + format |= TextFormatFlags.RightToLeft | TextFormatFlags.Right; + } + + TextRenderer.DrawText( + graphics, + _emptyTextTip, + Font, + base.ClientRectangle, + _emptyTextTipColor, + format); + } + } + } + + [DllImport("kernel32.dll", CharSet = CharSet.Auto)] + private static extern IntPtr LoadLibrary(string lpFileName); + protected override CreateParams CreateParams + { + get + { + CreateParams prams = base.CreateParams; + if (LoadLibrary("msftedit.dll") != IntPtr.Zero) + { + prams.ExStyle |= 0x020; // transparent + prams.ClassName = "RICHEDIT50W"; + } + return prams; + } + } + } +} \ No newline at end of file diff --git a/FunGame/Models/Component/TextArea.resx b/FunGame/Models/Component/TextArea.resx new file mode 100644 index 0000000..d58980a --- /dev/null +++ b/FunGame/Models/Component/TextArea.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/FunGame/Models/Component/TransparentRect.Designer.cs b/FunGame/Models/Component/TransparentRect.Designer.cs new file mode 100644 index 0000000..a4b1e20 --- /dev/null +++ b/FunGame/Models/Component/TransparentRect.Designer.cs @@ -0,0 +1,36 @@ +namespace FunGame.Models +{ + partial class TransparentRect + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/FunGame/Models/Component/TransparentRect.cs b/FunGame/Models/Component/TransparentRect.cs new file mode 100644 index 0000000..dedcd89 --- /dev/null +++ b/FunGame/Models/Component/TransparentRect.cs @@ -0,0 +1,123 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace FunGame.Models +{ + partial class TransparentRect : GroupBox + { + public enum ShapeBorderStyles + { + ShapeBSNone, + ShapeBSFixedSingle, + }; + private ShapeBorderStyles _borderStyle = ShapeBorderStyles.ShapeBSNone; + private Color _backColor = Color.Black; + private Color _borderColor = Color.White; + private int _radius = 20; + private int _opacity = 125; + protected int pointX = 0; + protected int pointY = 0; + protected Rectangle iRect = new Rectangle(); + public TransparentRect() + { + base.BackColor = Color.Transparent; + SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.SupportsTransparentBackColor | ControlStyles.UserPaint, true); + SetStyle(ControlStyles.Opaque, false); + UpdateStyles(); + } + public new Color BackColor + { + get { return _backColor; } + set { _backColor = value; Invalidate(); } + } + public ShapeBorderStyles ShapeBorderStyle + { + get { return _borderStyle; } + set { _borderStyle = value; this.Invalidate(); } + } + public Color BorderColor + { + get { return _borderColor; } + set { _borderColor = value; Invalidate(); } + } + public int Opacity + { + get { return _opacity; } + set { _opacity = value; this.Invalidate(); } + } + public int Radius + { + get { return _radius; } + set { _radius = value; this.Invalidate(); } + } + public override Color ForeColor + { + get { return base.ForeColor; } + set { base.ForeColor = value; this.Invalidate(); } + } + protected override void OnPaint(PaintEventArgs e) + { + SmoothingMode sm = e.Graphics.SmoothingMode; + e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; + if (_borderStyle == ShapeBorderStyles.ShapeBSFixedSingle) DrawBorder(e.Graphics); + DrawLabelBackground(e.Graphics); + e.Graphics.SmoothingMode = sm; + } + private void DrawBorder(Graphics g) + { + Rectangle rect = this.ClientRectangle; + rect.Width--; + rect.Height--; + using (GraphicsPath bp = GetPath(rect, _radius)) + { + using (Pen p = new Pen(_borderColor)) + { + g.DrawPath(p, bp); + } + } + } + private void DrawLabelBackground(Graphics g) + { + Rectangle rect = this.ClientRectangle; + iRect = rect; + rect.X++; + rect.Y++; + rect.Width -= 2; + rect.Height -= 2; + using (GraphicsPath bb = GetPath(rect, _radius)) + { + using (Brush br = new SolidBrush(Color.FromArgb(_opacity, _backColor))) + { + g.FillPath(br, bb); + } + } + } + protected GraphicsPath GetPath(Rectangle rc, int r) + { + int x = rc.X, y = rc.Y, w = rc.Width, h = rc.Height; + r = r << 1; + GraphicsPath path = new GraphicsPath(); + if (r > 0) + { + if (r > h) { r = h; }; + if (r > w) { r = w; }; + path.AddArc(x, y, r, r, 180, 90); + path.AddArc(x + w - r, y, r, r, 270, 90); + path.AddArc(x + w - r, y + h - r, r, r, 0, 90); + path.AddArc(x, y + h - r, r, r, 90, 90); + path.CloseFigure(); + } + else + { + path.AddRectangle(rc); + } + return path; + } + } +} \ No newline at end of file diff --git a/FunGame/Models/Config/Config.cs b/FunGame/Models/Config/Config.cs new file mode 100644 index 0000000..33540b9 --- /dev/null +++ b/FunGame/Models/Config/Config.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.AccessControl; +using System.Text; +using System.Threading.Tasks; +using FunGame.Models.Config; +using FunGame.Utils.DataHelper; + +namespace FunGame.Models.Config +{ + public static class Config + { + /** + * Game Configs + */ + public static string VERSION = ""; + public static string VERSION_TYPE = ""; + public static string VERSION_PATCH = ""; + public static string VERSION_DATE = ""; + + public static INIHelper DefaultINIHelper = new(); + public static AssemblyHelper DefaultAssemblyHelper = new(); + + /** + * WebHelper Configs + */ + public const string WebHelper_SetGreen = "-WebHelper .set green"; + public const string WebHelper_SetRed = "-WebHelper .set red"; + public const string WebHelper_Disconnected = "-WebHelper .disconnected"; + public const string WebHelper_GetUser = "-WebHelper .get user"; + public static int WebHelper_HeartBeatFaileds = 0; + + /** + * Socket Configs + */ + public static string SERVER_IPADRESS = ""; // 默认IP地址 + public static int SERVER_PORT; // 默认端口 + public static Encoding DEFAULT_ENCODING = Encoding.UTF8; + + /** + * FunGame Configs + */ + public const string GameMode_Mix = "混战模式"; + public const string GameMode_Team = "团队模式"; + public const string GameMode_MixHasPass = "带密码的混战模式"; + public const string GameMode_TeamHasPass = "带密码的团队模式"; + + public const string FunGame_PresetMessage = "- 快捷消息 -"; + public const string FunGame_SignIn = "签到"; + public const string FunGame_ShowCredits = "积分"; + public const string FunGame_ShowStock = "查看库存"; + public const string FunGame_ShowStore = "游戏商店"; + public const string FunGame_CreateMix = "创建游戏 混战"; + public const string FunGame_CreateTeam = "创建游戏 团队"; + public const string FunGame_StartGame = "开始游戏"; + public const string FunGame_Retry = "重新连接"; + public const string FunGame_AutoRetryOn = "开启自动重连"; + public const string FunGame_AutoRetryOff = "关闭自动重连"; + public static readonly object[] PresetItems = + { + FunGame_PresetMessage, + FunGame_SignIn, + FunGame_ShowCredits, + FunGame_ShowStock, + FunGame_ShowStore, + FunGame_CreateMix, + FunGame_CreateTeam, + FunGame_StartGame, + FunGame_Retry, + FunGame_AutoRetryOn, + FunGame_AutoRetryOff + }; + public const string FunGame_ConnectByDebug = "连接到Debug"; + } +} diff --git a/FunGame/Models/Config/Usercfg.cs b/FunGame/Models/Config/Usercfg.cs new file mode 100644 index 0000000..f92a09f --- /dev/null +++ b/FunGame/Models/Config/Usercfg.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Models.Config +{ + public static class Usercfg + { + /** + * 玩家设定内容 + */ + public static bool Match_Mix = false; // 混战模式选项 + public static bool Match_Team = false; // 团队模式选项 + public static bool Match_HasPass = false; // 密码房间选项 + public static bool FunGame_isMatching = false; // 是否在匹配中 + public static bool FunGame_isConnected = false; // 是否连接上服务器 + public static bool FunGame_isRetrying = false; // 是否正在重连 + public static bool FunGame_isAutoRetry = true; // 是否自动重连 + public static string FunGame_roomid = "-1"; // 房间号 + public static string LoginUserName = ""; // 已登录用户名 + } +} diff --git a/FunGame/Models/Entity/ActiveItem.cs b/FunGame/Models/Entity/ActiveItem.cs new file mode 100644 index 0000000..144b53c --- /dev/null +++ b/FunGame/Models/Entity/ActiveItem.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Models.Entity +{ + public class ActiveItem : Item + { + public ActiveSkill? Skill { get; set; } = null; + + public ActiveItem() + { + Active = true; + } + } +} diff --git a/FunGame/Models/Entity/ActiveSkill.cs b/FunGame/Models/Entity/ActiveSkill.cs new file mode 100644 index 0000000..61392f2 --- /dev/null +++ b/FunGame/Models/Entity/ActiveSkill.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Models.Entity +{ + public class ActiveSkill : Skill + { + public decimal MP { get; set; } = 0; + public decimal EP { get; set; } = 0; + public decimal Reference1 { get; set; } = 0; + public decimal Reference2 { get; set; } = 0; + public decimal Reference3 { get; set; } = 0; + public decimal Reference4 { get; set; } = 0; + public decimal Reference5 { get; set; } = 0; + public decimal Reference6 { get; set; } = 0; + public decimal Reference7 { get; set; } = 0; + public decimal Reference8 { get; set; } = 0; + public decimal Reference9 { get; set; } = 0; + public decimal Reference10 { get; set; } = 0; + + public ActiveSkill() + { + Active = true; + } + } +} diff --git a/FunGame/Models/Entity/Character.cs b/FunGame/Models/Entity/Character.cs new file mode 100644 index 0000000..04135b3 --- /dev/null +++ b/FunGame/Models/Entity/Character.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Models.Entity +{ + public class Character + { + public int Id { get; set; } + public string Name { get; set; } = ""; + public string FirstName { get; set; } = ""; + public User? User { get; set; } = null; + public CharacterStatistics? Statistics { get; set; } = null; + public int Level { get; set; } = 1; + public decimal EXP { get; set; } + public decimal HP { get; set; } + public decimal MP { get; set; } + public decimal EP { get; set; } + public decimal ATK { get; set; } + public decimal DEF { get; set; } + public decimal PhysicalReduction { get; set; } + public decimal MDF { get; set; } + public decimal HPRecovery { get; set; } = 0; + public decimal MPRecovery { get; set; } = 0; + public decimal EPRecovery { get; set; } = 0; + public decimal SPD { get; set; } + public decimal ATR { get; set; } + public decimal CritRate { get; set; } = 0.05M; + public decimal CritDMG { get; set; } = 1.25M; + public decimal EvadeRate { get; set; } = 0.05M; + public Hashtable? Skills { get; set; } = new Hashtable(); + public Hashtable? Items { get; set; } = new Hashtable(); + + public Character() + { + + } + } +} diff --git a/FunGame/Models/Entity/CharacterStatistics.cs b/FunGame/Models/Entity/CharacterStatistics.cs new file mode 100644 index 0000000..a611f4b --- /dev/null +++ b/FunGame/Models/Entity/CharacterStatistics.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Models.Entity +{ + public class CharacterStatistics + { + public int Id { get; set; } + public Character? Character { get; set; } = null; + public Hashtable? DamageStats { get; set; } = new Hashtable(); + public Hashtable? PhysicalDamageStats { get; set; } = new Hashtable(); + public Hashtable? MagicDamageStats { get; set; } = new Hashtable(); + public Hashtable? RealDamageStats { get; set; } = new Hashtable(); + public Hashtable? AvgDamageStats { get; set; } = new Hashtable(); + public Hashtable? AvgLiveRoundStats { get; set; } = new Hashtable(); + public Hashtable? AvgDamageRoundStats { get; set; } = new Hashtable(); + public Hashtable? KillStats { get; set; } = new Hashtable(); + public Hashtable? DeathStats { get; set; } = new Hashtable(); + public Hashtable? AssistStats { get; set; } = new Hashtable(); + public Hashtable? Plays { get; set; } = new Hashtable(); + public Hashtable? Wins { get; set; } = new Hashtable(); + public Hashtable? Loses { get; set; } = new Hashtable(); + public Hashtable? Winrates { get; set; } = new Hashtable(); + + public CharacterStatistics() + { + + } + } +} diff --git a/FunGame/Models/Entity/GameStatistics.cs b/FunGame/Models/Entity/GameStatistics.cs new file mode 100644 index 0000000..e13409a --- /dev/null +++ b/FunGame/Models/Entity/GameStatistics.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Models.Entity +{ + public class GameStatistics + { + public int Id { get; set; } + public Room? Room { get; set; } = null; + public string? GameRecord { get; set; } = null; + public string? RunTime { get; set; } = null; + public Hashtable? DamageStats { get; set; } = new Hashtable(); + public Hashtable? PhysicalDamageStats { get; set; } = new Hashtable(); + public Hashtable? MagicDamageStats { get; set; } = new Hashtable(); + public Hashtable? RealDamageStats { get; set; } = new Hashtable(); + public Hashtable? AvgDamageStats { get; set; } = new Hashtable(); + public Hashtable? KillStats { get; set; } = new Hashtable(); + public Hashtable? KillDetailStats { get; set; } = new Hashtable(); + public Hashtable? DeathStats { get; set; } = new Hashtable(); + public Hashtable? DeathDetailStats { get; set; } = new Hashtable(); + public Hashtable? AssistStats { get; set; } = new Hashtable(); + public Hashtable? RatingStats { get; set; } = new Hashtable(); + public Hashtable? EloStats { get; set; } = new Hashtable(); + public Hashtable? RankStats { get; set; } = new Hashtable(); + + public GameStatistics() + { + + } + } +} diff --git a/FunGame/Models/Entity/Item.cs b/FunGame/Models/Entity/Item.cs new file mode 100644 index 0000000..11cac8b --- /dev/null +++ b/FunGame/Models/Entity/Item.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Models.Entity +{ + public abstract class Item + { + public int Id { get; set; } + public string Name { get; set; } = ""; + public string Describe { get; set; } = ""; + public decimal Price { get; set; } + public char Key { get; set; } + public bool Active { get; set; } + public Character? Character { get; set; } = null; + } +} diff --git a/FunGame/Models/Entity/PassiveItem.cs b/FunGame/Models/Entity/PassiveItem.cs new file mode 100644 index 0000000..1d88be2 --- /dev/null +++ b/FunGame/Models/Entity/PassiveItem.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Models.Entity +{ + public class PassiveItem : Item + { + public PassiveSkill? Skill { get; set; } = null; + + public PassiveItem() + { + Active = false; + } + } +} diff --git a/FunGame/Models/Entity/PassiveSkill.cs b/FunGame/Models/Entity/PassiveSkill.cs new file mode 100644 index 0000000..8dee862 --- /dev/null +++ b/FunGame/Models/Entity/PassiveSkill.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Models.Entity +{ + public class PassiveSkill : Skill + { + public decimal Reference1 { get; set; } = 0; + public decimal Reference2 { get; set; } = 0; + public decimal Reference3 { get; set; } = 0; + public decimal Reference4 { get; set; } = 0; + public decimal Reference5 { get; set; } = 0; + public decimal Reference6 { get; set; } = 0; + public decimal Reference7 { get; set; } = 0; + public decimal Reference8 { get; set; } = 0; + public decimal Reference9 { get; set; } = 0; + public decimal Reference10 { get; set; } = 0; + + public PassiveSkill() + { + Active = false; + } + } +} diff --git a/FunGame/Models/Entity/Room.cs b/FunGame/Models/Entity/Room.cs new file mode 100644 index 0000000..9b56d23 --- /dev/null +++ b/FunGame/Models/Entity/Room.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Security.Policy; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Models.Entity +{ + public class Room + { + public int Id { get; set; } + public string Roomid { get; set; } = ""; + public DateTime Time { get; set; } = DateTime.Now; + public Hashtable PlayerList { get; set; } = new Hashtable(); + public User? RoomMaster { get; set; } + public int RoomType { get; set; } + public int RoomState { get; set; } + public GameStatistics? Statistics { get; set; } = null; + + public Room(User? master = null) + { + if (master != null) RoomMaster = master; + } + + public Room(string roomid, User? master = null) + { + Roomid = roomid; + if (master != null) RoomMaster = master; + } + } +} diff --git a/FunGame/Models/Entity/Skill.cs b/FunGame/Models/Entity/Skill.cs new file mode 100644 index 0000000..4b150f6 --- /dev/null +++ b/FunGame/Models/Entity/Skill.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Models.Entity +{ + public abstract class Skill + { + public int Id { get; set; } + public string Name { get; set; } = ""; + public string Describe { get; set; } = ""; + public char Key { get; set; } + public bool Active { get; set; } + } +} diff --git a/FunGame/Models/Entity/Stock.cs b/FunGame/Models/Entity/Stock.cs new file mode 100644 index 0000000..3587f5f --- /dev/null +++ b/FunGame/Models/Entity/Stock.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Models.Entity +{ + public class Stock + { + public int Id { get; set; } + public string Name { get; set; } = ""; + public User? User { get; set; } = null; + public Hashtable? Characters { get; set; } = new Hashtable(); + public Hashtable? Items { get; set; } = new Hashtable(); + + public Stock() + { + + } + } +} diff --git a/FunGame/Models/Entity/User.cs b/FunGame/Models/Entity/User.cs new file mode 100644 index 0000000..38411a8 --- /dev/null +++ b/FunGame/Models/Entity/User.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Models.Entity +{ + public class User + { + public int Id { get; set; } + public string Userame { get; set; } = ""; + public string Password { get; set; } = ""; + public DateTime RegTime { get; set; } + public DateTime LastTime { get; set; } + public string Email { get; set; } = ""; + public string NickName { get; set; } = ""; + public bool IsAdmin { get; set; } = false; + public bool IsOperator { get; set; } = false; + public bool IsEnable { get; set; } = false; + public int OnlineState { get; set; } = 0; + public string Roomid { get; set; } = ""; + public int Credits { get; set; } = 0; + public int Material { get; set; } = 0; + public UserStatistics? Statistics { get; set; } = null; + public Stock? Stock { get; set; } = null; + + public User() + { + + } + + public User(string username) + { + Userame = username; + } + + public User(string username, string password) + { + Userame = username; + Password = password; + } + } +} diff --git a/FunGame/Models/Entity/UserStatistics.cs b/FunGame/Models/Entity/UserStatistics.cs new file mode 100644 index 0000000..9132c53 --- /dev/null +++ b/FunGame/Models/Entity/UserStatistics.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Models.Entity +{ + public class UserStatistics + { + public int Id { get; set; } + public User? User { get; set; } = null; + public Hashtable? DamageStats { get; set; } = new Hashtable(); + public Hashtable? PhysicalDamageStats { get; set; } = new Hashtable(); + public Hashtable? MagicDamageStats { get; set; } = new Hashtable(); + public Hashtable? RealDamageStats { get; set; } = new Hashtable(); + public Hashtable? AvgDamageStats { get; set; } = new Hashtable(); + public Hashtable? KillStats { get; set; } = new Hashtable(); + public Hashtable? DeathStats { get; set; } = new Hashtable(); + public Hashtable? AssistStats { get; set; } = new Hashtable(); + public Hashtable? Plays { get; set; } = new Hashtable(); + public Hashtable? Wins { get; set; } = new Hashtable(); + public Hashtable? Loses { get; set; } = new Hashtable(); + public Hashtable? Winrates { get; set; } = new Hashtable(); + public Hashtable? RatingStats { get; set; } = new Hashtable(); + public Hashtable? EloStats { get; set; } = new Hashtable(); + public Hashtable? RankStats { get; set; } = new Hashtable(); + + public UserStatistics() + { + + } + } +} diff --git a/FunGame/Models/Enum/CommonEnums.cs b/FunGame/Models/Enum/CommonEnums.cs new file mode 100644 index 0000000..925084c --- /dev/null +++ b/FunGame/Models/Enum/CommonEnums.cs @@ -0,0 +1,97 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Models.Enum +{ + /// + /// ſʵصState Type Result Method + /// FunGame.CoreӿںʵʱҪͬӣInterfaceTypeInterfaceMethod + /// + public static class CommonEnums + { + #region State + + public enum StartMatch_State + { + Matching = 1, + Success = 2, + Enable = 3, + Cancel = 4 + } + + public enum CreateRoom_State + { + Creating = 1, + Success = 2 + } + + public enum RoomState + { + Created = 1, + Gaming = 2, + Close = 3, + Complete = 4 + } + + public enum OnlineState + { + Offline = 1, + Online = 2, + Matching = 3, + InRoom = 4, + Gaming = 5 + } + + #endregion + + #region Type + + public enum RoomType + { + Mix = 1, + Team = 2, + MixHasPass = 3, + TeamHasPass = 4 + } + + public enum InterfaceType + { + ServerInterface = 1 + } + + #endregion + + #region Result + + public enum MessageResult + { + OK = 1, + Cancel = 2, + Yes = 3, + No = 4, + Retry = 5 + } + + #endregion + + #region Method + + public enum WebHelperMethod + { + CreateSocket = 1, + CloseSocket = 2, + StartWebHelper = 3, + } + + public enum InterfaceMethod + { + GetServerIP = 1 + } + + #endregion + + } +} diff --git a/FunGame/Models/Enum/SocketEnums.cs b/FunGame/Models/Enum/SocketEnums.cs new file mode 100644 index 0000000..e3e6882 --- /dev/null +++ b/FunGame/Models/Enum/SocketEnums.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Models.Enum +{ + public static class SocketEnums + { + public enum Type + { + GetNotice = 1, + Login = 2, + CheckLogin = 3, + Logout = 4, + HeartBeat = 5 + } + + public const string TYPE_UNKNOWN = "Unknown Type"; + public const string TYPE_GetNotice = "GetNotice"; + public const string TYPE_Login = "Login"; + public const string TYPE_CheckLogin = "CheckLogin"; + public const string TYPE_Logout = "Logout"; + public const string TYPE_HeartBeat = "HeartBeat"; + } +} diff --git a/FunGame/Properties/Resources.Designer.cs b/FunGame/Properties/Resources.Designer.cs new file mode 100644 index 0000000..57c3a18 --- /dev/null +++ b/FunGame/Properties/Resources.Designer.cs @@ -0,0 +1,143 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace FunGame.Properties { + using System; + + + /// + /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// 返回此类使用的缓存的 ResourceManager 实例。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("FunGame.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 重写当前线程的 CurrentUICulture 属性,对 + /// 使用此强类型资源类的所有资源查找执行重写。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap back { + get { + object obj = ResourceManager.GetObject("back", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap exit { + get { + object obj = ResourceManager.GetObject("exit", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap favicon { + get { + object obj = ResourceManager.GetObject("favicon", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap green { + get { + object obj = ResourceManager.GetObject("green", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap logo { + get { + object obj = ResourceManager.GetObject("logo", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap min { + get { + object obj = ResourceManager.GetObject("min", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap red { + get { + object obj = ResourceManager.GetObject("red", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap send { + get { + object obj = ResourceManager.GetObject("send", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/FunGame/Properties/Resources.resx b/FunGame/Properties/Resources.resx new file mode 100644 index 0000000..54e14d9 --- /dev/null +++ b/FunGame/Properties/Resources.resx @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\images\exit.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\images\red.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\images\send.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\images\green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\images\back.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\images\min.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\favicon.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\logo.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/FunGame/UI/Main/Main.Designer.cs b/FunGame/UI/Main/Main.Designer.cs new file mode 100644 index 0000000..a648471 --- /dev/null +++ b/FunGame/UI/Main/Main.Designer.cs @@ -0,0 +1,644 @@ +using FunGame.Models.Component; +using FunGame.Models.Config; + +namespace FunGame +{ + partial class Main + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Main)); + this.Exit = new FunGame.Models.Component.ExitButton(this.components); + this.Title = new System.Windows.Forms.Label(); + this.MinForm = new System.Windows.Forms.Button(); + this.Connection = new System.Windows.Forms.Label(); + this.Light = new System.Windows.Forms.Label(); + this.SendTalkText = new System.Windows.Forms.Button(); + this.TalkText = new System.Windows.Forms.TextBox(); + this.StartMatch = new System.Windows.Forms.Button(); + this.CheckMix = new System.Windows.Forms.CheckBox(); + this.CheckTeam = new System.Windows.Forms.CheckBox(); + this.RoomSetting = new System.Windows.Forms.Button(); + this.Login = new System.Windows.Forms.Button(); + this.NowAccount = new System.Windows.Forms.Label(); + this.AccountSetting = new System.Windows.Forms.Button(); + this.About = new System.Windows.Forms.Button(); + this.Room = new System.Windows.Forms.Label(); + this.RoomText = new System.Windows.Forms.TextBox(); + this.PresetText = new System.Windows.Forms.ComboBox(); + this.RoomBox = new System.Windows.Forms.GroupBox(); + this.QueryRoom = new System.Windows.Forms.Button(); + this.RoomList = new System.Windows.Forms.ListBox(); + this.Notice = new System.Windows.Forms.GroupBox(); + this.NoticeText = new FunGame.Models.TextArea(); + this.InfoBox = new System.Windows.Forms.GroupBox(); + this.TransparentRectControl = new FunGame.Models.TransparentRect(); + this.GameInfo = new FunGame.Models.TextArea(); + this.QuitRoom = new System.Windows.Forms.Button(); + this.CreateRoom = new System.Windows.Forms.Button(); + this.Logout = new System.Windows.Forms.Button(); + this.CheckHasPass = new System.Windows.Forms.CheckBox(); + this.Stock = new System.Windows.Forms.Button(); + this.Store = new System.Windows.Forms.Button(); + this.Copyright = new System.Windows.Forms.LinkLabel(); + this.StopMatch = new System.Windows.Forms.Button(); + this.RoomBox.SuspendLayout(); + this.Notice.SuspendLayout(); + this.InfoBox.SuspendLayout(); + this.TransparentRectControl.SuspendLayout(); + this.SuspendLayout(); + // + // Exit + // + this.Exit.Anchor = System.Windows.Forms.AnchorStyles.None; + this.Exit.BackColor = System.Drawing.Color.White; + this.Exit.BackgroundImage = global::FunGame.Properties.Resources.exit; + this.Exit.FlatAppearance.BorderColor = System.Drawing.Color.White; + this.Exit.FlatAppearance.BorderSize = 0; + this.Exit.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(128))))); + this.Exit.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(192))))); + this.Exit.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.Exit.Font = new System.Drawing.Font("LanaPixel", 36F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point); + this.Exit.ForeColor = System.Drawing.Color.Red; + this.Exit.Location = new System.Drawing.Point(750, 3); + this.Exit.Name = "Exit"; + this.Exit.Size = new System.Drawing.Size(47, 47); + this.Exit.TabIndex = 15; + this.Exit.TextAlign = System.Drawing.ContentAlignment.TopLeft; + this.Exit.UseVisualStyleBackColor = false; + this.Exit.Click += new System.EventHandler(this.Exit_Click); + // + // Title + // + this.Title.BackColor = System.Drawing.Color.Transparent; + this.Title.Font = new System.Drawing.Font("LanaPixel", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point); + this.Title.Location = new System.Drawing.Point(3, 3); + this.Title.Name = "Title"; + this.Title.Size = new System.Drawing.Size(689, 47); + this.Title.TabIndex = 96; + this.Title.Text = "FunGame By Mili.cyou"; + this.Title.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.Title.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Title_MouseDown); + this.Title.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Title_MouseMove); + // + // MinForm + // + this.MinForm.Anchor = System.Windows.Forms.AnchorStyles.None; + this.MinForm.BackColor = System.Drawing.Color.White; + this.MinForm.BackgroundImage = global::FunGame.Properties.Resources.min; + this.MinForm.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.MinForm.FlatAppearance.BorderColor = System.Drawing.Color.LightGray; + this.MinForm.FlatAppearance.BorderSize = 0; + this.MinForm.FlatAppearance.MouseDownBackColor = System.Drawing.Color.Gray; + this.MinForm.FlatAppearance.MouseOverBackColor = System.Drawing.Color.DarkGray; + this.MinForm.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.MinForm.Font = new System.Drawing.Font("LanaPixel", 36F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point); + this.MinForm.ForeColor = System.Drawing.Color.Red; + this.MinForm.Location = new System.Drawing.Point(698, 3); + this.MinForm.Name = "MinForm"; + this.MinForm.Size = new System.Drawing.Size(47, 47); + this.MinForm.TabIndex = 14; + this.MinForm.TextAlign = System.Drawing.ContentAlignment.TopLeft; + this.MinForm.UseVisualStyleBackColor = false; + this.MinForm.Click += new System.EventHandler(this.MinForm_Click); + // + // Connection + // + this.Connection.BackColor = System.Drawing.Color.Transparent; + this.Connection.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.Connection.Location = new System.Drawing.Point(665, 425); + this.Connection.Margin = new System.Windows.Forms.Padding(3); + this.Connection.Name = "Connection"; + this.Connection.Size = new System.Drawing.Size(114, 23); + this.Connection.TabIndex = 92; + this.Connection.Text = "服务器连接失败"; + this.Connection.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // Light + // + this.Light.BackColor = System.Drawing.Color.Transparent; + this.Light.Image = global::FunGame.Properties.Resources.red; + this.Light.Location = new System.Drawing.Point(777, 426); + this.Light.Name = "Light"; + this.Light.Size = new System.Drawing.Size(20, 20); + this.Light.TabIndex = 93; + // + // SendTalkText + // + this.SendTalkText.Anchor = System.Windows.Forms.AnchorStyles.None; + this.SendTalkText.BackColor = System.Drawing.Color.Transparent; + this.SendTalkText.BackgroundImage = global::FunGame.Properties.Resources.send; + this.SendTalkText.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.SendTalkText.FlatAppearance.BorderSize = 0; + this.SendTalkText.FlatAppearance.MouseDownBackColor = System.Drawing.Color.Teal; + this.SendTalkText.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(192)))), ((int)(((byte)(192))))); + this.SendTalkText.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.SendTalkText.Font = new System.Drawing.Font("阿丽达黑体", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.SendTalkText.Location = new System.Drawing.Point(608, 421); + this.SendTalkText.Name = "SendTalkText"; + this.SendTalkText.Size = new System.Drawing.Size(51, 27); + this.SendTalkText.TabIndex = 3; + this.SendTalkText.TextAlign = System.Drawing.ContentAlignment.TopLeft; + this.SendTalkText.UseVisualStyleBackColor = false; + this.SendTalkText.Click += new System.EventHandler(this.SendTalkText_Click); + // + // TalkText + // + this.TalkText.AllowDrop = true; + this.TalkText.Font = new System.Drawing.Font("LanaPixel", 12.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.TalkText.ForeColor = System.Drawing.Color.DarkGray; + this.TalkText.Location = new System.Drawing.Point(317, 422); + this.TalkText.Name = "TalkText"; + this.TalkText.Size = new System.Drawing.Size(289, 26); + this.TalkText.TabIndex = 2; + this.TalkText.Text = "向消息队列发送消息..."; + this.TalkText.WordWrap = false; + this.TalkText.Click += new System.EventHandler(this.TalkText_Click); + this.TalkText.KeyUp += new System.Windows.Forms.KeyEventHandler(this.TalkText_KeyUp); + this.TalkText.Leave += new System.EventHandler(this.TalkText_Leave); + // + // StartMatch + // + this.StartMatch.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.StartMatch.Location = new System.Drawing.Point(665, 184); + this.StartMatch.Name = "StartMatch"; + this.StartMatch.Size = new System.Drawing.Size(132, 35); + this.StartMatch.TabIndex = 9; + this.StartMatch.Text = "开始匹配"; + this.StartMatch.UseVisualStyleBackColor = true; + this.StartMatch.Click += new System.EventHandler(this.StartMatch_Click); + // + // CheckMix + // + this.CheckMix.BackColor = System.Drawing.Color.Transparent; + this.CheckMix.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.CheckMix.Location = new System.Drawing.Point(675, 94); + this.CheckMix.Name = "CheckMix"; + this.CheckMix.Size = new System.Drawing.Size(123, 24); + this.CheckMix.TabIndex = 6; + this.CheckMix.Text = "混战模式房间"; + this.CheckMix.TextAlign = System.Drawing.ContentAlignment.BottomLeft; + this.CheckMix.UseVisualStyleBackColor = false; + this.CheckMix.CheckedChanged += new System.EventHandler(this.CheckMix_CheckedChanged); + // + // CheckTeam + // + this.CheckTeam.BackColor = System.Drawing.Color.Transparent; + this.CheckTeam.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.CheckTeam.Location = new System.Drawing.Point(675, 124); + this.CheckTeam.Name = "CheckTeam"; + this.CheckTeam.Size = new System.Drawing.Size(123, 24); + this.CheckTeam.TabIndex = 7; + this.CheckTeam.Text = "团队模式房间"; + this.CheckTeam.TextAlign = System.Drawing.ContentAlignment.BottomLeft; + this.CheckTeam.UseVisualStyleBackColor = false; + this.CheckTeam.CheckedChanged += new System.EventHandler(this.CheckTeam_CheckedChanged); + // + // RoomSetting + // + this.RoomSetting.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.RoomSetting.Location = new System.Drawing.Point(665, 225); + this.RoomSetting.Name = "RoomSetting"; + this.RoomSetting.Size = new System.Drawing.Size(132, 35); + this.RoomSetting.TabIndex = 10; + this.RoomSetting.Text = "房间设置"; + this.RoomSetting.UseVisualStyleBackColor = true; + this.RoomSetting.Visible = false; + this.RoomSetting.Click += new System.EventHandler(this.RoomSetting_Click); + // + // Login + // + this.Login.Font = new System.Drawing.Font("LanaPixel", 15.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.Login.Location = new System.Drawing.Point(665, 380); + this.Login.Name = "Login"; + this.Login.Size = new System.Drawing.Size(132, 39); + this.Login.TabIndex = 13; + this.Login.Text = "登录账号"; + this.Login.UseVisualStyleBackColor = true; + this.Login.Click += new System.EventHandler(this.Login_Click); + // + // NowAccount + // + this.NowAccount.BackColor = System.Drawing.Color.Transparent; + this.NowAccount.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.NowAccount.Location = new System.Drawing.Point(659, 352); + this.NowAccount.Name = "NowAccount"; + this.NowAccount.Size = new System.Drawing.Size(141, 25); + this.NowAccount.TabIndex = 91; + this.NowAccount.Text = "请登录账号"; + this.NowAccount.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // AccountSetting + // + this.AccountSetting.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.AccountSetting.Location = new System.Drawing.Point(665, 317); + this.AccountSetting.Name = "AccountSetting"; + this.AccountSetting.Size = new System.Drawing.Size(65, 32); + this.AccountSetting.TabIndex = 11; + this.AccountSetting.Text = "设置"; + this.AccountSetting.UseVisualStyleBackColor = true; + // + // About + // + this.About.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.About.Location = new System.Drawing.Point(732, 317); + this.About.Name = "About"; + this.About.Size = new System.Drawing.Size(65, 32); + this.About.TabIndex = 12; + this.About.Text = "关于"; + this.About.UseVisualStyleBackColor = true; + // + // Room + // + this.Room.BackColor = System.Drawing.Color.Transparent; + this.Room.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.Room.Location = new System.Drawing.Point(665, 263); + this.Room.Name = "Room"; + this.Room.Size = new System.Drawing.Size(132, 45); + this.Room.TabIndex = 90; + this.Room.Text = "房间号:114514"; + this.Room.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // RoomText + // + this.RoomText.AllowDrop = true; + this.RoomText.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.RoomText.ForeColor = System.Drawing.Color.DarkGray; + this.RoomText.Location = new System.Drawing.Point(6, 226); + this.RoomText.Name = "RoomText"; + this.RoomText.Size = new System.Drawing.Size(114, 25); + this.RoomText.TabIndex = 1; + this.RoomText.Text = "键入房间代号..."; + this.RoomText.WordWrap = false; + this.RoomText.Click += new System.EventHandler(this.RoomText_Click); + this.RoomText.KeyUp += new System.Windows.Forms.KeyEventHandler(this.RoomText_KeyUp); + this.RoomText.Leave += new System.EventHandler(this.RoomText_Leave); + // + // PresetText + // + this.PresetText.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.PresetText.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.PresetText.Font = new System.Drawing.Font("LanaPixel", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.PresetText.FormattingEnabled = true; + this.PresetText.Items.AddRange(new object[] { + "- 快捷消息 -", + "签到", + "积分", + "查看库存", + "游戏商店", + "创建游戏 混战", + "创建游戏 团队", + "开始游戏", + "重新连接", + "开启自动重连", + "关闭自动重连"}); + this.PresetText.Location = new System.Drawing.Point(195, 422); + this.PresetText.Name = "PresetText"; + this.PresetText.Size = new System.Drawing.Size(121, 26); + this.PresetText.TabIndex = 1; + this.PresetText.SelectedIndexChanged += new System.EventHandler(this.PresetText_SelectedIndexChanged); + // + // RoomBox + // + this.RoomBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.RoomBox.BackColor = System.Drawing.Color.Transparent; + this.RoomBox.Controls.Add(this.QueryRoom); + this.RoomBox.Controls.Add(this.RoomList); + this.RoomBox.Controls.Add(this.RoomText); + this.RoomBox.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.RoomBox.Location = new System.Drawing.Point(3, 56); + this.RoomBox.Name = "RoomBox"; + this.RoomBox.Size = new System.Drawing.Size(186, 258); + this.RoomBox.TabIndex = 0; + this.RoomBox.TabStop = false; + this.RoomBox.Text = "房间列表"; + // + // QueryRoom + // + this.QueryRoom.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.QueryRoom.Location = new System.Drawing.Point(126, 225); + this.QueryRoom.Name = "QueryRoom"; + this.QueryRoom.Size = new System.Drawing.Size(51, 27); + this.QueryRoom.TabIndex = 2; + this.QueryRoom.Text = "加入"; + this.QueryRoom.UseVisualStyleBackColor = true; + this.QueryRoom.Click += new System.EventHandler(this.QueryRoom_Click); + // + // RoomList + // + this.RoomList.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.RoomList.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.RoomList.FormattingEnabled = true; + this.RoomList.ItemHeight = 19; + this.RoomList.Items.AddRange(new object[] { + "114514", + "1919810", + "12900", + "12600", + "12100", + "3329500", + "111111", + "123456", + "123698745", + "667678970", + "3305106902", + "987654"}); + this.RoomList.Location = new System.Drawing.Point(0, 26); + this.RoomList.Name = "RoomList"; + this.RoomList.Size = new System.Drawing.Size(186, 192); + this.RoomList.TabIndex = 0; + this.RoomList.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.RoomList_MouseDoubleClick); + // + // Notice + // + this.Notice.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.Notice.BackColor = System.Drawing.Color.Transparent; + this.Notice.Controls.Add(this.NoticeText); + this.Notice.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.Notice.Location = new System.Drawing.Point(3, 317); + this.Notice.Name = "Notice"; + this.Notice.Size = new System.Drawing.Size(186, 110); + this.Notice.TabIndex = 94; + this.Notice.TabStop = false; + this.Notice.Text = "通知公告"; + // + // NoticeText + // + this.NoticeText.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.NoticeText.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.NoticeText.EmptyTextTip = null; + this.NoticeText.Location = new System.Drawing.Point(6, 24); + this.NoticeText.Name = "NoticeText"; + this.NoticeText.ReadOnly = true; + this.NoticeText.Size = new System.Drawing.Size(174, 86); + this.NoticeText.TabIndex = 0; + this.NoticeText.Text = "这里展示公告"; + // + // InfoBox + // + this.InfoBox.BackColor = System.Drawing.Color.Transparent; + this.InfoBox.Controls.Add(this.TransparentRectControl); + this.InfoBox.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.InfoBox.Location = new System.Drawing.Point(195, 56); + this.InfoBox.Name = "InfoBox"; + this.InfoBox.Size = new System.Drawing.Size(464, 363); + this.InfoBox.TabIndex = 95; + this.InfoBox.TabStop = false; + this.InfoBox.Text = "消息队列"; + // + // TransparentRectControl + // + this.TransparentRectControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.TransparentRectControl.BackColor = System.Drawing.Color.Transparent; + this.TransparentRectControl.BorderColor = System.Drawing.Color.Transparent; + this.TransparentRectControl.Controls.Add(this.GameInfo); + this.TransparentRectControl.Location = new System.Drawing.Point(0, 20); + this.TransparentRectControl.Name = "TransparentRectControl"; + this.TransparentRectControl.Opacity = 125; + this.TransparentRectControl.Radius = 20; + this.TransparentRectControl.ShapeBorderStyle = FunGame.Models.TransparentRect.ShapeBorderStyles.ShapeBSNone; + this.TransparentRectControl.Size = new System.Drawing.Size(464, 343); + this.TransparentRectControl.TabIndex = 2; + this.TransparentRectControl.TabStop = false; + // + // GameInfo + // + this.GameInfo.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.GameInfo.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.GameInfo.EmptyTextTip = null; + this.GameInfo.EmptyTextTipColor = System.Drawing.Color.Transparent; + this.GameInfo.Location = new System.Drawing.Point(6, 6); + this.GameInfo.Name = "GameInfo"; + this.GameInfo.ReadOnly = true; + this.GameInfo.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical; + this.GameInfo.Size = new System.Drawing.Size(452, 331); + this.GameInfo.TabIndex = 1; + this.GameInfo.Text = "这里展示游戏信息,包括系统通知和游戏反馈"; + // + // QuitRoom + // + this.QuitRoom.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.QuitRoom.Location = new System.Drawing.Point(665, 184); + this.QuitRoom.Name = "QuitRoom"; + this.QuitRoom.Size = new System.Drawing.Size(132, 35); + this.QuitRoom.TabIndex = 9; + this.QuitRoom.Text = "退出房间"; + this.QuitRoom.UseVisualStyleBackColor = true; + this.QuitRoom.Visible = false; + this.QuitRoom.Click += new System.EventHandler(this.QuitRoom_Click); + // + // CreateRoom + // + this.CreateRoom.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.CreateRoom.Location = new System.Drawing.Point(665, 225); + this.CreateRoom.Name = "CreateRoom"; + this.CreateRoom.Size = new System.Drawing.Size(132, 35); + this.CreateRoom.TabIndex = 10; + this.CreateRoom.Text = "创建房间"; + this.CreateRoom.UseVisualStyleBackColor = true; + this.CreateRoom.Click += new System.EventHandler(this.CreateRoom_Click); + // + // Logout + // + this.Logout.Font = new System.Drawing.Font("LanaPixel", 15.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.Logout.Location = new System.Drawing.Point(665, 380); + this.Logout.Name = "Logout"; + this.Logout.Size = new System.Drawing.Size(132, 39); + this.Logout.TabIndex = 13; + this.Logout.Text = "退出登录"; + this.Logout.UseVisualStyleBackColor = true; + this.Logout.Visible = false; + this.Logout.Click += new System.EventHandler(this.Logout_Click); + // + // CheckHasPass + // + this.CheckHasPass.BackColor = System.Drawing.Color.Transparent; + this.CheckHasPass.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.CheckHasPass.Location = new System.Drawing.Point(675, 154); + this.CheckHasPass.Name = "CheckHasPass"; + this.CheckHasPass.Size = new System.Drawing.Size(123, 24); + this.CheckHasPass.TabIndex = 8; + this.CheckHasPass.Text = "带密码的房间"; + this.CheckHasPass.TextAlign = System.Drawing.ContentAlignment.BottomLeft; + this.CheckHasPass.UseVisualStyleBackColor = false; + this.CheckHasPass.CheckedChanged += new System.EventHandler(this.CheckHasPass_CheckedChanged); + // + // Stock + // + this.Stock.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.Stock.Location = new System.Drawing.Point(661, 56); + this.Stock.Name = "Stock"; + this.Stock.Size = new System.Drawing.Size(65, 32); + this.Stock.TabIndex = 4; + this.Stock.Text = "库存"; + this.Stock.UseVisualStyleBackColor = true; + // + // Store + // + this.Store.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.Store.Location = new System.Drawing.Point(732, 56); + this.Store.Name = "Store"; + this.Store.Size = new System.Drawing.Size(65, 32); + this.Store.TabIndex = 5; + this.Store.Text = "商店"; + this.Store.UseVisualStyleBackColor = true; + // + // Copyright + // + this.Copyright.ActiveLinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.Copyright.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.Copyright.BackColor = System.Drawing.Color.Transparent; + this.Copyright.Font = new System.Drawing.Font("LanaPixel", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.Copyright.LinkArea = new System.Windows.Forms.LinkArea(6, 10); + this.Copyright.LinkBehavior = System.Windows.Forms.LinkBehavior.AlwaysUnderline; + this.Copyright.LinkColor = System.Drawing.Color.Teal; + this.Copyright.Location = new System.Drawing.Point(3, 430); + this.Copyright.Name = "Copyright"; + this.Copyright.Size = new System.Drawing.Size(186, 23); + this.Copyright.TabIndex = 97; + this.Copyright.TabStop = true; + this.Copyright.Text = "©2022 Mili.cyou. 米粒的糖果屋"; + this.Copyright.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.Copyright.UseCompatibleTextRendering = true; + this.Copyright.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.Copyright_LinkClicked); + // + // StopMatch + // + this.StopMatch.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.StopMatch.Location = new System.Drawing.Point(665, 184); + this.StopMatch.Name = "StopMatch"; + this.StopMatch.Size = new System.Drawing.Size(132, 35); + this.StopMatch.TabIndex = 9; + this.StopMatch.Text = "停止匹配"; + this.StopMatch.UseVisualStyleBackColor = true; + this.StopMatch.Visible = false; + this.StopMatch.Click += new System.EventHandler(this.StopMatch_Click); + // + // Main + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackgroundImage = global::FunGame.Properties.Resources.back; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Controls.Add(this.StopMatch); + this.Controls.Add(this.Copyright); + this.Controls.Add(this.Store); + this.Controls.Add(this.Stock); + this.Controls.Add(this.Logout); + this.Controls.Add(this.RoomSetting); + this.Controls.Add(this.QuitRoom); + this.Controls.Add(this.InfoBox); + this.Controls.Add(this.CreateRoom); + this.Controls.Add(this.Notice); + this.Controls.Add(this.RoomBox); + this.Controls.Add(this.PresetText); + this.Controls.Add(this.SendTalkText); + this.Controls.Add(this.TalkText); + this.Controls.Add(this.Room); + this.Controls.Add(this.About); + this.Controls.Add(this.AccountSetting); + this.Controls.Add(this.NowAccount); + this.Controls.Add(this.Login); + this.Controls.Add(this.CheckHasPass); + this.Controls.Add(this.CheckTeam); + this.Controls.Add(this.CheckMix); + this.Controls.Add(this.StartMatch); + this.Controls.Add(this.Light); + this.Controls.Add(this.Connection); + this.Controls.Add(this.MinForm); + this.Controls.Add(this.Title); + this.Controls.Add(this.Exit); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "Main"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "FunGame"; + this.RoomBox.ResumeLayout(false); + this.RoomBox.PerformLayout(); + this.Notice.ResumeLayout(false); + this.InfoBox.ResumeLayout(false); + this.TransparentRectControl.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private ExitButton Exit; + private Label Title; + private Button MinForm; + private Label Connection; + private Label Light; + private Button StartMatch; + private CheckBox CheckMix; + private CheckBox CheckTeam; + private Button RoomSetting; + private Button Login; + private Label NowAccount; + private Button AccountSetting; + private Button About; + private Label Room; + private Button SendTalkText; + private TextBox TalkText; + private TextBox RoomText; + private ComboBox PresetText; + private GroupBox RoomBox; + private ListBox RoomList; + private GroupBox Notice; + private GroupBox InfoBox; + private Button QuitRoom; + private Button CreateRoom; + private Button QueryRoom; + private Button Logout; + private CheckBox CheckHasPass; + private Button Stock; + private Button Store; + private LinkLabel Copyright; + private Button StopMatch; + private Models.TextArea GameInfo; + private Models.TextArea NoticeText; + private Models.TransparentRect TransparentRectControl; + } +} \ No newline at end of file diff --git a/FunGame/UI/Main/Main.cs b/FunGame/UI/Main/Main.cs new file mode 100644 index 0000000..a0650f6 --- /dev/null +++ b/FunGame/UI/Main/Main.cs @@ -0,0 +1,1176 @@ +using FunGame.Models.Component; +using FunGame.Models.Config; +using FunGame.Models.Entity; +using System.Diagnostics; +using System.Net.Sockets; +using System.Net; +using System.Windows.Forms; +using static FunGame.Models.Enum.CommonEnums; +using FunGame.Utils.WebHelper; +using FunGame.Models.Enum; +using FunGame.Utils.DataHelper; + +namespace FunGame +{ + public partial class Main : Form + { + + #region 变量定义 + + /** + * 定义全局变量 + */ + private int LOCATION_X, LOCATION_Y; // 窗口当前坐标 + private int MAX_CONNECTEDRETRY = 20; // 最大重试连接次数 + private int NOW_CONNECTEDRETRY = -1; // 当前重试连接次数 + + /** + * 定义全局对象 + */ + private Task? MatchFunGame = null; // 匹配线程 + private User? LoginUser = null; // 登录的玩家对象 + private WebHelper? WebHelper = null; // WebHelper + + /** + * 定义委托 + * 子线程操作窗体控件时,先实例化Action,然后Invoke传递出去。 + */ + Action? StartMatch_Action = null; + Action? CreateRoom_Action = null; + Action? WebHelper_Action = null; + Action? Main_Action = null; + + public Main() + { + InitializeComponent(); + Init(); + } + + /// + /// 所有自定义初始化的内容 + /// + public void Init() + { + this.PresetText.SelectedIndex = 0; // 快捷消息初始选择 + SetRoomid("-1"); // 房间号初始化 + WritelnGameInfo(); // 初始化消息队列 + SetLoginUser(new object[] { new User("Mili") }); // Debug,初始化玩家名字 + GetServerConnection(); // 开始连接服务器 + } + + #endregion + + #region 公有方法 + + /// + /// 提供公共方法给WebHelper + /// + /// + /// + /// + /// + public object? GetMessage(WebHelper webHelper, string? msg, bool needTime = false) + { + try + { + if (msg != null) + { + switch (msg) + { + case Config.WebHelper_SetGreen: + Usercfg.FunGame_isRetrying = false; + WebHelper_Action = (Main? main) => + { + SetServerStatusLight(true); + }; + if (this.InvokeRequired) + this.BeginInvoke(WebHelper_Action, this); + else + WebHelper_Action(this); + Usercfg.FunGame_isConnected = true; + NOW_CONNECTEDRETRY = 0; + break; + case Config.WebHelper_SetRed: + WebHelper_Action = (Main? main) => + { + SetServerStatusLight(false); + }; + if (this.InvokeRequired) + this.BeginInvoke(WebHelper_Action, this); + else + WebHelper_Action(this); + Usercfg.FunGame_isConnected = false; + break; + case Config.WebHelper_Disconnected: + Usercfg.FunGame_isRetrying = false; + WebHelper_Action = (Main? main) => + { + SetServerStatusLight(false); + }; + if (this.InvokeRequired) + this.BeginInvoke(WebHelper_Action, this); + else + WebHelper_Action(this); + Usercfg.FunGame_isConnected = false; + if (Usercfg.FunGame_isAutoRetry && NOW_CONNECTEDRETRY <= MAX_CONNECTEDRETRY) + { + Task.Run(() => + { + Thread.Sleep(5000); + Connect(); + }); + if (needTime) + throw new Exception(GetNowShortTime() + "\nERROR:连接服务器失败,5秒后自动尝试重连。"); + else + throw new Exception("ERROR:连接服务器失败,5秒后自动尝试重连。"); + } + else + if (needTime) + throw new Exception(GetNowShortTime() + "\nERROR:无法连接至服务器,请检查你的网络连接。"); + else + throw new Exception("ERROR:无法连接至服务器,请检查你的网络连接。"); + case Config.WebHelper_GetUser: + if (LoginUser != null) + return LoginUser; + return null; + default: + WritelnGameInfo(webHelper, msg); + return null; + } + } + return null; + } + catch (Exception e) + { + WritelnGameInfo(webHelper, (e.Message != null) ? e.Message + "\n" + e.StackTrace : "" + e.StackTrace); + GetMessage(webHelper, Config.WebHelper_SetRed); + } + return null; + } + + #endregion + + #region 实现 + + /// + /// 反射获取服务器IP和Port + /// + private void GetServerConnection() + { + try + { + string? ipaddress = (string?)Config.DefaultAssemblyHelper.GetFunGameCoreValue((int)InterfaceType.ServerInterface, (int)InterfaceMethod.GetServerIP); // 获取服务器IP + if (ipaddress != null) + { + string[] s = ipaddress.Split(':'); + if (s != null && s.Length > 1) + { + Config.SERVER_IPADRESS = s[0]; + Config.SERVER_PORT = Convert.ToInt32(s[1]); + Connect(); // 连接服务器 + } + else throw new Exception(); + } + else throw new Exception(); + } + catch (Exception e) + { + WritelnGameInfo(">> 查找可用的服务器失败,请重启FunGame!\n" + e.StackTrace); + ShowMessage.ErrorMessage("查找可用的服务器失败!"); + } + } + + /// + /// 在服务器IP获取成功后,尝试连接服务器 + /// + private void Connect() + { + Task.Run(() => + { + while (true) + { + if (this.IsHandleCreated) + { + // 检查是否创建了窗口句柄,再Invoke委托。 + break; + } + } + Main_Action = (Main? main) => + { + if (!Usercfg.FunGame_isConnected) + { + NOW_CONNECTEDRETRY++; + if (NOW_CONNECTEDRETRY == 0) + WritelnGameInfo(GetNowTime() + " >> 开始连接服务器..."); + else + WritelnGameInfo(GetNowTime() + " >> 第" + NOW_CONNECTEDRETRY + "次重试连接服务器..."); + if (NOW_CONNECTEDRETRY + 1 > MAX_CONNECTEDRETRY) // 判断重连次数是否达到上限 + { + WritelnGameInfo("ERROR:无法连接至服务器,请检查网络并重启游戏再试。"); + return; + } + WebHelper_Action = (Main? main) => + { + try + { + if (main != null) + { + if (WebHelper != null) + { + WebHelper.WebHelpMethod((int)CommonEnums.WebHelperMethod.CloseSocket); + WebHelper = null; + } + Usercfg.FunGame_isRetrying = true; + Application.DoEvents(); + WebHelper = new WebHelper(main); + WebHelper.WebHelpMethod((int)CommonEnums.WebHelperMethod.CreateSocket); // Invoke -> CreateSocket + } + } + catch + { + + } + }; + Task.Factory.StartNew(() => + { + if (this.InvokeRequired) + { + BeginInvoke(WebHelper_Action, main); + } + else + { + WebHelper_Action(main); + } + }); + } + }; + if (this.InvokeRequired) + { + Invoke(Main_Action, this); + } + else + { + Main_Action(this); + } + }); + } + + /// + /// 设置房间号和显示信息 + /// + /// + private void SetRoomid(string roomid) + { + Usercfg.FunGame_roomid = roomid; + if (!roomid.Equals("-1")) + { + WritelnGameInfo(GetNowShortTime() + " 加入房间"); + WritelnGameInfo("[ " + Usercfg.LoginUserName + " ] 已加入房间 -> [ " + Usercfg.FunGame_roomid + " ]"); + Room.Text = "[ 当前房间 ]\n" + Convert.ToString(Usercfg.FunGame_roomid); + } + else + Room.Text = "暂未进入房间"; + } + + /// + /// 设置登录信息 + /// + /// + private void SetLoginUser(object[]? objs = null) + { + if (objs != null && objs.Length > 0) + { + LoginUser = (User)objs[0]; + Usercfg.LoginUserName = LoginUser.Userame; + } + LoginAccount(); + } + + /// + /// 向消息队列输出换行符 + /// + private void WritelnGameInfo() + { + GameInfo.Text += "\n"; + GameInfo.SelectionStart = GameInfo.Text.Length - 1; + GameInfo.ScrollToCaret(); + } + + /// + /// 由WebHelper委托向消息队列输出一行文字 + /// + /// + /// + private void WritelnGameInfo(WebHelper webHelper, string msg) + { + if (webHelper != null && msg.Trim() != "") + { + Invoke(new Action(() => + { + GameInfo.Text += msg + "\n"; + GameInfo.SelectionStart = GameInfo.Text.Length - 1; + GameInfo.ScrollToCaret(); + })); + } + } + + /// + /// 向消息队列输出一行文字 + /// + /// + private void WritelnGameInfo(string msg) + { + if (msg.Trim() != "") + { + GameInfo.Text += msg + "\n"; + GameInfo.SelectionStart = GameInfo.Text.Length - 1; + GameInfo.ScrollToCaret(); + } + } + + /// + /// 向消息队列输出文字 + /// + /// + private void WriteGameInfo(string msg) + { + if (msg.Trim() != "") + { + GameInfo.Text += msg; + GameInfo.SelectionStart = GameInfo.Text.Length - 1; + GameInfo.ScrollToCaret(); + } + } + + /// + /// 在大厅中,设置按钮的显示和隐藏 + /// + private void InMain() + { + // 显示:匹配、创建房间 + // 隐藏:退出房间、房间设定 + WritelnGameInfo(GetNowShortTime() + " 离开房间"); + WritelnGameInfo("[ " + Usercfg.LoginUserName + " ] 已离开房间 -> [ " + Usercfg.FunGame_roomid + " ]"); + SetRoomid("-1"); + QuitRoom.Visible = false; + StartMatch.Visible = true; + RoomSetting.Visible = false; + CreateRoom.Visible = true; + } + + /// + /// 在房间中,设置按钮的显示和隐藏 + /// + private void InRoom() + { + // 显示:退出房间、房间设置 + // 隐藏:停止匹配、创建房间 + StopMatch.Visible = false; + QuitRoom.Visible = true; + CreateRoom.Visible = false; + RoomSetting.Visible = true; + } + + /// + /// 加入房间 + /// + /// + /// + private void JoinRoom(bool isDouble, string roomid) + { + if (!isDouble) + if (!RoomText.Text.Equals("") && !RoomText.ForeColor.Equals(Color.DarkGray)) + { + if (CheckRoomIDExist(roomid)) + { + if (Usercfg.FunGame_roomid.Equals("-1")) + { + if (ShowMessage.YesNoMessage("已找到房间 -> [ " + roomid + " ]\n是否加入?", "已找到房间") == (int)CommonEnums.MessageResult.Yes) + { + SetRoomid(roomid); + InRoom(); + } + } + else + { + ShowMessage.TipMessage("你需要先退出房间才可以加入新的房间。"); + } + } + else + { + ShowMessage.WarningMessage("未找到此房间!"); + } + } + else + { + RoomText.Enabled = false; + ShowMessage.TipMessage("请输入房间号。"); + RoomText.Enabled = true; + } + else + { + if (CheckRoomIDExist(roomid)) + { + if (Usercfg.FunGame_roomid.Equals("-1")) + { + if (ShowMessage.YesNoMessage("已找到房间 -> [ " + roomid + " ]\n是否加入?", "已找到房间") == (int)CommonEnums.MessageResult.Yes) + { + SetRoomid(roomid); + InRoom(); + } + } + else + { + ShowMessage.TipMessage("你需要先退出房间才可以加入新的房间。"); + } + } + else + { + ShowMessage.WarningMessage("未找到此房间!"); + } + } + } + + /// + /// 这里实现匹配相关的方法 + /// + /// 主要参数:触发方法的哪一个分支 + /// 可传多个参数 + private void StartMatch_Method(int i, object[]? objs = null) + { + switch (i) + { + case (int)CommonEnums.StartMatch_State.Matching: + // 开始匹配 + Usercfg.FunGame_isMatching = true; + int loop = 0; + string roomid = Convert.ToString(new Random().Next(1, 10000)); + // 匹配中 匹配成功返回房间号 + Task.Factory.StartNew(() => + { + // 创建新线程,防止主界面阻塞 + Thread.Sleep(3000); + while (loop < 10000 && Usercfg.FunGame_isMatching) + { + loop++; + if (loop == Convert.ToInt32(roomid)) + { + // 创建委托,操作主界面 + StartMatch_Action = (int i, object[]? objs) => + { + StartMatch_Method(i, objs); + }; + if (this.InvokeRequired) + { + Invoke(StartMatch_Action, (int)CommonEnums.StartMatch_State.Success, new object[] { roomid }); + } + else + { + StartMatch_Action((int)CommonEnums.StartMatch_State.Success, new object[] { roomid }); + } + break; + } + } + }); + break; + case (int)CommonEnums.StartMatch_State.Success: + Usercfg.FunGame_isMatching = false; + // 匹配成功返回房间号 + roomid = "-1"; + if (objs != null) roomid = (string)objs[0]; + if (!roomid.Equals(-1)) + { + WritelnGameInfo(GetNowShortTime() + " 匹配成功"); + WritelnGameInfo(">> 房间号: " + roomid); + SetRoomid(roomid); + } + else + { + WritelnGameInfo("ERROR:匹配失败!"); + break; + } + // 设置按钮可见性 + InRoom(); + // 创建委托,操作主界面 + StartMatch_Action = (int i, object[]? objs) => + { + StartMatch_Method(i, objs); + }; + if (this.InvokeRequired) + { + Invoke(StartMatch_Action, (int)CommonEnums.StartMatch_State.Enable, new object[] { true }); + } + else + { + StartMatch_Action((int)CommonEnums.StartMatch_State.Enable, new object[] { true }); + } + MatchFunGame = null; + break; + case (int)CommonEnums.StartMatch_State.Enable: + // 设置匹配过程中的各种按钮是否可用 + bool isPause = false; + if (objs != null) isPause = (bool)objs[0]; + CheckMix.Enabled = isPause; + CheckTeam.Enabled = isPause; + CheckHasPass.Enabled = isPause; + CreateRoom.Enabled = isPause; + RoomBox.Enabled = isPause; + Login.Enabled = isPause; + break; + case (int)CommonEnums.StartMatch_State.Cancel: + WritelnGameInfo(GetNowShortTime() + " 终止匹配"); + WritelnGameInfo("[ " + Usercfg.LoginUserName + " ] 已终止匹配。"); + Usercfg.FunGame_isMatching = false; + StartMatch_Action = (int i, object[]? objs) => + { + StartMatch_Method(i, objs); + }; + if (this.InvokeRequired) + { + Invoke(StartMatch_Action, (int)CommonEnums.StartMatch_State.Enable, new object[] { true }); + } + else + { + StartMatch_Action((int)CommonEnums.StartMatch_State.Enable, new object[] { true }); + } + MatchFunGame = null; + StopMatch.Visible = false; + StartMatch.Visible = true; + break; + } + } + + /// + /// 登录账号,显示登出按钮 + /// + private void LoginAccount() + { + NowAccount.Text = "[ID] " + Usercfg.LoginUserName; + Login.Visible = false; + Logout.Visible = true; + } + + /// + /// 登出账号,显示登录按钮 + /// + private void LogoutAccount() + { + NowAccount.Text = "请登录账号"; + Logout.Visible = false; + Login.Visible = true; + } + + /// + /// 终止匹配实现方法 + /// + private void StopMatch_Click() + { + StartMatch_Action = (int i, object[]? objs) => + { + StartMatch_Method(i, objs); + }; + if (this.InvokeRequired) + { + Invoke(StartMatch_Action, (int)CommonEnums.StartMatch_State.Cancel, new object[] { true }); + } + else + { + StartMatch_Action((int)CommonEnums.StartMatch_State.Cancel, new object[] { true }); + } + } + + /// + /// 发送消息实现 + /// + /// 是否离开焦点 + private void SendTalkText_Click(bool isLeave) + { + // 向消息队列发送消息 + if (!TalkText.Text.Trim().Equals("") && !TalkText.ForeColor.Equals(Color.DarkGray)) + { + WritelnGameInfo(GetNowShortTime() + " [ " + Usercfg.LoginUserName + " ] 说: " + TalkText.Text); + SwitchTalkMessage(TalkText.Text); + TalkText.Text = ""; + if (isLeave) TalkText_Leave(); // 回车不离开焦点 + } + else + { + TalkText.Enabled = false; + ShowMessage.TipMessage("消息不能为空,请重新输入。"); + TalkText.Enabled = true; + } + } + + /// + /// 发送消息实现,往消息队列发送消息 + /// + /// + private void SendTalkText_Click(string msg) + { + WritelnGameInfo(GetNowShortTime() + " [ " + Usercfg.LoginUserName + " ] 说: " + msg); + } + + /// + /// 焦点离开聊天框时设置灰色文本 + /// + private void TalkText_Leave() + { + if (TalkText.Text.Equals("")) + { + TalkText.ForeColor = Color.DarkGray; + TalkText.Text = "向消息队列发送消息..."; + } + } + + /// + /// 这里实现创建房间相关的方法 + /// + /// 主要参数:触发方法的哪一个分支 + /// 可传多个参数 + private void CreateRoom_Method(int i, object[]? objs = null) + { + if (!Usercfg.FunGame_roomid.Equals("-1")) + { + ShowMessage.WarningMessage("已在房间中,无法创建房间。"); + return; + } + string roomid = ""; + string roomtype = ""; + if (objs != null) + { + roomtype = (string)objs[0]; + } + switch (i) + { + case (int)CommonEnums.CreateRoom_State.Creating: + CreateRoom_Action = (int i, object[]? objs) => + { + CreateRoom_Method(i, objs); + }; + if (this.InvokeRequired) + { + Invoke(CreateRoom_Action, (int)CommonEnums.CreateRoom_State.Success, new object[] { roomtype }); + } + else + { + CreateRoom_Action((int)CommonEnums.CreateRoom_State.Success, new object[] { roomtype }); + } + break; + case (int)CommonEnums.CreateRoom_State.Success: + roomid = Convert.ToString(new Random().Next(1, 10000)); + SetRoomid(roomid); + InRoom(); + WritelnGameInfo(GetNowShortTime() + " 创建" + roomtype + "房间"); + WritelnGameInfo(">> 创建" + roomtype + "房间成功!房间号: " + roomid); + ShowMessage.Message("创建" + roomtype + "房间成功!\n房间号是 -> [ " + roomid + " ]", "创建成功"); + break; + } + } + + /// + /// 设置服务器连接状态指示灯 + /// + /// + private void SetServerStatusLight(bool green) + { + if (green) + { + Connection.Text = "服务器连接成功"; + this.Light.Image = global::FunGame.Properties.Resources.green; + } + else + { + Connection.Text = "服务器连接失败"; + this.Light.Image = global::FunGame.Properties.Resources.red; + } + } + + #endregion + + #region 事件 + + /// + /// 关闭程序 + /// + /// + /// + private void Exit_Click(object sender, EventArgs e) + { + if (ShowMessage.OKCancelMessage("你确定关闭游戏?", "退出") == (int)CommonEnums.MessageResult.OK) + { + if (WebHelper != null) + { + WebHelper.WebHelpMethod((int)CommonEnums.WebHelperMethod.CloseSocket); + WebHelper = null; + } + System.Environment.Exit(0); + } + } + + /// + /// 鼠标按下,开始移动主窗口 + /// + /// + /// + private void Title_MouseDown(object sender, MouseEventArgs e) + { + //判断是否为鼠标左键 + if (e.Button == MouseButtons.Left) + { + //获取鼠标左键按下时的位置 + this.LOCATION_X = e.Location.X; + this.LOCATION_Y = e.Location.Y; + } + } + + /// + /// 鼠标移动,正在移动主窗口 + /// + /// + /// + private void Title_MouseMove(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + //计算鼠标移动距离 + this.Left += e.Location.X - this.LOCATION_X; + this.Top += e.Location.Y - this.LOCATION_Y; + } + } + + /// + /// 开始匹配 + /// + /// + /// + private void StartMatch_Click(object sender, EventArgs e) + { + // 开始匹配 + WritelnGameInfo(GetNowShortTime() + " 开始匹配"); + WritelnGameInfo("[ " + Usercfg.LoginUserName + " ] 开始匹配"); + WriteGameInfo(">> 匹配参数:"); + if (!Usercfg.Match_Mix && !Usercfg.Match_Team && !Usercfg.Match_HasPass) + WritelnGameInfo("无"); + else + { + WriteGameInfo((Usercfg.Match_Mix ? " 混战房间 " : "") + (Usercfg.Match_Team ? " 团队房间 " : "") + (Usercfg.Match_HasPass ? " 密码房间 " : "")); + WritelnGameInfo(); + } + // 显示停止匹配按钮 + StartMatch.Visible = false; + StopMatch.Visible = true; + // 暂停其他按钮 + StartMatch_Method((int)CommonEnums.StartMatch_State.Enable, new object[] { false }); + // 创建委托,开始匹配 + StartMatch_Action = (int i, object[]? objs) => + { + StartMatch_Method(i, objs); + }; + // 创建新线程匹配 + MatchFunGame = Task.Factory.StartNew(() => + { + + if (this.InvokeRequired) + { + Invoke(StartMatch_Action, (int)CommonEnums.StartMatch_State.Matching, null); + } + else + { + StartMatch_Action((int)CommonEnums.StartMatch_State.Matching, null); + } + }); + } + + /// + /// 创建房间 + /// + /// + /// + private void CreateRoom_Click(object sender, EventArgs e) + { + string roomtype = ""; + if (Usercfg.Match_Mix && Usercfg.Match_Team) + { + ShowMessage.WarningMessage("创建房间不允许同时勾选混战和团队!"); + return; + } + else if (Usercfg.Match_Mix && !Usercfg.Match_Team && !Usercfg.Match_HasPass) + { + roomtype = Config.GameMode_Mix; + } + else if (!Usercfg.Match_Mix && Usercfg.Match_Team && !Usercfg.Match_HasPass) + { + roomtype = Config.GameMode_Team; + } + else if (Usercfg.Match_Mix && !Usercfg.Match_Team && Usercfg.Match_HasPass) + { + roomtype = Config.GameMode_MixHasPass; + } + else if (!Usercfg.Match_Mix && Usercfg.Match_Team && Usercfg.Match_HasPass) + { + roomtype = Config.GameMode_TeamHasPass; + } + if (roomtype.Equals("")) + { + ShowMessage.WarningMessage("请勾选你要创建的房间类型!"); + return; + } + CreateRoom_Action = (int i, object[]? objs) => + { + CreateRoom_Method(i, objs); + }; + if (this.InvokeRequired) + { + Invoke(CreateRoom_Action, (int)CommonEnums.CreateRoom_State.Creating, new object[] { roomtype }); + } + else + { + CreateRoom_Action((int)CommonEnums.CreateRoom_State.Creating, new object[] { roomtype }); + } + } + + /// + /// 退出房间 + /// + /// + /// + private void QuitRoom_Click(object sender, EventArgs e) + { + InMain(); + } + + /// + /// 房间设置 + /// + /// + /// + private void RoomSetting_Click(object sender, EventArgs e) + { + + } + + /// + /// 查找房间 + /// + /// + /// + private void QueryRoom_Click(object sender, EventArgs e) + { + JoinRoom(false, RoomText.Text); + } + + /// + /// 登出 + /// + /// + /// + private void Logout_Click(object sender, EventArgs e) + { + LogoutAccount(); + } + + /// + /// 登录 + /// + /// + /// + private void Login_Click(object sender, EventArgs e) + { + LoginAccount(); + } + + /// + /// 终止匹配 + /// + /// + /// + private void StopMatch_Click(object sender, EventArgs e) + { + StopMatch_Click(); + } + + /// + /// 双击房间列表中的项可以加入房间 + /// + /// + /// + private void RoomList_MouseDoubleClick(object sender, MouseEventArgs e) + { +#pragma warning disable CS8600, CS8604 + if (RoomList.SelectedItem != null) + JoinRoom(true, RoomList.SelectedItem.ToString()); + } + + /// + /// 点击发送消息 + /// + /// + /// + private void SendTalkText_Click(object sender, EventArgs e) + { + SendTalkText_Click(true); + } + + /// + /// 勾选混战选项 + /// + /// + /// + private void CheckMix_CheckedChanged(object sender, EventArgs e) + { + if (CheckMix.Checked) Usercfg.Match_Mix = true; + else Usercfg.Match_Mix = false; + } + + /// + /// 勾选团队选项 + /// + /// + /// + private void CheckTeam_CheckedChanged(object sender, EventArgs e) + { + if (CheckTeam.Checked) Usercfg.Match_Team = true; + else Usercfg.Match_Team = false; + } + + /// + /// 勾选密码选项 + /// + /// + /// + private void CheckHasPass_CheckedChanged(object sender, EventArgs e) + { + if (CheckHasPass.Checked) Usercfg.Match_HasPass = true; + else Usercfg.Match_HasPass = false; + } + + /// + /// 点击房间号输入框事件 + /// + /// + /// + private void RoomText_Click(object sender, EventArgs e) + { + if (RoomText.Text.Equals("键入房间代号...")) + { + RoomText.ForeColor = Color.DarkGray; + RoomText.Text = ""; + } + } + + /// + /// 焦点离开房间号输入框事件 + /// + /// + /// + private void RoomText_Leave(object sender, EventArgs e) + { + if (RoomText.Text.Equals("")) + { + RoomText.ForeColor = Color.DarkGray; + RoomText.Text = "键入房间代号..."; + } + } + + /// + /// 房间号输入框内容改变事件 + /// + /// + /// + private void RoomText_KeyUp(object sender, KeyEventArgs e) + { + RoomText.ForeColor = Color.Black; + if (e.KeyCode.Equals(Keys.Enter)) + { + // 按下回车加入房间 + JoinRoom(false, RoomText.Text); + } + } + + /// + /// 点击聊天框事件 + /// + /// + /// + private void TalkText_Click(object sender, EventArgs e) + { + if (TalkText.Text.Equals("向消息队列发送消息...")) + { + TalkText.ForeColor = Color.DarkGray; + TalkText.Text = ""; + } + } + + /// + /// TalkText离开焦点事件 + /// + /// + /// + private void TalkText_Leave(object sender, EventArgs e) + { + TalkText_Leave(); + } + + /// + /// 聊天框内容改变事件 + /// + /// + /// + private void TalkText_KeyUp(object sender, KeyEventArgs e) + { + TalkText.ForeColor = Color.Black; + if (e.KeyCode.Equals(Keys.Enter)) + { + // 按下回车发送 + SendTalkText_Click(false); + } + } + + /// + /// 版权链接点击事件 + /// + /// + /// + private void Copyright_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + // Copyright 2022 mili.cyou + Process.Start(new ProcessStartInfo("https://mili.cyou/fungame") { UseShellExecute = true }); + } + + /// + /// 点击快捷消息 + /// + /// + /// + private void PresetText_SelectedIndexChanged(object sender, EventArgs e) + { + // 发送快捷消息并执行功能 + if (PresetText.SelectedIndex != 0) + { + string s = PresetText.SelectedItem.ToString(); + SendTalkText_Click(s); + SwitchTalkMessage(s); + PresetText.SelectedIndex = 0; + } + } + + /// + /// 最小化窗口 + /// + /// + /// + private void MinForm_Click(object sender, EventArgs e) + { + this.WindowState = FormWindowState.Minimized; + } + + #endregion + + #region 工具方法 + + /// + /// 判断是否存在这个房间 + /// + /// + /// + private bool CheckRoomIDExist(string roomid) + { + foreach (string BoxText in RoomList.Items) + { + if (roomid.Equals(BoxText)) + { + return true; + } + } + return false; + } + + /// + /// 判断快捷消息 + /// + /// + private void SwitchTalkMessage(string s) + { + switch (s) + { + case Config.FunGame_SignIn: + break; + case Config.FunGame_ShowCredits: + break; + case Config.FunGame_ShowStock: + break; + case Config.FunGame_ShowStore: + break; + case Config.FunGame_CreateMix: + CreateRoom_Action = (int i, object[]? objs) => + { + CreateRoom_Method(i, objs); + }; + if (this.InvokeRequired) + { + Invoke(CreateRoom_Action, (int)CommonEnums.CreateRoom_State.Creating, new object[] { Config.GameMode_Mix }); + } + else + { + CreateRoom_Action((int)CommonEnums.CreateRoom_State.Creating, new object[] { Config.GameMode_Mix }); + } + break; + case Config.FunGame_CreateTeam: + CreateRoom_Action = (int i, object[]? objs) => + { + CreateRoom_Method(i, objs); + }; + if (this.InvokeRequired) + { + Invoke(CreateRoom_Action, (int)CommonEnums.CreateRoom_State.Creating, new object[] { Config.GameMode_Team }); + } + else + { + CreateRoom_Action((int)CommonEnums.CreateRoom_State.Creating, new object[] { Config.GameMode_Team }); + } + break; + case Config.FunGame_StartGame: + break; + case Config.FunGame_AutoRetryOn: + WritelnGameInfo(">> 自动重连开启"); + Usercfg.FunGame_isAutoRetry = true; + break; + case Config.FunGame_AutoRetryOff: + WritelnGameInfo(">> 自动重连关闭"); + Usercfg.FunGame_isAutoRetry = false; + break; + case Config.FunGame_Retry: + if (!Usercfg.FunGame_isRetrying) + { + NOW_CONNECTEDRETRY = -1; + Connect(); + } + else + WritelnGameInfo(">> 你不能在连接服务器的同时重试连接!"); + break; + } + } + + /// + /// 获取系统日期 + /// + /// + private string GetNowTime() + { + DateTime now = System.DateTime.Now; + return now.AddMilliseconds(-now.Millisecond).ToString(); + } + + /// + /// 获取系统短日期 + /// + /// + private string GetNowShortTime() + { + DateTime now = System.DateTime.Now; + return now.AddMilliseconds(-now.Millisecond).ToString("T"); + } + + #endregion + } +} \ No newline at end of file diff --git a/FunGame/UI/Main/Main.resx b/FunGame/UI/Main/Main.resx new file mode 100644 index 0000000..e7db271 --- /dev/null +++ b/FunGame/UI/Main/Main.resx @@ -0,0 +1,1193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAEAgIAAAAEAIAAoCAEAFgAAACgAAACAAAAAAAEAAAEAIAAAAAAAAAABABILAAASCwAAAAAAAAAA + AACniJ3/p4id/6aHnf+piaH/mnqT/31ddv+AYHn/gmF6/3tbdP+KdIr/zMjb/73H1v+/x9X/xMnZ/727 + zf97Y3v/g1x5/4Ngev94YHX/emZ3/9vW2//g6OT/3eTh/9/k4v/e4+H/9vn4//3//v/9/v7//v7+//7+ + /v/+/v7//v7+//7+/v/+/v7///3///7+/v/8//3//P/9//v8+///////v7W+/3NUbv+DYn3/gF96/4Bf + ev+AX3r/gF96/4Bfev+AYXz/eVZ1/5mElv//////+P76//3+/v//////9/v6/9/k4v/g5eP/3+Ti/9/k + 4v/h5uT/+/38///+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/f/7/fr//////5uKmP96VXX/hV9+/39i + ev92WXH/rJ61/8jN3/+8xdb/w8fX/8LH1v/Bx9b/xMfW/8LH1v++xdb/yszf/6qetP91WXH/hGB7/4Bf + ev+AX3r/gF96/4Bfev+AX3r/gF96/4Jfev+CX3n/fWB5/39gef+EYHr/fl13/31nf//DwdT/wcjX/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/6eInf+niJ3/poed/6mJof+aepP/fV12/4Bg + ef+CYXr/e1t0/4p0iv/MyNv/vcfW/7/H1f/Eydn/vbvN/3tje/+DXHn/g2B6/3hgdf96Znf/29bb/+Do + 5P/d5OH/3+Ti/97j4f/2+fj//f/+//3+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v///f///v7+//z/ + /f/8//3/+/z7//////+/tb7/c1Ru/4Niff+AX3r/gF96/4Bfev+AX3r/gF96/4BhfP95VnX/mYSW//// + ///4/vr//f7+///////3+/r/3+Ti/+Dl4//f5OL/3+Ti/+Hm5P/7/fz///7+//7+/v/+/v7//v7+//7+ + /v/+/v7//v79//v9+v//////m4qY/3pVdf+FX37/f2J6/3ZZcf+snrX/yM3f/7zF1v/Dx9f/wsfW/8HH + 1v/Ex9b/wsfW/77F1v/KzN//qp60/3VZcf+EYHv/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gl96/4Jf + ef99YHn/f2B5/4Rgev9+XXf/fWd//8PB1P/ByNf/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/p4id/6eInf+mh53/qYmh/5p6k/99XXb/gGB5/4Jhev97W3T/inSK/8zI2/+9x9b/v8fV/8TJ + 2f+9u83/e2N7/4Ncef+DYHr/eGB1/3pmd//b1tv/4Ojk/93k4f/f5OL/3uPh//b5+P/9//7//f7+//7+ + /v/+/v7//v7+//7+/v/+/v7//v7+///9///+/v7//P/9//z//f/7/Pv//////7+1vv9zVG7/g2J9/4Bf + ev+AX3r/gF96/4Bfev+AX3r/gGF8/3lWdf+ZhJb///////j++v/9/v7///////f7+v/f5OL/4OXj/9/k + 4v/f5OL/4ebk//v9/P///v7//v7+//7+/v/+/v7//v7+//7+/v/+/v3/+/36//////+bipj/elV1/4Vf + fv9/Ynr/dllx/6yetf/Izd//vMXW/8PH1//Cx9b/wcfW/8TH1v/Cx9b/vsXW/8rM3/+qnrT/dVlx/4Rg + e/+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev+CX3r/gl95/31gef9/YHn/hGB6/35dd/99Z3//xMHU/8HI + 1//Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v+niJ3/p4id/6aHnf+piaH/mnqT/31d + dv+AYHn/gmF6/3tbdP+KdIr/zMjb/73H1v+/x9X/xMnZ/7y7zf97Y3v/g1x5/4Ngev94YHX/emZ3/9zW + 3P/h6eX/3uXi/+Dl4//f5OL/9vn4//7//v/9/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7///3///z9 + /P/5/Pr/+fz6//j5+P//////vrS9/3RUbv+DYn3/gF96/4Bfev+AX3r/gF96/4Bfev+AYXz/eVZ1/5mE + lv//////+P75//3+/v//////9/v6/9/k4v/g5eP/3+Ti/9/k4v/h5uT/+/38///+/v/+/v7//v7+//7+ + /v/8/Pz/+/v7//v8+//4+/f//////5yKmf99V3f/h2GA/4FjfP94W3P/rZ+1/8jN3/+8xdb/w8fX/8LH + 1v/Bx9b/xMfW/8LH1v++xdb/yszf/6qetP91WXH/hGB7/4Ffev+AX3r/gF96/4Bfev+AX3r/gF96/4Jf + ev+CX3n/fWB5/39gef+EYHr/fl13/31nf//CwNL/v8fV/77F1P++xdT/vsXU/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/6eInf+niJ3/poed/6mJof+aepP/fV12/4Bgef+CYXr/e1t0/4p0iv/MyNv/vcfW/7/H + 1f/Fydn/vbvO/3tje/+DXXn/g2B7/3hgdf96ZXf/2tTa/97m4//b4t//3ePg/9zi4P/1+ff//f////3+ + /f/+/v7//v7+//7+/v/+/v7//v7+//7+/v///f///////////////////fz8//////+/t77/dFRu/4Ni + ff+AX3r/gF96/4Bfev+AX3r/gF96/4BhfP95VnX/mYSW///////4/vr//f7+///+///3+/r/3+Ti/9/l + 4v/f5OL/3+Ti/+Hm5P/7/fz///7+//7+/v/+/v7///7+//////////////////39/f//////lYaT/3FN + bP99WHf/d1pz/21Raf+pnLL/yM3f/7zF1v/Dx9f/wsfW/8HH1v/Ex9b/wcfW/77G1v/Kzd//qp60/3VZ + cf+EYHv/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gl96/4Jfef9+YHn/f2B5/4Ngev9+XXb/fmiA/8zI + 2//K0N//yc7e/8nO3v/Jzt3/wcjX/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/p4id/6eInf+mh53/qYmh/5p6 + k/99XXb/gGB5/4Jhev97W3T/inSK/8zI2/+9x9b/v8fV/8bJ2f/Au8z/f2N6/4dcef+FXnr/e152/39m + ev/o3uj/8fLz/+rw7v/n8ez/5/Ls//X9+f/7//7//f/8//7//P/+//3//f/9//z+/v/8/v7/+/3+//7/ + ///Xz9n/vqu8/8m2xv/DtL//yLvF/6SOn/95WHP/gmF8/4Bfev+AX3r/gF96/4Bfev9/YHr/f2J8/3dX + df+YhJb///////n+/P/+/P7///7///X8+P/d5uD/3ubg/93m4P/d5uD/3+ji//r9+/////3///78///9 + /P///P3/x7/F/720vf/CtcD/w7PA/8S0wv+lmKv/lYyi/5mOpf+djaX/kYye/7Cywv/Fytr/wMbV/8LH + 1v/Cx9b/wsfW/8PH1v/AyNb/vMbW/8nN3/+onrT/dFhx/4Ngev99YHn/fWB5/35gef9+YHn/fmB5/4Bg + ef+AX3n/gF96/4Bfev+AX3r/gF96/35deP+CY33/p5Or/6aXrv+pla3/qZas/6aZrv/BwdL/v8jY/77G + 1f/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v+niJ3/p4id/6aHnf+piaH/mnqT/31ddv+AYHn/gmF6/3tbdP+KdIr/zMjb/73H + 1v+/x9X/xcrZ/728y/98Y3r/hFx4/4Nge/95YHf/e2d6//Pu8////////v79//7//P/9//z//P77//79 + /f/+//3//v/8//3//f/8//3/+//9//r//f/3/fv//////6SYp/9mSWP/dlhv/3FZaf9xWGn/eVpz/4Fg + e/+AX3r/gF96/4Bfev+AX3r/gF96/39fev9/YXz/d1d1/5iEl///////9/76//z9/v///v//9/v6/+Dk + 4v/g5eL/4OTi/+Dk4v/i5uT//P38///+/v/9/v7//v3+//33/f+BcID/aVFn/29Ybv9vV23/ZlBn/7au + wv/N0+X/xMze/8vM3//Kz9//xMrZ/8HG1f/BxtX/wsfW/8LH1v/Cx9b/wsfW/7/I1v+9xtb/ys3f/6qe + s/92WXH/hWF6/39gef9+YHn/fmB5/35gef9+YHn/fmB5/39gef+AX3r/gF96/4Fge/9/Xnn/fl14/4Ff + ev9yWHL/cVhy/3ZXcv91WHH/blpx/7y3yv/Dytz/vsbV/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/6eInf+niJ3/poed/6mJ + of+aepP/fV12/4Bgef+CYXr/e1t0/4p0iv/MyNv/vcfW/7/H1f/Fytn/vbzL/3pkev+BXXj/gWF7/3dg + d/95ZXn/8u3x/////v/9/vn//f75//79+f///v3///3////+/v/+//3//f/9//z//f/5//r/+f/6//X9 + +P//////q6Gs/3ZZcv+DZn3/fmR3/39ief+DX33/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/4Fg + ff94VnT/mIWW///////1/vf/+f77///////6+/r/4uTj/+Lk4//i4+L/4uTi/+Tm5f/+/P3///7///n+ + /v/4/f///Pj//495jf+DXHr/gmJ9/39kfP90XXX/sqzA/7/K2v+1xdP/u8bT/7/F0//BxtX/wsfW/8LH + 1v/Cx9b/wsfW/8LH1v/Bx9b/wMfW/77G1v/MzN//rZ60/3hYcf+HYHr/g195/4Fgef+AYHn/gGB5/4Bg + ef+AYHn/f2B5/4Bfev+AX3r/gF96/39eef+AX3r/f155/31he/9+YXv/gmB7/4Fgev97ZHz/wLnN/8LH + 2f+/xtX/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/p4id/6eInf+mh53/qYmh/5p6k/99XXb/gGB5/4Jhev97W3T/inSK/8zI + 2/+9x9b/v8fV/8bI2P/Busv/f2R7/4Vfe/+CYHv/e193/4FnfP/x6/D/+//8//n8+f/5/fr/+fv6//z8 + /P/9/v7//f39//z9/f/6/fz/+v37//n9+v/5/fr/9vv4//////+soav/dVZu/4Rjff99YXf/gF95/4Nc + fP+BX3v/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gGB8/3lXdP+Xg5X///////T89f/4/fn//P78//T6 + 9f/d5d7/3ubf/97m3//c5N3/3ufg//r79//9/fr/+P36//X8+//6+f3/j3qK/4Rcdv+FX3v/g2B7/3lc + df+1qsD/xczc/7vH1P/AyNX/wsfW/8HG1f/Cx9b/wsfW/8LH1v/Cx9b/wsfW/8DH1v+/yNb/v8XW/83L + 3v+snbP/d1t0/4VifP+AYHn/gGF6/4Bhev9/YHn/gGB5/4Bgef+AYHn/gF96/4Bfev+AX3r/gWB7/4Fg + e/+AX3r/f195/4Bfev+FXnr/gl55/3tief/Cuc3/xcja/77G1f/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v+niJ3/p4id/6aH + nf+piaH/mnqT/31ddv+AYHn/gmF6/3xbdP+KdIr/zMjb/77H1v+/x9X/yMrZ/8G5yv92XHP/eldz/3hZ + dP9zWXH/eV9z//Pw8v///////v7+////////////+v7+//b+/P/6/v3//P39//3+/v////////////// + ///9/P3//////7Gkr/94VHD/hmF9/39hd/9/YHn/hF19/4Ffe/+AX3r/gF96/4Bfev+AX3r/gF96/39f + ef+DYn7/eVVz/5qElv///////v7+/////////////P38/+Tr5P/k7OX/5Ovk/+Xt5f/m7ef//f79//// + //////////////////+Gd4H/dFlq/3tcc/96WXP/cVRt/7apvv/JzN3/wMbV/8bH1v/Dx9b/wsfW/8LH + 1v/Cx9b/wsfW/8LH1v/Cx9b/wMfW/8DH1v/AxdX/zc3g/6WbsP9nU2r/c1x0/3Jbc/9xWXH/d1x0/31g + ef9/YHn/gGB5/4Ffef+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gl96/4Veev+CXnj/e2J5/8C4 + y//Eydv/v8bV/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/6eInf+niJ3/poed/6mJof+aepP/fV12/4Bgef+BYXr/e1t0/4p0 + iv/MyNv/vcfW/8DH1v/Cydf/vMDP/4+Dl/+WgZr/lIOb/42Blv+ShZf/y8HM/9PL0v/SyND/0sjR/87H + zv/p6uv/7/by/+/08f/v8vL/9/b3/9nT2P/Pxs7/08fS/9LE0P/WztX/oImc/39Wdf+HYHz/fmF2/31h + d/+AXnv/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gGB6/39gef99WHf/lXqQ/+La4f/a19j/3tTc/+DU + 3v/d09r/zsTM/8/Fzf/Qxs3/z8XM/9DFzf/Sx9H/0sjS/9PI0f/TyM//0cXP/5qNnP+LgJL/kYaY/5SE + mP+NfpP/ubbI/8PK3P/Axdj/x8XY/8TH1//Cx9b/wsfW/8LH1v/Cx9b/wsfW/8LH1v/Ax9b/wMfW/7/G + 1v/Gy93/rqzA/4V+k/+PhZr/joKY/5SFnP+NeZD/eV93/35gef+CX3n/gl95/4Bfev+AX3r/gF96/4Bf + ev+AX3r/gF96/39fev+BX3r/hF96/4BfeP94Ynn/vbnL/8HK2/++xtX/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/p4id/6eI + nf+mh53/qYmh/5p6k/99XXb/gGB5/4Ngev98WnT/inOK/8zI2/++x9b/wsfW/77H1f+4ydb/y8zf/8/K + 4P/MzOH/y83f/8rI2f90Y3b/b1Rp/3NXbf9zWG3/aldl/8/Iy//m6OP/2+Pe/9rh3//r6uv/joOM/2VR + Yf90WG7/dVZt/25Yav96W3P/h1x8/4Zee/9+YXf/fGJ3/35fev+AX3r/gF96/4Bfev+AX3r/gF96/4Bf + ev+AYHv/fV55/4Bcev+GZ4H/mIOU/5ODj/+ZgJX/nX2X/5t/lv+dgZj/noGY/5+Cmf+egpn/nH+X/3JY + cv9tVW//c1Zu/3RWbP9tV2z/wbnN/83Q5f/Fy9v/y83b/83N3v/ByNn/u8fY/77G2f/Fxdr/xMbX/8LH + 1v/Cx9b/wsfW/8LH1v/Cx9b/wsfW/8DH1v/Ax9b/wMfX/77F1v/Fydv/y8zg/8vL3//Lyd3/1tDl/7yv + xf9yW3P/gGF6/4Nfef+CX3n/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/f196/39fev+CX3r/f194/3Zj + ef+6ucv/vsrb/73G1f/Bx9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v+niJ3/p4id/6aHnf+piaH/mnqT/31ddv+BX3n/hl97/31a + df+Jc4v/y8jb/7/H1v/Ixtb/w8fW/7jI2P/ExNf/xcTX/7vE1f++xtf/ycHU/4Rsg/9/Xnv/hGB//4Rh + ff96YXX/1MvR/+Ts5f/X593/2+fg/+zt7P+ZjJX/dl9v/4Rke/+FYXz/gmJ8/4Bge/+BX3v/gF96/4Bf + ev9/X3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/39efP99W3//fFt7/4dpg/+oi6P/p4mh/6iI + o/+oh6T/qIih/6iJn/+nipz/qIqd/6mKof+lhKD/gmSA/39hfP+EYnz/gWJ7/3djef+3tcf/vcna/7zF + 1P/BxdT/wcXU/8HG1v/Bx9b/wcfX/8LH1//Dx9b/wsfW/8HH1v/Bx9b/wsfW/8TH1v/Ex9b/wcfW/8DH + 1v/Ax9b/wMfW/7/G1f+/xtX/v8XV/7zD1P/Fytz/sKm+/3VbdP+EYHv/gF96/35fev+AX3r/gF96/4Bf + ev+AX3r/gF96/4Bfev9+X3r/fl96/4Jfev9+X3j/dmN5/7m5y/+8y9v/vcbX/8PG2P/Dxtj/wsbY/8HH + 2P+/x9j/v8fY/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/6eI + nf+niJ3/poed/6mJof+aepP/fV12/4Bgev+BYXv/eVt1/4R1iv/EyNr/ucbV/7/G1P+/xtX/vcbX/8bF + 2P/Gxdj/vcbX/8DH2P/Kw9b/gmqC/35dev+DX37/gmB9/3lgdf/SytH/4+jl/9jk3v/c5OD/7ers/5mJ + k/92XG3/gmJ6/4Jfev+BX3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/4Bf + ev+AX3r/gF97/31ee/97Xnb/h2t//6eMnf+lipz/poqd/6aKnv+mip3/poqb/6aMmf+mjJn/p4yc/6OH + m/+AY3v/fV95/4Jfev9/YHn/dWB3/7m1x//Aydr/u8bU/73H1f+9x9X/vcfV/73H1f+9x9X/vcfV/73H + 1f+9x9X/vcfV/73H1f+9x9X/vsfV/77H1f/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/vcXW/8bM + 3f+wq7//dFtz/4Vge/+AX3r/fl96/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/35fev9+X3r/gl96/35f + eP93Ynn/vLjK/8DJ2v++xNb/wcXX/8HF1//Bxtj/wMfY/8DH2P+/x9j/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/p4id/6eInf+mh53/qYmh/5l5kv97W3T/fl53/31f + eP90WXH/g3SJ/8vP4P+/zNz/w8zc/8fM3P/Iytz/x8bY/8TG2P++xtf/wcfY/8bD1v97Zn3/d1hz/3lb + d/94XHb/cFtu/9jO1//v7u//5enp/+no6//67/f/noqY/3Zabv+CYnr/gV96/4Bfev+AX3r/gF96/4Bf + ev+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/fV93/3xfdf+Gan7/o4ia/6GG + mP+hhpr/oYWb/6KFm/+ihZv/ooaa/6KHmf+jh5v/oISZ/39je/99X3r/gV96/39gef94YHf/w7nM/87O + 4P/Fytv/xszc/8bM3P/GzNz/xszc/8bM3P/GzNz/xczc/8XM3P/GzNz/xszc/8XM3P/Ezdz/wMrZ/7/H + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DG1v+9xdb/xszd/7Crv/90W3P/hWB7/4Bfev9+X3r/gF96/4Bf + ev+AX3r/gF96/4Bfev+AX3r/fl96/35fev+BX3r/fl94/3pief/FvND/zc3g/8jK3P/Jy93/x8vd/8HI + 2f/Ax9j/wMfY/8HH2P/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v+niJ3/p4id/6eHnf+piaH/nHyV/4dngP+IaIH/jGmC/4llfv+RdYz/vbHF/7Gvwv+1r8P/ua3C/7uz + xv/Fxdf/wcfY/77F1v/Ex9n/xcTW/4t+k/+LdIz/inaO/4l3jv+Gd4r/w7bF/9TI0v/NxM3/z8PP/9zI + 1/+YfpH/eVty/4Fhe/9/X3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/4Bf + ev+AX3r/gF96/4Bfev9+X3v/elt4/4hpiP+ylLX/r5Cz/66RtP+ukbX/sI+3/7CPtv+wkbb/r4+0/7GS + tv+tjrD/gGOA/31eef+AX3r/gWB5/3tfd/+0orf/vLHF/7muwv+5rsL/ua7C/7muwv+5rsL/ua7C/7mu + wv+3rsL/uK7C/7quw/+5rsL/uK/D/7KtwP+7us3/wsjX/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMbW/73F + 1v/GzN3/sKu//3Rbc/+FYHv/gF96/35fev+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev9+X3r/fl96/4Bf + ev+AX3n/fGF5/7akuf+7scX/t67C/7Wvw/+vr8H/vMHT/8HI2f/Bxtj/w8bY/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/6eInf+niJ3/p4ie/6eHn/+nh6D/qIih/6mJ + of+tiJ7/tImh/6Z+l/92WnH/cl50/3Vddf93WnL/emh9/8TD1v/AyNn/wMXX/8XF2P/Extj/ysjb/8/H + 3P/Mx9z/zcfc/9TM3/+AcYP/b1ps/3NecP90X3L/eF1y/31edf+BYXr/f196/35fev+AX3r/gF96/4Bf + ev+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/39fff94Vnr/lHGb/+XC + 8//du/D/3Lzz/9288v/eu/P/3rv0/9668//eu/L/3r3w/9i35/+CY4b/fF54/4Bfev+CX3n/f2B5/3de + df9yXnT/dVxz/3hcdP94XHT/eFx0/3hcdP94XHT/eFx0/3VcdP93XHT/elt0/3tcdf95X3f/aVZt/56T + p//Jz97/vsXU/8DH1v/Ax9b/wMfW/8DH1v/Axtb/vcXW/8bM3f+wq7//dFtz/4Vge/+AX3r/fl96/4Bf + ev+AX3r/gF96/4Bfev+AX3r/gF96/35fev9+X3r/gF96/4Jfef9/YHn/d151/3JedP91XnT/cl91/2Zc + cP+wsML/xsvd/8HF1//Cxtj/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/p4id/6eInf+niJ7/p4af/6aGn/+mhp//pIad/6WInP+uiJ7/p3+X/39geP99YHn/gmB7/4Nc + dv+GbIP/xMPW/7vG1//Cx9j/x8bY/8DF1v++xtj/vcTX/7zG1/+9xdb/ycfZ/4Z1iv95XHP/gWR8/35g + ev+BYXr/gl96/4Ffev9/X3r/fWB6/39fev+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/4Bf + ev+AX3r/gF96/4Bfev+AYHn/gWN5/3hYd/+Vcp3/3rvx/9i18v/XtPb/17X1/9i28v/YtvT/2LX1/9i2 + 8v/aufD/07Tn/4BjiP98Xnj/gF97/4Jfef+BX3j/gGF5/31heP+AYXn/gl95/4Jgef+CYHn/gmB5/4Jg + ef+BYHn/fmB5/4Bgef+EX3n/hmB6/4Jie/9wWHH/oZSq/8nO3v++xdT/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v+9xdb/xszd/7Crv/91W3P/hWB7/4Bfev9+X3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/fl96/35f + ev+AX3r/gl95/4FfeP9/YXj/fWB3/4hiev+CYHj/cV50/7Www//Jy93/wcXX/8LG2P/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v+niJ3/p4id/6eInv+mhp7/p4ef/6mJ + of+liJ7/oYmc/6mKn/+hfpb/f2B4/35gef+CX3r/hFt2/4hrgv/GxNb/u8fX/77E1f/Gxtj/wcXX/7zH + 2P+5xtf/uMfX/7vG1//Hxtn/hXSL/3xcd/+BYHr/f195/4Ffef+DYHv/gV96/39fev99YHr/f2B6/4Bf + ev+AX3n/gF96/39fef+AX3n/gF95/4Bfef9/X3n/gF95/39eef+AX3r/gF97/4BgeP9/YnT/eFp0/5Fx + mP/fvfL/17Xz/9e19v/YtvX/2Lf0/9e28//YtvX/2bf2/9q48v/Vten/gmOI/35feP+BYHv/gmB6/4Jf + ef+AX3f/gWF5/4Bgef+BYHr/gWB5/4Fgef+BYHn/gWB5/4Bgef9+YXn/gGB5/4Rfef+EYHr/gWJ7/3Fa + cv+gk6n/yM7e/73F1P+/xtb/v8fW/7/G1v+/x9b/vsbW/73F1v/Gy93/sKq//3Nbc/+DYHv/gV96/4Fg + ev+AX3r/gF96/4Bfev+AX3r/f195/4Bfef9+X3n/fl95/4Bfef+BXnj/gF14/39fd/+BYHn/h113/4df + eP93XnT/uK/D/8jL3P/Axtb/wsbY/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+nh5//qYmh/59/mP9/X3j/gF96/4Bg + e/+AXHb/h2qC/8jC1f+/x9j/vsbX/8HE1v/Extj/xcnZ/8bL2v/Dytz/xMjc/87J3v+EcYr/d1p2/35e + d/9+Xnb/gGB4/35fd/+AYHr/gF96/4Bfev9+Xnf/gGB5/35ed/99XXb/fV12/31ddv99XXb/fV11/31d + dv99XXb/fl53/35deP9/Xnn/f157/31fe/94WnX/knOY/+C99P/YtPb/2Lf0/9W28//TtvT/1Ljw/9S1 + 7//WtPT/2rb2/9Ox6P9+XoP/eFlx/3pbdP95W3T/eVt0/3lbdP95W3T/elt0/3lbdP95W3T/eVt0/3lb + dP95W3T/eVt0/3hbdP95W3T/fFp0/31adP96W3T/bVRs/6KRqP/N0eP/wsja/8TK2//Eytv/xMrb/8TK + 3P/Eytv/wcfa/87P4/+1q8H/cFx0/4Bhev+FX3n/g154/35ed/+AYHn/fFx1/35ed/99XXb/fV12/31d + dv99XXX/fV12/31dd/9+Xnj/fl14/4Beev+BYHn/gV95/3hcdP+6r8P/xszc/73H1f/Cx9b/wcfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/p4id/6eInf+niJ3/p4id/6eI + nf+niJ3/p4id/6eHn/+piaH/n3+Y/39feP+AX3r/gGB7/39cdv+HaoH/x8LV/77H2P++xtf/xcfZ/8TF + 1/+/us3/wrjL/7+5zP++t8z/x7rR/4pzjP+CYn3/hGN8/4Nke/+EZHz/gWF6/4Bfef+AX3r/gF96/4Bg + ef+CYnv/hmZ//4Rkff+EZH3/hGR9/4Rkff+EZHz/hGR8/4Rkff+EZH3/g2N9/39eef+AX3v/fV97/3da + df+Scpf/4L30/9i09v/Yt/T/1rjz/9S58P/bwe7/2sHt/9u+7f/ewe//2b/l/451kf+Kb4f/i3GJ/4tx + if+LcYn/i3GJ/4txif+LcYn/i3GJ/4txif+LcYn/i3GJ/4txif+LcYn/inGJ/4pxif+McYn/jHGJ/4xy + i/+BbIL/ppWr/8a+0f+/uMv/wLnM/8C5zP/Aucz/wLnM/8C5zP+8tsv/xbvR/7Ggt/9zXHT/f2F6/4Nf + ef+DX3n/gWF6/4Vlfv+FZX7/hGR9/4Rkff+EZH3/hGR8/4RkfP+EZH3/g2R8/4Vlfv+AXnr/gF96/4Bg + ef+CYHr/eFx0/7qvw//GzNz/vcfV/8LH1v/Bx9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4ef/6mJof+ff5j/f194/4Bf + ev+AYHv/flx2/4Vrgf/GwtX/vcfY/73F1v/Exdj/xMTW/3hrgP94XnX/d2F4/3ZheP93YHj/m36X/6eF + n/+ph6D/p4ef/6iIoP+La4T/fl13/4Ffe/+AYHr/fVx1/5Z2jv+oiKD/pYWe/6eHn/+mhp//poaf/6aH + nf+mh53/poae/6mJov+YeJH/fVx2/4FgfP99X3v/d1p1/5Jyl//gvfT/2LT2/9m39f/Vtu//28Dw//nk + /v/66P7/++b+//rn/v/66fz/++r8//3p/v/96f7//en+//3p/v/96f7//en+//3p/v/96f7//en+//3p + /v/96f7//en+//3p/v/86f7//On+//3p/v/76Pz/9+b5///y//+0pbj/bVZt/3tjev94YHj/eGB4/3hg + eP95YHf/d2B4/3Zief94Ynn/emB4/31gef9+YHn/gmB5/39dd/+GZn7/poae/6WFnf+nh5//poae/6aG + n/+mh57/poed/6aGnv+nh6D/pYWe/4Rjff9/Xnn/gWB6/4Jgef94XHT/uq/D/8bM3P+9x9X/wsfW/8HH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/6eInf+niJ3/p4id/6eI + nf+niJ3/p4id/6eInf+nh5//qYmh/59/mP9/X3j/gF96/4Bge/9+XXb/hGuB/8XC1f+9yNj/vcXW/8bG + 2f/Ew9X/fmuB/4Fcdv+BX3n/fl94/31ed/+ggJn/q4ii/6eGn/+mh5//qoqi/4xshf99XXf/gV97/4Fg + e/99XXX/l3eP/6mJof+nh57/p4ef/6eHn/+nh5//p4id/6eInf+nh57/qYmh/5h4kf99XXX/gF96/35f + e/93WnX/knKX/+C99P/YtPb/2Lf1/9a38P/awe3/+uf+//vs+//67Pz/+ev9//rt+v/67Pz/++v///vr + ///76///++v///vr///76///++v///vr///76///++v///vr///76///++v///nr///57P//+ez///ns + ///26fz///b//7imuf90VG7/g2F7/4BfeP+AX3j/gF94/4BfeP+AX3n/fWB5/35gef9+YHn/f2B5/4Bg + ef+AYHn/f153/4Zmfv+nh5//poee/6eHn/+nh5//p4ef/6eInv+niJ3/p4ie/6eHn/+mhp7/hGR9/35e + d/+AYHn/gmB5/3hcdP+6r8P/xszc/73H1f/Cx9b/wcfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eHn/+piaH/n3+Y/39f + eP+AX3r/gWB7/31ddv+Da4H/xcPV/7zH2P+9xdb/xsbY/8bD1f+AaoL/g1x4/4Nge/+CYHr/gV94/6KA + mP+qiKD/p4ef/6eHn/+piaH/i2uE/35dd/+BX3v/gWB7/31ddP+XeI3/qYqg/6aHnP+niJ3/p4id/6eI + nf+niZz/p4mc/6aHnP+piqD/mHiQ/31ddf+AYHn/fl97/3dadf+Scpf/4L30/9i19v/Zt/X/1rfw/9rA + 7v/76P7/+u75//jt+f/37P3/9+z7//jr/P/56v3/+Ov9//jr/f/46/3/+Or9//jq/f/46v3/+Or9//jq + /f/46v3/+Or9//jq/f/46v3/9ur9//br/f/17P3/9ez9//Xq+///9///uaa6/3ZVcP+FYn3/g2B7/4Ng + e/+DYHv/g197/4Jgev+AYHr/gGB6/4Bgef+AYHn/gGB5/35gef99X3f/h2d9/6eInv+niJ3/p4id/6eI + nf+niJ3/p4id/6eJnP+niJ3/p4id/6aGnv+EZHz/fl53/4Bgef+CYHr/eFx0/7muw//GzNz/vcbU/8LH + 1v/Bx9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v+niJ3/p4id/6eI + nf+niJ3/p4id/6eInf+niJ3/p4ef/6mJof+ff5j/f194/4Bfev+BYHv/fV12/4Frgv/ExNb/vMnZ/73G + 1//Ix9r/x8TX/3xqgv99XHn/f196/4Bgef9+Xnf/oICY/6iJn/+mh57/p4ef/6mJof+La4T/fl13/4Ff + e/+BYHv/fV10/5d4jf+pi5//poec/6eInf+niJ3/p4id/6eJnP+niZz/poic/6mKn/+YeZD/fV10/4Bg + ef99X3v/d1p1/5Jyl//fvPT/2LP2/9i29f/WtvL/2r7w//vo/v/57fr/9+z7//bq///26f//+Or+//nr + /f/56/3/+ev9//nr/f/77P7/++3+//vt/v/77f7/++3+//vt/v/77f7/++3+//vt/v/67f7/9+z9//Ts + /f/07P3/9ur7///3//+6pbj/clNt/4Bge/9+XXn/fl15/35eeP9+Xnj/fl54/39fd/9+X3f/f194/35g + ef9+YHn/fmB5/31fdv+HZ3z/qImd/6eInf+niJ3/p4id/6eInf+niZz/p4mc/6eJnP+niJ3/poad/4Nj + e/9+Xnb/gGB5/4Ffef93W3P/urDE/8bO3f+9yNb/w8jX/8HI1/+/yNb/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+nh5//qYmh/59/ + mP9/X3j/gF96/4Fge/98XXf/gmuC/8e+0v/EwdT/xb/T/8u/1P/LvtP/gGuC/35eeP+AYXv/gWF5/4Bh + eP+hgpj/p4md/6aInv+nh5//qYmh/4trhP9+XXf/gV97/4Fge/99XXX/l3iP/6mKof+mh53/p4id/6eI + nf+niJ3/p4mc/6eJnP+miJ3/qYqg/5h4kP99XXX/f194/4Bge/94Wnb/kXOW/+DC8P/Zuu//2Lzv/9W7 + 7f/bw+3/+ef+//rt/P/47Pv/9+r+//fp/v/46P//+en///np///47fn/9+/5//Hj/P/u4Pn/7+H5//Dh + +P/v4fj/7+H4/+/h+P/v4fj/8OH5/+/f+v/15/3/+Oz8//fr/P/16/j///b//7ykwP90Wnf/gWmB/39n + ff+AZ37/f2WA/35hg/+BYoX/gWCC/4Fhg/+AYYD/fmB5/35hd/9+YXn/fF54/4Rnf/+liZ//pYid/6aJ + nf+miJ3/qIee/6eInf+niZz/p4ic/6iJnv+lhpz/hmZ9/39gd/+CYnr/hGJ7/3pddf+7qsD/ycXZ/8DA + 0//EwNT/yMDU/8XE1v/Bx9f/v8fW/8HH1v/Bx9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/p4id/6eI + nf+niJ3/p4id/6eInf+niJ3/p4id/6eHn/+piaH/n3+Y/39feP+AX3r/gF96/31fev96YXn/gmiA/4Jn + gP+BZn//gmiA/4Jpgf+fg5r/pYWa/6SFmv+khZr/pIWa/6eInf+niJ3/p4ee/6eHn/+piaH/i2uE/35d + d/+BX3v/gWB7/31ddv+Xd5D/qYmi/6aGn/+niJ7/p4id/6eInf+niJ3/p4id/6aHnv+piaL/mHiR/31d + dv+AYHn/g2J7/3ZYc/+Zf5r//+r///fj+//15P3/9eT8//bl/f/46P7/+ev8//rt+//57Pv/+ez9//nq + /v/56v7/+ef///fr/P/06/n/lXnW/35e3P+EZOD/hWHk/4Rh4/+EYeP/hGHj/4Rh4/+GY+X/fF/O/865 + 6P//8P//+er5//bv9P/57vT/9OD2//Hc9f/x4fT/8uHx//Xk9f/lzuv/z7Lf/9Ky5f/TseT/2Lbq/7yd + x/94WnX/f2R2/35heP98XXr/g2aB/6WIoP+kiZ3/pIqc/6WInv+oh6D/p4ef/6eInf+niJ3/p4id/6eI + nf+jhZn/pIWa/6aEnP+khJz/o4Wd/4dthf98Zn//e2iB/31pgv9+YXr/s6W7/8bM3v+8xdb/w8fX/8PH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4ef/6mJ + of+ff5j/f194/4Bfev+AX3r/fl95/31gef97Xnf/el52/3xfd/97Xnf/fF94/6OFnP+pip//qIme/6eI + nf+niJ3/p4id/6iJnv+mhp3/p4ef/6mJof+La4T/fl13/4Ffe/+BYHv/fV12/5d3kP+piaL/poae/6eI + nv+niJ3/p4id/6eInf+niJ3/poed/6mJof+YeJH/fV12/4Bgef+BYXr/eFpy/5d/lf//8f//+ur9//ns + /v/46///+On///fq///46/3/9+v9//jr/v/46v//+Oz9//nu+P/56v7/9uz9//Hn/P+Lat//cUnw/3RR + 6v9zUej/c1Ho/3NR6P9zUej/c1Ho/3VR6/9tRuX/xazt///y///06Pr/+PD6//nx8f/+8Pf//u7///7v + ///+7/7//+7///DX9v/YuO7/2rr1/9a38//gwfv/wKLT/3NZd/99Y3j/fWF4/31def+HZYH/qIeg/6eI + nf+niZz/poie/6WHoP+mh5//p4id/6eInf+niJ3/poec/6eInf+mh5z/p4ef/6eHn/+piqL/hGeA/3dc + df95Xnj/eV95/3RXcP+uorj/x83f/7zF1v/Dx9f/wsfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/6eI + nf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+nh5//qYmh/59/mP9/X3j/gF96/4Bfev+AX3n/f194/39f + eP+AYHn/gGB5/39feP+DY3z/oYKZ/6eInf+mh5z/p4id/6iJnv+mh5z/p4id/6eHn/+nh5//qYmh/4tr + hP9+XXf/gV97/4Fge/99XXb/l3eQ/6mJov+mhp7/p4ie/6eInf+niJ3/p4id/6eInf+mh53/qYmh/5h4 + kf98XHb/gGB5/4Jie/91WG7/mYKV///y///57Pj/+O/3//bt+f/37f3/9uz8//bs/P/27Pz/9uz9//br + /v/47Pz/+e35//fr/f/07vv/7un7/4lu3/9vTPD/cVTp/3FV6P9xVOj/cVTo/3FU6P9xVej/c1Xs/2pI + 5//Cser/+/X5//To/P/05v7/+un8//3q/f/67Pv/+e36//rr/P/96v//79b2/9W17//Ztvf/1rT2/925 + +//BntT/d1h6/4Bief+BYHn/gF16/4hlgf+rhqD/q4ed/6qInP+niJ7/pIig/6aIn/+niJ3/p4id/6eI + nf+mh5z/qYqf/6eInf+nh57/p4ef/6eHn/+JaoP/f154/4Ffe/+DYXz/eFpz/7Glu//Fy93/vMXW/8PH + 1//Cx9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eH + n/+piaH/n3+Y/39feP+AX3r/gF96/4Ffev+AXnf/gmB6/39ddv+CYHn/f112/4Ngev+kg5v/qIme/6eI + nf+niJ3/p4id/6eInf+niJz/p4ee/6eHn/+piaH/i2uE/35dd/+BX3v/gWB7/31ddv+Xd5D/qYmi/6aG + nv+niJ7/p4id/6eInf+niJ3/p4id/6aHnf+piaH/mHiR/31ddv+AYHn/gmJ7/3VXb/+Xf5P///H///nr + +v/47fv/+O76//ju+//37fz/+Oz9//fr/f/26/z/9+z8//nr///56v7/+ej///Xs+f/w6/r/inHV/3JT + 4f91Vuj/c1Ls/3NS6/9zUuv/c1Lr/3NS6/91VO7/bkvi/8S06v/++fv/9Oj9//Tm///46f7//ev8//js + +v/37fr/+ev8//zq///s1PX/07br/9u49f/atPP/47v6/8Wf0/95Vnj/g2B4/4Reev9+W3r/g2SA/6uI + of+qhZv/q4ic/6eInv+kh6D/pYif/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6WHnv+nh5//qIih/4lo + gf+BXXj/hV97/4Vge/94WXL/r6O5/8fN3/+8xdb/w8fX/8LH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4ef/6mJof+ff5j/f194/4Bfev+AX3r/gF95/39g + ef9/YHn/f194/3xddv98XXb/f194/6OEnP+oiZ7/p4id/6eInf+niJ3/p4id/6eInf+nh57/p4ef/6mJ + of+La4T/fl13/4Ffe/+BYHv/fV12/5d3kP+piaL/poae/6eInv+niJ3/p4id/6eInf+niJ3/poed/6mJ + of+YeJH/fV12/39feP+BYHv/dldz/5l/m///7f//+eb+//jn///46P//++n///vn///75///++f///vp + ///66f7/+ev9//jr/f/55f//9+b///Pi/v+Oatv/d07i/3pV3/95VN//eVTf/3lU3/95VN//eVTf/3tV + 4f9yUND/ybTn///z///15/z/9ez+//bx8//78PT/9+z8//fs/P/36/3/++v//+vX9f/Tu+X/1rvp/9m5 + 6P/fv/D/waPM/3ZceP99Y3r/fGF+/3defv98ZoD/o4mg/6iInv+qiJz/qIie/6SHoP+liJ//p4id/6eI + nf+niJ3/p4id/6eInf+niJ3/poif/6eHn/+oiKH/iGiB/35eeP+BX3v/gmB7/3hZcv+vorj/x8zf/7zF + 1v/Dx9f/wsfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eI + nf+nh5//qYmh/59/mP9/X3j/gF96/4Bfev9+Xnj/gGN8/5x/mP+dgJn/nYCZ/6CCm/+cf5j/pIad/6iI + nf+niJ3/p4id/6eInf+niJ3/p4id/6eHnv+nh5//qYmh/4trhP9+XXf/gV97/4Fge/99XXb/l3eQ/6mJ + ov+mhp7/p4ie/6eInf+niJ3/p4id/6eInf+mh53/qYmh/5h4kf98XXb/gGB5/4JgfP94V3f/knWZ/+PI + 7//awe3/2MHw/9rB8f/ewPD/3sDx/96/8f/fwPD/3cHt/+DF7P/25fv/9+78//nn///67fj/+PLx/+XT + 9f/fz/L/4dPx/+DQ8//g0fP/4NHz/+DR8//h0fP/4NDz/9zK9P/v4Pb//u37//no/f/17fz/9u74//np + /f/26v//9+v+//fr///67P//9+b9//Pf+//04fr/7+D4//rq///BtM3/OjJH/0Q+Uf9BOVb/PjVT/1RH + X/+diJ7/o4eb/6mJnP+oiJ7/pIeg/6WIn/+niJ3/p4id/6eInf+niJ3/p4id/6eInf+nh57/p4ef/6eJ + of+GaIH/e154/31ge/9/YXv/d1ly/6+iuP/HzN//vMXW/8PH1//Cx9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eHn/+piaH/n3+Y/39feP+AX3r/gF96/39e + ef+CZH3/pYeg/6aIoP+oiqL/poif/6eKof+nh5//p4ee/6eHnv+nh57/p4ee/6eHnv+nh57/p4ef/6eH + n/+piaH/i2uE/35dd/+BX3v/gWB7/31ddv+Xd5D/qYmi/6aGnv+niJ7/p4id/6eInf+niJ3/p4id/6aH + nf+piaH/mHiR/31ddv+AYHn/fmB2/3hbdP+QdJb/273t/9W28P/St/L/1Ljv/9e38P/XtvH/17Xy/9i3 + 8f/Vt+z/2bzq//jl/f/37P7/9+r///nt+v/57/P//O7+//zw///78v///PH///zx///88f///PH///zx + ///88f//+/D///vv+v/76/n/+ur+//fr/v/36v//+ef///fq/v/36/7/9+v///jr/v/66/7/++z+//zr + ///36/v///n//8O6z/8rJkD/NTVK/zEvUf8tKVH/RT1b/56Ip/+jhKH/poif/6WJnf+lipv/p4mc/6eI + nf+niJ3/p4id/6eInf+niJ3/p4id/6eHn/+nh5//p4mh/4dogf99Xnj/fmB7/39he/93WXL/r6K4/8fM + 3/+8xdb/w8fX/8LH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v+niJ3/p4id/6eInf+niJ3/p4id/6eI + nf+niJ3/p4ef/6mJof+ff5j/f194/4Bfev+AX3r/f154/4Rkff+mhp//p4ef/6eHnv+niJ3/p4ic/6eH + nv+nh5//p4ef/6eHn/+nh5//p4ef/6eHn/+nh5//p4ef/6mJof+La4T/fl13/4Ffe/+BYHv/fV12/5d3 + kP+piaL/poae/6eInv+niJ3/p4id/6eInf+niJ3/poed/6mJof+YeJH/fV12/39gef9+YXn/d1tz/5Bz + lv/evfT/2LX2/9e39v/XuPL/2Lnx/9i48//Yt/X/2Lfz/9e48P/avO7/9+T9//fs/v/46/3/+Ov+//nq + ///46vz/+On9//jp/f/46vz/+Or9//jq/P/46vz/+Or9//jq/f/46vz/+er9//nr/v/56/3/+ev9//nr + /f/56/3/9+v9//fr/f/36/7/9+v9//fr/f/46/z/+ur+//no+f//+/3/xLnO/zAnR/85OEr/NTVN/y8t + T/9IQFn/ooii/6eFn/+nh5//p4ie/6uInP+qiJz/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4ef/6eH + n/+piKH/iGiB/35eeP+BX3v/gmB7/3hZcv+vorj/x8zf/7zF1v/Dx9f/wsfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+nh5//qYmh/59/mP9/X3j/gF96/4Bf + ev9/Xnj/hGR9/6aGn/+nh5//p4ef/6eInf+niJ3/p4ee/6eHn/+nh5//p4ef/6eHn/+nh5//p4ee/6aG + nv+nh57/qYmh/4trhP9+XXf/gV97/4Fge/99XXb/l3eQ/6mJov+mhp7/p4ie/6eInf+niJ3/p4id/6eI + nf+mh53/qYmh/5h4kf99XXX/gF97/35df/94V3r/kXCb/9669v/Xsvj/17T3/9e28//YtvP/2LX1/9i0 + 9v/XtfP/17Xx/9q48f/54v3/+e38//nr/P/57Pv/+ez6//nt+f/57vj/+ez8//nr/f/56/3/+ev9//nr + /f/56/3/+ev9//nr/f/56/3/+ev9//nr/f/56/3/+ev9//nr/f/36/7/9+v9//fr/f/36/3/9ur8//Xp + /P/15f3/9OD7///1///AtNH/LyRP/zc2UP8zNk7/MS9M/05CVf+ki5f/qYiU/6mHm/+ohKH/roSg/6uH + n/+niJ3/p4id/6eInf+niJ3/p4id/6eInf+nh5//p4ef/6iIof+IaIH/fl54/4Bfe/+BYHv/eFly/6+i + uP/HzN//vMXW/8PH1//Cx9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/p4id/6eInf+niJ3/p4id/6eI + nf+niJ3/p4id/6eHn/+piaH/n3+Y/39feP+AX3r/gF96/39eeP+EZH3/poaf/6eHn/+nh5//p4id/6eI + nf+nh57/p4ef/6eHn/+nh5//p4ef/6iIoP+piaH/qYmh/6qKov+ri6P/jGyE/35dd/+BX3v/gWB7/31d + dv+Xd5D/qYmi/6aGnv+niJ7/p4id/6eInf+niJ3/p4id/6aHnf+piaH/mHiR/31ddf9/X3r/fl5+/3hY + d/+Uc5j/6MP4/+G6+P/hvfb/4b/z/+C+9P/gvvT/4b/0/+C+8//gvvP/4L/y//zj/v/+6f///ej///3q + ///76///+uz9//nt+f/56/v/+ev9//nr/f/56/3/+ev9//nr/f/56/3/+ev9//nr/f/56/3/+ev9//nr + /f/56/3/+Ov9//br///36/7/+Ov9//fq/f/57v7//vX///30///89fv//////8TBzv8mHUv/MC5T/y0w + Tf8qJFP/RjVm/6SQpv+nj5v/po2j/6aLqf+riqf/qIef/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eH + n/+nh5//qIih/4hogf9+Xnj/gF97/4Fge/94WXL/r6K4/8fM3/+8xdb/w8fX/8LH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4ef/6mJof+ff5j/f194/4Bf + ev+AX3r/f154/4Rkff+mhp//p4ef/6eHn/+niJ3/p4id/6eHnv+nh5//p4ef/6eHn/+mhp7/j2+H/4ho + gP+La4P/iWmB/4trg/+CYnv/gF95/4Bfev+BYHv/fV12/5d3kP+piaL/poae/6eInv+niJ3/p4id/6eI + nf+niJ3/poed/6mJof+YeJH/fV12/39fef9/YXn/e19z/4Nlf/+Yd53/lnOf/5d2m/+Wd5j/lXWb/5V2 + mv+Vdpr/lnab/5Nzmv+aeqH/3sDp/+TG9f/ixPP/4cXx/97H7P/04/z/+uz///fq/f/56/3/+ev9//nr + /f/56/3/+ev9//nr/f/56/3/+ev9//nr/f/56/3/+ev9//nr/f/46/3/9ev///fr/v/36fr///b//8O4 + yv9gWXH/a2WD/2ljff9nZnT/ZlqQ/2dNt/9kS7v/Y023/2RNvv9hTKz/UEFx/1ZNYv9QSWL/UEVk/11P + Zf+gh5v/qIme/6eInf+niJ3/p4id/6eInf+niJ3/p4ef/6eHn/+oiKH/iGiB/35eeP+AX3v/gWB7/3hZ + cv+vorj/x8zf/7zF1v/Dx9f/wsfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/6eInf+niJ3/p4id/6eI + nf+niJ3/p4id/6eInf+nh5//qYmh/59/mP9/X3j/gF96/4Bfev9/Xnj/hGR9/6aGn/+nh5//p4ef/6eI + nf+niJ3/p4ee/6eHn/+nh5//p4ef/6aGnv+FZX3/e1tz/31ddf9/X3f/fl52/39feP+AYHr/gF96/4Fg + e/99XXb/l3eQ/6mJov+mhp7/p4ie/6eInf+niJ3/p4id/6eInf+mh53/qYmh/5h4kf99XXb/gGB5/35f + dP9/Y3T/fWB0/3hYdv95V3r/eVp0/3lbcv93WnX/d1t0/3dbc/92WnP/dVdz/31dfv/UseT/2rX2/9az + 8//VtfH/07nq//Le+//56v//+Or+//nr/f/56/3/+ev9//nr/f/56/3/+ev9//nr/f/56/3/+ev9//nr + /f/56/3/+ev9//jr/v/06///9+z+//fo+P//+///qJ6y/x4aNf8uKVD/KyNN/yQiQf8+LIL/glr1/3tQ + +P96UvT/e1n4/2lSzf8tIl7/Li5F/yotSP8qKUz/OjRM/5yGmf+piZ7/poid/6eInf+niJ3/p4id/6eI + nf+nh5//p4ef/6iIof+IaIH/fl54/4Bfe/+BYHv/eFly/6+iuP/HzN//vMXW/8PH1//Dx9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eHn/+piaH/n3+Y/39f + eP+AX3r/gF96/39eef+EZH3/poaf/6eHn/+nh5//p4id/6eInf+niJ7/p4ef/6eHn/+mhp7/qIig/4dn + f/99XXX/gWF5/4BgeP+AYHj/gWF6/4Bgev+AX3r/gWB7/31cdv+Xd5D/qYmi/6aGnv+niJ7/p4id/6eI + nf+niJ3/p4id/6aHnf+piaH/mHiR/31ddv+AYHn/gF95/39gdf+AYXj/gFx9/4JdgP+CYHn/gGF3/31f + e/99YHn/fmF5/35hef98XXv/gmKE/9iz5//etvn/2rX1/9m49P/Vu+z/8t/7//fr///46/3/+ev9//nr + /f/56/3/+ev9//nr/f/56/3/+ev9//nr/f/56/3/+ev9//nr/f/56/3/9+v+//Pr///36/7/+On5///4 + //+vpLr/KCVC/zY1WP81OE3/LTQ+/0U6fv97Wef/dE7t/3RT5f91VOn/aE/L/zEoXv8zNkf/MTVQ/zEu + Vv8/N1b/nIWb/6mJnv+niJ3/p4id/6eInf+niJ3/p4id/6eHnv+nh5//qIig/4hogf9+Xnj/gF97/4Fg + e/93WXL/r6O5/8fM3/+8xdb/w8fX/8LH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v+niJ3/p4id/6eI + nf+niJ3/p4id/6eInf+niJ3/p4ef/6mJof+ff5j/f194/4Bfev+AX3r/f154/4RkfP+mhp7/p4ef/6eH + n/+mhp3/poad/6aIn/+miJ//p4ie/6iHnP+ph5z/iWh//35fd/+AYnr/gGF8/4Bgff9+YHn/f2F2/4Bg + ef+BXn//fVx3/5d3kP+piaL/poae/6eInv+niJ3/p4id/6eInf+niJ3/poed/6mJof+YeJH/fFx1/4Fh + ev9/X3n/gWF6/4Fgev+BXnz/gV58/4Ffev+AX3v/gF59/4Bfe/9/X3n/f196/4Befv+EYYT/1bHl/9q2 + +P/YtfX/2Lbz/9W46v/z4Pv/+O3+//nr/f/56/3/+ev9//nr/f/56/3/+ev9//nr/f/46/3/9+v9//fr + /f/36/z/9+v8//js/P/16fj/9ev4//bo+//14/r///n+/6qjtP8pJEb/NjpO/zY3S/8uMUf/Qjh7/3pd + 3/9zTu7/clPn/3dU7P9tTs3/NC5W/zYwVP82NEv/NTBL/0M4WP+bg5r/qoib/6aGnP+lhp3/pYWc/6mI + nf+qiZ3/qIef/6aGn/+piaL/iGiB/31ddv9/X3n/gWF7/3Rac/+rorf/w8nc/7nD1f+/xdf/v8XX/77G + 1//AyNf/wMfW/8DH1v/Ax9b/wMfW/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+nh5//qYmh/59/ + mP9/X3j/gF96/4Bfev9/X3j/hGR8/6aGnv+nh5//pISc/6aGnv+mhp7/p4qh/6iLov+qi6D/rIug/66K + ov+DYXz/dlZ0/3VXdv92Vnn/dlR5/3pbef9/Ynb/gGB5/4Fef/99XHf/l3eQ/6mJov+mhp7/p4ie/6eI + nf+niJ3/p4id/6eInf+mh53/qYmh/5h4kf99XXb/gGB5/39geP9+Xnf/fl53/3tbdP97W3T/e1p1/3ta + df97WnX/e1t0/3xcdP97W3T/eVd0/39cfP/evOn/4sH5/+K/+P/jwPf/4sPy//fi/P/56/7/+Ov9//nr + /f/56/3/+ev9//nr/f/56/3/+ev9//fr/f/36/3/9+v9//js/f/36/v/9en5//vy/f///f////f///zy + /P//////rqe9/x8TT/8wLFb/LihV/yYfU/8+MIP/el3i/3JN7/9wUen/dlfn/2tSwP8oKUb/MChX/y8s + Rv8wK0T/OTJO/56Nn/+rj6X/p42m/6iOp/+rj6f/qImf/6qInP+piKD/poaf/6iIof+GZn//elpz/3xd + df9+Xnf/c1Zv/7KmvP/S1Oj/x8re/8vK3v/OzeH/xcnc/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/p4id/6eI + nf+niJ3/p4id/6eInf+niJ3/p4id/6eHn/+piaH/n3+Y/39feP+AX3r/gF96/39feP+EZHz/poae/6eH + n/+mh5//p4ef/6WFnf+OcYj/jG+G/45vh/+Qbof/kW2L/7KPtP+7mMP/t5XB/7mWxP+8mcb/j26R/3pd + df+AYXn/gV99/31cd/+Xd5D/qYmi/6aGnv+niJ7/p4id/6eInf+niJ3/p4id/6aHnf+piaH/mHiR/31d + dv+AYHn/gWF6/31ddv+JaYP/poaf/6WFnv+lhZ7/pYWe/6WFnf+lhpv/pYaZ/6SFmv+khJz/pYSf/6KC + pP+hf6n/on+q/6F/qf+ggqf/7dnx//3t///46vv/+ev9//nr/f/56/3/+ev9//nr/f/56/3/9+v9//fr + /f/36/3/9+v8//To+P/98v//urHB/3Zwh/+BeJX/f3ST/4B/jP9vZZn/WkSs/1xJrP9cR6f/XEio/2RK + vf93Vej/c07w/3FT5/9zU+v/c1Lh/1pLo/9dRbL/Xker/15Hqf9fSqP/XE92/2BSa/9eUm7/YFFt/2ZS + bf+bgZn/qIif/6WFnf+mhp//qIig/5p6k/+Xd5D/l3iQ/5h3kP+YdY//mYKa/5KHnf+Sh53/loie/42B + l/+uqr7/xcvb/7/G1f/Ax9b/wMfW/8DH1v+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4ef/6mJ + of+ff5j/f194/4Bfev+AX3r/f194/4RkfP+mhp7/p4ef/6eHn/+mhp7/p4ee/35feP95XHX/fV11/4Bd + d/97V3r/0q7d/+fC+f/gvvf/4Lz2/+rG/f+ceqP/d1lz/4Fief+BX3z/fVx3/5d3kP+piaL/poae/6eI + nv+niJ3/p4id/6eInf+niJ3/poed/6mJof+YeJH/fV12/4Bgef+BYXr/fFx1/49viP/Do7v/v6C3/8Cg + t//Aobb/wKK1/8Cjs//Ao7L/wKOz/8Chtf+9nbX/fl54/3dWcv96V3X/eVd1/3VXc//o0uj//+////jq + +//56/3/+ev9//nr/f/56/3/+ev9//nr/f/36/3/9+v9//fr/f/26vz/9Oj4///7//+Qh5r/FhQy/ysm + SP8pI0f/ICE3/0Y4hP+BYfH/eFnq/3xb5/99Xeb/elno/3RQ7P9zT+//c1Tm/3JQ7v90TvT/eV3n/3pU + 9v97VPT/f1j2/3dX4P8vJl3/KytF/ywrSv8vKkr/NitI/5N8lv+niaH/pYWd/6iIoP+mhp7/qYmh/6qK + ov+piaL/qomh/7KLpf+HaIH/blZu/3Rac/93W3T/aVFp/56Uqf/Jz9//vsXU/8DH1v/Ax9b/wMfW/6eI + nf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+nh5//qYmh/59/mP9/X3j/gF96/4Bfev9/X3j/hGR8/6aG + nv+nh5//p4ef/6iIoP+mhp7/g2R9/31fef+BYXn/gmB7/31bf//Lp9n/3Ln2/9Sy8v/VsvL/3rv2/5h2 + ov93WnX/gGJ5/4Jge/99XHb/l3eQ/6mJov+mhp7/p4ie/6eInf+niJ3/p4id/6eInf+mh53/qYmh/5h4 + kf99XXb/gF95/4Bgef99XXb/jW2F/72etP+7nLD/u52w/7udsP+7nq//u56t/7ufrP+6nqz/u52v/7iZ + r/+GZX3/g2F4/4Riev+CYnr/fGB4/+rV6f//8f//+Or8//nr/f/56/3/+ev9//nr/f/56/3/+ev9//fr + /f/36/3/9+v9//fr/f/z5/r///r//5mPpP8mJkb/ODda/zc0WP8wMUz/TT2T/3hT9f9vS/D/c03v/3NO + 7P9zUOv/c1Hs/3NR7P9zUur/c1Pn/3JW4f9yWNr/clPl/3FQ6P91Uuz/blXR/zMyX/8wM1H/MDRV/zEz + Uv84MlD/kX2Y/6eJof+nh57/p4ee/6eHnv+nh57/poed/6aHnf+nhp3/roeh/41shv99X3j/hWF7/4hi + fP92WnL/pJit/8nO3v++xdT/wMfW/8DH1v/Ax9b/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eH + n/+piaH/n3+Y/39feP+BYHv/gWB7/4Bfef+FZX3/pYWd/6aGnv+mhp7/p4ef/6WFnf+CY37/fl56/4Bg + eP+AYHn/fFt9/8up2f/cuvj/1LT0/9W09P/evfj/l3ei/3dadP+AYnj/gmB7/31cdv+Xd5D/qYmi/6aG + nv+niJ7/p4id/6eInf+niJ3/p4id/6aHnf+piaH/mHiR/31ddv+AX3n/gF96/31ddv+NbYX/vp+0/7ue + r/+8n6//vJ6v/7yesP+8n67/vJ+t/7uerf+7nbD/uJiw/4Rkff+AXnj/gWB5/39hef95X3b/59bq//zw + ///36v3/+ev9//nr/f/56/3/+ev9//nr/f/56/3/9+v9//Xp+//05/n/9Oj6//Dk9v//9v//lo2h/yQm + Qv81Nlf/NDJX/y4vSv9NPJL/elX0/3FO7f9yUO3/clDu/3JR6/9zU+j/c1Po/3NR7P90UOz/dFTm/3RU + 5f90U+b/dFDr/3ZQ8f9vVdT/NTNd/zIyUf8wM1T/MDNS/zkyT/+QfJb/p4ee/6aGmv+lhpv/poab/6eI + nP+niJ3/p4id/6eHnP+qiaL/imyF/31cdv+HX3n/iGB7/3RYcf+jl63/yM/e/77F1P/Ax9b/wMfW/8DH + 1v+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4ef/6mJof+efpf/e1t0/31cd/99XHf/e1t0/4Ji + ev+piaH/qoqi/6qKov+ri6P/qYig/4Njf/9+Xnr/gWB5/4Bhef97W3z/yarY/9u89//TtfP/1LXz/969 + 9/+Xd6L/d1p0/4FieP+DX3v/fVx2/5d3kP+piaL/poae/6eInv+niJ3/p4id/6eInf+niJ3/poed/6mJ + of+YeJH/fV12/4Bfef+AX3r/fV13/41thf/Aobb/vaCw/76hsP++oLH/vqCz/76gsf++obH/vqCx/72f + s/+6mrL/hGN//39de/+AX3z/fmB5/3Zfdv/k1un/+fD///Xq+//46/v/+Ov8//jr/P/56/3/+ev+//nr + /f/36f3//PT+///7////+f//+/X8//////+YkaH/Gx44/y4wTv8uK1D/JydD/0k6iv99W+r/clLj/3FU + 5/9xUun/clPn/3NV5P9zVOb/c1Dt/3RO8P93UO3/d0/t/3dS6f90Tuz/eE/2/29R2v8yK1f/MCtJ/yst + TP8rLEr/MitH/5iFmP+vk6L/rY6j/62Ppf+tj6X/p4mf/6eInf+niJ3/poec/6eJov+IbIX/fF12/4df + ef+IYHv/c1hx/6GYrf/Iz97/vsXU/8DH1v/Ax9b/wMfW/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eI + nf+oiZ7/poec/6SEmv+Scoj/k3OK/5Jzif+TdIv/knKL/5V1jv+Scov/lHSN/5NzjP+Scov/gGB8/35f + ev+AYHj/gGB6/3tbff/Jqdn/3Lv4/9a08//XtfL/4L33/5h3of93WnP/gGN4/4Fge/99XXb/l3eQ/6mJ + ov+mhp7/p4ie/6eInf+niJ3/p4id/6eInf+mh53/qYmh/5h4kf99XXb/gGB5/4Bgef98W3X/jGyE/7OU + q/+xkqb/sZOm/7GSp/+xkqf/sZKn/7GTp/+wkab/s5Sp/6+Qpf+CY3v/fV56/4BefP9/X3v/d2F1/+jg + 6f/6+/z/9fb3//j4+P/6+Pr/9u/7//fp///36v//+Or6///y//+9s8P/joqe/5iSp/+Wjaj/mpWn/3Nj + pP9MP5P/UkaX/1JEmv9QP5v/X0e6/3la5v90UeX/dVPo/3RS6P91Uuj/dVPn/3VS6P91Uun/dVHq/3VS + 6f91Uun/dVPo/3VS6P92U+v/clDk/1Y/pP9WRJP/VEaS/1RCm/9YQ5j/ZFx5/2xkcP9pXHn/aFx6/2hb + d/+Wfpn/qoii/6iGn/+kiJ3/qomi/4trhf96XXb/gmB5/4Vhe/9zWHH/o5et/8nP3v++xdT/wMfW/8DH + 1v/Ax9b/p4id/6eInf+niJ3/p4id/6eInf+niJ3/poic/6aHnP+niJ3/poec/6qLoP+qi6D/qouf/6uM + ov+mhZ//fV12/3xcdf98XHX/fl53/31ddv9+Xnr/fl97/4BgeP+AYHr/e1t9/8qp2f/cuvj/17T0/9e1 + 8v/gvff/mHeh/3dbc/9/Y3j/gGB6/31cdv+Xd5D/qYmi/6aGnv+niJ7/p4id/6eInf+niJ3/p4id/6aH + nf+piaH/mHiR/3xcdv+AYHn/gWF6/35ed/+JaYH/qIig/6aGnP+mh5z/poec/6aHnP+mh5z/poec/6SF + mv+lhpv/pIaa/4Bjef99X3n/gF58/4BffP94YnX/6ubp///////6/fz//P78//7//f/48/z/9un///fp + ///16Pn///v//3VtgP8ZGTD/KihD/yoiRf8fHjT/Tzyd/4Nc/f95VPL/e1fx/3tW8/95UvX/dEr1/3ZN + 9f91Uuj/dVLo/3VS6P91Uuj/dVLo/3VS6P91Uuj/dVLo/3VS6P91Uuj/d1Tp/3RS5/92U+n/fFX0/35U + 9/98V+7/f1b4/31W7P84JnD/LSFS/zAnTv8vKkj/LiZD/4lyj/+tiqb/qIae/6SInf+riKL/i2uF/3pd + dv+CYHn/hGF7/3RYcf+kl63/yc/e/77F1P/Ax9b/wMfW/8DH1v+niJ3/p4id/6eInf+niJ3/p4id/6eI + nf+niJ3/pYab/6eInf+mh5z/pYac/6aHnP+mh5z/p4ee/6ODnP+BYXr/f194/4Fhev+BYXr/gGB5/4Bg + fP9+X3v/gGB4/4Bgev97W33/yqnZ/9y6+P/WtPT/17Xy/+C99/+Yd6H/d1pz/39jeP+AYHr/fVx2/5d3 + kP+piaL/poae/6eInv+niJ3/p4id/6eInf+niJ3/poed/6mJof+YeJH/fV12/39feP9/X3j/fV12/4ho + gf+piaH/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6iJnv+lhpv/gWR7/31eef+AXnz/f197/3hh + df/q5en///////r9/P/8/vz//f39//jx/P/26f//9+n///bp+v//9v//fnmO/yYpRP83OFb/ODNY/y8w + Sf9TQqP/elTz/3NP6f91VOP/dVbf/3VX3v94WeL/dlbk/3VS6P91Uuj/dVLo/3VS6P91Uuj/dVLo/3VS + 6P91Uuj/dVLo/3VS6P92U+n/dlPp/3VT6P91UOz/dE7v/3JU5f9yUef/dFfa/zs1Z/8yMkf/ODJR/zg0 + Uv82Lkv/iXSQ/62Kpf+ohp7/pYid/6uIov+La4X/el12/4Jgef+EYXv/dFhx/6SXrf/Jz97/vsXU/8DH + 1v/Ax9b/wMfW/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6aHnP+niJ3/p4id/6eInf+mh5z/p4id/6eI + nP+niJ7/oYGb/4Bgef+AYHn/gGB5/39feP+AYHj/f197/35fe/+AYHj/gGB6/3tbff/Kqdn/3Lr4/9a0 + 9P/XtfL/4L33/5h3of93WnP/f2N4/4Bgev99XHb/l3eQ/6mJov+mhp7/p4ie/6eInf+niJ3/p4id/6eI + nf+mh53/qYmh/5h4kf98XHX/gWF6/39feP99XXb/iWmB/6iIoP+mh53/p4id/6eInf+niJ3/p4id/6aH + nP+mh5z/qIme/6WGmv+BY3r/fV95/4BefP+AX3v/d2Bz/+nk6f//////+v38//v++//+/v3/9/H7//bp + ///36f//9en6///2//96do7/IiVD/zI0Vf80MFf/KCtG/1BAov97VfX/dE7s/3VS6f91U+f/dVTm/3VU + 5/92U+j/dVLo/3VS6P91Uuj/dVLo/3VS6P91Uuj/dVLo/3VS6P91Uuj/dVLo/3ZT6f91Uuj/d1Tp/3RS + 6v9yUev/cVXk/3FS6/9zV9//ODJp/zAxSv81MVH/MzFP/zMuS/+HdJD/rIql/6mGnv+kiJ3/q4ii/4tr + hf96XXb/gmB5/4Rhe/90WHH/pJet/8nP3v++xdT/wMfW/8DH1v/Ax9b/p4id/6eInf+niJ3/p4id/6eI + nf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6iJn/+igpv/gGB5/39feP+AYHn/gGB5/4Bg + ef9/X3v/fl97/4BgeP+AYHr/e1t9/8qp2f/cuvj/1rT0/9e18v/gvff/mHeh/3dac/9/Y3j/gGB6/31c + dv+Xd5D/qYmi/6aGnv+niJ7/p4id/6eInf+niJ3/p4id/6aHnf+piaH/mHiR/31ddv+AYHn/f194/31d + d/+JaYH/qYmh/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+oiZ7/pYab/4Bjev99X3n/gF58/39f + e/93YXT/6uXq///////8/v3//f/9///////48v3/9un///fp///16fr///f//3p1jf8iJUP/MjRV/zQw + V/8qLUj/UECh/3tX8P90UOn/dVHr/3VQ7P91UO3/dU7w/3VP7v91Uuj/dVLo/3VS6P91Uuj/dVLo/3VS + 6P91Uuj/dVLo/3VS6P91Uuj/dVLo/3VS6P91Uuj/dFTl/3JV5P9xV+D/cVPr/3NV4P84MG3/MS9O/zIx + Uv8wMk//MC1K/4d1kP+siqX/qYae/6WInf+riKL/i2uF/3pddv+CYHn/hGF7/3RYcf+kl63/yc/e/77F + 1P/Ax9b/wMfW/8DH1v+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eI + nf+niJ3/qIif/6KCm/+AYHn/f194/4Bgef+AYHn/gGB5/39fe/9+X3v/gGB5/4Fgev97W33/yqnZ/9y6 + +P/WtPP/17Xy/+C99/+Yd6H/eFpz/39jeP+AYHr/fVx2/5d3kP+piaL/poae/6eInv+niJ3/p4id/6eI + nf+niJ3/poed/6mJof+YeJH/fV12/4Bgef9/X3j/fV12/4lpgf+piaD/p4id/6eInf+niJ3/p4id/6eI + nf+niJ3/p4id/6iJnv+lhpv/gGN6/31fef+AXnz/f157/3hhdf/l3eT/9/n3//Dz8f/09vT/9PTz//Xv + +v/36f//9+n///Xp+f//9///fHaM/yMmQf80NVP/NjBV/ywtRv9SQaD/e1jv/3RQ6P91Uer/dVHr/3VR + 6/91UOz/dVHr/3VS6P91Uuj/dVLo/3VS6P91Uuj/dVLo/3VS6P91Uuj/dVLo/3VS6P91Uuj/dVLo/3VS + 6P91U+f/dVLo/3NU5P9zUe3/dVTh/zoxa/8yMEr/MDJR/y4zUP8vLkr/hXWQ/6uKpf+php7/poed/6uI + ov+La4X/el12/4Jgef+EYXv/dFhx/6SXrf/Jz97/vsXU/8DH1v/Ax9b/wMfW/6eInf+niJ3/p4id/6eI + nf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+oiJ//ooKb/4Bgef9/X3j/gGB5/4Bg + ef+AYHn/f2B6/35fev+AYHj/gGF5/3tbff/Jqdr/3Lr5/9a09P/XtfL/4L33/5h3of93W3P/f2N4/4Bh + ev99XXb/l3eQ/6mJov+mhp7/p4ie/6eInf+niJ3/p4id/6eInf+mh57/qYmh/5h4kf99XXX/gGB5/39f + eP99XXb/iWmB/6mJof+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/qIme/6WGm/+AY3r/fV95/4Be + fP9/Xnv/dl9z/9bN1P/i5uL/3OLf/+Dl4f/g4eD/7+r0//fr///36v//9uj5///3//98doz/JCVB/zY1 + Uv84MVP/LS1E/1JBoP97WO//dFHn/3VS6P91U+f/dVTl/3VU5P91VOX/dVHq/3VS6f91Uun/dVLp/3VS + 6f91U+f/dVPn/3VT5/91U+b/dVPm/3VT5/91Uuj/dVLp/3ZR6/91T+7/dFLo/3VQ7v92VeD/OzNn/zQz + RP8yMk//LjJQ/y8uSv+FdY//q4uk/6mGnv+lh53/q4ii/4trhf96XXb/gmB5/4Rhe/90WHH/pJet/8nP + 3v++xdT/wMfW/8DH1v/Ax9b/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eI + nf+niJ3/p4id/6iIn/+igpv/gGB5/39feP+AYHn/gGB5/4Bgef+BYHn/gWB4/39idf9+Ynj/eVt+/8io + 3P/duPz/1rP1/9a18v/evvf/lnih/3dbcv9/Y3f/gGF5/31ddf+Xd4//qYmh/6aGnv+nh5//p4ef/6eH + n/+nh5//p4ef/6aGnv+piaH/mHiQ/31ddf+AYHj/f194/31ddv+JaYH/qYmh/6eInf+niJ3/p4id/6eI + nf+niJ3/p4id/6eInf+oiZ7/pYab/4Fjev9+X3n/gV58/39gev94YnT/1tHT/+Ps4v/a597/3Ofh/9/l + 4//v7vP/9+77//rr/f/55/r///j//3x1jv8kI0X/NTRU/zcyUf8sLkX/Uj+j/3tY7v90Uef/dVLo/3VS + 6P91Uuj/dVLn/3VS6f91UOz/dVLp/3RS6P9zUev/c1Lq/3NV5P90VuL/dVTk/3VV4/91VeP/dVTk/3VT + 5/91Uev/dVHq/3RS6f9xVOX/clHt/3RV4f85MWr/MjFJ/zQwU/8yMFL/My1J/4h1jf+sjKL/qYec/6SH + nv+riKL/i2uF/3pddv+CYHn/hGF7/3RYcf+kl63/yc/e/77F1P/Ax9b/wMfW/8DH1v+niJ3/p4id/6eI + nf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/qIif/6KCm/+AYHn/f194/4Bg + ef+AYHn/gGB5/4Jgef+BYHn/gGJ2/39jeP95XH3/yKjZ/9y4+f/Vs/L/1rTw/9689f+XeKH/eFt0/4Bj + ef+BYHz/fV12/5d3j/+piaH/poae/6eHn/+nh5//p4ef/6aGnv+nh57/poae/6mJof+YeJD/fV10/4Bg + eP9/X3j/fV12/4lpgf+oiKD/poed/6eInP+niJz/p4ic/6eInP+miJz/p4ic/6eJnf+khZr/gWN6/35f + ef+AX3v/f2B6/3hidP/WzdT/5Ojj/9vj3f/e4+L/3+Lj//Ds8//47vv/+uv8//nn+///+P//fHWO/yQj + Rv80NFT/NjJR/ywtRf9SP6P/e1ju/3RR5v91Uuj/dVLo/3VS6P91Uuj/dVPn/3VV4/91VeL/dVTj/3NS + 5v9zUOn/c1Ho/3NQ6f90Tu7/dU7w/3VQ7f91U+j/dVTm/3VS6P91Uuj/c1Lo/3FU5P9xUe3/c1Xh/zkx + av8yMEr/NTBU/zIwUv8zLUn/iXWN/6yMov+ph5z/pYee/6uIov+La4X/el12/4Jgef+EYXv/dFhx/6SX + rf/Jz97/vsXU/8DH1v/Ax9b/wMfW/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eI + nf+niJ3/p4id/6eInf+oiJ//ooKb/4Bgef9/X3j/gGB5/4Bgef+AYHn/f153/35edv9+X3T/fWB1/3ha + eP/Qrtr/5cL6/9678//du/P/58T6/5h4oP91V3H/fV94/31de/96WnT/lnaO/6qKov+mhp7/p4ef/6eH + n/+oiKD/qYmi/6mJov+piaH/rIyk/5p6kv98XXX/gGB5/39eef99XXb/iWmC/6uLpP+piaH/qYqg/6mK + oP+piqD/qYqg/6mKoP+piqD/qouh/6eHnv+CY3v/fV95/4Bfev9/YHr/eWF1/+DT3f/x7u//6ejq/+vo + 7f/t5+//9e34//jt/P/66/7/9+f7///4//98dY7/JCNG/zU0VP82MlH/LC1F/1I/o/97WO7/dFHm/3VS + 6P91Uuj/dVLo/3VS6P91Uun/dFHr/3VQ6v92U+r/eVfs/3pW7f96VPD/elbu/3hV7P91TfP/dU3y/3VR + 6v91VOX/dVPm/3VT5/90Uun/cVTk/3JR7f9zVeH/OTFq/zIwSv81MFT/MjBS/zMtSf+IdY3/rIyi/6mH + nP+lh57/q4ii/4trhf96XXb/gmB5/4Rhe/90WHH/pJet/8nP3v++xdT/wMfW/8DH1v/Ax9b/p4id/6eI + nf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6iIn/+igpv/gGB5/39f + eP+BYXr/f194/4Bgef+JaYL/iWmC/4lqf/+Ia4D/hWeC/7uZv//HpNH/xKLQ/8Og0P/JpdT/mHmd/4Jl + fv+Ia4P/iGiH/4ZmgP+cfJT/qIig/6eHn/+mhp7/p4ef/6KCmv+cfJX/nX2W/519lv+ff5j/kXGK/35e + d/9/X3j/f155/39eef+GZoD/nn6X/519lf+dfZX/nX2V/519lf+dfZX/nX2V/5x8lf+efpb/mnqS/4Bh + ev9+X3r/gF96/35gef97YXf/wq+//9DCzf/Lvsn/zcDM/8q9yv/t4e//++7///jq/v/25/v///j//3x1 + jv8kI0b/NTRU/zYyUf8sLUX/Uj+j/3tY7v90Ueb/dVLo/3VS6P91Uuj/dVLn/3VS6/9zTvH/dlHw/3FR + 3v9jSr//ZU64/2ZNvP9jTbj/ZlG//3VT5f92UPH/dVLp/3VU5f91Uer/dVHq/3RS6P9xVOT/clHt/3NV + 4f85MWr/MjBK/zUwVP8yMFL/My1J/4l1jf+sjKL/qYec/6WHnv+riKL/i2uF/3pddv+CYHn/hGF7/3RY + cf+kl63/yc/e/77F1P/Ax9b/wMfW/8DH1v+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eI + nf+niJ3/p4id/6eInf+niJ3/qImf/6KCm/+AYHn/f194/4Fhev9/X3j/gmJ7/6WFnv+qiqL/qYqf/6iJ + nv+qi6P/gWF//3ZVef95WHv/eVd9/3VSef+Zepf/qo6i/6aJoP+nh6X/qIii/6iIoP+nh5//p4ef/6SE + nP+qiqH/k3OL/3pZc/9+XXj/fVx3/31dd/9+XXf/f154/4Bfev9+XHr/gWB8/35deP99XXb/fV12/31d + dv99XXX/fV12/31ddv99XXb/fl52/35edv9+Xnf/fl54/4Bfev+AX3r/fmB5/39iev92XHH/c1tu/3Vd + cP92XnH/aVNn/9fF2P//8v//9un9//To+///+P//fHWO/yQjRv81NFT/NjJR/ywtRf9SP6P/e1ju/3RR + 5/91Uuj/dVLo/3VS6P91Uuj/dFLn/3JT5v96XOb/Y0+1/yghWf8vL07/Ly1Q/ykmUv82LnT/eF3a/3RQ + 6v91U+j/dVTk/3VQ7f91UOz/dFPo/3FU5f9yUe3/c1Xg/zkxav8yMEr/NDBT/zIwUv8zLUn/iHWN/6yM + ov+ph5z/pYee/6uIov+La4X/el12/4Jgef+EYXv/dFhx/6SXrf/Jz97/vsXU/8DH1v/Ax9b/wMfW/6eI + nf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+oiJ//ooKb/4Bg + ef9/X3f/f194/4Fhev+AYHn/ooOc/6aHoP+mh53/poec/6aHnf+IZ4D/gF97/4Bgev9/YHz/fV17/5l8 + k/+mjJr/pIib/6SFof+mhp//poae/6iHoP+mhp7/p4ef/6mJof+VdY3/fFt3/4Ffe/+AX3r/gWB7/39e + ev9/Xnn/gF56/4Feff9/XXz/gF56/4Bfev9/X3n/gGB5/4Bgef+AYHn/gGB5/4Bgef+AYHn/gmJ7/4Bg + ef+BYHr/gF96/35gef9/YXn/fV94/4Fjff9/YXr/gGF6/4Fie/93W3X/28Xc///x///26f7/8+j7///4 + //98dY7/IyNG/zQ0VP83MlH/LC5E/1I/o/97V+7/dFHm/3VS6P91Uuj/dVLo/3VS6P91U+n/clHo/3pb + 5/9kUbP/LCtT/zM6Q/81Nkj/LzBN/zg0cv92W9r/dE7u/3RR6P91VuH/dVHq/3VQ6/9zU+j/cVXk/3FR + 7f9zVeH/OTFq/zIwSv81MFT/MjBS/zMtSf+JdY3/rIyi/6mHnP+kh57/q4ii/4trhf96XXb/gmB5/4Rh + e/90WHH/pJet/8nP3v++xdT/wMfW/8DH1v/Ax9b/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eI + nv+niJ3/p4id/6eJnf+niZ3/p4mc/6iJn/+jg5v/gGB5/4Bfef+AX3n/f194/4Fhev+ig5z/pomf/6aH + nf+niJ3/p4ed/4lngP9+XHb/gGB3/39fd/9/X3j/mn2R/6iMm/+liZv/pYeg/6iIoP+nh57/poee/6eH + nv+lhZ3/q4ui/5R0i/98W3X/gF96/39fef9+XXf/f155/4Fge/9+XXn/gF57/4BefP+AX3v/gF95/4Bf + ev+AX3n/gF95/4Bfef9/X3n/gGB5/4Bgef9/X3j/gF95/4Bgev9/X3r/fmB5/35gef99X3j/f195/4Ff + ev+CXn3/gmB9/3VYcP/dx9z///H///bq/P/y6fj///n//3x1jv8mJEb/NTVT/zUyUf8sLEz/UkCh/3pZ + 7f9yUeb/c1Ln/3NS6P9zUuj/c1Ln/3RR6/9xS/D/eFbx/2FKvP8tJl3/NTZL/zMzUf8uLlP/OjVx/3Ra + 2v9yTPD/dVHq/3VW4f90U+b/dVLn/3VS5/9yUuj/cVHs/3NX3P84Mmv/MTNI/zIxUf8yMVT/Mi1J/4d2 + jv+qjKP/qIec/6eHnf+riKL/i2uF/3pddv+CYHn/hGF7/3RYcf+kl63/yc/e/77F1P/Ax9b/wMfW/8DH + 1v+niJ3/p4id/6eInf+niJ3/p4id/6eInf+mh53/pYad/6aHnP+niJ3/p4mc/6aIm/+miZn/p4ma/6OE + mP+BYXn/gF96/39ee/9+XXj/gWF6/6ODm/+oiZ7/p4id/6eHn/+nh6D/hmZ//31ed/9/X3j/f194/31d + dv+be5P/qoqh/6eInP+niJ3/p4id/6eInf+niJ3/qIme/6aHnP+qi6D/lHWL/3lZcf9+Xnb/fV12/35e + d/9+XXj/f155/4Bee/+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/4Bf + ev+AX3r/fl96/31gev9+YHr/fF94/31ed/96W3P/fFpy/3tXeP96Wnj/b1Vp/9rG2f//8///9+z8//Tt + 9////P//fXSO/ykhQf82NE//MjFO/yskVP9XRJz/fVzz/3VS7/92VPD/dlTw/3ZU8P92VPD/eFTw/3hU + 8P94WvD/YUy9/ywgWf80MUj/LDBN/ygoTv89MHP/dl7e/3NQ9v95UfT/fFXt/3VV7v94Ve3/e1Pw/3hP + +P94UvX/eFvc/zYpdv8rK0v/LjFN/y4uTf8xKUb/hHOO/6aMpP+oh5z/rIec/62Iof+La4X/el12/4Jg + ef+EYXv/dFhx/6SXrf/Jz97/vsXU/8DH1v/Ax9b/wMfW/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eH + nf+mhp3/poec/6WGnP+qjKD/qoyf/6qNnf+qjZ7/poic/4BheP+AX3r/f117/39eeP+BYXr/o4Ob/6iJ + nv+niJ3/p4ee/6eHn/+GZn//fl53/39feP9/X3j/fl52/5t7k/+piqH/poic/6eInf+niJ3/p4id/6eI + nf+oiZ7/pYab/6mKn/+Wd4z/g2N7/4Zmfv+FZX7/hWV+/4Rjfv9/Xnn/gF96/4Bfev+AX3r/gF96/4Bf + ev+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/f196/39fev9/YHr/fV94/5B0 + i/+Sd43/j3OP/451jv+GcIX/28Te//zk///y3vr/8N/4///t//+FcpP/PSxN/0g8VP9EO1L/PjJY/1pG + i/9xV8z/a1DK/2xRyv9sUcv/bFHK/2xRy/9sUcj/bFPG/21YyP9jUKb/RjVi/04/V/9HPV3/Rjdh/086 + eP9vWMH/ak7Q/25Rzf9uUsf/aVLL/2pRy/9tUMz/a07R/21Qzv9wWL7/STd6/0U5X/9GPln/SUBZ/0g6 + Uv+NeJD/p4yj/6eHnf+rh5z/rIih/4trhf96XXb/gmB5/4Rhe/90WHH/pJet/8nP3v++xdT/wMfW/8DH + 1v/Ax9b/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4ie/6aHnv+lhpv/q4yh/72esv+9n7H/vJ+v/76h + sv+1l6v/gWJ5/4Bfev9/XXr/f154/4Fhev+jg5v/qIme/6eInf+nh5//p4ef/4Zmf/9+Xnf/f194/39f + eP9+Xnb/m3uT/6mKof+miJz/p4id/6eInf+niJ3/p4id/6WGm/+mh5z/qIme/6aHnP+niJ7/p4ee/6eH + n/+qiqP/mHiS/31cdv+BYHv/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/4Bf + ev+AX3r/gF96/4Ffev+CX3r/gl96/4Bgef98X3j/6tbq///v///76v3/+uv9//3r///iyO3/1rfs/9m4 + 8P/XuOv/4MLv/56Aqv9yV3j/e2V7/3Vidf95ZYH/WEVs/y0pUv8wLVb/MCxV/zAsVf8wLFX/LyxV/zEt + WP8xLFz/LCZX/09Faf+jkaH/o4yU/6CJnf+jjqD/jn6N/zIqT/8vK1n/MS1U/zAuUv8sLVb/LCxX/y4s + Vv8tK1j/LixW/zYvT/+Og5T/oJKW/56Mmv+diZ3/ooue/6OInf+liZ3/poid/6mHnf+siKL/i2uF/3pd + dv+CYHn/hGF7/3RYcf+kl63/yc/e/77F1P/Ax9b/wMfW/8DH1v+niJ3/p4id/6eInf+niJ3/p4id/6eI + nf+niJ7/qIif/6WHm/+rjKH/vZ6y/7yesf+8n6//vaCx/7WWqv+AYXj/gF96/39de/9+Xnj/gWF6/6OD + m/+oiZ7/p4id/6eHn/+nh5//hmZ//35ed/9/X3j/f194/35edv+be5P/qYqh/6aInP+niJ3/p4id/6eI + nf+niJ3/p4id/6eInf+mh5z/p4id/6eInf+niJ3/poee/6mJof+YeJH/fV12/4Bgef+AX3r/gF96/4Bf + ev+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gV96/4Jfev+DX3r/gWB5/3tf + d//o1On//vD///bq/f/47P3/++r//+DG8P/WtPT/27T5/9m09P/kv/j/oX2r/3hXdv+AYnj/fWB2/35j + fP9bSGL/MS9J/zQ0Tv80M03/NDNN/zQzTf80M03/NTJP/zUxU/8tKkv/U0dk/6eNpP+rhZ3/qYOk/6qI + p/+SeJH/OS5N/zQzUf80M03/NTNM/zAzT/8wM1D/MTJQ/y80T/8xM07/OzNM/5J+lf+miZ7/pYma/6SK + mv+lipv/pomd/6eInf+niJ3/p4ee/6yIov+La4X/el12/4Jgef+EYXv/dFhx/6SXrf/Jz97/vsXU/8DH + 1v/Ax9b/wMfW/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eInv+nh57/poec/6uMof+9nrL/vJ6x/7yf + r/+9oLH/tZer/4BheP+AX3r/f117/35eeP+BYXr/o4Ob/6iJnv+niJ3/p4ef/6eHoP+GZn//fl53/39f + eP9/X3j/fl52/5t7k/+piqH/poic/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4mc/6eJ + nP+mh5z/qYqg/5h4kP99XXX/gGB5/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/4Bf + e/+AX3v/gF97/4Bfe/+AYHv/gGB7/4Jge/+CYHr/fF93/+nV6v/87///9ev7//bs/f/56///38Xx/9az + 9f/atPj/2bTz/+C8+v+ffav/elh0/4Rhev+AX3v/gGR9/1tJYf8zLVD/NTFW/zUwVf81MFX/NTBV/zUw + Vf81MVP/NTRM/zAwQ/9WTF3/qo6h/62GnP+qhp3/q4in/5RznP85LFL/MzBW/zUvV/83L1X/MzFT/zMw + VP8yMFX/MDBW/zEvVf86LlP/k3qd/6mFp/+nhp7/p4mc/6eInf+niJ3/p4id/6aJnf+lh57/q4ii/4tr + hf96XXb/gmB5/4Rhe/90WHH/pJet/8nP3v++xdT/wMfW/8DH1v/Ax9b/p4id/6eInf+niJ3/p4id/6eI + nf+niJ3/p4id/6eHnv+lhpv/qoug/72esv+8nrH/vJ+u/72gsf+1l6v/gGF4/4Bfev9/XXv/fl54/4Fh + ev+jg5v/qIme/6aHnf+mhp7/p4ef/4Zmf/9+Xnf/f194/39feP9+Xnb/m3uT/6mKof+miJz/p4id/6eI + nf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niZz/p4mc/6aInP+pip//mHmQ/31ddP+AYHj/gF96/4Bf + ev+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev9+XXj/fl14/39deP9+Xnj/f114/3pdeP95XXj/fV14/4Bd + d/96XHT/6tXp//7x///27fv/+O78//rs///fyPL/1rb2/9q5+P/YuPH/37/9/5x9qf93V2//gl94/35a + ff98X3//WEZf/y8tS/8yMVD/MjBP/zIwT/8yME//MjBP/zIwUP8xMFD/Ky1D/1JKXP+njaP/qYed/6aK + mP+pjJ//kXiS/zMvR/8tMU//Ly5U/zQvUf8zMkr/NDNK/zEyTv8tMVH/LTBQ/zYwTf+RfpT/qYyb/6eH + nP+mh6D/poef/6aHoP+liJ7/pYmd/6WInf+riKL/i2uF/3pddv+CYHn/hGF6/3RYcf+kl63/yc/e/77F + 1P/Ax9b/wMfW/8DH1v+niJ7/p4id/6eInf+mh5z/poec/6mKnv+oiZ3/qIqe/6eInP+sjqL/vJ6x/7ye + sf+8nrD/vaCx/7WXqv+AYXj/gF96/39eev9+Xnj/gGB5/6SEnP+piqD/qIme/6iJnf+qiqD/hmZ//31d + d/9/X3n/f194/35edv+be5P/qYqh/6aInP+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eJ + nP+niZz/poid/6mKoP+YeJD/fV11/4Bgef+AYHr/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gGB9/4Rk + hP+FZIb/g2OG/4Njh/+DY4b/gmiE/4FrgP+EaoH/hWmC/4Jngf/o0+v/++r///Ll/P/05f3/+uX//9zB + 6P/SseP/1bTl/9Sx5P/Wue3/m4Kr/3Zgff99aIX/fGOG/3tpiv9WT2z/OjFR/z83Vv87N1X/OTdV/zc4 + VP83OFT/OjZW/z80W/85MFH/Wkto/6aKqv+mg6P/poag/6eKov+Se5L/QjZN/0A4VP9BNVb/QzVV/0Q4 + UP9BNk7/PjVR/z41Uv89NFL/QzVQ/5V/lf+mipr/poed/6aHoP+mh5//poie/6aInv+miJ3/poic/6uJ + of+La4X/el12/4Jfev+EYXv/dFhw/6SYrP/Jz97/vsXU/8DH1v/Ax9b/wMfW/6eHn/+niJ3/p4id/6WH + m/+sjqH/u56u/7qdrf+8n7H/upyv/7udsP+9n7L/vJ6x/7yesf+9oLL/tZip/4Bhd/+AX3r/f155/35d + eP+BYXr/tJSs/7yds/+6nK//up2t/7yesf+MbIP/fl14/4Bfef9/X3j/fl52/5t7k/+piqH/poic/6eI + nf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+mh57/qYmi/5h4kf99XXb/gGB5/4Bg + ef+AYHn/gGB5/4Bgef+AYHn/gWF6/3tcd/+Haor/2Ljh/9e15//Wter/07Tn/9W45v/z3Pf/+Ob2//bk + 9v/14/j/9OD4/9zF6f/Wver/1b7t/9O76//gwvP/l3ag/31dfP+CY4X/gl+K/3dagv+ensD/rszr/5/H + 4v+kxeD/tMvl/5+mwf+ZfJn/ooKf/52Cnf+bgpz/moOb/5uDm/+Yg5n/loaa/5eEmf+chpv/ooie/6WI + n/+oh5//poig/5+Gnv+ehJz/noSb/5yCmv+ehJz/moCY/3hfeP91XXf/dl53/3hedv94XHT/n4KZ/6SH + n/+miJ3/p4id/6eInf+niJ3/p4id/6eInf+nh5z/rIqf/4tshP96XHj/gl59/4RgfP90WHD/pJmq/8nO + 3v++xdT/wMfW/8DH1v/Ax9b/p4ef/6eInf+niJ3/pIaa/66Qov+9oLH/up2u/7yesf+8nrH/u52w/7ye + sf+8nrH/vJ6x/72gsf+1mKn/gGF3/4Bfev+BYHv/fl14/4Fhev+3l6//vp61/7yesf+8n7D/vp+z/4pq + gf9+XXj/gGB6/39feP9+Xnb/m3uT/6mKof+miJz/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eI + nf+niJ3/p4id/6aHnf+piaH/mHiR/31ddv+AYHn/gGB5/4Bgef+AYHn/gGB5/4Bgef+BYXr/el13/4Zq + i//eve3/2rb1/9q1+P/YuPP/273t//vm/v/+7v///e7///zt/v/76f7/2sHw/9S19//XtvP/2bbx/9+7 + 9P+Ucp3/dVl0/3hgev96X37/fFN0/5alwv+c2PX/kc3u/4/Q7f+o1e//qanD/5yFmf+mip//qoef/66H + nv+uh5//rYaf/6mIof+iiZ//o4mg/6SJoP+liJ//poef/6eHn/+mh5//o4af/6SHoP+miaL/pYih/6WI + of+ihZ7/f2J8/3tfef99YHr/fWB5/35gef+hgpn/qImh/6aHnP+niJ3/p4id/6eInf+niJ3/p4id/6eH + nP+siZ//i2yE/3pceP+CXn3/hGB8/3RYcP+kmar/yc7e/77F1P/Ax9b/wMfW/8DH1v+nh5//p4id/6iI + nv+mh5v/rZCi/7yfsP+7nq//u52w/7udsP+8nrH/vJ6x/7yesf+8nrH/vaCx/7WYqf+AYXf/gF95/4Bf + ev+AX3n/gGB5/7aWrv+9nbT/u52w/7uerv+8nrH/imuB/31dd/+AYHn/f194/35edv+be5P/qYqh/6aI + nP+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4ee/6mJov+ZeZH/fV12/4Bg + ef+AYHn/gGB5/4Bgef+AYHn/gGB5/4Fgef97XXf/hWqO/9m58P/Ysvn/2bL+/9e19//avu7/+OX9//ju + /f/47/j/+e35//nq/f/ZwPH/1LL7/9u1+v/bs/X/5Lz4/5lznv97WXL/gmF2/4Vhef98WHH/jqnA/6PT + 9f+oxPD/lsvv/5rV7v+iq8L/moWU/6WLmv+rh5r/roab/6yHm/+mh5z/pYid/6eGnv+mhZ3/p4ee/6eH + n/+nh5//p4ef/6eHn/+nh6D/poae/6aGn/+mhp//qYmh/6SEnP+AYHr/fl55/39fef+AYHn/fl53/6OC + mv+qiKD/qIie/6eInf+niJ3/p4id/6eInf+niJ3/p4ed/6yKn/+LbIT/elx4/4Jfff+EYHz/dFhw/6SZ + qv/Jzt7/vsXU/8DH1v/Ax9b/wMfW/6eHn/+niJ3/qIie/6aInP+tj6L/vqGx/7yfr/+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+9oLH/tZip/4Bhd/+AX3n/gF96/39eef+AYHn/tpau/72etP+8nbH/u56v/72f + sv+Ka4L/fVx3/4Bfef9/X3j/fl52/5t7k/+piqH/poic/6eInf+niJ3/p4id/6eInf+mh5z/poec/6aH + nP+oiZ7/p4id/6eInf+nh57/qYmh/5p6k/9+Xnf/gWF6/4Fhev+AYHn/gGB5/39feP9+Xnf/f193/3pd + d/+Faoz/2rjt/9q0+f/Zs/v/2Lb2/9q97P/45v7/+O39//ju+f/57vn//Or9/93C7f/XtfT/2rf2/9i0 + 8v/jvff/l3Oc/3xZcv+HYHb/i155/3xZcf+PqL7/q9Dw/7jE7f+kyOv/ptXt/6mqw/+gg5b/p4qc/6eI + nP+liZz/ooic/52Jm/+fiJz/q4ef/6uHn/+ph5//qIef/6eHn/+mh5//poef/6mHn/+ph5//qIee/6iH + nv+piJ//poSc/4Nhev+BXnr/gl96/4Ffef+BX3j/o4Ob/6eIn/+lhpz/poec/6eInf+oiZ7/p4id/6eI + nf+nh5z/rIqg/41uhv97XXj/g19+/4RgfP90WHD/pJmq/8nO3v++xdT/wMfW/8DH1v/Ax9b/p4ee/6eI + nf+niJ3/pYeb/62Pov+9n7D/u56v/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/72gsf+1mKn/gGF3/4Bf + ef+CYHz/f155/4Nje/+2lq7/vp+1/7yesf+9oLD/vqCz/4tsgv98XHb/f195/39feP9+Xnb/m3uT/6mK + of+miJz/p4id/6eInf+niJ3/p4id/6aHnP+mh5z/poec/6aHnP+niJ3/p4ic/6aHnf+piaH/mnqT/3xc + df+CYXv/gGB5/4Bgef9+Xnf/gGB5/39feP+AYHn/e1x2/4lqiv/dvOX/3Ljr/9258P/auez/3L3q//fi + /P/56P//+uf+//zn/v/75f3/38Po/9u66P/du+v/2bjr/93A8f+Md5z/a1x1/3JjfP91YYH/ZFl1/4ap + vf+j1+v/p8zj/6LM4v+v1Or/p6jD/6GAn/+lh6T/oYei/6GIof+lh57/sIee/6+Gnv+oh5//qIef/6eH + n/+mh5//p4ef/6eHn/+miJ7/p4id/6aInf+miJ3/p4id/6iKnv+jhZr/g2F6/4Jeev+CX3r/gGB5/4Bg + ef+hg5r/pomg/6WHnP+niJ3/pYab/6eInf+niJ3/p4id/6aGm/+sip//jG2F/3pceP+CX33/hGB8/3RY + cP+kmar/yc7e/77F1P/Ax9b/wMfW/8DH1v+6mrH/upqw/7qasP+5m6//u52w/7yfr/+8n6//vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vaCx/7WYqf+BYXj/f155/4Bfev9/Xnj/gWF5/6aGnv+ri6L/qYue/6qN + nf+qjJ//h2h+/35eeP+AX3n/f194/35edv+be5P/qYqh/6aInP+niJ3/p4id/6eInf+niJ3/p4id/6aH + nP+lhpv/r5Cl/7ubsf+5mq//uZmw/72dtf+lhZ7/fV12/4Fhev9/X3j/fV12/4hogf+jg5z/oYGa/6GB + mv+hgJv/nXya/4triP+JaYn/imqN/4Zmjf+Ma5X/17vn/93B8f/cvvD/4L/y/+G/7v+VdJ3/iGaK/5Fq + j/+KaJH/eGWN/6Smxf+vwtn/ob3X/5673/+wu93/pq7J/6aluf+1pbf/uKa6/6mhuv+qss7/rcXk/6PD + 4P+gxd3/rcnf/6etwv+ag5v/q4mh/6SIn/+kiJ//pIif/6WIn/+miJ//p4ef/6aInv+kiZ3/pImd/6SJ + nf+kiZ3/poqe/6GGmv+BYnr/gV56/4Bfev9+YHn/fWF5/56Dmv+kiaD/pYid/6aHnP+lhpz/tZar/7qb + sP+5mq//uZmv/8Ces/+Sc4v/elx4/4Jeff+EYHz/dFhw/6SZqv/Jzt7/vsXU/8DH1v/Ax9b/wMfW/72e + s/+9nrL/vZ6y/72fsv+8nrH/u56w/7yfsf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+9n7L/tZeq/4Bh + eP9/X3n/f156/39eef+AYHn/ooKa/6eInv+mh5z/poec/6aHnv+HZ3//fl14/39fef9/X3j/fl52/5t7 + k/+piqH/poic/6eInf+nh57/p4ee/6eHnv+oiJ//p4if/6WFnP+xkqj/vqC0/7yfsP+8nrD/wKK1/6aH + nf97W3T/gWF7/39feP9+Xnf/iWmB/6qKo/+oiJ//qIif/6mJov+ggZv/e111/3tddf96XHb/eFh4/39c + gv/Ss+T/1rnz/9e18//YtfL/3Lnt/4lojf94WnH/f111/4Fce/9sVXX/p7DO/67X8v+gzu//qMv0/7DQ + 8/+wrcn/tZqt/7ahqv+7nqz/tJit/7S0z/+u0fL/n83v/5nP7v+m0+7/pbXN/5eFmf+rip3/pYif/6WI + n/+mh5//poef/6aHn/+nh5//p4ie/6WJnf+miZ3/pYid/6aJnf+nip7/ooWa/4Fhev9/Xnr/gF96/39g + ef9+YHn/oIOa/6aJoP+niJ//p4id/6aHnP+4ma7/vp+z/72fsf+8nrH/w6G2/5Jziv95XHb/g2B9/4Rg + fP90WHH/pJis/8nP3v++xdT/wMfW/8DH1v/Ax9b/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/72fsv+1l6v/gGF4/4Bfev9/XXv/fl54/4Fhev+jg5v/qIme/6eH + n/+nh5//p4eh/4Zmf/9+XXf/f195/39feP9+Xnb/m3uT/6mKof+miJz/p4id/6eInf+niJ7/p4ie/6eI + nv+niJ7/pYac/7CRp/++oLL/u5+u/7uerf+/o7L/p4ic/3tbdP+BYHv/f194/31ddv+JaYH/qIig/6aH + nf+niJz/p4if/56Bmf9+YXj/fmF4/35gef99XXv/g2KE/9S05f/Yufb/2Lb2/9m29f/duu7/jGuQ/3te + df+CYnj/hmB6/3Zad/+ir8z/ntPw/5XL7f+jyPD/os7u/7CsyP++mq7/uaKs/72grf+5ma7/t7TO/6nO + 7/+by+7/lszu/6TQ8P+lssz/nIWZ/6+JnP+niJ7/p4id/6eInf+niJ3/p4id/6eInv+niJ3/p4id/6eI + nf+niJ3/p4id/6iJnv+khZr/gWF6/4Beev+AX3r/gGB5/4Bgef+igpr/qIig/6eHn/+niJ3/poec/7eY + rf+9n7L/vJ6v/7uerv/CobT/knWK/3lbdf+DYHz/hGB8/3RYcf+kl63/yc/e/77F1P/Ax9b/wMfW/8DH + 1v+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vZ+y/7WX + qv+AYXj/gF96/39de/9/Xnj/gWF6/6ODm/+oiZ7/p4id/6eHn/+nh6D/hmZ//35ed/9/X3j/f194/35e + dv+be5P/qYqh/6aInP+niJ3/p4id/6eInf+niJ3/p4id/6eInf+lhpv/sZKn/76gsv+8n67/u56t/8Cj + sv+niJz/e1t0/4Fge/9/X3j/fV12/4lpgf+piaH/p4id/6eInf+niZ//n4Ga/31gd/9+YXj/fmB5/3xd + ef+DYoP/1LLl/9m2+P/Ys/f/2rT2/9228P+MaJX/e1t6/4Vgev+HYHv/cVp4/5+wzP+e1PD/j83r/5fM + 7v+e0Oz/ra7I/8SYsf/OnLH/yJyy/7Gasf+ot8//ndHu/5PN7P+Uzez/ptDv/6ixzf+ehJz/sIie/6iI + nf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/qIme/6SFmv+BYXr/gF56/4Bf + ev+AYHn/gGB5/6KCmv+oiKD/p4ef/6eInf+mh5z/t5mt/72fsv+8nq//u56u/8KhtP+SdIr/eVt1/4Ng + ff+EYHz/dFhx/6SXrf/Jz97/vsXU/8DH1v/Ax9b/wMfW/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+9n7L/tZeq/4BheP+AX3r/f117/35eeP+AYHn/o4OZ/6eJ + nP+mh5v/poac/6eHn/+FZX7/fl52/39feP9/X3j/fl52/5t7k/+piqH/poic/6eInf+mh5z/poec/6aH + nP+mh5z/poec/6SFmv+wkab/vaCy/7yfrv+7nq3/wKOy/6eInP97W3T/gWB7/39feP99XXb/iWmB/6mJ + oP+niJ3/p4ic/6iJoP+egJn/fF92/3tfc/97XnX/e1x3/4Bhfv/buuX/4r72/+G79P/hvPT/5L/w/4po + j/94WXb/gF53/39dd/9sWHP/qbDL/7XU7/+nzen/rMzr/7PT6v+mr8f/qZiz/7aatf+ym7X/oJmx/6u3 + z/+00u//q83r/6zN6/+70u//sbHN/5qCm/+rh57/poeb/6aHnP+mh5z/poec/6aHnP+mh5z/poec/6eI + nf+mh5z/p4id/6eInf+oiZ7/pIWa/4Fhev+AXnr/gF96/4Bgef9/X3j/ooKa/6eHn/+lhZ3/poec/6WG + m/+2mKz/vZ+y/7yer/+7nq7/wqG0/5J0iv95W3X/g2B9/4RgfP90WHH/pJet/8nP3v++xdT/wMfW/8DH + 1v/Ax9b/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/72f + sv+1l6r/gGF4/4Bfev9/XXv/f154/4Fhev+wkaf/uJut/7eYrP+2mKz/uZqv/4trg/99XXb/gGB4/39f + eP9+Xnb/m3uT/6mKof+miJz/p4id/6WHmv+vkaT/t5ms/7eZrP+4mq3/tZeq/7qcsP+8n7H/vJ+u/7ue + rf/Ao7L/p4ic/3tbdP+BYHv/f194/31ddv+JaYH/qYmg/6eInf+niJ3/p4ig/6OFn/+cfpb/nICU/5p+ + k/+cfpf/m3yX/5V1lv+TcZj/k3KZ/5NxmP+Uc5X/qIqj/66Ro/+sj6T/qY6l/6SPpv+uorr/sKrD/6+n + w/+zp8T/rKa9/6q6z/+oxN7/qcDd/6zA3P+1xN7/rKzG/6CTsf+glrT/m5ez/5uWsf+lmbL/rpiw/7SY + rf+3maz/t5ms/7eZrP+3maz/t5ms/7eZrP+3mKz/tJWq/6eInf+mh5z/p4id/6iJnv+khZr/gWF6/4Bf + ev+AX3r/gGB5/4BgeP+wkKj/uJiw/7eXr/+3mK7/tpes/7ydsv+8nrH/vJ+w/7uerv/CobT/knSK/3lb + df+DYH3/hGB8/3RYcf+kl63/yc/e/77F1P/Ax9b/wMfW/8DH1v+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vZ+y/7WXqv+AYXj/gF96/4BefP9+XXf/gWF7/7eY + rf+/obL/vZ+y/72fsv++oLT/imuB/35fdf+AYHn/f194/35edv+be5P/qYqh/6aInP+niJ3/pIeZ/7SX + qP++oLL/u56v/76gsv+8n7D/u56w/7yesf+8n6//u56t/8Cjsv+niJz/e1t0/4Fge/9/X3j/fV12/4lp + gf+piaH/p4id/6eInf+mhp//pIag/6aJoP+miZ7/poqd/6iLof+miKH/fF14/3lZdf96WXj/ell3/3lZ + c/+0lqr/wKOy/76gsf+8obP/uKGz/7WdsP+4m6//vJqw/76bsf+2l6z/qrzQ/6HV7v+dzO3/n83t/7DV + 7/+nqML/o36Y/6mFn/+jhZ7/nYSa/6eOo/+7obf/uZ2x/72gsf+9n7H/vZ+x/72fsf+9n7H/vZ+x/76g + s/+4ma7/poec/6iJnv+niJ3/qIme/6SFmv+BYXr/gF56/4Bfev+AYHn/gGB5/7aWrv++nrb/vJy0/76f + tP+8nbL/vJ2x/7yesf+8n7D/u56u/8KhtP+SdIr/eVt1/4Ngff+EYHz/dFhx/6SXrf/Jz97/vsXU/8DH + 1v/Ax9b/wMfW/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+9n7L/tZer/4BheP+AX3r/gV98/39eef+AYHr/tpet/72gsP+7nq//u52w/7yesv+Ka4D/fV5z/4Bg + eP9/X3j/fV12/5t7k/+qiqH/p4ic/6eInf+lh5n/s5am/7yfr/+7nq7/u56t/7yfrv+8n6//vJ6w/7yf + r/+7nq3/wKOy/6eInP97W3T/gWB7/39feP99XXb/iWmB/6mJoP+niJ3/p4id/6aHn/+khqD/pomg/6SJ + nP+liZz/pIic/6KFnP+DY33/gV16/4FefP+CX3z/f194/7OTq/+9nrL/v5us/76frf+4n63/vKCu/8Ge + rf/Anq3/v5+u/76arP+tvdH/n9Dt/6LJ8P+cye3/o9Pu/5+sxP+mg5j/roqd/6yJnP+piJn/spCi/8Ce + sv+9nbD/vJ+u/7ufrv+8n67/vJ+u/7yfrv+7n67/vJ6x/7eXrf+mh5z/p4id/6eInf+oiZ7/pIWa/4Fh + ev+AXnr/gF96/4Bgef+AYHn/tZWt/72dtP+6mrL/u5yx/7ydsv+8nbH/vJ6x/7yfsP+7nq7/wqG0/5J0 + iv95W3X/g2B9/4RgfP90WHH/pJet/8nP3v++xdT/wMfW/8DH1v/Ax9b/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/72gsv+1mKn/gGF4/39fef9/Xnn/f155/4Fh + ef+2l6z/vaCx/7ufrv+7nq7/vZ+x/4trgv99XXf/gGB6/4Bgef9+Xnf/nHyT/6qLoP+niZz/qIuc/6aI + m/+zlqj/vqCz/7yesf+8nrH/vJ6w/7yesP+8nrH/vJ+v/7uerf/Ao7L/p4ic/3tbdP+BYHv/gF95/35e + d/+JaYL/qYqg/6eJnf+oipz/p4md/6eHoP+oiaH/p4if/6WGnf+mh57/pIWd/4Jhe/9+XXn/gF55/39e + eP+AYHj/sJCo/76ftf+8nK//vp+w/7uer/+8n7D/vp6w/72er/+8n7D/spqx/7K71f+mz+7/l8ru/5nK + 7v+rz/D/oKrH/6CDmf+qiZ//qYie/6aGmv+wkKT/v5+y/72dsP+8nrD/vJ6w/7yesP+8nrD/vJ6w/7ye + sP+8nrH/uJqt/6eInP+mh53/p4ef/6iIoP+khJv/gWF6/4Bfef+AX3r/gF96/4Bgef+1lqr/vaCw/7ye + sP+8nrH/vJ6x/7yesf+8nrH/vJ6x/7udsP/CobT/knSK/3lbdf+DYH3/hGB8/3RYcf+kl63/yc/e/77F + 1P/Ax9b/wMfW/8DH1v+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vaCx/7WYqf+AYXf/gF95/4Bfev+AX3r/gWF6/7aXrP++oLH/vJ+u/7yfrv+9n7D/imuC/31d + d/+AX3r/gGB6/31ddf+ae5L/qImd/6WHmP+liZj/o4aY/7KUp/++n7P/u52w/7yesf+8nrH/vJ6x/7ye + sf+8n6//u56t/8Cjsv+niJz/e1t0/4Fge/+AX3n/fl53/4hngP+niJ7/pYeZ/6WImP+lh5r/pYac/6WG + m/+lhpv/pIWb/6aHnP+ig5j/gGB4/3tbdf98XXX/fV11/3xcdf+ykqj/vZ6z/7yesf+7nrH/vJ6x/7ye + sf+8nrH/vJ6x/7uesv+nnbH/sb7U/63T7P+c0u7/n8/t/7TU8P+hqsX/n4Kb/6mIoP+nh6D/pYac/66Q + pP+9oLP/u56x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/72fsv+5m67/p4ic/6eInf+nh5//qIig/6SE + nP+BYXr/gF95/4Bfev+AX3r/gGB4/7SWqv+9oK//u56v/7yesf+8nrH/vJ6x/7yesf+8nrH/u52w/8Kh + tP+SdIr/eVt1/4Ngff+EYHz/dFhx/6SXrf/Jz97/vsXU/8DH1v/Ax9b/wMfW/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+9oLH/tZip/4Bhd/+AX3n/gF56/4Bf + ef+BYXn/tpes/76gsf+8n67/vJ+u/72fsf+Ka4L/fV13/4Fge/+BYXr/fFx1/6SEnP+4ma7/tJeo/7WY + qP+1l6n/upyv/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yfr/+7nq3/wKOy/6eInP97W3T/gmB8/4Fg + ev9+Xnb/i2uD/7eXrf+1l6n/tZio/7WXqf+1lqv/tZar/7WWq/+0lar/tZar/7OUqf+be5P/mHiS/5l5 + kv+aepL/l3eO/7iZrv+7nbH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7aerv+4qbv/s67G/6us + x/+srMf/uK/I/6uasf+jhZz/qIig/6iHoP+lhpz/r5Ck/76fs/+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vZ+y/7mbrv+niJz/p4id/6eHn/+oiKD/pISc/4Fhev+AX3n/gF96/4Bfev+AYHj/tZaq/72g + r/+7nrD/vJ6x/7yesf+8nrH/vJ6x/7yesf+7nbD/wqG0/5J0iv95W3X/g2B9/4RgfP90WHH/pJet/8nP + 3v++xdT/wMfW/8DH1v/Ax9b/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/72gsf+1mKn/gGF3/4Bfef+AXnr/gF95/4Fhef+2l6z/vqCx/7yfrv+8n67/vZ+w/4pr + gv99XXf/gWB7/4Fgev98XHX/q4yj/8Gjt/+9n7H/vqGw/76gsv+8nrH/u52w/72fsv+8nrH/vJ6x/7ye + sf+8nrH/vJ+v/7uerf/Ao7L/p4ic/3tbdP+CYHz/gWB6/31ddv+Obof/wKG2/72fsv++obD/vqCx/76f + s/++n7P/vp+z/72fs/+9nrL/vJ6y/6uMov+piaL/qoqi/6qKof+oiZ7/upuv/72fsf+7nbD/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/u5+t/7idrP+2mq7/tpmw/7ebsf+3mq7/rpKk/6aGnf+nh5//qIeg/6WG + nP+ukKT/vp+z/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+9n7L/uZuu/6eInP+niJ3/p4ef/6iI + oP+khJz/gWF6/4Bfef+AX3r/gF96/4BgeP+0lqr/vaCv/7uesP+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ud + sP/CobT/knSK/3lbdf+DYH3/hGB8/3RYcf+kl63/yc/e/77F1P/Ax9b/wMfW/8DH1v+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vaCx/7WYqf+AYXf/gF95/4Be + ev+AX3n/gWF5/7aXrP++oLH/vJ+u/7yfrv+9n7D/imuC/31dd/+AX3r/gWF6/3xcdf+qiqH/wKG1/7ud + r/+8n6//vJ6w/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8n6//u56t/8Cjsv+niJz/e1t0/4Fg + e/+AX3r/fV12/41thf++n7X/u52w/7yfr/+8nq//vJ6x/7yesf+8nrH/vJ6x/72esv+6nK//p4ie/6aG + nv+nh57/p4ic/6aHm/+5m67/vZ+x/7yesP+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesP+3oK7/t6Gv/7ug + sP+9n7D/vJ+w/7yisv+ulKT/pYad/6eHn/+nh6D/pYac/66QpP++n7P/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/72fsv+5m67/p4ic/6eHnf+nh5//qIig/6SEnP+BYXr/gF95/4Bfev+AX3r/gGB4/7SW + qv+9oK//u56w/7yesf+8nrH/vJ6x/7yesf+8nrH/u52w/8KhtP+SdIr/eVt1/4Ngff+EYHz/dFhx/6SX + rf/Jz97/vsXU/8DH1v/Ax9b/wMfW/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+9oLH/tZip/4Bhd/+AX3n/gF56/4Bfef+BYXn/tpes/76gsf+8n67/vJ+u/72f + sP+Ka4L/fV13/4Bfev+BYXr/fFx1/6qKof/AobX/u56v/7yfr/+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yfr/+7nq3/wKOy/6eInP97W3T/gWB7/4Bfev99XXb/jW2F/7+ftf+7nrD/vJ+v/7yf + r/+8n7D/vJ+w/7yfsP+8n7D/vZ+w/7udrv+oip3/p4ee/6eInf+niZz/poib/7mbrf+9oLD/vJ6w/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/8Sdsf/FnLH/xJyw/8OcsP/EnLD/x56x/7mRpv+nhp3/qIig/6iI + oP+lhpz/r5Cl/76gs/+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vZ+y/7mbrv+mh5z/poec/6aH + nv+nh5//o4Ob/4Jie/+BYHv/gWB7/4Fge/+BYXn/tZaq/72gr/+7nrD/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+7nbD/wqG0/5J0iv95W3X/g2B9/4RgfP90WHH/pJet/8nP3v++xdT/wMfW/8DH1v/Ax9b/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/72gsf+1mKn/gGF3/4Bf + ef+AXnr/gF95/4Fhef+2l6z/vqCx/7yfrv+8n67/vZ+x/4prgv99XXf/gF96/4Fhev98XHX/qoqh/8Ch + tf+7nq//vJ+v/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ+v/7uerf/Ao7L/p4ic/3tb + dP+BYHv/gF96/31ddv+NbYX/v5+1/7uesP+8n6//vJ+v/7yfr/+8n6//vJ+v/7yfr/+9oLD/u56t/6iK + nf+niJ3/p4id/6eJnP+miJv/uZus/72gsP+8nrD/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vZy0/7ud + tP+4oLT/tqCz/7egs/+8orb/sJKm/6OEm/+mhp3/poad/6OEmv+tj6P/vZ+y/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/uZuu/6qLn/+qiqD/qoqi/6uLpP+mhp7/fV11/3tadP98W3X/e1p0/3xc + dP+0lqn/vaCv/7yesP+8nrH/vJ6x/7yesf+8nrH/vJ6x/7udsP/CobT/knSK/3lbdf+DYH3/hGB8/3RY + cf+kl63/yc/e/77F1P/Ax9b/wMfW/8DH1v+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vaCx/7WYqf+AYXf/gF95/4Beev+AX3n/gWF5/7aXrP++oLL/vJ+v/7yf + r/+9n7L/imqD/31ceP+AX3v/gWF6/3xcdf+qiqH/wKG1/7uer/+8n6//vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8n6//u56t/8Cjsv+niJz/e1t0/4Fge/+AX3r/fV12/41thf+/n7X/u56w/7yf + r/+8n7D/vJ6x/7yesf+8nrH/vJ6x/72fsv+7na//qIme/6eHnf+niJ3/p4id/6aIm/+5m63/vaCw/7ye + sP+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8n7P/s5ir/62Spf+tkqX/rZOl/6+Upv+vk6b/spSn/7KU + p/+ylKf/sZOm/7eZrP+8nrH/u52w/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/72gsv+0lqj/kHGH/5Ny + jP+ScYv/kXCK/5NzjP+ef5X/oIGV/5+Blf+ggZX/oIKV/7iarf+7nbD/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/u52w/8KhtP+SdIr/eVt1/4Ngff+EYHz/dFhx/6SXrf/Jz97/vsXU/8DH1v/Ax9b/wMfW/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+9oLH/tZip/4Bh + d/+AX3n/gF96/4Bfef+BYXr/tpes/76gs/+8nq//vJ+v/72es/+KaoP/fVx5/4Bee/+BYXr/fFx1/6qK + of/AobX/u56v/7yfr/+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yfr/+7nq3/wKOy/6eI + nP97W3T/gWB7/4Bfev99XXb/jW2F/7+ftf+7nrD/vJ+v/7yfsP+8nrH/vJ6x/7yesf+8nrH/vZ+y/7ud + r/+oiZ//p4ee/6eInf+niJ3/poib/7mbrf+9oLD/vJ6w/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/76g + sv+uj6L/pYea/6WHmv+lhpn/o4SX/7GTpv/AorX/vZ+y/72gsv++oLP/vZ+y/7yesf+9n7L/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nbH/vqGy/7KUpv98XHP/fFt2/31cd/96WXT/gmJ6/72es//Bo7b/wKK1/8Ci + tf+/obT/vJ6x/7yesf+7nbD/vJ6x/7yesf+8nrH/vJ6x/7yesf+7nbD/wqG0/5J0iv95W3X/g2B9/4Rg + fP90WHH/pJet/8nP3v++xdT/wMfW/8DH1v/Ax9b/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/72gsf+1mKn/gGF3/4Bfef9/Xnr/gF95/4Fhev+2l6z/vqCz/7ye + r/+8n6//vZ+z/4pqg/99XHn/gF57/4Fhev98XHX/qoqh/8Chtf+7nq//vJ+v/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ+v/7uerf/Ao7L/p4ic/3tbdP+BYHv/gF96/31ddv+NbYX/v5+1/7ue + sP+8n6//vJ+w/7yesf+8nrH/vJ6x/7yesf+9n7L/up2v/6iJn/+nh53/p4id/6eInf+miJv/uJut/72g + sP+8nrD/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vZ+y/62Pov+lh5r/qIqd/6WIm/+miJv/spSn/72f + sv+7nbD/vJ6x/7yesf+7nbD/u52w/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf++oLL/spWm/4Bg + d/+AX3n/gWB7/39eeP+DY3v/uZqv/7udsP+6nK//u52w/7qcr/+8nrH/u52w/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7udsP/CobT/knSK/3lbdf+DYH3/hGB8/3RYcf+kl63/yc/e/77F1P/Ax9b/wMfW/8DH + 1v+7nbD/u52w/7udsP+7nbD/vJ6x/7udsP+7nbD/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vaCx/7WY + qf+AYXf/gF95/4Bfev+AX3r/gWF5/7aXrP+9n7L/u56u/7uerv+8nbL/imqD/31cef+AXnv/gWF6/3xc + df+qiqH/wKG1/7uer/+8n6//vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8n6//u56t/8Cj + sv+niJz/e1t0/4Fge/+AX3r/fV12/41thf+/n7X/u56w/7yfr/+8n7D/vJ6x/7yesf+8nrH/u52w/7ud + sP+7na//qYmf/6iInv+oiZ7/qIme/6eJnP+5m63/vaCw/7yesP+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+9n7L/rpCj/6aIm/+niZz/qYue/6aIm/+ylKf/vZ+y/7udsP+8nrH/u52w/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/76gsv+xk6X/fl92/39eef+AXnr/f155/4Vlff+5m6//vZ+y/7ye + sf+8nrH/u52w/7yesf+7nbD/u52w/7yesf+8nrH/vJ6x/7yesf+8nrH/u52w/8KhtP+SdIr/eVt1/4Ng + ff+EYHz/dFhx/6SXrf/Jz97/vsXU/8DH1v/Ax9b/wMfW/76gs/++oLP/vqCz/76gs/+9n7L/u52w/7ud + sP+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+9oLH/tZip/4Bhd/+AX3n/gWB7/39eef+CYnr/t5it/8Ci + tf+9oLH/vqGx/7+htf+La4T/fFt4/39eev+BYXr/fFx1/6qKof/AobX/u56v/7yfr/+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yfr/+7nq3/wKOy/6eInP97W3T/gWB7/4Bfev99XXb/jW2F/7+f + tf+7nrD/vJ+v/7yfsP+8nrH/vJ6x/7yesf+7nbD/vJ6x/7udsP+niJ7/pYWc/6WHm/+lhpv/pYea/7ia + rP+9oLD/vJ6w/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/72fsv+tj6L/o4WY/6WHmv+lh5r/o4WY/7CS + pf++oLP/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vqCy/7KU + pv9+X3b/gF96/4Bfev9/Xnn/hGR8/7mar/+9n7L/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+7nbD/wqG0/5J0iv95W3X/g2B9/4RgfP90WHH/pJet/8nP3v++xdT/wMfW/8DH + 1v/Ax9b/tJap/7SWqf+0lqn/s5Wo/7WXqv+9n7L/u52w/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/72g + sf+1mKn/gGF3/39fef+BYHv/f155/4Jie/+vkKX/tZeq/7OWp/+0l6f/tJaq/4logv99XHn/f156/4Fh + ev98XHX/qoqh/8Chtf+7nq//vJ+v/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ+v/7ue + rf/Ao7L/p4ic/3tbdP+BYHv/gF96/31ddv+NbYX/v5+1/7uesP+8n6//vJ+w/7yesf+8nrH/vJ6x/7ye + sf+9n7L/u52w/7GRqP+vkKb/sJGm/6+Qpf+wkqX/upyu/7yfrv+8nrD/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7SWqf+ukKP/sJKl/7CSpf+ukKP/t5ms/72fsv+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ydsf++oLL/sZSl/35fdv+AX3r/gF96/39eef+EZHz/uZqv/72f + sv+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7udsP/CobT/knSK/3lb + df+DYH3/hGB8/3RYcf+kl63/yc/e/77F1P/Ax9b/wMfW/8DH1v+lh5v/pYea/6WHm/+khpn/rI6h/72f + sv+6na//vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vaCx/7WYqf+BYXj/f155/39eef9/Xnn/gGB5/6KD + mP+miJv/pYeZ/6WHmf+lhpz/h2aA/39dev9/Xnr/gWF6/3xcdf+qiqH/wKG1/7uer/+8n6//vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8n6//u56t/8Cjsv+niJz/e1t0/4Fge/+AX3r/fV12/41t + hf+/n7X/u56w/7yfr/+8n7D/vJ6x/7yesf+8nrH/u52w/7udsP+8nrH/vZ6z/76ftP++n7T/vp+z/76g + s/+8nrD/vJ+v/7yfsf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vqCz/72fsv+8nrH/vqCz/72f + sv+9n7L/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6w/76h + sf+ylKX/fl92/4Bfev+AXnr/f155/4RkfP+5mq//vZ+y/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/u52w/8KhtP+SdIr/eVt1/4Ngff+EYHz/dFhx/6SXrf/Jz97/vsXU/8DH + 1v/Ax9b/wMfW/6eHn/+niJ//qIig/6aGnP+tjqP/vZ+z/7yesP+8n6//vJ+v/7yfr/+8n6//vJ+v/7yf + rv+9oLH/tZer/4BheP+AX3r/f117/39eef+BYXr/o4Ob/6iKnv+nh5//p4ef/6iIoP+GZoD/fl14/39e + ef+BYXr/fFx1/6qKof/AobX/u56v/7yfr/+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yf + r/+7nq3/wKOy/6eInP97W3T/gWB7/4Bfev99XXb/jW2F/7+ftf+7nrD/vJ+v/7yfsP+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7udsP+8nrH/vJ6x/7udsP+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8n6//vJ+v/7yfr/+8n67/vqGw/7KUpf9+X3b/gF96/4BdfP9/Xnn/hGR8/7ma + r/+9n7L/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+7nbD/wqG0/5J0 + iv95W3X/g2B9/4RgfP90WHH/pJet/8nP3v++xdT/wMfW/8DH1v/Ax9b/p4ef/6eHn/+nh6D/pYac/62O + o/+9n7L/u56w/7yer/+8nrD/vJ6w/7yesP+8nrD/u56v/72fsf+1lqr/gGF4/4Bfev9/XXv/fl54/4Fh + ev+jg5v/qIme/6eInv+nh5//p4eg/4Zmf/9+XXf/f155/4Fhev98XHX/qoqh/8Chtf+7nq//vJ+v/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ+v/7uerf/Ao7L/p4ic/3tbdP+BYHv/gF96/31d + dv+NbYX/v5+1/7uesP+8n6//vJ+w/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesP+7nq//u56v/7ud + r/+9oLH/sZOl/39gdv+BYHr/gGB6/4Bgef+EZH3/uZqv/72fsv+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7udsP/CobT/knSK/3lbdf+DYH3/hGB8/3RYcf+kl63/yc/e/77F + 1P/Ax9b/wMfW/8DH1v+nh5//p4ef/6eHoP+lhpz/rY6j/7+gtP+9n7L/vZ+y/72fs/+9n7P/vZ+z/72f + sv+9n7L/v6G0/7aYrP+BYXn/f196/39de/9+Xnj/gWF6/6KDmf+niJz/pYeb/6WGnP+mhp7/hmZ+/35e + d/9/X3n/gWF6/3xcdf+qiqH/wKG1/7uer/+8n6//vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8n6//u56t/8Cjsv+niJz/e1t0/4Fge/+AX3r/fV12/41thf+/n7X/u56w/7yfr/+8n7D/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yfsP+8nrD/vZ+y/8Citf/AobX/v6G1/8KjuP+0lqr/e1ty/31ddf98XHT/e1t0/4Fh + eP+5mq7/vZ+y/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/u52w/8Kh + tP+SdIr/eVt1/4Ngff+EYHz/dFhx/6SXrf/Jz97/vsXU/8DH1v/Ax9b/wMfW/6eHn/+nh5//p4ef/6aH + nf+tjqP/tpir/7WXqv+1lqv/tZer/7WXq/+1l6v/tZer/7WWq/+3maz/rpCk/4Fhef+AYHv/f157/39e + eP+AYHn/qImf/66Qo/+tjqL/rI2i/6+Ppv+IaID/fV11/39fef+BYXr/fFx1/6qKof/AobX/u56v/7yf + r/+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yfr/+7nq3/wKOy/6eInP97W3T/gWB7/4Bf + ev99XXb/jW2F/7+ftf+7nrD/vJ+v/7yfsP+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/up6t/76gsv+3maz/qYuf/6uL + ov+qi6L/rIyj/6WGnf+Rcoj/knOI/5Bxhv+Scoj/lHSK/7qcsP+8n7H/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+7nbD/wqG0/5J0iv95W3X/g2B9/4RgfP90WHH/pJet/8nP + 3v++xdT/wMfW/8DH1v/Ax9b/p4ef/6eHn/+nh5//poed/6aHnP+lh5v/pYea/6aHnP+mh5z/poec/6aH + nP+mh5z/poec/6eJnf+ig5f/gGB3/4Bfev9/XXv/fl13/4Jie/+2l6z/v6Gz/72fsv+9nrL/vp+0/4xs + g/9+Xnb/gGB5/4Fgev98XHX/qoqh/8Chtf+7nq//vJ+v/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ+v/7uerf+/o7L/p4ic/3tbdP+BYHv/gF96/31ddv+NbYX/v5+1/7uesP+8n6//vJ+w/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7uesP+8n6//vqGy/6uMof94WHD/fV11/3xcdf96WnP/h2d//8GiuP++oLP/v6Ky/76h + sv++n7P/u52x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ud + sP/CobT/knSK/3lbdf+DYHz/hGB8/3RYcf+kl63/yc/e/77F1P/Ax9b/wMfW/8DH1v+nh5//p4ef/6eH + n/+niJ7/poec/6aIm/+niZz/p4ie/6iInv+niJ7/p4id/6eInf+niJ3/qImd/6KEl/+AYXj/f154/4Ff + ff9+Xnn/gGF6/7aYrf+9oLD/u56w/7yesf+9n7L/iWp//31edP+AYHn/gWB6/3xcdf+qiqH/wKG1/7ue + r/+8n6//vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8n6//u56t/8Cjsv+niJz/e1t0/4Fg + e/+AX3r/fV12/41thf+/n7X/vJ6w/7yfr/+8n7D/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/u56w/7qdrf+/obP/qoug/35e + dv+BYXr/gWB7/35deP+KaoP/vJ2y/7uerv+6naz/vJ6v/7qcr/+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/u52w/8KhtP+SdYr/eVt1/4Ngff+EYHz/dFhx/6OX + rf/Jz97/vsXU/8DH1v/Ax9b/wMfW/6eHnv+nh57/p4ef/6aHnf+mh5z/p4ic/6aInP+nh57/pYad/6eH + nv+nh5//p4ef/6aHn/+piKH/pIKa/4Jfev+BXID/gl55/4JfeP+DX3v/uJes/72gr/+7nq7/u52w/7yd + sf+MbIP/fl52/4Fgev+BYXv/fFx1/6qKof+/obX/u52u/7yfrv+8nrH/u5yw/7udsf+8nrL/vJ6x/7ye + sf+8nrD/vJ+w/7yfrv+7nq7/v6Gy/6eInv98XHX/gWB7/4Fgev9+Xnb/jm6G/76ftP+7nbD/u56v/7ue + r/+8nrH/vJ6w/7udsP+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrD/vJ+x/7yesP+6na3/u56t/76hsv+sjaL/fFx0/4Bgef+AX3r/fl14/4pqgv++n7T/u56u/7uf + rf+8n6//vZ+x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nbH/vZ6y/7qcr/+7nbD/vJ2x/7ue + sP+7na//w6C1/5N0iv96XXb/g2B8/4VhfP91WXH/pZit/8nP3v++xdT/wMfW/8DH1v/Ax9b/p4id/6eI + nf+niJ3/p4id/6eInf+niJ3/poec/6WGm/+mh5z/poad/6mJof+piaL/qYmi/6yKof+mh5L/gGB0/4BY + hf9+YHL/f2Fv/4JhdP+3mab/vqGw/7yfrv+8nrD/vZ2z/4pqgv96WXP/fV13/35dd/93V3D/q4ui/8Kj + uP+9n7L/vqGy/76ftf++nrT/u5yx/7yesv+8nrH/vJ+v/7yfr/+8n67/vJ+u/7uer/+/oLX/poee/3lY + cv9+Xnf/f194/3pacv+La4P/v6C2/72esv+9n7L/vZ+x/72fsv+7nbD/u52w/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6w/7yfr/+9oK//vaCw/8Cjsv+9oLH/w6W4/66P + pP95WXH/fl52/31dd/96W3L/hmh7/72fsv+7nbD/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7ucsf+7nLH/vJ6x/72fsv++oLP/vqGy/76gsf/Hobn/knOL/3NYb/97XXT/fl11/21U + a/+ilqr/yc7d/77F1P/Ax9b/wMfW/8DH1v+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/pYac/6eI + nf+lhZz/n3+X/6CAmP+ff5n/n4CX/5qAkf9+Xo3/elSj/3dalv92W5L/el+S/7CXrf++oa//vJ+v/7ye + sf++n7T/lHOM/4pqg/+La4L/i2yC/4hpf/+khZr/s5Op/7CQp/+wkaf/sJCn/7eYrf+8nbL/vJ6y/7ye + sf+8n7D/vJ+v/7yfrv+8n67/u56v/8Chtv+ri6L/iGiB/4trhP+La4T/iGiA/5V1jP+7nLL/uJmu/7mb + rv+5m67/t5ms/7yesf+7nbD/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrD/u56w/7eZq/+vkaP/sZOm/7CRp/+ykqn/qIie/4lqf/+LbIL/jGyC/4hqf/+SdIf/vJ6x/7ye + sf+9nrL/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ2x/7yesf+8nbH/s5Wp/6+R + pf+wkqb/sJCl/7KTqv+VfpT/hHSJ/4d1iv+Ldoz/fG2C/6aitf/Hzt3/vsXU/8DH1v/Ax9b/wMfW/6eI + nf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+mh53/qIme/59/lv98XHT/f194/39fd/98Wn7/eFWS/4ld + 0v+AUev/e1Xm/31X4/9+Wtn/rpLF/76hrf+8n6//u56v/7udsf+8nbP/v5+1/76gsv+7nq7/waO2/5Bx + h/96WnL/f154/35eeP95WXH/ooOY/8Git/+6m7D/vJ6x/7yfsP+8n6//vJ+u/7yfrv+8n6//u52w/7uc + sv++nrT/v5+2/72ctf++n7b/uJmu/6WGm/+mh5z/poec/6aHm/+pi57/vJ6x/7udsP+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8n6//vJ6w/7udsP/CpLf/ooSY/3lbb/9+X3X/gF95/3ta + dP+Ob4b/waK3/72fsf+9oLH/vqGy/72fsv+6nK//vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/upyv/72es/+LbIH/e1tx/35edv+AYHf/dFhv/7GkuP/RzuH/ysXY/8/G + 2v/NyNv/xMfZ/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eI + nf+oiZ7/oICX/35ed/+AYHn/gGB5/31fe/91XIv/gFnY/3VP7/9wUvD/c1Lv/3dZ3/+qk8H/vqGu/7uf + r/+8n6//vJ+w/7udsP+8nrD/vJ+u/7qdrP++obL/knOI/31ddf+BYXv/gmB9/3xcdf+jhJn/wKG2/7qb + r/+8nrH/vJ+w/7yfr/+8n67/vJ+v/7yfr/+9oLD/vJ6w/7udsP+7nbH/vJ2y/7ydsv+3mK3/poec/6eI + nv+nh5//poec/6mLnv+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yf + r/+8n7D/u52w/7+htf+khJv/e1tz/4Fhev+BX3z/fVx2/49viP+/oLX/u56u/7yfrf+7nq3/u56w/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+6nK//vZ6z/45v + hf99XXX/gWF6/4Fie/91W3L/rqS4/8fL3f++xdb/w8XX/8TF2P/Axtf/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6mKn/+ff5b/f193/4Bgev+AYHr/fWF2/3Zh + gv9/Wtf/cVXn/21W6f9yU+v/elzZ/6yXu/++oK//vJ+v/7yfr/+8n6//vJ+v/7yfr/+8n67/up2t/7+i + s/+Scoj/fFx1/4Fgev+BYHv/e1tz/6OEmf/Aobb/upyw/7yesf+8n7D/vJ+v/7yfr/+8n6//vJ+v/7yf + r/+8n6//vJ+v/7yfr/+8nrH/vp+z/7aXrP+mh5z/p4if/6eHoP+mh53/qYue/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ+v/7yer/+7nLD/v6C3/6SEnf97W3T/gWB7/4Bf + e/99XXb/j2+I/7+gtf+7nq//vJ+v/7yfr/+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ucr/++n7T/jW2F/31ddv+BYHv/gmB7/3lZcv+vo7f/xc3e/7rF + 1v/Ax9j/wsbY/8HH2P/Ax9b/wMfW/8DH1v/Ax9b/wMfW/6eInf+niJ3/p4id/6eInf+oiJ7/qIme/6iJ + nv+oiZ//qoug/6CAl/9/XnX/gWB3/4Fgd/9+X3f/eVyJ/39S4/9wUuv/bFPt/3VO8/+AVeH/sJW8/76g + rv+8n6//vJ+u/7yfrv+8n67/vJ+u/7yfr/+6nK//v6G0/5JyiP98XHT/gWF5/4Fhev97W3P/o4SZ/8Ch + tv+6nLD/vJ6x/7yfr/+8n6//vJ+v/7yfr/+8n6//vJ+u/7yfrv+8n67/vJ+u/7yesP+9n7L/t5is/6WF + nf+nh5//p4ag/6aGnf+pi57/vJ6x/72fsv+8nrH/vJ6x/72fsv+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+9n7L/vZ+y/72fsv+9oLL/vaCy/72g + sv+9obD/vaCx/72esv/Born/pYWe/3lYdP9/Xnr/f194/3tbdP+Obob/v6C2/7udsf+8nrH/vJ6w/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8n6//up2v/76f + tP+NbYb/fV12/4BffP+CX33/flhy/7Oit//GzN7/usbW/8HH2P/Fxtj/xMbY/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/p4ie/6eInf+miZz/pYmc/6OHm/+hhJj/pIaX/6aHkv+miJf/mH6W/3Reg/9yXI3/dFuO/3Rb + iv90WJj/h17Y/39d3P98Xdv/glvd/49h0P+2lL3/vaCv/7yesP+8n6//vJ+v/7yfr/+8n6//vJ6x/7qc + r/+/oLX/knKI/3xcdP+BYXr/gWB6/3tbdP+jhJr/wKG1/7qdr/+8n7D/vJ6w/7yesP+8n7D/vJ+w/7yf + sP+8n6//vJ+v/7yfr/+8nrD/vJ6w/72fsv+2mKz/qYqe/6mJoP+piqD/qIme/6qMn/+7nbD/uZuu/7qc + r/+7nbD/uZuu/72esv+8nbH/vJ2y/7ydsv+8nbL/vJ2y/7ydsv+8nbL/vJ2y/7ydsv+8nbL/vJ2y/7yd + sv+8nbH/vJ+x/7aZqv+2mKv/tpir/7eYrP+2mKz/tpis/7aZqv+2mKv/tpes/7qasf+jg5v/gmF8/4dm + gP+FZnv/g2R6/5R1if+/oLT/u52x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/72er/+9nK7/wJ+0/45thv9+XHb/gl98/4Jfff95WXL/sKO3/8XN + 3v+6xtb/wcbY/8XG2P/Extj/wMfW/8DH1v/Ax9b/wMfW/8DH1v+niZz/pomc/6SJnP+ni6D/l3qR/31f + d/+BYXr/g2B3/4Fgff95Wpj/fF/N/3VV4v96U+T/fVbb/4Nly/+rjc7/r5e9/62Ztv+vnLX/uJu0/7yc + s/+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/upyv/7+gtf+ScYr/fFx2/4Fge/+BX3z/e1t1/6OE + mv/AorT/up6t/7yfr/+8nrH/vJ2y/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+7nbD/vZ+y/7ye + sf+7nbD/u52w/7udsP+9n7H/t5ms/6iKnf+niZz/poib/6iKnf+oi53/upyw/7yesv+8nbH/vJ2y/7yd + sv+8nbL/vJ2y/7ydsv+8nbL/vJ2y/7ydsv+8nrL/vJ2x/7ydsf+/obP/l3mL/35fc/+CY3j/gmJ5/4Fh + ev+BYXr/gWF6/4Fhef+DY3v/fl52/5d3j/+/n7j/uJiv/7qcr/+5m63/uZuu/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6v/7ud + rv++n7T/jW2G/31cdv+AX3z/gGB9/3Racv+spLf/xM3e/7rG1v/Ax9j/wsbY/8HG2P/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/6WLmf+miZz/poaf/6mHpP+ceJb/fVx3/39cf/98WoH/emFz/3ZVn/98Uuj/dU7y/3pS + 6v98TO//g1zd/7OWwP++n7H/vp20/7mgqf+9oKz/vp6y/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+6nK//v6C1/5Jyiv98XHb/gWB7/4FgfP97W3X/o4Sa/8CitP+6na3/vJ+v/7yesP+8nbL/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7udsP+7nbD/vJ6x/7yesf+8nrH/vJ6x/7yesf+5m67/pYea/6eJ + nP+niZz/poib/6iKnf+7na//vJ+w/7yfr/+8n6//vJ+v/7yfr/+8n6//vJ+v/7yfr/+8n6//vJ+v/7yf + r/+8n6//u56v/8Chtv+Wdo7/eVlx/4Fhef9/X3j/f155/39eef9/XXv/f156/4Bfev97W3T/l3eP/8Gh + uf+7nLH/vJ6x/7yesf+7nbD/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+6n7H/t52w/7ugtP+Kbob/el12/35ge/+AYHz/d1py/6+j + t//Izd7/vcXW/8PG2P/Cxtj/wMfY/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/pIqb/6aJnf+ohqD/qoei/516 + k/98XnD/fl54/4Nhef9+alz/eFqT/3xT6/9vUu3/cFni/3JO8v9/X9v/sp+u/8Geq//Cl7z/vaCs/7qi + qv+8nbL/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7qcr/+/oLX/knKK/3xcdv+BYHv/gWB8/3tb + df+jhJr/wKK0/7qdrf+8n6//vJ6w/7ydsv+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/72f + sv+9n7L/u52w/7yesf+8nrH/vJ6x/7eZrP+lh5r/poib/6aIm/+miJv/qIqd/7qdrv+8n6//vJ+v/7yf + r/+8n6//vJ+v/7yfr/+8n6//vJ+v/7yfr/+8n6//vJ+v/7yfr/+7na7/wKC4/5Z2j/98XHX/gF96/39f + ef9/Xnv/f118/39dfv9/XX3/gF58/3tbdf+YeJD/waK3/7qcsP+7nbD/vZ+y/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+9n7L/u52w/7yd + sf+7nLD/v6C1/45thf9+XXb/gmB6/4Rge/95WnL/sqO4/8vM3v/AxNb/xMbY/8LG2P++x9j/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v+liKL/p4ig/6qInv+ri5//mXyP/3ZfcP98YHz/hVx6/4NnZf97Vpf/fFLo/2xS + 6f9oVeb/a07u/3xmy/+vo6b/u5+o/7yXvf+3oK3/taOo/7mesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/upyv/7+gtf+Scor/fFx2/4Fge/+BYHz/e1t1/6OEmv/AorT/up2t/7yfr/+8nrD/vJ2y/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+9n7L/uJqt/6eJ + nP+miJv/poib/6eJnP+pi57/upyu/72gsP+8n6//vJ+v/7yfr/+8n6//vJ+v/7yfr/+8n6//vJ+v/7yf + r/+8n6//vJ+v/7udr//Bobn/lXWO/3tbdf+AX3r/f155/39dev9/XXv/f1x8/39de/+AX3r/e1t0/5Z2 + jf/Borf/upyv/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrD/wZ2z/8Casf/Enrf/kW2F/31ac/+BXnf/gF94/3Ra + cP+vpLj/y8ze/8DD1f/Fxtj/wcbY/73H2P/Ax9b/wMfW/8DH1v/Ax9b/wMfW/6OFov+lh53/p4iY/6eK + nf+UeJr/b1aL/3FXlv93WYn/elyB/3xVov+DXNT/eVvY/3pX4P97S/H/hVrg/7CUwf+7oa7/uKCv/7Si + rP+2nrP/upy2/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+6nK//v6C1/5Jyiv98XHb/gWB7/4Fg + fP97W3X/o4Sa/8CitP+6na3/vJ+v/7yesP+8nbL/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/72fsv+4mq3/p4mc/6aIm/+niZz/p4mc/6iKnf+6nK//upuw/7qb + sP+6m7D/upuw/7qbsP+6m7D/upuw/7qbsP+6m7D/upuw/7qbsP+6m7D/uZuw/7+gtf+Xd47/fl51/4Ji + ev+BYXr/gWB7/4Fge/+BYXr/gWF6/4Jiev97XHP/l3iN/8Citf+7nbD/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7udsP+8nrH/uZuu/7ud + sP++mrL/wJqz/7+dtf+Lb4b/eGB2/3hkef94ZXr/bl9z/6mluP/GzN7/wMXW/8bG2P/Bxtj/vcfY/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/gWR8/4Nmdv+DaHT/fmF+/31dnv+CX8v/d1bY/3NZ1f98WM//iWTE/5Z8 + t/+Xg6X/ooCo/6R9rv+ihaz/vZy1/7yer/+3nrH/tp+y/7+fr//Anq//vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7qcr/+/oLX/knKK/3xcdv+BYHv/gWB8/3tbdf+jhJr/wKK0/7qdrf+8n6//vJ6x/7yd + sv+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ud + sP+5m67/upyv/7qcr/+6nK//t5ms/4hpf/+EZH3/hWV+/4Vlfv+FZX7/hWV+/4Vlfv+FZX7/hWV+/4Vl + fv+FZX7/hWV+/4Vlfv+GZn7/g2V4/6SGmP+4mq7/tZar/7aWrf+2lq7/tpau/7aYqv+2mKr/tpmq/7aY + qv+3maz/upyw/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vZ+y/7qdr/+MboH/g2Z5/4Nlff+DaIH/eWR7/7aovf/Gv9P/u7zO/7u9 + zv++u87/vsPU/7zH2P++xtj/xcbY/8LG2P++x9j/wMfW/8DH1v/Ax9b/wMfW/8DH1v96XH//fmJx/4Ff + d/98YXL/eFmd/35V6v9xU+r/cVTt/3ZP8f+HYdH/oYWo/6iKmv+riZz/qIed/6mNmP++nq7/vZ+v/7qf + r/+6nrH/v5+u/76frv+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrD/up2u/7+htP+Scon/fFx1/4Fg + e/+BX33/e1p1/6ODm//AorT/up2t/7yfrv+8n6//vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/72fsv+8nrH/vJ6x/7yesf+4m63/g2N6/31c + eP9/XXr/fl15/35def9+XXn/fl15/35def9+XXn/fl15/35def9+XXn/f115/39eev96W3H/poeb/8Kk + uP+8nbH/vZ+y/72fsv+9n7L/vaCx/72gsf+9oLH/vZ+x/72fsv+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+7n7D/u5+v/7uesP+9nrL/vJux/4hl + ff+BXHX/gF94/3tfeP9vW3L/t7HE/8nP3//Bydj/xsnZ/8bJ2f/Bydj/vcbW/7/H1//Cx9f/wcfX/8DH + 1//Ax9b/wMfW/8DH1v/Ax9b/wMfW/3pdgf9/ZHL/hV5+/35ib/96WqH/e072/29R6/9yU+v/dU30/4Vh + 0f+jh6P/rIic/6eKmv+jh6D/qIuc/7uerv+8n6//vJ+v/7yfr/+8n6//vJ6w/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yfr/+6na3/v6G0/5JyiP98XHX/gWB6/4Fge/97WnX/o4Ob/8Citf+6na3/vJ+u/7ye + sP+8nbL/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+7nbD/vJ6x/7mbrf+EZXz/f156/4Ffe/+AX3v/gF97/4Bfe/+AX3v/gF97/4Bf + e/+AX3v/gF97/4Bfe/+AX3v/gWB8/3xcdP+lhpz/v6C1/7qcsP+8nrH/vJ+v/7yfr/+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7ufr/+6oK7/up6w/7ydsv+8m7P/iWaB/4Ndef+EYHv/gmB6/3ZddP+0r8L/w8zb/77G + 1P/GxtX/wcbV/7/H1v/Bx9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/f2F3/4Jj + cP+FXX3/fl53/3tVqP9/Tvb/c1Du/3NR7/92TfT/hGDT/6GEqP+rh57/qIuX/6WJm/+oip3/u56w/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ+w/7qdrf+/obT/knOI/31d + df+BYXr/gWF6/3xcdf+jg5v/wKG1/7qcrv+8n6//vJ6x/7ydsv+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/uZuu/4Rl + fP9/Xnn/gWB6/4Bgev+AYHr/gGB6/4Bgev+AYHr/gGB6/4Bgev+AYHr/gGB6/4Bgev+BYXv/fFx0/6WG + m//Aobb/upyw/7yesf+8n6//vJ+v/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/up6w/7qer/+7nbH/u52y/7ib + s/+FZ4D/e154/4Fhe/+CYXr/dl10/7avw//EzNz/vsfV/8TH1v/Bx9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v+DYXb/hGF1/4VefP9+X3b/fFme/4NZ2v95WtL/el3V/3pX + 2/+HacH/oYaj/6qGof+nipr/pIic/6qLn/+7nbH/vZ+y/72esv+9n7L/vJ6x/72fsv+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+9n7D/up2s/7+htP+PcYX/e1tx/39fd/9/X3f/eVlw/6OEm//Borj/vZ6z/76f + tP++n7X/vZ6z/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7udsP+4mq3/gmJ5/31ddv9+Xnf/fl53/35ed/9+Xnf/fl53/35e + d/9+Xnf/fl53/35ed/9+Xnf/fl53/39feP96WnL/pYab/7+gtf+7nLD/vJ6x/7yfr/+8n6//vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+7nbD/vJ6x/72esf+8oLP/vZ+0/76etP+9n7b/up62/3xlff9xXnX/d193/3lddv9wWXH/ta/C/8TN + 3P+9x9X/w8fW/8HH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/4Ng + eP+DXnz/g2B6/31ib/+EZpD/mHi+/5J6s/+SerT/jnTA/5Z/sv+ki5n/qoSj/6eHoP+kh5//qIme/6uM + of+qi6D/qoug/6yNov+rjKH/upyw/7yfsf+8nrH/vJ6x/7yesf+8nrH/vJ6x/72fsf+8nq//vJ6x/7OV + qP+vkaT/sJGm/66PpP+zlKj/mnuQ/4hogf+MbIT/jW2F/4hogP+ig5n/wKK1/7udsP+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+9n7L/u52w/7ue + sP+wkab/r5Cn/7CQp/+wkKf/sJCn/7CQp/+wkKf/sJCn/7CQp/+wkKf/sJCn/7CQp/+wkKf/sJCn/6+P + pv+3mK3/vJ2y/7udsf+8nrH/vJ+v/7yfr/+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7udsP+9n7L/uJqt/4xvhf+Ka4T/jGyE/4ps + hP+GbIX/t6i+/7qyx/+7scb/vq7F/76vxf/EwdT/v8nY/73I1v/Cx9b/wcfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/gV95/4Fbgv+AYHr/e2Ft/4lrh/+liKn/o4mb/6WK + nP+ghqr/noig/6WNkv+rhKX/poeh/6SIoP+mh5z/pYab/6aHnP+mh5z/pYab/6eInf+6nLD/vJ+x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7udsP+9n7L/vaCx/76hsv++obL/vaCx/8Oltv+Yeo3/d1dw/39e + eP98XHb/eVly/5p6kf/Bo7b/u52w/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vZ+y/7udsP+8nrH/vZ+y/76gs/++oLT/vqC0/76gtP++oLT/vqC0/76g + tP++oLT/vqC0/76gtP++oLT/vqC0/76gtP++n7T/vp61/7ydsv+9nrP/u5yw/7yesf+8n6//vJ+v/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+7nbD/vJ6x/7udsP+2mKv/fmB3/3tbdv99XXb/elx1/3Vfd//FvNH/ysvf/8TI3P/Iydz/zcnd/8TG + 2P+8x9f/vcjW/8LH1v/Bx9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v9/YXf/fluD/35gfP97YHH/i2qI/6uJov+sipb/roqT/6eHof+jiZn/qI2R/6yDpv+miJ//o4md/6aG + nv+mh57/p4ee/6eIn/+nh57/qIif/7qbr/+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7qc + rv+7nq7/u56u/7uerv+6na3/wKOy/5d5jf98XHT/gF57/4Nhfv96WXP/nHyT/8Gitv+7nbD/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ud + sP+6nK//u52w/7udsP+7nbD/u52w/7udsP+7nbD/u52w/7udsP+7nbD/u52w/7udsP+7nbD/u52w/7ye + sf+7m7L/u5yx/7ucsf+7nbH/vJ6x/7yfr/+8n6//vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vZ6x/7udsP+6nK//vqCz/7eYq/+CZHv/fl55/4Bf + ev9+YHr/d2N6/7+5zv/Axtn/t8bX/7vF1//BxNf/v8bX/7vI1/+9yNb/wsfW/8HH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/4BgeP+AX3v/gGB6/31edv+LaoX/qomi/6eF + nP+ph5z/p4ag/6aHnf+oiZv/qYaf/6eInf+miZ3/p4ed/6eInf+nh53/poec/6eHnf+niJ3/upuv/7ye + sf+7nbD/u56v/7yer/+7nq7/u52t/7uesP+8nrH/vZ+y/7yesf+8nrH/vJ6x/7uer/+/orH/mXuO/3tb + dP+CYXz/gWB7/3xcdf+bfJL/wKK0/7qcrv+7nbD/vJ6w/7udsP+7nbH/vJ6y/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/72fsv+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7udsf+8nrH/vJ6x/7udsf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/up6x/7mf + sf+6nbD/upuw/72dsv+6m7H/tpmv/4Fje/9/Xnj/gl95/39gef95Y3v/wLfN/8XI2/+9xtb/wMnY/8DG + 1v/Ax9f/v8jW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/gGB5/4Bgef+BYXn/fVx2/4xshf+qiqP/qIih/6qKpP+piqP/p4eg/6aGn/+niJ3/p4id/6eI + nf+niJ3/p4id/6eInf+niJ3/poec/6iJnv+7nLH/vqC0/76gs/++oLP/vaCw/72gr/+7nq3/vJ6w/7ye + sf+8nrH/vJ6x/7yesf+8nrH/u52w/8GktP+WeIv/eFhw/3xcdv9+Xnf/dVVu/5l6kP/Fp7n/vqCz/7+h + tP+/obT/v6G0/7ucsf+8nrL/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+4nbD/uaCy/7ugsv/Borb/wJ+1/8Ghuf+3m7L/dl11/3BZ + cf91WXL/cllx/25cc/+9t8z/xcjb/7/G1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v+AYHn/gGB5/4Bgef9/X3j/g2N8/4xs + hf+MbIX/imqD/4hogf+RcYr/qImg/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6aHnP+mh5z/p4id/62O + o/+uj6P/rY+j/66Qo/+sj6D/uJyr/7yfr/+8nrD/vJ6x/7yesf+8nrH/vJ6x/7yesf+7nbD/vaCw/7CT + pP+piqD/qoqi/6eHoP+sjKP/nn+U/5Bwhv+Scoj/knOI/45whP+ggZb/vqCz/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yg + s/+wl6n/kHKH/5NyiP+RcYn/kXOL/5J2jv+xo7n/rqi8/7GmvP+yprz/rqe7/8HB1f/Axtn/v8fX/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/4Bgef+AYHn/gGB5/4Bgef9/X3j/fV12/35ed/98XHX/fV12/4Vlff+piaH/p4ed/6eI + nf+niJ3/p4id/6eInf+niJ3/poec/6eInf+mh5z/poac/6WGnP+lhpv/poeb/6WHmf+4m6z/vJ+v/7ue + r/+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8n6//vaCw/8CitP/Aorb/vp61/8Sluv+ggZf/dlZv/31d + dv99XXT/eFlu/5Fyh//Bo7b/uZuu/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nbD/vqG1/66Spv96W3H/flx0/3xddf93WnP/fmN8/8zG + 2v/Hz+D/ycze/8rM3v/KzN7/wsjZ/77G1//Ax9f/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/gGB5/4Bgef+AYHn/gGB5/4Bg + ef+BYXr/gGB5/4BgeP9+Xnf/iGiA/6iIoP+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eI + nf+niJ7/p4eg/6eIn/+oiZ7/poib/7iarf+9n7L/vJ6w/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yf + sP+8n6//u56u/7uerv+5m67/v6C1/6CAmP98XHb/gmJ7/4Jiev99XXT/lXaL/8Chtf+6nK//vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+9n7P/sZKp/4Bfd/+DYXr/gmJ7/3teeP+BZ4H/w7/T/7zI1/+9xtX/vsbW/77G1v+/x9f/v8jX/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v+AYHn/gGB5/4Bgef+AYHn/gGB5/4Bgef+AYHn/f194/35ed/+HZ4D/qIig/6eI + nf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eHnv+nh5//p4ef/6eIn/+mh5z/uJmt/72f + sv+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yfr/+8n67/vKCu/7qdrf/AobX/oICY/3ta + dv+BYHz/gWF6/3xcdP+UdYv/wKK1/7qdrv+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6w/76ftP+ykar/gF52/4Jgef+AYHr/eV14/39n + gP/EwdT/wMnX/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/4Bgef+AYHn/gGB5/4Bg + ef+AYHn/gGB5/4Bgef9/X3j/fl53/4dngP+oiKD/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eI + nf+niJ3/p4ef/6eHoP+nh5//p4ef/6aHnP+4ma7/vZ+y/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ+v/7yfrv+8oK3/up2s/8Chtf+ggJn/e1l4/4Ffff+BYHr/fFx0/5R1i//AorX/up2u/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrD/vp+0/7ORqv+AXnf/gl95/4Bgev95XXf/fmeB/8bA1f/EyNf/wsfW/8DH1v/Ax9b/wMfW/8HH + 1v/Bx9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + + + \ No newline at end of file diff --git a/FunGame/UI/Start.cs b/FunGame/UI/Start.cs new file mode 100644 index 0000000..0d89156 --- /dev/null +++ b/FunGame/UI/Start.cs @@ -0,0 +1,15 @@ +namespace FunGame.UI +{ + internal static class Start + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + ApplicationConfiguration.Initialize(); + Application.Run(new Main()); + } + } +} \ No newline at end of file diff --git a/FunGame/Utils/DataHelper/AssemblyHelper.cs b/FunGame/Utils/DataHelper/AssemblyHelper.cs new file mode 100644 index 0000000..d9b548a --- /dev/null +++ b/FunGame/Utils/DataHelper/AssemblyHelper.cs @@ -0,0 +1,99 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Reflection; +using FunGame.Models.Config; +using FunGame.Models.Enum; +using System.Diagnostics; + +namespace FunGame.Utils.DataHelper +{ + /// + /// 在FunGame.Core中添加新接口和新实现时,需要: + /// 1、在这里定义类名和方法名 + /// 2、在FunGame.Models.Enum.CommonEnums里同步添加InterfaceType和InterfaceMethod + /// + public class AssemblyHelper + { + /** + * 定义类名 + */ + public const string ServerInterface = "ServerInterface"; + + public const string Implement = "Impl"; // 实现类的后缀(无需修改) + + /** + * 定义方法名 + */ + public const string GetRemoteServerIP = "RemoteServerIP"; + + /** + * 定义反射变量 + */ + private Assembly? Assembly; + private Type? Type; + private MethodInfo? Method; + private object? Instance; + + /// + /// 获取FunGame.Core.dll中接口的实现方法 + /// + /// 类名 + /// + private Type? GetFunGameCoreImplement(int Interface) + { + // 通过类名获取获取命名空间+类名称 + string ClassName = Interface switch + { + (int)CommonEnums.InterfaceType.ServerInterface => ServerInterface + Implement, + _ => "", + }; + List? Classes = null; + if (Assembly != null) + { + Classes = Assembly.GetTypes().Where(w => + w.Namespace == "FunGame.Core.Implement" && + w.Name.Contains(ClassName) + ).ToList(); + if (Classes != null && Classes.Count > 0) + { + Debug.WriteLine(Classes); + return Classes[0]; + } + else return null; + } + else return null; + } + + private string GetMethodName(int Method) + { + // 通过AssemblyHelperType来获取方法名 + switch (Method) + { + case (int)CommonEnums.InterfaceMethod.GetServerIP: + return GetRemoteServerIP; + } + return ""; + } + + public object? GetFunGameCoreValue(int Interface, int Method) + { + Assembly = Assembly.LoadFile(System.Windows.Forms.Application.StartupPath + @"FunGame.Core.dll"); // 要绝对路径 + Type = GetFunGameCoreImplement(Interface); // 通过类名获取获取命名空间+类名称 + string MethodName = GetMethodName(Method); // 获取方法名 + if (Assembly != null && Type != null) this.Method = Type.GetMethod(MethodName); // 从Type中查找方法名 + else return null; + Instance = Assembly.CreateInstance(Type.Namespace + "." + Type.Name); + if (Instance != null && this.Method != null) + { + object? value = this.Method.Invoke(Instance, Array.Empty()); // 实例方法的调用 + if (value != null) + return value; + else return null; + } + else return null; + } + } +} diff --git a/FunGame/Utils/DataHelper/INIHelper.cs b/FunGame/Utils/DataHelper/INIHelper.cs new file mode 100644 index 0000000..0e38dda --- /dev/null +++ b/FunGame/Utils/DataHelper/INIHelper.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Utils.DataHelper +{ + public class INIHelper + { + /* + * 声明API函数 + */ + public string INIPath; + [DllImport("kernel32", CharSet = CharSet.Unicode)] + private static extern long WritePrivateProfileString(string section, string key, string val, string filePath); + [DllImport("kernel32", CharSet = CharSet.Unicode)] + private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath); + + /// + /// 构造函数 + /// + /// ini文件路径 + public INIHelper(string INIPath = "./fungame.milimoe") + { + this.INIPath = INIPath; + } + + /// + /// 写入ini文件 + /// + /// Section + /// 键 + /// 值 + public void WriteINI(string Section, string Key, string Value) + { + WritePrivateProfileString(Section, Key, Value, INIPath); + } + + /// + /// 读取ini文件 + /// + /// Section + /// 键 + /// 返回的值 + public string ReadINI(string Section, string Key) + { + StringBuilder temp = new StringBuilder(256); + int i = GetPrivateProfileString(Section, Key, "", temp, 256, INIPath); + return temp.ToString(); + } + + /// + /// 查询ini文件是否存在 + /// + /// 是否存在 + public bool ExistINIFile() + { + return File.Exists(INIPath); + } + } +} diff --git a/FunGame/Utils/WebHelper/WebHelper.cs b/FunGame/Utils/WebHelper/WebHelper.cs new file mode 100644 index 0000000..9fa6bee --- /dev/null +++ b/FunGame/Utils/WebHelper/WebHelper.cs @@ -0,0 +1,368 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using System.Net; +using System.Text; +using System.Threading.Tasks; +using FunGame.Models.Config; +using FunGame.Models.Component; +using FunGame.Models.Entity; +using System.ComponentModel.DataAnnotations; +using FunGame.Models.Enum; + +namespace FunGame.Utils.WebHelper +{ + public class WebHelper + { + private Socket? client; + private EndPoint? server; + Main Main; + + Action? WebHelper_Action = null; + + Task? WaitHeartBeat = null; + + public WebHelper(Main main) + { + Main = main; + } + + /// + /// 选择WebHelp分支方法 + /// + /// 分支方法ID + public void WebHelpMethod(int i) + { + switch (i) + { + case (int)CommonEnums.WebHelperMethod.CreateSocket: + CreateSocket(); + break; + case (int)CommonEnums.WebHelperMethod.CloseSocket: + Close(); + break; + case (int)CommonEnums.WebHelperMethod.StartWebHelper: + StartWebHelper(); + break; + } + } + + /// + /// 创建客户端专属Socket + /// + private void CreateSocket() + { + try + { + client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + server = new IPEndPoint(IPAddress.Parse(Config.SERVER_IPADRESS), Config.SERVER_PORT); + while (true) + { + if (!IsConnected()) + { + client.Connect(server); + if (IsConnected()) + { + Main.GetMessage(this, Config.WebHelper_SetGreen); + break; + } + } + } + WebHelper_Action = (main, socket) => + { + object? obj = main.GetMessage(this, Config.WebHelper_GetUser); + object[] objs; + if (obj != null) + objs = new object[] { main, socket, obj }; + else + objs = new object[] { main, socket }; + Task.Factory.StartNew(() => + { + + }); + if (Send((int)SocketEnums.Type.CheckLogin, objs)) // 确认连接的玩家 + StartWebHelper(); // 开始创建TCP流 + }; + Task t = Task.Factory.StartNew(() => + { + if (Main.InvokeRequired) + { + Main.Invoke(WebHelper_Action, Main, client); + } + else + { + WebHelper_Action(Main, client); + } + }); + } + catch (Exception e) + { + Main.GetMessage(this, Config.WebHelper_Disconnected); + Main.GetMessage(this, e.StackTrace); + Close(); + } + } + + /// + /// 判断是否连接成功 + /// + /// 连接状态 + public bool IsConnected() + { + if (client != null) + return client.Connected; + return false; + } + + private bool Read(object[]? objs = null) + { + Main main = Main; + Socket? socket = null; + try + { + if (objs != null) + { + if (objs.Length > 0) main = (Main)objs[0]; + if (objs.Length > 1) socket = (Socket)objs[1]; + } + else + { + main = Main; + socket = client; + } + if (socket != null) + { + // 从服务器接收消息 + byte[] buffer = new byte[2048]; + int length = socket.Receive(buffer); + if (length > 0) + { + string msg = Config.DEFAULT_ENCODING.GetString(buffer, 0, length); + int type = GetType(msg); + string typestring = GetTypeString(type); + string read = GetMessage(msg); + main.GetMessage(this, read); + switch (type) + { + case (int)SocketEnums.Type.GetNotice: + break; + case (int)SocketEnums.Type.Login: + break; + case (int)SocketEnums.Type.CheckLogin: + return true; + case (int)SocketEnums.Type.Logout: + break; + case (int)SocketEnums.Type.HeartBeat: + if (WaitHeartBeat != null && !WaitHeartBeat.IsCompleted) WaitHeartBeat.Wait(1); + Config.WebHelper_HeartBeatFaileds = 0; + return true; + } + } + else + throw new Exception("ERROR:未收到任何来自服务器的信息,与服务器连接可能丢失。"); + } + else + { + main.GetMessage(this, Config.WebHelper_Disconnected); + throw new Exception("ERROR:服务器连接失败。"); + } + } + catch (Exception e) + { + main.GetMessage(this, Config.WebHelper_Disconnected); + main.GetMessage(this, e.Message != null ? e.Message + "\n" + e.StackTrace : "" + e.StackTrace); + Close(); + } + return false; + } + + private bool Send(int i, object[]? objs = null) + { + Main main = Main; + Socket? socket = null; + try + { + if (objs != null) + { + if (objs.Length > 0) main = (Main)objs[0]; + if (objs.Length > 1) socket = (Socket)objs[1]; + } + else + { + main = Main; + socket = client; + } + if (socket != null) + { + // 发送消息给服务器端 + switch (i) + { + case (int)SocketEnums.Type.GetNotice: + break; + case (int)SocketEnums.Type.Login: + break; + case (int)SocketEnums.Type.CheckLogin: + User user; + string msg; + if (objs != null && objs.Length > 2) + { + user = (User)objs[2]; + msg = user.Userame; + } + else + { + Usercfg.FunGame_isAutoRetry = false; + throw new Exception("SUCCESS:服务器连接成功,检测到未登录账号已自动断开,请登录后手动发起服务器连接。"); + } + byte[] buffer = new byte[2048]; + buffer = Config.DEFAULT_ENCODING.GetBytes(MakeMessage((int)SocketEnums.Type.CheckLogin, msg)); + int l = socket.Send(buffer); + if (l > 0) + { + return Read(objs); + } + else + throw new Exception("ERROR:消息未送达服务器,与服务器连接可能丢失。"); + case (int)SocketEnums.Type.Logout: + break; + case (int)SocketEnums.Type.HeartBeat: + buffer = new byte[2048]; + buffer = Config.DEFAULT_ENCODING.GetBytes(Convert.ToString(MakeMessage((int)SocketEnums.Type.HeartBeat, ">> 心跳检测"))); + if (socket.Send(buffer) > 0) + { + WaitHeartBeat = Task.Run(() => + { + Thread.Sleep(4000); + AddHeartBeatFaileds(main); + }); + return true; + } + AddHeartBeatFaileds(main); + break; + } + } + else + { + main.GetMessage(this, Config.WebHelper_Disconnected); + throw new Exception("ERROR:服务器连接失败。"); + } + } + catch (Exception e) + { + CatchException(main, e, false); + } + return false; + } + + private void CatchException(Main main, Exception e, bool isDisconnected) + { + if (isDisconnected) + main.GetMessage(this, Config.WebHelper_Disconnected); + else + main.GetMessage(this, Config.WebHelper_SetRed); + main.GetMessage(this, e.Message != null ? e.Message + "\n" + e.StackTrace : "" + e.StackTrace); + Close(); + } + + private void AddHeartBeatFaileds(Main main) + { + // 超过三次没回应心跳,服务器连接失败。 + try + { + Config.WebHelper_HeartBeatFaileds++; + if (Config.WebHelper_HeartBeatFaileds >= 3) + throw new Exception("ERROR:服务器连接失败。"); + } + catch (Exception e) + { + CatchException(main, e, true); + } + } + + private int GetType(string msg) + { + int index = msg.IndexOf(';') - 1; + if (index > 0) + return Convert.ToInt32(msg[..index]); + else + return Convert.ToInt32(msg[..1]); + } + + private string GetTypeString(int type) + { + switch (type) + { + case (int)SocketEnums.Type.GetNotice: + return SocketEnums.TYPE_GetNotice; + case (int)SocketEnums.Type.Login: + return SocketEnums.TYPE_Login; + case (int)SocketEnums.Type.CheckLogin: + return SocketEnums.TYPE_CheckLogin; + case (int)SocketEnums.Type.Logout: + return SocketEnums.TYPE_Logout; + case (int)SocketEnums.Type.HeartBeat: + return SocketEnums.TYPE_HeartBeat; + default: + return SocketEnums.TYPE_UNKNOWN; + } + } + + private string GetMessage(string msg) + { + int index = msg.IndexOf(';') + 1; + return msg[index..]; + } + + private string MakeMessage(int type, string msg) + { + return type + ";" + msg; + } + + private void Close() + { + if (client != null) + { + client.Close(); + client = null; + } + if (server != null) + { + server = null; + } + } + + private void StartWebHelper() + { + Task HeartBeatStream = Task.Factory.StartNew(() => + { + CreateSendHeartBeatStream(); + }); + Task StreamReader = Task.Factory.StartNew(() => + { + CreateStreamReader(); + }); + } + + private void CreateSendHeartBeatStream() + { + Thread.Sleep(1000); + Main.GetMessage(this, "Creating: SendHeartBeatStream...OK"); + while (IsConnected()) + { + Send((int)SocketEnums.Type.HeartBeat); // 发送心跳包 + Thread.Sleep(20000); + } + } + + private void CreateStreamReader() + { + Thread.Sleep(1000); + Main.GetMessage(this, "Creating: StreamReader...OK"); + while (IsConnected()) + { + Read(); + } + } + } +} diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..0ad25db --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..eb31c99 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# FunGame \ No newline at end of file