From 72c75b457d8d4bbd46e66a277055e5b1f6165849 Mon Sep 17 00:00:00 2001 From: jancoow Date: Thu, 15 Oct 2015 13:02:50 +0200 Subject: [PATCH 01/25] Added start of networkhandler and apihandler --- MusicPlayer/MusicPlayer/APIHandler.cs | 12 +++++++++ MusicPlayer/MusicPlayer/NetworkHandler.cs | 33 +++++++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 MusicPlayer/MusicPlayer/APIHandler.cs create mode 100644 MusicPlayer/MusicPlayer/NetworkHandler.cs diff --git a/MusicPlayer/MusicPlayer/APIHandler.cs b/MusicPlayer/MusicPlayer/APIHandler.cs new file mode 100644 index 0000000..59e719c --- /dev/null +++ b/MusicPlayer/MusicPlayer/APIHandler.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WindowsFormsApplication2 +{ + class APIHandler + { + } +} diff --git a/MusicPlayer/MusicPlayer/NetworkHandler.cs b/MusicPlayer/MusicPlayer/NetworkHandler.cs new file mode 100644 index 0000000..c207af2 --- /dev/null +++ b/MusicPlayer/MusicPlayer/NetworkHandler.cs @@ -0,0 +1,33 @@ +using System.Text; +using System.Net.Sockets; + +namespace WindowsFormsApplication2 +{ + class NetworkHandler + { + private int port = 8585; + private Socket s; + + public NetworkHandler(string ip) + { + s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + s.Connect(ip, port); + } + + public void SendString(string m) + { + byte[] req_as_bytes = Encoding.UTF8.GetBytes(m); + s.Send(req_as_bytes); + } + + public void ReceiveData() + { + while (s.Connected) + { + byte[] data = new byte[1024 * 200]; + int t = s.Receive(data); + //Iets doen met api calls + } + } + } +} From af735a850296534cd29f067ce0aeb7172ff3d3f0 Mon Sep 17 00:00:00 2001 From: jancoow Date: Thu, 15 Oct 2015 13:13:55 +0200 Subject: [PATCH 02/25] Added files to visualstudio --- MusicPlayer/MusicPlayer/MusicPlayer.csproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MusicPlayer/MusicPlayer/MusicPlayer.csproj b/MusicPlayer/MusicPlayer/MusicPlayer.csproj index fa59bcf..b7bb03e 100644 --- a/MusicPlayer/MusicPlayer/MusicPlayer.csproj +++ b/MusicPlayer/MusicPlayer/MusicPlayer.csproj @@ -46,12 +46,14 @@ + Form Form1.cs + From 9364ebddc411a3dde8755e61571c02ca9188dcc3 Mon Sep 17 00:00:00 2001 From: jancoow Date: Thu, 15 Oct 2015 13:41:27 +0200 Subject: [PATCH 03/25] Addes some functionality to networkhandler, fixed wrong namespace --- MusicPlayer/MusicPlayer/APIHandler.cs | 2 +- MusicPlayer/MusicPlayer/NetworkHandler.cs | 10 +++++++--- MusicPlayer/MusicPlayer/Program.cs | 2 ++ 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/MusicPlayer/MusicPlayer/APIHandler.cs b/MusicPlayer/MusicPlayer/APIHandler.cs index 59e719c..39fb4ac 100644 --- a/MusicPlayer/MusicPlayer/APIHandler.cs +++ b/MusicPlayer/MusicPlayer/APIHandler.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace WindowsFormsApplication2 +namespace MusicPlayer { class APIHandler { diff --git a/MusicPlayer/MusicPlayer/NetworkHandler.cs b/MusicPlayer/MusicPlayer/NetworkHandler.cs index c207af2..ad0b8a3 100644 --- a/MusicPlayer/MusicPlayer/NetworkHandler.cs +++ b/MusicPlayer/MusicPlayer/NetworkHandler.cs @@ -1,17 +1,19 @@ using System.Text; using System.Net.Sockets; -namespace WindowsFormsApplication2 +namespace MusicPlayer { class NetworkHandler { private int port = 8585; private Socket s; + private APIHandler api; - public NetworkHandler(string ip) + public NetworkHandler(string ip, APIHandler apihandler) { s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); s.Connect(ip, port); + api = apihandler; } public void SendString(string m) @@ -25,7 +27,9 @@ namespace WindowsFormsApplication2 while (s.Connected) { byte[] data = new byte[1024 * 200]; - int t = s.Receive(data); + s.Receive(data); + string message = Encoding.ASCII.GetString(data); + System.Console.WriteLine(message); //Iets doen met api calls } } diff --git a/MusicPlayer/MusicPlayer/Program.cs b/MusicPlayer/MusicPlayer/Program.cs index 3ce5ccb..f228b57 100644 --- a/MusicPlayer/MusicPlayer/Program.cs +++ b/MusicPlayer/MusicPlayer/Program.cs @@ -17,6 +17,8 @@ namespace MusicPlayer Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); + APIHandler a = new APIHandler; + NetworkHandler nw = new NetworkHandler("imegumii.nl", a); } } } From bfc01b635fa8a62c73b1ea1a071ef89f4d0705c0 Mon Sep 17 00:00:00 2001 From: Kenneth van Ewijk Date: Thu, 15 Oct 2015 13:42:12 +0200 Subject: [PATCH 04/25] Added first gui version --- MusicPlayer/MusicPlayer/Form1.Designer.cs | 39 ------ .../MusicPlayer/{Form1.cs => MainForm.cs} | 4 +- MusicPlayer/MusicPlayer/MainForm.resx | 123 ++++++++++++++++++ MusicPlayer/MusicPlayer/MusicPlayer.csproj | 9 +- MusicPlayer/MusicPlayer/Program.cs | 2 +- 5 files changed, 132 insertions(+), 45 deletions(-) delete mode 100644 MusicPlayer/MusicPlayer/Form1.Designer.cs rename MusicPlayer/MusicPlayer/{Form1.cs => MainForm.cs} (82%) create mode 100644 MusicPlayer/MusicPlayer/MainForm.resx diff --git a/MusicPlayer/MusicPlayer/Form1.Designer.cs b/MusicPlayer/MusicPlayer/Form1.Designer.cs deleted file mode 100644 index a88eefc..0000000 --- a/MusicPlayer/MusicPlayer/Form1.Designer.cs +++ /dev/null @@ -1,39 +0,0 @@ -namespace MusicPlayer -{ - partial class Form1 - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Text = "Form1"; - } - - #endregion - } -} - diff --git a/MusicPlayer/MusicPlayer/Form1.cs b/MusicPlayer/MusicPlayer/MainForm.cs similarity index 82% rename from MusicPlayer/MusicPlayer/Form1.cs rename to MusicPlayer/MusicPlayer/MainForm.cs index 7e57f6c..7df1874 100644 --- a/MusicPlayer/MusicPlayer/Form1.cs +++ b/MusicPlayer/MusicPlayer/MainForm.cs @@ -10,9 +10,9 @@ using System.Windows.Forms; namespace MusicPlayer { - public partial class Form1 : Form + public partial class MainForm : Form { - public Form1() + public MainForm() { InitializeComponent(); } diff --git a/MusicPlayer/MusicPlayer/MainForm.resx b/MusicPlayer/MusicPlayer/MainForm.resx new file mode 100644 index 0000000..9a59bef --- /dev/null +++ b/MusicPlayer/MusicPlayer/MainForm.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 118, 17 + + \ No newline at end of file diff --git a/MusicPlayer/MusicPlayer/MusicPlayer.csproj b/MusicPlayer/MusicPlayer/MusicPlayer.csproj index fa59bcf..e25b830 100644 --- a/MusicPlayer/MusicPlayer/MusicPlayer.csproj +++ b/MusicPlayer/MusicPlayer/MusicPlayer.csproj @@ -46,14 +46,17 @@ - + Form - - Form1.cs + + MainForm.cs + + MainForm.cs + ResXFileCodeGenerator Resources.Designer.cs diff --git a/MusicPlayer/MusicPlayer/Program.cs b/MusicPlayer/MusicPlayer/Program.cs index 3ce5ccb..ec91107 100644 --- a/MusicPlayer/MusicPlayer/Program.cs +++ b/MusicPlayer/MusicPlayer/Program.cs @@ -16,7 +16,7 @@ namespace MusicPlayer { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new Form1()); + Application.Run(new MainForm()); } } } From a9a104bd41841d077d01a6f81ca8e6d6123f2e8f Mon Sep 17 00:00:00 2001 From: Yorick Rommers Date: Thu, 15 Oct 2015 13:42:38 +0200 Subject: [PATCH 05/25] Added class stubs --- MusicPlayer/MusicPlayer/APIHandler.cs | 18 +++- MusicPlayer/MusicPlayer/Album.cs | 10 ++ MusicPlayer/MusicPlayer/Artist.cs | 10 ++ MusicPlayer/MusicPlayer/Form1.cs | 4 + MusicPlayer/MusicPlayer/Form1.resx | 120 ++++++++++++++++++++++ MusicPlayer/MusicPlayer/NetworkHandler.cs | 3 +- MusicPlayer/MusicPlayer/packages.config | 4 + 7 files changed, 167 insertions(+), 2 deletions(-) create mode 100644 MusicPlayer/MusicPlayer/Album.cs create mode 100644 MusicPlayer/MusicPlayer/Artist.cs create mode 100644 MusicPlayer/MusicPlayer/Form1.resx create mode 100644 MusicPlayer/MusicPlayer/packages.config diff --git a/MusicPlayer/MusicPlayer/APIHandler.cs b/MusicPlayer/MusicPlayer/APIHandler.cs index 59e719c..333f385 100644 --- a/MusicPlayer/MusicPlayer/APIHandler.cs +++ b/MusicPlayer/MusicPlayer/APIHandler.cs @@ -3,10 +3,26 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using MusicPlayer; +using Newtonsoft.Json; namespace WindowsFormsApplication2 { - class APIHandler + internal class APIHandler { + public APIHandler() + { + + } + + public List GetArtists() + { + return null; + } + + public List GetAlbums() + { + return null; + } } } diff --git a/MusicPlayer/MusicPlayer/Album.cs b/MusicPlayer/MusicPlayer/Album.cs new file mode 100644 index 0000000..1ad2279 --- /dev/null +++ b/MusicPlayer/MusicPlayer/Album.cs @@ -0,0 +1,10 @@ +namespace MusicPlayer +{ + public class Album + { + public Album() + { + + } + } +} \ No newline at end of file diff --git a/MusicPlayer/MusicPlayer/Artist.cs b/MusicPlayer/MusicPlayer/Artist.cs new file mode 100644 index 0000000..1013585 --- /dev/null +++ b/MusicPlayer/MusicPlayer/Artist.cs @@ -0,0 +1,10 @@ +namespace MusicPlayer +{ + public class Artist + { + public Artist() + { + + } + } +} \ No newline at end of file diff --git a/MusicPlayer/MusicPlayer/Form1.cs b/MusicPlayer/MusicPlayer/Form1.cs index 7e57f6c..9561207 100644 --- a/MusicPlayer/MusicPlayer/Form1.cs +++ b/MusicPlayer/MusicPlayer/Form1.cs @@ -7,6 +7,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; +using WindowsFormsApplication2; namespace MusicPlayer { @@ -15,6 +16,9 @@ namespace MusicPlayer public Form1() { InitializeComponent(); + NetworkHandler nw = new NetworkHandler("83.128.250.123"); + + } } } diff --git a/MusicPlayer/MusicPlayer/Form1.resx b/MusicPlayer/MusicPlayer/Form1.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/MusicPlayer/MusicPlayer/Form1.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/MusicPlayer/MusicPlayer/NetworkHandler.cs b/MusicPlayer/MusicPlayer/NetworkHandler.cs index c207af2..39f34f9 100644 --- a/MusicPlayer/MusicPlayer/NetworkHandler.cs +++ b/MusicPlayer/MusicPlayer/NetworkHandler.cs @@ -1,4 +1,5 @@ -using System.Text; +using System; +using System.Text; using System.Net.Sockets; namespace WindowsFormsApplication2 diff --git a/MusicPlayer/MusicPlayer/packages.config b/MusicPlayer/MusicPlayer/packages.config new file mode 100644 index 0000000..64b5d8e --- /dev/null +++ b/MusicPlayer/MusicPlayer/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file From 9a84ae5586afd2c0721e73711548fb4e73645aed Mon Sep 17 00:00:00 2001 From: Kenneth van Ewijk Date: Thu, 15 Oct 2015 13:45:57 +0200 Subject: [PATCH 06/25] Added missing files --- MusicPlayer/MusicPlayer/MainForm.Designer.cs | 160 +++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 MusicPlayer/MusicPlayer/MainForm.Designer.cs diff --git a/MusicPlayer/MusicPlayer/MainForm.Designer.cs b/MusicPlayer/MusicPlayer/MainForm.Designer.cs new file mode 100644 index 0000000..7806551 --- /dev/null +++ b/MusicPlayer/MusicPlayer/MainForm.Designer.cs @@ -0,0 +1,160 @@ +namespace MusicPlayer +{ + partial class MainForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SongsTable = new System.Windows.Forms.DataGridView(); + this.GenreListBox = new System.Windows.Forms.ListBox(); + this.AlbumListView = new System.Windows.Forms.ListView(); + this.ArtistListBox = new System.Windows.Forms.ListBox(); + this.MainPanel = new System.Windows.Forms.Panel(); + this.MenuStrip = new System.Windows.Forms.MenuStrip(); + this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + ((System.ComponentModel.ISupportInitialize)(this.SongsTable)).BeginInit(); + this.MainPanel.SuspendLayout(); + this.MenuStrip.SuspendLayout(); + this.SuspendLayout(); + // + // SongsTable + // + this.SongsTable.AllowUserToAddRows = false; + this.SongsTable.AllowUserToDeleteRows = false; + this.SongsTable.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.SongsTable.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.SongsTable.Location = new System.Drawing.Point(12, 153); + this.SongsTable.Name = "SongsTable"; + this.SongsTable.ReadOnly = true; + this.SongsTable.Size = new System.Drawing.Size(784, 182); + this.SongsTable.TabIndex = 0; + // + // GenreListBox + // + this.GenreListBox.FormattingEnabled = true; + this.GenreListBox.Location = new System.Drawing.Point(12, 12); + this.GenreListBox.Name = "GenreListBox"; + this.GenreListBox.Size = new System.Drawing.Size(124, 134); + this.GenreListBox.TabIndex = 1; + // + // AlbumListView + // + this.AlbumListView.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.AlbumListView.Location = new System.Drawing.Point(272, 12); + this.AlbumListView.Name = "AlbumListView"; + this.AlbumListView.Size = new System.Drawing.Size(524, 134); + this.AlbumListView.TabIndex = 2; + this.AlbumListView.UseCompatibleStateImageBehavior = false; + // + // ArtistListBox + // + this.ArtistListBox.FormattingEnabled = true; + this.ArtistListBox.Location = new System.Drawing.Point(142, 12); + this.ArtistListBox.Name = "ArtistListBox"; + this.ArtistListBox.Size = new System.Drawing.Size(124, 134); + this.ArtistListBox.TabIndex = 3; + // + // MainPanel + // + this.MainPanel.Controls.Add(this.GenreListBox); + this.MainPanel.Controls.Add(this.ArtistListBox); + this.MainPanel.Controls.Add(this.AlbumListView); + this.MainPanel.Controls.Add(this.SongsTable); + this.MainPanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.MainPanel.Location = new System.Drawing.Point(0, 24); + this.MainPanel.Name = "MainPanel"; + this.MainPanel.Size = new System.Drawing.Size(808, 347); + this.MainPanel.TabIndex = 5; + // + // MenuStrip + // + this.MenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.fileToolStripMenuItem}); + this.MenuStrip.Location = new System.Drawing.Point(0, 0); + this.MenuStrip.Name = "MenuStrip"; + this.MenuStrip.Size = new System.Drawing.Size(808, 24); + this.MenuStrip.TabIndex = 6; + this.MenuStrip.Text = "Menu"; + // + // fileToolStripMenuItem + // + this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.openToolStripMenuItem, + this.saveToolStripMenuItem}); + this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; + this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20); + this.fileToolStripMenuItem.Text = "File"; + // + // openToolStripMenuItem + // + this.openToolStripMenuItem.Name = "openToolStripMenuItem"; + this.openToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.openToolStripMenuItem.Text = "Open"; + // + // saveToolStripMenuItem + // + this.saveToolStripMenuItem.Name = "saveToolStripMenuItem"; + this.saveToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.saveToolStripMenuItem.Text = "Save"; + // + // MainForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(808, 371); + this.Controls.Add(this.MainPanel); + this.Controls.Add(this.MenuStrip); + this.MainMenuStrip = this.MenuStrip; + this.Name = "MainForm"; + this.Text = "YJMPD Music Player"; + ((System.ComponentModel.ISupportInitialize)(this.SongsTable)).EndInit(); + this.MainPanel.ResumeLayout(false); + this.MenuStrip.ResumeLayout(false); + this.MenuStrip.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.DataGridView SongsTable; + private System.Windows.Forms.ListBox GenreListBox; + private System.Windows.Forms.ListView AlbumListView; + private System.Windows.Forms.ListBox ArtistListBox; + private System.Windows.Forms.Panel MainPanel; + private System.Windows.Forms.MenuStrip MenuStrip; + private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem; + } +} + From f643ff29673c557b99abd189c0d6908fcb0c8c73 Mon Sep 17 00:00:00 2001 From: Yorick Rommers Date: Thu, 15 Oct 2015 13:50:52 +0200 Subject: [PATCH 07/25] Fixed errors. --- MusicPlayer/MusicPlayer/Form1.cs | 6 +++--- MusicPlayer/MusicPlayer/MusicPlayer.csproj | 10 ++++++++++ MusicPlayer/MusicPlayer/NetworkHandler.cs | 2 ++ MusicPlayer/MusicPlayer/Program.cs | 2 -- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/MusicPlayer/MusicPlayer/Form1.cs b/MusicPlayer/MusicPlayer/Form1.cs index 9561207..8c520e3 100644 --- a/MusicPlayer/MusicPlayer/Form1.cs +++ b/MusicPlayer/MusicPlayer/Form1.cs @@ -7,7 +7,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; -using WindowsFormsApplication2; + namespace MusicPlayer { @@ -16,8 +16,8 @@ namespace MusicPlayer public Form1() { InitializeComponent(); - NetworkHandler nw = new NetworkHandler("83.128.250.123"); - + APIHandler api = new APIHandler(); + NetworkHandler nw = new NetworkHandler("83.128.250.123", api); } } diff --git a/MusicPlayer/MusicPlayer/MusicPlayer.csproj b/MusicPlayer/MusicPlayer/MusicPlayer.csproj index b7bb03e..785b0ef 100644 --- a/MusicPlayer/MusicPlayer/MusicPlayer.csproj +++ b/MusicPlayer/MusicPlayer/MusicPlayer.csproj @@ -33,6 +33,10 @@ 4 + + ..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll + True + @@ -46,7 +50,9 @@ + + Form @@ -56,6 +62,9 @@ + + Form1.cs + ResXFileCodeGenerator Resources.Designer.cs @@ -65,6 +74,7 @@ True Resources.resx + SettingsSingleFileGenerator Settings.Designer.cs diff --git a/MusicPlayer/MusicPlayer/NetworkHandler.cs b/MusicPlayer/MusicPlayer/NetworkHandler.cs index 6c1265e..a9e1bc6 100644 --- a/MusicPlayer/MusicPlayer/NetworkHandler.cs +++ b/MusicPlayer/MusicPlayer/NetworkHandler.cs @@ -1,6 +1,7 @@ using System; using System.Text; using System.Net.Sockets; +using System.Threading; namespace MusicPlayer { @@ -15,6 +16,7 @@ namespace MusicPlayer s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); s.Connect(ip, port); api = apihandler; + SendString("GET"); } public void SendString(string m) diff --git a/MusicPlayer/MusicPlayer/Program.cs b/MusicPlayer/MusicPlayer/Program.cs index f228b57..3ce5ccb 100644 --- a/MusicPlayer/MusicPlayer/Program.cs +++ b/MusicPlayer/MusicPlayer/Program.cs @@ -17,8 +17,6 @@ namespace MusicPlayer Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); - APIHandler a = new APIHandler; - NetworkHandler nw = new NetworkHandler("imegumii.nl", a); } } } From eb5e1254b07f6683ce234ed7375d09a85fe31944 Mon Sep 17 00:00:00 2001 From: Yorick Rommers Date: Thu, 15 Oct 2015 13:55:42 +0200 Subject: [PATCH 08/25] Added some fields to stubs --- MusicPlayer/MusicPlayer/Album.cs | 6 ++++-- MusicPlayer/MusicPlayer/Artist.cs | 7 +++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/MusicPlayer/MusicPlayer/Album.cs b/MusicPlayer/MusicPlayer/Album.cs index 1ad2279..c1d00ad 100644 --- a/MusicPlayer/MusicPlayer/Album.cs +++ b/MusicPlayer/MusicPlayer/Album.cs @@ -2,9 +2,11 @@ { public class Album { - public Album() + public string albumnaam { get; set; } + + public Album(string albumnaam) { - + this.albumnaam = albumnaam; } } } \ No newline at end of file diff --git a/MusicPlayer/MusicPlayer/Artist.cs b/MusicPlayer/MusicPlayer/Artist.cs index 1013585..bf3efd7 100644 --- a/MusicPlayer/MusicPlayer/Artist.cs +++ b/MusicPlayer/MusicPlayer/Artist.cs @@ -2,9 +2,12 @@ { public class Artist { - public Artist() + public string naam { get; set; } + + public Artist(string naam) { - + this.naam = naam; + } } } \ No newline at end of file From c2e603efaf550ddd9b2bcc103a0958e02060ba8b Mon Sep 17 00:00:00 2001 From: Kenneth van Ewijk Date: Thu, 15 Oct 2015 13:58:08 +0200 Subject: [PATCH 09/25] Added Jsonsoft Nuget! --- MusicPlayer/MusicPlayer/packages.config | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 MusicPlayer/MusicPlayer/packages.config diff --git a/MusicPlayer/MusicPlayer/packages.config b/MusicPlayer/MusicPlayer/packages.config new file mode 100644 index 0000000..64b5d8e --- /dev/null +++ b/MusicPlayer/MusicPlayer/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file From 78c86d56808e1a49943a24e9a20cab3d9c7f82c6 Mon Sep 17 00:00:00 2001 From: jancoow Date: Thu, 15 Oct 2015 13:58:33 +0200 Subject: [PATCH 10/25] Added receivedata to a thread --- MusicPlayer/MusicPlayer/APIHandler.cs | 1 - MusicPlayer/MusicPlayer/MusicPlayer.csproj | 8 -------- MusicPlayer/MusicPlayer/NetworkHandler.cs | 7 ++++--- 3 files changed, 4 insertions(+), 12 deletions(-) diff --git a/MusicPlayer/MusicPlayer/APIHandler.cs b/MusicPlayer/MusicPlayer/APIHandler.cs index d028507..92583ea 100644 --- a/MusicPlayer/MusicPlayer/APIHandler.cs +++ b/MusicPlayer/MusicPlayer/APIHandler.cs @@ -4,7 +4,6 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using MusicPlayer; -using Newtonsoft.Json; namespace MusicPlayer { diff --git a/MusicPlayer/MusicPlayer/MusicPlayer.csproj b/MusicPlayer/MusicPlayer/MusicPlayer.csproj index 785b0ef..10a36ec 100644 --- a/MusicPlayer/MusicPlayer/MusicPlayer.csproj +++ b/MusicPlayer/MusicPlayer/MusicPlayer.csproj @@ -33,10 +33,6 @@ 4 - - ..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll - True - @@ -62,9 +58,6 @@ - - Form1.cs - ResXFileCodeGenerator Resources.Designer.cs @@ -74,7 +67,6 @@ True Resources.resx - SettingsSingleFileGenerator Settings.Designer.cs diff --git a/MusicPlayer/MusicPlayer/NetworkHandler.cs b/MusicPlayer/MusicPlayer/NetworkHandler.cs index a9e1bc6..2ac9dcf 100644 --- a/MusicPlayer/MusicPlayer/NetworkHandler.cs +++ b/MusicPlayer/MusicPlayer/NetworkHandler.cs @@ -1,5 +1,4 @@ -using System; -using System.Text; +using System.Text; using System.Net.Sockets; using System.Threading; @@ -15,8 +14,10 @@ namespace MusicPlayer { s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); s.Connect(ip, port); + ThreadStart thread = new ThreadStart(ReceiveData); + Thread childThread = new Thread(thread); + childThread.Start(); api = apihandler; - SendString("GET"); } public void SendString(string m) From 3f1483beeb655565f4b84a4eb3c8409f465c789a Mon Sep 17 00:00:00 2001 From: Kenneth van Ewijk Date: Thu, 15 Oct 2015 14:07:47 +0200 Subject: [PATCH 11/25] Fixed file --- MusicPlayer/MusicPlayer/MusicPlayer.csproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MusicPlayer/MusicPlayer/MusicPlayer.csproj b/MusicPlayer/MusicPlayer/MusicPlayer.csproj index fd24d57..f2a72b6 100644 --- a/MusicPlayer/MusicPlayer/MusicPlayer.csproj +++ b/MusicPlayer/MusicPlayer/MusicPlayer.csproj @@ -46,12 +46,12 @@ - + + Form + - Form - MainForm.cs From 6acb6ecd7a3187d54c553a58c858f4900ad8e719 Mon Sep 17 00:00:00 2001 From: Kenneth van Ewijk Date: Thu, 15 Oct 2015 14:11:16 +0200 Subject: [PATCH 12/25] Bugfixes --- MusicPlayer/MusicPlayer/MusicPlayer.csproj | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/MusicPlayer/MusicPlayer/MusicPlayer.csproj b/MusicPlayer/MusicPlayer/MusicPlayer.csproj index fd24d57..359d999 100644 --- a/MusicPlayer/MusicPlayer/MusicPlayer.csproj +++ b/MusicPlayer/MusicPlayer/MusicPlayer.csproj @@ -1,4 +1,4 @@ - + @@ -46,12 +46,12 @@ - + + Form + - Form - MainForm.cs @@ -91,4 +91,4 @@ --> - \ No newline at end of file + From bdf6366dc024374766271eb17fa826c727dd07b9 Mon Sep 17 00:00:00 2001 From: Yorick Rommers Date: Thu, 15 Oct 2015 14:36:51 +0200 Subject: [PATCH 13/25] Werkt nog niet --- MusicPlayer/MusicPlayer/Form1.Designer.cs | 11 ++++++++- MusicPlayer/MusicPlayer/Form1.cs | 8 +++++-- MusicPlayer/MusicPlayer/MusicPlayer.csproj | 3 +++ MusicPlayer/MusicPlayer/NetworkHandler.cs | 28 +++++++++++++++------- MusicPlayer/MusicPlayer/Program.cs | 3 +++ 5 files changed, 42 insertions(+), 11 deletions(-) diff --git a/MusicPlayer/MusicPlayer/Form1.Designer.cs b/MusicPlayer/MusicPlayer/Form1.Designer.cs index a88eefc..397e6d1 100644 --- a/MusicPlayer/MusicPlayer/Form1.Designer.cs +++ b/MusicPlayer/MusicPlayer/Form1.Designer.cs @@ -28,9 +28,18 @@ /// private void InitializeComponent() { - this.components = new System.ComponentModel.Container(); + this.SuspendLayout(); + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(284, 261); + this.Name = "Form1"; this.Text = "Form1"; + this.Load += new System.EventHandler(this.Form1_Load); + this.ResumeLayout(false); + } #endregion diff --git a/MusicPlayer/MusicPlayer/Form1.cs b/MusicPlayer/MusicPlayer/Form1.cs index 8c520e3..95b1daa 100644 --- a/MusicPlayer/MusicPlayer/Form1.cs +++ b/MusicPlayer/MusicPlayer/Form1.cs @@ -16,8 +16,12 @@ namespace MusicPlayer public Form1() { InitializeComponent(); - APIHandler api = new APIHandler(); - NetworkHandler nw = new NetworkHandler("83.128.250.123", api); +// nw.SendString("GET / HTTP/1.1"); + + } + + private void Form1_Load(object sender, EventArgs e) + { } } diff --git a/MusicPlayer/MusicPlayer/MusicPlayer.csproj b/MusicPlayer/MusicPlayer/MusicPlayer.csproj index 10a36ec..6d954a9 100644 --- a/MusicPlayer/MusicPlayer/MusicPlayer.csproj +++ b/MusicPlayer/MusicPlayer/MusicPlayer.csproj @@ -58,6 +58,9 @@ + + Form1.cs + ResXFileCodeGenerator Resources.Designer.cs diff --git a/MusicPlayer/MusicPlayer/NetworkHandler.cs b/MusicPlayer/MusicPlayer/NetworkHandler.cs index 2ac9dcf..71a7884 100644 --- a/MusicPlayer/MusicPlayer/NetworkHandler.cs +++ b/MusicPlayer/MusicPlayer/NetworkHandler.cs @@ -1,4 +1,5 @@ -using System.Text; +using System; +using System.Text; using System.Net.Sockets; using System.Threading; @@ -7,13 +8,16 @@ namespace MusicPlayer class NetworkHandler { private int port = 8585; - private Socket s; + private TcpClient s; + private NetworkStream serverStream; private APIHandler api; public NetworkHandler(string ip, APIHandler apihandler) { - s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + Console.WriteLine("Hello"); + s = new TcpClient(); s.Connect(ip, port); + serverStream = s.GetStream(); ThreadStart thread = new ThreadStart(ReceiveData); Thread childThread = new Thread(thread); childThread.Start(); @@ -21,17 +25,25 @@ namespace MusicPlayer } public void SendString(string m) - { - byte[] req_as_bytes = Encoding.UTF8.GetBytes(m); - s.Send(req_as_bytes); + { + byte[] b = Encoding.UTF8.GetBytes(m); + serverStream.Write(b, 0, b.Length); + serverStream.Flush(); } public void ReceiveData() { + Console.WriteLine("Hello2"); while (s.Connected) { - byte[] data = new byte[1024 * 200]; - s.Receive(data); + Console.WriteLine("Hello3"); + byte[] data = new byte[512]; + Console.WriteLine("Hang je hier?"); + int bytesRec = serverStream.Read(data, 0, data.Length); + Console.WriteLine("ën hier? "); + Console.WriteLine("Echoed test = {0}",Encoding.ASCII.GetString(data, 0, bytesRec)); + + string message = Encoding.ASCII.GetString(data); System.Console.WriteLine(message); //Iets doen met api calls diff --git a/MusicPlayer/MusicPlayer/Program.cs b/MusicPlayer/MusicPlayer/Program.cs index 3ce5ccb..54e8133 100644 --- a/MusicPlayer/MusicPlayer/Program.cs +++ b/MusicPlayer/MusicPlayer/Program.cs @@ -14,6 +14,9 @@ namespace MusicPlayer [STAThread] static void Main() { + APIHandler api = new APIHandler(); + NetworkHandler nw = new NetworkHandler("www.imegumii.nl", api); + nw.SendString("GET /getsongbyid?id=102 HTTP/1.1"); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); From 5491f1d1656b02d817bd6e507857a7b7be53780b Mon Sep 17 00:00:00 2001 From: Kenneth van Ewijk Date: Thu, 15 Oct 2015 14:52:10 +0200 Subject: [PATCH 14/25] Updated GUI --- MusicPlayer/MusicPlayer/MainForm.Designer.cs | 51 ++++++++++++-------- MusicPlayer/MusicPlayer/MainForm.cs | 28 ++++++++++- MusicPlayer/MusicPlayer/MusicPlayer.csproj | 6 ++- MusicPlayer/MusicPlayer/Song.cs | 22 +++++++++ MusicPlayer/MusicPlayer/SongsTable.cs | 26 ++++++++++ 5 files changed, 109 insertions(+), 24 deletions(-) create mode 100644 MusicPlayer/MusicPlayer/Song.cs create mode 100644 MusicPlayer/MusicPlayer/SongsTable.cs diff --git a/MusicPlayer/MusicPlayer/MainForm.Designer.cs b/MusicPlayer/MusicPlayer/MainForm.Designer.cs index 7806551..844589c 100644 --- a/MusicPlayer/MusicPlayer/MainForm.Designer.cs +++ b/MusicPlayer/MusicPlayer/MainForm.Designer.cs @@ -28,7 +28,7 @@ /// private void InitializeComponent() { - this.SongsTable = new System.Windows.Forms.DataGridView(); + this.SongsTableView = new System.Windows.Forms.DataGridView(); this.GenreListBox = new System.Windows.Forms.ListBox(); this.AlbumListView = new System.Windows.Forms.ListView(); this.ArtistListBox = new System.Windows.Forms.ListBox(); @@ -37,24 +37,29 @@ this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - ((System.ComponentModel.ISupportInitialize)(this.SongsTable)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.SongsTableView)).BeginInit(); this.MainPanel.SuspendLayout(); this.MenuStrip.SuspendLayout(); this.SuspendLayout(); // - // SongsTable + // SongsTableView // - this.SongsTable.AllowUserToAddRows = false; - this.SongsTable.AllowUserToDeleteRows = false; - this.SongsTable.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + this.SongsTableView.AllowUserToAddRows = false; + this.SongsTableView.AllowUserToDeleteRows = false; + this.SongsTableView.AllowUserToResizeRows = false; + this.SongsTableView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.SongsTable.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; - this.SongsTable.Location = new System.Drawing.Point(12, 153); - this.SongsTable.Name = "SongsTable"; - this.SongsTable.ReadOnly = true; - this.SongsTable.Size = new System.Drawing.Size(784, 182); - this.SongsTable.TabIndex = 0; + this.SongsTableView.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill; + this.SongsTableView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.SongsTableView.Location = new System.Drawing.Point(12, 153); + this.SongsTableView.MultiSelect = false; + this.SongsTableView.Name = "SongsTableView"; + this.SongsTableView.ReadOnly = true; + this.SongsTableView.RowHeadersVisible = false; + this.SongsTableView.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.SongsTableView.Size = new System.Drawing.Size(760, 172); + this.SongsTableView.TabIndex = 0; // // GenreListBox // @@ -62,6 +67,7 @@ this.GenreListBox.Location = new System.Drawing.Point(12, 12); this.GenreListBox.Name = "GenreListBox"; this.GenreListBox.Size = new System.Drawing.Size(124, 134); + this.GenreListBox.Sorted = true; this.GenreListBox.TabIndex = 1; // // AlbumListView @@ -70,7 +76,8 @@ | System.Windows.Forms.AnchorStyles.Right))); this.AlbumListView.Location = new System.Drawing.Point(272, 12); this.AlbumListView.Name = "AlbumListView"; - this.AlbumListView.Size = new System.Drawing.Size(524, 134); + this.AlbumListView.Size = new System.Drawing.Size(500, 134); + this.AlbumListView.Sorting = System.Windows.Forms.SortOrder.Ascending; this.AlbumListView.TabIndex = 2; this.AlbumListView.UseCompatibleStateImageBehavior = false; // @@ -80,6 +87,7 @@ this.ArtistListBox.Location = new System.Drawing.Point(142, 12); this.ArtistListBox.Name = "ArtistListBox"; this.ArtistListBox.Size = new System.Drawing.Size(124, 134); + this.ArtistListBox.Sorted = true; this.ArtistListBox.TabIndex = 3; // // MainPanel @@ -87,11 +95,11 @@ this.MainPanel.Controls.Add(this.GenreListBox); this.MainPanel.Controls.Add(this.ArtistListBox); this.MainPanel.Controls.Add(this.AlbumListView); - this.MainPanel.Controls.Add(this.SongsTable); + this.MainPanel.Controls.Add(this.SongsTableView); this.MainPanel.Dock = System.Windows.Forms.DockStyle.Fill; this.MainPanel.Location = new System.Drawing.Point(0, 24); this.MainPanel.Name = "MainPanel"; - this.MainPanel.Size = new System.Drawing.Size(808, 347); + this.MainPanel.Size = new System.Drawing.Size(784, 337); this.MainPanel.TabIndex = 5; // // MenuStrip @@ -100,7 +108,7 @@ this.fileToolStripMenuItem}); this.MenuStrip.Location = new System.Drawing.Point(0, 0); this.MenuStrip.Name = "MenuStrip"; - this.MenuStrip.Size = new System.Drawing.Size(808, 24); + this.MenuStrip.Size = new System.Drawing.Size(784, 24); this.MenuStrip.TabIndex = 6; this.MenuStrip.Text = "Menu"; // @@ -116,26 +124,27 @@ // openToolStripMenuItem // this.openToolStripMenuItem.Name = "openToolStripMenuItem"; - this.openToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.openToolStripMenuItem.Size = new System.Drawing.Size(103, 22); this.openToolStripMenuItem.Text = "Open"; // // saveToolStripMenuItem // this.saveToolStripMenuItem.Name = "saveToolStripMenuItem"; - this.saveToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.saveToolStripMenuItem.Size = new System.Drawing.Size(103, 22); this.saveToolStripMenuItem.Text = "Save"; // // MainForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(808, 371); + this.ClientSize = new System.Drawing.Size(784, 361); this.Controls.Add(this.MainPanel); this.Controls.Add(this.MenuStrip); this.MainMenuStrip = this.MenuStrip; + this.MinimumSize = new System.Drawing.Size(800, 400); this.Name = "MainForm"; this.Text = "YJMPD Music Player"; - ((System.ComponentModel.ISupportInitialize)(this.SongsTable)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.SongsTableView)).EndInit(); this.MainPanel.ResumeLayout(false); this.MenuStrip.ResumeLayout(false); this.MenuStrip.PerformLayout(); @@ -146,7 +155,7 @@ #endregion - private System.Windows.Forms.DataGridView SongsTable; + private System.Windows.Forms.DataGridView SongsTableView; private System.Windows.Forms.ListBox GenreListBox; private System.Windows.Forms.ListView AlbumListView; private System.Windows.Forms.ListBox ArtistListBox; diff --git a/MusicPlayer/MusicPlayer/MainForm.cs b/MusicPlayer/MusicPlayer/MainForm.cs index 3bc9e55..58b59ab 100644 --- a/MusicPlayer/MusicPlayer/MainForm.cs +++ b/MusicPlayer/MusicPlayer/MainForm.cs @@ -13,12 +13,36 @@ namespace MusicPlayer { public partial class MainForm : Form { + private SongsTable table; + public MainForm() { InitializeComponent(); - APIHandler api = new APIHandler(); - NetworkHandler nw = new NetworkHandler("83.128.250.123", api); + //APIHandler api = new APIHandler(); + //NetworkHandler nw = new NetworkHandler("83.128.250.123", api); + table = new SongsTable(); + SongsTableView.DataSource = table; + Populate(); + } + + private void Populate() + { + table.Add(new Song("Test Song 1", "Test Album 1", "Test Artist 1")); + + GenreListBox.Items.Add("Hardcore"); + GenreListBox.Items.Add("Hardstyle"); + GenreListBox.Items.Add("Pop"); + + ArtistListBox.Items.Add("Kygo"); + ArtistListBox.Items.Add("Monstercat"); + ArtistListBox.Items.Add("Mozart"); + + AlbumListView.Items.Add("Album 1"); + AlbumListView.Items.Add("Album 2"); + AlbumListView.Items.Add("Album 3"); + + table.Add(new Song("Test Song 2", "Test Album 2", "Test Artist 2")); } } } diff --git a/MusicPlayer/MusicPlayer/MusicPlayer.csproj b/MusicPlayer/MusicPlayer/MusicPlayer.csproj index f2a72b6..b2e5501 100644 --- a/MusicPlayer/MusicPlayer/MusicPlayer.csproj +++ b/MusicPlayer/MusicPlayer/MusicPlayer.csproj @@ -46,7 +46,7 @@ - + Form @@ -58,6 +58,10 @@ + + + Component + MainForm.cs diff --git a/MusicPlayer/MusicPlayer/Song.cs b/MusicPlayer/MusicPlayer/Song.cs new file mode 100644 index 0000000..45db72c --- /dev/null +++ b/MusicPlayer/MusicPlayer/Song.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MusicPlayer +{ + class Song + { + public string Name { get; set; } + public string Album { get; set; } + public string Artist { get; set; } + + public Song(string name, string album, string artist) + { + Name = name; + Album = album; + Artist = artist; + } + } +} diff --git a/MusicPlayer/MusicPlayer/SongsTable.cs b/MusicPlayer/MusicPlayer/SongsTable.cs new file mode 100644 index 0000000..7c63801 --- /dev/null +++ b/MusicPlayer/MusicPlayer/SongsTable.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MusicPlayer +{ + class SongsTable : DataTable + { + public SongsTable() : base() + { + this.Columns.Clear(); + this.Columns.Add("Naam", typeof(string)); + this.Columns.Add("Album", typeof(string)); + this.Columns.Add("Artiest", typeof(string)); + } + + public void Add(Song s) + { + this.Rows.Add(s.Name, s.Album, s.Artist); + } + + } +} From 8b6efac7384cf6893a4bae06d7ad1ac4c83b9101 Mon Sep 17 00:00:00 2001 From: jancoow Date: Thu, 15 Oct 2015 14:57:59 +0200 Subject: [PATCH 15/25] Added a working server connector --- MusicPlayer/MusicPlayer/NetworkHandler.cs | 51 ++++++++++------------- MusicPlayer/MusicPlayer/Program.cs | 4 +- 2 files changed, 23 insertions(+), 32 deletions(-) diff --git a/MusicPlayer/MusicPlayer/NetworkHandler.cs b/MusicPlayer/MusicPlayer/NetworkHandler.cs index 71a7884..9ea31a4 100644 --- a/MusicPlayer/MusicPlayer/NetworkHandler.cs +++ b/MusicPlayer/MusicPlayer/NetworkHandler.cs @@ -2,52 +2,43 @@ using System.Text; using System.Net.Sockets; using System.Threading; +using System.Net; +using System.IO; namespace MusicPlayer { class NetworkHandler { private int port = 8585; - private TcpClient s; - private NetworkStream serverStream; + private string ip; private APIHandler api; public NetworkHandler(string ip, APIHandler apihandler) { - Console.WriteLine("Hello"); - s = new TcpClient(); - s.Connect(ip, port); - serverStream = s.GetStream(); - ThreadStart thread = new ThreadStart(ReceiveData); - Thread childThread = new Thread(thread); - childThread.Start(); - api = apihandler; + this.ip = ip; + this.api = apihandler; } public void SendString(string m) - { - byte[] b = Encoding.UTF8.GetBytes(m); - serverStream.Write(b, 0, b.Length); - serverStream.Flush(); - } - - public void ReceiveData() { - Console.WriteLine("Hello2"); - while (s.Connected) + HttpWebRequest server = (HttpWebRequest)WebRequest.Create(ip+":"+port+"/"+m); + server.KeepAlive = false; + HttpWebResponse respond = (HttpWebResponse)server.GetResponse(); + Stream streamResponse = respond.GetResponseStream(); + StreamReader streamRead = new StreamReader(streamResponse); + Char[] readBuff = new Char[256]; + int count = streamRead.Read(readBuff, 0, 256); + string data = ""; + while (count > 0) { - Console.WriteLine("Hello3"); - byte[] data = new byte[512]; - Console.WriteLine("Hang je hier?"); - int bytesRec = serverStream.Read(data, 0, data.Length); - Console.WriteLine("ën hier? "); - Console.WriteLine("Echoed test = {0}",Encoding.ASCII.GetString(data, 0, bytesRec)); - - - string message = Encoding.ASCII.GetString(data); - System.Console.WriteLine(message); - //Iets doen met api calls + String outputData = new String(readBuff, 0, count); + data +=outputData; + count = streamRead.Read(readBuff, 0, 256); } + System.Console.WriteLine(data); + respond.Close(); + streamResponse.Close(); + streamRead.Close(); } } } diff --git a/MusicPlayer/MusicPlayer/Program.cs b/MusicPlayer/MusicPlayer/Program.cs index 54e8133..490c4be 100644 --- a/MusicPlayer/MusicPlayer/Program.cs +++ b/MusicPlayer/MusicPlayer/Program.cs @@ -15,8 +15,8 @@ namespace MusicPlayer static void Main() { APIHandler api = new APIHandler(); - NetworkHandler nw = new NetworkHandler("www.imegumii.nl", api); - nw.SendString("GET /getsongbyid?id=102 HTTP/1.1"); + NetworkHandler nw = new NetworkHandler("http://www.imegumii.nl", api); + nw.SendString("getsongbyid?id=102"); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); From a45d506dbc12e96b4f6579efb7f15f9fa4ed73a1 Mon Sep 17 00:00:00 2001 From: Kenneth van Ewijk Date: Thu, 29 Oct 2015 20:12:59 +0100 Subject: [PATCH 16/25] Added controls panel and playing of music --- MusicPlayer/MusicPlayer/MainForm.Designer.cs | 44 +++++++++++++++-- MusicPlayer/MusicPlayer/MainForm.cs | 50 +++++++++++++++++++- MusicPlayer/MusicPlayer/MusicPlayer.csproj | 11 +++-- MusicPlayer/MusicPlayer/packages.config | 1 + 4 files changed, 97 insertions(+), 9 deletions(-) diff --git a/MusicPlayer/MusicPlayer/MainForm.Designer.cs b/MusicPlayer/MusicPlayer/MainForm.Designer.cs index 844589c..1b07509 100644 --- a/MusicPlayer/MusicPlayer/MainForm.Designer.cs +++ b/MusicPlayer/MusicPlayer/MainForm.Designer.cs @@ -37,6 +37,9 @@ this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.viewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.playToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ControlsPanel = new System.Windows.Forms.Panel(); ((System.ComponentModel.ISupportInitialize)(this.SongsTableView)).BeginInit(); this.MainPanel.SuspendLayout(); this.MenuStrip.SuspendLayout(); @@ -58,7 +61,7 @@ this.SongsTableView.ReadOnly = true; this.SongsTableView.RowHeadersVisible = false; this.SongsTableView.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.SongsTableView.Size = new System.Drawing.Size(760, 172); + this.SongsTableView.Size = new System.Drawing.Size(760, 148); this.SongsTableView.TabIndex = 0; // // GenreListBox @@ -92,20 +95,23 @@ // // MainPanel // + this.MainPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.MainPanel.Controls.Add(this.GenreListBox); this.MainPanel.Controls.Add(this.ArtistListBox); this.MainPanel.Controls.Add(this.AlbumListView); this.MainPanel.Controls.Add(this.SongsTableView); - this.MainPanel.Dock = System.Windows.Forms.DockStyle.Fill; this.MainPanel.Location = new System.Drawing.Point(0, 24); this.MainPanel.Name = "MainPanel"; - this.MainPanel.Size = new System.Drawing.Size(784, 337); + this.MainPanel.Size = new System.Drawing.Size(784, 313); this.MainPanel.TabIndex = 5; // // MenuStrip // this.MenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.fileToolStripMenuItem}); + this.fileToolStripMenuItem, + this.viewToolStripMenuItem}); this.MenuStrip.Location = new System.Drawing.Point(0, 0); this.MenuStrip.Name = "MenuStrip"; this.MenuStrip.Size = new System.Drawing.Size(784, 24); @@ -133,11 +139,36 @@ this.saveToolStripMenuItem.Size = new System.Drawing.Size(103, 22); this.saveToolStripMenuItem.Text = "Save"; // + // viewToolStripMenuItem + // + this.viewToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.playToolStripMenuItem}); + this.viewToolStripMenuItem.Name = "viewToolStripMenuItem"; + this.viewToolStripMenuItem.Size = new System.Drawing.Size(44, 20); + this.viewToolStripMenuItem.Text = "View"; + // + // playToolStripMenuItem + // + this.playToolStripMenuItem.Name = "playToolStripMenuItem"; + this.playToolStripMenuItem.Size = new System.Drawing.Size(96, 22); + this.playToolStripMenuItem.Text = "Play"; + this.playToolStripMenuItem.Click += new System.EventHandler(this.playToolStripMenuItem_Click); + // + // ControlsPanel + // + this.ControlsPanel.BackColor = System.Drawing.SystemColors.HotTrack; + this.ControlsPanel.Dock = System.Windows.Forms.DockStyle.Bottom; + this.ControlsPanel.Location = new System.Drawing.Point(0, 343); + this.ControlsPanel.Name = "ControlsPanel"; + this.ControlsPanel.Size = new System.Drawing.Size(784, 119); + this.ControlsPanel.TabIndex = 4; + // // MainForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(784, 361); + this.ClientSize = new System.Drawing.Size(784, 462); + this.Controls.Add(this.ControlsPanel); this.Controls.Add(this.MainPanel); this.Controls.Add(this.MenuStrip); this.MainMenuStrip = this.MenuStrip; @@ -164,6 +195,9 @@ private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem viewToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem playToolStripMenuItem; + private System.Windows.Forms.Panel ControlsPanel; } } diff --git a/MusicPlayer/MusicPlayer/MainForm.cs b/MusicPlayer/MusicPlayer/MainForm.cs index 522afb0..d4d88cd 100644 --- a/MusicPlayer/MusicPlayer/MainForm.cs +++ b/MusicPlayer/MusicPlayer/MainForm.cs @@ -1,10 +1,14 @@ -using System; +using NAudio.Wave; +using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; +using System.IO; using System.Linq; +using System.Net; using System.Text; +using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; @@ -50,5 +54,49 @@ namespace MusicPlayer table.Add(new Song("Test Song 2", "Test Album 2", "Test Artist 2")); } + + private void playToolStripMenuItem_Click(object sender, EventArgs e) + { + PlayMp3FromUrl("http://imegumii.nl/music/English/Monstercat/Direct%20-%20Eternity.mp3"); + } + + private Stream ms = new MemoryStream(); + public void PlayMp3FromUrl(string url) + { + new Thread(delegate (object o) + { + var response = WebRequest.Create(url).GetResponse(); + using (var stream = response.GetResponseStream()) + { + byte[] buffer = new byte[65536]; // 64KB chunks + int read; + while ((read = stream.Read(buffer, 0, buffer.Length)) > 0) + { + var pos = ms.Position; + ms.Position = ms.Length; + ms.Write(buffer, 0, read); + ms.Position = pos; + } + } + }).Start(); + + // Pre-buffering some data to allow NAudio to start playing + while (ms.Length < 65536 * 10) + Thread.Sleep(1000); + + ms.Position = 0; + using (WaveStream blockAlignedStream = new BlockAlignReductionStream(WaveFormatConversionStream.CreatePcmStream(new Mp3FileReader(ms)))) + { + using (WaveOut waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback())) + { + waveOut.Init(blockAlignedStream); + waveOut.Play(); + while (waveOut.PlaybackState == PlaybackState.Playing) + { + System.Threading.Thread.Sleep(100); + } + } + } + } } } diff --git a/MusicPlayer/MusicPlayer/MusicPlayer.csproj b/MusicPlayer/MusicPlayer/MusicPlayer.csproj index bd6a732..d816bbe 100644 --- a/MusicPlayer/MusicPlayer/MusicPlayer.csproj +++ b/MusicPlayer/MusicPlayer/MusicPlayer.csproj @@ -1,4 +1,4 @@ - + @@ -33,6 +33,10 @@ 4 + + ..\packages\NAudio.1.7.3\lib\net35\NAudio.dll + True + @@ -46,7 +50,7 @@ - + Form @@ -74,6 +78,7 @@ True Resources.resx + SettingsSingleFileGenerator Settings.Designer.cs @@ -95,4 +100,4 @@ --> - + \ No newline at end of file diff --git a/MusicPlayer/MusicPlayer/packages.config b/MusicPlayer/MusicPlayer/packages.config index 64b5d8e..79cd541 100644 --- a/MusicPlayer/MusicPlayer/packages.config +++ b/MusicPlayer/MusicPlayer/packages.config @@ -1,4 +1,5 @@  + \ No newline at end of file From 050d405152e1c2b3e20fa01c975de628486c2a1f Mon Sep 17 00:00:00 2001 From: Janco Kock Date: Thu, 29 Oct 2015 20:16:27 +0100 Subject: [PATCH 17/25] Added a fancy icon --- MusicPlayer/MusicPlayer/MainForm.Designer.cs | 2 + MusicPlayer/MusicPlayer/MainForm.resx | 992 +++++++++++++++++++ MusicPlayer/MusicPlayer/MusicPlayer.csproj | 11 +- MusicPlayer/MusicPlayer/packages.config | 1 + 4 files changed, 1003 insertions(+), 3 deletions(-) diff --git a/MusicPlayer/MusicPlayer/MainForm.Designer.cs b/MusicPlayer/MusicPlayer/MainForm.Designer.cs index 844589c..31a0aa7 100644 --- a/MusicPlayer/MusicPlayer/MainForm.Designer.cs +++ b/MusicPlayer/MusicPlayer/MainForm.Designer.cs @@ -28,6 +28,7 @@ /// private void InitializeComponent() { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); this.SongsTableView = new System.Windows.Forms.DataGridView(); this.GenreListBox = new System.Windows.Forms.ListBox(); this.AlbumListView = new System.Windows.Forms.ListView(); @@ -140,6 +141,7 @@ this.ClientSize = new System.Drawing.Size(784, 361); this.Controls.Add(this.MainPanel); this.Controls.Add(this.MenuStrip); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.MainMenuStrip = this.MenuStrip; this.MinimumSize = new System.Drawing.Size(800, 400); this.Name = "MainForm"; diff --git a/MusicPlayer/MusicPlayer/MainForm.resx b/MusicPlayer/MusicPlayer/MainForm.resx index 9a59bef..2bbeee3 100644 --- a/MusicPlayer/MusicPlayer/MainForm.resx +++ b/MusicPlayer/MusicPlayer/MainForm.resx @@ -120,4 +120,996 @@ 118, 17 + + + + AAABAAEAgHAAAAEAIAAo5wAAFgAAACgAAACAAAAA4AAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABLSEgGUU1NQ1BOTrpQTk76UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/09OTvpPTk64UE9PQUpHRwYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT0tLFlBOTqdQTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE1NpU9J + SRUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFZS + UgVQTk6mUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE1NpE5LSwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUU1NQlBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE9PQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABPTk65UE5O/1BOTv9QTk7/UE5O/1BOTv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/UE5O/1BOTv9QTk7/UE5O/1BOTv9PTk62AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5NTfpQTk7/UE5O/1BOTv9QTk7/UE5O/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/09OTvkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPTU3/UE5O/1BOTv9QTk7/UE5O/1BOTv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE9O + Tu5QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/09OTusAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5OnVBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UU5OmgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABPT08rUE5O+1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTvpSTU0pAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8+PgJRTk53UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/T01NdUE1NQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABQTk51UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1FNTXEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOT08ZUE5OiE5N + TcJQTk7QUE5O0VBOTtFQTk7RUE5O0VBOTtFQTk7oUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7oUE5O0VBOTtFQTk7RUE5O0VBOTtFQTk7QTkxMwU9N + TYdTSkoXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBO + TndQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + TncAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5Of1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5OfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABQTk5/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk5/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTn9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTn8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAUE5Of1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5OfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQTk5/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk5/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFBOTn9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTn8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5Of1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5OfwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABQTk5/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk5/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTn9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTn8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAUE5Of1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5OfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQTk5/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk5/AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAE9MTH1QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/05MTH0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATk1NdVBO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/3qAgAQAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABPVFQGUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5OdAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOTk5rUE5O/FBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/U0xMFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE9NTRdQTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTvxRT09qAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5O + TmJQTk75UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9RT083AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAUU1NOlBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O+VBO + TmIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT09PUlBOTvRQTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/09NTWgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQTk5qUE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk70UE1NUQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABQTk42UE5O61BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE1NnQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFBNTaBQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + TupQTk41AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRPTxpQTk7hUE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9PTU3eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT01N4VBOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O4VFTUxkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFBOTtlQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + TvBPT08pAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAE9NTStQTk7wUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7ZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5Oq1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O+1BNTXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE1NdVBOTvxQTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BNTaoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABRT09hUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5OtlBQUAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFhQUAlQTk63UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/T01NYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1QUBRPTU3/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7xUE1NMQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE9PM1BOTvJQTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9STk4TAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBMTNlQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk6TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABQTk6XUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/T05O2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5OaVBO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9OTk4aAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT05OHU9NTf9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9PTU1nAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZWVkMT05O/FBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTsUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABPTk7JUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/FlaWgwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF5b + WwJQTk6kUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/09M + THQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUExMeFBOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9RTk6jX1lZAgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTkdQTk79UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O609PTzoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFBOTj1QTk7sUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/E5NTUcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAT1BQEFBOTsFQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE1Nx1JPTxYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABRTk4YUE5OyVBOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7BVFBQDwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATkxMalBOTvxQTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/T01NtVBMTA4AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAASEtLD1BOTrhQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/E9OTmgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABYWVkBUE5O2lBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/TkxMwFVQUBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBLSxdQTk7CUE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTU3ZOz4+AgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUFAzUE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5OzVFO + ThgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABOTU0aUE5OzlBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1JNTTEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPTEyXUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O5E5MTDlFODgDAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJUFACUU9PO1BOTudQTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTU2VAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5N + TRVPTU3aUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/T01N/VFOToxOS0seAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUExMH1BO + To5QTk7+UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/T01N2VFRURQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFPT09QTk70UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTuBQTk53AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAE9NTXlPTU3iUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTvRQTk5NAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAE5NTZZQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTEzzUE9PblBQUBBKSkoDVkxMAQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFSUgFMSkoDUFFREFBNTXBOTEz0UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UExMlQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTrtQTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/E9OTqdRTk5gTUtLNk9NTSJQTU0TU1RUBQAAAAAAAAAAAAAAAAAAAABTVFQFUE1NE09N + TSNNTU02UE9PYVBOTqhQTk78UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/05OTroAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVk5ODE9MTLZQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTU32UE5O2VBO + TsNQTk6vUE5OplBOTp9QTk6fUE5OplBOTq9QTk7DUE5O2VBOTvdQTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9OTU21UlJSDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU1BQGk9M + TM1QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/Tk1NzFBQUBoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVFBQHU5MTNhQTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/05M + TNdRU1McAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVE5OE05MTLtQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9OTEy6TlBQEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVVBQD09OTpZQTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE1NlVFS + Ug8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFPT2lQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1FOTmgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFN + TTJOTEzXUE5O/VBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/U5MTNdOT08xAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE9NTQtRTk52T05O6VBOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTuhQTk52UVFRCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABNTk4dUE5OkFBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk6PUU1NHQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUVJSF05O + TqhQTk74UE5O/VBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/VBO + TvhOTk6nUU1NFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFJMTCNOT0+DUE5OyVBOTu5PTU3/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9PTU3/UE5O7lBOTslOT0+DUkxMIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABTUlILUExMP05MTG1QTk6mUE5O4VBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7hUE5Opk5MTG1QTEw/U1JSCwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBP + TwhRT08QTk1NIlFNTVFQTk6AT05OsU5OTtVPTk7lTk5O9U5MTP9OTEz/Tk5O9U9OTuVOTk7VT05OsVBO + ToBRTU1RTk1NIlFPTxBQT08IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////8AAAf///////4AAA/////8AAAH///////+AAAD////+AAAB////////gAAA + f////gAAAf///////4AAAH////wAAAH///////+AAAA////8AAAB////////gAAAP////AAAAf////// + /4AAAD////wAAAH///////+AAAA////8AAAB////////gAAAP////AAAAf///////4AAAD////wAAAH/ + //////+AAAA////8AAAB////////gAAAP////AAAAf///////4AAAD////wAAAH///////+AAAA////8 + AAAB////////gAAAP////AAAAf///////4AAAD////wAAAH///////+AAAA////8AAAB////////gAAA + P////AAAAf///////4AAAD////wAAAH///////+AAAA////8AAAB////////gAAAP////AAAAf////// + /4AAAD////wAAAH///////+AAAA////8AAAB////////gAAAP////AAAAf///////4AAAD////wAAAH/ + //////+AAAA////8AAAB////////gAAAP////AAAAf///////4AAAD////wAAAH///////+AAAA////8 + AAAB////////gAAAP////AAAAf///////4AAAD////wAAAH///////+AAAA////8AAAB////////gAAA + P////AAAAf///////4AAAD////4AAAH///////+AAAB/////AAAB////////gAAA/////4AAAf////// + /4AAAf/////AAAH///////+AAAP//////+AB////////gAf////////gAf///////4AH////////4AH/ + //////+AB////////+AB////////gAf////////gAf///////4AH////////4AH///////+AB/////// + /+AB////////gAf////////gAf///////4AH////////4AH///////+AB////////+AB////////gAf/ + ///////gAf///////4AH////////4AH///////+AB////////+AB////////gAf////////gAf////// + /4AH////////4AH///////+AB////////+AB////////gAf////////gAf///////4AH////////4AD/ + //////8AB////////+AA////////AAf////////gAP///////wAH////////4AD///////8AB/////// + //AAf//////+AA/////////wAH///////gAP////////8AA///////wAD/////////gAP//////8AB// + ///////4AB//////+AAf////////+AAf//////gAH/////////wAD//////wAD/////////8AAf///// + 4AA//////////gAD/////8AAf/////////4AAf////+AAH//////////AAD/////AAD//////////wAA + f////gAA//////////+AAB////gAAf//////////wAAP///wAAP//////////8AAA///wAAD//////// + ///gAAB//gAAB///////////8AAAAAAAAA////////////gAAAAAAAAf///////////8AAAAAAAAP/// + /////////gAAAAAAAH////////////8AAAAAAAD/////////////wAAAAAAD/////////////+AAAAAA + B//////////////4AAAAAB///////////////AAAAAA///////////////8AAAAA//////////////// + wAAAA/////////////////wAAD//////////////////wAP///////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////8= + + \ No newline at end of file diff --git a/MusicPlayer/MusicPlayer/MusicPlayer.csproj b/MusicPlayer/MusicPlayer/MusicPlayer.csproj index bd6a732..d816bbe 100644 --- a/MusicPlayer/MusicPlayer/MusicPlayer.csproj +++ b/MusicPlayer/MusicPlayer/MusicPlayer.csproj @@ -1,4 +1,4 @@ - + @@ -33,6 +33,10 @@ 4 + + ..\packages\NAudio.1.7.3\lib\net35\NAudio.dll + True + @@ -46,7 +50,7 @@ - + Form @@ -74,6 +78,7 @@ True Resources.resx + SettingsSingleFileGenerator Settings.Designer.cs @@ -95,4 +100,4 @@ --> - + \ No newline at end of file diff --git a/MusicPlayer/MusicPlayer/packages.config b/MusicPlayer/MusicPlayer/packages.config index 64b5d8e..79cd541 100644 --- a/MusicPlayer/MusicPlayer/packages.config +++ b/MusicPlayer/MusicPlayer/packages.config @@ -1,4 +1,5 @@  + \ No newline at end of file From 415e87b7876377d4bc4e505d0cf9d918ff353948 Mon Sep 17 00:00:00 2001 From: Yorick Rommers Date: Thu, 29 Oct 2015 20:37:36 +0100 Subject: [PATCH 18/25] API getSongURLbyid working --- MusicPlayer/MusicPlayer/APIHandler.cs | 17 +++++++++++++++-- MusicPlayer/MusicPlayer/MainForm.cs | 1 - MusicPlayer/MusicPlayer/MusicPlayer.csproj | 11 ++++++++--- MusicPlayer/MusicPlayer/NetworkHandler.cs | 11 ++++++----- MusicPlayer/MusicPlayer/Program.cs | 6 +++--- 5 files changed, 32 insertions(+), 14 deletions(-) diff --git a/MusicPlayer/MusicPlayer/APIHandler.cs b/MusicPlayer/MusicPlayer/APIHandler.cs index 92583ea..c3d6f65 100644 --- a/MusicPlayer/MusicPlayer/APIHandler.cs +++ b/MusicPlayer/MusicPlayer/APIHandler.cs @@ -4,16 +4,29 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using MusicPlayer; +using Newtonsoft.Json.Linq; namespace MusicPlayer { internal class APIHandler { - public APIHandler() - { + private NetworkHandler nw; + public APIHandler(NetworkHandler nw) + { + this.nw = nw; } + public string GetSongURLByID(string id) + { + JObject o = nw.SendString("getsongbyid?id=" + id); + if (o["result"].ToString() == "OK") { + return o["songurl"].ToString(); + } + return o["errormsg"].ToString(); + + } + public List GetArtists() { return null; diff --git a/MusicPlayer/MusicPlayer/MainForm.cs b/MusicPlayer/MusicPlayer/MainForm.cs index 522afb0..8c3f38b 100644 --- a/MusicPlayer/MusicPlayer/MainForm.cs +++ b/MusicPlayer/MusicPlayer/MainForm.cs @@ -18,7 +18,6 @@ namespace MusicPlayer public MainForm() { InitializeComponent(); -// nw.SendString("GET / HTTP/1.1"); } diff --git a/MusicPlayer/MusicPlayer/MusicPlayer.csproj b/MusicPlayer/MusicPlayer/MusicPlayer.csproj index bd6a732..1fc6d1b 100644 --- a/MusicPlayer/MusicPlayer/MusicPlayer.csproj +++ b/MusicPlayer/MusicPlayer/MusicPlayer.csproj @@ -1,4 +1,4 @@ - + @@ -33,6 +33,10 @@ 4 + + ..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll + True + @@ -46,7 +50,7 @@ - + Form @@ -74,6 +78,7 @@ True Resources.resx + SettingsSingleFileGenerator Settings.Designer.cs @@ -95,4 +100,4 @@ --> - + \ No newline at end of file diff --git a/MusicPlayer/MusicPlayer/NetworkHandler.cs b/MusicPlayer/MusicPlayer/NetworkHandler.cs index 9ea31a4..dc10bd5 100644 --- a/MusicPlayer/MusicPlayer/NetworkHandler.cs +++ b/MusicPlayer/MusicPlayer/NetworkHandler.cs @@ -4,6 +4,8 @@ using System.Net.Sockets; using System.Threading; using System.Net; using System.IO; +using Newtonsoft.Json.Linq; + namespace MusicPlayer { @@ -11,15 +13,13 @@ namespace MusicPlayer { private int port = 8585; private string ip; - private APIHandler api; - public NetworkHandler(string ip, APIHandler apihandler) + public NetworkHandler(string ip) { this.ip = ip; - this.api = apihandler; } - public void SendString(string m) + public JObject SendString(string m) { HttpWebRequest server = (HttpWebRequest)WebRequest.Create(ip+":"+port+"/"+m); server.KeepAlive = false; @@ -35,10 +35,11 @@ namespace MusicPlayer data +=outputData; count = streamRead.Read(readBuff, 0, 256); } - System.Console.WriteLine(data); + JObject o = JObject.Parse(data); respond.Close(); streamResponse.Close(); streamRead.Close(); + return o; } } } diff --git a/MusicPlayer/MusicPlayer/Program.cs b/MusicPlayer/MusicPlayer/Program.cs index e5e7fd4..b438603 100644 --- a/MusicPlayer/MusicPlayer/Program.cs +++ b/MusicPlayer/MusicPlayer/Program.cs @@ -14,9 +14,9 @@ namespace MusicPlayer [STAThread] static void Main() { - APIHandler api = new APIHandler(); - NetworkHandler nw = new NetworkHandler("http://www.imegumii.nl", api); - nw.SendString("getsongbyid?id=102"); + NetworkHandler nw = new NetworkHandler("http://www.imegumii.nl"); + APIHandler api = new APIHandler(nw); + Console.WriteLine(api.GetSongURLByID("102")); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); From fa863d562e949ecd173ad17e8d55f2c3f88af511 Mon Sep 17 00:00:00 2001 From: Yorick Rommers Date: Thu, 29 Oct 2015 20:45:16 +0100 Subject: [PATCH 19/25] updated gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index b06e864..b9017f2 100644 --- a/.gitignore +++ b/.gitignore @@ -24,7 +24,7 @@ bld/ # Visual Studio 2015 cache/options directory .vs/ - +*.csproj # MSTest test Results [Tt]est[Rr]esult*/ [Bb]uild[Ll]og.* From 9f64137e687d23371e50c729dc7535c662e0d8bd Mon Sep 17 00:00:00 2001 From: Kenneth van Ewijk Date: Thu, 29 Oct 2015 20:45:23 +0100 Subject: [PATCH 20/25] Added new stuff --- MusicPlayer/MusicPlayer/AudioHandler.cs | 58 ++++++++++++++++++++ MusicPlayer/MusicPlayer/MainForm.Designer.cs | 34 ++++++++---- MusicPlayer/MusicPlayer/MainForm.cs | 43 +-------------- MusicPlayer/MusicPlayer/MusicPlayer.csproj | 1 + MusicPlayer/MusicPlayer/Song.cs | 19 +++++++ 5 files changed, 102 insertions(+), 53 deletions(-) create mode 100644 MusicPlayer/MusicPlayer/AudioHandler.cs diff --git a/MusicPlayer/MusicPlayer/AudioHandler.cs b/MusicPlayer/MusicPlayer/AudioHandler.cs new file mode 100644 index 0000000..c7065b8 --- /dev/null +++ b/MusicPlayer/MusicPlayer/AudioHandler.cs @@ -0,0 +1,58 @@ +using NAudio.Wave; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace MusicPlayer +{ + class AudioHandler + { + public static Stream ms = new MemoryStream(); + + public static void PlayMp3FromUrl(string url) + { + new Thread(delegate (object o) + { + var response = WebRequest.Create(url).GetResponse(); + using (var stream = response.GetResponseStream()) + { + byte[] buffer = new byte[65536]; // 64KB chunks + int read; + while ((read = stream.Read(buffer, 0, buffer.Length)) > 0) + { + var pos = ms.Position; + ms.Position = ms.Length; + ms.Write(buffer, 0, read); + ms.Position = pos; + } + } + }).Start(); + + new Thread(delegate (object o) + { + // Pre-buffering some data to allow NAudio to start playing + while (ms.Length < 65536 * 10) + Thread.Sleep(1000); + + ms.Position = 0; + using (WaveStream blockAlignedStream = new BlockAlignReductionStream(WaveFormatConversionStream.CreatePcmStream(new Mp3FileReader(ms)))) + { + using (WaveOut waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback())) + { + waveOut.Init(blockAlignedStream); + waveOut.Play(); + while (waveOut.PlaybackState == PlaybackState.Playing) + { + System.Threading.Thread.Sleep(100); + } + } + } + }).Start(); + } + } +} diff --git a/MusicPlayer/MusicPlayer/MainForm.Designer.cs b/MusicPlayer/MusicPlayer/MainForm.Designer.cs index 1b07509..f851d8e 100644 --- a/MusicPlayer/MusicPlayer/MainForm.Designer.cs +++ b/MusicPlayer/MusicPlayer/MainForm.Designer.cs @@ -38,11 +38,12 @@ this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.viewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.playToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.ControlsPanel = new System.Windows.Forms.Panel(); + this.PlayButton = new System.Windows.Forms.Button(); ((System.ComponentModel.ISupportInitialize)(this.SongsTableView)).BeginInit(); this.MainPanel.SuspendLayout(); this.MenuStrip.SuspendLayout(); + this.ControlsPanel.SuspendLayout(); this.SuspendLayout(); // // SongsTableView @@ -54,6 +55,7 @@ | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.SongsTableView.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill; + this.SongsTableView.BackgroundColor = System.Drawing.SystemColors.Control; this.SongsTableView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; this.SongsTableView.Location = new System.Drawing.Point(12, 153); this.SongsTableView.MultiSelect = false; @@ -66,6 +68,7 @@ // // GenreListBox // + this.GenreListBox.BackColor = System.Drawing.SystemColors.Control; this.GenreListBox.FormattingEnabled = true; this.GenreListBox.Location = new System.Drawing.Point(12, 12); this.GenreListBox.Name = "GenreListBox"; @@ -77,6 +80,7 @@ // this.AlbumListView.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); + this.AlbumListView.BackColor = System.Drawing.SystemColors.Control; this.AlbumListView.Location = new System.Drawing.Point(272, 12); this.AlbumListView.Name = "AlbumListView"; this.AlbumListView.Size = new System.Drawing.Size(500, 134); @@ -86,6 +90,7 @@ // // ArtistListBox // + this.ArtistListBox.BackColor = System.Drawing.SystemColors.Control; this.ArtistListBox.FormattingEnabled = true; this.ArtistListBox.Location = new System.Drawing.Point(142, 12); this.ArtistListBox.Name = "ArtistListBox"; @@ -98,6 +103,7 @@ this.MainPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); + this.MainPanel.BackColor = System.Drawing.SystemColors.Window; this.MainPanel.Controls.Add(this.GenreListBox); this.MainPanel.Controls.Add(this.ArtistListBox); this.MainPanel.Controls.Add(this.AlbumListView); @@ -109,6 +115,7 @@ // // MenuStrip // + this.MenuStrip.BackColor = System.Drawing.SystemColors.Window; this.MenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.fileToolStripMenuItem, this.viewToolStripMenuItem}); @@ -141,28 +148,30 @@ // // viewToolStripMenuItem // - this.viewToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.playToolStripMenuItem}); this.viewToolStripMenuItem.Name = "viewToolStripMenuItem"; this.viewToolStripMenuItem.Size = new System.Drawing.Size(44, 20); this.viewToolStripMenuItem.Text = "View"; // - // playToolStripMenuItem - // - this.playToolStripMenuItem.Name = "playToolStripMenuItem"; - this.playToolStripMenuItem.Size = new System.Drawing.Size(96, 22); - this.playToolStripMenuItem.Text = "Play"; - this.playToolStripMenuItem.Click += new System.EventHandler(this.playToolStripMenuItem_Click); - // // ControlsPanel // - this.ControlsPanel.BackColor = System.Drawing.SystemColors.HotTrack; + this.ControlsPanel.BackColor = System.Drawing.SystemColors.WindowFrame; + this.ControlsPanel.Controls.Add(this.PlayButton); this.ControlsPanel.Dock = System.Windows.Forms.DockStyle.Bottom; this.ControlsPanel.Location = new System.Drawing.Point(0, 343); this.ControlsPanel.Name = "ControlsPanel"; this.ControlsPanel.Size = new System.Drawing.Size(784, 119); this.ControlsPanel.TabIndex = 4; // + // PlayButton + // + this.PlayButton.Location = new System.Drawing.Point(12, 13); + this.PlayButton.Name = "PlayButton"; + this.PlayButton.Size = new System.Drawing.Size(75, 23); + this.PlayButton.TabIndex = 0; + this.PlayButton.Text = "Play"; + this.PlayButton.UseVisualStyleBackColor = true; + this.PlayButton.Click += new System.EventHandler(this.PlayButton_Click); + // // MainForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -179,6 +188,7 @@ this.MainPanel.ResumeLayout(false); this.MenuStrip.ResumeLayout(false); this.MenuStrip.PerformLayout(); + this.ControlsPanel.ResumeLayout(false); this.ResumeLayout(false); this.PerformLayout(); @@ -196,8 +206,8 @@ private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem viewToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem playToolStripMenuItem; private System.Windows.Forms.Panel ControlsPanel; + private System.Windows.Forms.Button PlayButton; } } diff --git a/MusicPlayer/MusicPlayer/MainForm.cs b/MusicPlayer/MusicPlayer/MainForm.cs index d4d88cd..62055d8 100644 --- a/MusicPlayer/MusicPlayer/MainForm.cs +++ b/MusicPlayer/MusicPlayer/MainForm.cs @@ -55,48 +55,9 @@ namespace MusicPlayer table.Add(new Song("Test Song 2", "Test Album 2", "Test Artist 2")); } - private void playToolStripMenuItem_Click(object sender, EventArgs e) + private void PlayButton_Click(object sender, EventArgs e) { - PlayMp3FromUrl("http://imegumii.nl/music/English/Monstercat/Direct%20-%20Eternity.mp3"); - } - - private Stream ms = new MemoryStream(); - public void PlayMp3FromUrl(string url) - { - new Thread(delegate (object o) - { - var response = WebRequest.Create(url).GetResponse(); - using (var stream = response.GetResponseStream()) - { - byte[] buffer = new byte[65536]; // 64KB chunks - int read; - while ((read = stream.Read(buffer, 0, buffer.Length)) > 0) - { - var pos = ms.Position; - ms.Position = ms.Length; - ms.Write(buffer, 0, read); - ms.Position = pos; - } - } - }).Start(); - - // Pre-buffering some data to allow NAudio to start playing - while (ms.Length < 65536 * 10) - Thread.Sleep(1000); - - ms.Position = 0; - using (WaveStream blockAlignedStream = new BlockAlignReductionStream(WaveFormatConversionStream.CreatePcmStream(new Mp3FileReader(ms)))) - { - using (WaveOut waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback())) - { - waveOut.Init(blockAlignedStream); - waveOut.Play(); - while (waveOut.PlaybackState == PlaybackState.Playing) - { - System.Threading.Thread.Sleep(100); - } - } - } + AudioHandler.PlayMp3FromUrl("http://imegumii.nl/music/English/Monstercat/Direct%20-%20Eternity.mp3"); } } } diff --git a/MusicPlayer/MusicPlayer/MusicPlayer.csproj b/MusicPlayer/MusicPlayer/MusicPlayer.csproj index d816bbe..6af1143 100644 --- a/MusicPlayer/MusicPlayer/MusicPlayer.csproj +++ b/MusicPlayer/MusicPlayer/MusicPlayer.csproj @@ -50,6 +50,7 @@ + Form diff --git a/MusicPlayer/MusicPlayer/Song.cs b/MusicPlayer/MusicPlayer/Song.cs index 45db72c..24bb544 100644 --- a/MusicPlayer/MusicPlayer/Song.cs +++ b/MusicPlayer/MusicPlayer/Song.cs @@ -11,12 +11,31 @@ namespace MusicPlayer public string Name { get; set; } public string Album { get; set; } public string Artist { get; set; } + public string Url { get { return GetURL(); } set { SetURL(value); } } + + private string url; public Song(string name, string album, string artist) { Name = name; Album = album; Artist = artist; + url = ""; + } + + private string GetURL() + { + if (url == "") + { + url = "http://imegumii.nl/music/Old%20Music/Pre-Parade%20-%20Toradora.mp3"; + } + + return url; + } + + private void SetURL(string str) + { + url = str; } } } From f79b2ace2806cb9c9afaeac33167624b5fbb5d82 Mon Sep 17 00:00:00 2001 From: Kenneth van Ewijk Date: Thu, 29 Oct 2015 20:55:36 +0100 Subject: [PATCH 21/25] Changed Structure --- MusicPlayer/MusicPlayer/Main.cs | 29 ++++++++++++++++++++ MusicPlayer/MusicPlayer/MainForm.Designer.cs | 2 +- MusicPlayer/MusicPlayer/Program.cs | 7 +++-- 3 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 MusicPlayer/MusicPlayer/Main.cs diff --git a/MusicPlayer/MusicPlayer/Main.cs b/MusicPlayer/MusicPlayer/Main.cs new file mode 100644 index 0000000..ee34205 --- /dev/null +++ b/MusicPlayer/MusicPlayer/Main.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MusicPlayer +{ + class Main + { + private APIHandler api; + private MainForm form; + private NetworkHandler nw; + private AudioHandler audio; + + public Main(NetworkHandler nw, APIHandler api, MainForm form) + { + this.nw = nw; + this.api = api; + this.form = form; + + audio = new AudioHandler(); + + Console.WriteLine(api.GetSongURLByID("102")); + } + + + } +} diff --git a/MusicPlayer/MusicPlayer/MainForm.Designer.cs b/MusicPlayer/MusicPlayer/MainForm.Designer.cs index c2d60f1..81bacaa 100644 --- a/MusicPlayer/MusicPlayer/MainForm.Designer.cs +++ b/MusicPlayer/MusicPlayer/MainForm.Designer.cs @@ -183,7 +183,7 @@ this.Controls.Add(this.MenuStrip); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.MainMenuStrip = this.MenuStrip; - this.MinimumSize = new System.Drawing.Size(800, 400); + this.MinimumSize = new System.Drawing.Size(800, 500); this.Name = "MainForm"; this.Text = "YJMPD Music Player"; ((System.ComponentModel.ISupportInitialize)(this.SongsTableView)).EndInit(); diff --git a/MusicPlayer/MusicPlayer/Program.cs b/MusicPlayer/MusicPlayer/Program.cs index b438603..fb537a0 100644 --- a/MusicPlayer/MusicPlayer/Program.cs +++ b/MusicPlayer/MusicPlayer/Program.cs @@ -16,10 +16,13 @@ namespace MusicPlayer { NetworkHandler nw = new NetworkHandler("http://www.imegumii.nl"); APIHandler api = new APIHandler(nw); - Console.WriteLine(api.GetSongURLByID("102")); + MainForm form = new MainForm(); + + new Main(nw, api, form); + Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new MainForm()); + Application.Run(form); } } } From ada4321bcaa43526985acf23de5891b8a26a93ec Mon Sep 17 00:00:00 2001 From: Kenneth van Ewijk Date: Thu, 29 Oct 2015 21:21:35 +0100 Subject: [PATCH 22/25] Change to public. New Structure. --- MusicPlayer/MusicPlayer/APIHandler.cs | 3 +- MusicPlayer/MusicPlayer/AudioHandler.cs | 2 +- MusicPlayer/MusicPlayer/Main.cs | 34 ++++++++++++++--- MusicPlayer/MusicPlayer/MainForm.Designer.cs | 11 ++++-- MusicPlayer/MusicPlayer/MainForm.cs | 39 ++++++-------------- MusicPlayer/MusicPlayer/MusicPlayer.csproj | 3 +- MusicPlayer/MusicPlayer/NetworkHandler.cs | 2 +- MusicPlayer/MusicPlayer/Program.cs | 6 +-- MusicPlayer/MusicPlayer/Song.cs | 11 +++++- 9 files changed, 63 insertions(+), 48 deletions(-) diff --git a/MusicPlayer/MusicPlayer/APIHandler.cs b/MusicPlayer/MusicPlayer/APIHandler.cs index c3d6f65..c8dad8a 100644 --- a/MusicPlayer/MusicPlayer/APIHandler.cs +++ b/MusicPlayer/MusicPlayer/APIHandler.cs @@ -8,7 +8,7 @@ using Newtonsoft.Json.Linq; namespace MusicPlayer { - internal class APIHandler + public class APIHandler { private NetworkHandler nw; @@ -24,7 +24,6 @@ namespace MusicPlayer return o["songurl"].ToString(); } return o["errormsg"].ToString(); - } public List GetArtists() diff --git a/MusicPlayer/MusicPlayer/AudioHandler.cs b/MusicPlayer/MusicPlayer/AudioHandler.cs index c7065b8..d425356 100644 --- a/MusicPlayer/MusicPlayer/AudioHandler.cs +++ b/MusicPlayer/MusicPlayer/AudioHandler.cs @@ -10,7 +10,7 @@ using System.Threading.Tasks; namespace MusicPlayer { - class AudioHandler + public class AudioHandler { public static Stream ms = new MemoryStream(); diff --git a/MusicPlayer/MusicPlayer/Main.cs b/MusicPlayer/MusicPlayer/Main.cs index ee34205..e49c029 100644 --- a/MusicPlayer/MusicPlayer/Main.cs +++ b/MusicPlayer/MusicPlayer/Main.cs @@ -6,24 +6,46 @@ using System.Threading.Tasks; namespace MusicPlayer { - class Main + public class Main { - private APIHandler api; - private MainForm form; - private NetworkHandler nw; - private AudioHandler audio; + public APIHandler api; + public MainForm form; + public NetworkHandler nw; + public AudioHandler audio; + + private SongsTable table; public Main(NetworkHandler nw, APIHandler api, MainForm form) { this.nw = nw; this.api = api; this.form = form; + form.main = this; audio = new AudioHandler(); + table = new SongsTable(); + form.SongsTableView.DataSource = table; - Console.WriteLine(api.GetSongURLByID("102")); + Populate(); } + private void Populate() + { + table.Add(new Song("102", "Test Song 1", "Test Album 1", "Test Artist 1", api)); + form.GenreListBox.Items.Add("Hardcore"); + form.GenreListBox.Items.Add("Hardstyle"); + form.GenreListBox.Items.Add("Pop"); + + form.ArtistListBox.Items.Add("Kygo"); + form.ArtistListBox.Items.Add("Monstercat"); + form.ArtistListBox.Items.Add("Mozart"); + + form.AlbumListView.Items.Add("Album 1"); + form.AlbumListView.Items.Add("Album 2"); + form.AlbumListView.Items.Add("Album 3"); + + table.Add(new Song("104", "Test Song 2", "Test Album 2", "Test Artist 2", api)); + } } } diff --git a/MusicPlayer/MusicPlayer/MainForm.Designer.cs b/MusicPlayer/MusicPlayer/MainForm.Designer.cs index 81bacaa..19a4bd8 100644 --- a/MusicPlayer/MusicPlayer/MainForm.Designer.cs +++ b/MusicPlayer/MusicPlayer/MainForm.Designer.cs @@ -64,8 +64,10 @@ this.SongsTableView.ReadOnly = true; this.SongsTableView.RowHeadersVisible = false; this.SongsTableView.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.SongsTableView.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; this.SongsTableView.Size = new System.Drawing.Size(760, 148); this.SongsTableView.TabIndex = 0; + this.SongsTableView.SelectionChanged += new System.EventHandler(this.SongsTableView_SelectionChanged); // // GenreListBox // @@ -186,6 +188,7 @@ this.MinimumSize = new System.Drawing.Size(800, 500); this.Name = "MainForm"; this.Text = "YJMPD Music Player"; + this.Load += new System.EventHandler(this.MainForm_Load); ((System.ComponentModel.ISupportInitialize)(this.SongsTableView)).EndInit(); this.MainPanel.ResumeLayout(false); this.MenuStrip.ResumeLayout(false); @@ -198,10 +201,10 @@ #endregion - private System.Windows.Forms.DataGridView SongsTableView; - private System.Windows.Forms.ListBox GenreListBox; - private System.Windows.Forms.ListView AlbumListView; - private System.Windows.Forms.ListBox ArtistListBox; + public System.Windows.Forms.DataGridView SongsTableView; + public System.Windows.Forms.ListBox GenreListBox; + public System.Windows.Forms.ListView AlbumListView; + public System.Windows.Forms.ListBox ArtistListBox; private System.Windows.Forms.Panel MainPanel; private System.Windows.Forms.MenuStrip MenuStrip; private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; diff --git a/MusicPlayer/MusicPlayer/MainForm.cs b/MusicPlayer/MusicPlayer/MainForm.cs index 259b7b4..6022c64 100644 --- a/MusicPlayer/MusicPlayer/MainForm.cs +++ b/MusicPlayer/MusicPlayer/MainForm.cs @@ -17,46 +17,29 @@ namespace MusicPlayer { public partial class MainForm : Form { - private SongsTable table; + public Main main + { + get; set; + } public MainForm() { InitializeComponent(); - } - private void Form1_Load(object sender, EventArgs e) + private void MainForm_Load(object sender, EventArgs e) { - //APIHandler api = new APIHandler(); - //NetworkHandler nw = new NetworkHandler("83.128.250.123", api); - table = new SongsTable(); - SongsTableView.DataSource = table; - - Populate(); - } - - private void Populate() - { - table.Add(new Song("Test Song 1", "Test Album 1", "Test Artist 1")); - - GenreListBox.Items.Add("Hardcore"); - GenreListBox.Items.Add("Hardstyle"); - GenreListBox.Items.Add("Pop"); - - ArtistListBox.Items.Add("Kygo"); - ArtistListBox.Items.Add("Monstercat"); - ArtistListBox.Items.Add("Mozart"); - - AlbumListView.Items.Add("Album 1"); - AlbumListView.Items.Add("Album 2"); - AlbumListView.Items.Add("Album 3"); - - table.Add(new Song("Test Song 2", "Test Album 2", "Test Artist 2")); + } private void PlayButton_Click(object sender, EventArgs e) { AudioHandler.PlayMp3FromUrl("http://imegumii.nl/music/English/Monstercat/Direct%20-%20Eternity.mp3"); } + + private void SongsTableView_SelectionChanged(object sender, EventArgs e) + { + DataGridViewSelectedRowCollection col = SongsTableView.SelectedRows; + } } } diff --git a/MusicPlayer/MusicPlayer/MusicPlayer.csproj b/MusicPlayer/MusicPlayer/MusicPlayer.csproj index baf3669..43c9029 100644 --- a/MusicPlayer/MusicPlayer/MusicPlayer.csproj +++ b/MusicPlayer/MusicPlayer/MusicPlayer.csproj @@ -35,7 +35,7 @@ ..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll - True + True ..\packages\NAudio.1.7.3\lib\net35\NAudio.dll @@ -55,6 +55,7 @@ + Form diff --git a/MusicPlayer/MusicPlayer/NetworkHandler.cs b/MusicPlayer/MusicPlayer/NetworkHandler.cs index dc10bd5..5d7bdb5 100644 --- a/MusicPlayer/MusicPlayer/NetworkHandler.cs +++ b/MusicPlayer/MusicPlayer/NetworkHandler.cs @@ -9,7 +9,7 @@ using Newtonsoft.Json.Linq; namespace MusicPlayer { - class NetworkHandler + public class NetworkHandler { private int port = 8585; private string ip; diff --git a/MusicPlayer/MusicPlayer/Program.cs b/MusicPlayer/MusicPlayer/Program.cs index fb537a0..78734c8 100644 --- a/MusicPlayer/MusicPlayer/Program.cs +++ b/MusicPlayer/MusicPlayer/Program.cs @@ -14,14 +14,14 @@ namespace MusicPlayer [STAThread] static void Main() { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + NetworkHandler nw = new NetworkHandler("http://www.imegumii.nl"); APIHandler api = new APIHandler(nw); MainForm form = new MainForm(); - new Main(nw, api, form); - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); Application.Run(form); } } diff --git a/MusicPlayer/MusicPlayer/Song.cs b/MusicPlayer/MusicPlayer/Song.cs index 24bb544..3fb4e5b 100644 --- a/MusicPlayer/MusicPlayer/Song.cs +++ b/MusicPlayer/MusicPlayer/Song.cs @@ -8,18 +8,25 @@ namespace MusicPlayer { class Song { + public string SongID { get; set; } public string Name { get; set; } public string Album { get; set; } public string Artist { get; set; } public string Url { get { return GetURL(); } set { SetURL(value); } } + private APIHandler api; + private string url; - public Song(string name, string album, string artist) + public Song(string songid, string name, string album, string artist, APIHandler api) { + SongID = songid; Name = name; Album = album; Artist = artist; + + this.api = api; + url = ""; } @@ -27,7 +34,7 @@ namespace MusicPlayer { if (url == "") { - url = "http://imegumii.nl/music/Old%20Music/Pre-Parade%20-%20Toradora.mp3"; + url = api.GetSongURLByID(SongID); } return url; From ae73848177b8ee9479278fb82ae93baa30f59b04 Mon Sep 17 00:00:00 2001 From: Yorick Rommers Date: Thu, 29 Oct 2015 21:38:04 +0100 Subject: [PATCH 23/25] Implemented some API functions --- MusicPlayer/MusicPlayer/APIHandler.cs | 40 ++++++++++++++++++++-- MusicPlayer/MusicPlayer/MusicPlayer.csproj | 1 + MusicPlayer/MusicPlayer/Program.cs | 12 +++++++ MusicPlayer/MusicPlayer/Year.cs | 12 +++++++ 4 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 MusicPlayer/MusicPlayer/Year.cs diff --git a/MusicPlayer/MusicPlayer/APIHandler.cs b/MusicPlayer/MusicPlayer/APIHandler.cs index c3d6f65..bb5bb7a 100644 --- a/MusicPlayer/MusicPlayer/APIHandler.cs +++ b/MusicPlayer/MusicPlayer/APIHandler.cs @@ -29,12 +29,46 @@ namespace MusicPlayer public List GetArtists() { - return null; + List artistlist = new List(); + + JObject o = nw.SendString("getartists?id=hallo"); + if (o["result"].ToString() == "OK") + { + for (int i = 0; i < o["artists"].Count(); i++) { + artistlist.Add(new Artist(o["artists"][i][0].ToString())); + } + } + return artistlist; } public List GetAlbums() { - return null; - } + List albumlist = new List(); + + JObject o = nw.SendString("getalbums?id=hallo"); + if (o["result"].ToString() == "OK") + { + for (int i = 0; i < o["albums"].Count(); i++) + { + albumlist.Add(new Album(o["albums"][i][0].ToString())); + } + } + + return albumlist; + } + + public List GetYears() + { + List yearlist = new List (); + JObject o = nw.SendString("getyears?id=hallo"); + if (o["result"].ToString() == "OK") + { + for (int i = 0; i < o["years"].Count(); i++) + { + yearlist.Add(new Year(o["years"][i][0].ToString())); + } + } + return yearlist; + } } } diff --git a/MusicPlayer/MusicPlayer/MusicPlayer.csproj b/MusicPlayer/MusicPlayer/MusicPlayer.csproj index 1fc6d1b..6530671 100644 --- a/MusicPlayer/MusicPlayer/MusicPlayer.csproj +++ b/MusicPlayer/MusicPlayer/MusicPlayer.csproj @@ -66,6 +66,7 @@ Component + MainForm.cs diff --git a/MusicPlayer/MusicPlayer/Program.cs b/MusicPlayer/MusicPlayer/Program.cs index b438603..1d084a0 100644 --- a/MusicPlayer/MusicPlayer/Program.cs +++ b/MusicPlayer/MusicPlayer/Program.cs @@ -17,6 +17,18 @@ namespace MusicPlayer NetworkHandler nw = new NetworkHandler("http://www.imegumii.nl"); APIHandler api = new APIHandler(nw); Console.WriteLine(api.GetSongURLByID("102")); + api.GetArtists().ForEach(a => + { + Console.WriteLine(a.naam); + }); + api.GetYears().ForEach(y => + { + Console.WriteLine(y.year); + }); + api.GetAlbums().ForEach(a => + { + Console.WriteLine(a.albumnaam); + }); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); diff --git a/MusicPlayer/MusicPlayer/Year.cs b/MusicPlayer/MusicPlayer/Year.cs new file mode 100644 index 0000000..1a295bd --- /dev/null +++ b/MusicPlayer/MusicPlayer/Year.cs @@ -0,0 +1,12 @@ +namespace MusicPlayer +{ + public class Year + { + public string year { get; set; } + + public Year(string year) + { + this.year = year; + } + } +} \ No newline at end of file From a7bc5abe2613cb7cc9f43162026737fd6ba8c0ba Mon Sep 17 00:00:00 2001 From: Janco Kock Date: Thu, 29 Oct 2015 21:36:59 +0100 Subject: [PATCH 24/25] Added starting of a awesome notification form --- MusicPlayer/MusicPlayer/MusicPlayer.csproj | 9 + .../MusicPlayer/NotificationPopup.Designer.cs | 97 ++++++ MusicPlayer/MusicPlayer/NotificationPopup.cs | 20 ++ .../MusicPlayer/NotificationPopup.resx | 276 ++++++++++++++++++ 4 files changed, 402 insertions(+) create mode 100644 MusicPlayer/MusicPlayer/NotificationPopup.Designer.cs create mode 100644 MusicPlayer/MusicPlayer/NotificationPopup.cs create mode 100644 MusicPlayer/MusicPlayer/NotificationPopup.resx diff --git a/MusicPlayer/MusicPlayer/MusicPlayer.csproj b/MusicPlayer/MusicPlayer/MusicPlayer.csproj index 43c9029..4305737 100644 --- a/MusicPlayer/MusicPlayer/MusicPlayer.csproj +++ b/MusicPlayer/MusicPlayer/MusicPlayer.csproj @@ -66,6 +66,12 @@ MainForm.cs + + Form + + + NotificationPopup.cs + @@ -75,6 +81,9 @@ MainForm.cs + + NotificationPopup.cs + ResXFileCodeGenerator Resources.Designer.cs diff --git a/MusicPlayer/MusicPlayer/NotificationPopup.Designer.cs b/MusicPlayer/MusicPlayer/NotificationPopup.Designer.cs new file mode 100644 index 0000000..807c046 --- /dev/null +++ b/MusicPlayer/MusicPlayer/NotificationPopup.Designer.cs @@ -0,0 +1,97 @@ +namespace MusicPlayer +{ + partial class NotificationPopup + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(NotificationPopup)); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.pictureBox2 = new System.Windows.Forms.PictureBox(); + this.pictureBox3 = new System.Windows.Forms.PictureBox(); + this.groupBox1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit(); + this.SuspendLayout(); + // + // groupBox1 + // + this.groupBox1.BackColor = System.Drawing.Color.White; + this.groupBox1.Controls.Add(this.pictureBox3); + this.groupBox1.Controls.Add(this.pictureBox2); + this.groupBox1.Controls.Add(this.pictureBox1); + resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.TabStop = false; + // + // pictureBox1 + // + resources.ApplyResources(this.pictureBox1, "pictureBox1"); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.TabStop = false; + // + // pictureBox2 + // + resources.ApplyResources(this.pictureBox2, "pictureBox2"); + this.pictureBox2.Name = "pictureBox2"; + this.pictureBox2.TabStop = false; + // + // pictureBox3 + // + resources.ApplyResources(this.pictureBox3, "pictureBox3"); + this.pictureBox3.Name = "pictureBox3"; + this.pictureBox3.TabStop = false; + // + // NotificationPopup + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ControlBox = false; + this.Controls.Add(this.groupBox1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "NotificationPopup"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.groupBox1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.PictureBox pictureBox3; + private System.Windows.Forms.PictureBox pictureBox2; + private System.Windows.Forms.PictureBox pictureBox1; + } +} \ No newline at end of file diff --git a/MusicPlayer/MusicPlayer/NotificationPopup.cs b/MusicPlayer/MusicPlayer/NotificationPopup.cs new file mode 100644 index 0000000..68d016f --- /dev/null +++ b/MusicPlayer/MusicPlayer/NotificationPopup.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace MusicPlayer +{ + public partial class NotificationPopup : Form + { + public NotificationPopup() + { + InitializeComponent(); + } + } +} diff --git a/MusicPlayer/MusicPlayer/NotificationPopup.resx b/MusicPlayer/MusicPlayer/NotificationPopup.resx new file mode 100644 index 0000000..f8e6f4f --- /dev/null +++ b/MusicPlayer/MusicPlayer/NotificationPopup.resx @@ -0,0 +1,276 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQffCh0UITh4zTVoAAABr0lEQVRYR8WXQW7CMBRE + wxVY9AA9D0k4QXqCrqqqaqtKPQOVWHOgcgyWHIHCjPmmcRjiOInISE8B/+/xF9ixnaWoKJYVWINfsAcH + g5/Zxlhl6eMIhnOwAcdE2GduNmlCR/9cmdkQVnXPqJA4Aw9gB5RhH+hFz5kNo8UE8AiUyRjQWxeBAGGV + quOYcAwbtSEExvzZb7Gz4UIh0HfC/Ym2GG5iXoQGLjWVGONJtHXlf4niS/I6z/Pli/WV8Q5s3OCUCMZ4 + ta5DCjh6A75eZcIN3lxHk4inUNGA728VVLzbuBeJnBTWNOAmooINyk8bM5DODWhbJVsacCdTwTpfNl4g + tLe/WqGGT5M9E7idqqDn6mdPkfCrc4gWkOflh3n1kvKs4QqI/gUo4tv8AiE2yl/QaRK2FCHza0QnYedl + qIpQeQm4ZZj0ImoWoXISOJ8fRaCVehEq3hWzcCY9NqNzESrWkWAz6rkdl8+6Pc5iUYQnZjTe80DyY8OG + QmDSIxmZ/FA63bHciwmAVd7/YuKFRP8c42rmJhyezjNZ6Nj7cnq11IYKpv56vgXN6znbEq/nWXYCplmG + 3mQZHZoAAAAASUVORK5CYII= + + + + + NoControl + + + 75, 158 + + + 33, 32 + + + + 2 + + + pictureBox3 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQffCh0UIRU9EmkdAAABx0lEQVRYR81XS26DMBDl + EJGSdaXeoLkG0C7KtZIDZJWTdNlK6S2yzA2atu8NM9S4JnyMS5/0NMYzfjOAMXbWh6IotcX2YwUewHfw + Al6VbLOPvkrDGa+tCbDBsBvwCH6NJMdsqJHnPzcxCBhodqdiMdy7mr1gILgCz2BIcAqptSrLJ83SAQSR + dyDfa0gohtSEdkcRcNqdp0hupDZzaFZFnjfvfM7H3sVzndObmHDcmnCfgb4Y7jRt8+j5qYUCXd6Db15f + DNfNU8BF73deR0rsFpyjkKNKimgooEUNlSemloW8mn8KTYjLazDApQQ7QJ/ZmEIqCnD9DjlblGwBwGd2 + SiEHDuRPJORsUbLcAGLMjinkxAH8k4WcLYr6ACDW7APYV8iFgYNWPlEdAYwxyyfyYjoer/+igFSvYMhc + kFew+CRc/DNcciF6NpGQs0UJBNA2G5NYKEIELpb7GaFBLvI7BqUGAS72jtNnug0JYRsDOP5sS1YUheRs + AAeZelP6Af7elBq4ZYYz1bacyamt2TqgRSQ5mICapQcWCDvH0UwmHKxoDoZzVuDnMvVwuq41vAk3Bu4B + AoJ2PD+B/vGcffTVyyuAtra6kGXfchVyMfY7IlMAAAAASUVORK5CYII= + + + + NoControl + + + 114, 158 + + + 33, 32 + + + 1 + + + pictureBox2 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 1 + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQffCh0UHx1yDPpSAAABo0lEQVRYR8WXTW7CMBCF + wxVY9AA9D4ScID1BV1VVFVSpZ6ASaw5Ej8GSI1D63nRME2si/8SQJ30ieMbPI7Bju0pRXTct2IFvcAJn + hc9sY6zV9DJaLOo5TPfgkgj7zNUmTejoPr/UbAzbrmdQSJyBB3AElmEO9KLnTIexxQTwCCyTEtDbLgIB + wiqtjiXhGDqqJwRK/uxDHHW4vhDImXA/RlsMMjGv0qVmJUawerbbg/wvUXzJWecC+y+Xq08rFmAvg1NG + MBq1yCpCOuKBr1czIQYxUWUU0bIAvr+tYBQ69lWJRexYADcRK0iCs1zH7SmhiAML4E5mBQX1HBRyzDdb + ZBEnGnA7tYKC+mUJRawtzw7nmxaA/u++n4cUcJO/AO0fXZ8B5C8oPgnxdtxYuQYyCYsuQ7SFfvYusgyL + vYjw/c2PB/g7PxqBaMQAwvOrHwuhXaXzyM2oebFiAXqb0YjtuHky2mLon5jRsPUSYihzIHFCYNIjGZn8 + UDrdsdyJCYBV3v9i4oRE95kzMX3Srma+0PH+l9MhwdBdzw/Av56zLfF6XlW/G66G3g3Cfq0AAAAASUVO + RK5CYII= + + + + 153, 158 + + + 33, 32 + + + 0 + + + pictureBox1 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 2 + + + 12, 12 + + + 266, 196 + + + 0 + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + True + + + True + + + 6, 13 + + + 290, 220 + + + NotificationPopup + + + NotificationPopup + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file From 6dc28511b1d6bf2c17fc5d5a627d461685979123 Mon Sep 17 00:00:00 2001 From: Yorick Rommers Date: Thu, 29 Oct 2015 22:51:45 +0100 Subject: [PATCH 25/25] Implemented more API functions --- MusicPlayer/MusicPlayer/APIHandler.cs | 37 ++++++++++++++++++++++++++- MusicPlayer/MusicPlayer/Program.cs | 16 ++++++++++++ MusicPlayer/MusicPlayer/Song.cs | 2 +- 3 files changed, 53 insertions(+), 2 deletions(-) diff --git a/MusicPlayer/MusicPlayer/APIHandler.cs b/MusicPlayer/MusicPlayer/APIHandler.cs index 1468da0..a954496 100644 --- a/MusicPlayer/MusicPlayer/APIHandler.cs +++ b/MusicPlayer/MusicPlayer/APIHandler.cs @@ -24,7 +24,42 @@ namespace MusicPlayer return o["songurl"].ToString(); } return o["errormsg"].ToString(); - } + } + + public List GetSongsByAlbum(string albumname) + { + return GetSongsByArgs("album=" + albumname); + } + + public List GetSongsByArtist(string artistname) + { + return GetSongsByArgs("artist=" + artistname); + } + + public List GetSongsByGenre(string genre) + { + return GetSongsByArgs("genre=" + genre); + } + + public List GetSongsByYear(string year) + { + return GetSongsByArgs("album=" + year); + } + + public List GetSongsByArgs(string args) + { + List songslist = new List(); + JObject o = nw.SendString("getsongs?"+args); + if (o["result"].ToString() == "OK") + { + dynamic songs = o["songs"]; + for (int i = 0; i < songs.Count; i++) + { + songslist.Add(new Song(songs[i][0].ToString(), songs[i][3].ToString(), songs[i][5].ToString(), songs[i][4].ToString(), this)); + } + } + return songslist; + } public List GetArtists() { diff --git a/MusicPlayer/MusicPlayer/Program.cs b/MusicPlayer/MusicPlayer/Program.cs index 78734c8..aca8d84 100644 --- a/MusicPlayer/MusicPlayer/Program.cs +++ b/MusicPlayer/MusicPlayer/Program.cs @@ -19,6 +19,22 @@ namespace MusicPlayer NetworkHandler nw = new NetworkHandler("http://www.imegumii.nl"); APIHandler api = new APIHandler(nw); +// api.GetSongsByArtist("Amon Amarth").ForEach(s => +// { +// Console.WriteLine(s.SongID); +// }); +// api.GetSongsByYear("2009").ForEach(s => +// { +// Console.WriteLine(s.Name); +// }); + api.GetSongsByGenre("Melodic Death Metal").ForEach(s => + { + Console.WriteLine(s.Name); + }); +// api.GetSongsByAlbum("Stronger").ForEach(s => +// { +// Console.WriteLine(s.Name); +// }); MainForm form = new MainForm(); new Main(nw, api, form); diff --git a/MusicPlayer/MusicPlayer/Song.cs b/MusicPlayer/MusicPlayer/Song.cs index 3fb4e5b..a44b6cf 100644 --- a/MusicPlayer/MusicPlayer/Song.cs +++ b/MusicPlayer/MusicPlayer/Song.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace MusicPlayer { - class Song + public class Song { public string SongID { get; set; } public string Name { get; set; }