├── CrapChat2
├── README.md
├── Icon.ico
├── packages.config
├── FoundServer.cs
├── Program.cs
├── LICENSE.md
├── Properties
│ ├── Settings.settings
│ ├── AssemblyInfo.cs
│ ├── Resources.Designer.cs
│ ├── Settings.Designer.cs
│ └── Resources.resx
├── App.config
├── Audio.cs
├── CrapChat2.csproj
├── Net.cs
├── CClient.cs
├── CServer.cs
├── Main.cs
├── Main.Designer.cs
└── Main.resx
├── Guide Images
├── Base.png
├── Name.png
├── Port and Refresh.png
└── Host Port and Name.png
├── CrapChat2.sln
├── LICENSE.md
├── .gitignore
└── README.md
/CrapChat2/README.md:
--------------------------------------------------------------------------------
1 | CrapChat2
2 |
--------------------------------------------------------------------------------
/CrapChat2/Icon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Epicguru/CChat2/HEAD/CrapChat2/Icon.ico
--------------------------------------------------------------------------------
/Guide Images/Base.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Epicguru/CChat2/HEAD/Guide Images/Base.png
--------------------------------------------------------------------------------
/Guide Images/Name.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Epicguru/CChat2/HEAD/Guide Images/Name.png
--------------------------------------------------------------------------------
/Guide Images/Port and Refresh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Epicguru/CChat2/HEAD/Guide Images/Port and Refresh.png
--------------------------------------------------------------------------------
/Guide Images/Host Port and Name.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Epicguru/CChat2/HEAD/Guide Images/Host Port and Name.png
--------------------------------------------------------------------------------
/CrapChat2/packages.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/CrapChat2/FoundServer.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Net;
5 | using System.Text;
6 | using System.Threading.Tasks;
7 |
8 | namespace CrapChat
9 | {
10 | public struct FoundServer
11 | {
12 | public string Name;
13 | public IPEndPoint EndPoint;
14 |
15 | public override string ToString()
16 | {
17 | return Name == null ? "" : Name.Trim();
18 | }
19 |
20 | public bool IsInvalid()
21 | {
22 | return this.EndPoint == null;
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/CrapChat2/Program.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Threading.Tasks;
5 | using System.Windows.Forms;
6 |
7 | namespace CrapChat
8 | {
9 | static class Program
10 | {
11 |
12 | ///
13 | /// The main entry point for the application.
14 | ///
15 | [STAThread]
16 | static void Main()
17 | {
18 | Application.EnableVisualStyles();
19 | Application.SetCompatibleTextRenderingDefault(false);
20 | Application.Run(new Main());
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/CrapChat2.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio 15
4 | VisualStudioVersion = 15.0.27428.2015
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CrapChat2", "CrapChat2\CrapChat2.csproj", "{D2F9BF3A-DDE6-4F8E-B462-FA241F1661AC}"
7 | EndProject
8 | Global
9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
10 | Debug|x64 = Debug|x64
11 | Release|x64 = Release|x64
12 | EndGlobalSection
13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
14 | {D2F9BF3A-DDE6-4F8E-B462-FA241F1661AC}.Debug|x64.ActiveCfg = Debug|x64
15 | {D2F9BF3A-DDE6-4F8E-B462-FA241F1661AC}.Debug|x64.Build.0 = Debug|x64
16 | {D2F9BF3A-DDE6-4F8E-B462-FA241F1661AC}.Release|x64.ActiveCfg = Release|x64
17 | {D2F9BF3A-DDE6-4F8E-B462-FA241F1661AC}.Release|x64.Build.0 = Release|x64
18 | EndGlobalSection
19 | GlobalSection(SolutionProperties) = preSolution
20 | HideSolutionNode = FALSE
21 | EndGlobalSection
22 | GlobalSection(ExtensibilityGlobals) = postSolution
23 | SolutionGuid = {72F07010-BF10-49B1-ABB1-F89C6C06B1EA}
24 | EndGlobalSection
25 | EndGlobal
26 |
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 |
2 | The MIT License (MIT)
3 |
4 | Copyright (c) 2018
5 |
6 | Permission is hereby granted, free of charge, to any person obtaining a copy
7 | of this software and associated documentation files (the "Software"), to deal
8 | in the Software without restriction, including without limitation the rights
9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | copies of the Software, and to permit persons to whom the Software is
11 | furnished to do so, subject to the following conditions:
12 |
13 | The above copyright notice and this permission notice shall be included in all
14 | copies or substantial portions of the Software.
15 |
16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 | SOFTWARE.
23 |
--------------------------------------------------------------------------------
/CrapChat2/LICENSE.md:
--------------------------------------------------------------------------------
1 |
2 | The MIT License (MIT)
3 |
4 | Copyright (c) 2018
5 |
6 | Permission is hereby granted, free of charge, to any person obtaining a copy
7 | of this software and associated documentation files (the "Software"), to deal
8 | in the Software without restriction, including without limitation the rights
9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | copies of the Software, and to permit persons to whom the Software is
11 | furnished to do so, subject to the following conditions:
12 |
13 | The above copyright notice and this permission notice shall be included in all
14 | copies or substantial portions of the Software.
15 |
16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 | SOFTWARE.
23 |
--------------------------------------------------------------------------------
/CrapChat2/Properties/Settings.settings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Anon
7 |
8 |
9 | 14242
10 |
11 |
12 | New Server
13 |
14 |
15 | 14242
16 |
17 |
18 | 10000
19 |
20 |
21 | False
22 |
23 |
24 |
--------------------------------------------------------------------------------
/CrapChat2/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // General Information about an assembly is controlled through the following
6 | // set of attributes. Change these attribute values to modify the information
7 | // associated with an assembly.
8 | [assembly: AssemblyTitle("CrapChat2")]
9 | [assembly: AssemblyDescription("It's like discord, but for people who play on LAN. Also way crappier, hence the name.")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("Epicguru")]
12 | [assembly: AssemblyProduct("CrapChat2")]
13 | [assembly: AssemblyCopyright("Copyright © 2018")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // Setting ComVisible to false makes the types in this assembly not visible
18 | // to COM components. If you need to access a type in this assembly from
19 | // COM, set the ComVisible attribute to true on that type.
20 | [assembly: ComVisible(false)]
21 |
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM
23 | [assembly: Guid("d2f9bf3a-dde6-4f8e-b462-fa241f1661ac")]
24 |
25 | // Version information for an assembly consists of the following four values:
26 | //
27 | // Major Version
28 | // Minor Version
29 | // Build Number
30 | // Revision
31 | //
32 | // You can specify all the values or you can default the Build and Revision Numbers
33 | // by using the '*' as shown below:
34 | // [assembly: AssemblyVersion("1.0.*")]
35 | [assembly: AssemblyVersion("1.0.0.0")]
36 | [assembly: AssemblyFileVersion("1.0.0.0")]
37 |
--------------------------------------------------------------------------------
/CrapChat2/App.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 | Anon
15 |
16 |
17 | 14242
18 |
19 |
20 | New Server
21 |
22 |
23 | 14242
24 |
25 |
26 | 10000
27 |
28 |
29 | False
30 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/CrapChat2/Properties/Resources.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | // Runtime Version:4.0.30319.42000
5 | //
6 | // Changes to this file may cause incorrect behavior and will be lost if
7 | // the code is regenerated.
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 | namespace CrapChat.Properties {
12 | using System;
13 |
14 |
15 | ///
16 | /// A strongly-typed resource class, for looking up localized strings, etc.
17 | ///
18 | // This class was auto-generated by the StronglyTypedResourceBuilder
19 | // class via a tool like ResGen or Visual Studio.
20 | // To add or remove a member, edit your .ResX file then rerun ResGen
21 | // with the /str option, or rebuild your VS project.
22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")]
23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
25 | internal class Resources {
26 |
27 | private static global::System.Resources.ResourceManager resourceMan;
28 |
29 | private static global::System.Globalization.CultureInfo resourceCulture;
30 |
31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
32 | internal Resources() {
33 | }
34 |
35 | ///
36 | /// Returns the cached ResourceManager instance used by this class.
37 | ///
38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
39 | internal static global::System.Resources.ResourceManager ResourceManager {
40 | get {
41 | if (object.ReferenceEquals(resourceMan, null)) {
42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("CrapChat.Properties.Resources", typeof(Resources).Assembly);
43 | resourceMan = temp;
44 | }
45 | return resourceMan;
46 | }
47 | }
48 |
49 | ///
50 | /// Overrides the current thread's CurrentUICulture property for all
51 | /// resource lookups using this strongly typed resource class.
52 | ///
53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
54 | internal static global::System.Globalization.CultureInfo Culture {
55 | get {
56 | return resourceCulture;
57 | }
58 | set {
59 | resourceCulture = value;
60 | }
61 | }
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/CrapChat2/Properties/Settings.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | // Runtime Version:4.0.30319.42000
5 | //
6 | // Changes to this file may cause incorrect behavior and will be lost if
7 | // the code is regenerated.
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 | namespace CrapChat.Properties {
12 |
13 |
14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.6.0.0")]
16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
17 |
18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
19 |
20 | public static Settings Default {
21 | get {
22 | return defaultInstance;
23 | }
24 | }
25 |
26 | [global::System.Configuration.ApplicationScopedSettingAttribute()]
27 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
28 | [global::System.Configuration.DefaultSettingValueAttribute("Anon")]
29 | public string DefaultUsername {
30 | get {
31 | return ((string)(this["DefaultUsername"]));
32 | }
33 | }
34 |
35 | [global::System.Configuration.ApplicationScopedSettingAttribute()]
36 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
37 | [global::System.Configuration.DefaultSettingValueAttribute("14242")]
38 | public int DefaultPort {
39 | get {
40 | return ((int)(this["DefaultPort"]));
41 | }
42 | }
43 |
44 | [global::System.Configuration.ApplicationScopedSettingAttribute()]
45 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
46 | [global::System.Configuration.DefaultSettingValueAttribute("New Server")]
47 | public string DefaultNewServerName {
48 | get {
49 | return ((string)(this["DefaultNewServerName"]));
50 | }
51 | }
52 |
53 | [global::System.Configuration.ApplicationScopedSettingAttribute()]
54 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
55 | [global::System.Configuration.DefaultSettingValueAttribute("14242")]
56 | public int DefaultNewServerPort {
57 | get {
58 | return ((int)(this["DefaultNewServerPort"]));
59 | }
60 | }
61 |
62 | [global::System.Configuration.ApplicationScopedSettingAttribute()]
63 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
64 | [global::System.Configuration.DefaultSettingValueAttribute("10000")]
65 | public int AutoRefreshInterval {
66 | get {
67 | return ((int)(this["AutoRefreshInterval"]));
68 | }
69 | }
70 |
71 | [global::System.Configuration.ApplicationScopedSettingAttribute()]
72 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
73 | [global::System.Configuration.DefaultSettingValueAttribute("False")]
74 | public bool AutoLogin {
75 | get {
76 | return ((bool)(this["AutoLogin"]));
77 | }
78 | }
79 | }
80 | }
81 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | ## Ignore Visual Studio temporary files, build results, and
2 | ## files generated by popular Visual Studio add-ons.
3 |
4 | # User-specific files
5 | *.suo
6 | *.user
7 | *.userosscache
8 | *.sln.docstates
9 |
10 | # User-specific files (MonoDevelop/Xamarin Studio)
11 | *.userprefs
12 |
13 | # Build results
14 | [Dd]ebug/
15 | [Dd]ebugPublic/
16 | [Rr]elease/
17 | [Rr]eleases/
18 | x64/
19 | x86/
20 | build/
21 | bld/
22 | [Bb]in/
23 | [Oo]bj/
24 |
25 | # Visual Studio 2015 cache/options directory
26 | .vs/
27 | # Uncomment if you have tasks that create the project's static files in wwwroot
28 | #wwwroot/
29 |
30 | # MSTest test Results
31 | [Tt]est[Rr]esult*/
32 | [Bb]uild[Ll]og.*
33 |
34 | # NUNIT
35 | *.VisualState.xml
36 | TestResult.xml
37 |
38 | # Build Results of an ATL Project
39 | [Dd]ebugPS/
40 | [Rr]eleasePS/
41 | dlldata.c
42 |
43 | # DNX
44 | project.lock.json
45 | artifacts/
46 |
47 | *_i.c
48 | *_p.c
49 | *_i.h
50 | *.ilk
51 | *.meta
52 | *.obj
53 | *.pch
54 | *.pdb
55 | *.pgc
56 | *.pgd
57 | *.rsp
58 | *.sbr
59 | *.tlb
60 | *.tli
61 | *.tlh
62 | *.tmp
63 | *.tmp_proj
64 | *.log
65 | *.vspscc
66 | *.vssscc
67 | .builds
68 | *.pidb
69 | *.svclog
70 | *.scc
71 |
72 | # Chutzpah Test files
73 | _Chutzpah*
74 |
75 | # Visual C++ cache files
76 | ipch/
77 | *.aps
78 | *.ncb
79 | *.opensdf
80 | *.sdf
81 | *.cachefile
82 |
83 | # Visual Studio profiler
84 | *.psess
85 | *.vsp
86 | *.vspx
87 | *.sap
88 |
89 | # TFS 2012 Local Workspace
90 | $tf/
91 |
92 | # Guidance Automation Toolkit
93 | *.gpState
94 |
95 | # ReSharper is a .NET coding add-in
96 | _ReSharper*/
97 | *.[Rr]e[Ss]harper
98 | *.DotSettings.user
99 |
100 | # JustCode is a .NET coding add-in
101 | .JustCode
102 |
103 | # TeamCity is a build add-in
104 | _TeamCity*
105 |
106 | # DotCover is a Code Coverage Tool
107 | *.dotCover
108 |
109 | # NCrunch
110 | _NCrunch_*
111 | .*crunch*.local.xml
112 | nCrunchTemp_*
113 |
114 | # MightyMoose
115 | *.mm.*
116 | AutoTest.Net/
117 |
118 | # Web workbench (sass)
119 | .sass-cache/
120 |
121 | # Installshield output folder
122 | [Ee]xpress/
123 |
124 | # DocProject is a documentation generator add-in
125 | DocProject/buildhelp/
126 | DocProject/Help/*.HxT
127 | DocProject/Help/*.HxC
128 | DocProject/Help/*.hhc
129 | DocProject/Help/*.hhk
130 | DocProject/Help/*.hhp
131 | DocProject/Help/Html2
132 | DocProject/Help/html
133 |
134 | # Click-Once directory
135 | publish/
136 |
137 | # Publish Web Output
138 | *.[Pp]ublish.xml
139 | *.azurePubxml
140 | # TODO: Comment the next line if you want to checkin your web deploy settings
141 | # but database connection strings (with potential passwords) will be unencrypted
142 | *.pubxml
143 | *.publishproj
144 |
145 | # NuGet Packages
146 | *.nupkg
147 | # The packages folder can be ignored because of Package Restore
148 | **/packages/*
149 | # except build/, which is used as an MSBuild target.
150 | !**/packages/build/
151 | # Uncomment if necessary however generally it will be regenerated when needed
152 | #!**/packages/repositories.config
153 |
154 | # Windows Azure Build Output
155 | csx/
156 | *.build.csdef
157 |
158 | # Windows Store app package directory
159 | AppPackages/
160 |
161 | # Visual Studio cache files
162 | # files ending in .cache can be ignored
163 | *.[Cc]ache
164 | # but keep track of directories ending in .cache
165 | !*.[Cc]ache/
166 |
167 | # Others
168 | ClientBin/
169 | [Ss]tyle[Cc]op.*
170 | ~$*
171 | *~
172 | *.dbmdl
173 | *.dbproj.schemaview
174 | *.pfx
175 | *.publishsettings
176 | node_modules/
177 | orleans.codegen.cs
178 |
179 | # RIA/Silverlight projects
180 | Generated_Code/
181 |
182 | # Backup & report files from converting an old project file
183 | # to a newer Visual Studio version. Backup files are not needed,
184 | # because we have git ;-)
185 | _UpgradeReport_Files/
186 | Backup*/
187 | UpgradeLog*.XML
188 | UpgradeLog*.htm
189 |
190 | # SQL Server files
191 | *.mdf
192 | *.ldf
193 |
194 | # Business Intelligence projects
195 | *.rdl.data
196 | *.bim.layout
197 | *.bim_*.settings
198 |
199 | # Microsoft Fakes
200 | FakesAssemblies/
201 |
202 | # Node.js Tools for Visual Studio
203 | .ntvs_analysis.dat
204 |
205 | # Visual Studio 6 build log
206 | *.plg
207 |
208 | # Visual Studio 6 workspace options file
209 | *.opt
210 |
211 | # Visual Studio LightSwitch build output
212 | **/*.HTMLClient/GeneratedArtifacts
213 | **/*.DesktopClient/GeneratedArtifacts
214 | **/*.DesktopClient/ModelManifest.xml
215 | **/*.Server/GeneratedArtifacts
216 | **/*.Server/ModelManifest.xml
217 | _Pvt_Extensions
--------------------------------------------------------------------------------
/CrapChat2/Audio.cs:
--------------------------------------------------------------------------------
1 | using Lidgren.Network;
2 | using NAudio.Wave;
3 | using NAudio.Wave.SampleProviders;
4 | using System;
5 | using System.Collections.Generic;
6 | using System.Linq;
7 | using System.Text;
8 | using System.Threading.Tasks;
9 |
10 | namespace CrapChat
11 | {
12 | public static class Audio
13 | {
14 | public static Dictionary Providers = new Dictionary();
15 | public static Dictionary IDs = new Dictionary();
16 | public static WaveOutEvent Output;
17 | public static WaveInEvent Input;
18 | public static MixingSampleProvider Mixer;
19 | public static bool Initialized = false;
20 |
21 | private static int maxID;
22 | const int SAMPLE_RATE = 44100;
23 | const int CHANNELS = 1;
24 |
25 | public static WaveFormat GetFormat()
26 | {
27 | return WaveFormat.CreateIeeeFloatWaveFormat(SAMPLE_RATE, CHANNELS);
28 | }
29 |
30 | public static void InitAll()
31 | {
32 | if (Initialized)
33 | {
34 | Main.Log("[AUDIO] Already initialized!");
35 | return;
36 | }
37 |
38 | Input = new WaveInEvent();
39 | Input.WaveFormat = GetFormat();
40 | Input.BufferMilliseconds = 25;
41 | Input.DataAvailable += NewInputData;
42 | Input.StartRecording();
43 |
44 | Mixer = new MixingSampleProvider(GetFormat());
45 | Mixer.ReadFully = true;
46 |
47 | Output = new WaveOutEvent();
48 | Output.DesiredLatency = 60;
49 | Output.Init(Mixer);
50 | Output.Play();
51 |
52 | Initialized = true;
53 | Main.Log("[AUDIO] Initialized.");
54 | }
55 |
56 | public static int GetOrCreateID(NetConnection n)
57 | {
58 | if (n == null)
59 | return -1;
60 |
61 | if (IDs.ContainsKey(n))
62 | {
63 | return IDs[n];
64 | }
65 | else
66 | {
67 | IDs.Add(n, maxID++);
68 | return maxID - 1;
69 | }
70 | }
71 |
72 | public static void QueuePlay(int key, byte[] bytes, int count)
73 | {
74 | if (!Providers.ContainsKey(key))
75 | {
76 | Main.Log("Creating new Buffered Wave Provider for key '" + key + "'");
77 | BufferedWaveProvider bufferedWave = new BufferedWaveProvider(GetFormat());
78 | bufferedWave.BufferLength = (32 / 8) * SAMPLE_RATE * CHANNELS * 5; // 5 seconds of buffer.
79 | Mixer.AddMixerInput(bufferedWave);
80 | Providers[key] = bufferedWave;
81 |
82 | }
83 | Providers[key].AddSamples(bytes, 0, count);
84 | //Main.Log("Buffer @ " + Math.Round((float)Providers[key].BufferedBytes / Providers[key].BufferLength * 100f) + "%");
85 | }
86 |
87 | public static void ClearAll()
88 | {
89 | if (!Initialized)
90 | {
91 | Main.Log("[AUDIO] Not initialized, cannot clear all!");
92 | return;
93 | }
94 |
95 | foreach (var item in Providers)
96 | {
97 | item.Value.ClearBuffer();
98 | }
99 | Providers.Clear();
100 | IDs.Clear();
101 | Mixer.RemoveAllMixerInputs();
102 | Output.Stop();
103 | Input.StopRecording();
104 |
105 | Mixer = null;
106 | Output = null;
107 | Input = null;
108 | maxID = 0;
109 |
110 | Initialized = false;
111 | Main.Log("[AUDIO] Cleared all data, reset.");
112 | }
113 |
114 | private static void NewInputData(object sender, WaveInEventArgs e)
115 | {
116 | if (Net.IsConnected)
117 | {
118 | // Client...
119 | Net.Client.SendAudio(e.Buffer, e.BytesRecorded);
120 | }
121 | else if(Net.IsServer)
122 | {
123 | // Server...
124 | Net.Server.SendAudio(e.Buffer, e.BytesRecorded);
125 | }
126 | }
127 | }
128 | }
129 |
--------------------------------------------------------------------------------
/CrapChat2/CrapChat2.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | AnyCPU
7 | {D2F9BF3A-DDE6-4F8E-B462-FA241F1661AC}
8 | Exe
9 | CrapChat
10 | CrapChat2
11 | v4.7.1
12 | 512
13 | true
14 |
15 |
16 | CrapChat.Program
17 |
18 |
19 | true
20 | bin\Debug\
21 | DEBUG;TRACE
22 | full
23 | x64
24 | prompt
25 | MinimumRecommendedRules.ruleset
26 | true
27 |
28 |
29 | bin\Release\
30 | TRACE
31 | true
32 | pdbonly
33 | x64
34 | prompt
35 | MinimumRecommendedRules.ruleset
36 | true
37 |
38 |
39 | Icon.ico
40 |
41 |
42 |
43 | ..\packages\Lidgren.Network.1.0.2\lib\net451\Lidgren.Network.dll
44 |
45 |
46 | ..\packages\NAudio.1.8.5\lib\net35\NAudio.dll
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 | Form
67 |
68 |
69 | Main.cs
70 |
71 |
72 |
73 |
74 |
75 | Main.cs
76 |
77 |
78 | ResXFileCodeGenerator
79 | Resources.Designer.cs
80 | Designer
81 |
82 |
83 | True
84 | Resources.resx
85 | True
86 |
87 |
88 |
89 | SettingsSingleFileGenerator
90 | Settings.Designer.cs
91 |
92 |
93 | True
94 | Settings.settings
95 | True
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
--------------------------------------------------------------------------------
/CrapChat2/Net.cs:
--------------------------------------------------------------------------------
1 | using CrapChat;
2 | using Lidgren.Network;
3 | using System;
4 | using System.Collections.Generic;
5 | using System.Linq;
6 | using System.Text;
7 | using System.Threading.Tasks;
8 |
9 | namespace CrapChat
10 | {
11 | public static class Net
12 | {
13 | public const string APP_ID = "Crap Chat 2";
14 | public static CClient Client;
15 | public static CServer Server;
16 |
17 | public static bool IsClient
18 | {
19 | get
20 | {
21 | return Client != null;
22 | }
23 | }
24 |
25 | public static bool IsServer
26 | {
27 | get
28 | {
29 | return Server != null;
30 | }
31 | }
32 |
33 | public static bool IsConnected
34 | {
35 | get
36 | {
37 | return IsClient && Client.Status == NetPeerStatus.Running && Client.ConnectionStatus == NetConnectionStatus.Connected;
38 | }
39 | }
40 |
41 | public static bool IsConnecting
42 | {
43 | get
44 | {
45 | return IsClient && Client.Status == NetPeerStatus.Running && Client.ConnectionStatus != NetConnectionStatus.Disconnected;
46 | }
47 | }
48 |
49 | public static void StartClient()
50 | {
51 | if (IsClient)
52 | {
53 | Main.Log("Client is already started, cannot start a new one.");
54 | return;
55 | }
56 |
57 | var config = new NetPeerConfiguration(APP_ID);
58 | config.EnableMessageType(NetIncomingMessageType.DiscoveryResponse);
59 |
60 | Client = new CClient(null, config);
61 | Client.Start();
62 |
63 | Main.Log("Started client...");
64 | }
65 |
66 | public static void StopClient()
67 | {
68 | if (!IsClient)
69 | {
70 | Main.Log("Client is not running...");
71 | return;
72 | }
73 |
74 | Client.Shutdown("The user has disconnected from the server. Bye!");
75 | Client = null;
76 | }
77 |
78 | public static bool ConnectClient(string ip, int port)
79 | {
80 | if (!IsClient)
81 | return false;
82 | if (IsConnected || IsConnecting)
83 | return false;
84 |
85 | Main.Log("Attempting to connect to " + ip + " on port " + port);
86 |
87 | try
88 | {
89 | Client.Connect(ip, port, Client.CreateMessage(Main.ActiveUsername));
90 | return true;
91 | }
92 | catch (Exception e)
93 | {
94 | Main.Log(e);
95 | return false;
96 | }
97 | }
98 |
99 | public static void UponClientConnected()
100 | {
101 | Audio.InitAll();
102 | Main.UponConnected();
103 | }
104 |
105 | public static void UponClientDisconnected()
106 | {
107 | Client = null;
108 | Audio.ClearAll();
109 | Main.UponDisconnected();
110 | }
111 |
112 | public static void DiscoverPeers(int port, CClient.ServerFound callback)
113 | {
114 | if (!IsClient)
115 | {
116 | Main.Log("Cannot discover peers, client is not started.");
117 | return;
118 | }
119 | Main.Log("Scanning for local peers on " + port + "...");
120 | Client.StartDiscovery(port, callback);
121 | }
122 |
123 | public static bool StartServer(int port, string name)
124 | {
125 | if (IsServer)
126 | {
127 | Main.Log("Server already started, shut it down before you open a new one.");
128 | return false;
129 | }
130 | if (IsClient && (IsConnected || IsConnecting))
131 | {
132 | Main.Log("Cannot host server while client is active.");
133 | return false;
134 | }
135 |
136 | var config = new NetPeerConfiguration(APP_ID);
137 | config.EnableMessageType(NetIncomingMessageType.DiscoveryRequest);
138 | config.EnableMessageType(NetIncomingMessageType.ConnectionApproval);
139 | config.Port = port;
140 |
141 | Server = new CServer(name, config);
142 | Server.Start();
143 |
144 | Main.Log("Started hosting server on port " + port + " called " + name);
145 |
146 | Main.SetStatus("Hosting Server (" + name.Trim() + ", " + port + ")");
147 | Audio.InitAll();
148 |
149 | return true;
150 | }
151 |
152 | public static void StopServer()
153 | {
154 | if (!IsServer)
155 | return;
156 |
157 | Server.Shutdown("The host has shutdown the server.");
158 | Server = null;
159 |
160 | Main.Log("The locally hosted server has been shut down.");
161 | Audio.ClearAll();
162 | Main.UponServerStop();
163 | }
164 | }
165 |
166 | public enum DataType : byte
167 | {
168 | AUDIO,
169 | MUTED,
170 | NAME
171 | }
172 | }
173 |
--------------------------------------------------------------------------------
/CrapChat2/CClient.cs:
--------------------------------------------------------------------------------
1 | using Lidgren.Network;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Linq;
5 | using System.Net;
6 | using System.Text;
7 | using System.Threading;
8 | using System.Threading.Tasks;
9 | using System.Windows.Forms;
10 |
11 | namespace CrapChat
12 | {
13 | public class CClient : NetClient
14 | {
15 | public delegate void ServerFound(FoundServer server);
16 | public string Name { get; set; }
17 | private ServerFound callback;
18 |
19 | public CClient(string name, NetPeerConfiguration config)
20 | :base(config)
21 | {
22 | this.Name = name;
23 | this.RegisterReceivedCallback(new SendOrPostCallback(GotMessage));
24 | }
25 |
26 | public void StartDiscovery(int port, ServerFound callback)
27 | {
28 | this.callback = callback;
29 | this.DiscoverLocalPeers(port);
30 | }
31 |
32 | private static void GotMessage(object peer)
33 | {
34 | var client = ((CClient)peer);
35 | var msg = client.ReadMessage();
36 |
37 | switch (msg.MessageType)
38 | {
39 | case NetIncomingMessageType.DiscoveryResponse:
40 | string name = msg.ReadString();
41 | var s = new FoundServer() { EndPoint = msg.SenderEndPoint, Name = name };
42 |
43 | if (client.callback != null)
44 | client.callback.Invoke(s);
45 | break;
46 |
47 | case NetIncomingMessageType.StatusChanged:
48 | NetConnectionStatus status = (NetConnectionStatus)msg.ReadByte();
49 | string statusText = msg.ReadString();
50 | Main.Log("[STATUS UPDATE] " + status + " - " + statusText);
51 | if(status == NetConnectionStatus.Connected)
52 | {
53 | Main.SetStatus("Connected to " + msg.SenderEndPoint.Address);
54 | Main.Log("Connected!");
55 | Net.UponClientConnected();
56 | }
57 | else if(status == NetConnectionStatus.Disconnected)
58 | {
59 | Main.Log("Disconnected from server. Reason: " + statusText);
60 | Net.UponClientDisconnected();
61 | MessageBox.Show("Disconnected from server: " + statusText, "Disconnected", MessageBoxButtons.OK);
62 | }
63 | else
64 | {
65 | Main.SetStatus(status.ToString());
66 | }
67 | break;
68 |
69 | case NetIncomingMessageType.Data:
70 | var type = (DataType)msg.ReadByte();
71 | ProcessData(type, msg, client);
72 | break;
73 |
74 | default:
75 | Main.Log("[CLIENT UNHANDLED] Type: " + msg.MessageType);
76 | break;
77 | }
78 |
79 | client.Recycle(msg);
80 | }
81 |
82 | private static byte[] buffer = new byte[1024 * 10];
83 | public static void ProcessData(DataType type, NetIncomingMessage msg, CClient c)
84 | {
85 | //Main.Log("Got data of type " + type + ", message is " + msg + ", size " + msg.LengthBytes);
86 | switch (type)
87 | {
88 | case DataType.AUDIO:
89 | // Play this audio.
90 |
91 | int id = msg.ReadInt32();
92 | int bc = msg.ReadInt32();
93 | msg.ReadBytes(bc, out buffer);
94 |
95 | Audio.QueuePlay(id, buffer, bc);
96 | break;
97 | case DataType.MUTED:
98 | bool muted = msg.ReadBoolean();
99 | if (muted)
100 | {
101 | MessageBox.Show("You have been muted by the server owner. Nobody can hear you.", "Muted", MessageBoxButtons.OK);
102 | }
103 | else
104 | {
105 | MessageBox.Show("You have been un-muted by the server owner. Welcome back!", "Un-Muted", MessageBoxButtons.OK);
106 | }
107 | break;
108 | case DataType.NAME:
109 | int count = msg.ReadInt32();
110 | Main.Log("Recieving " + count + " names.");
111 | for (int i = 0; i < count; i++)
112 | {
113 | bool add = msg.ReadBoolean();
114 | string name = msg.ReadString();
115 | if (add)
116 | Main.AddUser(name);
117 | else
118 | Main.RemoveUser(name);
119 | }
120 | break;
121 | }
122 | }
123 |
124 | public void SendAudio(byte[] buffer, int count)
125 | {
126 | var msg = this.CreateMessage();
127 | msg.Write((byte)DataType.AUDIO);
128 | msg.Write(count);
129 | msg.Write(buffer);
130 | SendMessage(msg, NetDeliveryMethod.ReliableOrdered);
131 | }
132 | }
133 | }
134 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # C-Chat 2
2 |
3 | This is a simple voice chat client, that allows a potentially unlimited number of clients to connect to voice chat servers.
4 | **It's primary purpose is to function on a local network only.**
5 | Those servers can be created by anyone. The person hosting that server has control over the other connected clients, so they can kick and mute other people.
6 |
7 | ## How to use
8 | Download and run CrapApp2.exe. It will open a windows form that has the basic controls.
9 | First, choose a username. It is important to press the **[Confirm Name]** button for the name to be updated. You will not be able to do anything else until you have done this step.
10 |
11 | 
12 |
13 | Now the app will automatically scan the local network for open servers. The port that it scans on can be changed here:
14 |
15 | 
16 |
17 | Remember to press refresh when you change this port number.
18 | If you see the name of the server you want to connect to, click on it in the list and then press the **[Connect]** button.
19 | You should now be connected. Say hello!
20 |
21 | You can also host a server. To do this, disconnect from any server that you were connected to (if any).
22 | Now type the name of the new server, and the port number you want to host it on:
23 |
24 | 
25 |
26 | Press the **[Create New Server]** button. You should now be hosting a new server. There are some important things to note about server hosting:
27 | 1. Only one server can be hosted per device per port. Attempting to open more than one server with the same port on the same device will most likely crash the app.
28 | 2. Servers can have duplicate names. This can be confusing, so try to give them unique names.
29 | 3. There are no port restrictions imposed by the app. Despite this, you should never use ports below 1024. These are reserved for system use and attempting to use them could mess up you device.
30 |
31 | Other users can now join the server.
32 |
33 | ## Download
34 | You can download the most recent build in the releases section on github ([here](https://github.com/Epicguru/CChat2/releases)).
35 | >_**When downloading, your browser may warn you about suspicious or harmful files. This is just because the download contains .dll and .exe files. There is nothing harmful about this program.**_
36 |
37 | >_**Your antivirus may also flag this program. Similarly, this is just because it is a relatively unknown file, and it connects to (and scans) the local network. Again, not harmful in any way.**_
38 |
39 | If you don't trust me, feel free to inspect every line of code and compile it yourself.
40 |
41 | ## Permissions
42 | Available under the MIT liscence.
43 | Feel free to use this wherever and however you see fit. You can download the code, edit it, and compile it in Visual Studio 2017 if you want to. Any contributions here on github are very welcome. Make a pull request and I'll merge it as soon as I can.
44 |
45 | ## Advantages
46 | * By default uses high quality audio sampling and sending. No compression is used, since it is intended for LAN connections.
47 | * Unlimited users and servers.
48 | * Quite easy to use, even though the UI isn't very pretty.
49 | * Good for LAN parties where people are separated by rooms and internet connection can't be used or isn't desirable.
50 | * Very lightweight. All files required for execution total to under 1MB. Downloading the ZIP file will take seconds even on the slowest internet connection.
51 |
52 | ## Limitations & Problems
53 | * Uncompressed, high sample rate audio may bog down slow networks. I intend to allow the server to change audio sampling rate in the future.
54 | * Currently only supports LAN connections. The users will have to all be connected to the same WiFi network, or otherwise be connected directly.
55 | * Sudden disconnections may not be handled correctly, leaving ghost users left behind in servers.
56 | * Not extensively tested. May crash unexpectedly under certain conditions.
57 |
58 | ## Why the name?
59 | I was bored when I started this project. I didn't have any clever names so this is the result. I may change it at some point in the future.
60 |
61 | ## Plans
62 | If you have any suggestions, open an Issue [here](https://github.com/Epicguru/CChat2/issues) and tag it appropriately. I'm open to making changes or adding simple stuff if it makes sense.
63 | * Improve the general UI.
64 | * Attempt to use port forwarding to make the app work over the internet. So this thing will actually work as a chat client, such as skype or discord.
65 | * Implement better error reporting.
66 | * Add text chat, so that connected users can type and send out messages.
67 | * Add an option to connect directly.
68 | * Add optional passwords to servers.
69 | * Add optional encryption to servers?
70 | * Allow individual clients to both mute themselves and mute others. (currently only the host can do this)
71 | * Add a few different volume controls. A main, master volume slider, and ideally individual sliders for each connected user. I also want to make it possible for users individual user's volumes to be 'boosted' because some people have really terrible mics.
72 | * Once chat is implemented, allow users to share files? Files would be uploaded to the server and then distributed to all other clients. I could make it efficient enough to transmit huge files if I wanted to... Could be useful for LAN parties.
73 |
--------------------------------------------------------------------------------
/CrapChat2/Properties/Resources.resx:
--------------------------------------------------------------------------------
1 |
2 |
3 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 | text/microsoft-resx
107 |
108 |
109 | 2.0
110 |
111 |
112 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
113 |
114 |
115 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
116 |
117 |
--------------------------------------------------------------------------------
/CrapChat2/CServer.cs:
--------------------------------------------------------------------------------
1 | using Lidgren.Network;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Linq;
5 | using System.Text;
6 | using System.Threading;
7 | using System.Threading.Tasks;
8 |
9 | namespace CrapChat
10 | {
11 | public class CServer : NetServer
12 | {
13 | public string Name { get; protected set; }
14 | public Dictionary names = new Dictionary();
15 | public Dictionary connections = new Dictionary();
16 | public List muted = new List();
17 |
18 | public bool LocalMuted = false; // Is the local user (host) muted?
19 | private byte[] buffer = new byte[1024 * 10]; // 10kb buffer, should be more than enough for any single package.
20 |
21 | public CServer(string name, NetPeerConfiguration config)
22 | : base(config)
23 | {
24 | Name = name;
25 | this.RegisterReceivedCallback(new SendOrPostCallback(GotMessage));
26 | }
27 |
28 | public static void GotMessage(object peer)
29 | {
30 | var server = (CServer)peer;
31 | var msg = server.ReadMessage();
32 |
33 | switch (msg.MessageType)
34 | {
35 | case NetIncomingMessageType.Error:
36 | string errorText;
37 | bool worked = msg.ReadString(out errorText);
38 | Main.Log("[SERVER ERROR] " + (worked ? errorText : "(???)"));
39 | break;
40 |
41 | case NetIncomingMessageType.StatusChanged:
42 | byte b = msg.ReadByte();
43 | string statusText = msg.ReadString();
44 | NetConnectionStatus status = (NetConnectionStatus)b;
45 |
46 | Main.Log("[STATUS UPDATE] " + status + " - " + statusText);
47 |
48 | if(status == NetConnectionStatus.Disconnected)
49 | {
50 | string n = server.GetUsername(msg.SenderConnection);
51 | if(n != null)
52 | {
53 | Main.Log("User '" + n + "' has disconnected from the server. Cya!");
54 | server.SetName(msg.SenderConnection, null);
55 | Main.RemoveUser(n);
56 |
57 | var removeNameMsg = server.CreateMessage();
58 | removeNameMsg.Write((byte)DataType.NAME);
59 | removeNameMsg.Write(1);
60 | removeNameMsg.Write(false);
61 | removeNameMsg.Write(n);
62 | server.SendToAll(removeNameMsg, NetDeliveryMethod.ReliableUnordered);
63 | }
64 | }
65 | if(status == NetConnectionStatus.Connected)
66 | {
67 | // Send the names of all connected people.
68 | var outMsg = server.CreateMessage();
69 | outMsg.Write((byte)DataType.NAME);
70 | outMsg.Write(server.names.Count + 1);
71 | foreach (var item in server.names)
72 | {
73 | outMsg.Write(true);
74 | outMsg.Write(item.Value);
75 | }
76 | outMsg.Write(true);
77 | outMsg.Write(Main.ActiveUsername);
78 | server.SendMessage(outMsg, msg.SenderConnection, NetDeliveryMethod.ReliableUnordered);
79 |
80 | // Tell everyone else that this person joined...
81 | var outMsg2 = server.CreateMessage();
82 | outMsg2.Write((byte)DataType.NAME);
83 | outMsg2.Write(1);
84 | outMsg2.Write(true);
85 | outMsg2.Write(server.GetUsername(msg.SenderConnection));
86 | server.SendToAll(outMsg2, msg.SenderConnection, NetDeliveryMethod.ReliableUnordered, 0);
87 | }
88 | break;
89 |
90 | case NetIncomingMessageType.Data:
91 | // Find the type.
92 | var type = (DataType)msg.ReadByte();
93 | ProcessData(type, msg, server);
94 | break;
95 |
96 | case NetIncomingMessageType.DiscoveryRequest:
97 | NetOutgoingMessage response = server.CreateMessage(server.Name);
98 | server.SendDiscoveryResponse(response, msg.SenderEndPoint);
99 | break;
100 |
101 | case NetIncomingMessageType.WarningMessage:
102 | Main.Log("[SERVER WARNING] " + msg.ReadString());
103 | break;
104 |
105 | case NetIncomingMessageType.ConnectionApproval:
106 | string name = msg.ReadString().Trim();
107 | if (server.names.ContainsValue(name) || Main.ActiveUsername == name)
108 | {
109 | msg.SenderConnection.Deny("Somebody else on the server already has your username.");
110 | Main.Log("Rejected connection from " + msg.SenderConnection + " because they have a duplicate username: " + name);
111 | }
112 | else
113 | {
114 | msg.SenderConnection.Approve();
115 | server.SetName(msg.SenderConnection, name);
116 |
117 | Main.Log("Approved connection from " + msg.SenderConnection.RemoteEndPoint + ", called '" + name + "', and sent the current names. (" + (server.names.Count + 1) + ")");
118 | }
119 | break;
120 |
121 | default:
122 | Main.Log("[SERVER UNHANDLED] Type: " + msg.MessageType);
123 | break;
124 | }
125 |
126 | server.Recycle(msg);
127 | }
128 |
129 | public static void ProcessData(DataType type, NetIncomingMessage msg, CServer s)
130 | {
131 | switch (type)
132 | {
133 | case DataType.AUDIO:
134 | bool muted = s.IsMuted(msg.SenderConnection);
135 | // Ignore if muted, just don't send.
136 | if (muted)
137 | break;
138 |
139 | // Bounce to all other clients.
140 | int c = msg.ReadInt32();
141 | msg.ReadBytes(c, out s.buffer);
142 |
143 | // Find speaker ID.
144 | int id = Audio.GetOrCreateID(msg.SenderConnection);
145 |
146 | var outMsg = s.CreateMessage();
147 |
148 | outMsg.Write((byte)DataType.AUDIO);
149 | outMsg.Write(id);
150 | outMsg.Write(c);
151 | outMsg.Write(s.buffer);
152 |
153 | s.SendToAll(outMsg, msg.SenderConnection, NetDeliveryMethod.ReliableOrdered, 0);
154 |
155 | // Play on local device.
156 | Audio.QueuePlay(id, s.buffer, c);
157 |
158 | break;
159 | }
160 | }
161 |
162 | public string GetUsername(NetConnection n)
163 | {
164 | if (!names.ContainsKey(n))
165 | return null;
166 | return names[n];
167 | }
168 |
169 | public NetConnection GetConnection(string name)
170 | {
171 | return connections[name];
172 | }
173 |
174 | protected void SetName(NetConnection n, string name)
175 | {
176 | if(name == null)
177 | {
178 | string na = names[n];
179 | connections.Remove(na);
180 | names.Remove(n);
181 | return;
182 | }
183 |
184 | if (names.ContainsKey(n))
185 | {
186 | throw new InvalidOperationException("Cannot change the name of an exising client.");
187 | }
188 | else
189 | {
190 | names.Add(n, name);
191 | connections.Add(name, n);
192 | Main.Log("User @ " + n.RemoteEndPoint + " has been assigned name '" + name + "'");
193 | Main.AddUser(name);
194 | }
195 | }
196 |
197 | public void SendAudio(byte[] buffer, int count)
198 | {
199 | if (LocalMuted)
200 | return;
201 |
202 | var msg = CreateMessage();
203 | msg.Write((byte)DataType.AUDIO);
204 | msg.Write(Audio.GetOrCreateID(null)); // Null because as the host we don't have a connection...
205 | msg.Write(count);
206 | msg.Write(buffer);
207 |
208 | this.SendToAll(msg, NetDeliveryMethod.ReliableOrdered);
209 | }
210 |
211 | public void Kick(string name)
212 | {
213 | if (connections.ContainsKey(name))
214 | Kick(connections[name]);
215 | }
216 |
217 | public void Kick(NetConnection n)
218 | {
219 | n.Disconnect("You have been kicked from the server by the host.");
220 | }
221 |
222 | public bool IsMuted(string name)
223 | {
224 | if (name == Main.ActiveUsername)
225 | {
226 | return LocalMuted;
227 | }
228 |
229 | if (connections.ContainsKey(name))
230 | return IsMuted(connections[name]);
231 | else
232 | return false;
233 | }
234 |
235 | public bool IsMuted(NetConnection n)
236 | {
237 | return muted.Contains(n);
238 | }
239 |
240 | public void Mute(string name)
241 | {
242 | if(name == Main.ActiveUsername)
243 | {
244 | LocalMuted = true;
245 | return;
246 | }
247 |
248 | if (connections.ContainsKey(name))
249 | Mute(connections[name]);
250 | }
251 |
252 | public void Mute(NetConnection n)
253 | {
254 | if (!muted.Contains(n))
255 | {
256 | muted.Add(n);
257 |
258 | // Notify the client.
259 | var msg = CreateMessage();
260 | msg.Write((byte)DataType.MUTED);
261 | msg.Write(true);
262 | SendMessage(msg, n, NetDeliveryMethod.ReliableUnordered);
263 | }
264 | }
265 |
266 | public void Unmute(string name)
267 | {
268 | if (name == Main.ActiveUsername)
269 | {
270 | LocalMuted = false;
271 | return;
272 | }
273 |
274 | if (connections.ContainsKey(name))
275 | Unmute(connections[name]);
276 | }
277 |
278 | public void Unmute(NetConnection n)
279 | {
280 | if (muted.Contains(n))
281 | {
282 | muted.Remove(n);
283 |
284 | // Notify the client.
285 | var msg = CreateMessage();
286 | msg.Write((byte)DataType.MUTED);
287 | msg.Write(false);
288 | SendMessage(msg, n, NetDeliveryMethod.ReliableUnordered);
289 | }
290 | }
291 | }
292 | }
293 |
--------------------------------------------------------------------------------
/CrapChat2/Main.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Windows.Forms;
3 |
4 | namespace CrapChat
5 | {
6 | public partial class Main : Form
7 | {
8 | public static Main Instance;
9 |
10 | private bool IsValidUsername
11 | {
12 | get
13 | {
14 | return !string.IsNullOrWhiteSpace(this.NameInputBox.Text.Trim());
15 | }
16 | }
17 | private bool IsNewServerNameValid
18 | {
19 | get
20 | {
21 | return !string.IsNullOrWhiteSpace(GetNewServerName());
22 | }
23 | }
24 | private bool IsNewServerPortvalid
25 | {
26 | get
27 | {
28 | return GetNewServerPort() >= 0;
29 | }
30 | }
31 |
32 | public static string ActiveUsername = null;
33 |
34 | public Main()
35 | {
36 | Instance = this;
37 |
38 | InitializeComponent();
39 |
40 | // Some more custom form setup:
41 | this.MaximizeBox = false;
42 | FormBorderStyle = FormBorderStyle.FixedSingle;
43 | this.Text = "Crap Chat 2 - ";
44 | this.FormClosing += AppClosing;
45 |
46 | // Main entry point here...
47 | SetStatus("Disconnected");
48 |
49 | NameInputBox.Text = Properties.Settings.Default.DefaultUsername;
50 | SetButtonState(confirmNameButton, IsValidUsername);
51 | SetButtonState(MuteButton, false);
52 | SetButtonState(KickButton, false);
53 | SetButtonState(DisconnectButton, false);
54 | SetButtonState(ConnectButton, false);
55 | SetButtonState(CreateNewServerButton, false);
56 | SetButtonState(RefreshButton, false);
57 | SetButtonState(ShutdownServer, false);
58 |
59 | if (!IsValidUsername)
60 | DisplayUsernamePrompt(true, "Please type a username");
61 | else
62 | DisplayUsernamePrompt(true, "Please confirm username");
63 |
64 | SetPortNumber(Properties.Settings.Default.DefaultPort);
65 | this.NewServerNameBox.Text = Properties.Settings.Default.DefaultNewServerName;
66 | this.NewServerPortBox.Text = Properties.Settings.Default.DefaultNewServerPort.ToString();
67 |
68 | bool autoLogin = Properties.Settings.Default.AutoLogin;
69 | if (autoLogin)
70 | {
71 | ConfirmNameClicked(null, null);
72 | }
73 | }
74 |
75 | public static void AddUser(string name)
76 | {
77 | if(!Instance.ClientNameList.Items.Contains(name))
78 | Instance.ClientNameList.Items.Add(name);
79 | }
80 |
81 | public static void RemoveUser(string name)
82 | {
83 | if (Instance.ClientNameList.Items.Contains(name))
84 | Instance.ClientNameList.Items.Remove(name);
85 | }
86 |
87 | public static void ClearUsers()
88 | {
89 | Instance.ClientNameList.Items.Clear();
90 | }
91 |
92 | private void AppClosing(object sender, FormClosingEventArgs e)
93 | {
94 | Main.Log("Closing...");
95 |
96 | if (Net.IsClient)
97 | {
98 | Net.StopClient();
99 | }
100 | if (Net.IsServer)
101 | {
102 | Net.StopServer();
103 | }
104 | }
105 |
106 | private void ConfirmNameClicked(object sender, EventArgs e)
107 | {
108 | if (!IsValidUsername)
109 | {
110 | Log("Invalid username '" + NameInputBox.Text + "'");
111 | DisplayUsernamePrompt(true, "Invalid username!");
112 | return;
113 | }
114 |
115 | if (ActiveUsername == this.NameInputBox.Text.Trim())
116 | return;
117 |
118 | ActiveUsername = this.NameInputBox.Text.Trim();
119 | Log("Confirmed new name - " + ActiveUsername);
120 | this.Text = "Crap Chat 2 - " + ActiveUsername;
121 |
122 | DisplayUsernamePrompt(false);
123 | SetButtonState(CreateNewServerButton, true);
124 |
125 | if (!RefreshButton.Enabled)
126 | RefreshButtonClick(null, null);
127 | SetButtonState(RefreshButton, true);
128 |
129 | if(!string.IsNullOrWhiteSpace(GetNewServerName()) && !Net.IsServer && !string.IsNullOrWhiteSpace(ActiveUsername))
130 | {
131 | SetButtonState(CreateNewServerButton, true);
132 | }
133 | }
134 |
135 | public static void Log(object o)
136 | {
137 | if(o != null)
138 | {
139 | Console.WriteLine(o.ToString());
140 | }
141 | else
142 | {
143 | Console.WriteLine("null");
144 | }
145 | }
146 |
147 | private FoundServer GetSelectedServer()
148 | {
149 | if (ServerList.SelectedItem != null)
150 | return (FoundServer)this.ServerList.SelectedItem;
151 | else
152 | return new FoundServer();
153 | }
154 |
155 | private void SetPortNumber(int port)
156 | {
157 | this.PortTextBox.Text = port.ToString();
158 | }
159 |
160 | private void SelectedServerChanged(object sender, EventArgs e)
161 | {
162 | Log("Selected " + GetSelectedServer());
163 |
164 | if(!Net.IsServer && !Net.IsConnecting && !GetSelectedServer().IsInvalid())
165 | SetButtonState(ConnectButton, true);
166 | }
167 |
168 | private void NameInputKeyDown(object sender, KeyEventArgs k)
169 | {
170 | if(k.KeyCode == Keys.Enter || k.KeyCode == Keys.Return)
171 | {
172 | this.ConfirmNameClicked(sender, null);
173 | }
174 | }
175 |
176 | public static void SetStatus(string status)
177 | {
178 | Instance.StatusLabel.Text = "Status: " + status.Trim();
179 | }
180 |
181 | private void DisplayUsernamePrompt(bool visible, string text = null)
182 | {
183 | if (visible)
184 | {
185 | this.typePrompt.Text = text != null ? text.Trim() : this.typePrompt.Text;
186 | this.typePrompt.Visible = true;
187 | }
188 | else
189 | {
190 | this.typePrompt.Visible = false;
191 | }
192 | }
193 |
194 | private void SetButtonState(Button b, bool enabled)
195 | {
196 | if(b != null)
197 | {
198 | if(b.Enabled != enabled)
199 | b.Enabled = enabled;
200 | }
201 | }
202 |
203 | private void NameInputValueChanged(object sender, EventArgs e)
204 | {
205 | SetButtonState(confirmNameButton, IsValidUsername);
206 | if (!IsValidUsername)
207 | {
208 | DisplayUsernamePrompt(true, "Invalid username!");
209 | }
210 | else
211 | {
212 | DisplayUsernamePrompt(false);
213 | }
214 | }
215 |
216 | private void PortTextBoxChanged(object sender, KeyPressEventArgs e)
217 | {
218 | e.Handled = !char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar);
219 | }
220 |
221 | private int GetRefreshPort()
222 | {
223 | if (string.IsNullOrWhiteSpace(PortTextBox.Text))
224 | return Properties.Settings.Default.DefaultPort;
225 |
226 | int port = int.Parse(PortTextBox.Text);
227 | return port;
228 | }
229 |
230 | private int GetNewServerPort()
231 | {
232 | if (string.IsNullOrWhiteSpace(NewServerPortBox.Text))
233 | return Properties.Settings.Default.DefaultNewServerPort;
234 |
235 | return int.Parse(NewServerPortBox.Text);
236 | }
237 |
238 | private string GetNewServerName()
239 | {
240 | return NewServerNameBox.Text.Trim();
241 | }
242 |
243 | private void RefreshButtonClick(object sender, EventArgs e)
244 | {
245 | if (!Net.IsClient)
246 | {
247 | Net.StartClient();
248 | }
249 | ServerList.Items.Clear();
250 | Net.DiscoverPeers(GetRefreshPort(), ServerDiscovered);
251 | SetButtonState(ConnectButton, false);
252 | System.GC.Collect();
253 | }
254 |
255 | private void ServerDiscovered(FoundServer s)
256 | {
257 | ServerList.Items.Add(s);
258 | Log("Discovered server '" + s.Name + "' @ " + s.EndPoint);
259 | }
260 |
261 | private void CreateNewServerButtonClick(object sender, EventArgs e)
262 | {
263 | var name = GetNewServerName();
264 | int port = GetNewServerPort();
265 |
266 | bool worked = Net.StartServer(port, name);
267 | if (worked)
268 | {
269 | SetButtonState(CreateNewServerButton, false);
270 | SetButtonState(ShutdownServer, true);
271 | RefreshButtonClick(null, null);
272 | ClearUsers();
273 | AddUser(ActiveUsername);
274 | }
275 | }
276 |
277 | private void NewServerNameBox_TextChanged(object sender, EventArgs e)
278 | {
279 | if (string.IsNullOrWhiteSpace(GetNewServerName()))
280 | SetButtonState(CreateNewServerButton, false);
281 | else if(!Net.IsServer && !string.IsNullOrWhiteSpace(ActiveUsername))
282 | SetButtonState(CreateNewServerButton, true);
283 | }
284 |
285 | private void ConnectButton_Click(object sender, EventArgs e)
286 | {
287 | if (!Net.IsClient)
288 | Net.StartClient();
289 |
290 | var s = GetSelectedServer();
291 | if (string.IsNullOrWhiteSpace(s.Name))
292 | return;
293 |
294 | Log("Attempting to connect to " + s);
295 | bool worked = Net.ConnectClient(s.EndPoint.Address.ToString(), s.EndPoint.Port);
296 | if (worked)
297 | {
298 | SetButtonState(ConnectButton, false);
299 | }
300 | }
301 |
302 | public static void UponDisconnected()
303 | {
304 | Instance.SetButtonState(Instance.DisconnectButton, false);
305 | Instance.SetButtonState(Instance.ConnectButton, false);
306 | Instance.ServerList.ClearSelected();
307 | SetStatus("Disconnected");
308 | ClearUsers();
309 | Instance.RefreshButtonClick(null, null);
310 | }
311 |
312 | public static void UponConnected()
313 | {
314 | Instance.SetButtonState(Instance.DisconnectButton, true);
315 | Instance.SetButtonState(Instance.ConnectButton, false);
316 | }
317 |
318 | public static void UponServerStop()
319 | {
320 | Instance.SetButtonState(Instance.MuteButton, false);
321 | Instance.SetButtonState(Instance.KickButton, false);
322 | }
323 |
324 | private void ShutdownServer_Click(object sender, EventArgs e)
325 | {
326 | Net.StopServer();
327 | RefreshButtonClick(null, null);
328 | SetButtonState(ShutdownServer, false);
329 | if (!string.IsNullOrWhiteSpace(GetNewServerName()) && !Net.IsServer && !string.IsNullOrWhiteSpace(ActiveUsername))
330 | {
331 | SetButtonState(CreateNewServerButton, true);
332 | }
333 | ClearUsers();
334 | SetStatus("Disconnected");
335 | }
336 |
337 | private void DisconnectButton_Click(object sender, EventArgs e)
338 | {
339 | if(Net.IsClient && Net.IsConnected)
340 | {
341 | SetButtonState(DisconnectButton, false);
342 | Net.StopClient();
343 | }
344 | else
345 | {
346 | SetButtonState(DisconnectButton, false);
347 | }
348 | }
349 |
350 | private string GetSelectedUser()
351 | {
352 | return ClientNameList.SelectedItem == null ? null : (string)ClientNameList.SelectedItem;
353 | }
354 |
355 | private void KickButton_Click(object sender, EventArgs e)
356 | {
357 | string name = GetSelectedUser();
358 | if (!string.IsNullOrWhiteSpace(name))
359 | {
360 | if (Net.IsServer)
361 | {
362 | Net.Server.Kick(name);
363 | }
364 | }
365 | }
366 |
367 | private void MuteButton_Click(object sender, EventArgs e)
368 | {
369 | string name = GetSelectedUser();
370 | if (!string.IsNullOrWhiteSpace(name))
371 | {
372 | if (Net.IsServer)
373 | {
374 | bool isMuted = Net.Server.IsMuted(name);
375 | if (isMuted)
376 | {
377 | Net.Server.Unmute(name);
378 | MuteButton.Text = "Mute Person";
379 | }
380 | else
381 | {
382 | Net.Server.Mute(name);
383 | MuteButton.Text = "Un-mute Person";
384 | }
385 | }
386 | }
387 | }
388 |
389 | private void SelectedUserChanged(object sender, EventArgs e)
390 | {
391 | if (!Net.IsServer)
392 | return;
393 |
394 | string selected = this.ClientNameList.SelectedItem as string;
395 |
396 | if (!string.IsNullOrWhiteSpace(selected))
397 | {
398 | if(selected == ActiveUsername)
399 | {
400 | SetButtonState(KickButton, false);
401 | SetButtonState(MuteButton, true);
402 | MuteButton.Text = "Mute Person";
403 | }
404 | else
405 | {
406 | SetButtonState(KickButton, true);
407 | SetButtonState(MuteButton, true);
408 |
409 | bool muted = Net.Server.IsMuted(selected);
410 | MuteButton.Text = muted ? "Un-mute Person" : "Mute Person";
411 | }
412 | }
413 | else
414 | {
415 | SetButtonState(KickButton, false);
416 | SetButtonState(MuteButton, false);
417 | MuteButton.Text = "Mute Person";
418 | }
419 | }
420 |
421 | private void TimerTick(object sender, EventArgs e)
422 | {
423 | // This is the refresh timer.
424 | if(RefreshButton.Enabled && !Net.IsConnected)
425 | RefreshButtonClick(null, null);
426 | }
427 | }
428 | }
429 |
--------------------------------------------------------------------------------
/CrapChat2/Main.Designer.cs:
--------------------------------------------------------------------------------
1 | namespace CrapChat
2 | {
3 | partial class Main
4 | {
5 | ///
6 | /// Required designer variable.
7 | ///
8 | private System.ComponentModel.IContainer components = null;
9 |
10 | ///
11 | /// Clean up any resources being used.
12 | ///
13 | /// true if managed resources should be disposed; otherwise, false.
14 | protected override void Dispose(bool disposing)
15 | {
16 | if (disposing && (components != null))
17 | {
18 | components.Dispose();
19 | }
20 | base.Dispose(disposing);
21 | }
22 |
23 | #region Windows Form Designer generated code
24 |
25 | ///
26 | /// Required method for Designer support - do not modify
27 | /// the contents of this method with the code editor.
28 | ///
29 | private void InitializeComponent()
30 | {
31 | this.components = new System.ComponentModel.Container();
32 | System.Windows.Forms.Label label2;
33 | System.Windows.Forms.Label label3;
34 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Main));
35 | this.NameInputBox = new System.Windows.Forms.TextBox();
36 | this.usernameLabel = new System.Windows.Forms.Label();
37 | this.confirmNameButton = new System.Windows.Forms.Button();
38 | this.ServerList = new System.Windows.Forms.ListBox();
39 | this.serversFoundLabel = new System.Windows.Forms.Label();
40 | this.typePrompt = new System.Windows.Forms.Label();
41 | this.RefreshButton = new System.Windows.Forms.Button();
42 | this.StatusLabel = new System.Windows.Forms.Label();
43 | this.ConnectButton = new System.Windows.Forms.Button();
44 | this.DisconnectButton = new System.Windows.Forms.Button();
45 | this.ClientNameList = new System.Windows.Forms.ListBox();
46 | this.MuteButton = new System.Windows.Forms.Button();
47 | this.KickButton = new System.Windows.Forms.Button();
48 | this.PortTextBox = new System.Windows.Forms.TextBox();
49 | this.portLabel = new System.Windows.Forms.Label();
50 | this.label1 = new System.Windows.Forms.Label();
51 | this.NewServerNameBox = new System.Windows.Forms.TextBox();
52 | this.CreateNewServerButton = new System.Windows.Forms.Button();
53 | this.NewServerPortBox = new System.Windows.Forms.TextBox();
54 | this.ShutdownServer = new System.Windows.Forms.Button();
55 | this.RefreshTimer = new System.Windows.Forms.Timer(this.components);
56 | label2 = new System.Windows.Forms.Label();
57 | label3 = new System.Windows.Forms.Label();
58 | this.SuspendLayout();
59 | //
60 | // label2
61 | //
62 | label2.AutoSize = true;
63 | label2.Location = new System.Drawing.Point(14, 298);
64 | label2.Name = "label2";
65 | label2.Size = new System.Drawing.Size(38, 13);
66 | label2.TabIndex = 17;
67 | label2.Text = "Name:";
68 | //
69 | // label3
70 | //
71 | label3.AutoSize = true;
72 | label3.Location = new System.Drawing.Point(14, 325);
73 | label3.Name = "label3";
74 | label3.Size = new System.Drawing.Size(29, 13);
75 | label3.TabIndex = 20;
76 | label3.Text = "Port:";
77 | //
78 | // NameInputBox
79 | //
80 | this.NameInputBox.Location = new System.Drawing.Point(12, 62);
81 | this.NameInputBox.MaxLength = 16;
82 | this.NameInputBox.Name = "NameInputBox";
83 | this.NameInputBox.Size = new System.Drawing.Size(124, 20);
84 | this.NameInputBox.TabIndex = 0;
85 | this.NameInputBox.TextChanged += new System.EventHandler(this.NameInputValueChanged);
86 | this.NameInputBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.NameInputKeyDown);
87 | //
88 | // usernameLabel
89 | //
90 | this.usernameLabel.AutoSize = true;
91 | this.usernameLabel.Location = new System.Drawing.Point(12, 42);
92 | this.usernameLabel.Name = "usernameLabel";
93 | this.usernameLabel.Size = new System.Drawing.Size(55, 13);
94 | this.usernameLabel.TabIndex = 1;
95 | this.usernameLabel.Text = "Username";
96 | //
97 | // confirmNameButton
98 | //
99 | this.confirmNameButton.Location = new System.Drawing.Point(142, 62);
100 | this.confirmNameButton.Name = "confirmNameButton";
101 | this.confirmNameButton.Size = new System.Drawing.Size(92, 20);
102 | this.confirmNameButton.TabIndex = 2;
103 | this.confirmNameButton.Text = "Confirm Name";
104 | this.confirmNameButton.UseVisualStyleBackColor = true;
105 | this.confirmNameButton.Click += new System.EventHandler(this.ConfirmNameClicked);
106 | //
107 | // ServerList
108 | //
109 | this.ServerList.FormattingEnabled = true;
110 | this.ServerList.Location = new System.Drawing.Point(12, 122);
111 | this.ServerList.Name = "ServerList";
112 | this.ServerList.ScrollAlwaysVisible = true;
113 | this.ServerList.Size = new System.Drawing.Size(379, 108);
114 | this.ServerList.TabIndex = 3;
115 | this.ServerList.SelectedValueChanged += new System.EventHandler(this.SelectedServerChanged);
116 | //
117 | // serversFoundLabel
118 | //
119 | this.serversFoundLabel.AutoSize = true;
120 | this.serversFoundLabel.Location = new System.Drawing.Point(12, 102);
121 | this.serversFoundLabel.Name = "serversFoundLabel";
122 | this.serversFoundLabel.Size = new System.Drawing.Size(79, 13);
123 | this.serversFoundLabel.TabIndex = 4;
124 | this.serversFoundLabel.Text = "Servers Found:";
125 | //
126 | // typePrompt
127 | //
128 | this.typePrompt.AutoSize = true;
129 | this.typePrompt.ForeColor = System.Drawing.Color.Red;
130 | this.typePrompt.Location = new System.Drawing.Point(240, 66);
131 | this.typePrompt.Name = "typePrompt";
132 | this.typePrompt.Size = new System.Drawing.Size(93, 13);
133 | this.typePrompt.TabIndex = 5;
134 | this.typePrompt.Text = "Enter a username!";
135 | //
136 | // RefreshButton
137 | //
138 | this.RefreshButton.Location = new System.Drawing.Point(316, 93);
139 | this.RefreshButton.Name = "RefreshButton";
140 | this.RefreshButton.Size = new System.Drawing.Size(75, 22);
141 | this.RefreshButton.TabIndex = 6;
142 | this.RefreshButton.Text = "Refresh";
143 | this.RefreshButton.UseVisualStyleBackColor = true;
144 | this.RefreshButton.Click += new System.EventHandler(this.RefreshButtonClick);
145 | //
146 | // StatusLabel
147 | //
148 | this.StatusLabel.AutoSize = true;
149 | this.StatusLabel.BackColor = System.Drawing.Color.Gainsboro;
150 | this.StatusLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
151 | this.StatusLabel.Location = new System.Drawing.Point(12, 9);
152 | this.StatusLabel.Name = "StatusLabel";
153 | this.StatusLabel.Size = new System.Drawing.Size(54, 18);
154 | this.StatusLabel.TabIndex = 7;
155 | this.StatusLabel.Text = "Status:";
156 | //
157 | // ConnectButton
158 | //
159 | this.ConnectButton.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(255)))), ((int)(((byte)(192)))));
160 | this.ConnectButton.Location = new System.Drawing.Point(12, 236);
161 | this.ConnectButton.Name = "ConnectButton";
162 | this.ConnectButton.Size = new System.Drawing.Size(75, 23);
163 | this.ConnectButton.TabIndex = 8;
164 | this.ConnectButton.Text = "Connect";
165 | this.ConnectButton.UseVisualStyleBackColor = false;
166 | this.ConnectButton.Click += new System.EventHandler(this.ConnectButton_Click);
167 | //
168 | // DisconnectButton
169 | //
170 | this.DisconnectButton.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(192)))));
171 | this.DisconnectButton.Enabled = false;
172 | this.DisconnectButton.Location = new System.Drawing.Point(93, 236);
173 | this.DisconnectButton.Name = "DisconnectButton";
174 | this.DisconnectButton.Size = new System.Drawing.Size(75, 23);
175 | this.DisconnectButton.TabIndex = 9;
176 | this.DisconnectButton.Text = "Disconnect";
177 | this.DisconnectButton.UseVisualStyleBackColor = false;
178 | this.DisconnectButton.Click += new System.EventHandler(this.DisconnectButton_Click);
179 | //
180 | // ClientNameList
181 | //
182 | this.ClientNameList.FormattingEnabled = true;
183 | this.ClientNameList.Location = new System.Drawing.Point(12, 392);
184 | this.ClientNameList.Name = "ClientNameList";
185 | this.ClientNameList.Size = new System.Drawing.Size(263, 82);
186 | this.ClientNameList.Sorted = true;
187 | this.ClientNameList.TabIndex = 10;
188 | this.ClientNameList.SelectedValueChanged += new System.EventHandler(this.SelectedUserChanged);
189 | //
190 | // MuteButton
191 | //
192 | this.MuteButton.Location = new System.Drawing.Point(281, 392);
193 | this.MuteButton.Name = "MuteButton";
194 | this.MuteButton.Size = new System.Drawing.Size(110, 23);
195 | this.MuteButton.TabIndex = 11;
196 | this.MuteButton.Text = "Mute Person";
197 | this.MuteButton.UseVisualStyleBackColor = true;
198 | this.MuteButton.Click += new System.EventHandler(this.MuteButton_Click);
199 | //
200 | // KickButton
201 | //
202 | this.KickButton.Location = new System.Drawing.Point(281, 421);
203 | this.KickButton.Name = "KickButton";
204 | this.KickButton.Size = new System.Drawing.Size(110, 23);
205 | this.KickButton.TabIndex = 12;
206 | this.KickButton.Text = "Kick Person";
207 | this.KickButton.UseVisualStyleBackColor = true;
208 | this.KickButton.Click += new System.EventHandler(this.KickButton_Click);
209 | //
210 | // PortTextBox
211 | //
212 | this.PortTextBox.Location = new System.Drawing.Point(243, 95);
213 | this.PortTextBox.Name = "PortTextBox";
214 | this.PortTextBox.Size = new System.Drawing.Size(67, 20);
215 | this.PortTextBox.TabIndex = 13;
216 | this.PortTextBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.PortTextBoxChanged);
217 | //
218 | // portLabel
219 | //
220 | this.portLabel.AutoSize = true;
221 | this.portLabel.Location = new System.Drawing.Point(208, 98);
222 | this.portLabel.Name = "portLabel";
223 | this.portLabel.Size = new System.Drawing.Size(29, 13);
224 | this.portLabel.TabIndex = 14;
225 | this.portLabel.Text = "Port:";
226 | //
227 | // label1
228 | //
229 | this.label1.AutoSize = true;
230 | this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
231 | this.label1.Location = new System.Drawing.Point(14, 280);
232 | this.label1.Name = "label1";
233 | this.label1.Size = new System.Drawing.Size(74, 13);
234 | this.label1.TabIndex = 15;
235 | this.label1.Text = "Host Server";
236 | //
237 | // NewServerNameBox
238 | //
239 | this.NewServerNameBox.Location = new System.Drawing.Point(58, 296);
240 | this.NewServerNameBox.Name = "NewServerNameBox";
241 | this.NewServerNameBox.Size = new System.Drawing.Size(100, 20);
242 | this.NewServerNameBox.TabIndex = 16;
243 | this.NewServerNameBox.TextChanged += new System.EventHandler(this.NewServerNameBox_TextChanged);
244 | //
245 | // CreateNewServerButton
246 | //
247 | this.CreateNewServerButton.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(255)))), ((int)(((byte)(192)))));
248 | this.CreateNewServerButton.Location = new System.Drawing.Point(12, 349);
249 | this.CreateNewServerButton.Name = "CreateNewServerButton";
250 | this.CreateNewServerButton.Size = new System.Drawing.Size(114, 23);
251 | this.CreateNewServerButton.TabIndex = 18;
252 | this.CreateNewServerButton.Text = "Create New Server";
253 | this.CreateNewServerButton.UseVisualStyleBackColor = false;
254 | this.CreateNewServerButton.Click += new System.EventHandler(this.CreateNewServerButtonClick);
255 | //
256 | // NewServerPortBox
257 | //
258 | this.NewServerPortBox.Location = new System.Drawing.Point(58, 323);
259 | this.NewServerPortBox.Name = "NewServerPortBox";
260 | this.NewServerPortBox.Size = new System.Drawing.Size(100, 20);
261 | this.NewServerPortBox.TabIndex = 19;
262 | //
263 | // ShutdownServer
264 | //
265 | this.ShutdownServer.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(192)))));
266 | this.ShutdownServer.Location = new System.Drawing.Point(132, 349);
267 | this.ShutdownServer.Name = "ShutdownServer";
268 | this.ShutdownServer.Size = new System.Drawing.Size(105, 23);
269 | this.ShutdownServer.TabIndex = 21;
270 | this.ShutdownServer.Text = "Shutdown Server";
271 | this.ShutdownServer.UseVisualStyleBackColor = false;
272 | this.ShutdownServer.Click += new System.EventHandler(this.ShutdownServer_Click);
273 | //
274 | // RefreshTimer
275 | //
276 | this.RefreshTimer.Enabled = true;
277 | this.RefreshTimer.Interval = global::CrapChat.Properties.Settings.Default.AutoRefreshInterval;
278 | this.RefreshTimer.Tick += new System.EventHandler(this.TimerTick);
279 | //
280 | // Main
281 | //
282 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
283 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
284 | this.ClientSize = new System.Drawing.Size(403, 486);
285 | this.Controls.Add(this.ShutdownServer);
286 | this.Controls.Add(label3);
287 | this.Controls.Add(this.NewServerPortBox);
288 | this.Controls.Add(this.CreateNewServerButton);
289 | this.Controls.Add(label2);
290 | this.Controls.Add(this.NewServerNameBox);
291 | this.Controls.Add(this.label1);
292 | this.Controls.Add(this.portLabel);
293 | this.Controls.Add(this.PortTextBox);
294 | this.Controls.Add(this.KickButton);
295 | this.Controls.Add(this.MuteButton);
296 | this.Controls.Add(this.ClientNameList);
297 | this.Controls.Add(this.DisconnectButton);
298 | this.Controls.Add(this.ConnectButton);
299 | this.Controls.Add(this.StatusLabel);
300 | this.Controls.Add(this.RefreshButton);
301 | this.Controls.Add(this.typePrompt);
302 | this.Controls.Add(this.serversFoundLabel);
303 | this.Controls.Add(this.ServerList);
304 | this.Controls.Add(this.confirmNameButton);
305 | this.Controls.Add(this.usernameLabel);
306 | this.Controls.Add(this.NameInputBox);
307 | this.Cursor = System.Windows.Forms.Cursors.Default;
308 | this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
309 | this.Name = "Main";
310 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
311 | this.Text = "Crap Chat 2";
312 | this.ResumeLayout(false);
313 | this.PerformLayout();
314 |
315 | }
316 |
317 | #endregion
318 |
319 | public System.Windows.Forms.TextBox NameInputBox;
320 | private System.Windows.Forms.Label usernameLabel;
321 | private System.Windows.Forms.Button confirmNameButton;
322 | private System.Windows.Forms.Label serversFoundLabel;
323 | private System.Windows.Forms.Label typePrompt;
324 | public System.Windows.Forms.ListBox ServerList;
325 | public System.Windows.Forms.Button RefreshButton;
326 | public System.Windows.Forms.Label StatusLabel;
327 | public System.Windows.Forms.Button ConnectButton;
328 | public System.Windows.Forms.Button DisconnectButton;
329 | public System.Windows.Forms.Button MuteButton;
330 | private System.Windows.Forms.Button KickButton;
331 | private System.Windows.Forms.Label portLabel;
332 | public System.Windows.Forms.TextBox PortTextBox;
333 | private System.Windows.Forms.Label label1;
334 | public System.Windows.Forms.TextBox NewServerNameBox;
335 | public System.Windows.Forms.TextBox NewServerPortBox;
336 | public System.Windows.Forms.Button CreateNewServerButton;
337 | public System.Windows.Forms.Button ShutdownServer;
338 | public System.Windows.Forms.ListBox ClientNameList;
339 | private System.Windows.Forms.Timer RefreshTimer;
340 | }
341 | }
342 |
343 |
--------------------------------------------------------------------------------
/CrapChat2/Main.resx:
--------------------------------------------------------------------------------
1 |
2 |
3 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 | text/microsoft-resx
110 |
111 |
112 | 2.0
113 |
114 |
115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
116 |
117 |
118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
119 |
120 |
121 | False
122 |
123 |
124 | False
125 |
126 |
127 | 17, 17
128 |
129 |
130 |
131 |
132 | AAABAAYAQEAAAAEAIAAoQgAAZgAAAEBAAAABAAgAKBYAAI5CAAAgIAAAAQAgAKgQAAC2WAAAICAAAAEA
133 | CACoCAAAXmkAABAQAAABACAAaAQAAAZyAAAQEAAAAQAIAGgFAABudgAAKAAAAEAAAACAAAAAAQAgAAAA
134 | AAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
135 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
136 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
137 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
138 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
139 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
140 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
141 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
142 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
143 | AAAAAAAAAAAAAAAAAAAAAAAAEyxSKBMwUWoTL1OcFDBTvhQxU9UUMlTgFDBS4RIyVNoTMFLDEzBRqRMv
144 | UY0SLlFuFC5QTBQwUiUAVVUDHDhxCStGaR0pQWorKUNoMSlFZTcoRGk/KEVpRipEaE4qRGpZKERoZCpG
145 | anMrRWqBK0dskipHa6EoRGmsJEBntiI/ZMEeO2DJHjte0ho6XtsYN1viGDZa5xY0V+4VNFj1FDJX9hU0
146 | VvoVMVX6EzNW+BMxVfUUMVPtFDFU4xQwVNcTMVTFEzBSrRMvUY0RLU9kEC1PLQAAAAEAAAAAAAAAAAAA
147 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwITLk9dEjFT0BU0V/8XN1z/GDpf/xk7Yf8ZPGP/GTxj/xk8
148 | Y/8ZPGP/GDti/xg6YP8XOV7/Fzdc/xY1Wv8VNFf/GTdb+SI9Yf4nQWX/KUNo/ylEaf8qRWr/LEdt/y1J
149 | b/8uS3H/L010/zFPdv8yUXn/M1N7/zRUff81Vn//NleA/zVWf/8yU33/L1B5/ytNdv8oSnL/JUdv/yJE
150 | bP8fQmr/HUBo/xw/Z/8bPmb/Gj1l/xo9Zf8aPWT/GTxj/xk8Yv8YO2L/GDph/xg6X/8XOF7/FjZb/xU0
151 | V/8TL1PgEi5QeRkzTAoAAAAAAAAAAAAAAAAAAAAAAAAAABIvVBsTMVPEFjZa/xk7Yf8aPmX/Gz9n/xtA
152 | aP8bQGn/G0Bp/xtAaf8bQGn/G0Bp/xtAaP8bQGj/Gz9n/xo/Z/8aPmb/GT1k/xk8Y/8YOmD/Fzhe/xo5
153 | Xf8eO2D/JEBk/ytGa/8tSnD/ME10/zJRef81VX7/N1iC/zlbhv86XYj/O12I/zteif87Xon/O16J/zpd
154 | iP83W4X/M1eB/y9Sff8rT3j/J0t1/yRIcv8hRm//H0Rt/x1Ca/8cQWr/HEFq/xxBaf8bQGj/Gj9n/xo/
155 | Z/8aP2f/Gj5m/xk+Zf8ZPGP/GDpg/xY1Wf8RL1PXEDFSHwAAAAAAAAAAAAAAABU1VRgTMlPeGDlf/xs+
156 | Zv8cQGn/HEFq/xxBav8cQWr/HEFq/xxBav8cQWr/HEFq/xxBav8cQWn/HEFp/xtAaf8bQGn/G0Bp/xtA
157 | af8bQGj/G0Bo/xo/Z/8aPmX/GTxj/xg6YP8YOF3/HDtg/yNAZf8rSG7/ME51/zRUfP83WIL/OlyH/zte
158 | if87Xon/O16J/zteif87Xon/O16J/zteif84W4b/M1eB/y5SfP8qTnj/Jkt0/yNIcf8gRW7/HkNs/x1C
159 | a/8cQWr/HEFq/xtAaf8bQGj/Gj9n/xo/Z/8aP2f/Gj9n/xo/Zv8ZPWT/Fzhd/xIwUc4AKlUGAAAAAAAA
160 | AAATL1O3GDle/xs/Z/8cQWr/HEFq/xxBav8cQWr/HEFq/xxBav8cQWr/HEFq/xxBav8cQWr/HEFq/xxB
161 | av8cQWr/HEFq/xxBav8cQWr/HEFp/xtAaf8bQGn/G0Bp/xtAaP8bP2f/Gj9m/xk9Zf8YO2L/GDpf/xw8
162 | Yf8kQmj/Lkty/zNSe/82V4H/OVuF/ztdiP87Xon/O16J/zteif87Xon/O16J/zteif84W4b/M1aB/y1R
163 | e/8pTXf/JUpz/yJHcP8fRG3/HkNs/xxBav8cQWr/HEFp/xtAaP8aP2j/Gj9n/xo/Z/8aP2f/Gj9n/xk9
164 | ZP8WNlr/Ey9QdQAAAAAVL1I7FzZb/xw/Zv8dQmv/HUJr/x1Ca/8eQmz/HUJr/x1Ca/8dQmv/HUJr/x1C
165 | a/8dQmv/HUJr/x1Ca/8dQmv/HEFq/xxBav8cQWr/HEFq/xxBav8cQWr/HEFq/xxBav8bQGn/G0Bp/xtA
166 | af8bQGj/G0Bo/xo/Z/8aPmb/GT1k/xk7Yf8fPmT/KEVr/zBOdv81VX3/OFmD/zpch/87Xon/O16J/zte
167 | if87Xon/O16J/zpdiP82WoT/MVR//yxQev8nS3X/I0hx/yFFb/8eQ2z/HUJr/xxBav8cQWr/G0Bp/xtA
168 | aP8aP2f/Gj9n/xo/Z/8aP2f/GDth/xMwU+scOFQJFzNWkBo7Yf8eQmv/H0Rt/x9Ebf8fRG3/H0Rt/x9E
169 | bf8fRG3/H0Rt/x9Ebf8fRG3/H0Nt/x5DbP8eQ2z/HkNs/x5DbP8dQmv/HUJr/x1Ca/8dQmv/HEFq/xxB
170 | av8cQWr/HEFq/xxBav8cQWr/HEFp/xtAaf8bQGn/G0Bo/xtAaP8aP2f/Gj5m/xk8Y/8aPGL/IkFn/y1K
171 | cf8zU3v/N1iC/zpchv87Xon/O16J/zteif87Xon/O16J/zlch/80V4L/LlJ8/ylNd/8lSXP/IkZw/x9E
172 | bf8dQmv/HEFq/xxBav8bQGn/G0Bo/xo/Z/8aP2f/Gj9n/xk9Zf8WNlr/ES9QVhg1WLsdP2b/IEVu/yFG
173 | b/8hRm//IUZv/yJGcP8iRnD/IkZw/yJGcP8hRm//IUZv/yFGb/8hRW//IEVu/yBFbv8gRG7/H0Rt/x9E
174 | bf8eQ2z/HkNs/x5CbP8dQmv/HUJr/x1Ca/8cQWr/HEFq/xxBav8cQWr/KEpw/z5bfP9KZYP/RmKA/zZV
175 | d/8fQ2r/Gj9n/xk9Zf8ZO2L/ID9l/ytJb/8zUnr/N1iC/zpchv87Xon/O16J/zteif87Xon/O16J/zda
176 | hf8wVH7/K095/yZLdP8jR3H/IEVu/x5DbP8cQWr/HEFq/xxBaf8bQGj/Gj9n/xo/Z/8aPmb/Fzlf/xQw
177 | UpgaN1m5H0Fp/yNHcP8kSHL/JEhy/yRJcv8lSXP/JUlz/yVJc/8lSXP/JUlz/yVJc/8kSXL/JEhy/yRI
178 | cv8jSHH/I0dx/yJHcP8iRnD/IUZv/yBFbv8gRG7/H0Rt/x9Dbf8eQ2z/HkNs/0plg/+Jl6f/v8TJ/97d
179 | 3v/k5OT/5+fn/+bm5v/i4eL/1tbX/6uzu/9xhJj/MFBz/xo+Zv8ZPGL/Hj5k/ypHbf8yUXn/N1iB/zpc
180 | h/87Xon/O16J/zteif87Xon/OFyG/zJWgP8tUHv/KEx2/yRIcv8gRW7/HkNs/x1Ca/8cQWr/HEFp/xtA
181 | af8aP2j/Gj9n/xg7Yf8UMlW8HDhbkSFCaf8mSnP/J0t1/ydLdf8oTHb/KEx2/yhNdv8pTXf/KU13/ylN
182 | d/8pTXf/KE12/yhMdv8oTHb/J0t1/ydLdf8mSnT/JUpz/yRJcv8kSHL/I0dx/yJHcP8iRm//WnKN/7e8
183 | w//j4+P/8PDw//j4+P/7+/v//Pz8//z8/P/8/Pz//Pz8//n5+f/19PX/6+vr/9nZ2f+Snqz/NVR2/xo+
184 | Zv8ZO2L/Hj1j/ytJb/8zU3v/OFmD/zpdiP87Xon/O16J/zteif86XYj/NFeC/y5SfP8pTXf/JEly/yFG
185 | b/8eQ2z/HUJr/xxBav8cQWr/G0Bp/xo/Z/8YO2H/EjJVwB04W1YiQmj/KEt1/ypOeP8rT3n/LFB6/yxQ
186 | ev8tUXv/LVF7/y1Re/8uUXz/LVF7/y1Re/8tUXv/LFB6/yxQev8rT3n/K095/ypOeP8pTXf/KEx2/ydL
187 | df84WH3/oaq1/9/f3//w8PD/9/f3//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//j4
188 | +P/19fX/6enp/9DQ0f9vgZb/HUFp/xk+Zf8YO2H/IT9k/y5Mc/81Vn//OVuG/zteif87Xon/O16J/zpd
189 | iP81WIP/LlJ8/ylNd/8lSXP/IUZv/x9Dbf8dQmv/HEFq/xxBav8bQGj/GDpg/xQyU6IiM2YPIkBk9ipM
190 | df8uUnz/L1N9/zBUfv8xVH//MVV//zJWgP8yVoD/M1aB/zNWgf8zVoH/MlaA/zJWgP8yVYD/MVV//zBU
191 | fv8vU33/LlJ8/y1Re/9Paor/wcPG/+Tk5f/w8PD/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly
192 | 8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Hx8f/r6+v/2dnZ/5afqv8lR23/Gj9n/xk8Y/8ZOl//JkNo/zJQ
193 | d/83WIL/Ol2I/zteif87Xon/Ol2I/zVYg/8vUn3/KU13/yVJc/8hRm//H0Rt/x1Ca/8cQWr/Gz9o/xc4
194 | Xf8VL1RhAAAAACI+Y5wqSnL/MVR+/zNXgf81WIP/NlmE/zdahf84W4b/OFuG/zlch/85XIf/OVyH/zlc
195 | h/85XIf/OFuG/zdbhf83WoX/NlmE/zRYgv9Ra4r/tra4/9HQ0P/Z2Nn/2tnZ/9rZ2f/a2dn/2tnZ/9rZ
196 | 2f/a2dn/2tnZ/9rZ2f/a2dn/2tnZ/9rZ2f/a2dn/2tnZ/9rZ2f/a2dn/2tnZ/9fW1//Hxsf/kZig/yJF
197 | bP8bQGj/Gj5m/xg6Yf8ePGH/Lkty/zVWf/85XIb/O16J/zteif86XYj/NViD/y5SfP8pTXf/JUlz/yFG
198 | b/8fQ23/HUJr/xo9ZP8UNFjqFSpVDAAAAAAiO2YeJ0Zs8zJTfP84WoX/Ol2I/zpdiP87Xon/O16J/zte
199 | if87Xon/O16J/zteif87Xon/O16J/zteif87Xon/O16J/zteif87Xon/j5GW/6moqf+0srP/t7W2/7e1
200 | t/+3tbf/t7W3/7e1t/+3tbf/t7W3/7e1t/+3tbf/t7W3/7e1t/+3tbf/t7W3/7e1t/+3tbf/t7W3/7e1
201 | tv+2tbb/sK6v/6Ggof9cbID/G0Bp/xtAaf8bP2f/GTxj/xk5Xv8oRWv/M1J7/zlbhf87Xon/O16J/zpd
202 | iP80WIL/LlJ8/yhNdv8kSXL/IUVv/x1Baf8YOF7/FTFUYQAAAAAAAAAAAAAAAClFaVwvTXT+N1iB/zpd
203 | h/87Xon/O16J/zteif87Xon/O16J/zteif87Xon/O16J/zteif87Xon/O16J/zteif87Xon/PF+J/31/
204 | hf+LiYr/j4yO/5COj/+Qjo//kI6P/5COj/+Qjo//kI6P/5COj/+Qjo//kI6P/5COj/+Qjo//kI6P/5CO
205 | j/+Qjo//kI6P/5COj/+Qjo//j42P/42Ljf+Ihof/U2N3/xxBav8cQWr/G0Bp/xtAaP8aPmX/Fzhd/yM/
206 | ZP8yUHj/OFmD/ztdiP87Xon/OVyH/zNWgf8tUXv/J0x1/yJFbv8cPGL/FzNXmgAAAAAAAAAAAAAAAAAA
207 | AAAAAAAAKkZrZi1Mc/o1VX7/OVqE/zpdh/87Xon/O16J/zteif87Xon/O16J/zteif87Xon/O16J/zte
208 | if87Xon/O16J/zteif89X4n/PmCJ/z5gif8+YIn/PmCJ/z5gif8+YIn/Pl+J/z1eiP86XIX/OFqD/zVX
209 | gP8zVX7/MFN8/y5Ref8sT3f/Kk11/yhLc/8nSnL/JUhw/yRHb/8jRm7/IkVt/x1Ca/8cQWr/HEFq/xxB
210 | av8cQWn/G0Bp/xo+Zv8YOV//ID1h/zFPd/84WYP/O12I/zteif83W4X/MFR+/ylLdP8hQWf/GjhbmgBV
211 | VQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoR2syLUlwvzFOdv80VHz/NleA/zdYgv84WYP/OFmD/zha
212 | hP85W4X/OlyG/zpch/86XYj/O12I/zteif87Xon/O16J/zteif87Xon/O16J/zteif87Xon/O16J/zte
213 | if87Xon/O16J/zpdiP84XIb/NlmE/zNWgf8wVH7/LVF7/ytPef8oTXb/Jkt0/yRJcv8iR3D/IUVv/x9E
214 | bf8eQ2z/HUJr/x1Ca/8cQWr/HEFq/xxBav8bQGn/Gj5m/xg5Xv8eOl7/ME52/zdYgf85W4b/OFqE/zBR
215 | ef8mQ2v1HzxhaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArRGkpKkVscSxI
216 | bpsrRmy1JUJm/ydEaf4qRmz+LUpw/jBOdf8xUHj/M1J6/zRUff82VoD/O1yE/154mP9uhaL/Ynub/0Bi
217 | i/87Xon/O16J/zteif87Xon/O16J/zteif87Xon/O16J/zteif85XYf/N1qF/zRXgv8wVH7/LlF8/ytP
218 | ef8oTXb/KU12/0tniP9edpH/UGuJ/yhLcv8eQ2z/HUJr/xxBav8cQWr/HEFq/xxBaf8aPmb/Fzhe/x87
219 | X/8wTXT/M1J6/zFPdv8qSG60JEFlIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
220 | AAAAAAAAAAAAAAAAAAAAAAABFTFTtBc1Wv8XN1z/Fzdb/xc2Wv8WNVj+GDZZ/hs4W/4gPF/+doSZ/s/Q
221 | 0//j4uL/5+bm/+Tj4//U1dj/iJiu/zxdh/86XYf/O16I/zteif87Xon/O16J/zteif87Xon/O16J/zte
222 | if86XYj/N1qF/zRXgv8xVH//cYag/8vO0v/j4uL/5eTk/+Pi4v/U1df/gZKl/yVIcP8eQ2z/HUJr/xxB
223 | av8cQWr/HEFq/xo+Zv8XN13/IT1h/yVDZuctRWo+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
224 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFjJUWhg4Xf8bPmX/HEBo/xxAaP8cQGj/Gz9n/xs+
225 | Zf8dP2b/mqSw/+Tj5P/08/P/+/v7//39/f/8/Pz/9vX1/+fm5/+vt8H/OVd9/zVWf/84WYP/OVyG/ztd
226 | iP87Xon/O16J/zteif87Xon/O16J/zteif87Xoj/nKi5/+Tj4//v7+//9/b2//n5+f/49/f/8fHx/+Xk
227 | 5f+xuMH/Kkxz/x5DbP8dQmv/HUJr/xxBav8cQWr/Gz5m/xg5X/8UMlP9FixNFwAAAAAAAAAAAAAAAAAA
228 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABg2WskdP2b/H0Ns/x9E
229 | bf8fRG3/H0Rt/x9Dbf8eQ2z/hZWn/+bl5f/5+fn//v7+//7+/v/+/v7//v7+//7+/v/7+/v/6enp/5eg
230 | rf8hPWH+Kkdt/jJQeP81Vn//OFmD/zpch/87Xon/O16J/zteif87Xon/iZqw/+Xk5P/29vb//v7+//7+
231 | /v/+/v7//v7+//7+/v/5+fn/6Ofn/6KsuP8hRW7/H0Rt/x5DbP8dQmv/HEFq/xxBav8bPmb/Fzdb/xMu
232 | Uk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABw4
233 | VBIcO2D+IURs/yJHcP8iR3D/Ikdw/yJHcP8iRnD/RWKD/97d3v/39/f//v7+//v7+/+mpqX/c3Ny/56e
234 | nf/4+Pj//v7+//r6+v/j4uL/TGN+/xY1Wf8YNVj+IT1i/ixJcP8zUnr/NleA/zlbhf86XYj/Um+U/93d
235 | 3v/29fX//v7+//39/f+srKz/c3Nz/5iYl//19fX//v7+//n5+f/j4uL/X3eS/yFGb/8fRG3/HkNs/x1C
236 | a/8cQWr/G0Bo/xg5X/8VMVJsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
237 | AAAAAAAAAAAAAAAAAAAcOFk2ID9m/yVJcv8mSnT/Jkt0/yZLdP8mSnT/Jkp0/5umtf/t7Oz//fz8//v7
238 | +/9cXFz/EREQ/xEREP8RERD/TExL//f39//9/f3/8fHx/6qyvP8bPmb/GTti/xc4Xf8VM1f/Gzda/iVB
239 | Zv4wTnX/NVV+/5iltv/t7e3//f39//39/f9paWn/EREQ/xEREP8RERD/QkJB//Pz8//9/f3/8vLy/7a9
240 | xf8kSHL/IkZw/yBFbv8fQ23/HUJr/xxBaf8ZOmD/FDJWcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
241 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHTpdNCNDav8pTXb/K095/ytPef8rT3n/K095/zFU
242 | fP/V1tf/9vX1//z8/P+hoaD/EREQ/xEREP8RERD/EREQ/xEREP+NjY3//Pz8//n4+f/e3t7/LlB1/xxB
243 | av8bQGj/Gj5l/xk7Yf8XNlv/FzRX/iQ/Y/7R0tX/9/f3//z8/P+wsK//EREQ/xEREP8RERD/EREQ/xER
244 | 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
272 | 4P/t7e3/4+Pj/zY2Nf8RERD/EREQ/xEREP8sLCv/29vb/+3t7f/k5OT/trvD/zteif87Xon/O16J/zte
273 | if84W4b/NFiC/zBUfv8sUHr/mqWz/+Lh4v/u7u7/6ejp/0BAQP8RERD/EREQ/xEREP8kJCP/1dXV/+7u
274 | 7v/m5ub/vL7D/zFOdf8vTHP+LkhwzChFaF8AAH8CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
275 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
276 | AAAtRWo+KklukWd5jsrS0dH/5eXm/+rq6v/Z2dn/ampp/zs7Ov9iYmL/0tLS/+rq6v/o5+j/1dTV/3KH
277 | of87Xon/O16J/zteif87Xon/O16J/zpeiP84W4b/M1eB/1RvkP/T0tP/5ubm/+vr6//e3t//cHBw/zw8
278 | O/9eXl3/zc3N/+vr6//o6On/1tXV/2Z3iPgmQ2U1Lz9vEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
279 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
280 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWMVNDk5ul/9XU1P/k5OT/5ubn/+bm5//m5uf/5ubn/+bm
281 | 5//l5eX/19fX/6iuuP86W4T/OlyH/ztdiP87Xon/O16J/zteif87Xon/O16J/zpdiP83WoX/lKCw/9XU
282 | 1f/j4uP/5+fo/+jo6P/o6Oj/6Ojo/+jn6P/l5eX/19fX/6uwt/8bOV3/Ey1PQwAAAAAAAAAAAAAAAAAA
283 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
284 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFjNX0CVEZ/+orbT/0M/Q/9zc
285 | 3P/h4eH/4uLi/+Hh4v/e3d7/0tLS/7CzuP8zTGz+LElw/jNSev82V4D/OFqE/zpdh/87Xon/O16J/zte
286 | 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
342 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
343 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
344 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKkdrTjJQ
345 | eP85XIb/O16J/zteif87Xon/O16J/zteif87Xon/N1qF/zJVgP8tUXv/KE12/yVJc/8hRm//H0Rt/x5C
346 | bP8cQGj/GDlf/xQxVHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
347 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
348 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
349 | AAAAAAAAAAAAACtHbYA0VHz/Ol2H/zteif87Xon/O16J/zteif87Xon/O16J/zteif84W4b/MlaA/y1R
350 | e/8pTXf/JUlz/yJGcP8fRG3/HD9m/xUzV/cUMlEZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
351 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
352 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
353 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsR215NFR8/zpdh/87Xon/O16J/zteif87Xon/O16J/zte
354 | if87Xon/O16J/zhchv8zVoH/LVF7/ylNd/8lSXP/IURt/xs7Yf8WMVaHAAAAAAAAAAAAAAAAAAAAAAAA
355 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
356 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
357 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK0VtRjJReP85W4b/O16J/zte
358 | if87Xon/O16J/zteif87Xon/O16J/zteif87Xon/OVyH/zNWgf8tUXv/KEt1/yFCaf8ZNVrWHDhUCQAA
359 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
360 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
361 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMz
362 | ZgUtTHLmN1iC/zteif87Xon/O16J/zteif87Xon/O16J/zteif87Xon/O16J/zteif84XIb/MlV//ylL
363 | c/8ePGHwGDdXKQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
364 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
365 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
366 | AAAAAAAAAAAAAAAAAAAAAAAAKkhscTNSev86XIb/O16J/zteif87Xon/O16J/zteif87Xon/O16J/zte
367 | if87Xon/Ol2I/zRVfv8mRGv1IDxhPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
368 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
369 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
370 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADNmZgUuSm/SNleA/ztdiP87Xon/O16J/zte
371 | if87Xon/O16J/zteif87Xon/OlyH/zZWgP8tTHPxJ0NnQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
372 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
373 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
374 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALEhpLi9O
375 | d/Y5W4b/O16J/zteif87Xon/O16J/zteif87Xon/OVuG/zRUff8uSXHhK0ZsLwAAAAAAAAAAAAAAAAAA
376 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
377 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
378 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
379 | AAAAAAAAAAAAAAAAAAAtS3KpN1mD/zteif87Xon/O16J/zteif86XYf/N1iC/zJReP8sR265JEhtFQAA
380 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
381 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
382 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
383 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALEpyoTdXgf87Xon/O16J/ztdiP85W4X/NVV+/y9N
384 | cvcsRmxzAAB/AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
385 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
386 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
387 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC1Jb7U1VX7/OVuF/zlb
388 | hf82V4D/MlB4/y1Jbb8tR2gnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
389 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
390 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
391 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8/
392 | XxArR2zvMlF5/zNTe/8xUHf/LElw3itGbFcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
393 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
394 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
395 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
396 | AAAAAAAAAAAAAAAAAAApQmd2K0Vr8ytJbuoqSG60KkVqYCpVfwYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
397 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
398 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
399 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
400 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
401 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
402 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
403 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
404 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
405 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
406 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
407 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////////////////wB//wAAAP/4AAAAAAAAH+AA
408 | AAAAAAAHwAAAAAAAAAOAAAAAAAAAA4AAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
409 | AACAAAAAAAAAAIAAAAAAAAABgAAAAAAAAAHAAAAAAAAAA+AAAAAAAAAD8AAAAAAAAAf4AAAAAAAAH/8A
410 | AAAAAAA//4AAAAAAAP//gAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAA
411 | AP//AAAAAAAA//+AAAAAAAD//4AAAAAAAf//wAAAAAAB///gAAAAAAP///AAAAAAD////AAAAAB/////
412 | AAAAAH////4AAAAAf////gAAAAA////+AAAAAD////4AAAAAf////gAAAAB////+AAAAAP////4AAAAA
413 | /////wAAAAH/////gAAAB/////+AAAA//////8AAAD//////8AAAP//////8AAA///////4AAD//////
414 | /gAAf//////8AAB///////4AAH///////gAA///////+AAH///////8AA////////wAH////////gA//
415 | //////+AH////////4B/////////gP////////+D/////////4///////////////////////////ygA
416 | AABAAAAAgAAAAAEACAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/EREQ/xoaGf8gIB//IiIh/yws
417 | K/8wMC//NjY1/zw8O/9AQD//ES1P/xYsTf8ZM0z/ACpV/xIuUf8ULlH/FSpV/xIvVP8VL1T/EjBS/xQw
418 | Uv8TMVT/FDFV/xU0Vv8YMFT/GTZX/xw4VP8WNVn/Fzdc/xk2Wf8ZN1z/Fzhd/xo4W/8cOFr/GDle/x06
419 | Xf8iOVz/IDxf/y8/X/8AAH//GTNm/xg6Yf8dO2D/GTxi/x08Yf8aPmb/HT5l/xo/aP8cOHH/IjNm/yE9
420 | Yf8kP2P/Ijtm/yE/ZP8mP2b/Lz9v/zMzZv8AVVX/H0Bn/xtAaP8cQWr/HkJs/x9EbP8iQGX/JUFl/yVE
421 | Z/8pQmf/KUVl/yFCaf8lQmj/JkRq/yBFbv8lRm7/KUJo/ylFaf8tRWn/KkZs/yxGbf8kSG3/KUhr/yxI
422 | af8qSG7/LEht/zBIbf8zTGz/IkZw/ypGcf8jSHH/JEhy/yZKdP8nTHX/KEpx/y1KcP8qTHP/Lkxy/yhL
423 | dP8oTHb/LU11/ypOeP8sT3r/ME51/y5Qdf8sUHr/LlJ8/ypVf/8wUHP/MVB2/zRTdf81VHb/OVNy/zJR
424 | ef80U3v/MVN8/zRTfP8wVH7/NFR9/zlXev85V33/PFl6/zhYff8+W3z/AH9//zNmZv9BQUD/TU1M/1VV
425 | Vf9dXVz/TGN+/1Njd/9hYWH/a2tq/3Jycf9+fn3/MlaA/zVWgP82WIL/NlmE/zhZg/84WoX/OVyG/zxd
426 | h/86XYj/PV6I/z5gif9EYYL/SmWD/0hkhP9AYor/RWWN/0tniP9Paor/TWqP/1xsgP9SbIn/WnKO/1Ju
427 | kv9XcZL/XHWS/154mP9nd4n/Z3mP/31/hf9ieZL/ZnqR/2h8kv9jfJv/AAD//2+Blv9tg53/cYSZ/3aG
428 | mv9yhZ3/domf/26Fov9xhqD/dYmk/3qOpv9+kKb/fJCo/4GBgf+Ihof/jYuN/5COj/+PkZb/kZCQ/5iY
429 | l/+enp3/gI+i/4KTpv+JlKP/iZen/4aXqv+ImK7/j5us/42cr/+RmKD/kpum/5Seq/+JmrD/kJ6w/5eg
430 | rf+aoq3/lKCw/5mls/+cqLn/oqKi/6qqqv+wrq//sLCv/6Gqtf+orbT/pKy4/6iuuP+rsLf/qrG6/6qy
431 | vP+2tLb/sLO4/7a2uP+2ub3/vLy8/6+3wf+1u8P/vL7D/7/Eyf/Bw8b/xsXG/8jHx//Kysr/zMvM/83M
432 | zf/LztL/0M/Q/8/Q0//R0NH/0dLV/9XV1v/U1dj/2dnZ/9zb2//e3d7/4N/f/+Df4P/i4eH/5OPj/+Tj
433 | 5P/l5eX/6Ofn/+fn6P/o5+j/6enp/+3t7f/z8/P/+Pf3//v7+/8AAAD/AAAAAAAAAAAAAAAAAAAAAAAA
434 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
435 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAREw4W
436 | FRUTFRUVEw4OEzkwS0lJQ0pKS0lKS0tNTEpFNSwqIx0dGxsVGxUVFRMVFRUTDgoKAAAAAAAAAAAAJw4V
437 | FxwpKSstLSsrKR8fGxcbMkBJSkpNUlxkZGpvcIaHhnJuYllXRz08Oi8tLS0tKykpKR8bFxUODAAAAAAA
438 | FRQbKS0vOzs8Ozw7Ozs7Ly8tLSkfHiMzTF5kboaJio2NjY2PjYiFZ2JZWFU+PTw8OzsvOy8tLSsfFxMT
439 | AAAAFxYpOzs8PTw8PDw8PDs8Ozw7PDs7LS0tKR4iP1FkcomOjY6PjY2Pj42HZ2JYVUc+Pjs8Ozs7Ly8v
440 | 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
496 | iY6OjopzXk0nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
497 | AAAAXHOKioZuUksAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
498 | AAAAAAAAJlJub25cTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
499 | AAAAAAAAAAAAAEJKUlFKaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
500 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
501 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
502 | ////////////////////AH//AAAA//gAAAAAAAAf4AAAAAAAAAfAAAAAAAAAA4AAAAAAAAADgAAAAAAA
503 | AAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAAGAAAAAAAAAAcAA
504 | AAAAAAAD4AAAAAAAAAPwAAAAAAAAB/gAAAAAAAAf/wAAAAAAAD//gAAAAAAA//+AAAAAAAD//wAAAAAA
505 | AP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//4AAAAAAAP//gAAAAAAB///A
506 | AAAAAAH//+AAAAAAA///8AAAAAAP///8AAAAAH////8AAAAAf////gAAAAB////+AAAAAD////4AAAAA
507 | P////gAAAAB////+AAAAAH////4AAAAA/////gAAAAD/////AAAAAf////+AAAAH/////4AAAD//////
508 | wAAAP//////wAAA///////wAAD///////gAAP//////+AAB///////wAAH///////gAAf//////+AAD/
509 | //////4AAf///////wAD////////AAf///////+AD////////4Af////////gH////////+A////////
510 | /4P/////////j///////////////////////////KAAAACAAAABAAAAAAQAgAAAAAAAAIAAAAAAAAAAA
511 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
512 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
513 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQL1FLFDNXpBU0WtYVN1rsFjVb7hY0WtoVNFi+EzFXmxs5
514 | XYAoQWSRJkRnmStHbKAtSG+pLkxytTBOdsQwTXXSKklz3SREa+YgQGXuGzti9Bg5XfoXNl38Fjhb+hY1
515 | W/MWNVnmFTVZzhQzVqMRL1BWAAAAAgAAAAAAKlUGFDNWrhk7Yv8bP2j/G0Bp/xtAaf8bQGn/G0Bo/xo/
516 | aP8aPmf/GT1k/xk7Yf8cPGH/I0Bl/yxJb/80U3z/OFuF/ztdiP87Xon/OV2H/zVYg/8sUHr/JUlz/x9E
517 | bf8cQWr/G0Bp/xo/Z/8aPmb/GT5l/xg6YP8RMlWwAAAAARQxVnwaPmX/HEFq/xxBav8cQWr/HEFq/xxB
518 | av8cQWr/HEFq/xxBav8bQGn/G0Bp/xs/aP8aP2b/GTxj/xw+ZP8mRWz/MVF5/zhahP86XYj/O16J/zpd
519 | iP80V4L/Kk54/yJHcP8eQ2z/HEFp/xo/aP8aP2f/Gj9n/xg7Yf8QMFJaGTld0h9Ebf8gRW7/IEVu/yBF
520 | bv8gRW7/H0Rt/x9Ebf8eQ2z/HUJr/x1Ba/8cQWr/HEFq/xxBaf8eQmv/L1Bz/yxMcP8aPmX/IEBn/y1M
521 | dP83WYL/Ol2I/zteif84W4b/L1N9/yVKc/8fRG3/HEFq/xtAaP8aP2f/GT5m/xQ1WbodO2LSJEhy/yVJ
522 | c/8mSnT/J0t1/ydLdf8mSnT/JUlz/yRIcv8iR3D/IUVv/yBEbv9TbYr/qbO//+Pk5v/w8PD/8O/w/9vd
523 | 4P+ZprP/Plt6/x4/Zv8sS3P/N1mD/zpdiP86XYj/M1aB/yhMdv8gRW7/HEFq/xtAaf8aP2f/FDda3iA9
524 | ZJYqTXf/LVF7/y5SfP8vU33/MFN+/y9Tff8vUn3/LVF7/ytPef8yVHv/n6q3/+zs7P/19fX/9fX1//X1
525 | 9f/19fX/9fX1//T09P/l5eX/fo6g/xs/Zv8gQGb/MVB4/zlch/86XYj/NFeC/ylNd/8hRW//HUJr/xtA
526 | af8VNlrAITxjLitMdfw2WYT/OFuG/zlch/86XYj/Ol2I/zlch/85XIf/OFuG/4+WoP/Fw8T/yMfI/8jH
527 | yP/Ix8j/yMfI/8jHyP/Ix8j/yMfI/8jHx//Bv8D/a3qL/xo/aP8aPGP/KEdu/zhZg/86XYj/NFeC/ylN
528 | d/8hRW//Gj1l/xUzV1UAAAAAK0hvcDRUfP06XIf/O16J/zteif87Xon/O16J/zteif87Xon/YHGI/2Z2
529 | i/9nd4z/Z3aM/2V1iv9jc4j/YHGG/15vg/9cbYH/W2uA/1hpfv9GW3X/HEFq/xtAaP8ZPWT/I0Fn/zZX
530 | gf86XYj/MVV//yRHb/8ZOFyNAAAAAAAAAAAAAAAAKkhuPC9OdKYxT3fTL051/jFRef41VX7/NliB/zlb
531 | hf9QbpP/RmaO/zteif87Xon/O16J/zpdiP83WoX/MVV//yxQev8nTHX/LVB3/zpZfP8gRG3/HEFq/xtA
532 | af8aPWT/IT5k/zRUff8vUXnsIj9nYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABU0V4MZOmD/GTth/xk5
533 | X/48VXT+xsnP/vDw8P/q6ur/lqS3/zhZgv85XIb/O12I/zteif86XYj/OFuF/4iZrv/l5eb/7u3t/8rO
534 | 1P9HY4T/HEFq/xxBav8ZPGT/Gjld+CQ8YRUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8EGz1j8SBF
535 | bv8gRW7/KEty/8/T2P/7+/v/xcXE/+Tk5P/39/f/eYea/iJAZf4uTXX+N1iC/zpdh/98kar/8/Pz/+np
536 | 6f/BwcH/+vr6/9nb3v8wUXb/HUJr/xxBav8ZO2H/ECxNLgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB06
537 | WBokRm7/KEx2/yhMdv9xhp7/9/b2/4KCgf8RERD/Hx8e/9/f3//c3uD/H0Jp/xg6YP8cOl/+J0Vr/tPW
538 | 2//p6en/Jycm/xEREP9wcHD/+Pj5/36Qpv8iRnD/HkNs/xo9ZP8UMlUzAAAAAAAAAAAAAAAAAAAAAAAA
539 | AAAAAAAAADNmBSlJcvUzVoH/NFiC/6Ovvv/39/f/HR0c/xEREP8RERD/hYWF//Dw8P9DYYL/HkJr/xxA
540 | af8xT3L/7+/v/5eXlv8RERD/EREQ/xUVFP/u7u7/sbvG/yhMdv8jR3H/Gzxi/Q8tWhEAAAAAAAAAAAAA
541 | AAAAAAAAAAAAAAAAAAAAAAAALk10njlbhv87Xon/rrjE/+zs7P8RERD/EREQ/xEREP9wcG//7u7u/1Rv
542 | jv8lSXP/IUVv/z5cfv/u7e3/gYGA/xEREP8RERD/EREQ/9vb2/+8w83/MFR+/yhMdf8cO2G9AAAAAAAA
543 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkSG0VME921zhahf+Vo7X/7+/v/zQ0M/8RERD/EREQ/5ub
544 | m//l5eX/SmmO/zJVgP8qT3j/MFJ5/+Pi4/+trKz/EREQ/xEREP8mJiX/7+/v/6KuvP82V4L/KUhv7B07
545 | XisAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkSG0OL0xzgmB0kNbg4OD/tra2/zEx
546 | MP9cXFv/5ubm/7i+x/87Xon/O16J/zhbhv8xVX//qLG9/+np6f9nZ2f/Ly8u/6ysrP/k5OT/bHuSyi1J
547 | cHYfP2oYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFjBWRI2X
548 | pP/d3d3/4+Pk/+Li4//P0NH/UGeF/jdYgv86XIf/O16J/zpdiP9RbpH/zM3Q/+Hh4v/k5OT/3t7e/5uk
549 | sP8XNlutAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
550 | AAAXNl2kIERs/2l8k/+dprH/jpmn/zxZef8YOmD/Gjld/iRCZ/4zUnr+OVyG/zteif9RbpL/lKCw/6Or
551 | tf9zhZr/I0du/xU4XcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
552 | AAAAAAAAAAAAAB4+ZK8kSHH/IkZw/yBFbv8eQ2z/HEFq/xxBav8bQGj/GTxk/xg4Xf4kQWf+NVZ//zpd
553 | iP86XYj/NViD/ytPef8jRm//GDdbnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
554 | AAAAAAAAAAAAAAAAAAAAAAAAIkBlbytOd/8rT3n/KEx2/yRJcv8hRW//HkNs/xxBav8bQGn/Gj9o/xg7
555 | Yv8bOV3+ME93/jpch/87Xon/NViC/yNFbOQWN1gXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
556 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcOHEJL0932DZZhP8zV4H/LlJ8/ylNd/8kSHL/IERu/x1C
557 | a/8cQWr/G0Bo/xk9Zf8YN1z+LEpx/jRRe/ovTnW3JkVsIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
558 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoQ2smMlB45Dpch/85XYf/NViD/y5S
559 | fP8nS3X/IUZv/x5DbP8cQWr/G0Bo/xk+Zf8UM1fkAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
560 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtSG0cL091oTNT
561 | fPc6XYj/OVyH/zJWgP8qTnj/I0dx/x9Dbf8cQWr/G0Bo/xY2WvoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
562 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
563 | AAAAAAAALkxyiDpch/87Xon/Ol2I/zZZhP8sUHr/JEly/x9Ebf8cQWn/FjRa0AAAAAAAAAAAAAAAAAAA
564 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
565 | AAAAAAAAAAAAAAAAAAAwT3W9Ol2I/zteif87Xon/O16J/zdahf8tUXv/JUlz/x1AaP8UMlVlAAAAAAAA
566 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
567 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC9Nc4s5W4b/O16J/zteif87Xon/O16J/zdbhf8rT3j/HDpfuwAA
568 | AAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
569 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI0ZpHTRSe/M7XYj/O16J/zteif87Xon/OVuF/yxJ
570 | cskiM2YPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
571 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALktzczlbhv87Xon/Ol2I/zdY
572 | gv8uTHSrLkVzCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
573 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtSG9VOFmD/zlb
574 | hf8zUnnvLUlwZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
575 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACtE
576 | apkuTXLnLkxxkCRIbRUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
577 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
578 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
579 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////4AAAB4AAAAGAAAABAAAAAAAAAAAAAAAAgAAAAcAA
580 | AAHgAAAH8AAAD/AAAA/wAAAP8AAAD/AAAA/4AAAf/AAAf/8AAH/+AAB//gAAf/8AAP//AAH//4AH///A
581 | B///4Af//+AP///gD///8B////g////4////8f///////ygAAAAgAAAAQAAAAAEACAAAAAAAAAgAAAAA
582 | AAAAAAAAAAAAAAAAAAAAAAD/EREQ/xUVFP8dHRz/ICAf/ycnJv8vLy7/MjIx/zU1NP8ZM0z/ACpV/xMv
583 | Uv8TMFL/FDBS/xQxVf8UM1b/FjNW/xU1Vf8cOFT/FTRY/xY0Wf8WNlv/Fjdc/xc3XP8YNlv/Gjdd/xc4
584 | Xf8aOFv/HDlb/xg4Xf8aOV3/GTpf/xo6X/8cOl//Hjpe/wAAf/8YOmH/Gjth/xk8Yv8aPGP/HDxi/x48
585 | Yf8ePmP/GT1k/xo9ZP8aPmb/HD1k/x0+Zf8aP2j/IDxh/yI+Y/8nPmL/ID9k/yY/Zv8cQGf/H0Bm/xtA
586 | aP8cQGn/HUFq/x5BaP8dQmv/H0Nr/x5CbP8fRG3/IEBm/yNAZv8kQmf/KEJn/yBBaP8gQ2r/J0Fo/yRC
587 | aP8nRGj/IERu/yFGb/8kRm7/JkZt/ylDa/8pRGn/K0Vr/yhGa/8rRmz/LEZs/yRIbf8pSG//Kkls/ytK
588 | bv8sSG3/IkZw/yVHcP8jSHH/JEhy/yVJc/8lSnP/Jkp0/ydMdf8pSXD/LUlw/yxKcP8uSnD/L0py/ylM
589 | c/8sTXH/LUxz/y5Mcv8vTXP/KEx2/ytMdP8pTnf/LUx0/y9NdP8tTnb/L051/ypNeP8rTnj/LE94/zBN
590 | dP8wT3b/MU52/y5Qd/8sUHr/LVF7/y5RfP8uUnz/MVBy/zBQdP8xUHf/MFJ3/z1WdP8xUHj/MlF5/zBS
591 | ef8zUnr/NFN7/zBTfv80U3z/MFR+/zNVfP80VHz/NVR9/zVWfv89WXn/P1t7/ztaff8/XX//XFxc/0dc
592 | dv9ZaX7/aGho/3BwcP8yVYD/MlaA/zRXgv82VoD/NFiC/zZYgv83WIH/NlmE/zdahP84WYL/OVqD/zha
593 | hf85WoX/OFyG/zpchv86XYj/O12I/zpeiP87Xoj/RGGC/0hkhP9GZo7/S2qP/1Bohv9bbID/XW2C/19v
594 | hP9TbYr/VW+P/1Fuk/9SbpL/YXGG/2FyiP9jc4j/ZnaL/2d3jP9seov/YXaR/2x9k/9qfZT/c4Wa/3KH
595 | n/96iZz/f4+h/3+Rpv99kav/goKB/4aGhf+Xl5f/nJyb/42Ypf+Omqj/iZmv/5CXoP+VoLD/lqO2/5el
596 | t/+bpbD/nqex/5mmtP+srKz/oKq3/6Srtv+jr73/pLC//6myvv+qtL//t7e3/664xf+yu8b/uL/H/73E
597 | zf/BwMH/wsLC/8XExf/Jx8j/x8vR/83O0f/Lz9X/0NDS/9DU2P/T19z/2tzf/9zc3P/e3d7/397e/9ze
598 | 4P/h4eH/4uLi/+Pj5P/k5OX/5uXm/+fm5//p6en/6urq/+zs7P/u7u7/8PDw//Tz8//09PT/9vb2//f3
599 | +P/5+fn/+/v7//z8/P8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIwwUFRoWExQP
600 | IkZPUWJpfoFtTEAoJBcaGhUUEwwJABATJjA5OTw8ODAtKyhCYomip6iknXldSjw5ODArJBMKEC48PDw8
601 | PDw8PDg8OC0rL0yEoqimpZpyWj88MDAwJA4lP0pKWEpJST4+PDs5PD5+Zi1Eb56oqKWGXj89OjgtEypc
602 | Xl9eXl5eXFpYSrHX8vf37NGON2ehqKeXcko8OS0WNHN5e4iIiHt7eYnT9fr5+vr7+fDBOECCpKiabFg8
603 | Ohcyb6ClpqelpqWhy+Dh4eHh4eHh4d66OCxUnqibcUotDwBimKSmqKimqKa3uLm5ube2sK+uk5I4OS1C
604 | m6iXWR4AAABXdoJwgpiZpbSrpqanpZ6Xc193j0o5OSsyioFHAAAAAAAAFCQnHoDi9/XOpKWnqKikyvD2
605 | 5Ko8PC0hMwAAAAAAABIuSkpl5v7g8PzANXCfpMP489/+6H8+OScNAAAAAAAAHFlrar/6xAEE7Ow9JCBQ
606 | 5/UFAZX8wlo/LQ4AAAAAAAA1a5id1vwDAQHF96k+PH72xgEBAvfbalsuEAAAAAAAAAB0pKja9QEBAZX2
607 | sl5YkPbEAQEB6d2IaioAAAAAAAAAAFeCos33CAEBx/KslnKD79IBAQX21ZtgIgAAAAAAAAAAAFd0u+3Z
608 | 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
636 | AAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAgAEAAMADAADAAwAAwAMAAPAPAADwDwAA8A8AAPg/
637 | AAD8PwAA/D8AAPx/AAD//wAAKAAAABAAAAAgAAAAAQAIAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAA
638 | AP8RERD/FRUU/xcXFv8ZM0z/FDJV/xUyVv8aNFf/HDhU/xU0WP8WNlr/Fzdb/xc3XP8aOFv/GDhe/xk4
639 | Xf8aOV3/Hjpd/wAAf/8YO2H/GTxi/x08Yv8bPWT/Gj5l/xs/Zv8cPWT/HT5l/x4/Zf8jPmP/H0Bm/xtA
640 | aP8cQGn/HUJr/x5Cav8fQmn/HkJs/x9Ebf8kQmf/IkNr/yREav8nRGj/IERt/yFGb/8iRm7/JEZs/yVG
641 | bv8mRm3/K0Zr/ytGbP8mSG7/LUht/yJHcP8jR3H/I0hx/yRIcv8oSHD/Kklw/ylKcv8qSnL/LUpw/y5K
642 | cf8vTHP/KU13/ytNdv8sTnb/L093/ypOeP8wT3b/MU93/yxQev8vUHj/L1J7/y5RfP8xUHf/MVJ7/zJS
643 | e/8zUnr/NFR5/zFUf/8zVH3/NFR9/zVVfv81Vn//OVl9/0BYd/9CXHr/Q118/0Vefv8zVoH/NVeB/zZW
644 | gP81WIP/N1iC/zZZhP84W4b/OVuF/zpchv8+XoT/Ol2I/zteiP8/YIn/SWSD/0pkhP9NaYf/UGmJ/1Fq
645 | i/9Yb43/W3KN/113lv9feJX/aoGc/3KClf9uhaL/coij/4GBgP+JiIj/lZWV/5eXl/+bm5v/ipam/4WW
646 | qv+Jmq7/jJ61/5Cgs/+jo6P/uLi4/6y2w/+wt8H/tLzG/7rCzP/AwMD/wcPH/8PFyP/Mzc3/0dLT/9va
647 | 2v/d3Nz/397f/+Df4P/h4eH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
648 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
649 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
650 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
651 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
652 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
653 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
654 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
655 | AP8SBgoMCRwwPEM4Gw4MCgUEDh8gHx4YGi5PYl0+IR4XCiI1NjUqJGd5eGVGYE4qHxM5WFtbWHeIiYqH
656 | byZbWDMUO1FaXGBqaWhmVlUgGktAEAAIGSKAi3tKYHqKgSsWBwAAET9sfAKFMSeGA3ZtIQYAAABQcHMB
657 | fWFGggFycS0AAAAAMleDdH9iXn51hFQoAAAAAAAVTWssGjpkblMPAAAAAAAAJUdFNSMeHVJBDQAAAAAA
658 | AABJXF1CJB4KAAAAAAAAAAAAAENjYkgpCgAAAAAAAAAAAAA9X2NgNwgAAAAAAAAAAAAAAFpfTDAAAAAA
659 | AAAAAAAAAAA8PAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAIABAADAAwAAwAMAAMADAADwDwAA8A8AAPAP
660 | AAD4PwAA/D8AAPw/AAD8fwAA//8AAA==
661 |
662 |
663 |
--------------------------------------------------------------------------------